diff --git a/htdocs/admin/menus/edit.php b/htdocs/admin/menus/edit.php
index 346d316b5d37fd3c7f64554fc40e047e4963fbea..fff20023c05e8e6af1e3a4cf24c0403fad10fec1 100644
--- a/htdocs/admin/menus/edit.php
+++ b/htdocs/admin/menus/edit.php
@@ -1,6 +1,6 @@
 <?php
 /* Copyright (C) 2007      Patrick Raguin       <patrick.raguin@gmail.com>
- * Copyright (C) 2007-2011 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2007-2012 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2009-2011 Regis Houssin        <regis@dolibarr.fr>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -113,6 +113,23 @@ if ($action == 'add')
         exit;
     }
 
+    $leftmenu=''; $mainmenu='';
+    if (! empty($_POST['menuId']) && ! is_numeric($_POST['menuId']))
+    {
+	    $tmp=explode('&',$_POST['menuId']);
+	    foreach($tmp as $s)
+	    {
+	    	if (preg_match('/fk_mainmenu=/',$s))
+	    	{
+				$mainmenu=preg_replace('/fk_mainmenu=/','',$s);
+	    	}
+	    	if (preg_match('/fk_leftmenu=/',$s))
+	    	{
+	    		$leftmenu=preg_replace('/fk_leftmenu=/','',$s);
+	    	}
+	    }
+    }
+
     $langs->load("errors");
 
     $error=0;
@@ -146,7 +163,7 @@ if ($action == 'add')
         $action = 'create';
         $error++;
     }
-    if (! $error && ! $_POST['menuId'] && $_POST['type'] == 'left')
+    if (! $error && empty($_POST['menuId']) && $_POST['type'] == 'left')
     {
         $mesg='<div class="error">'.$langs->trans("ErrorLeftMenuMustHaveAParentId").'</div>';
         $action = 'create';
@@ -156,11 +173,9 @@ if ($action == 'add')
     if (! $error)
     {
         $menu = new Menubase($db);
-        $menu->fk_menu=$_POST['menuId'];
         $menu->menu_handler=$_POST['menu_handler'];
         $menu->type=$_POST['type'];
         $menu->titre=$_POST['titre'];
-        $menu->leftmenu=$_POST['leftmenu'];
         $menu->url=$_POST['url'];
         $menu->langs=$_POST['langs'];
         $menu->position=$_POST['position'];
@@ -168,6 +183,18 @@ if ($action == 'add')
         $menu->perms=$_POST['perms'];
         $menu->target=$_POST['target'];
         $menu->user=$_POST['user'];
+        if (is_numeric($_POST['menuId']))
+        {
+        	$menu->fk_menu=$_POST['menuId'];
+        }
+        else
+       {
+	       	if ($_POST['type'] == 'top') $menu->fk_menu=0;
+	       	else $menu->fk_menu=-1;
+        	$menu->fk_mainmenu=$mainmenu;
+        	$menu->fk_leftmenu=$leftmenu;
+       }
+
         $result=$menu->create($user);
         if ($result > 0)
         {
@@ -311,22 +338,22 @@ if ($action == 'create')
     }
     else
     {
-        print '<td><input type="text" size="8" id="menuId" name="menuId" value="'.($parent_rowid?$parent_rowid:'').'"></td>';
+        print '<td><input type="text" size="20" id="menuId" name="menuId" value="'.($_POST["menuId"]?$_POST["menuId"]:'').'"></td>';
     }
     print '<td>'.$langs->trans('DetailMenuIdParent').'</td></tr>';
 
     // Title
     print '<tr><td class="fieldrequired">'.$langs->trans('Title').'</td><td><input type="text" size="30" name="titre" value="'.$_POST["titre"].'"></td><td>'.$langs->trans('DetailTitre').'</td></tr>';
 
+    // URL
+    print '<tr><td class="fieldrequired">'.$langs->trans('URL').'</td><td><input type="text" size="60" name="url" value="'.$_POST["url"].'"></td><td>'.$langs->trans('DetailUrl').'</td></tr>';
+
     // Langs
     print '<tr><td>'.$langs->trans('LangFile').'</td><td><input type="text" size="30" name="langs" value="'.$parent_langs.'"></td><td>'.$langs->trans('DetailLangs').'</td></tr>';
 
     // Position
     print '<tr><td>'.$langs->trans('Position').'</td><td><input type="text" size="5" name="position" value="'.(isset($_POST["position"])?$_POST["position"]:100).'"></td><td>'.$langs->trans('DetailPosition').'</td></tr>';
 
-    // URL
-    print '<tr><td class="fieldrequired">'.$langs->trans('URL').'</td><td><input type="text" size="60" name="url" value="'.$_POST["url"].'"></td><td>'.$langs->trans('DetailUrl').'</td></tr>';
-
     // Target
     print '<tr><td>'.$langs->trans('Target').'</td><td><select class="flat" name="target">';
     print '<option value=""'.($menu->target==""?' selected="true"':'').'>'.$langs->trans('').'</option>';
@@ -397,18 +424,18 @@ elseif ($action == 'edit')
     // Niveau
     //print '<tr><td>'.$langs->trans('Level').'</td><td>'.$menu->level.'</td><td>'.$langs->trans('DetailLevel').'</td></tr>';
 
-    // Titre
+    // Title
     print '<tr><td class="fieldrequired">'.$langs->trans('Title').'</td><td><input type="text" size="30" name="titre" value="'.$menu->titre.'"></td><td>'.$langs->trans('DetailTitre').'</td></tr>';
 
+    // Url
+    print '<tr><td class="fieldrequired">'.$langs->trans('URL').'</td><td><input type="text" size="60" name="url" value="'.$menu->url.'"></td><td>'.$langs->trans('DetailUrl').'</td></tr>';
+
     // Langs
     print '<tr><td>'.$langs->trans('LangFile').'</td><td><input type="text" size="30" name="langs" value="'.$menu->langs.'"></td><td>'.$langs->trans('DetailLangs').'</td></tr>';
 
     // Position
     print '<tr><td>'.$langs->trans('Position').'</td><td><input type="text" size="5" name="position" value="'.$menu->position.'"></td><td>'.$langs->trans('DetailPosition').'</td></tr>';
 
-    // Url
-    print '<tr><td class="fieldrequired">'.$langs->trans('URL').'</td><td><input type="text" size="60" name="url" value="'.$menu->url.'"></td><td>'.$langs->trans('DetailUrl').'</td></tr>';
-
     // Target
     print '<tr><td>'.$langs->trans('Target').'</td><td><select class="flat" name="target">';
     print '<option value=""'.($menu->target==""?' selected="true"':'').'>'.$langs->trans('').'</option>';
diff --git a/htdocs/admin/menus/index.php b/htdocs/admin/menus/index.php
index 124fee94f97308e83c3f800407c59189bafb10c4..fe210eae8c532ae1490a135eaf3b85424aaaa297 100644
--- a/htdocs/admin/menus/index.php
+++ b/htdocs/admin/menus/index.php
@@ -288,11 +288,11 @@ if ($conf->use_javascript_ajax)
 	*/
 	//il faut d'abord declarer un element racine de l'arbre
 
