diff --git a/htdocs/resource/class/dolresource.class.php b/htdocs/resource/class/dolresource.class.php
index 6e418e2e649c3afc6624250df5c0b22c9aa6aa5b..1b1f4f7fd0b7b48a7b5c1e13f3dc3d7a7464fda6 100644
--- a/htdocs/resource/class/dolresource.class.php
+++ b/htdocs/resource/class/dolresource.class.php
@@ -43,6 +43,8 @@ class Dolresource extends CommonObject
 	var $type_label;
 	var $tms='';
 
+	var $oldcopy;
+
     /**
      *  Constructor
      *
@@ -230,85 +232,108 @@ class Dolresource extends CommonObject
      *  @param  int		$notrigger	 0=launch triggers after, 1=disable triggers
      *  @return int     		   	 <0 if KO, >0 if OK
      */
-    function update($user=null, $notrigger=0)
-    {
-    	global $conf, $langs, $hookmanager;
-    	$error=0;
+	function update($user=null, $notrigger=0)
+	{
+		global $conf, $langs, $hookmanager;
+		$error=0;
 
-    	// Clean parameters
-    	if (isset($this->ref)) $this->ref=trim($this->ref);
-    	if (isset($this->fk_code_type_resource)) $this->fk_code_type_resource=trim($this->fk_code_type_resource);
-    	if (isset($this->description)) $this->description=trim($this->description);
+		// Clean parameters
+		if (isset($this->ref)) $this->ref=trim($this->ref);
+		if (isset($this->fk_code_type_resource)) $this->fk_code_type_resource=trim($this->fk_code_type_resource);
+		if (isset($this->description)) $this->description=trim($this->description);
 
-    	// Update request
-    	$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET";
-    	$sql.= " ref=".(isset($this->ref)?"'".$this->db->escape($this->ref)."'":"null").",";
-    	$sql.= " description=".(isset($this->description)?"'".$this->db->escape($this->description)."'":"null").",";
-    	$sql.= " fk_code_type_resource=".(isset($this->fk_code_type_resource)?"'".$this->db->escape($this->fk_code_type_resource)."'":"null").",";
-    	$sql.= " tms=".(dol_strlen($this->tms)!=0 ? "'".$this->db->idate($this->tms)."'" : 'null')."";
-    	$sql.= " WHERE rowid=".$this->id;
+		if (empty($this->oldcopy))
+		{
+			$org=new self($this->db);
+			$org->fetch($this->id);
+			$this->oldcopy=$org;
+		}
 
-    	$this->db->begin();
+		// Update request
+		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET";
+		$sql.= " ref=".(isset($this->ref)?"'".$this->db->escape($this->ref)."'":"null").",";
+		$sql.= " description=".(isset($this->description)?"'".$this->db->escape($this->description)."'":"null").",";
+		$sql.= " fk_code_type_resource=".(isset($this->fk_code_type_resource)?"'".$this->db->escape($this->fk_code_type_resource)."'":"null").",";
+		$sql.= " tms=".(dol_strlen($this->tms)!=0 ? "'".$this->db->idate($this->tms)."'" : 'null')."";
+		$sql.= " WHERE rowid=".$this->id;
 
-    	dol_syslog(get_class($this)."::update", LOG_DEBUG);
-    	$resql = $this->db->query($sql);
-    	if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
+		$this->db->begin();
 
-    	if (! $error)
-    	{
-    		if (! $notrigger)
-    		{
-    			// Uncomment this and change MYOBJECT to your own tag if you
-    			// want this action calls a trigger.
+		dol_syslog(get_class($this)."::update", LOG_DEBUG);
+		$resql = $this->db->query($sql);
+		if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
 
-    			//// Call triggers
-    			include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
-    			$interface=new Interfaces($this->db);
-    			$result=$interface->run_triggers('RESOURCE_MODIFY',$this,$user,$langs,$conf);
-    			if ($result < 0) { $error++; $this->errors=$interface->errors; }
-    			//// End call triggers
-    		}
-    	}
-    	if (! $error)
-    	{
-	    	$action='update';
-
-	    	// Actions on extra fields (by external module or standard code)
-	    	// TODO le hook fait double emploi avec le trigger !!
-	    	$hookmanager->initHooks(array('actioncommdao'));
-	    	$parameters=array('actcomm'=>$this->id);
-	    	$reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
-	    	if (empty($reshook))
-	    	{
-	    		if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used
-	    		{
-	    			$result=$this->insertExtraFields();
-	    			if ($result < 0)
-	    			{
-	    				$error++;
-	    			}
-	    		}
-	    	}
-	    	else if ($reshook < 0) $error++;
-    	}
+		if (! $error)
+		{
+			if (! $notrigger)
+			{
+				// Call trigger
+				$result=$this->call_trigger('RESOURCE_MODIFY',$user);
+				if ($result < 0) $error++;
+				// End call triggers
+			}
+		}
 
-    	// Commit or rollback
-    	if ($error)
-    	{
-    		foreach($this->errors as $errmsg)
-    		{
-    			dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR);
-    			$this->error.=($this->error?', '.$errmsg:$errmsg);
-    		}
-    		$this->db->rollback();
-    		return -1*$error;
-    	}
-    	else
-    	{
-    		$this->db->commit();
-    		return 1;
-    	}
-    }
+		if (! $error && (is_object($this->oldcopy) && $this->oldcopy->ref !== $this->ref))
+		{
+			// We remove directory
+			if (! empty($conf->resource->dir_output))
+			{
+				$olddir = $conf->resource->dir_output . "/" . dol_sanitizeFileName($this->oldcopy->ref);
+				$newdir = $conf->resource->dir_output . "/" . dol_sanitizeFileName($this->ref);
+				if (file_exists($olddir))
+				{
+					$res = @rename($olddir, $newdir);
+					if (! $res)
+					{
+						$langs->load("errors");
+						$this->error=$langs->trans('ErrorFailToRenameDir',$olddir,$newdir);
+						$error++;
+					}
+				}
+			}
+		}
+
+		if (! $error)
+		{
+			$action='update';
+
+			// Actions on extra fields (by external module or standard code)
+			// TODO le hook fait double emploi avec le trigger !!
+			$hookmanager->initHooks(array('actioncommdao'));
+			$parameters=array('actcomm'=>$this->id);
+			$reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
+			if (empty($reshook))
+			{
+				if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used
+				{
+					$result=$this->insertExtraFields();
+					if ($result < 0)
+					{
+						$error++;
+					}
+				}
+			}
+			else if ($reshook < 0) $error++;
+		}
+
+		// Commit or rollback
+		if ($error)
+		{
+			foreach($this->errors as $errmsg)
+			{
+				dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR);
+				$this->error.=($this->error?', '.$errmsg:$errmsg);
+			}
+			$this->db->rollback();
+			return -1*$error;
+		}
+		else
+		{
+			$this->db->commit();
+			return 1;
+		}
+	}
 
     /**
      *    Load object in memory from database
@@ -375,65 +400,84 @@ class Dolresource extends CommonObject
      *    @param	int		$notrigger		Disable all triggers
      *    @return   int						>0 if OK, <0 if KO
      */
