diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php
index 8b0500b08e784e4d5201f536869287315cd9d3d6..4dab284730b636f55e56e0e033471f47df69430b 100644
--- a/htdocs/comm/propal.php
+++ b/htdocs/comm/propal.php
@@ -107,7 +107,7 @@ if ($action == 'confirm_clone' && $confirm == 'yes')
 	{
 		if ($object->fetch($id) > 0)
 		{
-			$result=$object->createFromClone(GETPOST('socid'),$hookmanager);
+			$result=$object->createFromClone($socid, $hookmanager);
 			if ($result > 0)
 			{
 				header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index 2e663f1fe4d56edfaee7950a83ca657a9f37c953..dcc92d7d0eafbc01130a278c8c22cff95801d8ee 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -769,62 +769,51 @@ class Commande extends CommonObject
     /**
      *		Load an object from its id and create a new one in database
      *
-     *		@param      int			$fromid     	Id of object to clone
-     *		@param		int			$invertdetail	Reverse sign of amounts for lines
      *		@param		int			$socid			Id of thirdparty
      *		@param		HookManager	$hookmanager	Hook manager instance
      * 	 	@return		int							New id of clone
      */
-    function createFromClone($fromid,$invertdetail=0,$socid=0,$hookmanager=false)
+    function createFromClone($socid=0,$hookmanager=false)
     {
         global $conf,$user,$langs;
 
         $error=0;
 
-        $object=new Commande($this->db);
-
         $this->db->begin();
 
         // Load source object
-        $object->fetch($fromid);
-        $objFrom = $object;
+        $objFrom = dol_clone($this);
 
         // Change socid if needed
-        if (! empty($socid) && $socid != $object->socid)
+        if (! empty($socid) && $socid != $this->socid)
         {
             $objsoc = new Societe($this->db);
 
             if ($objsoc->fetch($socid)>0)
             {
-                $object->socid 					= $objsoc->id;
-                $object->cond_reglement_id		= (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
-                $object->mode_reglement_id		= (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
-                $object->fk_project				= '';
-                $object->fk_delivery_address	= '';
+                $this->socid 				= $objsoc->id;
+                $this->cond_reglement_id	= (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
+                $this->mode_reglement_id	= (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
+                $this->fk_project			= '';
+                $this->fk_delivery_address	= '';
             }
 
             // TODO Change product price if multi-prices
         }
 
-        $object->id=0;
-        $object->statut=0;
+        $this->id=0;
+        $this->statut=0;
 
         // Clear fields
-        $object->user_author_id     = $user->id;
-        $object->user_valid         = '';
-        $object->date_creation      = '';
-        $object->date_validation    = '';
-        $object->ref_client         = '';
+        $this->user_author_id     = $user->id;
+        $this->user_valid         = '';
+        $this->date_creation      = '';
+        $this->date_validation    = '';
+        $this->ref_client         = '';
 
         // Create clone
-        $result=$object->create($user);
-
-        // Other options
-        if ($result < 0)
-        {
-            $this->error=$object->error;
-            $error++;
-        }
+        $result=$this->create($user);
+        if ($result < 0) $error++;
 
         if (! $error)
         {
@@ -833,14 +822,14 @@ class Commande extends CommonObject
             {
                 $parameters=array('objFrom'=>$objFrom);
                 $action='';
-                $reshook=$hookmanager->executeHooks('createfrom',$parameters,$object,$action);    // Note that $action and $object may have been modified by some hooks
+                $reshook=$hookmanager->executeHooks('createfrom',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
                 if ($reshook < 0) $error++;
             }
 
             // Appel des triggers
             include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
             $interface=new Interfaces($this->db);
-            $result=$interface->run_triggers('ORDER_CLONE',$object,$user,$langs,$conf);
+            $result=$interface->run_triggers('ORDER_CLONE',$this,$user,$langs,$conf);
             if ($result < 0) { $error++; $this->errors=$interface->errors; }
             // Fin appel triggers
         }
@@ -849,7 +838,7 @@ class Commande extends CommonObject
         if (! $error)
         {
             $this->db->commit();
-            return $object->id;
+            return $this->id;
         }
         else
         {
diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php
index ffe5b39e31a790da8b257134a65ffbcbfd91a7fa..9a7cc4a397e8b1ca774393f0d5eba3403788feb8 100644
--- a/htdocs/commande/fiche.php
+++ b/htdocs/commande/fiche.php
@@ -79,23 +79,26 @@ $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action);
 // Action clone object
 if ($action == 'confirm_clone' && $confirm == 'yes')
 {
-    if ( 1==0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers') )
+    if (1==0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers'))
     {
         $mesg='<div class="error">'.$langs->trans("NoCloneOptionsSpecified").'</div>';
     }
     else
     {
-        $result=$object->createFromClone($id, 0, GETPOST('socid'), $hookmanager);
-        if ($result > 0)
-        {
-            header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
-            exit;
-        }
-        else
-        {
-            $mesg='<div class="error">'.$object->error.'</div>';
-            $action='';
-        }
+    	if ($object->fetch($id) > 0)
+    	{
+    		$result=$object->createFromClone($socid, $hookmanager);
+    		if ($result > 0)
+    		{
+    			header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
+    			exit;
+    		}
+    		else
+    		{
+    			$mesg='<div class="error">'.$object->error.'</div>';
+    			$action='';
+    		}
+    	}
     }
 }
 
diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php
index 82e2c659f15ac334f122cb99baabd5662ca2b49d..0f34e84e4342640196c1cf25793c6815244ae901 100644
--- a/htdocs/compta/facture.php
+++ b/htdocs/compta/facture.php
@@ -98,17 +98,20 @@ if ($action == 'confirm_clone' && $confirm == 'yes')
     }
     else
     {
-        $result=$object->createFromClone($id,0,$hookmanager);
-        if ($result > 0)
-        {
-            header("Location: ".$_SERVER['PHP_SELF'].'?facid='.$result);
-            exit;
-        }
-        else
-        {
-            $mesg=$object->error;
-            $action='';
-        }
+    	if ($object->fetch($id) > 0)
+    	{
+    		$result=$object->createFromClone($socid, $hookmanager);
+    		if ($result > 0)
+    		{
+    			header("Location: ".$_SERVER['PHP_SELF'].'?facid='.$result);
+    			exit;
+    		}
+    		else
+    		{
+    			$mesg=$object->error;
+    			$action='';
+    		}
+    	}
     }
 }
 
diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php
index 6b8715bd1a129cf2d6567f2d4df3abae0b7c80d6..cbe54bf29fd957eefafae9a94f665498af10f839 100644
--- a/htdocs/compta/facture/class/facture.class.php
+++ b/htdocs/compta/facture/class/facture.class.php
@@ -490,60 +490,65 @@ class Facture extends CommonObject
     /**
      *		Load an object from its id and create a new one in database
      *
-     *		@param      int				$fromid     	Id of object to clone
-     *		@param		int				$invertdetail	Reverse sign of amounts for lines
+     *		@param		int				$socid			Id of thirdparty
 	 *		@param		HookManager		$hookmanager	Hook manager instance
      * 	 	@return		int								New id of clone
      */
-    function createFromClone($fromid,$invertdetail=0,$hookmanager=false)
+    function createFromClone($socid=0,$hookmanager=false)
     {
         global $conf,$user,$langs;
 
         $error=0;
+        
+        $this->db->begin();
 
         // Load source object
-        $objFrom=new Facture($this->db);
-        $objFrom->fetch($fromid);
-
-        // Load new object
-        $object=new Facture($this->db);
-        $object->fetch($fromid);
-
-        $this->db->begin();
+        $objFrom = dol_clone($this);
+        
+        // Change socid if needed
+        if (! empty($socid) && $socid != $this->socid)
+        {
+        	$objsoc = new Societe($this->db);
+        
+        	if ($objsoc->fetch($socid)>0)
+        	{
+        		$this->socid 				= $objsoc->id;
+        		$this->cond_reglement_id	= (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
+        		$this->mode_reglement_id	= (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
+        		$this->fk_project			= '';
+        		$this->fk_delivery_address	= '';
+        	}
+        
+        	// TODO Change product price if multi-prices
+        }
 
-        $object->id=0;
-        $object->statut=0;
+        $this->id=0;
+        $this->statut=0;
 
         // Clear fields
-        $object->user_author        = $user->id;
-        $object->user_valid         = '';
-        $object->fk_facture_source  = 0;
-        $object->date_creation      = '';
-        $object->date_validation    = '';
-        $object->ref_client         = '';
-        $object->close_code         = '';
-        $object->close_note         = '';
-        $object->products = $object->lines;	// Tant que products encore utilise
+        $this->user_author        = $user->id;
+        $this->user_valid         = '';
+        $this->fk_facture_source  = 0;
+        $this->date_creation      = '';
+        $this->date_validation    = '';
+        $this->ref_client         = '';
+        $this->close_code         = '';
+        $this->close_note         = '';
+        $this->products = $this->lines;	// Tant que products encore utilise
 
         // Loop on each line of new invoice
-        foreach($object->lines as $i => $line)
+        foreach($this->lines as $i => $line)
         {
-            if (($object->lines[$i]->info_bits & 0x02) == 0x02)	// We do not clone line of discounts
+            if (($this->lines[$i]->info_bits & 0x02) == 0x02)	// We do not clone line of discounts
             {
-                unset($object->lines[$i]);
-                unset($object->products[$i]);	// Tant que products encore utilise
+                unset($this->lines[$i]);
+                unset($this->products[$i]);	// Tant que products encore utilise
             }
         }
 
         // Create clone
-        $result=$object->create($user);
-
-        // Other options
-        if ($result < 0)
-        {
-            $this->error=$object->error;
-            $error++;
-        }
+        $result=$this->create($user);
+        if ($result < 0) $error++;
 
         if (! $error)
         {
@@ -552,14 +557,14 @@ class Facture extends CommonObject
 			{
 			    $parameters=array('objFrom'=>$objFrom);
 			    $action='';
-				$reshook=$hookmanager->executeHooks('createfrom',$parameters,$object,$action);    // Note that $action and $object may have been modified by some hooks
+				$reshook=$hookmanager->executeHooks('createfrom',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
 				if ($reshook < 0) $error++;
 			}
 
             // Appel des triggers
             include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
             $interface=new Interfaces($this->db);
-            $result=$interface->run_triggers('BILL_CLONE',$object,$user,$langs,$conf);
+            $result=$interface->run_triggers('BILL_CLONE',$this,$user,$langs,$conf);
             if ($result < 0) { $error++; $this->errors=$interface->errors; }
             // Fin appel triggers
         }
@@ -568,7 +573,7 @@ class Facture extends CommonObject
         if (! $error)
         {
             $this->db->commit();
-            return $object->id;
+            return $this->id;
         }
         else
         {