-	$data[] = array(0,-1,"racine");
+	$data[] = array('rowid'=>0,'fk_menu'=>-1,'title'=>"racine",'mainmenu'=>'','leftmenu'=>'','fk_mainmenu'=>'','fk_leftmenu'=>'');
 
 	//puis tous les elements enfants
 
-	$sql = "SELECT m.rowid, m.fk_menu, m.titre, m.langs";
+	$sql = "SELECT m.rowid, m.titre, m.langs, m.mainmenu, m.leftmenu, m.fk_menu, m.fk_mainmenu, m.fk_leftmenu";
 	$sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
 	$sql.= " WHERE menu_handler = '".$menu_handler."'";
 	$sql.= " AND entity = ".$conf->entity;
@@ -310,15 +310,15 @@ if ($conf->use_javascript_ajax)
 		{
 			if (! empty($menu['langs'])) $langs->load($menu['langs']);
 			$titre = $langs->trans($menu['titre']);
-			$data[] = array($menu['rowid'],$menu['fk_menu'],$titre);
+			$data[] = array('rowid'=>$menu['rowid'],'fk_menu'=>$menu['fk_menu'],'title'=>$titre,'mainmenu'=>$menu['mainmenu'],'leftmenu'=>$menu['leftmenu'],'fk_mainmenu'=>$menu['fk_mainmenu'],'fk_leftmenu'=>$menu['fk_leftmenu']);
 			$i++;
 		}
 	}
 
 	// Appelle de la fonction recursive (ammorce)
 	// avec recherche depuis la racine.
