diff --git a/htdocs/webservices/demo_wsclient_project.php-NORUN b/htdocs/webservices/demo_wsclient_project.php-NORUN
new file mode 100644
index 0000000000000000000000000000000000000000..ef39673976dcf23aba78debe4a7d5135da1d5b85
--- /dev/null
+++ b/htdocs/webservices/demo_wsclient_project.php-NORUN
@@ -0,0 +1,154 @@
+<?php
+/* Copyright (C) 2006-2010 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2016      Ion Agorria          <ion@agorria.com>
+ *
+ * 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/>.
+ */
+
+/**
+ *       \file       htdocs/webservices/demo_wsclient_project.php
+ *       \brief      Demo page to make a client call to Dolibarr WebServices "server_project"
+ */
+
+// This is to make Dolibarr working with Plesk
+set_include_path($_SERVER['DOCUMENT_ROOT'].'/htdocs');
+
+require_once '../master.inc.php';
+require_once NUSOAP_PATH.'/nusoap.php';		// Include SOAP
+
+$WS_DOL_URL = DOL_MAIN_URL_ROOT.'/webservices/server_project.php';
+//$WS_DOL_URL = 'http://localhost:8080/';	// To test with Soapui mock. If not a page, should end with /
+$WS_METHOD1 = 'createProject';
+$WS_METHOD2 = 'getProject';
+$ns='http://www.dolibarr.org/ns/';
+
+
+// Set the WebService URL
+dol_syslog("Create nusoap_client for URL=".$WS_DOL_URL);
+$soapclient = new nusoap_client($WS_DOL_URL);
+if ($soapclient)
+{
+    $soapclient->soap_defencoding='UTF-8';
+    $soapclient->decodeUTF8(false);
+}
+
+
+// Call the WebService method and store its result in $result.
+$authentication=array(
+    'dolibarrkey'=>$conf->global->WEBSERVICES_KEY,
+    'sourceapplication'=>'DEMO',
+    'login'=>'admin',
+    'password'=>'changeme',
+    'entity'=>'');
+
+
+// Test url 1
+if ($WS_METHOD1)
+{
+    $parameters = array(
+        'authentication'=>$authentication,
+        'project'=>array(
+            'ref'=>'REF_TEST_WS',
+            'label'=>'LABEL_WS',
+            'thirdparty_id'=>'1234',
+            'public'=>'1',
+            'status'=>'0',
+            'date_start'=>'2016-04-07T21:24:19Z',
+            'date_end'=>'2016-04-08T08:13:42Z',
+            'budget'=>'1234',
+            'description'=>'DESCRIPTION_WS',
+        )
+    );
+    dol_syslog("Call method ".$WS_METHOD1);
+    $result1 = $soapclient->call($WS_METHOD1,$parameters,$ns,'');
+    if (! $result1)
+    {
+        print $soapclient->error_str;
+        print "<br>\n\n";
+        print $soapclient->request;
+        print "<br>\n\n";
+        print $soapclient->response;
+        exit;
+    }
+}
+
+// Test url 2
+if ($WS_METHOD2)
+{
+    $parameters = array(
+        'authentication'=>$authentication,
+        'id'=>'',
+        'ref'=>'REF_TEST_WS'
+    );
+    dol_syslog("Call method ".$WS_METHOD2);
+    $result2 = $soapclient->call($WS_METHOD2,$parameters,$ns,'');
+    if (! $result2)
+    {
+        print $soapclient->error_str;
+        print "<br>\n\n";
+        print $soapclient->request;
+        print "<br>\n\n";
+        print $soapclient->response;
+        exit;
+    }
+}
+
+
+/*
+ * View
+ */
+
+header("Content-type: text/html; charset=utf8");
+print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'."\n";
+echo '<html>'."\n";
+echo '<head>';
+echo '<title>WebService Test: '.$WS_METHOD1.'</title>';
+echo '</head>'."\n";
+
+echo '<body>'."\n";
+echo 'NUSOAP_PATH='.NUSOAP_PATH.'<br>';
+
+echo "<h2>Request:</h2>";
+echo '<h4>Function</h4>';
+echo $WS_METHOD1;
+echo '<h4>SOAP Message</h4>';
+echo '<pre>' . htmlspecialchars($soapclient1->request, ENT_QUOTES) . '</pre>';
+//echo '<hr>';
+echo "<h2>Response:</h2>";
+echo '<h4>Result</h4>';
+echo '<pre>';
+print_r($result1);
+echo '</pre>';
+echo '<h4>SOAP Message</h4>';
+echo '<pre>' . htmlspecialchars($soapclient1->response, ENT_QUOTES) . '</pre>';
+
+print '<hr>';
+
+echo "<h2>Request:</h2>";
+echo '<h4>Function</h4>';
+echo $WS_METHOD2;
+echo '<h4>SOAP Message</h4>';
+echo '<pre>' . htmlspecialchars($soapclient2->request, ENT_QUOTES) . '</pre>';
+//echo '<hr>';
+echo "<h2>Response:</h2>";
+echo '<h4>Result</h4>';
+echo '<pre>';
+print_r($result2);
+echo '</pre>';
+echo '<h4>SOAP Message</h4>';
+echo '<pre>' . htmlspecialchars($soapclient2->response, ENT_QUOTES) . '</pre>';
+
+echo '</body>'."\n";
+echo '</html>'."\n";
+?>
diff --git a/htdocs/webservices/server_project.php b/htdocs/webservices/server_project.php
new file mode 100644
index 0000000000000000000000000000000000000000..078295e2ac9e779a2e295867c29fa5470a7422d2
--- /dev/null
+++ b/htdocs/webservices/server_project.php
@@ -0,0 +1,433 @@
+<?php
+/* Copyright (C) 2006-2010 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2016      Ion Agorria          <ion@agorria.com>
+ *
+ * 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/>.
+ */
+
+/**
+ *       \file       htdocs/webservices/server_project.php
+ *       \brief      File that is entry point to call Dolibarr WebServices
+ */
+
+// This is to make Dolibarr working with Plesk
+set_include_path($_SERVER['DOCUMENT_ROOT'].'/htdocs');
+
+require_once '../master.inc.php';
+require_once NUSOAP_PATH.'/nusoap.php';        // Include SOAP
+require_once DOL_DOCUMENT_ROOT.'/core/lib/ws.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
+require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
+
+
+dol_syslog("Call Dolibarr webservices interfaces");
+
+$langs->load("main");
+
+// Enable and test if module web services is enabled
+if (empty($conf->global->MAIN_MODULE_WEBSERVICES))
+{
+    $langs->load("admin");
+    dol_syslog("Call Dolibarr webservices interfaces with module webservices disabled");
+    print $langs->trans("WarningModuleNotActive",'WebServices').'.<br><br>';
+    print $langs->trans("ToActivateModule");
+    exit;
+}
+
+// Create associated types array, with each table
+$listofreferent=array(
+    'propal' => 'propal',
+    'order' => 'commande',
+    'invoice' => 'facture',
+    'invoice_predefined' => 'facture_rec',
+    'proposal_supplier' => 'commande_fournisseur',
+    'order_supplier' => 'commande_fournisseur',
+    'invoice_supplier' => 'facture_fourn',
+    'contract' => 'contrat',
+    'intervention' => 'fichinter',
+    'trip' => 'deplacement',
+    'expensereport' => 'expensereport_det',
+    'donation' => 'don',
+    'agenda' => 'actioncomm',
+    'project_task' => 'projet_task',
+);
+
+// Create the soap Object
+$server = new nusoap_server();
+$server->soap_defencoding='UTF-8';
+$server->decode_utf8=false;
+$ns='http://www.dolibarr.org/ns/';
+$server->configureWSDL('WebServicesDolibarrOther',$ns);
+$server->wsdl->schemaTargetNamespace=$ns;
+
+// Define WSDL Authentication object
+$server->wsdl->addComplexType(
+    'authentication',
+    'complexType',
+    'struct',
+    'all',
+    '',
+    array(
+        'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
+        'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
+        'login' => array('name'=>'login','type'=>'xsd:string'),
+        'password' => array('name'=>'password','type'=>'xsd:string'),
+        'entity' => array('name'=>'entity','type'=>'xsd:string'),
+    )
+);
+
+// Define WSDL Return object
+$server->wsdl->addComplexType(
+    'result',
+    'complexType',
+    'struct',
+    'all',
+    '',
+    array(
+        'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
+        'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
+    )
+);
+
+// Define other specific objects
+$server->wsdl->addComplexType(
+    'element',
+    'complexType',
+    'struct',
+    'all',
+    '',
+    array(
+        'id' => array('name'=>'id','type'=>'xsd:int'),
+        'user' => array('name'=>'user','type'=>'xsd:int'),
+    )
+);
+
+$server->wsdl->addComplexType(
+    'elementsArray',
+    'complexType',
+    'array',
+    'sequence',
+    '',
+    array(
+        'elements' => array(
+            'name' => 'elementsArray',
+            'type' => 'tns:element',
+            'minOccurs' => '0',
+            'maxOccurs' => 'unbounded'
+        )
+    )
+);
+
+$project_elements = array();
+foreach($listofreferent as $key => $_)
+{
+    $project_elements[$key] = array('name'=>$key,'type'=>'tns:elementsArray');
+}
+$server->wsdl->addComplexType(
+    'elements',
+    'complexType',
+    'struct',
+    'all',
+    '',
+    $project_elements
+);
+
+// Define project
+$project_fields = array(
+    'id' => array('name'=>'id','type'=>'xsd:string'),
+    'ref' => array('name'=>'ref','type'=>'xsd:string'),
+    'label' => array('name'=>'label','type'=>'xsd:string'),
+    'thirdparty_id' => array('name'=>'thirdparty_id','type'=>'xsd:int'),
+    'public' => array('name'=>'public','type'=>'xsd:int'),
+    'status' => array('name'=>'status','type'=>'xsd:int'),
+    'date_start' => array('name'=>'date_start','type'=>'xsd:date'),
+    'date_end' => array('name'=>'date_end','type'=>'xsd:date'),
+    'budget' => array('name'=>'budget','type'=>'xsd:int'),
+    'description' => array('name'=>'description','type'=>'xsd:string'),
+    'elements' => array('name'=>'elements','type'=>'tns:elements')
+);
+
+//Retreive all extrafield for thirdsparty
+// fetch optionals attributes and labels
+$extrafields=new ExtraFields($db);
+$extralabels=$extrafields->fetch_name_optionals_label('project',true);
+if (count($extrafields)>0) {
+    $extrafield_array = array();
+}
+foreach($extrafields->attribute_label as $key=>$label)
+{
+    //$value=$object->array_options["options_".$key];
+    $type =$extrafields->attribute_type[$key];
+    if ($type=='date' || $type=='datetime') {$type='xsd:dateTime';}
+    else {$type='xsd:string';}
+    $extrafield_array['options_'.$key]=array('name'=>'options_'.$key,'type'=>$type);
+}
+$project_fields=array_merge($project_fields,$extrafield_array);
+
+$server->wsdl->addComplexType(
+    'project',
+    'complexType',
+    'struct',
+    'all',
+    '',
+    $project_fields
+);
+
+// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped
+// Style merely dictates how to translate a WSDL binding to a SOAP message. Nothing more. You can use either style with any programming model.
+// http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/
+$styledoc='rpc';       // rpc/document (document is an extend into SOAP 1.0 to support unstructured messages)
+$styleuse='encoded';   // encoded/literal/literal wrapped
+// Better choice is document/literal wrapped but literal wrapped not supported by nusoap.
+
+// Register WSDL
+$server->register(
+    'createProject',
+    // Entry values
+    array('authentication'=>'tns:authentication','project'=>'tns:project'),
+    // Exit values
+    array('result'=>'tns:result','id'=>'xsd:string','ref'=>'xsd:string'),
+    $ns,
+    $ns.'#createProject',
+    $styledoc,
+    $styleuse,
+    'WS to create project'
+);
+
+// Register WSDL
+$server->register(
+    'getProject',
+    // Entry values
+    array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string'),
+    // Exit values
+    array('result'=>'tns:result','project'=>'tns:project'),
+    $ns,
+    $ns.'#getProject',
+    $styledoc,
+    $styleuse,
+    'WS to get project'
+);
+
+// Full methods code
+/**
+ * Create project
+ *
+ * @param	array		$authentication		Array of authentication information
+ * @param	array		$project			Project info
+ * @return	int								Id of new order
+ */
+function createProject($authentication, $project)
+{
+    global $db,$conf;
+
+    dol_syslog("Function: createProject login=".$authentication['login']);
+
+    if ($authentication['entity']) $conf->entity=$authentication['entity'];
+
+    // Init and check authentication
+    $objectresp=array();
+    $errorcode='';$errorlabel='';
+    $error=0;
+    $fuser=check_authentication($authentication,$error,$errorcode,$errorlabel);
+    // Check parameters
+    if (empty($project['ref']))
+    {
+        $error++; $errorcode='KO'; $errorlabel="Name is mandatory.";
+    }
+
+
+    if (! $error)
+    {
+        $fuser->getrights();
+
+        if ($fuser->rights->projet->creer)
+        {
+            $newobject=new Project($db);
+            $newobject->ref=$project['ref'];
+            $newobject->title=$project['label'];
+            $newobject->socid=$project['thirdparty_id'];
+            $newobject->public=$project['public'];
+            $newobject->statut=$project['status'];
+            $newobject->date_start=dol_stringtotime($project['date_start'],'dayrfc');
+            $newobject->date_end=dol_stringtotime($project['date_end'],'dayrfc');
+            $newobject->budget_amount=$project['budget'];
+            $newobject->description=$project['description'];
+
+            // Retrieve all extrafields for project
+            // fetch optionals attributes and labels
+            $extrafields=new ExtraFields($db);
+            $extralabels=$extrafields->fetch_name_optionals_label('project',true);
+            foreach($extrafields->attribute_label as $key=>$label)
+            {
+                $key='options_'.$key;
+                $newobject->array_options[$key]=$project[$key];
+            }
+
+            $db->begin();
+
+            $result = $newobject->create($fuser);
+            if (! $error && $result > 0)
+            {
+                // Add myself as project leader
+                $result = $newobject->add_contact($fuser->id, 'PROJECTLEADER', 'internal');
+                if ($result < 0)
+                {
+                    $error++;
+                }
+            }
+            else
+            {
+                $error++;
+            }
+
+            if (! $error)
+            {
+                $db->commit();
+                $objectresp=array('result'=>array('result_code'=>'OK', 'result_label'=>''),'id'=>$newobject->id,'ref'=>$newobject->ref);
+            }
+            else
+            {
+                $db->rollback();
+                $error++;
+                $errorcode='KO';
+                $errorlabel=$newobject->error;
+            }
+        }
+        else
+        {
+            $error++;
+            $errorcode='PERMISSION_DENIED'; $errorlabel='User does not have permission for this request';
+        }
+    }
+
+    if ($error)
+    {
+        $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel));
+    }
+
+    return $objectresp;
+}
+
+/**
+ * Get a project
+ *
+ * @param	array		$authentication		Array of authentication information
+ * @param	string		$id		    		internal id
+ * @param	string		$ref		    	internal reference
+ * @return	array							Array result
+ */
+function getProject($authentication,$id='',$ref='')
+{
+    global $db,$conf,$langs;
+
+    dol_syslog("Function: getProject login=".$authentication['login']." id=".$id." ref=".$ref);
+
+    if ($authentication['entity']) $conf->entity=$authentication['entity'];
+
+    // Init and check authentication
+    $objectresp=array();
+    $errorcode='';$errorlabel='';
+    $error=0;
+    $fuser=check_authentication($authentication,$error,$errorcode,$errorlabel);
+    // Check parameters
+    if (! $error && (($id && $ref)))
+    {
+        $error++;
+        $errorcode='BAD_PARAMETERS'; $errorlabel="Parameter id and ref can't be both provided. You must choose one or other but not both.";
+    }
+
+    if (! $error)
+    {
+        $fuser->getrights();
+
+        if ($fuser->rights->projet->lire)
+        {
+            $project=new Project($db);
+            $result=$project->fetch($id,$ref);
+            if ($result > 0)
+            {
+                $project_result_fields=array(
+                    'id' => $project->id,
+                    'ref' => $project->ref,
+                    'label' => $project->title,
+                    'thirdparty_id' => $project->socid,
+                    'public' => $project->public,
+                    'status' => $project->statut,
+                    'date_start' => $project->date_start ? dol_print_date($project->date_start, 'dayrfc') : '',
+                    'date_end' => $project->date_end ? dol_print_date($project->date_end, 'dayrfc') : '',
+                    'budget' => $project->budget_amount,
+                    'description' => $project->description,
+                );
+
+                //Retrieve all extrafields for project
+                $extrafields=new ExtraFields($db);
+                $extralabels=$extrafields->fetch_name_optionals_label('societe',true);
+
+                //Get extrafield values
+                $project->fetch_optionals($project->id,$extralabels);
+                foreach($extrafields->attribute_label as $key=>$label)
+                {
+                    $project_result_fields=array_merge($project_result_fields,array('options_'.$key => $project->array_options['options_'.$key]));
+                }
+
+                //Get linked elements
+                global $listofreferent;
+                $elements = array();
+                foreach ($listofreferent as $key => $tablename)
+                {
+                    $elements[$key] = array();
+                    $element_array = $project->get_element_list($key, $tablename);
+                    if (count($element_array) > 0 && is_array($element_array))
+                    {
+                        foreach ($element_array as $element)
+                        {
+                            $tmp = explode('_', $element);
+                            $idofelement = count($tmp) > 0? $tmp[0] : "";
+                            $idofelementuser = count($tmp) > 1? $tmp[1] : "";
+                            $elements[$key][] = array('id' => $idofelement, 'user' => $idofelementuser);
+                        }
+                    }
+                }
+                $project_result_fields['elements'] = $elements;
+
+                //Result
+                $objectresp = array(
+                    'result'=>array('result_code'=>'OK', 'result_label'=>''),
+                    'project'=>$project_result_fields
+                );
+            }
+            else
+            {
+                $error++;
+                $errorcode='NOT_FOUND'; $errorlabel='Object not found for id='.$id.' nor ref='.$ref;
+            }
+        }
+        else
+        {
+            $error++;
+            $errorcode='PERMISSION_DENIED'; $errorlabel='User does not have permission for this request';
+        }
+    }
+
+    if ($error)
+    {
+        $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel));
+    }
+
+    return $objectresp;
+}
+
+// Return the results.
+$server->service(file_get_contents("php://input"));