diff --git a/htdocs/admin/boxes.php b/htdocs/admin/boxes.php
index a90a89e32a70aca05817ad7edaf7d3e2ccde53ac..ed9f784770197ddb25329c50f510ca80b0b86110 100644
--- a/htdocs/admin/boxes.php
+++ b/htdocs/admin/boxes.php
@@ -27,6 +27,8 @@
 */
 
 require("./pre.inc.php");
+include_once(DOL_DOCUMENT_ROOT."/includes/boxes/modules_boxes.php");
+
 $langs->load("admin");
 
 if (!$user->admin)
@@ -43,25 +45,42 @@ $boxes = array();
 
 if ($_POST["action"] == 'add')
 {
-    $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."boxes WHERE box_id=".$_POST["boxid"]." AND position=".$_POST["pos"];
-    $result = $db->query($sql);
-    
-    $num = $db->num_rows($result);
-    if ($num == 0)
+    $sql = "SELECT rowid";
+    $sql.= " FROM ".MAIN_DB_PREFIX."boxes";
+    $sql.= " WHERE fk_user=0 AND box_id=".$_POST["boxid"]." AND position=".$_POST["pos"];
+    $resql = $db->query($sql);
+    if ($resql)
     {
-        // Si la boite n'est pas deja active
-        $sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes (box_id, position) values (".$_POST["boxid"].",".$_POST["pos"].");";
-        $result = $db->query($sql);
-    }
-    
-    Header("Location: boxes.php");
-    exit;
+	    $num = $db->num_rows($result);
+	    if ($num == 0)
+	    {
+	        // Si la boite n'est pas deja active
+	        $sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes (box_id, position, fk_user) values (".$_POST["boxid"].",".$_POST["pos"].", 0)";
+	        $result = $db->query($sql);
+	    }
+	    
+	    Header("Location: boxes.php");
+	    exit;
+	}
+	else
+	{
+		dolibarr_print_error($db);
+	}
 }
 
 if ($_GET["action"] == 'delete')
 {
-    $sql = "DELETE FROM ".MAIN_DB_PREFIX."boxes WHERE rowid=".$_GET["rowid"];
-    $result = $db->query($sql);
+	$db->begin();
+	
+    $sql = "DELETE FROM ".MAIN_DB_PREFIX."boxes";
+    $sql.= " WHERE rowid=".$_GET["rowid"];
+    $resql = $db->query($sql);
+
+    $sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param";
+    $sql.= " WHERE param like 'MAIN_BOXES_%'";
+    $resql = $db->query($sql);
+
+	$db->commit();
 }
 
 if ($_GET["action"] == 'switch')
@@ -69,34 +88,20 @@ if ($_GET["action"] == 'switch')
     // On permute les valeur du champ box_order des 2 lignes de la table boxes
     $db->begin();
 
-    $sql="SELECT box_order FROM ".MAIN_DB_PREFIX."boxes WHERE rowid=".$_GET["switchfrom"];
-    $resultfrom = $db->query($sql);
-    if ($resultfrom)
-    {
-        $objfrom = $db->fetch_object($resultfrom);
-    }
-    else
-    {
-        dolibarr_print_error($db);
-    }
-
-    $sql="SELECT box_order FROM ".MAIN_DB_PREFIX."boxes WHERE rowid=".$_GET["switchto"];
-    $resultto = $db->query($sql);
+    $objfrom=new ModeleBoxes($db);
+    $objfrom->fetch($_GET["switchfrom"]);
 
-    if ($resultto)
-    {
-        $objto = $db->fetch_object($resultto);
-    }
-    else
+    $objto=new ModeleBoxes($db);
+    $objto->fetch($_GET["switchto"]);
+    
+    if (is_object($objfrom) && is_object($objto))
     {
-        dolibarr_print_error($db);
-    }
-
-    if ($objfrom && $objto) {
-        $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order=".$objto->box_order." WHERE rowid=".$_GET["switchfrom"];
+        $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order=".$objto->box_order." WHERE rowid=".$objfrom->rowid;
+		//print "xx".$sql;
         $resultupdatefrom = $db->query($sql);
         if (! $resultupdatefrom) { dolibarr_print_error($db); }
-        $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order=".$objfrom->box_order." WHERE rowid=".$_GET["switchto"];
+        $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order=".$objfrom->box_order." WHERE rowid=".$objto->rowid;
+		//print "xx".$sql;
         $resultupdateto = $db->query($sql);
         if (! $resultupdateto) { dolibarr_print_error($db); }
     }
