diff --git a/ChangeLog b/ChangeLog
index 75e3da2e0a9e90d9cfd7853577487ac4445e429d..7101d08c570ba7d494f248650bc21c69f5dd70fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@ English Dolibarr changelog
 
 ***** Changelog for 2.4 compared to 2.2 *****
 
+For users:
 - Removed useless code:
   Replaced phplot and phplot5 librairies by artichow.
   Removed cryptograph library replaced by artichow.
@@ -13,15 +14,18 @@ English Dolibarr changelog
 - Changes for compatibility with PHP6/Mysql6.
 - Add an ical export link in webcalendar module.
 - Reduce memory usage.
-- Now triggers are enabled/disabled according to module they
-  refers to.
+- Now triggers are enabled/disabled according to module they refers to.
 - Fix infinite loop on popup calendar.
 - Change in tanslation to make Dolibarr easier to understand.
 - Add a warning when sending a mail from a user with no email defined.
 - A lot of other minor changes (features, look, fixes)
+- Added clicktodial module.
+
 For developers:
 - Update code skeletons examples.
-- Add a tool to generate PHP classes mapped to a table.
+- Add a tool to generate PHP classes completely mapped to a table.
+- Added a check to enable external modules only if dolibarr version is high
+  enough.
 
 
 ***** Changelog for 2.2 compared to 2.1 *****
diff --git a/dev/skeletons/modMyModule.class.php b/dev/skeletons/modMyModule.class.php
index fa7495878fda6486c1592659e0291b8f158ec1af..69a355f89de3916fd872b176c6f95ea34fc1d1db 100644
--- a/dev/skeletons/modMyModule.class.php
+++ b/dev/skeletons/modMyModule.class.php
@@ -82,6 +82,8 @@ class modMyModule extends DolibarrModules
 		// Dependencies
 		$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->phpmin = array(4,1);					// Minimum version of PHP required by module
+		$this->need_dolibarr_version = array(2,4);	// Minimum version of Dolibarr required by module
 		
 		// Constants
 		$this->const = array();			// List of parameters
diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php
index d434837b3fbeaf7e30a22535c378bf33882e3157..4287ce1688c9b66b7435faf896b1ab453b304e7b 100644
--- a/htdocs/admin/modules.php
+++ b/htdocs/admin/modules.php
@@ -17,18 +17,16 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id$
- * $Source$
  */
  
 /**
    \file       htdocs/admin/modules.php
    \brief      Page de configuration et activation des modules
-   \version    $Revision$
+   \version    $Id$
 */
 
 require("./pre.inc.php");
+require_once(DOL_DOCUMENT_ROOT."/lib/admin.lib.php");
 
 $mode=isset($_GET["mode"])?$_GET["mode"]:0;
 $mesg=isset($_GET["mesg"])?urldecode($_GET["mesg"]):"";
@@ -66,44 +64,52 @@ if ($_GET["action"] == 'reset' && $user->admin)
 */
 function Activate($value,$withdeps=1)
 {
-  global $db, $modules, $langs;
+	global $db, $modules, $langs;
 
-  $modName = $value;
-  
-  // Activation du module
-  if ($modName)
-    {
-      $file = $modName . ".class.php";
-      include_once(DOL_DOCUMENT_ROOT."/includes/modules/$file");
-      $objMod = new $modName($db);
-      
-      // Test si version PHP ok
-      $verphp=versionphp();
-      $vermin=$objMod->phpmin;
-      if (is_array($vermin) && versioncompare($verphp,$vermin) < 0)
-        {
-	  return $langs->trans("ErrorModuleRequirePHPVersion",versiontostring($vermin));
-        }
-      
-      $objMod->init();
-    }
-  
-  if ($withdeps)
-    {
-      // Activation des modules dont le module d�pend
-      for ($i = 0; $i < sizeof($objMod->depends); $i++)
-        {
-	  Activate($objMod->depends[$i]);
-        }
-      
-      // Desactivation des modules qui entrent en conflit
-      for ($i = 0; $i < sizeof($objMod->conflictwith); $i++)
+	$modName = $value;
+
+	// Activation du module
+	if ($modName)
 	{
-	  UnActivate($objMod->conflictwith[$i],0);
+		$file = $modName . ".class.php";
+		include_once(DOL_DOCUMENT_ROOT."/includes/modules/".$file);
+		$objMod = new $modName($db);
+		
+		// Test si version PHP ok
+		$verphp=versionphparray();
+		$vermin=$objMod->phpmin;
+		if (is_array($vermin) && versioncompare($verphp,$vermin) < 0)
+		{
+			return $langs->trans("ErrorModuleRequirePHPVersion",versiontostring($vermin));
+		}
+		
+		// Test si version Dolibarr ok
+		$verdol=versiondolibarrarray();
+		$vermin=$objMod->need_dolibarr_version;
+		if (is_array($vermin) && versioncompare($verdol,$vermin) < 0)
+		{
+			return $langs->trans("ErrorModuleRequireDolibarrVersion",versiontostring($vermin));
+		}
+
+		$objMod->init();
 	}
-    }
-  
-  return 0;
+
+	if ($withdeps)
+	{
+		// Activation des modules dont le module d�pend
+		for ($i = 0; $i < sizeof($objMod->depends); $i++)
+		{
+			Activate($objMod->depends[$i]);
+		}
+		
+		// Desactivation des modules qui entrent en conflit
+		for ($i = 0; $i < sizeof($objMod->conflictwith); $i++)
+		{
+			UnActivate($objMod->conflictwith[$i],0);
+		}
+	}
+
+	return 0;
 }
 
 