-	// array($menu['rowid'],$menu['fk_menu'],$titre);
-	tree_recur($data,0,0);
+	//var_dump($data);
+	tree_recur($data,$data[0],0);
 
 	print '</td>';
 
diff --git a/htdocs/core/lib/treeview.lib.php b/htdocs/core/lib/treeview.lib.php
index 06eda753b3d9f08bc00ef83d4c20c6ba3357f357..d76db9f837a03e503594daa453000095fd418f8b 100644
--- a/htdocs/core/lib/treeview.lib.php
+++ b/htdocs/core/lib/treeview.lib.php
@@ -198,20 +198,20 @@ function tree_showline($tab,$rang)
 		}
 	}
 
-	print '<li id=li'.$tab[0].'>';
+	print '<li id=li'.$tab['rowid'].'>';
 
 	// Content of line
-	print '<strong> &nbsp;<a href="edit.php?menu_handler='.$menu_handler.'&action=edit&menuId='.$tab[0].'">'.$tab[2].'</a></strong>';
-	print '<div class="menuEdit"><a href="edit.php?menu_handler='.$menu_handler.'&action=edit&menuId='.$tab[0].'">'.img_edit('default',0,'class="menuEdit" id="edit'.$tab[0].'"').'</a></div>';
-	print '<div class="menuNew"><a href="edit.php?menu_handler='.$menu_handler.'&action=create&menuId='.$tab[0].'">'.img_edit_add('default',0,'class="menuNew" id="new'.$tab[0].'"').'</a></div>';
-	print '<div class="menuDel"><a href="index.php?menu_handler='.$menu_handler.'&action=delete&menuId='.$tab[0].'">'.img_delete('default',0,'class="menuDel" id="del'.$tab[0].'"').'</a></div>';
-	print '<div class="menuFleche"><a href="index.php?menu_handler='.$menu_handler.'&action=up&menuId='.$tab[0].'">'.img_picto("Monter","1uparrow").'</a><a href="index.php?menu_handler='.$menu_handler.'&action=down&menuId='.$tab[0].'">'.img_picto("Descendre","1downarrow").'</a></div>';
+	print '<strong> &nbsp;<a href="edit.php?menu_handler='.$menu_handler.'&action=edit&menuId='.$tab['rowid'].'">'.$tab['title'].'</a></strong>';
+	print '<div class="menuEdit"><a href="edit.php?menu_handler='.$menu_handler.'&action=edit&menuId='.$tab['rowid'].'">'.img_edit('default',0,'class="menuEdit" id="edit'.$tab['rowid'].'"').'</a></div>';
+	print '<div class="menuNew"><a href="edit.php?menu_handler='.$menu_handler.'&action=create&menuId='.$tab['rowid'].'">'.img_edit_add('default',0,'class="menuNew" id="new'.$tab['rowid'].'"').'</a></div>';
+	print '<div class="menuDel"><a href="index.php?menu_handler='.$menu_handler.'&action=delete&menuId='.$tab['rowid'].'">'.img_delete('default',0,'class="menuDel" id="del'.$tab['rowid'].'"').'</a></div>';
+	print '<div class="menuFleche"><a href="index.php?menu_handler='.$menu_handler.'&action=up&menuId='.$tab['rowid'].'">'.img_picto("Monter","1uparrow").'</a><a href="index.php?menu_handler='.$menu_handler.'&action=down&menuId='.$tab['rowid'].'">'.img_picto("Descendre","1downarrow").'</a></div>';
 
 	print '</li>';
 	echo "\n";
 
 	$rangLast = $rang;