@@ -126,7 +131,7 @@ print $langs->trans("BoxesDesc")."<br>\n";
 
 $sql  = "SELECT b.rowid, b.box_id, b.position, b.box_order, d.name, d.rowid as boxid";
 $sql .= " FROM ".MAIN_DB_PREFIX."boxes as b, ".MAIN_DB_PREFIX."boxes_def as d";
-$sql .= " where b.box_id = d.rowid";
+$sql .= " WHERE b.box_id = d.rowid AND fk_user=0";
 $sql .= " ORDER by position, box_order";
 
 $resql = $db->query($sql);
@@ -174,7 +179,8 @@ print '<td>'.$langs->trans("SourceFile").'</td>';
 print '<td align="center" width="160">'.$langs->trans("ActivateOn").'</td>';
 print "</tr>\n";
 
-$sql = "SELECT rowid, name, file, note FROM ".MAIN_DB_PREFIX."boxes_def";
+$sql = "SELECT rowid, name, file, note";
+$sql.= " FROM ".MAIN_DB_PREFIX."boxes_def";
 $resql = $db->query($sql);
 $var=True;
 
@@ -243,14 +249,16 @@ print '<tr class="liste_titre">';
 print '<td width="300">'.$langs->trans("Box").'</td>';
 print '<td>'.$langs->trans("Note").'/'.$langs->trans("Parameters").'</td>';
 print '<td align="center" width="160">'.$langs->trans("ActiveOn").'</td>';
-print '<td align="center" width="60" colspan="2">'.$langs->trans("Position").'</td>';
+print '<td align="center" width="60" colspan="2">'.$langs->trans("PositionByDefault").'</td>';
 print '<td align="center" width="80">'.$langs->trans("Disable").'</td>';
 print "</tr>\n";
 
-$sql  = "SELECT b.rowid, b.box_id, b.position, d.name, d.file, d.note";
-$sql .= " FROM ".MAIN_DB_PREFIX."boxes as b, ".MAIN_DB_PREFIX."boxes_def as d";
-$sql .= " where b.box_id = d.rowid";
-$sql .= " ORDER by position, box_order";
+$sql = "SELECT b.rowid, b.box_id, b.position,";
+$sql.= " d.name, d.file, d.note";
+$sql.= " FROM ".MAIN_DB_PREFIX."boxes as b, ".MAIN_DB_PREFIX."boxes_def as d";
+$sql.= " WHERE b.box_id = d.rowid";
+$sql.= " AND b.fk_user=0";
+$sql.= " ORDER by position, box_order";
 
 $resql = $db->query($sql);
 
