diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php
index 111f45a3aac36a5f2beeac47688a630de62d1f50..84c7810e2a6f3edc0709effd1980f75e01efae78 100644
--- a/htdocs/categories/class/categorie.class.php
+++ b/htdocs/categories/class/categorie.class.php
@@ -139,11 +139,13 @@ class Categorie
 		{
 			$this->error=$langs->trans("ImpossibleAddCat");
 			$this->error.=" : ".$langs->trans("CategoryExistsAtSameLevel");
+			dol_syslog($this->error, LOG_ERR);
 			return -4;
 		}
 
 		$this->db->begin();
 
+		dol_syslog(get_class($this).'::create sql='.$sql);
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie (label, description,";
 		if ($conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER)
 		{
@@ -163,7 +165,8 @@ class Categorie
 		//$sql.= ",".$this->parentId;
 		$sql.= ")";
 
-		$res  = $this->db->query($sql);
+		dol_syslog(get_class($this).'::create sql='.$sql);
+		$res = $this->db->query($sql);
 		if ($res)
 		{
 			$id = $this->db->last_insert_id(MAIN_DB_PREFIX."categorie");
@@ -867,6 +870,8 @@ class Categorie
 
 	/**
 	 * 	Check if no category with same label already exists for this cat's parent or root and for this cat's type
+	 *  TODO For the moment, the unique key is on the type, label, entity. We must remove table llx_categorie_association
+     *  to replace with a field fk_parent. This will allow to extend unique key with the level.
 	 *
 	 * 	@return		boolean		1 if already exist, 0 otherwise, -1 if error
 	 */
@@ -887,17 +892,14 @@ class Categorie
 		}
 		else 										// mother_id undefined (so it's root)
 		{
-			/* We have to select any rowid from llx_categorie which which category's type and label
-			 * are equals to those of the calling category, AND which doesn't exist in categorie association
-			 * as children (rowid != fk_categorie_fille)
+			/* We have to select any rowid from llx_categorie that is not at root level
 			 */
 			$sql = "SELECT c.rowid";
 			$sql.= " FROM ".MAIN_DB_PREFIX."categorie as c ";
-			$sql.= " JOIN ".MAIN_DB_PREFIX."categorie_association as ca";
-			$sql.= " ON c.rowid!=ca.fk_categorie_fille";
 			$sql.= " WHERE c.type=".$this->type;
 			$sql.= " AND c.label='".$this->db->escape($this->label)."'";
 			$sql.= " AND c.entity IN (".getEntity('category',1).")";
+			$sql.= " AND c.rowid NOT IN (SELECT ca.fk_categorie_fille FROM ".MAIN_DB_PREFIX."categorie_association as ca)";
 		}
 		dol_syslog(get_class($this)."::already_exists sql=".$sql, LOG_DEBUG);
 		$resql = $this->db->query($sql);
diff --git a/test/phpunit/CategorieTest.php b/test/phpunit/CategorieTest.php
index fe9ab89008a32fac5ddbda648e5cd88e4bb28c3d..8fa6c478e1e75e5965307ac6c01436ea3abb8407 100755
--- a/test/phpunit/CategorieTest.php
+++ b/test/phpunit/CategorieTest.php
@@ -131,7 +131,14 @@ class CategorieTest extends PHPUnit_Framework_TestCase
 		// We create a category
 		$localobject=new Categorie($this->savdb);
     	$localobject->initAsSpecimen();
-		$resultFirstCreate=$localobject->create($user);
+
+    	// Check it does not exist (return 0)
+    	$resultCheck=$localobject->already_exists();
+    	print __METHOD__." resultCheck=".$resultCheck."\n";
+    	$this->assertEquals(0, $resultCheck);
+
+    	// Create
+    	$resultFirstCreate=$localobject->create($user);
     	print __METHOD__." resultFirstCreate=".$resultFirstCreate."\n";
     	$this->assertGreaterThan(0, $resultFirstCreate);
 
@@ -139,6 +146,7 @@ class CategorieTest extends PHPUnit_Framework_TestCase
 		$localobject2=new Categorie($this->savdb);
     	$localobject2->initAsSpecimen();
 
+    	// Check it does exist (return 1)
     	$resultCheck=$localobject2->already_exists();
     	print __METHOD__." resultCheck=".$resultCheck."\n";
     	$this->assertGreaterThan(0, $resultCheck);