diff --git a/dev/skeletons/modMyModule.class.php b/dev/skeletons/modMyModule.class.php
index 2243243333409c88a10741cf9035b656370f7bfb..64890b9d9cfa80bd0238efce61789ecd42b16ebc 100644
--- a/dev/skeletons/modMyModule.class.php
+++ b/dev/skeletons/modMyModule.class.php
@@ -62,7 +62,7 @@ class modMyModule extends DolibarrModules
 		$this->name = preg_replace('/^mod/i','',get_class($this));
 		// Module description, used if translation string 'ModuleXXXDesc' not found (where XXX is value of numeric property 'numero' of module)
 		$this->description = "Description of module MyModule";
-		$this->descriptionlong = "A very lon description. Can be a full HTML content";
+		$this->descriptionlong = "A very long description. Can be a full HTML content";
 		$this->editor_name = 'Editor name';
 		$this->editor_url = 'http://www.dolibarr.org';
 		
@@ -105,9 +105,9 @@ class modMyModule extends DolibarrModules
 
 		// Dependencies
 		$this->hidden = false;			// A condition to hide module
-		$this->depends = array();		// List of modules id that must be enabled if this module is enabled
-		$this->requiredby = array();	// List of modules id to disable if this one is disabled
-		$this->conflictwith = array();	// List of modules id this module is in conflict with
+		$this->depends = array();		// List of module class names as string that must be enabled if this module is enabled
+		$this->requiredby = array();	// List of module ids to disable if this one is disabled
+		$this->conflictwith = array();	// List of module class names as string this module is in conflict with
 		$this->phpmin = array(5,0);					// Minimum version of PHP required by module
 		$this->need_dolibarr_version = array(3,0);	// Minimum version of Dolibarr required by module
 		$this->langfiles = array("mylangfile@mymodule");
diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php
index 5504d43671cabda87f8d467623bdd449efd6637d..7d600750cff5898260189ffd09c14a2e6bb788cd 100644
--- a/htdocs/contact/list.php
+++ b/htdocs/contact/list.php
@@ -702,13 +702,12 @@ if ($result)
     		print '<td>';
             if ($obj->socid)
             {
-                print '<a href="'.DOL_URL_ROOT.'/comm/card.php?socid='.$obj->socid.'">';
-                print img_object($langs->trans("ShowCompany"),"company").' '.dol_trunc($obj->name,20).'</a>';
+			$objsoc = new Societe($db);
+			$objsoc->fetch($obj->socid);
+			print $objsoc->getNomUrl(1);
             }
             else
-            {
                 print '&nbsp;';
-            }
             print '</td>';
         }
 
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 0344f56aaab5fee34fb6eb3f1af4a316b222fb4a..8961cf57f5dfca2020677469a7a701ab5fcccd21 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -275,6 +275,9 @@ function GETPOST($paramname,$check='',$method=0,$filter=NULL,$options=NULL)
 	            if (empty($filter)) return 'BadFourthParameterForGETPOST';
 	            $out=filter_var($out, $filter, $options);
 	            break;
+			case 'nohtml':
+				$out=dol_string_nohtmltag($out);
+				break;
 	    }
 	}
 
diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php
index d682aa2db97b2535c6c9108465c5b03e5fad5fa2..6d6856ff36be8c0113238f04162b3f4847907f50 100644
--- a/htdocs/core/modules/DolibarrModules.class.php
+++ b/htdocs/core/modules/DolibarrModules.class.php
@@ -41,36 +41,66 @@ class DolibarrModules           // Can not be abstract, because we need to insta
 
     /**
      * @var int Module unique ID
+     * @see https://wiki.dolibarr.org/index.php/List_of_modules_id
      */
     public $numero;
 
     /**
-     * @var string  Publisher name
+     * @var string Publisher name
+     * @since 4.0.0
      */
     public $editor_name;
     
     /**
-     * @var string  URL of module at publisher site
+     * @var string URL of module at publisher site
+     * @since 4.0.0
      */
-    public $editor_web;    
+    public $editor_url;
     
     /**
      * @var string Family
+     * @see familyinfo
+     *
+     * Native values: 'crm', 'financial', 'hr', 'projects', 'products', 'ecm', 'technic', 'other'.
+     * Use familyinfo to declare a custom value.
      */
     public $family;
+
+    /**
+     * @var array Custom family informations
+     * @see family
+     *
+     * e.g.:
+     * array(
+     *     'myownfamily' => array(
+     *         'position' => '001',
+     *         'label' => $langs->trans("MyOwnFamily")
+     *     )
+     * );
+     *
+     */
+    public $familyinfo;
     
     /**
-     * @var int module_position
+     * @var int Module position
+     * @since 3.9.0
      */
     public $module_position=500;
     
     /**
      * @var string Module name
+     *
+     * Only used if Module[ID]Name translation string is not found.
+     *
+     * You can use the following code to automatically derive it from your module's class name:
+     * preg_replace('/^mod/i', '', get_class($this))
      */
     public $name;
 
     /**
-     * @var array Paths to create when module is activated
+     * @var string[] Paths to create when module is activated
+     *
+     * e.g.: array('/mymodule/temp')
      */
     public $dirs = array();
 
@@ -110,27 +140,27 @@ class DolibarrModules           // Can not be abstract, because we need to insta
      *      // Set this to 1 if module has its own trigger directory (/mymodule/core/triggers)
      *      'triggers' => 0,
      *      // Set this to 1 if module has its own login method directory (/mymodule/core/login)
