diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php
index cdf20fb30dcebb58b3847ec15e04418a57ee2601..efadebca3587ecb338a9ce6f26fcc3da16f79b84 100644
--- a/include/ajax.tickets.php
+++ b/include/ajax.tickets.php
@@ -457,11 +457,13 @@ class TicketsAjaxAPI extends AjaxController {
                 || !$ticket->checkStaffAccess($thisstaff))
             Http::response(404, 'No such ticket');
 
-        $errors = $info = array();
-        $user = null;
-        $form = UserForm::getInstance();
-        if ($form->isValid())
-            $user = User::fromForm($form->getClean());
+        $user = $form = null;
+        if (isset($_POST['id']) && $_POST['id']) { //Existing user/
+            $user =  User::lookup($_POST['id']);
+        } else { //We're creating a new user!
+            $form = UserForm::getUserForm()->getForm($_POST);
+            $user = User::fromForm($form);
+        }
 
         if ($user && ($c=$ticket->addCollaborator($user, $errors))) {
             $info +=array('msg' => sprintf('%s added as a collaborator',
diff --git a/include/ajax.users.php b/include/ajax.users.php
index bbc19fc72a3a7169841d6addc3d47262853fbe2c..5126ca1218e2f7cf0c71687b0dc0fc27302ffec0 100644
--- a/include/ajax.users.php
+++ b/include/ajax.users.php
@@ -66,22 +66,10 @@ class UsersAjaxAPI extends AjaxController {
 
     function addUser() {
 
-        $valid = true;
         $form = UserForm::getUserForm()->getForm($_POST);
-        if (!$form->isValid())
-            $valid  = false;
-
-        if (($field=$form->getField('email'))
-                && $field->getClean()
-                && User::lookup(array('emails__address'=>$field->getClean()))) {
-            $field->addError('Email is assigned to another user');
-            $valid = false;
-        }
-
-        if ($valid && ($user = User::fromForm($form->getClean())))
+        if (($user = User::fromForm($form)))
             Http::response(201, $user->to_json());
 
-
         $info = array('error' =>'Error adding user - try again!');
 
         return self::_lookupform($form, $info);
diff --git a/include/class.ticket.php b/include/class.ticket.php
index aab67fb65735e5cb181523806b98c0ef70252b16..e61bdf05d954bbd77c6bee69e40f59af16f7a817 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -2111,7 +2111,7 @@ class Ticket {
             if (!$user) {
                 $user_form = UserForm::getUserForm()->getForm($vars);
                 if (!$user_form->isValid($field_filter)
-                        || !($user=User::fromForm($user_form->getClean())))
+                        || !($user=User::fromVars($user_form->getClean())))
                     $errors['user'] = 'Incomplete client information';
             }
         }
diff --git a/include/class.user.php b/include/class.user.php
index 36823db840c296f6b03414c3cb6eb7bf6b20c5b4..85a01d784b52f0084ed6a6504a754da05606b13b 100644
--- a/include/class.user.php
+++ b/include/class.user.php
@@ -76,26 +76,46 @@ class User extends UserModel {
             $this->default_email = UserEmail::lookup($ht['default_email_id']);
     }
 
-    static function fromForm($data=false) {
+    static function fromVars($vars=false) {
         // Try and lookup by email address
-        $user = User::lookup(array('emails__address'=>$data['email']));
+        $user = User::lookup(array('emails__address'=>$vars['email']));
         if (!$user) {
             $user = User::create(array(
-                'name'=>$data['name'],
+                'name'=>$vars['name'],
                 'created'=>new SqlFunction('NOW'),
                 'updated'=>new SqlFunction('NOW'),
                 'default_email'=>
-                    UserEmail::create(array('address'=>$data['email']))
+                    UserEmail::create(array('address'=>$vars['email']))
             ));
             $user->save(true);
             $user->emails->add($user->default_email);
             // Attach initial custom fields
-            $user->addDynamicData($data);
+            $user->addDynamicData($vars);
         }
 
         return $user;
     }
 
+    static function fromForm($form) {
+
+        if(!$form) return null;
+
+        //Validate the form
+        $valid = true;
+        if (!$form->isValid())
+            $valid  = false;
+
+        //Make sure the email is not in-use
+        if (($field=$form->getField('email'))
+                && $field->getClean()
+                && User::lookup(array('emails__address'=>$field->getClean()))) {
+            $field->addError('Email is assigned to another user');
+            $valid = false;
+        }
+
+        return $valid ? self::fromVars($form->getClean()) : null;
+    }
+
     function getEmail() {
         return $this->default_email->address;
     }