diff --git a/src/IDF/Form/UserAccount.php b/src/IDF/Form/UserAccount.php
index 3d1ded1..806e625 100644
--- a/src/IDF/Form/UserAccount.php
+++ b/src/IDF/Form/UserAccount.php
@@ -82,6 +82,16 @@ class IDF_Form_UserAccount  extends Pluf_Form
                                                        'size' => 15,
                                                                     ),
                                             ));
+
+        $this->fields['ssh_key'] = new Pluf_Form_Field_Varchar(
+                                      array('required' => false,
+                                            'label' => __('Your public SSH key'),
+                                            'initial' => '',
+                                            'widget_attrs' => array('rows' => 3,
+                                                                    'cols' => 40),
+                                            'widget' => 'Pluf_Form_Widget_TextareaInput',
+                                            'help_text' => __('Be careful to provide your public key and not your private key!')
+                                            ));
         
 
     }
@@ -107,8 +117,22 @@ class IDF_Form_UserAccount  extends Pluf_Form
             $update_pass = true;
         }
         $this->user->setFromFormData($this->cleaned_data);
+        // Get keys
+        $keys = $this->user->get_idf_key_list();
+        if ($keys->count() > 0) {
+            $key = $keys[0];
+        } else {
+            $key = new IDF_Key();
+            $key->user = $this->user;
+        }
+        $key->content = $this->cleaned_data['ssh_key'];
         if ($commit) {
             $this->user->update();
+            if ($key->id != '') {
+                $key->update();
+            } else {
+                $key->create();
+            }
             if ($update_pass) {
                 /**
                  * [signal]
diff --git a/src/IDF/Key.php b/src/IDF/Key.php
new file mode 100644
index 0000000..d480321
--- /dev/null
+++ b/src/IDF/Key.php
@@ -0,0 +1,100 @@
+_a['table'] = 'idf_keys';
+        $this->_a['model'] = __CLASS__;
+        $this->_a['cols'] = array(
+                             // It is mandatory to have an "id" column.
+                            'id' =>
+                            array(
+                                  'type' => 'Pluf_DB_Field_Sequence',
+                                  //It is automatically added.
+                                  'blank' => true, 
+                                  ),
+                            'user' => 
+                            array(
+                                  'type' => 'Pluf_DB_Field_Foreignkey',
+                                  'model' => 'Pluf_User',
+                                  'blank' => false,
+                                  'verbose' => __('user'),
+                                  ),
+                            'content' =>
+                            array(
+                                  'type' => 'Pluf_DB_Field_Text',
+                                  'blank' => false,
+                                  'verbose' => __('ssh key'),
+                                  ),
+                            );
+        // WARNING: Not using getSqlTable on the Pluf_User object to
+        // avoid recursion.
+        $t_users = $this->_con->pfx.'users'; 
+        $this->_a['views'] = array(
+                              'join_user' => 
+                              array(
+                                    'join' => 'LEFT JOIN '.$t_users
+                                    .' ON '.$t_users.'.id='.$this->_con->qn('user'),
+                                    'select' => $this->getSelect().', '
+                                    .$t_users.'.login AS login',
+                                    'props' => array('login' => 'login'),
+                                    )
+                                   );
+    }
+
+    function postSave($create=false)
+    {
+        /**
+         * [signal]
+         *
+         * IDF_Key::postSave
+         *
+         * [sender]
+         *
+         * IDF_Key
+         *
+         * [description]
+         *
+         * This signal allows an application to perform special
+         * operations after the saving of a SSH Key.
+         *
+         * [parameters]
+         *
+         * array('key' => $key,
+         *       'created' => true/false)
+         *
+         */
+        $params = array('key' => $this, 'created' => $create);
+        Pluf_Signal::send('IDF_Key::postSave',
+                          'IDF_Key', $params);
+    }
+
+}
diff --git a/src/IDF/Migrations/10SshKey.php b/src/IDF/Migrations/10SshKey.php
new file mode 100644
index 0000000..bed7cbb
--- /dev/null
+++ b/src/IDF/Migrations/10SshKey.php
@@ -0,0 +1,52 @@
+model = new $model();
+        $schema->createTables();
+    }
+}
+
+function IDF_Migrations_10SshKey_down($params=null)
+{
+    $models = array(
+                    'IDF_Key',
+                    );
+    $db = Pluf::db();
+    $schema = new Pluf_DB_Schema($db);
+    foreach ($models as $model) {
+        $schema->model = new $model();
+        $schema->dropTables();
+    }
+}
\ No newline at end of file
diff --git a/src/IDF/Migrations/Install.php b/src/IDF/Migrations/Install.php
index ecd442f..6f2cb75 100644
--- a/src/IDF/Migrations/Install.php
+++ b/src/IDF/Migrations/Install.php
@@ -45,6 +45,7 @@ function IDF_Migrations_Install_setup($params=null)
                     'IDF_Review',
                     'IDF_Review_Patch',
                     'IDF_Review_FileComment',
+                    'IDF_Key',
                     );
     $db = Pluf::db();
     $schema = new Pluf_DB_Schema($db);