diff --git a/htdocs/boxes.php b/htdocs/boxes.php
index a9c86b1e7780a7f894f11232288270e1eaecc418..5b4979903d75739392eae97e3678dd007cfa3319 100644
--- a/htdocs/boxes.php
+++ b/htdocs/boxes.php
@@ -1,6 +1,6 @@
 <?php
 /* Copyright (C) 2003      Rodolphe Quiedeville <rodolphe@quiedeville.org> 
- * Copyright (C) 2004-2005 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2004-2006 Laurent Destailleur  <eldy@users.sourceforge.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -66,7 +66,7 @@ class InfoBox
 		if ($user->id && $user->conf->$confuserzone)
 		{
 			// Recupere liste des boites d'un user si ce dernier a sa propre liste
-			$sql = "SELECT b.rowid, b.box_id,";
+			$sql = "SELECT b.rowid, b.box_id, b.position, b.box_order, b.fk_user,";
 			$sql.= " d.file, d.note";
 			$sql.= " FROM ".MAIN_DB_PREFIX."boxes as b, ".MAIN_DB_PREFIX."boxes_def as d";
 			$sql.= " WHERE b.box_id = d.rowid";
@@ -86,6 +86,11 @@ class InfoBox
 					$boxname=eregi_replace('\.php$','',$obj->file);
 					include_once(DOL_DOCUMENT_ROOT."/includes/boxes/".$boxname.".php");
 					$box=new $boxname($this->db,$obj->note);
+					$box->rowid=$obj->rowid;
+					$box->box_id=$obj->box_id;
+					$box->position=$obj->position;
+					$box->box_order=$obj->box_order;
+					$box->fk_user=$obj->fk_user;
 					$boxes[$j]=$box;
 					$j++;
 				}
@@ -99,7 +104,7 @@ class InfoBox
 		else
 		{
 			// Recupere liste des boites active par defaut pour tous
-			$sql = "SELECT b.rowid, b.box_id,";
+			$sql = "SELECT b.rowid, b.box_id, b.position, b.box_order, b.fk_user,";
 			$sql.= " d.file, d.note";
 			$sql.= " FROM ".MAIN_DB_PREFIX."boxes as b, ".MAIN_DB_PREFIX."boxes_def as d";
 			$sql.= " WHERE b.box_id = d.rowid";
@@ -119,6 +124,11 @@ class InfoBox
 					$boxname=eregi_replace('\.php$','',$obj->file);
 					include_once(DOL_DOCUMENT_ROOT."/includes/boxes/".$boxname.".php");
 					$box=new $boxname($this->db,$obj->note);
+					$box->rowid=$obj->rowid;
+					$box->box_id=$obj->box_id;
+					$box->position=$obj->position;
+					$box->box_order=$obj->box_order;
+					$box->fk_user=$obj->fk_user;
 					$boxes[$j]=$box;
 					$j++;
 				}
@@ -132,6 +142,78 @@ class InfoBox
 		
 		return $boxes;
 	}
-  
+
+
+    /**
+     *      \brief      Sauvegarde sequencement des boites pour la zone et le user
+     *      \param      $zone       ID de la zone (0 pour la Homepage, ...)
+     *      \param      $boxarray	Tableau des boites dans le bon ordre
+     *      \param      $user		Objet user
+     *      \return     int			<0 si ko, >= 0 si ok
+     */
+	function saveboxorder($zone,$boxarray,$user)
+	{
+		dolibarr_syslog("InfoBoxes::saveboxorder zone=$zone user=$user");
+
+		if (! is_object($user) || ! $user->id) return 0;
+
+		$this->db->begin();
+		
+		// Sauve parametre indiquant que le user a une 
+		$confuserzone='MAIN_BOXES_'.$zone;
+		$tab[$confuserzone]=1;
+ 		if (! dolibarr_set_user_page_param($this->db, $user, '', $tab))
+ 		{
+			$this->error=$this->db->error();
+			$this->db->rollback();
+			return -3;
+ 		}
+		
+		$sql ="DELETE FROM ".MAIN_DB_PREFIX."boxes";
+		$sql.=" WHERE fk_user = ".$user->id;
+		$sql.=" AND position = ".$zone;
+		$result = $this->db->query($sql);
+		if ($result)
+		{
+			for ($ii=0, $ni=sizeof($boxarray); $ii < $ni; $ii++)
+			{
+				//print "box_id".$boxarray[$ii]->box_id.'<br>';
+				//print "box_order".$boxarray[$ii]->box_order.'<br>';
+		        $sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes";
+		        $sql.= "(box_id, position, box_order, fk_user)";
+		        $sql.= " values (";
+		        $sql.= " ".$boxarray[$ii]->box_id.",";
+		        $sql.= " ".$zone.",";
+		        $sql.= " ".$boxarray[$ii]->box_order.",";
+		        $sql.= " ".$user->id;
+		        $sql.= ")";
+		        $result = $this->db->query($sql);
+				if ($result < 0)
+				{
+					$error++;
+					break;
+				}			
+			}
+	
+			if ($error)
+			{
+				$this->error=$this->db->error();
+				$this->db->rollback();
+				return -2;
+			}
+			else
+			{
+				$this->db->commit();
+				return 1;
+			}
+		}
+		else
+		{
+			$this->error=$this->db->error();
+			$this->db->rollback();
+			return -1;
+		}
+		
+	}  
 }
 ?>