diff --git a/htdocs/includes/modules/modTelephonie.class.php b/htdocs/includes/modules/modTelephonie.class.php
index 73c3cdaea935de5fea6fad4b4d5c0fbe3fd08fc9..ba0fce6d93883b66c4fe9ad7a23577d376353c21 100644
--- a/htdocs/includes/modules/modTelephonie.class.php
+++ b/htdocs/includes/modules/modTelephonie.class.php
@@ -30,7 +30,8 @@
    \brief      Fichier de description et activation du module de Telephonie
 */
 
-include_once(DOL_DOCUMENT_ROOT ."/includes/modules/DolibarrModules.class.php");
+include_once(DOL_DOCUMENT_ROOT."/includes/modules/DolibarrModules.class.php");
+require_once(DOL_DOCUMENT_ROOT."/lib/admin.lib.php");
 
 
 /**
diff --git a/htdocs/install/check.php b/htdocs/install/check.php
index b48135bbb07b64963c5b20cb63182940aa724039..5136594fcc2968ed15cb286d43ce2cc6b0c84d95 100644
--- a/htdocs/install/check.php
+++ b/htdocs/install/check.php
@@ -16,24 +16,22 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id$
  */
 
 /**
         \file       htdocs/install/check.php
         \ingroup    install
         \brief      Test si le fichier conf est modifiable et si il n'existe pas, test la possibilit� de le cr�er
-        \version    $Revision$
+        \version    $Id$
 */
+include_once("./inc.php");
+require_once($dolibarr_main_document_root."/lib/admin.lib.php");
 
 $err = 0;
 $allowinstall = 0;
 $allowupgrade = 0;
 $checksok = 1;
 
-include_once("./inc.php");
-
 $setuplang=isset($_POST["selectlang"])?$_POST["selectlang"]:(isset($_GET["selectlang"])?$_GET["selectlang"]:$langs->getDefaultLang());
 $langs->setDefaultLang($setuplang);
 
@@ -55,14 +53,14 @@ print '<b>'.$langs->trans("MiscellanousChecks")."</b>:<br>\n";
 
 
 // Check PHP version
-if (versioncompare(versionphp(),array(4,1)) < 0)
+if (versioncompare(versionphparray(),array(4,1)) < 0)
 {
     print '<img src="../theme/eldy/img/error.png" alt="Error"> '.$langs->trans("ErrorPHPVersionTooLow",'4.1');
     $checksok=0;
 }
 else
 {
-    print '<img src="../theme/eldy/img/tick.png" alt="Ok"> '.$langs->trans("PHPVersion")." ".versiontostring(versionphp());
+    print '<img src="../theme/eldy/img/tick.png" alt="Ok"> '.$langs->trans("PHPVersion")." ".versiontostring(versionphparray());
 }
 print ' (<a href="phpinfo.php" target="_info">'.$langs->trans("MoreInformation").'</a>)';
 print "<br>\n";
diff --git a/htdocs/install/etape2.php b/htdocs/install/etape2.php
index 183ae7a7f75a9a27dd102ad645187b485aea8def..39a47068a3963de0f334ce9a624e52ed0ba1b427 100644
--- a/htdocs/install/etape2.php
+++ b/htdocs/install/etape2.php
@@ -15,19 +15,18 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id$
  */
 
 /**
         \file       htdocs/install/etape2.php
         \brief      Cree les tables, cles primaires, cles etrangeres, index et fonctions en base puis charge les donnees de reference
-        \version    $Revision$
+        \version    $Id$
 */
 
 include("./inc.php");
