diff --git versioncontrol.api.php versioncontrol.api.php
index 6a348de..6c7c31d 100644
--- versioncontrol.api.php
+++ versioncontrol.api.php
@@ -515,136 +515,6 @@ function hook_versioncontrol_is_account_authorized($repository, $uid) {
   return FALSE;
 }
 
-
-/**
- * Unset filtered accounts before they are even attempted to be displayed
- * on the account list ("admin/content/versioncontrol-accounts").
- * You'll most probably use this in conjunction with an additional filter
- * form element that is added to the account filter form
- * ($form['#id'] == 'versioncontrol-account-filter-form') with form_alter().
- *
- * @param $accounts
- *   The accounts that would normally be displayed, in the same format as the
- *   return value of VersioncontrolAccountCache::getInstance()->getAccounts(). Entries in this list
- *   may be unset by this filter function.
- *
- * @ingroup Accounts
- * @ingroup Form handling
- * @ingroup Target audience: Authorization control modules
- */
-function hook_versioncontrol_filter_accounts(&$accounts) {
-  if (empty($accounts)) {
-    return;
-  }
-  // Use a default value if the session variable hasn't yet been set.
-  if (!isset($_SESSION['mymodule_filter_username'])) {
-    $_SESSION['mymodule_filter_username'] = 'chx';
-  }
-  $mymodule_filter_username = $_SESSION['mymodule_filter_username'];
-
-  if ($mymodule_filter_username == '') {
-    return; // Don't change the list if no filtering should happen.
-  }
-
-  foreach ($accounts as $uid => $usernames_by_repository) {
-    foreach ($usernames_by_repository as $repo_id => $username) {
-      if ($username != $mymodule_filter_username) {
-        unset($accounts[$uid][$repo_id]);
-        if (empty($accounts[$uid])) {
-          unset($accounts[$uid]);
-        }
-      }
-    }
-  }
-}
-
-
-/**
- * Extract account data from the account  form's submitted
- * values, and add it to the @p $additional_data array. Later, that array
- * will be passed to hook_versioncontrol_account() as part of the account
- * insert/update procedure.
- *
- * @param $additional_data
- *   The additional account data array which is being passed by reference so
- *   that it can be written to.
- * @param $form
- *   The form array of the submitted account edit/register form, with
- *   $form['#id'] == 'versioncontrol-account-form' (amongst others).
- * @param $form_state
- *   The form state of the submitted account edit/register form.
- *   If you altered this form and added an additional form element then
- *   $form_state['values'] will also contain the value of this form element.
- *
- * @ingroup Accounts
- * @ingroup Form handling
- * @ingroup Target audience: Commit access modules
- * @ingroup Target audience: Authorization control modules
- * @ingroup Target audience: All modules with account specific settings
- */
-function hook_versioncontrol_account_submit(&$additional_data, $form, $form_state) {
-  if (empty($form_state['values']['mymodule_karma'])) {
-    return;
-  }
-  $additional_data['mymodule']['karma'] = $form_state['values']['mymodule_karma'];
-}
-
-/**
- * Act on database changes when VCS accounts are inserted, updated or deleted.
- *
- * @param $op
- *   Either 'insert' when the account has just been created, 'update'
- *   when it has been updated, or 'delete' if it will be deleted after
- *   this function has been called.
- * @param $uid
- *   The Drupal user id corresponding to the VCS account.
- * @param $username
- *   The VCS specific username (a string) of the account.
- * @param $repository
- *   The repository where the user has its VCS account.
- * @param $additional_data
- *   An array of additional author information. Modules can fill this array
- *   by implementing hook_versioncontrol_account_submit().
- *
- * @ingroup Accounts
- * @ingroup Form handling
- * @ingroup Target audience: Commit access modules
- * @ingroup Target audience: Authorization control modules
- * @ingroup Target audience: All modules with account specific settings
- */
-function hook_versioncontrol_account($op, $uid, $username, $repository, $additional_data = array()) {
-  switch ($op) {
-    case 'insert':
-    case 'update':
-      // Recap: if form_alter() wasn't applied, our array element is not set.
-      $mymodule_data = $additional_data['mymodule'];
-
-      if (!isset($mymodule_data)) {
-        // In most modules, form_alter() will always be applied to the
-        // account editing/creating form. If $mymodule_data is empty
-        // nevertheless then it means that the account has been created
-        // programmatically rather than with a form submit.
-        // In that case, we better assign a default value:
-        if ($op == 'insert') {
-          $mymodule_data = array('karma' => 50);
-        }
-        // Don't change the status for programmatical updates, though.
-        if ($op == 'update') {
-          break;
-        }
-      }
-
-      db_query("DELETE FROM {mymodule_karma} WHERE uid = %d", $uid);
-      db_query("INSERT INTO {mymodule_karma} (uid, karma) VALUES (%d, %d)",
-          $uid, $mymodule_data['karma']);
-      break;
-
-    case 'delete':
-      db_query("DELETE FROM {mymodule_karma} WHERE uid = %d", $uid);
-      break;
-  }
-}
-
 /**
  * Add additional columns into the list of VCS accounts.
  * By changing the @p $header and @p $rows_by_uid arguments,
diff --git versioncontrol.install versioncontrol.install
index a57f72a..9e42652 100644
--- versioncontrol.install
+++ versioncontrol.install
@@ -532,7 +532,6 @@ function versioncontrol_uninstall() {
     'versioncontrol_email_address',
     'versioncontrol_registration_message_unauthorized',
     'versioncontrol_registration_message_authorized',
-    'versioncontrol_admin_account_pager',
   );
   foreach ($variables as $variable) {
     variable_del($variable);
@@ -1122,7 +1121,7 @@ function versioncontrol_update_6310() {
 /**
  * Change the main schema to let drupal users have more than one account.
  */
