diff --git a/htdocs/admin/perms.php b/htdocs/admin/perms.php
index 88c4adcfca7379752219f2cd5ac9eda8986efd62..3fc25bef079d628fd807f873c3e7bede54320213 100644
--- a/htdocs/admin/perms.php
+++ b/htdocs/admin/perms.php
@@ -82,9 +82,10 @@ while (($file = readdir($handle))!==false)
 }
 
 // Affiche lignes des permissions
-$sql = "SELECT r.id, r.libelle, r.module, r.bydefault FROM ".MAIN_DB_PREFIX."rights_def as r";
-$sql .= " WHERE type <> 'a'";
-$sql .= " ORDER BY r.id ASC";
+$sql ="SELECT r.id, r.libelle, r.module, r.bydefault";
+$sql.=" FROM ".MAIN_DB_PREFIX."rights_def as r";
+$sql.=" WHERE r.libelle NOT LIKE 'tou%'";    // On ignore droits "tous"
+$sql.=" ORDER BY r.id, r.module";
 
 $result = $db->query($sql);
 if ($result) 
@@ -100,9 +101,13 @@ if ($result)
 
       if ($old <> $obj->module)
 	{
+       // Rupture d�tect�e, on r�cup�re objMod
+        $objMod=$modules[$obj->module];
+        $picto=($objMod->picto?$objMod->picto:'generic');
+
 	  print '<tr class="liste_titre">';
-	  print '<td>'.$langs->trans("Permission").'</td>';
 	  print '<td>'.$langs->trans("Module").'</td>';
+	  print '<td>'.$langs->trans("Permission").'</td>';
 	  print '<td align="center">'.$langs->trans("Default").'</td>';
 	  print '<td align="center">&nbsp;</td>';
 	  print "</tr>\n";
@@ -110,9 +115,13 @@ if ($result)
 	}
 
       print '<tr '. $bc[$var].'>';
+
+      print '<td>'.img_object('',$picto).' '.$objMod->getName();
+
       $perm_libelle=(($langs->trans("Permission".$obj->id)!=("Permission".$obj->id))?$langs->trans("Permission".$obj->id):$obj->libelle);
       print '<td>'.$perm_libelle. '</td>';
-      print '<td>'.$modules[$obj->module]->getName(). '</td><td align="center">';
+     
+      print '<td align="center">';
       if ($obj->bydefault == 1)
 	{
 
@@ -133,6 +142,7 @@ if ($result)
 }
 
 print '</table>';
+print '<br>';
 
 $db->close();
 
diff --git a/htdocs/user/group/perms.php b/htdocs/user/group/perms.php
index b215de1509e34023da0077c0e0aa91d013ba99f6..6436b908411b278d25242d362c2edc411065fc8b 100644
--- a/htdocs/user/group/perms.php
+++ b/htdocs/user/group/perms.php
@@ -45,13 +45,13 @@ $module=isset($_GET["module"])?$_GET["module"]:$_POST["module"];
 if ($_GET["action"] == 'addrights' && $user->admin)
 {
     $editgroup = new Usergroup($db,$_GET["id"]);
-    $editgroup->addrights($_GET["rights"]);
+    $editgroup->addrights($_GET["rights"],$module);
 }
 
 if ($_GET["action"] == 'delrights' && $user->admin)
 {
     $editgroup = new Usergroup($db,$_GET["id"]);
-    $editgroup->delrights($_GET["rights"]);
+    $editgroup->delrights($_GET["rights"],$module);
 }
 
 