-require_once($dolibarr_main_document_root . "/lib/databases/".$dolibarr_main_db_type.".lib.php");
-require_once($dolibarr_main_document_root . "/conf/conf.class.php");
+require_once($dolibarr_main_document_root."/lib/databases/".$dolibarr_main_db_type.".lib.php");
+require_once($dolibarr_main_document_root."/conf/conf.class.php");
+require_once($dolibarr_main_document_root."/lib/admin.lib.php");
 
 $etape = 2;
 $ok = 0;
diff --git a/htdocs/install/fileconf.php b/htdocs/install/fileconf.php
index cde27fd2f3645b0482f621269892495589baa2f8..c507029fc66ba745740f9b1b35ead5e524a57fd1 100644
--- a/htdocs/install/fileconf.php
+++ b/htdocs/install/fileconf.php
@@ -18,18 +18,17 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id$
  */
 
 /**
         \file       htdocs/install/fileconf.php
         \ingroup    install
         \brief      Demande les infos qui constituerons le contenu du fichier conf.php. Ce fichier sera remplie � l'�tape suivante
-        \version    $Revision$
+        \version    $Id$
 */
 
 include_once("./inc.php");
+require_once($dolibarr_main_document_root."/lib/admin.lib.php");
 
 $err=0;
 
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 63e87f53dfaddd7025c5eac710832be448f6aa05..c3a679c4b01a77660bab83a718901b02d100378a 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -21,6 +21,7 @@ GUISetup=Display
 SetupArea=Setup area
 SecuritySetup=Security setup
 ErrorModuleRequirePHPVersion=Error, this module requires PHP version %s or higher
+ErrorModuleRequireDolibarrVersion=Error, this module requires Dolibarr version %s or higher
 ErrorDecimalLargerThanAreForbidden=Error, precision higher than <b>%s</b> are not supported.
 DictionnarySetup=Dictionnary setup
 DisableJavascript=Disable JavaScript and Ajax functions
diff --git a/htdocs/langs/fr_BE/admin.lang b/htdocs/langs/fr_BE/admin.lang
index d2b0cc939b0c52c01b479f85adc0ca1b8b68c42e..4b1c6829c82160f41885cffa32a568550d4fb021 100644
--- a/htdocs/langs/fr_BE/admin.lang
+++ b/htdocs/langs/fr_BE/admin.lang
@@ -14,6 +14,7 @@ GUISetup=Affichage
 SetupArea=Zone de configuration
 SecuritySetup=Configuration de s�curit�
 ErrorModuleRequirePHPVersion=Erreur, ce module n�cessite PHP version %s ou sup�rieure