-	 *  	'login' => 0,
+     *      'login' => 0,
      *      // Set this to 1 if module has its own substitution function file (/mymodule/core/substitutions)
-	 *	    'substitutions' => 0,
+     *      'substitutions' => 0,
      *      // Set this to 1 if module has its own menus handler directory (/mymodule/core/menus)
-	 *	    'menus' => 0,
+     *      'menus' => 0,
      *      // Set this to 1 if module has its own theme directory (/mymodule/theme)
-	 *	    'theme' => 0,
+     *      'theme' => 0,
      *      // Set this to 1 if module overwrite template dir (/mymodule/core/tpl)
      *      'tpl' => 0,
      *      // Set this to 1 if module has its own barcode directory (/mymodule/core/modules/barcode)
-	 *	    'barcode' => 0,
+     *      'barcode' => 0,
      *      // Set this to 1 if module has its own models directory (/mymodule/core/modules/xxx)
-	 *	    'models' => 0,
+     *      'models' => 0,
      *      // Set this to relative path of css file if module has its own css file
-	 *	    'css' => '/mymodule/css/mymodule.css.php',
+     *      'css' => '/mymodule/css/mymodule.css.php',
      *      // Set this to relative path of js file if module must load a js on all pages
-	 *	    'js' => '/mymodule/js/mymodule.js',
+     *      'js' => '/mymodule/js/mymodule.js',
      *      // Set here all hooks context managed by module
-	 *	    'hooks' => array('hookcontext1','hookcontext2'),
+     *      'hooks' => array('hookcontext1','hookcontext2'),
      *      // Set here all workflow context managed by module
-	 *	    'workflow' => array(
+     *      'workflow' => array(
      *          'WORKFLOW_MODULE1_YOURACTIONTYPE_MODULE2' = >array(
      *              'enabled' => '! empty($conf->module1->enabled) && ! empty($conf->module2->enabled)',
      *              'picto'=>'yourpicto@mymodule'
@@ -159,16 +189,29 @@ class DolibarrModules           // Can not be abstract, because we need to insta
 
     /**
      * @var string Module version
+     * @see http://semver.org
+     *
+     * The following keywords can also be used:
+     * 'development'
+     * 'experimental'
+     * 'dolibarr': only for core modules that share its version
+     * 'dolibarr_deprecated': only for deprecated core modules
+     *
      */
     public $version;
 
     /**
      * @var string Module description (short text)
+     *
+     * Only used if Module[ID]Desc translation string is not found.
      */
     public $description;
 
     /**
      * @var string Module description (long text)
+     * @since 4.0.0
+     *
+     * HTML content supported.
      */
     public $descriptionlong;
     
@@ -219,8 +262,70 @@ class DolibarrModules           // Can not be abstract, because we need to insta
      */
     public $style_sheet = '';
 
-    
-	
+	/**
+	 * @var 0|1|2|3 Where to display the module in setup page
+	 * @deprecated @since 4.0.0
+	 * @see family
+	 * @see familyinfo
+	 *
+	 * 0: common
+	 * 1: interface
+	 * 2: others
+	 * 3: very specific
+	 */
+	public $special;
+
+	/**
+	 * @var string Name of image file used for this module
+	 *
+	 * If file is in theme/yourtheme/img directory under name object_pictoname.png use 'pictoname'
+	 * If file is in module/img directory under name object_pictoname.png use 'pictoname@module'
+	 */
+	public $picto;
+
+	/**
+	 * @var string[] List of config pages
+	 *
+	 * Name of php pages stored into module/admin directory, used to setup module.
+	 * e.g.: "admin.php@module"
+	 */
+	public $config_page_url;
+
+	/**
+	 * @var string[] List of module class names that must be enabled if this module is enabled.
+	 *
+	 * e.g.: array('modAnotherModule', 'modYetAnotherModule')
+	 */
+	public $depends;
+
+	/**
+	 * @var int[] List of module ids to disable if this one is disabled.
+	 */
+	public $requiredby;
+
+	/**
+	 * @var string[] List of module class names as string this module is in conflict with.
+	 * @see depends
+	 */
+	public $conflictwith;
+
+	/**
+	 * @var array() Minimum version of PHP required by module.
+	 * e.g.: PHP ≥ 5.3 = array(5, 3)
+	 */
+	public $phpmin;
+
+	/**
+	 * @var array Minimum version of Dolibarr required by module.
+	 * e.g.: Dolibarr ≥ 3.6 = array(3, 6)
+	 */
+	public $need_dolibarr_version;
+
+	/**
+	 * @var bool Whether to hide the module.
+	 */
+	public $hidden = false;
+
 	/**
 	 * Constructor. Define names, constants, directories, boxes, permissions
 	 *
@@ -538,7 +643,7 @@ class DolibarrModules           // Can not be abstract, because we need to insta
     {
         if ($this->version == 'dolibarr' || $this->version == 'dolibarr_deprecated') return 'core';
         if (! empty($this->version) && ! in_array($this->version,array('experimental','development'))) return 'external';
-        if (! empty($this->editor_name) || ! empty($this->editor_web)) return 'external';
+        if (! empty($this->editor_name) || ! empty($this->editor_url)) return 'external';
         if ($this->numero >= 100000) return 'external';
         return 'unknown';
     }