@@ -82,6 +83,7 @@ function IDF_Migrations_Install_teardown($params=null)
     $perm = Pluf_Permission::getFromString('IDF.project-authorized-user');
     if ($perm) $perm->delete();
     $models = array(
+                    'IDF_Key',
                     'IDF_Review_FileComment',
                     'IDF_Review_Patch',
                     'IDF_Review',
diff --git a/src/IDF/Plugin/SyncGit/Cron.php b/src/IDF/Plugin/SyncGit/Cron.php
new file mode 100644
index 0000000..e11336c
--- /dev/null
+++ b/src/IDF/Plugin/SyncGit/Cron.php
@@ -0,0 +1,60 @@
+template;
+        $keys = Pluf::factory('IDF_Key')->getList(array('view'=>'join_user'));
+        $cmd = Pluf::f('idf_plugin_syncgit_path_gitserve', '/bin/false');
+        $authorized_keys = Pluf::f('idf_plugin_syncgit_path_authorized_keys', false);
+        if (false == $authorized_keys) {
+            throw new Pluf_Exception_SettingError('Setting git_path_authorized_keys not set.');
+        }
+        if (!is_writable($authorized_keys)) {
+            throw new Exception('Cannot create file: '.$authorized_keys);
+        }
+        $out = '';
+        foreach ($keys as $key) {
+            if (strlen($key->content) > 40 // minimal check
+                and preg_match('/^[a-zA-Z][a-zA-Z0-9_.-]*(@[a-zA-Z][a-zA-Z0-9.-]*)?$/', $key->login)) {
+                $content = str_replace("\n", '', $key->content);
+                $out .= sprintf($template, $cmd, $key->login, $content)."\n";
+            }
+        }
+        file_put_contents($authorized_keys, $out, LOCK_EX);        
+    }
+}
diff --git a/src/IDF/Plugin/SyncGit/Serve.php b/src/IDF/Plugin/SyncGit/Serve.php
index 7e487d6..5a25696 100644
--- a/src/IDF/Plugin/SyncGit/Serve.php
+++ b/src/IDF/Plugin/SyncGit/Serve.php
@@ -35,11 +35,6 @@ class IDF_Plugin_SyncGit_Serve
     public $commands_readonly = array('git-upload-pack', 'git upload-pack');
     public $commands_write = array('git-receive-pack', 'git receive-pack');
 
-    /**
-     * Check that the command is authorized.
-     */
-
-
     /**
      * Serve a git request.
      *
@@ -120,7 +115,7 @@ class IDF_Plugin_SyncGit_Serve
             exit(1);
         }
         $cmd = $env['SSH_ORIGINAL_COMMAND'];
-        chdir(Pluf::f('git_home_dir', '/home/git'));
+        chdir(Pluf::f('idf_plugin_syncgit_git_home_dir', '/home/git'));
         $serve = new IDF_Plugin_SyncGit_Serve();
         try {
             $new_cmd = $serve->serve($username, $cmd);
@@ -171,11 +166,11 @@ class IDF_Plugin_SyncGit_Serve
         $request->user = $user;
         if (true === IDF_Precondition::accessTabGeneric($request, 'source_access_rights')) {
             if ($mode == 'readonly') {
-                return array(Pluf::f('git_base_repositories', '/home/git/repositories'),
+                return array(Pluf::f('idf_plugin_syncgit_base_repositories', '/home/git/repositories'),
                              $project->shortname);
             }
             if (true === IDF_Precondition::projectMemberOrOwner($request)) {
-                return array(Pluf::f('git_base_repositories', '/home/git/repositories'),
+                return array(Pluf::f('idf_plugin_syncgit_base_repositories', '/home/git/repositories'),
                              $project->shortname);
             }
         }
diff --git a/src/IDF/Views/User.php b/src/IDF/Views/User.php
index f4672f6..1cf8725 100644
--- a/src/IDF/Views/User.php
+++ b/src/IDF/Views/User.php
@@ -124,10 +124,17 @@ class IDF_Views_User
             unset($data['password']);
             $form = new IDF_Form_UserAccount($data, $params);
         }
+        $keys = $request->user->get_idf_key_list();
+        if ($keys->count() > 0 and strlen($keys[0]->content) > 30) {
+            $ssh_key = Pluf_Template::markSafe(''.Pluf_esc(substr($keys[0]->content, 0, 30)).'...
'.__('Troncated for security reasons.').'');
+        } else {
+            $ssh_key = __('You have not upload your public SSH key yet.');
+        }
         return Pluf_Shortcuts_RenderToResponse('idf/user/myaccount.html', 
                                                array('page_title' => __('Your Account'),
                                                      'api_key' => $api_key,
                                                      'ext_pass' => $ext_pass,
+                                                     'ssh_key' => $ssh_key,
                                                      'form' => $form),
                                                $request);
     }
diff --git a/src/IDF/relations.php b/src/IDF/relations.php
index 4e0ef39..bcf991f 100644
--- a/src/IDF/relations.php
+++ b/src/IDF/relations.php
@@ -37,7 +37,7 @@ $m['IDF_Review'] = array('relate_to' => array('IDF_Project', 'Pluf_User', 'IDF_T
                         'relate_to_many' => array('IDF_Tag', 'Pluf_User'));
 $m['IDF_Review_Patch'] = array('relate_to' => array('IDF_Review', 'Pluf_User'));
 $m['IDF_Review_FileComment'] = array('relate_to' => array('IDF_Review_Patch', 'Pluf_User'));
-
+$m['IDF_Key'] = array('relate_to' => array('Pluf_User'));
 
 Pluf_Signal::connect('Pluf_Template_Compiler::construct_template_tags_modifiers',
                      array('IDF_Middleware', 'updateTemplateTagsModifiers'));
diff --git a/src/IDF/templates/idf/user/myaccount.html b/src/IDF/templates/idf/user/myaccount.html
index 7e77518..82a0da4 100644
--- a/src/IDF/templates/idf/user/myaccount.html
+++ b/src/IDF/templates/idf/user/myaccount.html
@@ -46,6 +46,14 @@
 {$form.f.password2|unsafe}
 
 
+