diff --git a/htdocs/includes/boxes/modules_boxes.php b/htdocs/includes/boxes/modules_boxes.php
index 5dbfc33c3414802b15eda9f7a73f4cf7d98aedad..608467251d29d0070b4fc179fc73ff40b269c4d9 100644
--- a/htdocs/includes/boxes/modules_boxes.php
+++ b/htdocs/includes/boxes/modules_boxes.php
@@ -1,5 +1,5 @@
 <?php
-/* Copyright (C) 2004-2005 Laurent Destailleur  <eldy@users.sourceforge.net>
+/* Copyright (C) 2004-2006 Laurent Destailleur  <eldy@users.sourceforge.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,9 +37,19 @@ class ModeleBoxes
 {
     var $MAXLENGTHBOX=60;   // Mettre 0 pour pas de limite
 
+    var $db;
     var $error='';
-
-
+	
+
+	/*
+	*	\brief		Constructeur
+	*/
+	function ModeleBoxes($DB)
+	{
+		$this->db=$DB;
+	}
+	
+	
    /**
         \brief      Renvoi le dernier message d'erreur de cr�ation de facture
     */
@@ -49,6 +59,42 @@ class ModeleBoxes
     }
 
 
+   /**
+        \brief      Charge une ligne boxe depuis son rowid
+    */
+    function fetch($rowid)
+    {
+		// Recupere liste des boites d'un user si ce dernier a sa propre liste
+		$sql = "SELECT b.rowid, b.box_id, b.position, b.box_order, b.fk_user";
+		$sql.= " FROM ".MAIN_DB_PREFIX."boxes as b";
+		$sql.= " WHERE b.rowid = ".$rowid;
+		dolibarr_syslog("ModeleBoxes::fetch rowid=".$rowid);
+
+	    $resql = $this->db->query($sql);
+	    if ($resql)
+	    {
+	        $obj = $this->db->fetch_object($resql);
+			if ($obj)
+			{
+				$this->rowid=$obj->rowid;
+				$this->box_id=$obj->box_id;
+				$this->position=$obj->position;
+				$this->box_order=$obj->box_order;
+				$this->fk_user=$obj->fk_user;
+				return 1;
+			}
+			else
+			{
+				return -1;
+			}
+		}
+		else
+		{
+			return -1;
+		}
+	}
+
+
    /**
         \brief      Methode standard d'affichage des boites
         \param      $head       tableau des caract�ristiques du titre
@@ -91,7 +137,7 @@ class ModeleBoxes
       		print img_picto($langs->trans("Move"),'uparrow','style="cursor:move;"');
 			print '</td></tr></table>';
 		}
-		
+
         print '</td>';
         print '</tr>';
 
diff --git a/htdocs/index.php b/htdocs/index.php
index ed0d0042b94f4fe094a8cbdb7911189bc6c27e6e..7fe0a6a48c5582fabb07d28e8c5143cdcb90fe75 100644
--- a/htdocs/index.php
+++ b/htdocs/index.php
@@ -491,11 +491,42 @@ print '</td></tr></table>';
 $boxarray=$infobox->listboxes("0",$user);       // 0=valeur pour la page accueil
 $boxjavascriptids=array();
 
+// Gestion deplacement des boxes
 if (eregi('boxobject_([0-9]+)',$_GET["switchfrom"],$regfrom)
 	&& eregi('boxto_([0-9]+)',$_GET["switchto"],$regto))
 {
-	//print "Modif ordre box: ".$regfrom[1]." <-> ".$regto[1];
-//	print_r($boxarray);
+	/*
+	print "Modif ordre box: ";
+	print $boxarray[$regfrom[1]]->box_id."(".$boxarray[$regfrom[1]]->box_order.")";
+	print " <-> ";
+	print $boxarray[$regto[1]]->box_id."(".$boxarray[$regto[1]]->box_order.")";
+	print "<br>\n";
+	*/
+	
+	// Permutation boites
+	$switchii=$boxarray[$regto[1]];
+	$boxarray[$regto[1]]=$boxarray[$regfrom[1]];
+	$boxarray[$regfrom[1]]=$switchii;
+
+	// Permutation box_order
+	$switchbox_order=$boxarray[$regto[1]]->box_order;
+	$boxarray[$regto[1]]->box_order=$boxarray[$regfrom[1]]->box_order;
+	$boxarray[$regfrom[1]]->box_order=$switchbox_order;
+
+	/*
+	print "Modif ordre box: ";
+	print $boxarray[$regfrom[1]]->box_id."(".$boxarray[$regfrom[1]]->box_order.")";
+	print " <-> ";
+	print $boxarray[$regto[1]]->box_id."(".$boxarray[$regto[1]]->box_order.")";
+	print "<br>\n";
+	*/
+	
+	// Sauvegarde nouvel ordre pour l'utilisateur
+	$result=$infobox->saveboxorder("0",$boxarray,$user);
+	if ($result < 0)
+	{
+		dolibarr_print_error($db,$infobox->error);	
+	}
 }
 
 
