diff --git a/htdocs/api/class/api.class.php b/htdocs/api/class/api.class.php
index 1204fded0aae34f699f14eab97cb72c83c0c43de..7aef2671c8db58795d70410346d4a36c136b0ea1 100644
--- a/htdocs/api/class/api.class.php
+++ b/htdocs/api/class/api.class.php
@@ -90,7 +90,6 @@ class DolibarrApi
         // Remove linkedObjects. We should already have linkedObjectIds that avoid huge responses
         unset($object->linkedObjects);
         
-        unset($object->lignes); // should be ->lines
         unset($object->oldline);
         
         unset($object->error);
diff --git a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php
index bd48e33a11decc025e0840ac906c1dcf2e4af24b..e4ad7b7db365cada8a58038a66291e4286422cc9 100644
--- a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php
+++ b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php
@@ -186,8 +186,6 @@ class pdf_standard extends ModeleExpenseReport
 				}
 			}
 
-			if (isset($object->lignes) && ! isset($object->lines)) $object->lines=$object->lignes;
-
 			if (file_exists($dir))
 			{
 				// Add pdfgeneration hook
diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php
index 12956ee5764d2f518a08240f2bbb2a7ef8314cb8..db2328cdfb4693ef7f14e47d68fe3320969672d2 100644
--- a/htdocs/expensereport/card.php
+++ b/htdocs/expensereport/card.php
@@ -2141,7 +2141,7 @@ if ($action != 'create' && $action != 'edit')
 			print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=edit&id='.$object->id.'">'.$langs->trans('Modify').'</a></div>';
 
 			// Validate
-			if (count($object->lines) > 0 || count($object->lignes) > 0)
+			if (count($object->lines) > 0)
 			{
 				print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=save&id='.$object->id.'">'.$langs->trans('ValidateAndSubmit').'</a></div>';
 			}
diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php
index e4754f4ab60bf2352f8f1ee5e6e6e49be5f15633..f88c667352caef088baa86c1c1e3f275341f6c3a 100644
--- a/htdocs/expensereport/class/expensereport.class.php
+++ b/htdocs/expensereport/class/expensereport.class.php
@@ -182,10 +182,10 @@ class ExpenseReport extends CommonObject
             $resql=$this->db->query($sql);
             if (!$resql) $error++;
 
-            foreach ($this->lignes as $i => $val)
+            foreach ($this->lines as $i => $val)
             {
                 $newndfline=new ExpenseReportLine($this->db);
-                $newndfline=$this->lignes[$i];
+                $newndfline=$this->lines[$i];
                 $newndfline->fk_expensereport=$this->id;
                 if ($result >= 0)
                 {
@@ -241,11 +241,10 @@ class ExpenseReport extends CommonObject
         }
         else
         {
-            $this->error=$this->db->error()." sql=".$sql;
+            $this->error=$this->db->lasterror()." sql=".$sql;
             $this->db->rollback();
             return -1;
         }
-
     }
 
 
@@ -266,57 +265,58 @@ class ExpenseReport extends CommonObject
         $this->db->begin();
     
         // get extrafields so they will be clone
-        foreach($this->lines as $line)
+        //foreach($this->lines as $line)
             //$line->fetch_optionals($line->rowid);
     
-            // Load source object
-            $objFrom = clone $this;
-    
-            $this->id=0;
-            $this->ref = '';
-            $this->statut=0;
-    
-            // Clear fields
-            $this->fk_user_author     = $user->id;     // Note fk_user_author is not the 'author' but the guy the expense report is for.
-            $this->fk_user_valid      = '';
-            $this->date_create  	  = '';
-            $this->date_creation      = '';
-            $this->date_validation    = '';
-    
-            // Create clone
-            $result=$this->create($user);
-            if ($result < 0) $error++;
-    
-            if (! $error)
-            {
-                // Hook of thirdparty module
-                if (is_object($hookmanager))
-                {
-                    $parameters=array('objFrom'=>$objFrom);
-                    $action='';
-                    $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
-                    if ($reshook < 0) $error++;
-                }
-    
-                // Call trigger
-                $result=$this->call_trigger('EXPENSEREPORT_CLONE',$user);
-                if ($result < 0) $error++;
-                // End call triggers
-            }
-    
-            unset($this->context['createfromclone']);
-    
-            // End
-            if (! $error)
+        // Load source object
+        $objFrom = clone $this;
+
+        $this->id=0;
+        $this->ref = '';
+        $this->status=0;
+        $this->fk_statut=0;
+
+        // Clear fields
+        $this->fk_user_author     = $user->id;     // Note fk_user_author is not the 'author' but the guy the expense report is for.
+        $this->fk_user_valid      = '';
+        $this->date_create  	  = '';
+        $this->date_creation      = '';
+        $this->date_validation    = '';
+
+        // Create clone
+        $result=$this->create($user);
+        if ($result < 0) $error++;
+
+        if (! $error)
+        {
+            // Hook of thirdparty module
+            if (is_object($hookmanager))
             {
-                $this->db->commit();
-                return $this->id;
-            }
-            else
-            {
-                $this->db->rollback();
-                return -1;
+                $parameters=array('objFrom'=>$objFrom);
+                $action='';
+                $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
+                if ($reshook < 0) $error++;
             }
+
+            // Call trigger
+            $result=$this->call_trigger('EXPENSEREPORT_CLONE',$user);
+            if ($result < 0) $error++;
+            // End call triggers
+        }
+
+        unset($this->context['createfromclone']);
+
+        // End
+        if (! $error)
+        {
+            $this->db->commit();
+            return $this->id;
+        }
+        else
+        {
+            $this->db->rollback();
+            return -1;
+        }
     }
     
     
