diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php
index 483d203455350d267b1cff218cc23a818bc85ef7..435c59d395d74acf91d490cabb478d9234c3a357 100644
--- a/htdocs/projet/class/project.class.php
+++ b/htdocs/projet/class/project.class.php
@@ -1,8 +1,8 @@
 <?php
 
 /* Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
- * Copyright (C) 2005-2012 Laurent Destailleur  <eldy@users.sourceforge.net>
- * Copyright (C) 2005-2012 Regis Houssin        <regis@dolibarr.fr>
+ * Copyright (C) 2005-2008 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2005-2010 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
@@ -39,8 +39,6 @@ class Project extends CommonObject
     var $description;
     var $statut;
     var $title;
-    var $date_c;
-    var $date_m;
     var $date_start;
     var $date_end;
     var $socid;
@@ -83,7 +81,7 @@ class Project extends CommonObject
         if (!trim($this->ref))
         {
             $this->error = 'ErrorFieldsRequired';
-            dol_syslog("Project::Create error -1 ref null", LOG_ERR);
+            dol_syslog(get_class($this)."::Create error -1 ref null", LOG_ERR);
             return -1;
         }
 
@@ -109,13 +107,13 @@ class Project extends CommonObject
         $sql.= ", " . $user->id;
         $sql.= ", 0";
         $sql.= ", " . ($this->public ? 1 : 0);
-        $sql.= ", " . ($this->datec != '' ? $this->db->idate($this->datec) : 'null');
-        $sql.= ", " . ($this->dateo != '' ? $this->db->idate($this->dateo) : 'null');
-        $sql.= ", " . ($this->datee != '' ? $this->db->idate($this->datee) : 'null');
+        $sql.= ", " . $this->db->idate(dol_now());
+        $sql.= ", " . ($this->date_start != '' ? $this->db->idate($this->date_start) : 'null');
+        $sql.= ", " . ($this->date_end != '' ? $this->db->idate($this->date_end) : 'null');
         $sql.= ", ".$conf->entity;
         $sql.= ")";
 
-        dol_syslog("Project::create sql=" . $sql, LOG_DEBUG);
+        dol_syslog(get_class($this)."::create sql=" . $sql, LOG_DEBUG);
         $resql = $this->db->query($sql);
         if ($resql)
         {
@@ -140,7 +138,7 @@ class Project extends CommonObject
         {
             $this->error = $this->db->lasterror();
             $this->errno = $this->db->lasterrno();
-            dol_syslog("Project::Create error -2 " . $this->error, LOG_ERR);
+            dol_syslog(get_class($this)."::Create error -2 " . $this->error, LOG_ERR);
             $error++;
         }
 
@@ -193,7 +191,7 @@ class Project extends CommonObject
             $sql.= ", datee=" . ($this->date_end != '' ? $this->db->idate($this->date_end) : 'null');
             $sql.= " WHERE rowid = " . $this->id;
 
-            dol_syslog("Project::Update sql=" . $sql, LOG_DEBUG);
+            dol_syslog(get_class($this)."::Update sql=" . $sql, LOG_DEBUG);
             if ($this->db->query($sql))
             {
                 if (!$notrigger)
@@ -215,13 +213,13 @@ class Project extends CommonObject
             else
             {
                 $this->error = $this->db->lasterror();
-                dol_syslog("Project::Update error -2 " . $this->error, LOG_ERR);
+                dol_syslog(get_class($this)."::Update error -2 " . $this->error, LOG_ERR);
                 $result = -2;
             }
         }
         else
         {
-            dol_syslog("Project::Update ref null");
+            dol_syslog(get_class($this)."::Update ref null");
             $result = -1;
         }
 
@@ -245,7 +243,7 @@ class Project extends CommonObject
         if ($ref) $sql.= " WHERE ref='" . $ref . "'";
         else $sql.= " WHERE rowid=" . $id;
 
-        dol_syslog("Project::fetch sql=" . $sql, LOG_DEBUG);
+        dol_syslog(get_class($this)."::fetch sql=" . $sql, LOG_DEBUG);
         $resql = $this->db->query($sql);
         if ($resql)
         {
@@ -284,7 +282,7 @@ class Project extends CommonObject
         else
         {
             $this->error = $this->db->lasterror();
-            dol_syslog("Project::fetch " . $this->error, LOG_ERR);
+            dol_syslog(get_class($this)."::fetch " . $this->error, LOG_ERR);
             return -1;
         }
     }
@@ -364,7 +362,7 @@ class Project extends CommonObject
         if (! $sql) return -1;
 
         //print $sql;
-        dol_syslog("Project::get_element_list sql=" . $sql);
+        dol_syslog(get_class($this)."::get_element_list sql=" . $sql);
         $result = $this->db->query($sql);
         if ($result)
         {
@@ -499,7 +497,7 @@ class Project extends CommonObject
             $sql.= " WHERE rowid = " . $this->id;
             $sql.= " AND entity = " . $conf->entity;
 
-            dol_syslog("Project::setValid sql=" . $sql);
+            dol_syslog(get_class($this)."::setValid sql=" . $sql);
             $resql = $this->db->query($sql);
             if ($resql)
             {
@@ -523,7 +521,7 @@ class Project extends CommonObject
                 {
                     $this->db->rollback();
                     $this->error = join(',', $this->errors);
-                    dol_syslog("Project::setValid " . $this->error, LOG_ERR);
+                    dol_syslog(get_class($this)."::setValid " . $this->error, LOG_ERR);
                     return -1;
                 }
             }
@@ -531,7 +529,7 @@ class Project extends CommonObject
             {
                 $this->db->rollback();
                 $this->error = $this->db->lasterror();
-                dol_syslog("Project::setValid " . $this->error, LOG_ERR);
+                dol_syslog(get_class($this)."::setValid " . $this->error, LOG_ERR);
                 return -1;
             }
         }
@@ -559,7 +557,7 @@ class Project extends CommonObject
             $sql.= " AND entity = " . $conf->entity;
             $sql.= " AND fk_statut = 1";
 
-            dol_syslog("Project::setClose sql=" . $sql);
+            dol_syslog(get_class($this)."::setClose sql=" . $sql);
             $resql = $this->db->query($sql);
             if ($resql)
             {
@@ -583,7 +581,7 @@ class Project extends CommonObject
                 {
                     $this->db->rollback();
                     $this->error = join(',', $this->errors);
-                    dol_syslog("Project::setClose " . $this->error, LOG_ERR);
+                    dol_syslog(get_class($this)."::setClose " . $this->error, LOG_ERR);
                     return -1;
                 }
             }
@@ -591,7 +589,7 @@ class Project extends CommonObject
             {
                 $this->db->rollback();
                 $this->error = $this->db->lasterror();
-                dol_syslog("Project::setClose " . $this->error, LOG_ERR);
+                dol_syslog(get_class($this)."::setClose " . $this->error, LOG_ERR);
                 return -1;
             }
         }
@@ -882,6 +880,359 @@ class Project extends CommonObject
 
         return $projects;
     }
+    
+     /**	Load an object from its id and create a new one in database
+	 *
+	 *	@param	int		$fromid     	Id of object to clone
+	 *	@param	bool	$clone_contact	clone contact of project
+	 *	@param	bool	$clone_ref		clone ref of project
+	 *	@param	bool	$clone_task		clone task of project
+	 *	@param	bool	$clone_file		clone file of project
+	 *	@param	bool	$clone_note		clone note of project
+	 * 	@return	int						New id of clone
+	 */
+	function createFromClone($fromid,$clone_contact=false,$clone_task=true,$clone_file=true,$clone_note=true)
+	{
+		global $user,$langs,$conf;
+
+		$error=0;
+		
+		$now = dol_mktime(0,0,0,idate('m',dol_now()),idate('d',dol_now()),idate('Y',dol_now()));
+
+		$clone_project=new Project($this->db);
+
+		$this->db->begin();
+
+		// Load source object
+		$clone_project->fetch($fromid);
+		
+		$orign_dt_start=$clone_project->date_start;
+	   
+		
+		$orign_project_ref=$clone_project->ref;
+		
+		$clone_project->id=0;
+        $clone_project->date_start = $now;
+        if (!(empty($clone_project->date_end)))
+        {
+        	//Calculate new project end date ragarding difference between original project start date and new start date (now)
+        	$datetime_start = new DateTime();
+    		$datetime_start->setTimestamp($orign_dt_start);
+			$datetime_now = new DateTime();
+			$datetime_now->setTimestamp($now);
+			$diff_dt = $datetime_start->diff($datetime_now);
+			
+        	$datetime_end = new DateTime();
+        	$datetime_end->setTimestamp($clone_project->date_end);
+        	$datetime_end->add($diff_dt);
+        	$clone_project->date_end = $datetime_end->getTimestamp();	
+        }
+        
+        $clone_project->datec = $now;
+
+        if (!$clone_note)
+        {
+        	    $clone_project->note_private='';
+    			$clone_project->note_public='';
+        }
+		
+		//Generate next ref
+		$defaultref='';
+    	$obj = empty($conf->global->PROJECT_ADDON)?'mod_project_simple':$conf->global->PROJECT_ADDON;
+    	if (! empty($conf->global->PROJECT_ADDON) && is_readable(DOL_DOCUMENT_ROOT ."/core/modules/project/".$conf->global->PROJECT_ADDON.".php"))
+    	{
+    		
+        	require_once(DOL_DOCUMENT_ROOT ."/core/modules/project/".$conf->global->PROJECT_ADDON.".php");
+        	$modProject = new $obj;
+        	$defaultref = $modProject->getNextValue($clone_project->societe->id,$clone_project);
+    	}
+		
+    	if (is_numeric($defaultref) && $defaultref <= 0) $defaultref='';
+    	
+		$clone_project->ref=$defaultref;
+
+		// Create clone
+		$result=$clone_project->create($user);
+
+		// Other options
+		if ($result < 0)
+		{
+			$this->error.=$clone_project->error;
+			$error++;
+		}
+
+		if (! $error)
+		{
+			$this->db->commit();
+			
+			//Get the new project id
+			$clone_project_id=$clone_project->id;
+			
+			//Note Update
+			if (!$clone_note)
+       		{
+        	    $clone_project->note_private='';
+    			$clone_project->note_public='';
+        	}
+        	else
+        	{
+        		$this->db->begin();
+				$res=$clone_project->update_note_public(dol_html_entity_decode($clone_project->note_public, ENT_QUOTES));
+				if ($res < 0)
+				{
+					$this->error.=$clone_project->error;
+					$error++;
+					$this->db->rollback();
+				}
+				else
+				{
+					$this->db->commit();
+				}
+				
+				$this->db->begin();
+				$res=$clone_project->update_note(dol_html_entity_decode($clone_project->note_private, ENT_QUOTES));
+				if ($res < 0)
+				{
+					$this->error.=$clone_project->error;
+					$error++;
+					$this->db->rollback();
+				}
+				else
+				{
+					$this->db->commit();
+				}
+        	}
+			
+			//Duplicate contact
+			if ($clone_contact)
+			{	
+				$origin_project = new Project($this->db);
+				$origin_project->fetch($fromid);
+				
+				foreach(array('internal','external') as $source)
+				{
+					$tab = $origin_project->liste_contact(-1,$source);
+					
+					foreach ($tab as $contacttoadd)
+					{
+						$clone_project->add_contact($contacttoadd['id'], $contacttoadd['code'], $contacttoadd['source']);
+						if ($clone_project->error == 'DB_ERROR_RECORD_ALREADY_EXISTS')
+						{
+							$langs->load("errors");
+							$this->error.=$langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType");
+							$error++;
+						}
+						else
+						{ 
+							if ($clone_project->error!='')
+							{
+								$this->error.=$clone_project->error;
+								$error++;
+							}
+						}
+					}
+				}
+			}
+			
+			//Duplicate file
+			if ($clone_file)
+			{	
+				require_once(DOL_DOCUMENT_ROOT."/core/lib/files.lib.php");
+				
+				$clone_project_dir = $conf->projet->dir_output . "/" . dol_sanitizeFileName($defaultref);
+				$ori_project_dir = $conf->projet->dir_output . "/" . dol_sanitizeFileName($orign_project_ref);
+				
+				if (dol_mkdir($clone_project_dir) >= 0)
+				{
+					$filearray=dol_dir_list($ori_project_dir,"files",0,'','\.meta$','',SORT_ASC,1);
+					foreach($filearray as $key => $file)
+					{
+						$rescopy = dol_copy($ori_project_dir . '/' . $file['name'], $clone_project_dir . '/' . $file['name'],0,1);
+						if (is_numeric($rescopy) && $rescopy < 0)
+						{
+							$this->error.=$langs->trans("ErrorFailToCopyFile",$ori_project_dir . '/' . $file['name'],$clone_project_dir . '/' . $file['name']);
+							$error++;
+						}
+					}
+				}
+				else
+				{
+					$this->error.=$langs->trans('ErrorInternalErrorDetected').':dol_mkdir';
+					$error++;
+				}
+			}
+			
+			//Duplicate task
+			if ($clone_task)
+			{	
+				$taskstatic = new Task($this->db);
+				
+				// Security check
+				$socid=0;
+				if ($user->societe_id > 0) $socid = $user->societe_id;
+				
+				$tasksarray=$taskstatic->getTasksArray(0, 0, $fromid, $socid, 0);
+			
+				//manage new parent clone task id
+				$tab_conv_child_parent=array();
+
+			    foreach ($tasksarray as $tasktoclone)
+			    {
+					$result_clone = $taskstatic->createFromClone($tasktoclone->id,$clone_project_id,$tasktoclone->fk_parent,true,true,false,true,true,false);
+					if ($result_clone <= 0)
+				    {
+				    	$this->error.=$result_clone->error;
+						$error++;
+				    }
+				    else
+				    {
+				    	$new_task_id=$result_clone;
+				    	$taskstatic->fetch($tasktoclone->id);
+				    	
+				    	//manage new parent clone task id
+				    	// if the current task has child we store the original task id and the equivalent clone task id
+						if (($taskstatic->hasChildren()) && !array_key_exists($tasktoclone->id,$tab_conv_child_parent))
+						{
+							$tab_conv_child_parent[$tasktoclone->id] =  $new_task_id;
+						}
+				    }
+					
+			    }
+			    
+			    //Parse all clone node to be sure to update new parent
+			    $tasksarray=$taskstatic->getTasksArray(0, 0, $clone_project_id, $socid, 0);	    
+			    foreach ($tasksarray as $task_cloned)
+			    {
+			    	$taskstatic->fetch($task_cloned->id);
+			    	if ($taskstatic->fk_task_parent!=0)
+			    	{
+			    		$taskstatic->fk_task_parent=$tab_conv_child_parent[$taskstatic->fk_task_parent];
+			    	}
+			    	$res=$taskstatic->update($user);
+			    	if ($result_clone <= 0)
+				    {
+				    	$this->error.=$taskstatic->error;
+						$error++;
+				    }
+			    }
+			}
+			
+			
+			
+			if (! $error)
+			{
+				return $clone_project_id;
+			}
+			else
+			{
+				dol_syslog(get_class($this)."::createFromClone nbError: ".$error." error : " . $this->error, LOG_ERR);
+				return -1;
+			}
+			
+		}
+		else
+		{
+			$this->db->rollback();
+			return -1;
+		}
+	}
+	
+	
+	 /**	Shift project task date from current date to delta
+	 *
+	 *	@param	timestamp		$old_project_dt_start	old project start date
+	 * 	@return	int					1 if OK or < 0 if KO
+	 */
+	function shiftTaskDate($old_project_dt_start)
+	{
+		global $user,$langs,$conf;
+
+		$error=0;
+		
+		$taskstatic = new Task($this->db);
+				
+		// Security check
+		$socid=0;
+		if ($user->societe_id > 0) $socid = $user->societe_id;
+		
+		//convert timestamp to datetime
+		$old_project_dt_st = new DateTime();
+		$old_project_dt_st->setTimestamp($old_project_dt_start);
+		$old_project_dt_st->setTime(0,0,0); //Use 00:00:00 as time to be sure to not have side
+		
+		$tasksarray=$taskstatic->getTasksArray(0, 0, $this->id, $socid, 0);
+
+	    foreach ($tasksarray as $tasktoshiftdate)
+	    {
+	    	$to_update=false;
+	    	// Fetch only if update of date will be made
+	    	if ((!empty($tasktoshiftdate->date_start)) || (!empty($tasktoshiftdate->date_end)))
+	    	{
+	    		//dol_syslog(get_class($this)."::shiftTaskDate to_update", LOG_DEBUG);
+	    		$to_update=true;
+		    	$task = new Task($this->db);
+		    	$result = $task->fetch($tasktoshiftdate->id);
+		    	if (!$result)
+		    	{
+		    		$error++;
+		    		$this->error.=$task->error;
+		    	}
+	    	}
+
+	    	//Calcultate new task start date with difference between old proj start date and origin task start date
+	    	if (!empty($tasktoshiftdate->date_start))
+	    	{	    		
+	    		dol_syslog(get_class($this)."::shiftTaskDate to_update", LOG_DEBUG);
+		    	$orign_task_datetime_start = new DateTime();
+	    		$orign_task_datetime_start->setTimestamp($tasktoshiftdate->date_start);
+	    		$orign_task_datetime_start->setTime(0,0,0); //Use 00:00:00 as time to be sure to not have side effect
+				$diff_dt_st = $old_project_dt_st->diff($orign_task_datetime_start);
+				
+				//Project new start date
+				$datetime_start = new DateTime();
+				$datetime_start->setTimestamp($this->date_start);
+				$datetime_start->setTime(0,0,0); //Use 00:00:00 as time to be sure to not have side
+				
+        		//New task start date
+				$datetime_start->add($diff_dt_st);
+				$task->date_start			= $datetime_start->getTimestamp();
+	    	}
+	    	
+	    	//Calcultate new task end date with difference between origin proj end date and origin task end date
+	    	if (!empty($tasktoshiftdate->date_end))
+	    	{
+        		$orign_task_datetime_end = new DateTime();
+	    		$orign_task_datetime_end->setTimestamp($tasktoshiftdate->date_end);
+	    		$orign_task_datetime_end->setTime(0,0,0); //Use 00:00:00 as hour to be sure to not have side effect
+	    		
+				$diff_dt_end = $old_project_dt_st->diff($orign_task_datetime_end);
+				
+				//Project new start date
+				$datetime_end = new DateTime();
+				$datetime_end->setTimestamp($this->date_start);
+				$datetime_end->setTime(0,0,0); //Use 00:00:00 as time to be sure to not have side
+				
+        		//New task start date
+				$datetime_end->add($diff_dt_end);
+				$task->date_end			= $datetime_end->getTimestamp();
+	    	}
+
+			if ($to_update)
+			{
+		    	$result = $task->update($user);
+		    	if (!$result)
+		    	{
+		    		$error++;
+		    		$this->error.=$task->error;
+		    	}
+			}
+	    }
+	    if ($error!=0)
+	    {
+	    	return -1;	
+	    }
+	    return $result;
+	} 
 
 }
 
diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php
index a2b9e337f26e583a8a0c6ab9b1069a067a33ef90..6aefb92ec6c8e75b74c452bc0be535a5a6dc6cfa 100644
--- a/htdocs/projet/class/task.class.php
+++ b/htdocs/projet/class/task.class.php
@@ -934,6 +934,244 @@ class Task extends CommonObject
             return 1;
         }
     }
+    
+     /**	Load an object from its id and create a new one in database
+	 *
+	 *	@param	int		$fromid     			Id of object to clone
+	 *  @param	int		$project_id				Id of project to attach clone task
+	 *  @param	int		$parent_task_id			Id of task to attach clone task
+	 *  @param	bool	$clone_change_dt		recalculate date of task regarding new project start date
+	 *	@param	bool	$clone_affectation		clone affectation of project
+	 *	@param	bool	$clone_task				clone task of project
+	 *	@param	bool	$clone_time				clone time of project
+	 *	@param	bool	$clone_file				clone file of project
+	 *  @param	bool	$clone_note				clone note of project
+	 *	@param	bool	$clone_prog				clone progress of project
+	 * 	@return	int								New id of clone
+	 */
+	function createFromClone($fromid,$project_id,$parent_task_id,$clone_change_dt=false,$clone_affectation=false,$clone_time=false,$clone_file=false,$clone_note=false,$clone_prog=false)
+	{
+		global $user,$langs,$conf;
+
+		$error=0;
+		
+		$now = dol_mktime(0,0,0,idate('m',mktime()),idate('d',mktime()),idate('Y',mktime()));
+
+		$clone_task=new Task($this->db);
+
+		$this->db->begin();
+
+		// Load source object
+		$clone_task->fetch($fromid);
+		
+		$ori_project_id					= $clone_task->fk_project;
+		
+		$clone_task->id					= 0;
+        $clone_task->fk_project			= $project_id;
+        $clone_task->fk_task_parent		= $parent_task_id;
+        $clone_task->date_c				= $now;
+        
+        //Manage Task Date
+        if ($clone_change_dt)
+        {
+        	$projectstatic=new Project($this->db);
+        	$projectstatic->fetch($ori_project_id);
+        	
+        	//Origin project strat date
+        	$orign_project_dt_start = new DateTime();
+	    	$orign_project_dt_start->setTimestamp($projectstatic->date_start);
+	    	
+	    	//Calcultate new task start date with difference between origin proj start date and origin task start date
+	    	if (!empty($clone_task->date_start))
+	    	{
+		    	$orign_task_datetime_start = new DateTime();
+	    		$orign_task_datetime_start->setTimestamp($clone_task->date_start);
+	    		$orign_task_datetime_start->setTime(0,0,0); //Use 00:00:00 as hour to be sure to not have side effect
+				$diff_dt_st = $orign_project_dt_start->diff($orign_task_datetime_start);
+				
+				//cloned project start date
+        		$datetime_start = new DateTime();
+        		$datetime_start->setTimestamp($now);
+        		
+        		//New task start date
+				$datetime_start->add($diff_dt_st);
+				$clone_task->date_start			= $datetime_start->getTimestamp();
+	    	}
+	    	
+	    	//Calcultate new task end date with difference between origin proj end date and origin task end date
+	    	if (!empty($clone_task->date_end))
+	    	{
+        		$orign_task_datetime_end = new DateTime();
+	    		$orign_task_datetime_end->setTimestamp($clone_task->date_end);
+	    		$orign_task_datetime_end->setTime(0,0,0); //Use 00:00:00 as hour to be sure to not have side effect
+				$diff_dt_end = $orign_project_dt_start->diff($orign_task_datetime_end);
+				
+				//cloned project start date
+        		$datetime_end = new DateTime();
+        		$datetime_end->setTimestamp($now);
+        		
+        		//New task start date
+				$datetime_end->add($diff_dt_end);
+				$clone_task->date_end			= $datetime_end->getTimestamp();
+	    	}
+	    	
+        }
+	
+		if (!$clone_prog)
+        {
+        	    $clone_task->progress=0;
+        }
+
+		// Create clone
+		$result=$clone_task->create($user);
+
+		// Other options
+		if ($result < 0)
+		{
+			$this->error=$clone_task->error;
+			$error++;
+		}
+
+		// End
+		if (! $error)
+		{
+			$this->db->commit();
+			
+			$clone_task_id=$clone_task->id;
+			     		
+       		//Note Update
+			if (!$clone_note)
+       		{
+        	    $clone_task->note_private='';
+    			$clone_task->note_public='';
+        	}
+        	else
+        	{
+        		$this->db->begin();
+				$res=$clone_task->update_note_public(dol_html_entity_decode($clone_task->note_public, ENT_QUOTES));
+				if ($res < 0)
+				{
+					$this->error.=$clone_task->error;
+					$error++;
+					$this->db->rollback();
+				}
+				else
+				{
+					$this->db->commit();
+				}
+				
+				$this->db->begin();
+				$res=$clone_task->update_note(dol_html_entity_decode($clone_task->note_private, ENT_QUOTES));
+				if ($res < 0)
+				{
+					$this->error.=$clone_task->error;
+					$error++;
+					$this->db->rollback();
+				}
+				else
+				{
+					$this->db->commit();
+				}
+        	}
+       		
+			//Duplicate file
+			if ($clone_file)
+			{	
+				require_once(DOL_DOCUMENT_ROOT."/core/lib/files.lib.php");
+				
+				//retreive project origin ref to know folder to copy
+				$projectstatic=new Project($this->db);
+	        	$projectstatic->fetch($ori_project_id);
+	        	$ori_project_ref=$projectstatic->ref;
+	        	
+	        	if ($ori_project_id!=$project_id)
+	        	{
+	        		$projectstatic->fetch($project_id);
+	        		$clone_project_ref=$projectstatic->ref;
+	        	} 
+	        	else
+	        	{
+	        		$clone_project_ref=$ori_project_ref;
+	        	}
+				
+				$clone_task_dir = $conf->projet->dir_output . "/" . dol_sanitizeFileName($clone_project_ref). "/" . dol_sanitizeFileName($clone_task_id);
+				$ori_task_dir = $conf->projet->dir_output . "/" . dol_sanitizeFileName($ori_project_ref). "/" . dol_sanitizeFileName($fromid);
+				
+				$filearray=dol_dir_list($ori_task_dir,"files",0,'','\.meta$','',SORT_ASC,1);
+				foreach($filearray as $key => $file)
+				{
+					if (!file_exists($clone_task_dir))
+					{
+						if (dol_mkdir($clone_task_dir) < 0)
+						{
+							$this->error.=$langs->trans('ErrorInternalErrorDetected').':dol_mkdir';
+							$error++;							
+						}
+					}
+					
+					$rescopy = dol_copy($ori_task_dir . '/' . $file['name'], $clone_task_dir . '/' . $file['name'],0,1);
+					if (is_numeric($rescopy) && $rescopy < 0)
+					{
+						$this->error.=$langs->trans("ErrorFailToCopyFile",$ori_task_dir . '/' . $file['name'],$clone_task_dir . '/' . $file['name']);
+						$error++;
+					}
+				}		
+			}
+			
+			// clone affectation
+			if ($clone_affectation)
+			{
+				$origin_task = new Task($this->db);
+				$origin_task->fetch($fromid);
+				
+				foreach(array('internal','external') as $source)
+				{
+					$tab = $origin_task->liste_contact(-1,$source);
+					$num=count($tab);
+					$i = 0;
+					while ($i < $num)
+					{
+						$clone_task->add_contact($tab[$i]['id'], $tab[$i]['code'], $tab[$i]['source']);
+						if ($clone_task->error == 'DB_ERROR_RECORD_ALREADY_EXISTS')
+						{
+							$langs->load("errors");
+							$this->error.=$langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType");
+							$error++;
+						}
+						else
+						{
+							if ($clone_task->error!='')
+							{
+								$this->error.=$clone_task->error;
+								$error++;
+							}
+						}
+						$i++;
+					}
+				}
+			}
+			
+			if($clone_time)
+			{
+				//TODO clone time of affectation
+			}
+			
+			if (! $error)
+			{
+				return $clone_task_id;
+			}
+			else
+			{
+				dol_syslog(get_class($this)."::createFromClone nbError: ".$error." error : " . $this->error, LOG_ERR);
+				return -1;
+			}
+		}
+		else
+		{
+			$this->db->rollback();
+			return -1;
+		}
+	}
 
 }
 ?>