-function versioncontrol_account_status_update_6311() {
+function versioncontrol_update_6311() {
   $ret = array();
   $account_id = array(
     'description' => 'The primary identifier for an account.',
@@ -1139,7 +1138,7 @@ function versioncontrol_account_status_update_6311() {
  * Move vcs_username field to account status module and remove
  * {versioncontrol_accounts} table.
  */
-function versioncontrol_account_status_update_6312() {
+function versioncontrol_update_6312() {
   $ret = array();
 
   // Try to migrate data if possible.
diff --git versioncontrol_account_status/includes/handlers/versioncontrol_account_status_handler_field_account_link_edit.inc versioncontrol_account_status/includes/handlers/versioncontrol_account_status_handler_field_account_link_edit.inc
new file mode 100644
index 0000000..24c7ff9
--- /dev/null
+++ versioncontrol_account_status/includes/handlers/versioncontrol_account_status_handler_field_account_link_edit.inc
@@ -0,0 +1,15 @@
+<?php
+// $Id$
+
+/**
+ * Views Field handler to create a link to account edition form.
+ */
+class versioncontrol_account_status_handler_field_account_link_edit extends views_handler_field {
+  function render($values) {
+    $uid = $values->{$this->field_alias};
+    $repo_id = $values->{$this->aliases['repo_id']};
+    $vcs_username = $values->{$this->aliases['vcs_username']};
+    $link = sprintf('user/%d/edit/versioncontrol/%d/%s', $uid, $repo_id, drupal_urlencode($vcs_username));
+    return l(t('Edit'), $link);
+  }
+}
diff --git versioncontrol_account_status/includes/versioncontrol_account_status.views.inc versioncontrol_account_status/includes/versioncontrol_account_status.views.inc
index 13273a0..db3dcb0 100755
--- versioncontrol_account_status/includes/versioncontrol_account_status.views.inc
+++ versioncontrol_account_status/includes/versioncontrol_account_status.views.inc
@@ -121,6 +121,25 @@ function versioncontrol_account_status_views_data() {
       'handler' => 'views_handler_sort',
     ),
   );
+  $data['versioncontrol_account_status_users']['edit_account'] = array(
+    'title' => t('Edit link'),
+    'field' => array(
+      'handler' => 'versioncontrol_account_status_handler_field_account_link_edit',
+      'real field' => 'uid',
+      'additional fields' => array(
+        'repo_id', 'vcs_username'
+      ),
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
 
   return $data;
 }
@@ -138,6 +157,9 @@ function versioncontrol_account_status_views_handlers() {
       'versioncontrol_account_status_handler_field_account_status' => array(
         'parent' => 'views_handler_field',
       ),
+      'versioncontrol_account_status_handler_field_account_link_edit' => array(
+        'parent' => 'views_handler_field',
+      ),
       // filter handlers
       'versioncontrol_account_status_handler_filter_account_status' => array(
         'parent' => 'views_handler_filter_in_operator',
diff --git versioncontrol_account_status/includes/versioncontrol_account_status.views_default.inc versioncontrol_account_status/includes/versioncontrol_account_status.views_default.inc
index 4fe7fda..d7c9f78 100644
--- versioncontrol_account_status/includes/versioncontrol_account_status.views_default.inc
+++ versioncontrol_account_status/includes/versioncontrol_account_status.views_default.inc
@@ -197,6 +197,35 @@ function versioncontrol_account_status_views_default_views() {
       'field' => 'status',
       'relationship' => 'none',
     ),
+    'edit_account' => array(
+      'label' => 'Edit link',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'exclude' => 0,
+      'id' => 'edit_account',
+      'table' => 'versioncontrol_account_status_users',
+      'field' => 'edit_account',
+      'relationship' => 'none',
+    ),
   ));
   $handler->override_option('filters', array(
     'status' => array(
@@ -211,7 +240,7 @@ function versioncontrol_account_status_views_default_views() {
         'label' => 'Account status',
         'optional' => 1,
         'single' => 1,
-        'remember' => 0,
+        'remember' => 1,
         'reduce' => 0,
       ),
       'id' => 'status',
@@ -230,7 +259,7 @@ function versioncontrol_account_status_views_default_views() {
         'identifier' => 'uid',
         'label' => 'Usernames',
         'optional' => 1,
-        'remember' => 0,
+        'remember' => 1,
         'reduce' => 0,
       ),
       'id' => 'uid',
@@ -240,7 +269,8 @@ function versioncontrol_account_status_views_default_views() {
     ),
   ));
   $handler->override_option('access', array(
-    'type' => 'none',
+    'type' => 'perm',
+    'perm' => 'administer version control systems',
   ));
   $handler->override_option('cache', array(
     'type' => 'none',
@@ -249,22 +279,6 @@ function versioncontrol_account_status_views_default_views() {
   $handler->override_option('items_per_page', 50);
   $handler->override_option('use_pager', '1');
   $handler->override_option('style_plugin', 'table');
-  $handler = $view->new_display('page', 'Page', 'page_1');
-  $handler->override_option('path', 'admin/project/versioncontrol_account_status/accounts');
-  $handler->override_option('menu', array(
-    'type' => 'none',
-    'title' => '',
-    'description' => '',
-    'weight' => 0,
-    'name' => 'navigation',
-  ));
-  $handler->override_option('tab_options', array(
-    'type' => 'none',
-    'title' => '',
-    'description' => '',
-    'weight' => 0,
-    'name' => 'navigation',
-  ));
   $views[$view->name] = $view;
 
   return $views;
diff --git versioncontrol_account_status/versioncontrol_account_status.install versioncontrol_account_status/versioncontrol_account_status.install
index 49591f5..ea338d3 100644
--- versioncontrol_account_status/versioncontrol_account_status.install
+++ versioncontrol_account_status/versioncontrol_account_status.install
@@ -160,3 +160,19 @@ function versioncontrol_account_status_update_6301() {
   db_add_field($ret, 'versioncontrol_account_status_users', 'account_id', $account_id, array('primary key' => array('account_id')));
   return $ret;
 }
+
+/**
+ * Add data field to {versioncontrol_account_status_users}.
+ */
+function versioncontrol_account_status_update_6302() {
+  $ret = array();
+  $data = array(
+    'description' => 'A data field for account status.',
+    'type' => 'text',
+    'size' => 'medium',
+    'not null' => TRUE,
+    'serialize' => TRUE,
+  );
+  db_add_field($ret, 'versioncontrol_account_status_users', 'data', $data);
+  return $ret;
+}
diff --git versioncontrol_account_status/versioncontrol_account_status.module versioncontrol_account_status/versioncontrol_account_status.module
index ecfc6ae..cfb7737 100644
--- versioncontrol_account_status/versioncontrol_account_status.module
+++ versioncontrol_account_status/versioncontrol_account_status.module
@@ -153,19 +153,38 @@ function versioncontrol_account_status_get($conditions=array(), $include_unautho
  *   of versioncontrol_account_status_get().
  */
 function versioncontrol_account_status_set($status_data) {
+  if (!isset($status_data->data)) {
+    // Auto-approve the account if it was inserted programmatically and
+    // the caller doesn't know anything about this module.
+    $status_data->data = array(
+      'admin_message' => array('is_send' => FALSE, 'contents' => ''),
+      'send_application_mails' => FALSE,
+    );
+  }
+
   if (!empty($status_data->account_id)) {
     drupal_write_record('versioncontrol_account_status_users', $status_data, 'account_id');
 
-    //FIXME remove this
-    // Everything's done, invoke the hook.
-    module_invoke_all('versioncontrol_entity_account_update', $status_data);
+    if ($status_data->data['admin_message']['is_send']) {
+      $contents = $status_data->data['admin_message']['contents'];
+      _versioncontrol_account_status_send_status_update_mails($status_data, $contents);
+    }
+    if ($status_data->data['send_application_mails']) {
+      $is_reapplication = !empty($status_data->data['is_reapplication']);
+      _versioncontrol_account_status_send_application_mails($status_data, $is_reapplication);
+    }
   }
   else {
     drupal_write_record('versioncontrol_account_status_users', $status_data);
 
-    //FIXME remove this
-    // Everything's done, invoke the hook.
-    module_invoke_all('versioncontrol_entity_account_insert', $status_data);
+    if ($status_data->data['admin_message']['is_send']) {
+      $contents = $status_data->data['admin_message']['contents'];
+      _versioncontrol_account_status_send_status_update_mails($status_data, $contents);
+    }
+    if ($status_data->data['send_application_mails']) {
+      $is_reapplication = !empty($status_data->data['is_reapplication']);
+      _versioncontrol_account_status_send_application_mails($status_data, $is_reapplication);
+    }
   }
 }
 
@@ -180,14 +199,12 @@ function versioncontrol_account_status_versioncontrol_is_account_authorized($rep
   if ($repository['authorization_method'] != 'versioncontrol_account_status_repository') {
     return TRUE;
   }
-  $result = db_query('SELECT status
-                      FROM {versioncontrol_account_status_users}
-                      WHERE uid = %d AND repo_id = %d',
-                      $uid, $repository['repo_id']);
 
-  while ($account = db_fetch_object($result)) {
+  $accounts = versioncontrol_account_status_get(array('uid' => $uid, 'repo_id' => $repository->repo_id));
+  foreach ($accounts as $account) {
     return ($account->status == VERSIONCONTROL_ACCOUNT_STATUS_APPROVED);
   }
+
   return FALSE;
 }
 
@@ -222,88 +239,6 @@ function versioncontrol_account_status_versioncontrol_alter_repository_selection
   }
 }
 
-
-/**
- * Implementation of hook_versioncontrol_alter_account_list():
- * Add additional columns into the list of VCS accounts.
- * By changing the @p $header and @p $rows_by_uid arguments,
- * the account list can be customized accordingly.
- *
- * @param $accounts
- *   The list of accounts that is being displayed in the account table.
- * @param $repositories
- *   An array of repositories where the given users have a VCS account.
- *   Array keys are the repository ids, and array values are the
- *   repository arrays like returned from versioncontrol_get_repository().
- * @param $header
- *   A list of columns that will be passed to theme('table').
- * @param $rows_by_uid
- *   An array of existing table rows, with Drupal user ids as array keys.
- *   Each row already includes the generic column values, and for each row
- *   there is an account with the same uid given in the @p $accounts parameter.
- */
-function versioncontrol_account_status_versioncontrol_alter_account_list($accounts, $repositories, &$header, &$rows_by_uid) {
-  $accounts_column_index = 1;
-  $status_column_index = NULL;
-  $new_header = array();
-
-  // insert a new 'Account status' column after the 'Accounts' one
-  foreach ($header as $index => $column) {
-    if ($index == $accounts_column_index) {
-      $new_header[] = $column;
-      $new_header[] = t('Account status');
-    }
-    else {
-      $new_header[] = $column;
-    }
-  }
-  $header = $new_header;
-
-  // Same for the actual status field in each row.
-  foreach ($rows_by_uid as $uid => $row) {
-    $new_row = array();
-
-    foreach ($row as $index => $column) {
-      if ($index == $accounts_column_index) {
-        $new_row[] = $column;
-        $new_row[] = _versioncontrol_account_status_get_cell(
-          $uid, $accounts[$uid], $repositories
-        );
-      }
-      else {
-        $new_row[] = $column;
-      }
-    }
-    $rows_by_uid[$uid] = $new_row;
-  }
-}
-
-/**
- * The actual 'Status' cell for each row in the accounts list.
- */
-function _versioncontrol_account_status_get_cell($uid, $usernames_by_repository, $repositories) {
-  $status_options = _versioncontrol_account_status_get_status_options(TRUE);
-  $statuses = array();
-
-  foreach ($usernames_by_repository as $repo_id => $username) {
-    if ($repositories[$repo_id]['authorization_method'] == 'versioncontrol_account_status_repository') {
-      $status_data = versioncontrol_account_status_get(array('uid' => $uid, 'repo_id' => $repo_id));
-      $statuses[] = t('@repository: !status', array(
-        '!status' => $status_options[$status_data->status],
-        '@repository' => $repositories[$repo_id]['name'],
-      ));
-    }
-    else {
-      $statuses[] = t('@repository: !status', array(
-        '!status' => t('n/a'),
-        '@repository' => $repositories[$repo_id]['name'],
-      ));
-    }
-  }
-  return theme('item_list', $statuses);
-}
-
-
 /**
  * Implementation of hook_form_alter():
  * Change the form according to the user's account status.
@@ -321,124 +256,9 @@ function versioncontrol_account_status_form_alter(&$form, $form_state, $form_id)
         );
       }
       break;
-
-    case 'versioncontrol-account-filter-form':
-      versioncontrol_account_status_form_alter_account_filter($form);
-      break;
   }
 }
 
-
-/**
- * Implementation of hook_form_alter() for Version Control API's
- * account filtering form on the admin account list.
- */
-function versioncontrol_account_status_form_alter_account_filter(&$form) {
-  $options = array_merge(
-    array(VERSIONCONTROL_ACCOUNT_STATUS_ALL => t('All')),
-    _versioncontrol_account_status_get_status_options()
-  );
-
-  if (!isset($_SESSION['versioncontrol_account_status_filter'])) {
-    $_SESSION['versioncontrol_account_status_filter'] = VERSIONCONTROL_ACCOUNT_STATUS_QUEUED;
-  }
-
-  $form['submit']['#submit'][] = 'versioncontrol_account_status_account_filter_form_submit';
-
-  $form['versioncontrol_account_status'] = array(
-    '#type' => 'select',
-    '#title' => t('Status'),
-    '#options' => $options,
-    '#default_value' => $_SESSION['versioncontrol_account_status_filter'],
-    '#weight' => 0,
-  );
-}
-
-/**
- * Additional submit handler for the account filter form.
- */
-function versioncontrol_account_status_account_filter_form_submit($form, &$form_state) {
-  $_SESSION['versioncontrol_account_status_filter'] =
-    $form_state['values']['versioncontrol_account_status'];
-}
-
-/**
- * Implementation of hook_versioncontrol_filter_accounts():
- * TODO remove, obsoleted by Views
- *
- * @param $accounts
- *   The accounts that would normally be displayed, in the same format as the
- *   return value of VersioncontrolAccountCache::getInstance()->getAccounts(). Entries in this list
- *   may be unset by this filter function.
- */
-function versioncontrol_account_status_versioncontrol_filter_accounts(&$accounts) {
-  if (empty($accounts)) {
-    return;
-  }
-  if (!isset($_SESSION['versioncontrol_account_status_filter'])) {
-    $_SESSION['versioncontrol_account_status_filter'] = 0;
-  }
-  $filter_status = $_SESSION['versioncontrol_account_status_filter'];
-
-  if (!isset($_SESSION['versioncontrol_filter_repo_id'])) {
-    $_SESSION['versioncontrol_filter_repo_id'] = 0;
-  }
-  $filter_repo_id = $_SESSION['versioncontrol_filter_repo_id'];
-
-  if ($filter_status == VERSIONCONTROL_ACCOUNT_STATUS_ALL
-  && $filter_repo_id == 0) {
-    return; // Don't change the list if "All" statuses are selected or no repo_id is choosen
-  }
-  if ($filter_repo_id != 0) {
-    versioncontrol_account_status_filter_repo_id($accounts, $filter_repo_id);
-  }
-  if ($filter_status != VERSIONCONTROL_ACCOUNT_STATUS_ALL) {
-    versioncontrol_account_status_filter_status($accounts, $filter_status);
-  }
-}
-
-/**
- * Unset filtered accounts before they are even attempted to be displayed
- * on the account list.
- */
-function versioncontrol_account_status_filter_repo_id(&$accounts, $filter_repo_id) {
-  //FIXME new structure for the array
-  foreach ($accounts as $uid => $usernames_by_repository) {
-    foreach ($usernames_by_repository as $repo_id => $username) {
-      if ($repo_id != $filter_repo_id) {
-        unset($accounts[$uid][$repo_id]);
-        if (empty($accounts[$uid])) {
-          unset($accounts[$uid]);
-        }
-      }
-    }
-  }
-}
-/**
- * Unset filtered accounts before they are even attempted to be displayed
- * on the account list.
- */
-function versioncontrol_account_status_filter_status(&$accounts, $filter_status) {
-  $uid_constraints = array();
-  $params = array($filter_status);
-  foreach ($accounts as $uid => $usernames_by_repository) {
-    $uid_constraints[] = 'uid = %d';
-    $params[] = $uid;
-  }
-
-  // Retrieve all users with the given status.
-  $result = db_query('SELECT DISTINCT(uid) FROM {versioncontrol_account_status_users}
-                      WHERE status = %d
-                       AND ('. implode(' OR ', $uid_constraints) .')', $params);
-
-  $filtered_accounts = array();
-  while ($account = db_fetch_object($result)) {
-    $filtered_accounts[$account->uid] = $accounts[$account->uid];
-  }
-  $accounts = $filtered_accounts;
-}
-
-
 /**
  * Implementation of hook_form_alter() for Version Control API's
  * repository settings form.
@@ -451,9 +271,9 @@ function versioncontrol_account_status_form_alter_repository_settings(&$form) {
   $form['#versioncontrol_account_status'] = TRUE;
 
   // Get form and email messages (only the default ones for new repositories).
-  $strings = (empty($repository) || $repository['repo_id'] == 0)
+  $strings = (empty($repository) || $repository->repo_id == 0)
     ? _versioncontrol_account_status_get_presets()
-    : _versioncontrol_account_status_get_strings($repository['repo_id']);
+    : _versioncontrol_account_status_get_strings($repository->repo_id);
 
   // Save screen space as there are going to be more fieldsets in here.
   $form['account_registration']['repository_messages']['#collapsed'] = TRUE;
@@ -735,10 +555,6 @@ function versioncontrol_account_status_form_alter_account_edit(&$form, $status_d
     $status_data->status = VERSIONCONTROL_ACCOUNT_STATUS_QUEUED;
   }
 
-  // Remember a few values for later on.
-  $form['#versioncontrol_account_status_repo_id'] = $status_data->repo_id;
-  $form['#versioncontrol_account_status_uid'] = $status_data->uid;
-
   $is_reapplication = FALSE;
 
   $reapplication_statuses = array(
@@ -909,7 +725,7 @@ function _versioncontrol_account_status_form_alter_status_admin(&$form, $status_
  */
 function versioncontrol_account_status_application_validate($form, &$form_state) {
   $strings = _versioncontrol_account_status_get_strings(
-    $form['#versioncontrol_account_status_repo_id']
+    $form['#repository']->repo_id
   );
   $conditions = _versioncontrol_account_status_get_conditions(
     $strings['default_condition_description'], $strings['default_condition_error']
@@ -923,131 +739,6 @@ function versioncontrol_account_status_application_validate($form, &$form_state)
   }
 }
 
-
-/**
- * Implementation of hook_versioncontrol_account_submit():
- * Extract account status data from the account edit/register form's submitted
- * values, and add it to the @p $additional_data array. Later, that array
- * will be passed to hook_versioncontrol_account() as part of the account
- * insert/update procedure.
- */
-function versioncontrol_account_status_versioncontrol_account_submit(&$additional_data, $form, $form_state) {
-  // If the form wasn't altered at all, let it be.
-  if (!isset($form['#versioncontrol_account_status_uid'])) {
-    return;
-  }
-
-  $applicant_uid = $form['#versioncontrol_account_status_uid'];
-  $repo_id = $form['#versioncontrol_account_status_repo_id'];
-  $accounts = versioncontrol_account_status_get(array('uid' => $applicant_uid, 'repo_id' => $repo_id));
-  if (!empty($accounts)) {
-    //FIXME let UI support more than one account per repo
-    $status_data = reset($accounts);
-  }
-  else {
-    $status_data = new stdClass();
-    $status_data->status     = VERSIONCONTROL_ACCOUNT_STATUS_UNDEFINED;
-    $status_data->repo_id    = $repo_id;
-    $status_data->uid        = $applicant_uid;
-    $status_data->motivation = '';
-  }
-
-  if (isset($form_state['values']['send_admin_message'])) { // if status administration was on the form
-    if ($status_data->status == $form_state['values']['status']
-        && $status_data->status == VERSIONCONTROL_ACCOUNT_STATUS_QUEUED) {
-      // The QUEUED status should only indicate the initial status of an
-      // application. Once it has been replied to, it should be set to PENDING.
-      // In case the administrator forgets to do this, do it automatically.
-      $form_state['values']['status'] = VERSIONCONTROL_ACCOUNT_STATUS_PENDING;
-    }
-  }
-  $status_data->motivation = $form_state['values']['motivation'];
-  $status_data->status = $form_state['values']['status'];
-
-  $additional_data['versioncontrol_account_status'] = array(
-    'status_data' => $status_data,
-    'admin_message' => array(
-      'is_send' => isset($form_state['values']['send_admin_message'])
-        ? $form_state['values']['send_admin_message']
-        : FALSE,
-      'contents' => isset($form_state['values']['admin_message'])
-        ? $form_state['values']['admin_message']
-        : '',
-    ),
-    'is_reapplication' => !empty($form['#is_reapplication']),
-    'send_application_mails' => isset($form['#send_application_mails'])
-      ? $form['#send_application_mails']
-      : FALSE,
-  );
-}
-
-/**
- * Implementation of hook_versioncontrol_entity_account_insert().
- */
-function versioncontrol_account_status_versioncontrol_entity_account_insert($vcs_account) {
-  // Recap: if form_alter() wasn't applied, our array element is not set.
-  $additional_data = isset($vcs_account->additional_data['versioncontrol_account_status'])
-    ? $vcs_account->additional_data['versioncontrol_account_status']
-    : NULL;
-
-  if (!isset($additional_data)) {
-    // Auto-approve the account if it was inserted programmatically and
-    // the caller doesn't know anything about this module.
-    $status_data = new stdClass();
-    $status_data->uid          = $vcs_account->committer_uid;
-    $status_data->repo_id      = $vcs_account->repo_id;
-    $status_data->vcs_username = $vcs_account->vcs_username;
-    $status_data->motivation   = 'Inserted programmatically.';
-    $status_data->status       = VERSIONCONTROL_ACCOUNT_STATUS_APPROVED;
-    $additional_data = array(
-      'status_data' => $status_data,
-      'admin_message' => array('is_send' => FALSE, 'contents' => ''),
-      'send_application_mails' => FALSE,
-    );
-  }
-  // update instead of insert
-  $additional_data['status_data']->account_id = $vcs_account->account_id;
-
-  $status_data = $additional_data['status_data'];
-  versioncontrol_account_status_set($status_data);
-
-  if ($additional_data['admin_message']['is_send']) {
-    $contents = $additional_data['admin_message']['contents'];
-    _versioncontrol_account_status_send_status_update_mails($status_data, $contents);
-  }
-  if ($additional_data['send_application_mails']) {
-    $is_reapplication = !empty($additional_data['is_reapplication']);
-    _versioncontrol_account_status_send_application_mails($status_data, $is_reapplication);
-  }
-}
-
-/**
- * Implementation of hook_versioncontrol_entity_account_update().
- */
-function versioncontrol_account_status_versioncontrol_entity_account_update($vcs_account) {
-  // Recap: if form_alter() wasn't applied, our array element is not set.
-  $additional_data = isset($vcs_account->additional_data['versioncontrol_account_status'])
-    ? $vcs_account->additional_data['versioncontrol_account_status']
-    : NULL;
-
-  if (!isset($additional_data)) {
-    // Don't change the status for programmatical updates, though.
-    return;
-  }
-
-  $status_data = $additional_data['status_data'];
-  versioncontrol_account_status_set($status_data);
-
-  if ($additional_data['admin_message']['is_send']) {
-    $contents = $additional_data['admin_message']['contents'];
-    _versioncontrol_account_status_send_status_update_mails($status_data, $contents);
-  }
-  if ($additional_data['send_application_mails']) {
-    $is_reapplication = !empty($additional_data['is_reapplication']);
-    _versioncontrol_account_status_send_application_mails($status_data, $is_reapplication);
-  }
-}
-
 /**
  * Send out notification mails in response to an application submission.
  */
@@ -1394,16 +1085,10 @@ function versioncontrol_account_status_menu() {
   $items['admin/content/versioncontrol-accounts'] = array(
     'title' => 'VCS accounts',
     'description' => 'Manage associations of Drupal users to VCS user accounts.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('versioncontrol_admin_account_list_form'),
+    'page callback' => 'versioncontrol_account_status_list_accounts',
     'access arguments' => array('administer version control systems'),
     'type' => MENU_NORMAL_ITEM,
   );
-  $items['admin/content/versioncontrol-accounts/list'] = array(
-    'title' => 'List',
-    'type' => MENU_DEFAULT_LOCAL_TASK,
-    'weight' => 0,
-  );
   $items['versioncontrol/register'] = array(
     'title' => 'Get commit access',
     'page callback' => 'versioncontrol_account_status_register_page',
@@ -1452,6 +1137,15 @@ function versioncontrol_user_accounts_load($uid, $include_unauthorized = FALSE)
 }
 
 /**
+ * Menu callback for 'admin/content/versioncontrol-accounts'.
+ */
+function versioncontrol_account_status_list_accounts() {
+  $view = views_get_view('versioncontrol_account_status_acccounts');
+  $view->override_path = 'admin/content/versioncontrol-accounts';
+  return $view->preview();
+}
+
+/**
  * Form callback for "versioncontrol/register[/$register_uid[/$register_at_repo_id]]":
  * Provide an indirection that leads to an account registration form.
  */
@@ -1547,221 +1241,6 @@ function versioncontrol_account_status_register_page($register_uid = FALSE, $reg
 }
 
 /**
- * Form callback for "admin/content/versioncontrol-accounts":
- * A list of accounts with filtering possibilities.
- *
- * TODO Completely reimplement in Views.
- */
-function versioncontrol_admin_account_list_form(&$form_state) {
-  // Retrieve a list of all repositories with registered VCS accounts.
-  $result = db_query('SELECT DISTINCT repo_id FROM {versioncontrol_account_status_users}');
-  $repo_ids = array();
-
-  while ($repo_id = db_result($result)) {
-    $repo_ids[] = $repo_id;
-  }
-  $repositories = versioncontrol_repository_load_multiple($repo_ids);
-
-  $filter_form = versioncontrol_admin_account_list_filter_form($form_state, $repositories);
-  $filter_form['#id'] = 'versioncontrol-account-filter-form';
-  drupal_alter('form', $filter_form, $form_state, 'versioncontrol_admin_account_list_filter_form');
-
-  $form = array();
-  $form['filters'] = array_merge($filter_form, array(
-    '#type' => 'fieldset',
-    '#title' => t('Filter'),
-    '#collapsible' => TRUE,
-    '#collapsed' => FALSE,
-    '#prefix' => '<div class="container-inline">',
-    '#suffix' => '</div>',
-  ));
-
-  // Filter the list of accounts.
-  $accounts = versioncontrol_account_status_get();
-
-  foreach (module_implements('versioncontrol_filter_accounts') as $module) {
-    $function = $module .'_versioncontrol_filter_accounts';
-    $function($accounts);
-  }
-  $accounts = versioncontrol_admin_get_paged_accounts($accounts);
-  $users = array();
-
-  // Retrieve more info for the accounts that survived filtering.
-  foreach ($accounts as $uid => $usernames_by_repository) {
-    $user = user_load($uid);
-    if (!$user) {
-      unset($accounts[$uid]);
-      continue;
-    }
-    $users[$uid] = $user;
-  }
-  if (empty($users)) {
-    $form['empty'] = array(
-      '#type' => 'markup',
-      '#value' => '<p>'. t('No accounts could be found with the current filter settings.') .'</p>',
-    );
-    return $form;
-  }
-
-  // FIXME get statistics inside again?
-  //// Retrieve total, first and last commits of each user.
-  //$statistics = VersioncontrolOperationCache::getInstance()->getStatistics(array(
-    //'types' => array(VERSIONCONTROL_OPERATION_COMMIT),
-    //'uids' => array_keys($users),
-  //), array(
-    //'group_by' => array('uid'),
-  //));
-
-  //$total_operations = array();
-  //$first_operation_dates = array();
-  //$last_operation_dates = array();
-
-  //foreach ($statistics as $user_stats) {
-    //$total_operations[$user_stats->uid] = $user_stats->total_operations;
-    //$first_operation_dates[$user_stats->uid] = t('!time ago', array(
-      //'!time' => format_interval(time() - $user_stats->first_operation_date, 1))
-    //);
-    //$last_operation_dates[$user_stats->uid] = t('!time ago', array(
-      //'!time' => format_interval(time() - $user_stats->last_operation_date, 1))
-    //);
-    //if (module_exists('commitlog')) {
-      //$total_operations[$user_stats->uid] =
-        //l($total_operations[$user_stats->uid], 'user/'. $user_stats->uid .'/track/code');
-    //}
-  //}
-
-  // Construct the user account table.
-  $header = array(t('User'), t('Accounts'), t('Commits'), t('First commit'), t('Last commit'));
-  $rows_by_uid = array();
-  foreach ($accounts as $uid => $usernames_by_repository) {
-    $user = $users[$uid];
-
-    // Present a list of all VCS usernames and the repository where they're in.
-    $repo_usernames = array();
-    foreach ($usernames_by_repository as $repo_id => $account) {
-      if (!isset($repositories[$repo_id])) { // happens if the backend isn't loaded
-        continue;
-      }
-      $formatted_username = theme('versioncontrol_account_username',
-        $uid, $account->vcs_username, $repositories[$repo_id],
-        array('prefer_drupal_username' => FALSE)
-      );
-      $repo_name = module_exists('commitlog')
-        ? theme('commitlog_repository', $repositories[$repo_id])
-        : check_plain($repositories[$repo_id]['name']);
-
-      $repo_usernames[] = t('!username in !repository (!edit)', array(
-        '!username' => $formatted_username,
-        '!repository' => $repo_name,
-        '!edit' => l(t('edit'),
-          'user/'. $uid .'/edit/versioncontrol/'. $repo_id .'/'. drupal_urlencode($account->vcs_username)
-        ),
-      ));
-    }
-    $vcs_usernames = empty($repo_usernames)
-      ? t('VCS backend is currently disabled')
-      : theme('item_list', $repo_usernames);
-
-    $rows_by_uid[$uid] = array(
-      theme('username', $user), $vcs_usernames,
-      isset($total_operations[$uid]) ? $total_operations[$uid] : 0,
-      isset($first_operation_dates[$uid]) ? $first_operation_dates[$uid] : t('n/a'),
-      isset($last_operation_dates[$uid]) ? $last_operation_dates[$uid] : t('n/a'),
-    );
-  }
-
-  // Provide a possibility for backends and other modules to modify the list.
-  foreach (module_implements('versioncontrol_alter_account_list') as $module) {
-    $function = $module .'_versioncontrol_alter_account_list';
-    $function($accounts, $repositories, $header, $rows_by_uid);
-  }
-  // We don't want the uids in the final $rows array.
-  $rows = array_values($rows_by_uid);
-
-  // The finished user account list with account filter.
-  $form['accounts'] = array(
-    '#type' => 'markup',
-    '#value' => theme('table', $header, $rows),
-  );
-
-  if ($pager = theme('pager', NULL, variable_get('versioncontrol_admin_account_pager', 20), 0)) {
-    $form['pager'] = array(
-      '#type' => 'markup',
-      '#value' => $pager,
-    );
-  }
-  return $form;
-}
-
-/**
- * A form for filtering accounts which is embedded in the account list page.
- */
-function versioncontrol_admin_account_list_filter_form(&$form_state, $repositories) {
-  $form = array();
-  $repository_names = array(0 => t('All'));
-
-  foreach ($repositories as $repo_id => $repository) {
-    $repository_names[$repo_id] = check_plain($repository['name']);
-  }
-  if (!isset($_SESSION['versioncontrol_filter_repo_id'])) {
-    $_SESSION['versioncontrol_filter_repo_id'] = 0;
-  }
-
-  $form['#id'] = 'versioncontrol-account-filter-form';
-
-  $form['repo_id'] = array(
-    '#type' => 'select',
-    '#title' => t('Repository'),
-    '#options' => $repository_names,
-    '#default_value' => $_SESSION['versioncontrol_filter_repo_id'],
-    '#weight' => 10,
-  );
-  $form['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Filter'),
-    '#submit' => array('versioncontrol_admin_account_list_filter_form_submit'),
-    '#weight' => 100,
-  );
-  return $form;
-}
-
-/**
- * Submit handler for the account filter form.
- */
-function versioncontrol_admin_account_list_filter_form_submit($form, &$form_state) {
-  $_SESSION['versioncontrol_filter_repo_id'] = $form_state['values']['repo_id'];
-}
-
-/**
- * Return a subset of the given accounts (10 Drupal users by default, and all
- * of their VCS usernames). Paging is also used by emulating pager_query().
- */
-function versioncontrol_admin_get_paged_accounts($accounts, $element = 0) {
-  global $pager_page_array, $pager_total, $pager_total_items;
-  $page = isset($_GET['page']) ? $_GET['page'] : '';
-  $pager_page_array = explode(',', $page);
-  $page = empty($pager_page_array[$element]) ? 0 : $pager_page_array[$element];
-
-  $limit = variable_get('versioncontrol_admin_account_pager', 20);
-  $i = 0;
-  $paged_accounts = array();
-
-  foreach ($accounts as $uid => $usernames_by_repository) {
-    if ($i >= ($page * $limit) && $i < (($page+1) * $limit)) {
-      $paged_accounts[$uid] = $usernames_by_repository;
-    }
-    ++$i;
-  }
-
-  // Emulate pager_query() in order to get a proper theme('pager').
-  $pager_total_items[$element] = count($accounts);
-  $pager_total[$element] = ceil($pager_total_items[$element] / $limit);
-  $pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1));
-
-  return $paged_accounts;
-}
-
-/**
  * Add or update the user account when the edit/register form is submitted.
  */
 function versioncontrol_account_status_edit_form_submit($form, &$form_state) {
@@ -1771,19 +1250,53 @@ function versioncontrol_account_status_edit_form_submit($form, &$form_state) {
   $repository = $form['#repository'];
   $vcs_name = $form['#vcs_name'];
 
-  // Let other modules provide additional account data.
-  $additional_data = array();
-  foreach (module_implements('versioncontrol_account_submit') as $module) {
-    $function = $module .'_versioncontrol_account_submit';
-    $function($additional_data, $form, $form_state);
+  $accounts = versioncontrol_account_status_get(array('uid' => $uid, 'repo_id' => $repository->repo_id));
+  if (!empty($accounts)) {
+    //FIXME let UI support more than one account per repo per user
+    $status_data = reset($accounts);
+  }
+  else {
+    $status_data = new stdClass();
+    $status_data->status     = VERSIONCONTROL_ACCOUNT_STATUS_UNDEFINED;
+    $status_data->repo_id    = $repository->repo_id;
+    $status_data->uid        = $uid;
+    $status_data->motivation = '';
+  }
+
+  if (isset($form_state['values']['send_admin_message'])) { // if status administration was on the form
+    if ($status_data->status == $form_state['values']['status']
+        && $status_data->status == VERSIONCONTROL_ACCOUNT_STATUS_QUEUED) {
+      // The QUEUED status should only indicate the initial status of an
+      // application. Once it has been replied to, it should be set to PENDING.
+      // In case the administrator forgets to do this, do it automatically.
+      $form_state['values']['status'] = VERSIONCONTROL_ACCOUNT_STATUS_PENDING;
+    }
   }
 
+  // Let other modules provide additional account data.
+  $data = array(
+    'admin_message' => array(
+      'is_send' => isset($form_state['values']['send_admin_message'])
+        ? $form_state['values']['send_admin_message']
+        : FALSE,
+      'contents' => isset($form_state['values']['admin_message'])
+        ? $form_state['values']['admin_message']
+        : '',
+    ),
+    'is_reapplication' => !empty($form['#is_reapplication']),
+    'send_application_mails' => isset($form['#send_application_mails'])
+      ? $form['#send_application_mails']
+      : FALSE,
+  );
+
   if (empty($form['#original_username'])) {
     $vcs_account = new stdClass();
     $vcs_account->vcs_username = $vcs_username;
     $vcs_account->uid = $uid;
     $vcs_account->repo_id = $repository->repo_id;
-    $vcs_account->additional_data = $additional_data;
+    $vcs_account->motivation = $form_state['values']['motivation'];
+    $vcs_account->status = $form_state['values']['status'];
+    $vcs_account->data = $data;
     versioncontrol_account_status_set($vcs_account);
     $message = drupal_set_message(t(
       'The @vcs account %vcs_username has been registered.',
@@ -1802,9 +1315,16 @@ function versioncontrol_account_status_edit_form_submit($form, &$form_state) {
     $vcs_accounts = versioncontrol_account_status_get($conditions, TRUE);
     // if we got an original_username we can trust on getting a value
     $vcs_account = array_shift($vcs_accounts);
-
     $vcs_account->vcs_username = $vcs_username;
-    $vcs_account->additional_data = $additional_data;
+    $vcs_account->data = $data;
+
+    // optional fields since they do not appear at 'user/uid/edit/versioncontrol/<repo_id>/<vcs_username>' form
+    foreach (array('status', 'motivation') as $op_field) {
+      if (isset($form_state['values'][$op_field])) {
+        $vcs_account->$op_field = $form_state['values'][$op_field];
+      }
+    }
+
     versioncontrol_account_status_set($vcs_account);
 
     // Regular users cannot change the username, and will probably get
diff --git versioncontrol_fakevcs/versioncontrol_fakevcs.admin.inc versioncontrol_fakevcs/versioncontrol_fakevcs.admin.inc
index 91fd433..a6af8ba 100644
--- versioncontrol_fakevcs/versioncontrol_fakevcs.admin.inc
+++ versioncontrol_fakevcs/versioncontrol_fakevcs.admin.inc
@@ -143,17 +143,3 @@ function versioncontrol_fakevcs_account_form_validate($form, &$form_state) {
     form_set_error('account_password', t('The FakeVCS password you have chosen is too short (it must be at least !min characters long).', array('!min' => VERSIONCONTROL_FAKEVCS_MIN_PASSWORD_LENGTH)));
   }
 }
-
-/**
- * Implementation of hook_versioncontrol_account_submit():
- * Extract account data from the account edit/register form's submitted
- * values, and add it to the @p $additional_data array. Later, that array
- * will be passed to hook_versioncontrol_account() as part of the account
- * insert/update procedure.
- */
-function versioncontrol_fakevcs_versioncontrol_account_submit(&$additional_data, $form, $form_state) {
-  if (!isset($form['#versioncontrol_fakevcs']) || empty($form_state['values']['account_password'])) {
-    return;
-  }
-  $additional_data['fakevcs_specific']['password'] = crypt($form_state['values']['account_password']);
-}
diff --git versioncontrol_fakevcs/versioncontrol_fakevcs.module versioncontrol_fakevcs/versioncontrol_fakevcs.module
index 0a4935f..1ca61ca 100644
--- versioncontrol_fakevcs/versioncontrol_fakevcs.module
+++ versioncontrol_fakevcs/versioncontrol_fakevcs.module
@@ -76,43 +76,6 @@ function versioncontrol_fakevcs_operation($op, $operation, $operation_items) {
 }
 
 /**
- * Implementation of [versioncontrol_backend]_account():
- * Manage (insert, update or delete) additional FakeVCS user account data
- * in the database.
- *
- * @param $op
- *   Either 'insert' when the account is in the process of being created,
- *   or 'update' when username or VCS specific data change,
- *   or 'delete' if it will be deleted after this function has been called.
- * @param $uid
- *   The Drupal user id corresponding to the VCS account.
- * @param $username
- *   The VCS specific username (a string).
- * @param $repository
- *   The repository where the user has its VCS account.
- * @param $additional_data
- *   An array of additional author information.
- */
-function versioncontrol_fakevcs_account($op, $uid, $username, $repository, $additional_data = array()) {
-  // we need an example for this hook, since the one here is now
-  // implemented through account class method overrides
-  // VersioncontrolFakeAccount::_{insert,update,delete}()
-  // Probably a non-backend module fits better for implement it.
-  $fakevcs_specific = $additional_data['fakevcs_specific'];
-
-  switch ($op) {
-    case 'insert':
-      break;
-
-    case 'update':
-      break;
-
-    case 'delete':
-      break;
-  }
-}
-
-/**
  * Implementation of [versioncontrol_backend]_repository():
  * Manage (insert, update or delete) additional FakeVCS repository data
  * in the database.
