diff --git a/include/ajax.forms.php b/include/ajax.forms.php
index be185fc29f4d47cde1df6dafadb596aaeed564bb..ea3e6222c1d130df0640bce57ee8b8ed060ec855 100644
--- a/include/ajax.forms.php
+++ b/include/ajax.forms.php
@@ -38,71 +38,26 @@ class DynamicFormsAjaxAPI extends AjaxController {
     }
 
     function getUserInfo($user_id) {
-        $user = User::lookup($user_id);
 
-        $data = $user->ht;
-        $data['email'] = $user->default_email->address;
-
-        $custom = array();
-        foreach ($user->getDynamicData() as $cd) {
-            $cd->addMissingFields();
-            foreach ($cd->getFields() as $f) {
-                if ($f->get('name') == 'name')
-                    $f->value = $user->getFullName();
-                elseif ($f->get('name') == 'email')
-                    $f->value = $user->getEmail();
-            }
-            $custom[] = $cd->getForm();
-        }
+        if (!($user = User::lookup($user_id)))
+            Http::response(404, 'Unknown user');
 
+        $custom = $user->getForms();
         include(STAFFINC_DIR . 'templates/user-info.tmpl.php');
     }
 
     function saveUserInfo($user_id) {
-        $user = User::lookup($user_id);
 
-        $custom_data = $user->getDynamicData();
-        $custom = array();
-        $valid = true;
-        foreach ($custom_data as $cd) {
-            $cd->addMissingFields();
-            $cf = $custom[] = $cd->getForm();
-            $valid &= $cd->isValid();
-        }
+        $errors = array();
+        if (!($user = User::lookup($user_id)))
+            Http::response(404, 'Unknown user');
 
-        if ($valid) {
-            foreach ($custom_data as $cd)
-                foreach ($cd->getFields() as $f)
-                    if ($f->get('name') == 'email')
-                        $email = $f;
-            $u = User::lookup(array('emails__address'=>$email->getClean()));
-            if ($u && $u->id != $user_id) {
-                $valid = false;
-                $email->addError('Email is assigned to another user');
-            }
-        }
+        if ($user->updateInfo($_POST, $errors))
+            return Http::response(201, $user->to_json());
 
-        if (!$valid) {
-            include(STAFFINC_DIR . 'templates/user-info.tmpl.php');
-            return;
-        }
-
-        // Save custom data
-        foreach ($custom_data as $cd) {
-            foreach ($cd->getFields() as $f) {
-                if ($f->get('name') == 'name') {
-                    $user->name = $f->getClean();
-                    $user->save();
-                }
-                elseif ($f->get('name') == 'email') {
-                    $user->default_email->address = $f->getClean();
-                    $user->default_email->save();
-                }
-            }
-            $cd->save();
-        }
-
-        return Http::response(201, $user->to_json());
+        $custom = $user->getForms($_POST);
+        include(STAFFINC_DIR . 'templates/user-info.tmpl.php');
+        return;
     }
 }
 
diff --git a/include/class.user.php b/include/class.user.php
index 269e202cad3d479a9c47a0e04844fece79955ce2..215117bffec2f20f7433d3daff2e57f3f5905dda 100644
--- a/include/class.user.php
+++ b/include/class.user.php
@@ -88,14 +88,8 @@ class User extends UserModel {
             ));
             $user->save(true);
             $user->emails->add($user->default_email);
-
             // Attach initial custom fields
-            $uf = UserForm::getInstance();
-            foreach ($uf->getFields() as $f)
-                if (isset($data[$f->get('name')]))
-                    $uf->setAnswer($f->get('name'), $data[$f->get('name')]);
-            $uf->setClientId($user->id);
-            $uf->save();
+            $user->addDynamicData($data);
         }
 
         return $user;
@@ -142,6 +136,18 @@ class User extends UserModel {
                 return $a;
     }
 
+    function addDynamicData($data) {
+
+        $uf = UserForm::getInstance();
+        $uf->setClientId($this->id);
+        foreach ($uf->getFields() as $f)
+            if (isset($data[$f->get('name')]))
+                $uf->setAnswer($f->get('name'), $data[$f->get('name')]);
+        $uf->save();
+
+        return $uf;
+    }
+
     function getDynamicData() {
         if (!isset($this->_entries)) {
             $this->_entries = DynamicFormEntry::forClient($this->id)->all();
@@ -154,6 +160,57 @@ class User extends UserModel {
         return $this->_entries;
     }
 
+    function updateInfo($source, &$errors) {
+
+        //Get forms and validate
+        $custom_data = $this->getDynamicData();
+        $valid = true;
+        foreach ($custom_data as $cd) {
+            $cd->addMissingFields();
+            $valid &= $cd->isValid();
+        }
+
+        if (!$valid) return false;
+
+        // Save custom data
+        foreach ($custom_data as $cd) {
+            foreach ($cd->getFields() as $f) {
+                if ($f->get('name') == 'name') {
+                    $this->name = $f->getClean();
+                    $this->save();
+                }
+                elseif ($f->get('name') == 'email') {
+                    $this->default_email->address = $f->getClean();
+                    $this->default_email->save();
+                }
+            }
+            $cd->save();
+        }
+
+        return true;
+    }
+
+    function getForms($data=null) {
+
+        $forms = array();
+        foreach ($this->getDynamicData() as $cd) {
+            $cd->addMissingFields();
+            if ($data)
+                $cd->isValid();
+            else {
+                foreach ($cd->getFields() as $f) {
+                    if ($f->get('name') == 'name')
+                        $f->value = $this->getFullName();
+                    elseif ($f->get('name') == 'email')
+                        $f->value = $this->getEmail();
+                }
+            }
+            $forms[] = $cd->getForm();
+        }
+
+        return $forms;
+    }
+
     function save($refetch=false) {
         // Drop commas and reorganize the name without them
         $parts = array_map('trim', explode(',', $this->name));
@@ -352,3 +409,5 @@ class UserEmail extends UserEmailModel {
         return $email;
     }
 }
+
+?>