@@ -475,7 +475,6 @@ class ExpenseReport extends CommonObject
                 $this->code_statut      = $obj->code_statut;
                 $this->code_paiement    = $obj->code_paiement;
 
-                $this->lignes = array();    // deprecated
                 $this->lines = array();
 
                 $result=$this->fetch_lines();
@@ -698,6 +697,8 @@ class ExpenseReport extends CommonObject
         $this->date_fin = $now;
         $this->date_approve = $now;
 
+        $type_fees_id = 2;  // TF_TRIP 
+        
         $this->status = 5;
         $this->fk_statut = 5;
 
@@ -723,6 +724,7 @@ class ExpenseReport extends CommonObject
             $line->value_unit=120;
             $line->fk_expensereport=0;
             $line->type_fees_code='TRA';
+            $line->fk_c_type_fees=$type_fees_id;
 
             $line->projet_ref = 'ABC';
 
@@ -748,7 +750,7 @@ class ExpenseReport extends CommonObject
 
         $langs->load('trips');
 
-        if($user->rights->expensereport->lire) {
+        if ($user->rights->expensereport->lire) {
 
             $sql = "SELECT de.fk_expensereport, de.date, de.comments, de.total_ht, de.total_ttc";
             $sql.= " FROM ".MAIN_DB_PREFIX."expensereport_det as de";
@@ -834,7 +836,7 @@ class ExpenseReport extends CommonObject
             }
             else
             {
-                $this->error=$db->error();
+                $this->error=$db->lasterror();
                 return -1;
             }
         }
@@ -856,8 +858,6 @@ class ExpenseReport extends CommonObject
 
         $total_ht = 0; $total_tva = 0; $total_ttc = 0;
 
-        dol_syslog('ExpenseReport::recalculer sql='.$sql,LOG_DEBUG);
-
         $result = $this->db->query($sql);
         if($result)
         {
@@ -881,15 +881,15 @@ class ExpenseReport extends CommonObject
             $this->db->free($result);
             return 1;
             else:
-            $this->error=$this->db->error();
-            dol_syslog('ExpenseReport::recalculer: Error '.$this->error,LOG_ERR);
+            $this->error=$this->db->lasterror();
+            dol_syslog(get_class($this)."::recalculer: Error ".$this->error,LOG_ERR);
             return -3;
             endif;
         }
         else
         {
-            $this->error=$this->db->error();
-            dol_syslog('ExpenseReport::recalculer: Error '.$this->error,LOG_ERR);
+            $this->error=$this->db->lasterror();
+            dol_syslog(get_class($this)."::recalculer: Error ".$this->error,LOG_ERR);
             return -3;
         }
     }
@@ -914,7 +914,6 @@ class ExpenseReport extends CommonObject
         $sql.= ' WHERE de.'.$this->fk_element.' = '.$this->id;
 		$sql.= ' ORDER BY de.date ASC';
 
