diff --git a/htdocs/cron/card.php b/htdocs/cron/card.php
index 60513588ef8fb41862a3f0288a14711c68727525..b61ffb8da7fa000cd32729a739dc2728c7c36b56 100644
--- a/htdocs/cron/card.php
+++ b/htdocs/cron/card.php
@@ -317,7 +317,7 @@ if (($action=="create") || ($action=="edit"))
 	print "</tr>\n";
 
 	print "<tr><td>";
-	print $langs->trans('CronHourStart')."</td><td>";
+	print $langs->trans('CronDtStart')."</td><td>";
 	if(!empty($object->datestart))
 	{
 		$form->select_date($object->datestart,'datestart',1,1,'',"cronform");
@@ -518,15 +518,22 @@ else
 	print "</td></tr>";
 
 	print "<tr><td>";
-	print $langs->trans('CronHourStart')."</td><td>";
-	if(!empty($object->datestart)) {print dol_print_date($object->datestart,'dayhourtext');} else {print $langs->trans('CronNone');}
+	print $langs->trans('CronDtStart')."</td><td>";
+	if(!empty($object->datestart)) {print dol_print_date($object->datestart,'dayhourtext');}
 	print "</td></tr>";
 
 	print "<tr><td>";
 	print $langs->trans('CronDtEnd')."</td><td>";
-	if(!empty($object->dateend)) {print dol_print_date($object->dateend,'dayhourtext');} else {print $langs->trans('CronNone');}
+	if(!empty($object->dateend)) {print dol_print_date($object->dateend,'dayhourtext');}
 	print "</td></tr>";
 
+	print '<tr><td>';
+	print $langs->trans('CronDtNextLaunch');
+	print ' ('.$langs->trans('CronFrom').')';
+	print "</td><td>";
+	if(!empty($object->datenextrun)) {print dol_print_date($object->datenextrun,'dayhoursec');} else {print $langs->trans('CronNone');}
+	print "</td></tr>";
+	
 	print "<tr><td>";
 	print $langs->trans('CronPriority')."</td>";
 	print "<td>".$object->priority;
@@ -591,23 +598,17 @@ else
 
 	print '<br>';
 
+	
 	print '<table class="border" width="100%">';
 
 	print '<tr><td width="30%">';
 	print $langs->trans('CronDtLastLaunch')."</td><td>";
-	if(!empty($object->datelastrun)) {print dol_print_date($object->datelastrun,'dayhourtext');} else {print $langs->trans('CronNone');}
-	print "</td></tr>";
-
-	print '<tr><td>';
-	print $langs->trans('CronDtNextLaunch');
-	print ' ('.$langs->trans('CronFrom').')';
-	print "</td><td>";
-	if(!empty($object->datenextrun)) {print dol_print_date($object->datenextrun,'dayhourtext');} else {print $langs->trans('CronNone');}
+	if(!empty($object->datelastrun)) {print dol_print_date($object->datelastrun,'dayhoursec');} else {print $langs->trans('CronNone');}
 	print "</td></tr>";
 
 	print '<tr><td>';
 	print $langs->trans('CronDtLastResult')."</td><td>";
-	if(!empty($object->datelastresult)) {print dol_print_date($object->datelastresult,'dayhourtext');} else {print $langs->trans('CronNone');}
+	if(!empty($object->datelastresult)) {print dol_print_date($object->datelastresult,'dayhoursec');} else {print $langs->trans('CronNone');}
 	print "</td></tr>";
 
 	print '<tr><td>';
diff --git a/htdocs/cron/class/cronjob.class.php b/htdocs/cron/class/cronjob.class.php
index 742db0cb4619905b6f54d83f7bbe2c596fa92b35..5605cf1bfb2d5fb67cdea5d1dd2c1d3b4f4f04f0 100644
--- a/htdocs/cron/class/cronjob.class.php
+++ b/htdocs/cron/class/cronjob.class.php
@@ -521,9 +521,6 @@ class Cronjob extends CommonObject
 
 		// Check parameters
 		// Put here code to add a control on parameters values
-		if (empty($this->status)) {
-			$this->dateend=dol_now();
-		}
 		if (dol_strlen($this->datestart)==0) {
 			$this->errors[]=$langs->trans('CronFieldMandatory',$langs->trans('CronDtStart'));
 			$error++;
@@ -830,7 +827,9 @@ class Cronjob extends CommonObject
 
 
 	/**
-	 * Run a job
+	 * Run a job.
+	 * Once job is finished, status and nb of of run is updated. 
+	 * This function does not plan the next run. This is done by function ->reprogram_jobs 
 	 *
 	 * @param  string		$userlogin    	User login
 	 * @return	int					 		<0 if KO, >0 if OK
@@ -843,7 +842,8 @@ class Cronjob extends CommonObject
 
 		$langs->load('cron');
 
-			if (empty($userlogin)) {
+		if (empty($userlogin)) 
+		{
 			$this->error="User login is mandatory";
 			dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
 			return -1;
@@ -891,7 +891,7 @@ class Cronjob extends CommonObject
 		$this->datelastrun=$now;
 		$this->lastoutput='';
 		$this->lastresult='';
-		$this->nbrun=$this->nbrun+1;
+		$this->nbrun=$this->nbrun + 1;
 		$result = $this->update($user);
 		if ($result<0) {
 			dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
@@ -1055,23 +1055,28 @@ class Cronjob extends CommonObject
 	/**
 	 * Reprogram a job
 	 *
-	 * @param  string		$userlogin    User login
-	 * @return	int					 <0 if KO, >0 if OK
-	 *
+	 * @param  string		$userlogin      User login
+	 * @return int					        <0 if KO, >0 if OK
 	 */
 	function reprogram_jobs($userlogin)
 	{
 		dol_syslog(get_class($this)."::reprogram_jobs userlogin:$userlogin", LOG_DEBUG);
-
+        
+		$now = dol_now();
+		
 		require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
 		$user=new User($this->db);
 		$result=$user->fetch('',$userlogin);
-		if ($result<0) {
+		if ($result<0) 
+		{
 			$this->error="User Error:".$user->error;
 			dol_syslog(get_class($this)."::reprogram_jobs ".$this->error, LOG_ERR);
 			return -1;
-		}else {
-			if (empty($user->id)) {
+		}
+		else 
+		{
+			if (empty($user->id)) 
+			{
 				$this->error=" User user login:".$userlogin." do not exists";
 				dol_syslog(get_class($this)."::reprogram_jobs ".$this->error, LOG_ERR);
 				return -1;
@@ -1080,17 +1085,41 @@ class Cronjob extends CommonObject
 
 		dol_syslog(get_class($this)."::reprogram_jobs  ", LOG_DEBUG);
 
-		if (empty($this->datenextrun)) {
-			$this->datenextrun=dol_now()+$this->frequency;
-		} else {
-			if ($this->datenextrun<dol_now()) {
-				$this->datenextrun=dol_now()+$this->frequency;
-			} else {
-				$this->datenextrun=$this->datenextrun+$this->frequency;
+		
+		if (empty($this->datenextrun)) 
+		{
+			$this->datenextrun = $now + $this->frequency;
+		}
+		else 
+		{
+			if ($this->datenextrun < $now && $this->frequency > 0) 
+			{
+			    // Loop until date is after future
+			    while ($this->datenextrun < $now)
+			    {
+			        $this->datenextrun += $this->frequency;
+			    }
+			}
+			else 
+			{
+				//$this->datenextrun=$this->datenextrun+$this->frequency;
 			}
 		}
+
+		// Archive job
+		if ($this->autodelete == 2)
+		{
+		    if (($this->maxrun > 0 && ($this->nbrun >= $this->maxrun))
+		        || ($this->dateend && ($this->datenextrun > $this->dateend)))
+		    {
+		        $this->status = 2;
+		        dol_syslog(get_class($this)."::reprogram_jobs Job must be set to archived", LOG_ERR);
+		    }
+		}
+		
 		$result = $this->update($user);
-		if ($result<0) {
+		if ($result<0) 
+		{
 			dol_syslog(get_class($this)."::reprogram_jobs ".$this->error, LOG_ERR);
 			return -1;
 		}
diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php
index 6dca2218286b1d42230f49ffcda89faaa3b3c8af..d5331819ed21b9d34402ad9bc91a625e07dd431e 100644
--- a/htdocs/cron/list.php
+++ b/htdocs/cron/list.php
@@ -173,14 +173,14 @@ print '<tr class="liste_titre">';
 print_liste_field_titre($langs->trans("ID"),$_SERVER["PHP_SELF"],"t.rowid","",$param,'',$sortfield,$sortorder);
 print_liste_field_titre($langs->trans("CronLabel"),$_SERVER["PHP_SELF"],"t.label","",$param,'',$sortfield,$sortorder);
 print_liste_field_titre($langs->trans("CronTask"),'','',"",$param,'',$sortfield,$sortorder);
-print_liste_field_titre($langs->trans("CronDtStart"),$_SERVER["PHP_SELF"],"t.datestart","",$param,'',$sortfield,$sortorder);
-print_liste_field_titre($langs->trans("CronDtEnd"),$_SERVER["PHP_SELF"],"t.dateend","",$param,'',$sortfield,$sortorder);
-print_liste_field_titre($langs->trans("CronDtLastLaunch"),$_SERVER["PHP_SELF"],"t.datelastrun","",$param,'',$sortfield,$sortorder);
-print_liste_field_titre($langs->trans("CronDtNextLaunch"),$_SERVER["PHP_SELF"],"t.datenextrun","",$param,'',$sortfield,$sortorder);
+print_liste_field_titre($langs->trans("CronDtStart"),$_SERVER["PHP_SELF"],"t.datestart","",$param,'align="center"',$sortfield,$sortorder);
+print_liste_field_titre($langs->trans("CronDtEnd"),$_SERVER["PHP_SELF"],"t.dateend","",$param,'align="center"',$sortfield,$sortorder);
+print_liste_field_titre($langs->trans("CronDtNextLaunch"),$_SERVER["PHP_SELF"],"t.datenextrun","",$param,'align="center"',$sortfield,$sortorder);
 print_liste_field_titre($langs->trans("CronFrequency"),'',"","",$param,'',$sortfield,$sortorder);
-print_liste_field_titre($langs->trans("CronNbRun"),$_SERVER["PHP_SELF"],"t.nbrun","",$param,'',$sortfield,$sortorder);
-print_liste_field_titre($langs->trans("CronMaxRun"),$_SERVER["PHP_SELF"],"t.maxrun","",$param,'',$sortfield,$sortorder);
-print_liste_field_titre($langs->trans("CronLastResult"),$_SERVER["PHP_SELF"],"t.lastresult","",$param,'',$sortfield,$sortorder);
+print_liste_field_titre($langs->trans("CronMaxRun"),$_SERVER["PHP_SELF"],"t.maxrun","",$param,'align="right"',$sortfield,$sortorder);
+print_liste_field_titre($langs->trans("CronNbRun"),$_SERVER["PHP_SELF"],"t.nbrun","",$param,'align="right"',$sortfield,$sortorder);
+print_liste_field_titre($langs->trans("CronDtLastLaunch"),$_SERVER["PHP_SELF"],"t.datelastrun","",$param,'align="center"',$sortfield,$sortorder);
+print_liste_field_titre($langs->trans("CronLastResult"),$_SERVER["PHP_SELF"],"t.lastresult","",$param,'align="center"',$sortfield,$sortorder);
 print_liste_field_titre($langs->trans("CronLastOutput"),$_SERVER["PHP_SELF"],"t.lastoutput","",$param,'',$sortfield,$sortorder);
 print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"t.status","",$param,'align="center"',$sortfield,$sortorder);
 print_liste_field_titre('');
@@ -259,19 +259,15 @@ if ($num > 0)
 		}
 		print '</td>';
 
-		print '<td>';
+		print '<td class="center">';
 		if(!empty($line->datestart)) {print dol_print_date($line->datestart,'dayhour');}
 		print '</td>';
 
-		print '<td>';
+		print '<td class="center">';
 		if(!empty($line->dateend)) {print dol_print_date($line->dateend,'dayhour');}
 		print '</td>';
 
-		print '<td>';
-		if(!empty($line->datelastrun)) {print dol_print_date($line->datelastrun,'dayhour');}
-		print '</td>';
-
-		print '<td>';
+		print '<td class="center">';
 		if(!empty($line->datenextrun)) {print dol_print_date($line->datenextrun,'dayhour');}
 		print '</td>';
 
@@ -282,15 +278,19 @@ if ($num > 0)
 		if($line->unitfrequency == "604800") print $langs->trans('CronEach')." ".($line->frequency/$line->unitfrequency)." ".$langs->trans('Weeks');
 		print '</td>';
 
-		print '<td>';
+		print '<td align="right">';
+		if (!empty($line->maxrun)) {print $line->maxrun;}
+		print '</td>';
+		
+		print '<td align="right">';
 		if (!empty($line->nbrun)) {print $line->nbrun;} else {print '0';}
 		print '</td>';
 
-		print '<td>';
-		if (!empty($line->maxrun)) {print $line->maxrun;}
+		print '<td class="center">';
+		if(!empty($line->datelastrun)) {print dol_print_date($line->datelastrun,'dayhour');}
 		print '</td>';
-		
-		print '<td>';
+
+		print '<td class="center">';
 		if(!empty($line->lastresult)) {print dol_trunc($line->lastresult);}
 		print '</td>';
 
diff --git a/htdocs/install/mysql/tables/llx_cronjob.sql b/htdocs/install/mysql/tables/llx_cronjob.sql
index 6e076d518a7095b174d3978d25db1ae55a4975ae..dfe9ef127ff82ab461d45e279bc98627eb69f13d 100644
--- a/htdocs/install/mysql/tables/llx_cronjob.sql
+++ b/htdocs/install/mysql/tables/llx_cronjob.sql
@@ -33,18 +33,18 @@ CREATE TABLE llx_cronjob
 	md5params 		varchar(32),
   	module_name 	varchar(255),
   	priority 		integer DEFAULT 0,
-  	datelastrun 	datetime,					-- date last run and when should be next
+  	datelastrun 	datetime,					-- date last run start (see datelastresult for end with a result)
   	datenextrun 	datetime,					-- job will be run if current date higher that this date
   	datestart		datetime,						-- before this date no jobs will be run
   	dateend			datetime,						-- after this date, no more jobs will be run
-  	datelastresult  datetime,				
+  	datelastresult  datetime,						-- date last run end
   	lastresult      text,
   	lastoutput      text,
   	unitfrequency	integer NOT NULL DEFAULT 0,
   	frequency 		integer NOT NULL DEFAULT 0,
     maxrun          integer NOT NULL DEFAULT 0,		-- set this to 1 for a job queued for on run only
 	nbrun			integer,						-- nb of run complete (failed or not)
-    autodelete      integer DEFAULT 0,				-- 1=Job must be deleted once finished, 2=Job must be archived once finished (archive = status 2) 
+    autodelete      integer DEFAULT 0,				-- 0=Job is kept unchanged once nbrun > maxrun or date > dateend, 2=Job must be archived (archive = status 2) once nbrun > maxrun or date > dateend 
   	status 			integer NOT NULL DEFAULT 1,		-- 0=disabled, 1=enabled, 2=archived
   	fk_user_author 	integer DEFAULT NULL,
   	fk_user_mod 	integer DEFAULT NULL,
diff --git a/htdocs/langs/en_US/cron.lang b/htdocs/langs/en_US/cron.lang
index ae997d0a49092610b46a2019329ff77e655acee9..b7cdb069346390145bd5d48e455954eb6bd3a1cb 100644
--- a/htdocs/langs/en_US/cron.lang
+++ b/htdocs/langs/en_US/cron.lang
@@ -36,8 +36,8 @@ CronInfo=Scheduled job module allow to execute job that have been planned
 CronWaitingJobs=Waiting jobs
 CronTask=Job
 CronNone=None
-CronDtStart=Start date
-CronDtEnd=End date
+CronDtStart=Not before
+CronDtEnd=Not after
 CronDtNextLaunch=Next execution
 CronDtLastLaunch=Last execution
 CronFrequency=Frequency
diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php
index e163f41e9fc7471ab484656841db73e4c87c3535..20fb55bb2135416cac5f86119d1c4976955e73c3 100755
--- a/scripts/cron/cron_run_jobs.php
+++ b/scripts/cron/cron_run_jobs.php
@@ -1,8 +1,8 @@
 #!/usr/bin/env php
 <?php
-/* Copyright (C) 2012   Nicolas Villa aka Boyquotes http://informetic.fr
- * Copyright (C) 2013   Florian Henry <forian.henry@open-concept.pro
- * Copyright (C) 2013   Laurent Destailleur <eldy@users.sourceforge.net>
+/* Copyright (C) 2012      Nicolas Villa aka Boyquotes http://informetic.fr
+ * Copyright (C) 2013      Florian Henry <forian.henry@open-concept.pro
+ * Copyright (C) 2013-2015 Laurent Destailleur <eldy@users.sourceforge.net>
  *
  * 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
@@ -147,7 +147,7 @@ if(is_array($object->lines) && (count($object->lines)>0))
 					exit(-1);
 				}
 
-					// we re-program the next execution and stores the last execution time for this job
+				// we re-program the next execution and stores the last execution time for this job
 				$result=$cronjob->reprogram_jobs($userlogin);
 				if ($result<0) {
 					echo "Error:".$cronjob->error;