diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php
index 04353190adbb3f9d54ff7edce4c29fb0f26edd4b..831a019d04ef45e1b3838ddefa72707ae503810b 100644
--- a/htdocs/comm/action/peruser.php
+++ b/htdocs/comm/action/peruser.php
@@ -205,6 +205,8 @@ if ($action == 'show_day' || $action == 'show_week' || $action == 'show_month' |
 $param.="&maxprint=".$maxprint;
 
 $prev = dol_get_first_day_week($day, $month, $year);
+//print "day=".$day." month=".$month." year=".$year;
+//var_dump($prev); exit;
 $prev_year  = $prev['prev_year'];
 $prev_month = $prev['prev_month'];
 $prev_day   = $prev['prev_day'];
@@ -223,6 +225,7 @@ $next_day   = $next['day'];
 // Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1)
 $firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year);
 $lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 7, 'd');
+//print $firstday.'-'.$first_month.'-'.$first_year;
 //print dol_print_date($firstdaytoshow,'dayhour');
 //print dol_print_date($lastdaytoshow,'dayhour');
 
@@ -534,12 +537,16 @@ echo '<input type="hidden" name="newdate" id="newdate">' ;
 echo '</form>';
 
 
-// Table :
+// Line header with list of days
+
+//print "begin_d=".$begin_d." end_d=".$end_d;
+
+
 echo '<table width="100%" class="nocellnopadd cal_month">';
 
 echo '<tr class="liste_titre">';
 echo '<td></td>';