-        dol_syslog('ExpenseReport::fetch_lines sql='.$sql, LOG_DEBUG);
         $resql = $this->db->query($sql);
         if ($resql)
         {
@@ -947,7 +946,6 @@ class ExpenseReport extends CommonObject
                 $deplig->projet_ref         = $objp->ref_projet;
                 $deplig->projet_title       = $objp->title_projet;
 
-                $this->lignes[$i] = $deplig;
                 $this->lines[$i] = $deplig;
 
                 $i++;
@@ -958,7 +956,7 @@ class ExpenseReport extends CommonObject
         else
         {
             $this->error=$this->db->lasterror();
-            dol_syslog('ExpenseReport::fetch_lines: Error '.$this->error, LOG_ERR);
+            dol_syslog(get_class($this)."::fetch_lines: Error ".$this->error, LOG_ERR);
             return -3;
         }
     }
@@ -989,7 +987,7 @@ class ExpenseReport extends CommonObject
             else
             {
                 $this->error=$this->db->error()." sql=".$sql;
-                dol_syslog("ExpenseReport.class::delete ".$this->error, LOG_ERR);
+                dol_syslog(get_class($this)."::delete ".$this->error, LOG_ERR);
                 $this->db->rollback();
                 return -6;
             }
@@ -997,7 +995,7 @@ class ExpenseReport extends CommonObject
         else
         {
             $this->error=$this->db->error()." sql=".$sql;
-            dol_syslog("ExpenseReport.class::delete ".$this->error, LOG_ERR);
+            dol_syslog(get_class($this)."::delete ".$this->error, LOG_ERR);
             $this->db->rollback();
             return -4;
         }
@@ -1008,7 +1006,7 @@ class ExpenseReport extends CommonObject
      *
      * @param   User    $fuser      User
 	 * @param   int     $notrigger  Disable triggers
-     * @return  int                 <0 if KO, >0 if OK
+     * @return  int                 <0 if KO, 0 if nothing done, >0 if OK
      */
     function setValidate($fuser, $notrigger=0)
     {
@@ -1051,7 +1049,7 @@ class ExpenseReport extends CommonObject
             $dirdest = $conf->expensereport->dir_output.'/'.$newref;
             if (file_exists($dirsource))
             {
-                dol_syslog(get_class($this)."::valid() rename dir ".$dirsource." into ".$dirdest);
+                dol_syslog(get_class($this)."::setValidate() rename dir ".$dirsource." into ".$dirdest);
 
                 if (@rename($dirsource, $dirdest))
                 {
@@ -1116,8 +1114,10 @@ class ExpenseReport extends CommonObject
         }
         else
         {
-            dol_syslog(get_class($this)."::set_save expensereport already with save status", LOG_WARNING);
+            dol_syslog(get_class($this)."::setValidate expensereport already with validated status", LOG_WARNING);
         }
+        
+        return 0;
     }
 
     /**
@@ -1170,7 +1170,7 @@ class ExpenseReport extends CommonObject
      *
      * @param   User    $fuser      User
 	 * @param   int     $notrigger  Disable triggers
-     * @return  int                 <0 if KO, >0 if OK
+     * @return  int                 <0 if KO, 0 if nothing done, >0 if OK
      */
     function setApproved($fuser, $notrigger=0)
     {
@@ -1221,8 +1221,10 @@ class ExpenseReport extends CommonObject
         }
         else
         {
-            dol_syslog(get_class($this)."::set_valide expensereport already with valide status", LOG_WARNING);
+            dol_syslog(get_class($this)."::setApproved expensereport already with approve status", LOG_WARNING);
         }
+        
+        return 0;
     }
 
     /**
diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php
index 2dfdf4cb5c27eeca2ff084036e927b9b4f8a7373..99f9faf260d1946a327baaf8ea77f1da3094a0df 100644
--- a/test/phpunit/AllTests.php
+++ b/test/phpunit/AllTests.php
@@ -176,6 +176,9 @@ class AllTests
         $suite->addTestSuite('ChargeSocialesTest');
         require_once dirname(__FILE__).'/HolidayTest.php';
         $suite->addTestSuite('HolidayTest');
+        require_once dirname(__FILE__).'/ExpenseReportTest.php';
+        $suite->addTestSuite('ExpenseReportTest');
+        
         require_once dirname(__FILE__).'/EntrepotTest.php';
         $suite->addTestSuite('EntrepotTest');
         require_once dirname(__FILE__).'/MouvementStockTest.php';
diff --git a/test/phpunit/CommandeFournisseurTest.php b/test/phpunit/CommandeFournisseurTest.php
index 03880a56eca8e4c04b0742c6a294cc5f178df88e..2d615e0bd064284ac761d56cfe114501436eb88f 100644
--- a/test/phpunit/CommandeFournisseurTest.php
+++ b/test/phpunit/CommandeFournisseurTest.php
@@ -264,7 +264,7 @@ class CommandeFournisseurTest extends PHPUnit_Framework_TestCase
      * @param   Object  $localobject        Supplier order
      * @return  void
      *
-     * @depends testCommandeFournisseurValid
+     * @depends testCommandeFournisseurApprove
      * The depends says test is run only if previous is ok
      */
     public function testCommandeFournisseurCancel($localobject)