-    function delete($rowid, $notrigger=0)
-    {
-        global $user,$langs,$conf;
+	function delete($rowid, $notrigger=0)
+	{
+		global $user,$langs,$conf;
 
-        $error=0;
+		$error=0;
 
-        $this->db->begin();
+		$this->db->begin();
 
-        $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element;
-        $sql.= " WHERE rowid =".$rowid;
+		$sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element;
+		$sql.= " WHERE rowid =".$rowid;
 
-        dol_syslog(get_class($this), LOG_DEBUG);
-        if ($this->db->query($sql))
-        {
-            $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_resources";
-            $sql.= " WHERE element_type='resource' AND resource_id =".$this->db->escape($rowid);
-            dol_syslog(get_class($this)."::delete", LOG_DEBUG);
-            $resql=$this->db->query($sql);
-            if (!$resql)
-            {
-            	$this->error=$this->db->lasterror();
-            	$error++;
-            }
-        }
-        else
-        {
-            $this->error=$this->db->lasterror();
-            $error++;
-        }
+		dol_syslog(get_class($this), LOG_DEBUG);
+		if ($this->db->query($sql))
+		{
+			$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_resources";
+			$sql.= " WHERE element_type='resource' AND resource_id =".$this->db->escape($rowid);
+			dol_syslog(get_class($this)."::delete", LOG_DEBUG);
+			$resql=$this->db->query($sql);
+			if (!$resql)
+			{
+				$this->error=$this->db->lasterror();
+				$error++;
+			}
+		}
+		else
+		{
+			$this->error=$this->db->lasterror();
+			$error++;
+		}
 
-        // Removed extrafields
-        if (! $error) {
-        	$result=$this->deleteExtraFields();
-        	if ($result < 0)
-        	{
-        		$error++;
-        		dol_syslog(get_class($this)."::delete error -3 ".$this->error, LOG_ERR);
-        	}
-        }
+		// Removed extrafields
+		if (! $error) {
+			$result=$this->deleteExtraFields();
+			if ($result < 0)
+			{
+				$error++;
+				dol_syslog(get_class($this)."::delete error -3 ".$this->error, LOG_ERR);
+			}
+		}
 
-        if (! $notrigger)
-        {
-        	// Call trigger
-        	$result=$this->call_trigger('RESOURCE_DELETE',$user);
-        	if ($result < 0) $error++;
-        	// End call triggers
-        }
+		if (! $notrigger)
+		{
+			// Call trigger
+			$result=$this->call_trigger('RESOURCE_DELETE',$user);
+			if ($result < 0) $error++;
+			// End call triggers
+		}
 
-        if (! $error)
-        {
-        	$this->db->commit();
-        	return 1;
-        }
-        else
-        {
-        	$this->db->rollback();
-        	return -1;
-        }
-    }
+		if (! $error)
+		{
+			// We remove directory
+			$ref = dol_sanitizeFileName($this->ref);
+			if (! empty($conf->resource->dir_output))
+			{
+				$dir = $conf->resource->dir_output . "/" . dol_sanitizeFileName($this->ref);
+				if (file_exists($dir))
+				{
+					$res=@dol_delete_dir_recursive($dir);
+					if (! $res)
+					{
+						$this->errors[] = 'ErrorFailToDeleteDir';
+						$error++;
+					}
+				}
+			}
+		}
+
+		if (! $error)
+		{
+			$this->db->commit();
+			return 1;
+		}
+		else
+		{
+			$this->db->rollback();
+			return -1;
+		}
+	}
 
     /**
      *	Load resource objects into $this->lines