diff --git a/htdocs/projet/fiche.php b/htdocs/projet/fiche.php
index 925f93e0465b1ac5a9bdbfb22afaa6ba3e5a615e..f84dca56cbe55dafa83fecd757bf75622a2c004b 100644
--- a/htdocs/projet/fiche.php
+++ b/htdocs/projet/fiche.php
@@ -34,7 +34,7 @@ $langs->load("projects");
 $langs->load('companies');
 
 $id=GETPOST('id','int');
-$ref = GETPOST('ref','alpha');
+$ref=GETPOST('ref','alpha');
 $action=GETPOST('action','alpha');
 $backtopage=GETPOST('backtopage','alpha');
 
@@ -58,10 +58,44 @@ $result = restrictedArea($user, 'projet', $id);
 // Cancel
 if (GETPOST("cancel") && ! empty($backtopage))
 {
+	if (GETPOST("comefromclone")==1)
+	{
+		$project = new Project($db);
+	    $project->fetch($id);
+	    $result=$project->delete($user);
+	    if ($result > 0)
+	    {
+	        Header("Location: index.php");
+	        exit;
+	    }
+	    else
+	    {
+	        dol_syslog($project->error,LOG_DEBUG);
+	        $mesg='<div class="error">'.$langs->trans("CantRemoveProject").'</div>';
+	    }
+	}
     header("Location: ".$backtopage);
     exit;
 }
 
