diff -rU5 mantisbt-1.2.14/api/soap/mantisconnect.wsdl mantisbt-1.2.14-wepl/api/soap/mantisconnect.wsdl
--- mantisbt-1.2.14/api/soap/mantisconnect.wsdl	2013-01-22 15:07:11.000000000 +0100
+++ mantisbt-1.2.14-wepl/api/soap/mantisconnect.wsdl	2013-02-01 20:12:07.000000000 +0100
@@ -28,10 +28,11 @@
   <xsd:all>
    <xsd:element name="id" type="xsd:integer" minOccurs="0"/>
    <xsd:element name="name" type="xsd:string" minOccurs="0"/>
    <xsd:element name="real_name" type="xsd:string" minOccurs="0"/>
    <xsd:element name="email" type="xsd:string" minOccurs="0"/>
+   <xsd:element name="access" type="xsd:integer" minOccurs="0"/>
   </xsd:all>
  </xsd:complexType>
  <xsd:complexType name="UserData">
   <xsd:all>
    <xsd:element name="account_data" type="tns:AccountData" minOccurs="0"/>
@@ -190,10 +191,11 @@
   </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="ProjectData">
   <xsd:all>
    <xsd:element name="id" type="xsd:integer" minOccurs="0"/>
+   <xsd:element name="parent_id" type="xsd:integer" minOccurs="0"/>
    <xsd:element name="name" type="xsd:string" minOccurs="0"/>
    <xsd:element name="status" type="tns:ObjectRef" minOccurs="0"/>
    <xsd:element name="enabled" type="xsd:boolean" minOccurs="0"/>
    <xsd:element name="view_state" type="tns:ObjectRef" minOccurs="0"/>
    <xsd:element name="access_min" type="tns:ObjectRef" minOccurs="0"/>
@@ -756,10 +758,30 @@
   <part name="username" type="xsd:string" />
   <part name="password" type="xsd:string" />
   <part name="tag_id" type="xsd:integer" /></message>
 <message name="mc_tag_deleteResponse">
   <part name="return" type="xsd:boolean" /></message>
+<message name="mc_account_addRequest">
+  <part name="username" type="xsd:string" />
+  <part name="password" type="xsd:string" />
+  <part name="account" type="tns:AccountData" />
+  <part name="account_password" type="xsd:string" /></message>
+<message name="mc_account_addResponse">
+  <part name="return" type="xsd:integer" /></message>
+<message name="mc_project_add_userRequest">
+  <part name="username" type="xsd:string" />
+  <part name="password" type="xsd:string" />
+  <part name="project_id" type="xsd:integer" />
+  <part name="user_id" type="xsd:integer" />
+  <part name="access" type="xsd:integer" /></message>
+<message name="mc_project_add_userResponse">
+  <part name="return" type="xsd:integer" /></message>
+<message name="mc_projects_get_names_user_accessibleRequest">
+  <part name="username" type="xsd:string" />
+  <part name="password" type="xsd:string" /></message>
+<message name="mc_projects_get_names_user_accessibleResponse">
+  <part name="return" type="tns:ProjectDataArray" /></message>
 <portType name="MantisConnectPortType">
   <operation name="mc_version">
     <input message="tns:mc_versionRequest"/>
     <output message="tns:mc_versionResponse"/>
   </operation>
@@ -1081,10 +1103,25 @@
   <operation name="mc_tag_delete">
     <documentation>Deletes a tag.</documentation>
     <input message="tns:mc_tag_deleteRequest"/>
     <output message="tns:mc_tag_deleteResponse"/>
   </operation>
+  <operation name="mc_account_add">
+    <documentation>Add a new user to the tracker (must have admin privileges).</documentation>
+    <input message="tns:mc_account_addRequest"/>
+    <output message="tns:mc_account_addResponse"/>
+  </operation>
+  <operation name="mc_project_add_user">
+    <documentation>Add a user to a project with access level.</documentation>
+    <input message="tns:mc_project_add_userRequest"/>
+    <output message="tns:mc_project_add_userResponse"/>
+  </operation>
+  <operation name="mc_projects_get_names_user_accessible">
+    <documentation>Get the list of name/id of projects that are accessible to the logged in user.</documentation>
+    <input message="tns:mc_projects_get_names_user_accessibleRequest"/>
+    <output message="tns:mc_projects_get_names_user_accessibleResponse"/>
+  </operation>
 </portType>
 <binding name="MantisConnectBinding" type="tns:MantisConnectPortType">
   <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
   <operation name="mc_version">
     <soap:operation soapAction="http://www.mantisbt.org/bugs/api/soap/mantisconnect.php/mc_version" style="rpc"/>
@@ -1409,12 +1446,27 @@
   <operation name="mc_tag_delete">
     <soap:operation soapAction="http://www.mantisbt.org/bugs/api/soap/mantisconnect.php/mc_tag_delete" style="rpc"/>
     <input><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
     <output><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>
   </operation>