@@ -563,9 +594,10 @@ if ($conf->use_ajax && $conf->browser->firefox && $conf->global->MAIN_SHOW_DEVEL
 }
 
 // Juste pour �viter bug IE qui r�organise mal div pr�c�dents si celui-ci absent
-print '<div class="tabsAction">';
-print '&nbsp;';
-print '</div>';
+if (! $conf->browser->firefox)
+{
+	print '<div class="tabsAction">&nbsp;</div>';
+}
 
 
 $db->close();
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 8c8683b39d9bd07756a5c4edfb650f65ca188805..32929c0ed026a4383617fbaa6e9f17ed3473fbe9 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -41,6 +41,8 @@ CurrentDolibarrLanguage=Dolibarr current language
 OSEnv=OS Environment
 Box=Box
 Boxes=Boxes
+PositionByDefault=Default order
+Position=Order
 System=System
 SystemInfo=System informations
 SystemTools=System tools
diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang
index 3ed7c13ac8f23c8ca3363dfd9b869360ca516213..83f89b5590adb1564193d28608e55017ae3ca3b2 100644
--- a/htdocs/langs/fr_FR/admin.lang
+++ b/htdocs/langs/fr_FR/admin.lang
@@ -41,6 +41,8 @@ CurrentDolibarrLanguage=Langue Dolibarr courante
 OSEnv=Environnement OS
 Box=Bo�te
 Boxes=Bo�tes
+PositionByDefault=Position par d�faut
+Position=Ordre
 System=Syst�me
 SystemInfo=Infos Syst�me
 SystemTools=Outils Syst�me
diff --git a/htdocs/lib/functions.inc.php b/htdocs/lib/functions.inc.php
index 4525f8172f100cd2e6c67c6d60ecef616f67bf7d..090f69b695e03bc836bc076efb98ca107667b734 100644
--- a/htdocs/lib/functions.inc.php
+++ b/htdocs/lib/functions.inc.php
@@ -369,6 +369,57 @@ function dolibarr_del_const($db, $name)
     }
 }
 