+//if cancel and come from clone then delete the cloned project
+if (GETPOST("cancel") && (GETPOST("comefromclone")==1))
+{	
+	$project = new Project($db);
+    $project->fetch($id);
+    $result=$project->delete($user);
+    if ($result > 0)
+    {
+        Header("Location: index.php");
+        exit;
+    }
+    else
+    {
+        dol_syslog($project->error,LOG_DEBUG);
+        $mesg='<div class="error">'.$langs->trans("CantRemoveProject").'</div>';
+    }
+}
+
 if ($action == 'add' && $user->rights->projet->creer)
 {
     $error=0;
@@ -84,14 +118,14 @@ if ($action == 'add' && $user->rights->projet->creer)
 
         $project = new Project($db);
 
-        $project->ref             = $_POST["ref"];
-        $project->title           = $_POST["title"];
-        $project->socid           = $_POST["socid"];
-        $project->description     = $_POST["description"];
-        $project->public          = $_POST["public"];
+        $project->ref             = GETPOST('ref','alpha');
+        $project->title           = GETPOST('title','alpha');
+        $project->socid           = GETPOST('socid','int');
+        $project->description     = GETPOST('description','alpha');
+        $project->public          = GETPOST('public','alpha');
         $project->datec=dol_now();
-        $project->dateo=dol_mktime(12,0,0,$_POST['projectmonth'],$_POST['projectday'],$_POST['projectyear']);
-        $project->datee=dol_mktime(12,0,0,$_POST['projectendmonth'],$_POST['projectendday'],$_POST['projectendyear']);
+        $project->date_start=dol_mktime(12,0,0,GETPOST('projectmonth','int'),GETPOST('projectday','int'),GETPOST('projectyear','int'));
+        $project->date_end=dol_mktime(12,0,0,GETPOST('projectendmonth','int'),GETPOST('projectendday','int'),GETPOST('projectendyear','int'));
 
         $result = $project->create($user);
         if ($result > 0)
@@ -151,19 +185,31 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->projet->creer)
     if (! $error)
     {
         $project = new Project($db);
-        $project->fetch($_POST["id"]);
+        $project->fetch($id);
 
-        $project->ref          = $_POST["ref"];
-        $project->title        = $_POST["title"];
-        $project->socid        = $_POST["socid"];
-        $project->description  = $_POST["description"];
-        $project->public       = $_POST["public"];
-        $project->date_start   = empty($_POST["project"])?'':dol_mktime(12,0,0,$_POST['projectmonth'],$_POST['projectday'],$_POST['projectyear']);
-        $project->date_end     = empty($_POST["projectend"])?'':dol_mktime(12,0,0,$_POST['projectendmonth'],$_POST['projectendday'],$_POST['projectendyear']);
+		$old_start_date = $project->date_start;
+
+        $project->ref             = GETPOST('ref','alpha');
+        $project->title           = GETPOST('title','alpha');
+        $project->socid           = GETPOST('socid','int');
+        $project->description     = GETPOST('description','alpha');
+        $project->public          = GETPOST('public','alpha');
+        $project->date_start   = empty($_POST["project"])?'':dol_mktime(0,0,0,GETPOST('projectmonth'),GETPOST('projectday'),GETPOST('projectyear'));
+        $project->date_end     = empty($_POST["projectend"])?'':dol_mktime(0,0,0,GETPOST('projectendmonth'),GETPOST('projectendday'),GETPOST('projectendyear'));
 
         $result=$project->update($user);
 
         $id=$project->id;  // On retourne sur la fiche projet
+        
+        if (GETPOST("reportdate") && ($project->date_start!=$old_start_date))
+        {
+        	$result=$project->shiftTaskDate($old_start_date);
+        	if (!$result)
+        	{
+        		$error++;
+        		$mesg='<div class="error">'.$langs->trans("ErrorShiftTaskDate").':'.$project->error.'</div>';
+        	}
+        }
     }
     else
     {
@@ -251,6 +297,24 @@ if ($action == 'confirm_delete' && GETPOST("confirm") == "yes" && $user->rights-
     }
 }
 