+  <operation name="mc_account_add">
+    <soap:operation soapAction="http://www.mantisbt.org/bugs/api/soap/mantisconnect.php/mc_account_add" style="rpc"/>
+    <input><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
+    <output><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>
+  </operation>
+  <operation name="mc_project_add_user">
+    <soap:operation soapAction="http://www.mantisbt.org/bugs/api/soap/mantisconnect.php/mc_project_add_user" style="rpc"/>
+    <input><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
+    <output><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>
+  </operation>
+  <operation name="mc_projects_get_names_user_accessible">
+    <soap:operation soapAction="http://www.mantisbt.org/bugs/api/soap/mantisconnect.php/mc_projects_get_names_user_accessible" style="rpc"/>
+    <input><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
+    <output><soap:body use="encoded" namespace="http://futureware.biz/mantisconnect" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>
+  </operation>
 </binding>
 <service name="MantisConnect">
   <port name="MantisConnectPort" binding="tns:MantisConnectBinding">
     <soap:address location="http://www.mantisbt.org/bugs/api/soap/mantisconnect.php"/>
   </port>
 </service>
-</definitions>
\ No newline at end of file
+</definitions>
diff -rU5 mantisbt-1.2.14/api/soap/mc_account_api.php mantisbt-1.2.14-wepl/api/soap/mc_account_api.php
--- mantisbt-1.2.14/api/soap/mc_account_api.php	2013-01-22 15:07:11.000000000 +0100
+++ mantisbt-1.2.14-wepl/api/soap/mc_account_api.php	2013-02-02 12:32:50.000000000 +0100
@@ -35,5 +35,45 @@
         $t_result[] = mci_account_get_array_by_id( $t_user_id );
     }
     
     return $t_result;
 }
+
+/** 
+* Add a new user.
+*
+* @param string $p_username  The name of the user trying to create an account.
+* @param string $p_password  The password of the user.
+* @param Array $p_user A new AccountData structure
+* @return integer The new users's users_id
+*/
+function mc_account_add( $p_username, $p_password, $p_user, $p_pass ) {
+	$t_user_id = mci_check_login( $p_username, $p_password );               
+	if ( $t_user_id === false ) {
+		return mci_soap_fault_login_failed();
+	}
+	if ( !mci_has_administrator_access( $t_user_id ) ) {
+		return mci_soap_fault_access_denied( $t_user_id );
+	}
+
+	$p_user = SoapObjectsFactory::unwrapObject( $p_user );
+
+	// validate user attributes
+	if ( is_blank($p_user['name']) ) return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field "name" was missing');
+	if ( is_blank($p_user['real_name']) ) return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field "real_name" was missing');
+	if ( is_blank($p_user['email']) ) return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field "email" was missing');
+
+	if ( !user_is_name_valid( $p_user['name'] ) ) return SoapObjectsFactory::newSoapFault( 'Client', 'user name invalid');
+	if ( !user_is_name_unique( $p_user['name'] ) ) return SoapObjectsFactory::newSoapFault( 'Client', 'user name exists');
+	if ( !user_is_realname_valid( $p_user['real_name'] ) ) return SoapObjectsFactory::newSoapFault( 'Client', 'real name invalid');
+
+	// set defaults
+	if ( is_null( $p_user['access'] ) ) $p_user['access'] = VIEWER;
+
+	// create user account
+	if ( !user_create($p_user['name'], $p_pass, $p_user['email'], $p_user['access'], false, true, $p_user['real_name']))
+		return SoapObjectsFactory::newSoapFault( 'Client', 'user could not be created');
+
+	// return id of new user back to caller
+	return user_get_id_by_name($p_user['name']);
+}
+
diff -rU5 mantisbt-1.2.14/api/soap/mc_api.php mantisbt-1.2.14-wepl/api/soap/mc_api.php
--- mantisbt-1.2.14/api/soap/mc_api.php	2013-01-22 15:07:11.000000000 +0100
+++ mantisbt-1.2.14-wepl/api/soap/mc_api.php	2013-02-01 18:19:44.000000000 +0100
@@ -351,10 +351,24 @@
 	}
 
 	return $t_result;
 }
 
