diff --git includes/VersioncontrolRepository.php includes/VersioncontrolRepository.php
index cb2ce06..0c9265e 100644
--- includes/VersioncontrolRepository.php
+++ includes/VersioncontrolRepository.php
@@ -373,8 +373,15 @@ abstract class VersioncontrolRepository implements VersioncontrolEntityInterface
         throw new Exception("Plugin '{$this->plugins['webviewer_url_handler']}' of type 'webviewer_url_handlers' does not contain a valid class name in handler slot 'handler'", E_WARNING);
         return FALSE;
       }
+      if (isset($this->data['webviewer_base_url']) && !empty($this->data['webviewer_base_url'])) {
+        $webviewer_base_url = $this->data['webviewer_base_url'];
+      }
+      else {
+        $variable = 'versioncontrol_repository_' . $this->backend->type . '_base_url_' . $this->plugins['webviewer_url_handler'];
+        $webviewer_base_url = variable_get($variable, '');
+      }
       $this->pluginInstances['webviewer_url_handler'] = new $class_name(
-        $this, $this->data['webviewer_base_url'], $plugin['url_templates']
+        $this, $webviewer_base_url, $plugin['url_templates']
       );
     }
     return $this->pluginInstances['webviewer_url_handler'];
@@ -387,10 +394,18 @@ abstract class VersioncontrolRepository implements VersioncontrolEntityInterface
     ctools_include('plugins');
 
     if (empty($this->plugins[$plugin_slot])) {
-      throw new Exception("Attempted to get plugin in slot '$plugin_slot', but no plugin has been assigned to that slot on this repository.", E_STRICT);
-      return FALSE;
+      // handle special case for two slots using the same plugin type
+      if ($plugin_slot == 'committer_mapper' || $plugin_slot == 'author_mapper') {
+        $variable = 'versioncontrol_repository_plugin_default_user_mapping_methods';
+      }
+      else {
+        $variable = 'versioncontrol_repository_plugin_default_' . $plugin_slot;
+      }
+      $plugin_name = variable_get($variable, '');
+    }
+    else {
+      $plugin_name = $this->plugins[$plugin_slot];
     }