+ErrorModuleRequireDolibarrVersion=Erreur, ce module requiert une version %s ou sup�rieure de Dolibarr
 DictionnarySetup=Dictionnaires
 DisableJavascript=D�sactiver les fonctions JavaScript et Ajax
 UseSearchToSelectProduct=Utiliser un formulaire de recherche pour choisir un produit (plut�t que d'utiliser une liste d�roulante)
diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang
index cd5a37c607d091599ade00434b2b5e159970876f..8acedeac8ac6d5ed628f928eead625048818be00 100644
--- a/htdocs/langs/fr_FR/admin.lang
+++ b/htdocs/langs/fr_FR/admin.lang
@@ -21,6 +21,7 @@ GUISetup=Affichage
 SetupArea=Espace configuration
 SecuritySetup=Configuration de la s�curit�
 ErrorModuleRequirePHPVersion=Erreur, ce module requiert une version %s ou sup�rieure de PHP
+ErrorModuleRequireDolibarrVersion=Erreur, ce module requiert une version %s ou sup�rieure de Dolibarr
 ErrorDecimalLargerThanAreForbidden=Erreur, les pr�cisions sup�rieures � <b>%s</b> ne sont pas support�es.
 DictionnarySetup=Dictionnaires
 DisableJavascript=D�sactiver les fonctions Javascript et Ajax
diff --git a/htdocs/lib/admin.lib.php b/htdocs/lib/admin.lib.php
index b7da692d789471038a0a7617ffeb10119ab5cee6..ee640688ff0776bd8661907d104e2ee1f550e840 100644
--- a/htdocs/lib/admin.lib.php
+++ b/htdocs/lib/admin.lib.php
@@ -1,4 +1,84 @@
 <?php
+/* Copyright (C) 2008      Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2005-2007 Regis Houssin        <regis@dolibarr.fr>
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * or see http://www.gnu.org/
+ */
+
+/**
+   \file		htdocs/lib/admin.lib.php
+   \brief		Library of admin functions
+   \version		$Id$
+*/
+
+
+/**
+   \brief      Renvoi une version en chaine depuis une version en tableau
+   \param	   versionarray        Tableau de version (vermajeur,vermineur,autre)
+   \return     string              Chaine version
+*/
+function versiontostring($versionarray)
+{
+  $string='?';
+  if (isset($versionarray[0])) $string=$versionarray[0];
+  if (isset($versionarray[1])) $string.='.'.$versionarray[1];
+  if (isset($versionarray[2])) $string.='.'.$versionarray[2];
+  return $string;
+}
+
+/**
+   \brief      Compare 2 versions
+   \param      versionarray1       Tableau de version (vermajeur,vermineur,autre)
+   \param      versionarray2       Tableau de version (vermajeur,vermineur,autre)
+   \return     int                 <0 si versionarray1<versionarray2, 0 si =, >0 si versionarray1>versionarray2
+*/
+function versioncompare($versionarray1,$versionarray2)
+{
+    $ret=0;
+    $i=0;
+    while ($i < max(sizeof($versionarray1),sizeof($versionarray1)))
+    {
+        $operande1=isset($versionarray1[$i])?$versionarray1[$i]:0;
+        $operande2=isset($versionarray2[$i])?$versionarray2[$i]:0;
+        if ($operande1 < $operande2) { $ret = -1; break; }
+        if ($operande1 > $operande2) { $ret =  1; break; }
+        $i++;
+    }
+    return $ret;
+}
+
+
+/**
+   \brief      Return version PHP
+   \return     array               Tableau de version (vermajeur,vermineur,autre)
+*/
+function versionphparray()
+{
+  return split('\.',PHP_VERSION);
+}
+
+/**
+   \brief      Return version Dolibarr
+   \return     array               Tableau de version (vermajeur,vermineur,autre)
+*/
+function versiondolibarrarray()
+{
+  return split('\.',DOL_VERSION);
+}
+
 
 /**
 *	\brief		Launch a sql file
diff --git a/htdocs/lib/functions.inc.php b/htdocs/lib/functions.inc.php
index afdf8d89bc35297f45c75bb9729b2a68d2095812..9e10b81be859761e66ccc7bf9f21d7eeebf87c29 100644
--- a/htdocs/lib/functions.inc.php
+++ b/htdocs/lib/functions.inc.php
@@ -21,13 +21,12 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * or see http://www.gnu.org/
- *
- * $Id$
  */
 
 /**
-   \file       htdocs/lib/functions.inc.php
-   \brief      Ensemble de fonctions de base de dolibarr sous forme d'include
+   \file		htdocs/lib/functions.inc.php
+   \brief		Ensemble de fonctions de base de dolibarr sous forme d'include
+   \version		$Id$
 */
 
 // Pour compatibilit� lors de l'upgrade
@@ -39,51 +38,6 @@ if (! defined('DOL_DOCUMENT_ROOT'))
 include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
 
 
-/**
-   \brief      Renvoi une version en chaine depuis une version en tableau
-   \param	    versionarray        Tableau de version (vermajeur,vermineur,autre)
-   \return     string              Chaine version
-*/
-function versiontostring($versionarray)
-{
-  $string='?';
-  if (isset($versionarray[0])) $string=$versionarray[0];
-  if (isset($versionarray[1])) $string.='.'.$versionarray[1];
-  if (isset($versionarray[2])) $string.='.'.$versionarray[2];
-  return $string;
-}
-
-/**
-   \brief      Compare 2 versions
-   \param      versionarray1       Tableau de version (vermajeur,vermineur,autre)
-   \param      versionarray2       Tableau de version (vermajeur,vermineur,autre)
-   \return     int                 <0 si versionarray1<versionarray2, 0 si =, >0 si versionarray1>versionarray2
-*/
-function versioncompare($versionarray1,$versionarray2)
-{
-    $ret=0;
-    $i=0;
-    while ($i < max(sizeof($versionarray1),sizeof($versionarray1)))
-    {
-        $operande1=isset($versionarray1[$i])?$versionarray1[$i]:0;
-        $operande2=isset($versionarray2[$i])?$versionarray2[$i]:0;
-        if ($operande1 < $operande2) { $ret = -1; break; }
-        if ($operande1 > $operande2) { $ret =  1; break; }
-        $i++;
-    }
-    return $ret;
-}
-
-
-/**
-   \brief      Renvoie version PHP
-   \return     array               Tableau de version (vermajeur,vermineur,autre)
-*/
-function versionphp()
-{
-  return split('\.',PHP_VERSION);
-}
-
 
 /**
    \brief      Renvoi vrai si l'email est syntaxiquement valide