+# Gets the name/id of all sub-projects that are accessible to the specified user / project.
+function mci_user_get_names_accessible_subprojects( $p_user_id, $p_parent_project_id ) {
+	$t_result = array();
+	foreach( user_get_accessible_subprojects( $p_user_id, $p_parent_project_id ) as $t_subproject_id ) {
+		$t_subproject_row = project_cache_row( $t_subproject_id );
+		$t_subproject = array();
+		$t_subproject['id'] = $t_subproject_id;
+		$t_subproject['name'] = $t_subproject_row['name'];
+		$t_subproject['subprojects'] = mci_user_get_names_accessible_subprojects( $p_user_id, $t_subproject_id );
+		$t_result[] = $t_subproject;
+	}
+	return $t_result;
+}
+
 function translate_category_name_to_id( $p_category_name, $p_project_id ) {
 	if ( !isset( $p_category_name ) ) {
 		return 0;
 	}
 
diff -rU5 mantisbt-1.2.14/api/soap/mc_project_api.php mantisbt-1.2.14-wepl/api/soap/mc_project_api.php
--- mantisbt-1.2.14/api/soap/mc_project_api.php	2013-01-22 15:07:11.000000000 +0100
+++ mantisbt-1.2.14-wepl/api/soap/mc_project_api.php	2013-02-01 20:56:52.000000000 +0100
@@ -78,10 +78,42 @@
 
 	return $t_result;
 }
 
 /**
+ * Get (only) the id and name for all projects accessible by the given user.
+ *
+ * @param string $p_username  The name of the user trying to access the project list.
+ * @param string $p_password  The password of the user.
+ * @return Array  suitable to be converted into a ProjectDataArray
+ */
+function mc_projects_get_names_user_accessible( $p_username, $p_password ) {
+	$t_user_id = mci_check_login( $p_username, $p_password );
+	if( $t_user_id === false ) {
+		return mci_soap_fault_login_failed();
+	}
+
+	if( !mci_has_readonly_access( $t_user_id ) ) {
+		return mci_soap_fault_access_denied( $t_user_id );
+	}
+
+	$t_lang = mci_get_user_lang( $t_user_id );
+
+	$t_result = array();
+	foreach( user_get_accessible_projects( $t_user_id ) as $t_project_id ) {
+		$t_project_row = project_cache_row( $t_project_id );
+		$t_project = array();
+		$t_project['id'] = $t_project_id;
+		$t_project['name'] = $t_project_row['name'];
+		$t_project['subprojects'] = mci_user_get_names_accessible_subprojects( $t_user_id, $t_project_id, $t_lang );
+		$t_result[] = $t_project;
+	}
+
+	return $t_result;
+}
+
+/**
  * Get all categories of a project.
  *
  * @param string $p_username  The name of the user trying to access the categories.
  * @param string $p_password  The password of the user.
  * @param integer $p_project_id  The id of the project to retrieve the categories for.
@@ -739,20 +771,41 @@
 		$t_inherit_global = $p_project['inherit_global'];
 	} else {
 		$t_inherit_global = true;
 	}
 	
+	if ( isset( $p_project['parent_id'] ) ) {
+		$t_parent_id = $p_project['parent_id'];
+		if ( !project_exists( $t_parent_id ) ) {
+			return SoapObjectsFactory::newSoapFault( 'Client', 'Parent project does not exist');
+		}
+	} else {
+		$t_parent_id = false;
+	}
+
 	// check to make sure project doesn't already exist
 	if( !project_is_name_unique( $t_name ) ) {
 		return SoapObjectsFactory::newSoapFault( 'Client', 'Project name exists');
 	}
 
 	$t_project_status = mci_get_project_status_id( $t_status );
 	$t_project_view_state = mci_get_project_view_state_id( $t_view_state );
 
 	// project_create returns the new project's id, spit that out to webservice caller
-	return project_create( $t_name, $t_description, $t_project_status, $t_project_view_state, $t_file_path, $t_enabled, $t_inherit_global );
+	$t_project_id = project_create( $t_name, $t_description, $t_project_status, $t_project_view_state, $t_file_path, $t_enabled, $t_inherit_global );
+
+	// link new project to a parent project, if one has been specified
+	if ( $t_parent_id ) {
+		// link to parent
+		project_hierarchy_add($t_project_id, $t_parent_id);
+
+		// copy custom fields from parent
+		project_copy_custom_fields($t_project_id, $t_parent_id);
+	}
+
+	// return id of new project back to caller
+	return $t_project_id;
 }
 
 /**
  * Update a project
  *
@@ -888,10 +941,43 @@
 
 	return $t_result;
 }
 
 /**
+ * Link a user to a project with a specified access level.
+ *
+ * @param string $p_username  The name of the user trying to add the user (must be administrator)
+ * @param string $p_password  The password of the user.
+ * @param integer $p_project_id  The id of the project to link user to.
+ * @param integer $p_user_id  The id of the user to link to the project.
+ * @param integer $p_access access level.
+ * @return bool returns true or false depending on the success of the action
+ */
+function mc_project_add_user( $p_username, $p_password, $p_project_id, $p_user_id, $p_access ) {
+	$t_user_id = mci_check_login( $p_username, $p_password );
+	if( $t_user_id === false ) {
+		return mci_soap_fault_login_failed();
+	}
+
+	if( !mci_has_administrator_access( $t_user_id ) ) {
+		return mci_soap_fault_access_denied( $t_user_id );
+	}
+
+	if ( !project_exists( $p_project_id ) ) {
+		return SoapObjectsFactory::newSoapFault( 'Client', "Project '$p_project_id' does not exist." );
+	}
+	if ( !user_exists( $p_user_id ) ) {
+		return SoapObjectsFactory::newSoapFault( 'Client', "User '$p_user_id' does not exist." );
+	}
+
+	// add the user to the project
+	$t_status = project_set_user_access( $p_project_id, $p_user_id, $p_access );
+
+	return $t_status;
+}
+
+/**
  * Get appropriate users assigned to a project by access level.
  *
  * @param string $p_username  The name of the user trying to access the versions.
  * @param string $p_password  The password of the user.
  * @param integer $p_project_id  The id of the project to retrieve the users for.