+if ($action == 'confirm_clone' && $user->rights->projet->creer && GETPOST('confirm') == 'yes')
+{
+	$idtoclone=$id;
+	$project = new Project($db);
+    $project->fetch($idtoclone);
+    $result=$project->createFromClone($idtoclone,true,true,true,true);
+    if ($result <= 0)
+    {
+        $mesg='<div class="error">'.$project->error.'</div>';
+    }
+    else
+    {
+    	$id=$result;
+    	$action='edit';
+    	$comefromclone=true;
+    }
+}
+
 
 /*
  *	View
@@ -395,14 +459,20 @@ else
         $ret=$form->form_confirm($_SERVER["PHP_SELF"]."?id=".$project->id,$langs->trans("DeleteAProject"),$text,"confirm_delete",'','',1);
         if ($ret == 'html') print '<br>';
     }
-
-
+    // Clone confirmation
+    if ($action == 'clone')
+    {
+        $ret=$form->form_confirm($_SERVER["PHP_SELF"]."?id=".$project->id,$langs->trans("CloneProject"),$langs->trans("ConfirmCloneProject"),"confirm_clone",'','',1);
+        if ($ret == 'html') print '<br>';
+    }
+    
     if ($action == 'edit' && $userWrite > 0)
     {
         print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
         print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
         print '<input type="hidden" name="action" value="update">';
         print '<input type="hidden" name="id" value="'.$project->id.'">';
+        print '<input type="hidden" name="comefromclone" value="'.$comefromclone.'">';
 
         print '<table class="border" width="100%">';
 
@@ -433,6 +503,9 @@ else
         // Date start
         print '<tr><td>'.$langs->trans("DateStart").'</td><td>';
         print $form->select_date($project->date_start,'project');
+        print '<input type="checkbox" name="reportdate" value="yes" ';
+        if ($comefromclone){print ' checked="checked" ';} 
+		print '/>'. $langs->trans("ProjectReportDate");
         print '</td></tr>';
 
         // Date end
@@ -450,8 +523,8 @@ else
 
         print '<div align="center"><br>';
         print '<input name="update" class="button" type="submit" value="'.$langs->trans("Modify").'"> &nbsp; ';
-        print '<input type="submit" class="button" name="cancel" Value="'.$langs->trans("Cancel").'"></div>';
-
+        print '<input type="submit" class="button" name="cancel" value="'.$langs->trans("Cancel").'"></div>';
+        
         print '</form>';
     }
     else
@@ -514,7 +587,7 @@ else
 
     if ($action != "edit" )
     {
-        // Validate
+    	// Validate
         if ($project->statut == 0 && $user->rights->projet->creer)
         {
             if ($userWrite > 0)
@@ -565,6 +638,19 @@ else
                 print '<a class="butActionRefused" href="#" title="'.$langs->trans("NotOwnerOfProject").'">'.$langs->trans('ReOpen').'</a>';
             }
         }
+        
+        // Clone
+        if ($user->rights->projet->creer)
+        {
+            if ($userWrite > 0)
+            {
+                print '<a class="butAction" href="fiche.php?id='.$project->id.'&action=clone">'.$langs->trans('ToClone').'</a>';
+            }
+            else
+            {
+                print '<a class="butActionRefused" href="#" title="'.$langs->trans("NotOwnerOfProject").'">'.$langs->trans('ToClone').'</a>';
+            }
+        }
 
         // Delete
         if ($user->rights->projet->supprimer)
@@ -611,7 +697,6 @@ else
 
         print '</td></tr></table>';
     }
-
 }
 
 llxFooter();
diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php
index 6c4ccb733fa8c4b5e3cbe9d2d15126676e336a0b..a65ff6b10b63be7fe778da5728f4733ffb379498 100644
--- a/htdocs/projet/tasks.php
+++ b/htdocs/projet/tasks.php
@@ -65,8 +65,8 @@ if ($action == 'createtask' && $user->rights->projet->creer)
 {
 	$error=0;
 
-	$date_start = dol_mktime(12,0,0,$_POST['dateomonth'],$_POST['dateoday'],$_POST['dateoyear']);
-    $date_end = dol_mktime(12,0,0,$_POST['dateemonth'],$_POST['dateeday'],$_POST['dateeyear']);
+	$date_start = dol_mktime(0,0,0,$_POST['dateomonth'],$_POST['dateoday'],$_POST['dateoyear']);
+    $date_end = dol_mktime(0,0,0,$_POST['dateemonth'],$_POST['dateeday'],$_POST['dateeyear']);
 
 	if (empty($_POST["cancel"]))
 	{
@@ -198,6 +198,16 @@ if ($id > 0 || ! empty($ref))
     print '<tr><td>'.$langs->trans("Visibility").'</td><td>';
     if ($object->public) print $langs->trans('SharedProject');
     else print $langs->trans('PrivateProject');
+    print '</td></tr>';
+
+ 	// Date start
+    print '<tr><td>'.$langs->trans("DateStart").'</td><td>';
+    print dol_print_date($object->date_start,'day'); 
+    print '</td></tr>';
+
+    // Date end
+    print '<tr><td>'.$langs->trans("DateEnd").'</td><td>';
+    print dol_print_date($object->date_end,'day');
     print '</td></tr>';
 
     // Statut
diff --git a/htdocs/projet/tasks/document.php b/htdocs/projet/tasks/document.php
index 65a758ee137864ba694e6844f6ce8e1eba5ce68c..26f8d5744809fef4e0d95b327500b67d6e1c44c3 100644
--- a/htdocs/projet/tasks/document.php
+++ b/htdocs/projet/tasks/document.php
@@ -1,7 +1,7 @@
 <?php
 /* Copyright (C) 2010-2012 Regis Houssin <regis@dolibarr.fr>
  * Copyright (C) 2006-2012 Laurent Destailleur  <eldy@users.sourceforge.net>
- * Copyright (C) 2012      Florian Henry
+ * Copyright (C) 2012      Florian Henry <florian.henry@open-concept.pro>
  *
  * 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
@@ -60,13 +60,9 @@ $pagenext = $page + 1;
 if (! $sortorder) $sortorder="ASC";
 if (! $sortfield) $sortfield="name";
 
-
 $object = new Task($db);
 $projectstatic = new Project($db);
 
-
-
-
 /*
  * Actions
  */