+
+/**
+		\brief      Sauvegarde parametrage personnel
+		\param	    db          Handler d'acc�s base
+		\param	    user        Objet utilisateur
+		\param	    url         Si defini, on sauve parametre du tableau tab dont cl� = sortfield, sortorder, begin et page
+		                        Si non defini on sauve tous parametres du tableau tab
+		\param	    tab         Tableau (cl�=>valeur) des param�tres � sauvegarder
+		\return     int         <0 si ko, >0 si ok
+*/
+function dolibarr_set_user_page_param($db, &$user, $url='', $tab)
+{
+    $db->begin();
+    
+    // On efface param�tres anciens
+    $sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param";
+    $sql.= " WHERE fk_user = ".$user->id;
+    if ($url) $sql.=" AND page='".$url."'";
+    else $sql.=" AND page=''";
+    dolibarr_syslog("functions.inc.php::dolibarr_set_user_page_param $sql");
+
+    $resql=$db->query($sql);
+    if (! $resql)
+    {
+        dolibarr_print_error($db);
+    	exit;
+    }
+
+    foreach ($tab as $key=>$value)
+    {
+        // On positionne nouveaux param�tres
+        if ($value && (! $url || in_array($key,array('sortfield','sortorder','begin','page'))))
+        {
+            $sql = "INSERT INTO ".MAIN_DB_PREFIX."user_param(fk_user,page,param,value)";
+            $sql.= " VALUES (".$user->id.",";
+            if ($url) $sql.= " '".urlencode($url)."',";
+            else $sql.= " '',";
+            $sql.= " '".$key."','".addslashes($value)."');";
+            dolibarr_syslog("functions.inc.php::dolibarr_set_user_page_param $sql");
+
+            $db->query($sql);
+
+            $user->page_param[$key] = $value;
+        }
+    }
+
+    $db->commit();
+    return 1;
+}
+
+
 /**
 		\brief  Formattage des nombres
 		\param	ca			valeur a formater
@@ -603,10 +654,10 @@ function img_object($alt, $object)
         \param      picto       Nom de l'image a afficher
         \return     string      Retourne tag img
 */
-function img_picto($alt, $picto)
+function img_picto($alt, $picto, $options='')
 {
   global $conf,$langs;
-  return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/'.$picto.'.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
+  return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/'.$picto.'.png" border="0" alt="'.$alt.'" title="'.$alt.'"'.($options?' '.$options:'').'>';
 }
 
 /**
@@ -1261,51 +1312,6 @@ function doliMoveFileUpload($src_file, $dest_file)
 }
 
 
-/**
-		\brief      Sauvegarde parametrage personnel
-		\param	    db          Handler d'acc�s base
-		\param	    user        Objet utilisateur
-		\param	    url         Si defini, on sauve parametre du tableau tab dont cl� = sortfield, sortorder, begin et page
-		                        Si non defini on sauve tous parametres du tableau tab
-		\param	    tab         Tableau (cl�=>valeur) des param�tres � sauvegarder
-*/
-function dolibarr_set_user_page_param($db, &$user, $url='', $tab)
-{
-    $db->begin();
-    
-    // On efface param�tres anciens
-    $sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param";
-    $sql.= " WHERE fk_user = ".$user->id;
-    if ($url) $sql.=" AND page='".$url."'";
-    else $sql.=" AND page=''";
-    $sql.=";";
-    $resql=$db->query($sql);
-    if (! $resql)
-    {
-        dolibarr_print_error($db);
-    }
-    dolibarr_syslog("functions.inc.php::dolibarr_set_user_page_param $sql");
-
-    foreach ($tab as $key=>$value)
-    {
-        // On positionne nouveaux param�tres
-        if ($value && (! $url || in_array($key,array('sortfield','sortorder','begin','page'))))
-        {
-            $sql = "INSERT INTO ".MAIN_DB_PREFIX."user_param(fk_user,page,param,value)";
-            $sql.= " VALUES (".$user->id.",";
-            if ($url) $sql.= " '".urlencode($url)."',";
-            else $sql.= " '',";
-            $sql.= " '".$key."','".addslashes($value)."');";
-            dolibarr_syslog("functions.inc.php::dolibarr_set_user_page_param $sql");
-            $db->query($sql);
-
-            $user->page_param[$key] = $value;
-        }
-    }
-
-    $db->commit();
-}
-
 /**
 		\brief  Transcodage de francs en euros
 		\param	zonein		zone de depart