diff --git a/test/phpunit/ExpenseReportTest.php b/test/phpunit/ExpenseReportTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9af3dc1078eda4a4f84019ba3453fbeb47ffe90
--- /dev/null
+++ b/test/phpunit/ExpenseReportTest.php
@@ -0,0 +1,316 @@
+<?php
+/* Copyright (C) 2010 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * or see http://www.gnu.org/
+ */
+
+/**
+ *      \file       test/phpunit/ExpenseReportTest.php
+ *      \ingroup    test
+ *      \brief      PHPUnit test
+ *      \remarks    To run this script as CLI:  phpunit filename.php
+ */
+
+global $conf,$user,$langs,$db;
+//define('TEST_DB_FORCE_TYPE','mysql');	// This is to force using mysql driver
+//require_once 'PHPUnit/Autoload.php';
+require_once dirname(__FILE__).'/../../htdocs/master.inc.php';
+require_once dirname(__FILE__).'/../../htdocs/expensereport/class/expensereport.class.php';
+
+if (empty($user->id)) {
+    print "Load permissions for admin user nb 1\n";
+    $user->fetch(1);
+    $user->getrights();
+}
+$conf->global->MAIN_DISABLE_ALL_MAILS=1;
+
+
+
+/**
+ * Class for PHPUnit tests
+ *
+ * @backupGlobals disabled
+ * @backupStaticAttributes enabled
+ * @remarks	backupGlobals must be disabled to have db,conf,user and lang not erased.
+ */
+class ExpenseReportTest extends PHPUnit_Framework_TestCase
+{
+    protected $savconf;
+    protected $savuser;
+    protected $savlangs;
+    protected $savdb;
+
+    /**
+     * Constructor
+     * We save global variables into local variables
+     *
+     * @return ExpenseReportTest
+     */
+    function __construct()
+    {
+        //$this->sharedFixture
+        global $conf,$user,$langs,$db;
+        $this->savconf=$conf;
+        $this->savuser=$user;
+        $this->savlangs=$langs;
+        $this->savdb=$db;
+
+        print __METHOD__." db->type=".$db->type." user->id=".$user->id;
+        //print " - db ".$db->db;
+        print "\n";
+    }
+
+    // Static methods
+    public static function setUpBeforeClass()
+    {
+        global $conf,$user,$langs,$db;
+        $db->begin(); // This is to have all actions inside a transaction even if test launched without suite.
+
+        print __METHOD__."\n";
+    }
+
+    // tear down after class
+    public static function tearDownAfterClass()
+    {
+        global $conf,$user,$langs,$db;
+        $db->rollback();
+
+        print __METHOD__."\n";
+    }
+
+    /**
+     * Init phpunit tests
+     *
+     * @return  void
+     */
+    protected function setUp()
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        print __METHOD__."\n";
+        //print $db->getVersion()."\n";
+    }
+    /**
+     * End phpunit tests
+     *
+     * @return	void
+     */
+    protected function tearDown()
+    {
+        print __METHOD__."\n";
+    }
+
+    /**
+     * testExpenseReportCreate
+     *
+     * @return	void
+     */
+    public function testExpenseReportCreate()
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        // Set supplier and product to use
+        $socid=1;
+
+        // Create supplier order with a too low quantity
+        $localobject=new ExpenseReport($db);
+        $localobject->initAsSpecimen();         // Init a speciment with lines
+        $localobject->status = 0;
+        $localobject->fk_statut = 0;
+        $localobject->date_fin = null;  // Force bad value
+
+        $result=$localobject->create($user);
+        print __METHOD__." result=".$result."\n";
+        $this->assertEquals(-1, $result);       // must be -1 because of missing mandatory fields
+
+        $sql="DELETE FROM ".MAIN_DB_PREFIX."expensereport where ref=''";
+        $db->query($sql);
+
+        // Create supplier order
+        $localobject2=new ExpenseReport($db);
+        $localobject2->initAsSpecimen();        // Init a speciment with lines
+        $localobject2->status = 0;
+        $localobject2->fk_statut = 0;
+        
+        $result=$localobject2->create($user);
+        print __METHOD__." result=".$result."\n";
+        $this->assertGreaterThanOrEqual(0, $result);
+
+        return $result;
+    }
+
+
+    /**
+     * testExpenseReportFetch
+     *
+     * @param   int $id     Id of supplier order
+     * @return  void
+     *
+     * @depends testExpenseReportCreate
+     * The depends says test is run only if previous is ok
+     */
+    public function testExpenseReportFetch($id)
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        $localobject=new ExpenseReport($this->savdb);
+        $result=$localobject->fetch($id);
+
+        print __METHOD__." id=".$id." result=".$result."\n";
+        $this->assertLessThan($result, 0);
+        return $localobject;
+    }
+
+    /**
+     * testExpenseReportValid
+     *
+     * @param   Object $localobject     Supplier order
+     * @return  void
+     *
+     * @depends testExpenseReportFetch
+     * The depends says test is run only if previous is ok
+     */
+    public function testExpenseReportValid($localobject)
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        $result=$localobject->setValidate($user);
+
+        print __METHOD__." id=".$localobject->id." result=".$result."\n";
+        $this->assertLessThan($result, 0);
+        return $localobject;
+    }
+
+    /**
+     * testExpenseReportApprove
+     *
+     * @param   Object $localobject Supplier order
+     * @return  void
+     *
+     * @depends testExpenseReportValid
+     * The depends says test is run only if previous is ok
+     */
+    public function testExpenseReportApprove($localobject)
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        $result=$localobject->setApproved($user);
+
+        print __METHOD__." id=".$localobject->id." result=".$result."\n";
+        $this->assertLessThan($result, 0);
+        return $localobject;
+    }
+
+    /**
+     * testExpenseReportCancel
+     *
+     * @param   Object  $localobject        Supplier order
+     * @return  void
+     *
+     * @depends testExpenseReportApprove
+     * The depends says test is run only if previous is ok
+     */
+    public function testExpenseReportCancel($localobject)
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        $result=$localobject->set_cancel($user, 'Because...');
+
+        print __METHOD__." id=".$localobject->id." result=".$result."\n";
+        $this->assertLessThan($result, 0);
+        return $localobject;
+    }
+
+    /**
+     * testExpenseReportOther
+     *
+     * @param   Object $localobject     Supplier order
+     * @return  void
+     *
+     * @depends testExpenseReportCancel
+     * The depends says test is run only if previous is ok
+     */
+    public function testExpenseReportOther($localobject)
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        /*$result=$localobject->setstatus(0);
+        print __METHOD__." id=".$localobject->id." result=".$result."\n";
+        $this->assertLessThan($result, 0);
+        */
+
+        /*$localobject->info($localobject->id);
+        print __METHOD__." localobject->date_creation=".$localobject->date_creation."\n";
+        $this->assertNotEquals($localobject->date_creation, '');
+        */
+
+        return $localobject->id;
+    }
+
+    /**
+     * testExpenseReportDelete
+     *
+     * @param   int $id     Id of order
+     * @return  void
+     *
+     * @depends testExpenseReportOther
+     * The depends says test is run only if previous is ok
+     */
+    public function testExpenseReportDelete($id)
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        $localobject=new ExpenseReport($this->savdb);
+        $result=$localobject->fetch($id);
+        $result=$localobject->delete($user);
+
+        print __METHOD__." id=".$id." result=".$result."\n";
+        $this->assertLessThan($result, 0);
+        return $result;
+    }
+
+}