-$i=0;
+$i=0;	// 0 = sunday,
 while ($i < 7)
 {
 	if (($i + 1) < $begin_d || ($i + 1) > $end_d)
@@ -679,7 +686,7 @@ foreach ($usernames as $username)
 
 	// Lopp on each day of week
 	$i = 0;
-	for ($iter_day = 0; $iter_day < 7; $iter_day++)
+	for ($iter_day = 0; $iter_day < 8; $iter_day++)
 	{
 		if (($i + 1) < $begin_d || ($i + 1) > $end_d)
 		{
diff --git a/htdocs/core/datepicker.php b/htdocs/core/datepicker.php
index 7c5c4898fce58a32a0c58d600b00fca142528c78..03264601624949b6cb50d71e888f84d696ec3d86 100644
--- a/htdocs/core/datepicker.php
+++ b/htdocs/core/datepicker.php
@@ -26,17 +26,18 @@
  *       \brief      File to manage popup date selector
  */
 
-if (! defined('NOREQUIREUSER'))   define('NOREQUIREUSER','1');	// Not disabled cause need to load personalized language
-if (! defined('NOREQUIREDB'))   define('NOREQUIREDB','1');		// Not disabled cause need to load personalized language
+//if (! defined('NOREQUIREUSER'))   define('NOREQUIREUSER','1');	// Not disabled cause need to load personalized language
+//if (! defined('NOREQUIREDB'))     define('NOREQUIREDB','1');	// Not disabled cause need to load personalized language
 if (! defined('NOREQUIRESOC'))    define('NOREQUIRESOC','1');
 //if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1');		// Not disabled cause need to do translations
 if (! defined('NOCSRFCHECK'))     define('NOCSRFCHECK',1);
 if (! defined('NOTOKENRENEWAL'))  define('NOTOKENRENEWAL',1);
 if (! defined('NOLOGIN')) define('NOLOGIN',1);					// Not disabled cause need to load personalized language
-if (! defined('NOREQUIREMENU'))  define('NOREQUIREMENU',1);
-if (! defined('NOREQUIREHTML'))  define('NOREQUIREHTML',1);
+if (! defined('NOREQUIREMENU'))   define('NOREQUIREMENU',1);
+if (! defined('NOREQUIREHTML'))   define('NOREQUIREHTML',1);
 
 require_once '../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
 
 if (GETPOST('lang')) $langs->setDefaultLang(GETPOST('lang'));	// If language was forced on URL by the main.inc.php
 $langs->load("main");
@@ -195,9 +196,9 @@ function displayBox($selectedDate,$month,$year)
 		<td width="15%"><?php echo $langs->trans("ShortThursday") ?></td>
 		<td width="14%"><?php echo $langs->trans("ShortFriday") ?></td>
 		<td width="14%"><?php echo $langs->trans("ShortSaturday") ?></td>
-		<td width="14%"><?php echo $langs->trans("ShortSunday") ?></td>     
+		<td width="14%"><?php echo $langs->trans("ShortSunday") ?></td>
 	<?php
-	}else {?>	
+	}else {?>
 		<td width="14%"><?php echo $langs->trans("ShortSunday") ?></td>
 		<td width="14%"><?php echo $langs->trans("ShortMonday") ?></td>
 		<td width="15%"><?php echo $langs->trans("ShortTuesday") ?></td>
@@ -209,28 +210,36 @@ function displayBox($selectedDate,$month,$year)
 	}?>
 	</tr>
 	<?php
-	//print "x ".$thedate." y";
+	//print "x ".$thedate." y";			// $thedate = first day of month
 	$firstdate=dol_getdate($thedate);
-	$mydate=$firstdate;
+	//var_dump($firstdateofweek);
+	$mydate=dol_get_first_day_week(1, $month, $year, true);	// mydate = cursor date
 
 	// Loop on each day of month
 	$stoploop=0; $day=1; $cols=0;
 	while (! $stoploop)
 	{
 		//print_r($mydate);
-		if($firstdate==$mydate)	// At first run
+		if ($mydate < $firstdate)	// At first run
 		{
 			echo "<TR class=\"dpWeek\">";
+			//echo $conf->global->MAIN_START_WEEK.' '.$firstdate["wday"].' '.$startday;
 			$cols=0;
-			for($i=0;$i< $mydate["wday"];$i++)
+			for ($i = 0; $i < 7; $i++)
 			{
+				$w = ($i + $startday) % 7;
+				if ($w == $firstdate["wday"])
+				{
+					$mydate = $firstdate;
+					break;
+				}
 				echo "<TD>&nbsp;</TD>";
 				$cols++;
 			}
 		}
 		else
 		{
-			if ($mydate["wday"]==0)
+			if ($mydate["wday"] == $startday)
 			{
 				echo "<TR class=\"dpWeek\">";
 				$cols=0;
@@ -254,7 +263,7 @@ function displayBox($selectedDate,$month,$year)
 		echo ">".sprintf("%02s",$mydate["mday"])."</TD>";
 		$cols++;
 
-		if ($mydate["wday"]==6) echo "</TR>\n";
+		if (($mydate["wday"] + 1) % 7 == $startday) echo "</TR>\n";
 
 		//$thedate=strtotime("tomorrow",$thedate);
 		$day++;
diff --git a/htdocs/core/lib/date.lib.php b/htdocs/core/lib/date.lib.php
index d2c6ce4bd4fd787a6859eb8e29ac37f88a7f7740..072db988dc15c3a45f18fe6ea862a02471ecf367 100644
--- a/htdocs/core/lib/date.lib.php
+++ b/htdocs/core/lib/date.lib.php
@@ -479,34 +479,36 @@ function dol_get_last_day($year,$month=12,$gm=false)
 	return $datelim;
 }
 
-/**	Return first day of week for a date
+/**	Return first day of week for a date. First day of week may be monday if option MAIN_START_WEEK is 1.
  *
  *	@param		int		$day		Day
  * 	@param		int		$month		Month
  *  @param		int		$year		Year
  * 	@param		int		$gm			False or 0 or 'server' = Return date to compare with server TZ, True or 1 to compare with GM date.
- *	@return		array				year,month,week,first_day,prev_year,prev_month,prev_day
+ *	@return		array				year,month,week,first_day,first_month,first_year,prev_day,prev_month,prev_year
  */
 function dol_get_first_day_week($day,$month,$year,$gm=false)
 {
 	global $conf;
 
+	//$day=2; $month=2; $year=2015;
 	$date = dol_mktime(0,0,0,$month,$day,$year,$gm);
 
 	//Checking conf of start week
 	$start_week = (isset($conf->global->MAIN_START_WEEK)?$conf->global->MAIN_START_WEEK:1);
 
-	$tmparray = dol_getdate($date,true);
+	$tmparray = dol_getdate($date,true);	// detail of current day
 
-	//Calculate days to count
+	//Calculate days = offset from current day
 	$days = $start_week - $tmparray['wday'];
  	if ($days>=1) $days=7-$days;
  	$days = abs($days);
     $seconds = $days*24*60*60;
+	//print 'start_week='.$start_week.' tmparray[wday]='.$tmparray['wday'].' day offset='.$days.' seconds offset='.$seconds.'<br>';
 
     //Get first day of week
-    $tmpday = date($tmparray[0])-$seconds;
-	$tmpday = date("d",$tmpday);
+    $tmpdaytms = date($tmparray[0])-$seconds; // $tmparray[0] is day of parameters
+	$tmpday = date("d",$tmpdaytms);
 
 	//Check first day of week is in same month than current day or not
 	if ($tmpday>$day)
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 372d2f6737380f0e5eac52020553a04424baefd5..c3446eb7b153b6e1fee8072b39ee090a5c92c434 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -999,8 +999,9 @@ function dol_print_date($time,$format='',$tzoutput='tzserver',$outputlangs='',$e
 /**
  *	Return an array with locale date info.
  *  PHP getdate is restricted to the years 1901-2038 on Unix and 1970-2038 on Windows
- *  WARNING: This function always use PHP server timezone to return locale informations.
+ *  WARNING: This function always use PHP server timezone to return locale informations !!!
  *  Usage must be avoid.
+ *  FIXME: Replace this with PHP date function and a parameter $gm
  *
  *	@param	int			$timestamp      Timestamp
  *	@param	boolean		$fast           Fast mode
@@ -1010,7 +1011,7 @@ function dol_print_date($time,$format='',$tzoutput='tzserver',$outputlangs='',$e
  *										'minutes' => $min,
  *										'hours' => $hour,
  *										'mday' => $day,
- *										'wday' => $dow,
+ *										'wday' => $dow,		0=sunday, 6=saturday
  *										'mon' => $month,
  *										'year' => $year,
  *										'yday' => floor($secsInYear/$_day_power),
@@ -1044,7 +1045,7 @@ function dol_getdate($timestamp,$fast=false)
 	{
 		$arrayinfo=getdate($timestamp);
 
-		$startday=isset($conf->global->MAIN_START_WEEK)?$conf->global->MAIN_START_WEEK:1;
+		/*$startday=isset($conf->global->MAIN_START_WEEK)?$conf->global->MAIN_START_WEEK:1;
 		if($startday==1)
 		{
 			if ($arrayinfo["wday"]==0)
@@ -1055,7 +1056,7 @@ function dol_getdate($timestamp,$fast=false)
 			{
 				$arrayinfo["wday"]=$arrayinfo["wday"]-1;
 			}
-		}
+		}*/
 	}
 
 	return $arrayinfo;
diff --git a/test/phpunit/DateLibTest.php b/test/phpunit/DateLibTest.php
index f5d9e7d0cc41a447e77e943666fb9d2f9cf01f1d..f6f94e8b2015021b39bbcbfddd64a75fd0c3536a 100644
--- a/test/phpunit/DateLibTest.php
+++ b/test/phpunit/DateLibTest.php
@@ -341,4 +341,24 @@ class DateLibTest extends PHPUnit_Framework_TestCase
         return $result;
     }
 
+    /**
+     * testDolGetFirstDayWeek
+     *
+     * @return int
+     */
+    public function testDolGetFirstDayWeek()
+    {
+    	global $conf;
+
+    	$day=3; $month=2; $year=2015;
+    	$conf->global->MAIN_START_WEEK = 1;	// start on monday
+   		$prev = dol_get_first_day_week($day, $month, $year);
+		$this->assertEquals(2, (int) $prev['first_day']);		// monday for month 2, year 2014 is the 2
+
+    	$day=3; $month=2; $year=2015;
+    	$conf->global->MAIN_START_WEEK = 0;	// start on sunday
+   		$prev = dol_get_first_day_week($day, $month, $year);
+		$this->assertEquals(1, (int) $prev['first_day']);		// sunday for month 2, year 2015 is the 1st
+    }
+
 }
diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php
index f1b06bbbf4cb804c4c32937b88857f6d502a3cd2..001ac0b1decaa5c30d661647c2f83f282c0e5032 100755
--- a/test/phpunit/FunctionsLibTest.php
+++ b/test/phpunit/FunctionsLibTest.php
@@ -888,4 +888,32 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase
 		return true;
 	}
 
+	/**
+	 * testDolGetDate
+	 *
+	 * @return boolean
+	 */
+	public function testDolGetDate()
+	{
+		global $conf;
+
+		$conf->global->MAIN_START_WEEK = 0;
+
+		$tmp=dol_getdate(1);				// 1/1/1970 and 1 second = thirday
+		$this->assertEquals(4, $tmp['wday']);
+
+		$tmp=dol_getdate(24*60*60+1);		// 2/1/1970 and 1 second = friday
+		$this->assertEquals(5, $tmp['wday']);
+
+		$conf->global->MAIN_START_WEEK = 1;
+
+		$tmp=dol_getdate(1);				// 1/1/1970 and 1 second = thirday
+		$this->assertEquals(4, $tmp['wday']);
+
+		$tmp=dol_getdate(24*60*60+1);		// 2/1/1970 and 1 second = friday
+		$this->assertEquals(5, $tmp['wday']);
+
+		return true;
+	}
+
 }