-	$idLast = $tab[0];
+	$idLast = $tab['rowid'];
 }
 
 
@@ -219,13 +219,13 @@ function tree_showline($tab,$rang)
  *  Recursive function to output menu tree
  *
  *  @param	array	$tab    Array of elements
- *  @param  int	    $pere   Id of parent
+ *  @param  int	    $pere   Array with parent ids ('rowid'=>,'mainmenu'=>,'leftmenu'=>,'fk_mainmenu=>,'fk_leftmenu=>)
  *  @param  int	    $rang   Level of element
  *  @return	void
  */
 function tree_recur($tab,$pere,$rang)
 {
-	if ($pere == 0) print '<ul class="arbre">';
+	if (empty($pere['rowid'])) print '<ul class="arbre">';
 
 	if ($rang > 10)	return;	// Protection contre boucle infinie
 
@@ -233,18 +233,27 @@ function tree_recur($tab,$pere,$rang)
 	$sizeoftab=count($tab);
 	for ($x=0; $x < $sizeoftab; $x++)
 	{
+		//var_dump($tab[$x]);exit;
 		// If an element has $pere for parent
-		if ($tab[$x][1]==$pere)
+		if ($tab[$x]['fk_menu'] != -1 && $tab[$x]['fk_menu'] == $pere['rowid'])
 		{
 			// We shot it with an offset
 			tree_showline($tab[$x],$rang);
 
 			// And now we search all its sons of lower level
-			tree_recur($tab,$tab[$x][0],$rang+1);
+			tree_recur($tab,$tab[$x],$rang+1);
+		}
+		elseif (! empty($tab[$x]['rowid']) && $tab[$x]['fk_menu'] == -1 && $tab[$x]['fk_mainmenu'] == $pere['mainmenu'] && $tab[$x]['fk_leftmenu'] == $pere['leftmenu'])
+		{
+			// We shot it with an offset
+			tree_showline($tab[$x],$rang);
+
+			// And now we search all its sons of lower level
+			tree_recur($tab,$tab[$x],$rang+1);
 		}
 	}
 
-	if ($pere == 0) print '</ul>';
+	if (empty($pere['rowid'])) print '</ul>';
 }
 
 ?>
\ No newline at end of file
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 7204d730bc924b0aad39a684da800b72eb717ed2..3e3de47279307994ac2e177cff2357dd773f528a 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -80,7 +80,7 @@ UserSetup=User management setup
 MenuSetup=Menu management setup
 MenuLimits=Limits and accuracy
 MenuIdParent=Parent menu ID
-DetailMenuIdParent=ID of parent menu (0 for a top menu)
+DetailMenuIdParent=ID of parent menu (empty for a top menu)
 DetailPosition=Sort number to define menu position
 PersonalizedMenusNotSupported=Personalized menus not supported
 AllMenus=All
diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang
index 358fa5fe168abb9908ab9466b91a95fa14ffe09d..b17cee9cfe1eb55bbc4a578ba12eb15bfee4a37d 100644
--- a/htdocs/langs/fr_FR/admin.lang
+++ b/htdocs/langs/fr_FR/admin.lang
@@ -80,7 +80,7 @@ UserSetup= Configuration gestion des utilisateurs
 MenuSetup= Administration des menus par base de données
 MenuLimits= Limites et précision
 MenuIdParent= Id du menu parent
-DetailMenuIdParent= Id du menu parent (0 pour un menu du haut)
+DetailMenuIdParent= Id du menu parent (vide pour un menu du haut)
 DetailPosition= Numéro d'ordre déterminant la position du menu
 PersonalizedMenusNotSupported= Menus personnalisés non gérés
 AllMenus= Tous