diff --git a/htdocs/admin/perms.php b/htdocs/admin/perms.php
index 735ba92a0bd6f9a0fc9d5abfc2045c79e9ee3bab..ab738f60d706159acfb157dfdfc18b859dcd6709 100644
--- a/htdocs/admin/perms.php
+++ b/htdocs/admin/perms.php
@@ -26,11 +26,14 @@
 
 require("../main.inc.php");
 require_once(DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php");
+require_once(DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php");
 
 $langs->load("admin");
 $langs->load("users");
 $langs->load("other");
 
+$action=GETPOST('action');
+
 if (!$user->admin) accessforbidden();
 
 
@@ -38,7 +41,7 @@ if (!$user->admin) accessforbidden();
  * Actions
  */
 
-if ($_GET["action"] == 'add')
+if ($action == 'add')
 {
     $sql = "UPDATE ".MAIN_DB_PREFIX."rights_def SET bydefault=1";
     $sql.= " WHERE id = ".$_GET["pid"];
@@ -46,7 +49,7 @@ if ($_GET["action"] == 'add')
     $db->query($sql);
 }
 
-if ($_GET["action"] == 'remove')
+if ($action == 'remove')
 {
     $sql = "UPDATE ".MAIN_DB_PREFIX."rights_def SET bydefault=0";
     $sql.= " WHERE id = ".$_GET["pid"];
@@ -79,37 +82,13 @@ $db->begin();
 
 // Charge les modules soumis a permissions
 $modules = array();
-$modulesdir = array();
-
-foreach ($conf->file->dol_document_root as $type => $dirroot)
-{
-    $modulesdir[] = $dirroot . "/core/modules/";
-
-    if ($type == 'alt')
-    {
-        $handle=@opendir($dirroot);
-        if (is_resource($handle))
-        {
-            while (($file = readdir($handle))!==false)
-            {
-                if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes')
-                {
-                    if (is_dir($dirroot . '/' . $file . '/core/modules/'))
-                    {
-                        $modulesdir[] = $dirroot . '/' . $file . '/core/modules/';
-                    }
-                }
-            }
-            closedir($handle);
-        }
-    }
-}
+$modulesdir = dolGetModulesDirs();
 
 foreach ($modulesdir as $dir)
 {
     // Load modules attributes in arrays (name, numero, orders) from dir directory
     //print $dir."\n<br>";
-    $handle=@opendir($dir);
+    $handle=@opendir(dol_osencode($dir));
     if (is_resource($handle))
     {
         while (($file = readdir($handle))!==false)
@@ -162,7 +141,7 @@ if ($result)
     $i		= 0;
     $var	= True;
     $oldmod	= "";
-    
+
     while ($i < $num)
     {
         $obj = $db->fetch_object($result);
@@ -179,16 +158,16 @@ if ($result)
         foreach($modules[$obj->module]->rights as $key => $val)
         {
         	$rights_class=$objMod->rights_class;
-        	if ($val[4] == $obj->perms && (empty($val[5]) || $val[5] == $obj->subperms)) 
+        	if ($val[4] == $obj->perms && (empty($val[5]) || $val[5] == $obj->subperms))
         	{
         		$found=true;
         		break;
         	}
         }
-		if (! $found) 
+		if (! $found)
 		{
 			$i++;
-			continue;	
+			continue;
 		}
 
         // Break found, it's a new module to catch
diff --git a/htdocs/admin/system/modules.php b/htdocs/admin/system/modules.php
index a3a5265349617c384433dce00369861992809af2..616c551d00c436964b5004b35a7e904823374ee6 100644
--- a/htdocs/admin/system/modules.php
+++ b/htdocs/admin/system/modules.php
@@ -23,13 +23,13 @@
  */
 
 require("../../main.inc.php");
+require_once(DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php");
 
 $langs->load("admin");
 $langs->load("install");
 $langs->load("other");
 
-if (!$user->admin)
-accessforbidden();
+if (!$user->admin) accessforbidden();
 
 
 /*
@@ -46,36 +46,12 @@ print "<br>\n";
 $modules = array();
 $modules_names = array();
 $modules_files = array();
-
-// Search modules dirs
-$modulesdir = array();
-foreach ($conf->file->dol_document_root as $type => $dirroot)
-{
-    $modulesdir[$dirroot . '/core/modules/'] = $dirroot . '/core/modules/';
-
-    $handle=@opendir($dirroot);
-    if (is_resource($handle))
-    {
-        while (($file = readdir($handle))!==false)
-        {
-            if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes')
-            {
-                if (is_dir($dirroot . '/' . $file . '/core/modules/'))
-                {
-                    $modulesdir[$dirroot . '/' . $file . '/core/modules/'] = $dirroot . '/' . $file . '/core/modules/';
-                }
-            }
-        }
-        closedir($handle);
-    }
-}
-//var_dump($modulesdir);
-
+$modulesdir = dolGetModulesDirs();
 
 // Load list of modules
 foreach($modulesdir as $dir)
 {
-	$handle=@opendir($dir);
+	$handle=@opendir(dol_osencode($dir));
     if (is_resource($handle))
     {
     	while (($file = readdir($handle))!==false)
diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php
index 48928163f9cca80fad9ff1acda5e6fa99404d0e7..25b07af7a4abe2ee2732105b611efe627b87ae88 100644
--- a/htdocs/core/lib/functions2.lib.php
+++ b/htdocs/core/lib/functions2.lib.php
@@ -25,6 +25,43 @@
  */
 
 
+/**
+ * Return list of modules directories
+ *
+ * @return		array		Array of directories that can contains module descriptors
+ */
+function dolGetModulesDirs()
+{
+    global $conf;
+
+    $modulesdir=array();
+
+    foreach ($conf->file->dol_document_root as $type => $dirroot)
+    {
+        // Default core/modules dir
+        $modulesdir[$dirroot . '/core/modules/'] = $dirroot . '/core/modules/';
+
+        // Scan dir from external modules
+        $handle=@opendir($dirroot);
+        if (is_resource($handle))
+        {
+            while (($file = readdir($handle))!==false)
+            {
+                if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes')
+                {
+                    if (is_dir($dirroot . '/' . $file . '/core/modules/'))
+                    {
+                        $modulesdir[$dirroot . '/' . $file . '/core/modules/'] = $dirroot . '/' . $file . '/core/modules/';
+                    }
+                }
+            }
+            closedir($handle);
+        }
+    }
+    return $modulesdir;
+}
+
+
 /**
  *  Try to guess default paper format according to language into $langs
  *
diff --git a/htdocs/exports/class/export.class.php b/htdocs/exports/class/export.class.php
index 14e9197fc087b6a14e2057560c6155da176f72e1..bc4b9ee1265b34c31ba59771f372e8ce848be7ba 100644
--- a/htdocs/exports/class/export.class.php
+++ b/htdocs/exports/class/export.class.php
@@ -50,11 +50,11 @@ class Export
 	/**
 	 *    Constructor
 	 *
-	 *    @param  	DoliDB		$DB		Database handler
+	 *    @param  	DoliDB		$db		Database handler
 	 */
-	function Export($DB)
+	function Export($db)
 	{
-		$this->db=$DB;
+		$this->db=$db;
 	}
 
 
@@ -75,34 +75,14 @@ class Export
         $i=0;
 
         // Define list of modules directories into modulesdir
-        foreach ($conf->file->dol_document_root as $type => $dirroot)
-		{
-			$modulesdir[] = $dirroot . "/core/modules/";
+        require_once(DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php");
 
-			if ($type == 'alt')
-			{
-				$handle=@opendir($dirroot);
-				if (is_resource($handle))
-				{
-					while (($file = readdir($handle))!==false)
-					{
-					    if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes')
-					    {
-					    	if (is_dir($dirroot . '/' . $file . '/core/modules/'))
-					    	{
-					    		$modulesdir[] = $dirroot . '/' . $file . '/core/modules/';
-					    	}
-					    }
-					}
-					closedir($handle);
-				}
-			}
-		}
+        $modulesdir = dolGetModulesDirs();
 
 		foreach($modulesdir as $dir)
 		{
 			// Search available exports
-			$handle=@opendir($dir);
+			$handle=@opendir(dol_osencode($dir));
 			if (is_resource($handle))
 			{
                 // Search module files
diff --git a/htdocs/imports/class/import.class.php b/htdocs/imports/class/import.class.php
index f981847a466ff1082f821238df8beb428dcdf940..8e88243ac46aae39cb8c61ad5e237b95617a7d1a 100644
--- a/htdocs/imports/class/import.class.php
+++ b/htdocs/imports/class/import.class.php
@@ -67,12 +67,12 @@ class Import
         $var=true;
         $i=0;
 
-		//$dir=DOL_DOCUMENT_ROOT."/core/modules";
-		foreach($conf->file->dol_document_root as $dirroot)
-		{
-			$dir = $dirroot.'/core/modules';
+        require_once(DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php");
+        $modulesdir = dolGetModulesDirs();
 
-			// Search available exports
+        // Load list of modules
+        foreach($modulesdir as $dir)
+        {
 			$handle=@opendir(dol_osencode($dir));
 			if (! is_resource($handle)) continue;
 
diff --git a/htdocs/user/group/perms.php b/htdocs/user/group/perms.php
index 175f005646a139e9ef775ec66890a9cb9a3f58b9..a877154fdbba43c4b7c0eefdd25a8b00b983bc1d 100644
--- a/htdocs/user/group/perms.php
+++ b/htdocs/user/group/perms.php
@@ -27,6 +27,7 @@
 require("../../main.inc.php");
 require_once(DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php');
 require_once(DOL_DOCUMENT_ROOT."/core/lib/usergroups.lib.php");
+require_once(DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php");
 
 $langs->load("users");
 
@@ -90,42 +91,17 @@ if ($id)
     $title = $langs->trans("Group");
     dol_fiche_head($head, 'rights', $title, 0, 'group');
 
-
-    $db->begin();
-
     // Charge les modules soumis a permissions
     $modules = array();
-    $modulesdir = array();
-
-	foreach ($conf->file->dol_document_root as $type => $dirroot)
-	{
-		$modulesdir[] = $dirroot . "/core/modules/";
-
-		if ($type == 'alt')
-		{
-			$handle=@opendir($dirroot);
-			if (is_resource($handle))
-			{
-				while (($file = readdir($handle))!==false)
-				{
-				    if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes')
-				    {
-				    	if (is_dir($dirroot . '/' . $file . '/core/modules/'))
-				    	{
-				    		$modulesdir[] = $dirroot . '/' . $file . '/core/modules/';
-				    	}
-				    }
-				}
-				closedir($handle);
-			}
-		}
-	}
+    $modulesdir = dolGetModulesDirs();
+
+    $db->begin();
 
     foreach ($modulesdir as $dir)
     {
         // Load modules attributes in arrays (name, numero, orders) from dir directory
         //print $dir."\n<br>";
-        $handle=@opendir($dir);
+        $handle=@opendir(dol_osencode($dir));
         if (is_resource($handle))
         {
             while (($file = readdir($handle))!==false)
@@ -133,7 +109,7 @@ if ($id)
                 if (is_readable($dir.$file) && substr($file, 0, 3) == 'mod'  && substr($file, dol_strlen($file) - 10) == '.class.php')
                 {
                     $modName = substr($file, 0, dol_strlen($file) - 10);
-                    
+
                     if ($modName)
                     {
                         include_once($dir."/".$file);
@@ -182,7 +158,7 @@ if ($id)
     {
     	$sql.= " AND r.entity IN (0,".$conf->entity.")";
     }
-        
+
     $sql.= " AND ugr.fk_usergroup = ".$fgroup->id;
 
     $result=$db->query($sql);
@@ -273,7 +249,7 @@ if ($id)
         $i = 0;
         $var = true;
         $oldmod = '';
-        
+
         $num = $db->num_rows($result);
 
         while ($i < $num)
diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php
index 0ee185c043201cf3c00f4d36bbdac1a0448bf180..820ec2bed3492245d584583cb999d97acd65bc07 100644
--- a/htdocs/user/perms.php
+++ b/htdocs/user/perms.php
@@ -26,6 +26,7 @@
 
 require("../main.inc.php");
 require_once(DOL_DOCUMENT_ROOT."/core/lib/usergroups.lib.php");
+require_once(DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php");
 
 $langs->load("users");
 $langs->load("admin");
@@ -122,35 +123,11 @@ $db->begin();
 
 // Search all modules with permission and reload permissions def.
 $modules = array();
-$modulesdir = array();
-
-foreach ($conf->file->dol_document_root as $type => $dirroot)
-{
-	$modulesdir[] = $dirroot . "/core/modules/";
-
-	if ($type == 'alt')
-	{
-		$handle=@opendir($dirroot);
-		if (is_resource($handle))
-		{
-			while (($file = readdir($handle))!==false)
-			{
-			    if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes')
-			    {
-			    	if (is_dir($dirroot . '/' . $file . '/core/modules/'))
-			    	{
-			    		$modulesdir[] = $dirroot . '/' . $file . '/core/modules/';
-			    	}
-			    }
-			}
-			closedir($handle);
-		}
-	}
-}
+$modulesdir = dolGetModulesDirs();
 
 foreach($modulesdir as $dir)
 {
-	$handle=@opendir($dir);
+	$handle=@opendir(dol_osencode($dir));
     if (is_resource($handle))
     {
     	while (($file = readdir($handle))!==false)