-    $plugin_name = $this->plugins[$plugin_slot];
 
     $plugin = ctools_get_plugins('versioncontrol', $plugin_type, $plugin_name);
     if (!is_array($plugin)) {
@@ -423,11 +438,6 @@ abstract class VersioncontrolRepository implements VersioncontrolEntityInterface
 
   public function getAuthHandler() {
     if (!isset($this->pluginInstances['auth_handler'])) {
-      // If no plugin is set, use the free-for-all plugin
-      if (empty($this->plugins['auth_handler'])) {
-        // FIXME temporarily writing to a db-recorded field like this is very hacky
-        $this->plugins['auth_handler'] = 'ffa';
-      }
       $this->pluginInstances['auth_handler'] = $this->getPluginClass('auth_handler', 'vcs_auth', 'handler');
       $this->pluginInstances['auth_handler']->setRepository($this);
     }
@@ -436,26 +446,14 @@ abstract class VersioncontrolRepository implements VersioncontrolEntityInterface
 
   public function getAuthorMapper() {
     if (!isset($this->pluginInstances['author_mapper'])) {
-      // if no plugin is set, just directly register FALSE for the instance
-      if (empty($this->plugins['author_mapper'])) {
-        $this->pluginInstances['author_mapper'] = FALSE;
-      }
-      else {
-        $this->pluginInstances['author_mapper'] = $this->getPluginClass('author_mapper', 'user_mapping_methods', 'mapper');
-      }
+      $this->pluginInstances['author_mapper'] = $this->getPluginClass('author_mapper', 'user_mapping_methods', 'mapper');
     }
     return $this->pluginInstances['author_mapper'];
   }
 
   public function getCommitterMapper() {
     if (!isset($this->pluginInstances['committer_mapper'])) {
-      // If nothing is set for the committer mapper plugin, reuse the author one
-      if (empty($this->plugins['committer_mapper'])) {
-        $this->pluginInstances['committer_mapper'] = $this->getAuthorMapper();
-      }
-      else {
-        $this->pluginInstances['committer_mapper'] = $this->getPluginClass('committer_mapper', 'user_mapping_methods', 'mapper');
-      }
+      $this->pluginInstances['committer_mapper'] = $this->getPluginClass('committer_mapper', 'user_mapping_methods', 'mapper');
     }
 
     return $this->pluginInstances['committer_mapper'];
diff --git includes/plugins/user_mapping_methods/VersioncontrolUserMapperNone.class.php includes/plugins/user_mapping_methods/VersioncontrolUserMapperNone.class.php
new file mode 100644
index 0000000..bb7d3c9
--- /dev/null
+++ includes/plugins/user_mapping_methods/VersioncontrolUserMapperNone.class.php
@@ -0,0 +1,15 @@
+<?php
+//$Id
+
+/**
+ * Plugin that do not map.
+ */
+class VersioncontrolUserMapperSimpleMail implements VersioncontrolUserMapperInterface {
+  public function mapAuthor(VersioncontrolOperation $commit) {
+    return FALSE;
+  }
+
+  public function mapCommitter(VersioncontrolOperation $commit) {
+    return FALSE;
+  }
+}
diff --git includes/plugins/user_mapping_methods/none.inc includes/plugins/user_mapping_methods/none.inc
new file mode 100644
index 0000000..0070d55
--- /dev/null
+++ includes/plugins/user_mapping_methods/none.inc
@@ -0,0 +1,9 @@
+<?php
+// $Id$
+
+$plugin = array(
+  'title' => t('None (no mapping)'),
+  'mapper' => array(
+    'class' => 'VersioncontrolUserMapperNone',
+  ),
+);
diff --git tests/VersioncontrolTestCase.test tests/VersioncontrolTestCase.test
index fa258f2..11d1f34 100644
--- tests/VersioncontrolTestCase.test
+++ tests/VersioncontrolTestCase.test
@@ -147,8 +147,8 @@ abstract class VersioncontrolTestCase extends DrupalWebTestCase {
     );
     $default_plugins = array(
       'auth_handler' => 'ffa',
-      'author_mapper' => 'simple_mail',
-      'committer_mapper' => 'simple_mail',
+      'author_mapper' => 'none',
+      'committer_mapper' => 'none',
       'webviewer_url_handler' => 'none',
     );
 
diff --git versioncontrol.admin.inc versioncontrol.admin.inc
index 97ae7a8..190eb2a 100644
--- versioncontrol.admin.inc
+++ versioncontrol.admin.inc
@@ -233,6 +233,92 @@ function versioncontrol_admin_views_sets_edit_submit($form, &$form_state) {
 }
 
 /**
+ * Form callback for "admin/settings/versioncontrol-settings/plugins":
+ * Provide a form for settings about Version Control API plugins.
+ */
+function versioncontrol_admin_settings_plugins(&$form_state) {
+  ctools_include('plugins');
+  $form = array();
+  $plugin_entity_types = versioncontrol_plugins_get_information();
+  // view_sets have its own settings page, so avoid it
+  unset($plugin_entity_types['view']);
+
+  foreach ($plugin_entity_types as $plugin_entity_type => $plugin_types) {
+    foreach ($plugin_types as $plugin_type => $plugin_type_data) {
+      $form['versioncontrol_plugin_' . $plugin_type] = array(
+        '#type' => 'fieldset',
+        '#title' => $plugin_type_data['name'],
+      );
+
+      $variable = $plugin_type_data['default_variable'];
+      $callback = $plugin_type_data['fetcher'];
+      $form['versioncontrol_plugin_' . $plugin_type][$variable] = array(
+        '#type' => 'select',
+        '#title' => t('Default plugin'),
+        '#default_value' => variable_get($variable, 0),
+        '#options' => function_exists($callback) ? array( 0 => t('Do not set default')) + $callback() : array(),
+      );
+    }
+  }
+
+  // Special configuration for webviewer_url_handler plugin
+  // TODO make this more dynamic, so we can avoid a special case
+  $backends = versioncontrol_get_backends();
+  foreach ($backends as $vcs => $backend) {
+    foreach (ctools_get_plugins('versioncontrol', 'webviewer_url_handlers') as $machine_name => $plugin) {
+      $variable = 'versioncontrol_repository_' . $vcs . '_base_url_' . $machine_name;
+      $form['versioncontrol_plugin_webviewer_url_handlers'][$variable] = array(
+        '#type' => 'textfield',
+        '#title' => t('%vcs_name: Default base URL for %plugin_name', array('%vcs_name' => $backend->name, '%plugin_name' => $plugin['title'])),
+        '#default_value' => variable_get($variable, ''),
+      );
+    }
+  }
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save configuration'),
+    '#weight' => 100,
+  );
+
+  return $form;
+}
+
+function versioncontrol_admin_settings_plugins_submit($form, &$form_state) {
+  ctools_include('plugins');
+  $plugin_entity_types = versioncontrol_plugins_get_information();
+  // view_sets have its own settings page, so avoid it
+  unset($plugin_entity_types['view']);
+
+  foreach ($plugin_entity_types as $plugin_entity_type => $plugin_types) {
+    foreach ($plugin_types as $plugin_type => $plugin_type_data) {
+      $key = $plugin_type_data['default_variable'];
+      if ($form_state['values'][$key] == '0') {
+        variable_del($key);
+      }
+      else {
+        variable_set($key, $form_state['values'][$key]);
+      }
+    }
+  }
+
+  // Special configuration for webviewer_url_handler plugin
+  // TODO make this more dynamic, so we can avoid a special case
+  $backends = versioncontrol_get_backends();
+  foreach ($backends as $vcs => $backend) {
+    foreach (ctools_get_plugins('versioncontrol', 'webviewer_url_handlers') as $machine_name => $plugin) {
+      $key = 'versioncontrol_repository_' . $vcs . '_base_url_' . $machine_name;
+      if (empty($form_state['values'][$key])) {
+        variable_del($key);
+      }
+      else {
+        variable_set($key, $form_state['values'][$key]);
+      }
+    }
+  }
+}
+
+/**
  * Form callback for "admin/content/versioncontrol-repositories":
  * A simple list of repositories, sorted by version control system.
  */
@@ -342,16 +428,16 @@ function versioncontrol_admin_repository_edit(&$form_state, $repository, $vcs =
     '#type' => 'radios',
     '#title' => t('Author mapping'),
     '#description' => t('The mapping logic to be used for "author" data. All VCSes have some sort of author field.'),
-    '#default_value' => $repository_exists ? $repository->plugins['author_mapper'] : 0,
-    '#options' => array(0 => '<em>' . t('None (no mapping)') . '</em>')  + versioncontrol_user_mapping_methods_get_names(),
+    '#default_value' => $repository_exists ? $repository->plugins['author_mapper'] : variable_get('versioncontrol_repository_plugin_default_user_mapping_methods', 'none'),
+    '#options' => versioncontrol_user_mapping_methods_get_names(),
   );
 
   $form['user_mapping']['committer_mapper'] = array(
     '#type' => 'radios',
     '#title' => t('Committer mapping'),
     '#description' => t('The mapping logic to be used for "committer" data. Only some VCSes distinguish between author and committer. For most use cases, it is recommended best to set this to use the same plugin as for author mapping, especially if using "None (No mapping)" for author mapping.'),
-    '#default_value' => $repository_exists ? $repository->plugins['committer_mapper'] : 0,
-    '#options' => array(0 => '<em>' . t('Use Author mapping plugin') . '</em>') + versioncontrol_user_mapping_methods_get_names(),
+    '#default_value' => $repository_exists ? $repository->plugins['committer_mapper'] : variable_get('versioncontrol_repository_plugin_default_user_mapping_methods', 'none'),
+    '#options' => versioncontrol_user_mapping_methods_get_names(),
   );
 
   $form['user_authentication'] = array(
@@ -367,7 +453,7 @@ function versioncontrol_admin_repository_edit(&$form_state, $repository, $vcs =
     '#type' => 'radios',
     '#title' => t('Authentication & access'),
     '#description' => t('The authentication logic that should govern access to this repository. Note that Version Control API by itself provides very little enforcement of these ACLs. The expectation is that higher-level modules will use the interface.'),
-    '#default_value' => $repository_exists ? $repository->plugins['auth_handler'] : 0,
+    '#default_value' => $repository_exists ? $repository->plugins['auth_handler'] : variable_get('versioncontrol_repository_plugin_default_auth_handler', 'ffa'),
     '#options' => versioncontrol_auth_handlers_get_names(),
   );
 
@@ -392,7 +478,7 @@ function versioncontrol_admin_repository_edit(&$form_state, $repository, $vcs =
     '#type' => 'radios',
     '#title' => t('Web viewer URL handler'),
     '#description' =>  t('The handler which will  provide the URLs that will be used to add links to item and commit displays such as the commit log.'),
-    '#default_value' => $repository_exists ? $repository->plugins['webviewer_url_handler'] : 'none',
+    '#default_value' => $repository_exists ? $repository->plugins['webviewer_url_handler'] : variable_get('versioncontrol_repository_plugin_default_webviewer_url_handler', 'none'),
     '#options' => versioncontrol_webviewer_url_handlers_get_names($form['#vcs']),
   );
 
@@ -441,7 +527,9 @@ function versioncontrol_admin_repository_edit_submit($form, &$form_state) {
     $repository = $backends[$form['#vcs']]->buildEntity('repo', $repository);
   }
 
-  $repository->data['webviewer_base_url'] = $form_state['values']['base_url'];
+  if (!empty($form_state['values']['base_url'])) {
+    $repository->data['webviewer_base_url'] = $form_state['values']['base_url'];
+  }
 
   // Let other modules alter the repository array.
   foreach (module_implements('versioncontrol_repository_submit') as $module) {
diff --git versioncontrol.install versioncontrol.install
index 4d5af8e..30f3af0 100644
--- versioncontrol.install
+++ versioncontrol.install
@@ -1164,3 +1164,30 @@ function versioncontrol_update_6313() {
   db_drop_unique_key(&$ret, 'versioncontrol_repositories', 'name');
   return $ret;
 }
+
+/**
+ * Add default plugins for repositories.
+ */
+function versioncontrol_update_6314() {
+  $ret = array();
+
+  variable_set('versioncontrol_repository_plugin_default_webviewer_url_handler', 'none');
+  variable_set('versioncontrol_repository_plugin_default_auth_handler', 'ffa');
+  variable_set('versioncontrol_repository_plugin_default_user_mapping_methods', 'none');
+
+  // Remove webviewer_base_url from repository data if empty.
+  $result = db_query("SELECT repo_id, data FROM {versioncontrol_repositories}");
+  while ($row = db_fetch_object($result)) {
+    $data = unserialize($row->data);
+    if (empty($data['webviewer_base_url'])) {
+      unset($data['webviewer_base_url']);
+      $data = serialize($row->data);
+      db_query('UPDATE {versioncontrol_repositories} SET data = %s WHERE repo_id = %d', $row->data, $row->repo_id);
+    }
+  }
+
+  // Menu rebuild for new plugin settings page.
+  menu_rebuild();
+
+  return $ret;
+}
diff --git versioncontrol.module versioncontrol.module
index 2669320..abca69f 100644
--- versioncontrol.module
+++ versioncontrol.module
@@ -190,6 +190,13 @@ function versioncontrol_menu() {
     'type' => MENU_LOCAL_TASK,
   ) + $admin;
 
+  $items['admin/settings/versioncontrol-settings/plugins'] = array(
+    'title' => 'Plugins',
+    'description' => 'Default plugins and its configuration per backend.',
+    'page arguments' => array('versioncontrol_admin_settings_plugins'),
+    'type' => MENU_LOCAL_TASK,
+  ) + $admin;
+
   $items['admin/content/versioncontrol-repositories'] = array(
     'title' => 'VCS Repositories',
     'description' => 'Define and manage the Version Control repositories known to your site.',
@@ -1022,3 +1029,35 @@ function versioncontrol_webviewer_url_handlers_get_names($vcs='') {
   asort($names);
   return $names;
 }
+
+/**
+ * Helper function for handlin plugin settings.
+ */
+function versioncontrol_plugins_get_information() {
+  return array(
+    'repository'  => array(
+      'user_mapping_methods'   => array(
+        'name' => t('User mapping methods'),
+        'fetcher' => 'versioncontrol_user_mapping_methods_get_names',
+        'default_variable' => 'versioncontrol_repository_plugin_default_user_mapping_methods',
+      ),
+      'vcs_auth'               => array(
+        'name' => t('Versioncontrol authentication'),
+        'fetcher' => 'versioncontrol_auth_handlers_get_names',
+        'default_variable' => 'versioncontrol_repository_plugin_default_auth_handler',
+      ),
+      'webviewer_url_handlers' => array(
+        'name' => t('Webviewer URL handler'),
+        'fetcher' => 'versioncontrol_webviewer_url_handlers_get_names',
+        'default_variable' => 'versioncontrol_repository_plugin_default_webviewer_url_handler',
+      )
+    ),
+    'view' => array(
+      'view_sets' => array(
+        'name' => t('View sets'),
+        'fetcher' => FALSE,
+        'default_variable' => FALSE,
+      ),
+    ),
+  );
+}