@@ -68,7 +68,7 @@ if ($_GET["id"])
 {
     $fgroup = new Usergroup($db, $_GET["id"]);
     $fgroup->fetch($_GET["id"]);
-    $fgroup->getrights($_GET["id"]);
+    $fgroup->getrights();
 
     /*
      * Affichage onglets
@@ -107,9 +107,7 @@ if ($_GET["id"])
         while ($i < $num)
         {
             $obj = $db->fetch_object($result);
-
             array_push($permsgroup,$obj->id);
-
             $i++;
         }
         $db->free($result);
@@ -148,13 +146,16 @@ if ($_GET["id"])
 
     print '<table width="100%" class="noborder">';
     print '<tr class="liste_titre">';
+    print '<td>'.$langs->trans("Module").'</td>';
     if ($user->admin) print '<td width="24">&nbsp</td>';
     print '<td align="center" width="24">&nbsp;</td>';
     print '<td>'.$langs->trans("Permissions").'</td>';
-    print '<td>'.$langs->trans("Module").'</td>';
     print '</tr>';
 
-    $sql = "SELECT r.id, r.libelle, r.module FROM ".MAIN_DB_PREFIX."rights_def as r ORDER BY r.module, r.id ASC";
+    $sql ="SELECT r.id, r.libelle, r.module";
+    $sql.=" FROM ".MAIN_DB_PREFIX."rights_def as r";
+    $sql.=" WHERE r.libelle NOT LIKE 'tou%'";    // On ignore droits "tous"
+    $sql.=" ORDER BY r.id, r.module";
 
     $result=$db->query($sql);
     if ($result)
@@ -169,17 +170,28 @@ if ($_GET["id"])
             {
                 $oldmod = $obj->module;
                 $var = !$var;
-                print '<tr '. $bc[$var].'>';
 
-                // Recup�re objMod
+                // Rupture d�tect�e, on r�cup�re objMod
                 $objMod = $modules[$obj->module];
                 $picto=($objMod->picto?$objMod->picto:'generic');
-            }
-            else
-            {
+
                 print '<tr '. $bc[$var].'>';
+                print '<td>'.img_object('',$picto).' '.$objMod->getName();
+                print '<a name="'.$objMod->getName().'">&nbsp;</a></td>';    
+                print '<td align="center" nowrap>';
+                print '<a title='.$langs->trans("All").' alt='.$langs->trans("All").' href="perms.php?id='.$fgroup->id.'&amp;action=addrights&amp;module='.$obj->module.'">'.$langs->trans("All")."</a>";
+                print '/';
+                print '<a title='.$langs->trans("None").' alt='.$langs->trans("None").' href="perms.php?id='.$fgroup->id.'&amp;action=delrights&amp;module='.$obj->module.'">'.$langs->trans("None")."</a>";
+                print '</td>';
+                print '<td colspan="2">&nbsp;</td>';
+                print '</tr>';
             }
 
+            print '<tr '. $bc[$var].'>';
+
+            print '<td>'.img_object('',$picto).' '.$objMod->getName();
+            print '</td>';
+
             if (in_array($obj->id, $permsgroup))
             {
                 // Own permission by group
@@ -187,7 +199,7 @@ if ($_GET["id"])
                 {
                     print '<td align="center"><a href="perms.php?id='.$fgroup->id.'&amp;action=delrights&amp;rights='.$obj->id.'">'.img_edit_remove($langs->trans("Remove")).'</a></td>';
                 }
-                print '<td align="left" align="center">';
+                print '<td align="center">';
                 print img_tick();
                 print '</td>';
             }
@@ -204,9 +216,6 @@ if ($_GET["id"])
             $perm_libelle=(($langs->trans("Permission".$obj->id)!=("Permission".$obj->id))?$langs->trans("Permission".$obj->id):$obj->libelle);
             print '<td>'.$perm_libelle. '</td>';
 
-            print '<td>'.img_object('',$picto).' '.$objMod->getName();
-            print '</td>';
-
             print '</tr>';
 
             $i++;
diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php
index d89a483a05678173626d6441aa30dc89956f2ca1..b5a0b26143ce7eddee863d2e24d79cab0a1fee64 100644
--- a/htdocs/user/perms.php
+++ b/htdocs/user/perms.php
@@ -45,13 +45,13 @@ $module=isset($_GET["module"])?$_GET["module"]:$_POST["module"];
 if ($_GET["action"] == 'addrights' && $user->admin)
 {
     $edituser = new User($db,$_GET["id"]);
-    $edituser->addrights($_GET["rights"]);
+    $edituser->addrights($_GET["rights"],$module);
 }
 
 if ($_GET["action"] == 'delrights' && $user->admin)
 {
     $edituser = new User($db,$_GET["id"]);
-    $edituser->delrights($_GET["rights"]);
+    $edituser->delrights($_GET["rights"],$module);
 }
 
 
@@ -184,13 +184,16 @@ if ($_GET["id"])
 
     print '<table width="100%" class="noborder">';
     print '<tr class="liste_titre">';
+    print '<td>'.$langs->trans("Module").'</td>';
     if ($user->admin) print '<td width="24">&nbsp</td>';
     print '<td align="center" width="24">&nbsp;</td>';
     print '<td>'.$langs->trans("Permissions").'</td>';
-    print '<td>'.$langs->trans("Module").'</td>';
     print '</tr>';
 
-    $sql = "SELECT r.id, r.libelle, r.module FROM ".MAIN_DB_PREFIX."rights_def as r ORDER BY r.module, r.id ASC";
+    $sql ="SELECT r.id, r.libelle, r.module";
+    $sql.=" FROM ".MAIN_DB_PREFIX."rights_def as r";
+    $sql.=" WHERE r.libelle NOT LIKE 'tou%'";    // On ignore droits "tous"
+    $sql.=" ORDER BY r.id, r.module";
 
     $result=$db->query($sql);
     if ($result)
@@ -205,17 +208,28 @@ if ($_GET["id"])
             {
                 $oldmod = $obj->module;
                 $var = !$var;
-                print '<tr '. $bc[$var].'>';
 
-                // R�cup�re objMod
+                // Rupture d�tect�e, on r�cup�re objMod
                 $objMod=$modules[$obj->module];
                 $picto=($objMod->picto?$objMod->picto:'generic');
-            }
-            else
-            {
+
                 print '<tr '. $bc[$var].'>';
+                print '<td>'.img_object('',$picto).' '.$objMod->getName();
+                print '<a name="'.$objMod->getName().'">&nbsp;</a></td>';    
+                print '<td align="center" nowrap>';
+                print '<a title='.$langs->trans("All").' alt='.$langs->trans("All").' href="perms.php?id='.$fuser->id.'&amp;action=addrights&amp;module='.$obj->module.'">'.$langs->trans("All")."</a>";
+                print '/';
+                print '<a title='.$langs->trans("None").' alt='.$langs->trans("None").' href="perms.php?id='.$fuser->id.'&amp;action=delrights&amp;module='.$obj->module.'">'.$langs->trans("None")."</a>";
+                print '</td>';
+                print '<td colspan="2">&nbsp;</td>';
+                print '</tr>';
             }
 
+            print '<tr '. $bc[$var].'>';
+
+            print '<td>'.img_object('',$picto).' '.$objMod->getName();
+            print '</td>';    
+
             if (in_array($obj->id, $permsuser))
             {
                 // Own permission by user
@@ -223,7 +237,7 @@ if ($_GET["id"])
                 {
                     print '<td align="center"><a href="perms.php?id='.$fuser->id.'&amp;action=delrights&amp;rights='.$obj->id.'">'.img_edit_remove($langs->trans("Remove")).'</a></td>';
                 }
-                print '<td align="left" align="center">';
+                print '<td align="center">';
                 print img_tick();
                 print '</td>';
             }
@@ -231,7 +245,7 @@ if ($_GET["id"])
                 // Own permission by group
                 if ($user->admin) 
                 {
-                    print '<td>'.$langs->trans("Group").'</td>';
+                    print '<td align="center">'.$langs->trans("Group").'</td>';
                 }
                 print '<td align="left" nowrap>';
                 print img_tick();
@@ -250,9 +264,6 @@ if ($_GET["id"])
             $perm_libelle=(($langs->trans("Permission".$obj->id)!=("Permission".$obj->id))?$langs->trans("Permission".$obj->id):$obj->libelle);
             print '<td>'.$perm_libelle. '</td>';
 
-            print '<td>'.img_object('',$picto).' '.$objMod->getName();
-            print '</td>';    
-
             print '</tr>';
 
             $i++;
diff --git a/htdocs/usergroup.class.php b/htdocs/usergroup.class.php
index adc87ec9b4e36a025dae07bff7a91d9e20e62513..a0ca3d285fccc492ea525fb052ca7388013a7290 100644
--- a/htdocs/usergroup.class.php
+++ b/htdocs/usergroup.class.php
@@ -97,146 +97,196 @@ class UserGroup
 
   
   /**
-   *    \brief      Ajoute un droit au groupe
+   *    \brief      Ajoute un droit a l'utilisateur
    *    \param      rid         id du droit � ajouter
+   *    \param      allmodule   Ajouter tous les droits du module allmodule
+   *    \param      allperms    Ajouter tous les droits du module allmodule, perms allperms
    *    \return     int         > 0 si ok, < 0 si erreur
    */
 	 
-    function addrights($rid)
+    function addrights($rid,$allmodule='',$allperms='')
     {
-        if (strlen($rid) == 2)
-        {
-            $topid = substr($rid,0,1);
-            $lowid = substr($rid,1,1);
-        }
-    
-        if (strlen($rid) == 3)
-        {
-            $topid = substr($rid,0,2);
-            $lowid = substr($rid,2,1);
-        }
-    
-        if ($lowid == 1)
-        {
-            $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id=$rid";
-            $this->db->query($sql);
-            $sql = "INSERT INTO ".MAIN_DB_PREFIX."usergroup_rights (fk_usergroup, fk_id) VALUES ($this->id, $rid)";
-            if ($this->db->query($sql))
-            {
-            }
-        }
-    
-        if ($lowid > 1)
+        $err=0;
+        $whereforadd='';
+        
+        $this->db->begin();
+
+        if ($rid) 
         {
-    
-            $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id=$rid";
-            $this->db->query($sql);
-            $sql = "INSERT INTO ".MAIN_DB_PREFIX."usergroup_rights (fk_usergroup, fk_id) VALUES ($this->id, $rid)";
-            if ($this->db->query($sql))
-            {
-            }
-    
-            $nid = $topid . "1";
-            $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id=$nid";
-            $this->db->query($sql);
-            $sql = "INSERT INTO ".MAIN_DB_PREFIX."usergroup_rights (fk_usergroup, fk_id) VALUES ($this->id, $nid)";
-            if ($this->db->query($sql))
-            {
-    
+            // Si on a demand� ajout d'un droit en particulier, on r�cup�re
+            // les caract�ristiques (module, perms et subperms) de ce droit.
+            $sql = "SELECT module, perms, subperms";
+            $sql.= " FROM ".MAIN_DB_PREFIX."rights_def";
+            $sql.= " WHERE ";
+            $sql.=" id = '".$rid."'";
+       
+            $result=$this->db->query($sql);
+            if ($result) {
+                $obj = $this->db->fetch_object($result);
+                $module=$obj->module;
+                $perms=$obj->perms;
+                $subperms=$obj->subperms;
             }
-            else
-            {
+            else {
+                $err++;
                 dolibarr_print_error($this->db);
             }
+
+            // Where pour la liste des droits � ajouter
+            $whereforadd="id=".$rid;
+            // Ajout des droits induits
+            if ($subperms) $whereforadd.=" OR (module='$module' AND perms='$perms' AND subperms='lire')";
+            if ($perms)    $whereforadd.=" OR (module='$module' AND perms='lire' AND subperms IS NULL)";
+
+            // Pour compatibilit�, si lowid = 0, on est en mode ajout de tout
+            // \todo A virer quand sera g�r� par l'appelant
+            if (substr($rid,-1,1) == 0) $whereforadd="module='$module'";
         }
-    
-        if ($lowid == 0)
+        else {
+            // Where pour la liste des droits � ajouter
+            if ($allmodule) $whereforadd="module='$allmodule'";
+            if ($allperms)  $whereforadd=" AND perms='$allperms'";
+        }
+
+        // Ajout des droits de la liste whereforadd
+        if ($whereforadd)
         {
-            for ($i = 1 ; $i < 10 ; $i++)
+            //print "$module-$perms-$subperms";
+            $sql = "SELECT id";
+            $sql.= " FROM ".MAIN_DB_PREFIX."rights_def";
+            $sql.= " WHERE $whereforadd";
+            
+            $result=$this->db->query($sql);
+            if ($result)
             {
-                $nid = $topid . "$i";
-                $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id=$nid";
-                $this->db->query($sql);
-                $sql = "INSERT INTO ".MAIN_DB_PREFIX."usergroup_rights (fk_usergroup, fk_id) VALUES ($this->id, $nid)";
-                if ($this->db->query($sql))
+                $num = $this->db->num_rows($result);
+                $i = 0;
+                while ($i < $num)
                 {
+                    $obj = $this->db->fetch_object($result);
+                    $nid = $obj->id;
+       
+                    $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id=$nid";
+                    if (! $this->db->query($sql)) $err++;
+                    $sql = "INSERT INTO ".MAIN_DB_PREFIX."usergroup_rights (fk_usergroup, fk_id) VALUES ($this->id, $nid)";
+                    if (! $this->db->query($sql)) $err++;
     
+                    $i++;
                 }
-                else
-                {
-                    dolibarr_print_error($this->db);
-                }
+            }
+            else 
+            {
+                $err++;
+                dolibarr_print_error($this->db);
             }
         }
     
-    
-        return 1;
+        if ($err) {
+            $this->db->rollback();
+            return -$err;
+        }
+        else {
+            $this->db->commit();
+            return 1;
+        }
+        
     }
 
 
   /**
-   *    \brief      Retire un droit au groupe
-   *    \param      rid        id du droit � retirer
+   *    \brief      Retire un droit a l'utilisateur
+   *    \param      rid         id du droit � retirer
+   *    \param      allmodule   Retirer tous les droits du module allmodule
+   *    \param      allperms    Retirer tous les droits du module allmodule, perms allperms
    *    \return     int         > 0 si ok, < 0 si erreur
    */
 	 
-    function delrights($rid)
+    function delrights($rid,$allmodule='',$allperms='')
     {
-        if (strlen($rid) == 2)
-        {
-            $topid = substr($rid,0,1);
-            $lowid = substr($rid,1,1);
-        }
-    
-        if (strlen($rid) == 3)
-        {
-            $topid = substr($rid,0,2);
-            $lowid = substr($rid,2,1);
-        }
-    
-        if ($lowid > 1)
-        {
-            $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id=$rid";
-            if ($this->db->query($sql))
-            {
-            }
-        }
-    
-        if ($lowid == 1)
+        $err=0;
+        $wherefordel='';
+        
+        $this->db->begin();
+
+        if ($rid) 
         {
-            $fid = $topid . "0";
-            $lid = $topid . "9";
-            $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id >= $fid AND fk_id <= $lid";
-            if ($this->db->query($sql))
-            {
-    
+            // Si on a demand� supression d'un droit en particulier, on r�cup�re
+            // les caract�ristiques module, perms et subperms de ce droit.
+            $sql = "SELECT module, perms, subperms";
+            $sql.= " FROM ".MAIN_DB_PREFIX."rights_def";
+            $sql.= " WHERE ";
+            $sql.=" id = '".$rid."'";
+       
+            $result=$this->db->query($sql);
+            if ($result) {
+                $obj = $this->db->fetch_object($result);
+                $module=$obj->module;
+                $perms=$obj->perms;
+                $subperms=$obj->subperms;
             }
-            else
-            {
+            else {
+                $err++;
                 dolibarr_print_error($this->db);
             }
+
+            // Where pour la liste des droits � supprimer
+            $wherefordel="id=".$rid;
+            // Suppression des droits induits
+            if ($subperms=='lire') $wherefordel.=" OR (module='$module' AND perms='$perms' AND subperms IS NOT NULL)";
+            if ($perms=='lire')    $wherefordel.=" OR (module='$module')";
+
+            // Pour compatibilit�, si lowid = 0, on est en mode suppression de tout
+            // \todo A virer quand sera g�r� par l'appelant
+            if (substr($rid,-1,1) == 0) $wherefordel="module='$module'";
         }
-    
-        if ($lowid == 0)
+        else {
+            // Where pour la liste des droits � supprimer
+            if ($allmodule) $wherefordel="module='$allmodule'";
+            if ($allperms)  $wherefordel=" AND perms='$allperms'";
+        }
+
+        // Suppression des droits de la liste wherefordel
+        if ($wherefordel)
         {
-            for ($i = 1 ; $i < 10 ; $i++)
+            //print "$module-$perms-$subperms";
+            $sql = "SELECT id";
+            $sql.= " FROM ".MAIN_DB_PREFIX."rights_def";
+            $sql.= " WHERE $wherefordel";
+
+            $result=$this->db->query($sql);
+            if ($result)
             {
-                $nid = $topid . "$i";
-                $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id=$nid";
-                if ($this->db->query($sql))
+                $num = $this->db->num_rows($result);
+                $i = 0;
+                while ($i < $num)
                 {
+                    $obj = $this->db->fetch_object($result);
+                    $nid = $obj->id;
+       
+                    $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_rights WHERE fk_usergroup = $this->id AND fk_id=$nid";
+                    if (! $this->db->query($sql)) $err++;
     
-                }
-                else
-                {
-                    dolibarr_print_error($this->db);
+                    $i++;
                 }
             }
+            else 
+            {
+                $err++;
+                dolibarr_print_error($this->db);
+            }
         }
     
-        return 1;
-    }
+        if ($err) {
+            $this->db->rollback();
+            return -$err;
+        }
+        else {
+            $this->db->commit();
+            return 1;
+        }
 
+    }
+    
 
   /**
    *    \brief      Charge dans l'objet group, la liste des permissions auquels le groupe a droit