@@ -287,4 +283,4 @@ else
 llxFooter();
 
 $db->close();
-?>
\ No newline at end of file
+?>
diff --git a/htdocs/projet/tasks/note.php b/htdocs/projet/tasks/note.php
index 11cf96ca9c77999a683a7bde3d763a9bf1be2f8d..9108952c2c36087f921254562b6c3ab3d08668e4 100644
--- a/htdocs/projet/tasks/note.php
+++ b/htdocs/projet/tasks/note.php
@@ -46,17 +46,17 @@ if (!$user->rights->projet->lire) accessforbidden();
 $object = new Task($db);
 $projectstatic = new Project($db);
 
-if ($id > 0 || ! empty($ref))
-{
-	if ($object->fetch($id,$ref) > 0)
-	{
+if ($id > 0 || ! empty($ref))
+{
+	if ($object->fetch($id,$ref) > 0)
+	{
 		$projectstatic->fetch($object->fk_project);
-		if (! empty($projectstatic->socid)) $projectstatic->societe->fetch($projectstatic->socid);
-	}
-	else
-	{
-		dol_print_error($db);
-	}
+		if (! empty($projectstatic->socid)) $projectstatic->societe->fetch($projectstatic->socid);
+	}
+	else
+	{
+		dol_print_error($db);
+	}
 }