diff --git a/include/class.dynamic_forms.php b/include/class.dynamic_forms.php
index 945d188f17b2b62fe87c5220d6ed911372799b5f..081ceabc7d342a110791065e8f48c13296c3b045 100644
--- a/include/class.dynamic_forms.php
+++ b/include/class.dynamic_forms.php
@@ -70,7 +70,7 @@ class DynamicForm extends VerySimpleModel {
     function getField($name) {
         foreach ($this->getDynamicFields() as $f)
             if (!strcasecmp($f->get('name'), $name))
-                return $f;
+                return $f->getImpl();
     }
 
     function hasField($name) {
diff --git a/include/class.user.php b/include/class.user.php
index 269e202cad3d479a9c47a0e04844fece79955ce2..d05e1fd1b242aa0c2e8b4c29b0bbff8e8401a9b1 100644
--- a/include/class.user.php
+++ b/include/class.user.php
@@ -67,6 +67,7 @@ class UserModel extends VerySimpleModel {
 class User extends UserModel {
 
     var $_entries;
+    var $_forms;
 
     function __construct($ht) {
         parent::__construct($ht);
@@ -119,11 +120,16 @@ class User extends UserModel {
         return new PersonsName($this->name);
     }
 
+    function getUpdateDate() {
+        return $this->updated;
+    }
+
     function to_json() {
 
         $info = array(
                 'id'  => $this->getId(),
-                'name' => (string) $this->getName());
+                'name' => (string) $this->getName(),
+                'email' => (string) $this->getEmail());
 
         return JsonDataEncoder::encode($info);
     }
@@ -154,6 +160,67 @@ class User extends UserModel {
         return $this->_entries;
     }
 
+    function getForms($populate=true) {
+
+        if (!isset($this->_forms)) {
+            $this->_forms = array();
+            foreach ($this->getDynamicData() as $cd) {
+                $cd->addMissingFields();
+                if($populate
+                        && ($form = $cd->getForm())
+                        && $form->get('type') == 'U' ) {
+                    foreach ($cd->getFields() as $f) {
+                        if ($f->get('name') == 'name')
+                            $f->value = $this->getFullName();
+                        elseif ($f->get('name') == 'email')
+                            $f->value = $this->getEmail();
+                    }
+                }
+
+                $this->_forms[] = $cd->getForm();
+            }
+        }
+
+        return $this->_forms;
+    }
+
+    function updateInfo($vars, &$errors) {
+
+        $valid = true;
+        $forms = $this->getForms(false);
+        foreach ($forms as $cd) {
+            if (!$cd->isValid())
+                $valid = false;
+            elseif (($f=$cd->getField('email'))
+                        && $cd->get('type') == 'U'
+                        && ($u=User::lookup(array('emails__address'=>$f->getClean())))
+                        && $u->id != $this->getId()) {
+                $valid = false;
+                $f->addError('Email is assigned to another user');
+            }
+        }
+
+        if (!$valid)
+            return false;
+
+        foreach ($this->getDynamicData() as $cd) {
+            if (($f=$cd->getForm()) && $f->get('type') == 'U') {
+                if (($name = $f->getField('name'))) {
+                    $this->name = $name->getClean();
+                    $this->save();
+                }
+
+                if (($email = $f->getField('email'))) {
+                    $this->default_email->address = $email->getClean();
+                    $this->default_email->save();
+                }
+            }
+            $cd->save();
+        }
+
+        return true;
+    }
+
     function save($refetch=false) {
         // Drop commas and reorganize the name without them
         $parts = array_map('trim', explode(',', $this->name));