diff --git a/includes/VersioncontrolBackend.php b/includes/VersioncontrolBackend.php
index 2070939..0934ae5 100644
--- a/includes/VersioncontrolBackend.php
+++ b/includes/VersioncontrolBackend.php
@@ -105,6 +105,7 @@ abstract class VersioncontrolBackend {
       'committer_mapper' => 'VersioncontrolUserMapperInterface',
       'author_mapper' => 'VersioncontrolUserMapperInterface',
       'auth_handler' => 'VersioncontrolAuthHandlerInterface',
+      'event_processor' => 'VersioncontrolSynchronizationEventProcessorInterface',
     ),
   );
 
diff --git a/includes/VersioncontrolRepository.php b/includes/VersioncontrolRepository.php
index dbe1db2..d70816c 100644
--- a/includes/VersioncontrolRepository.php
+++ b/includes/VersioncontrolRepository.php
@@ -96,6 +96,7 @@ abstract class VersioncontrolRepository implements VersioncontrolEntityInterface
    * - repomgr
    * - auth_handler
    * - reposync
+   * - event_processor
    *
    * @var array
    */
@@ -104,6 +105,9 @@ abstract class VersioncontrolRepository implements VersioncontrolEntityInterface
   /**
    * An array of plugin instances (instanciated plugin objects).
    *
+   * There is one plugin per plugin slot in most cases. For now only
+   * event_processor has multiple plugins associated.
+   *
    * @var array
    */
   protected $pluginInstances = array();
@@ -1048,6 +1052,38 @@ abstract class VersioncontrolRepository implements VersioncontrolEntityInterface
   }
 
   /**
+   * Returns the event processor plugin object that this repository is
+   * configured to use.
+   *
+   * @return array(VersioncontrolSynchronizationEventProcessorInterface)
+   */
+  public function getEventProcessors() {
+    if (!isset($this->pluginInstances['event_processor'])) {
+      $processors = array();
+      // Potentially several plugins on the slot, so do it manually.
+      ctools_include('plugins');
+
+      if (!$plugins = ctools_get_plugins('versioncontrol', 'event_processor')) {
+        return array();
+      }
+
+      foreach ($plugins as $plugin) {
+        $class_name = ctools_plugin_get_class($plugin, 'handler');
+        if (!class_exists($class_name)) {
+          throw new Exception("Plugin slot 'event_processor' of type 'event_processor' contains an invalid class name in handler slot 'handler', named '$class_name' class", E_WARNING);
+        }
+        $plugin_object = new $class_name();
+        $this->getBackend()->verifyPluginInterface($this, 'event_processor', $plugin_object);
+        $plugin_object->setRepository($this);
+        $processors = $plugin_object;
+      }
+      $this->pluginInstances['event_processor'] = $processors;
+    }
+
+    return $this->pluginInstances['event_processor'];
+  }
+
+  /**
    * Convenience method to lock the repository in preparation for a
    * synchronization run.
    *
diff --git a/includes/VersioncontrolSynchronizationEventProcessorException.php b/includes/VersioncontrolSynchronizationEventProcessorException.php
new file mode 100644
index 0000000..0811b3e
--- /dev/null
+++ b/includes/VersioncontrolSynchronizationEventProcessorException.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * @file
+ *   An exception to be thrown when an error occurs during event procesing
+ *   after repository synchronization.
+ */
+class VersioncontrolSynchronizationEventProcessorException extends Exception { }
diff --git a/includes/interfaces.inc b/includes/interfaces.inc
index 41b5c81..3fae24d 100644
--- a/includes/interfaces.inc
+++ b/includes/interfaces.inc
@@ -468,3 +468,71 @@ interface VersioncontrolRepositoryHistorySynchronizerInterface {
    */
   public function verifyData();
 }
+
+/**
+ * Defines a versioncontrol synchronization event processor plugin behavior.
+ *
+ * Note: This is similar to hook_versioncontrol_code_arrival(), but this type
+ * of plugins are intended to help different configuration per repository per
+ * plugin.
+ */
+interface VersioncontrolSynchronizationEventProcessorInterface {
+  /**
+   * Reacts when new code has arrived correctly.
+   *
+   * @param VersioncontrolEvent $event
+   *   The event describing the code arrival.
+   *
+   * @throws VersioncontrolSynchronizationEventProcessorException $event
+   *   Something wrong happened during the processing. It let caller knows if
+   *   was executed correctly or not.
+   */
+  public function process(VersioncontrolEvent $event);
+
+  /**
+   * Set the repository object to be used by this plugin object.
+   */
+  public function setRepository(VersioncontrolRepository $repository);
+
+}
+
+/**
+ * Defines a way for plugins to define configuration.
+ *
+ * This relies on the plugin itself having on its definition array set to TRUE
+ * the 'has_configuration_form' key.
+ *
+ * @todo Currently it is only used on versioncontrol synchronization event
+ * processor plugin. It's pending to be used on other plugins.
+ */
+interface VersioncontrolPluginConfigurationInterface {
+  /**
+   * Build a configuration form to be used to configure a plugin instance.
+   *
+   * @param array $form
+   *   A form array.
+   * @param array $form_state
+   *   the corresponding form state.
+   */
+  public function buildForm(&$form, &$form_state);
+
+  /**
+   * Validate the form built at buildForm().
+   *
+   * @param array $form
+   *   A form array.
+   * @param array $form_state
+   *   the corresponding form state.
+   */
+  public function validateForm(&$form, &$form_state);
+
+  /**
+   * Handle any special handling on form submission.
+   *
+   * @param array $form
+   *   A form array.
+   * @param array $form_state
+   *   the corresponding form state.
+   */
+  public function submitForm(&$form, &$form_state);
+}
diff --git a/includes/plugins/event_processor/VersioncontrolEventProcessorNone.inc b/includes/plugins/event_processor/VersioncontrolEventProcessorNone.inc
new file mode 100644
index 0000000..0695694
--- /dev/null
+++ b/includes/plugins/event_processor/VersioncontrolEventProcessorNone.inc
@@ -0,0 +1,56 @@
+<?php
+/**
+ * @file
+ * Basic event processor class doing nothing.
+ */
+
+/**
+ * An example event processor class.
+ */
+class VersioncontrolEventProcessorNone implements VersioncontrolSynchronizationEventProcessorInterface, VersioncontrolPluginConfigurationInterface {
+  const BEHAVIOR_A = 1;
+  const BEHAVIOR_B = 2;
+
+  /**
+   * Associated repository.
+   *
+   * @var VersioncontrolRepository
+   */
+  protected $repository;
+
+  /**
+   * This plugin is an example that does nothing.
+   */
+  public function process(VersioncontrolEvent $event) {
+  }
+
+  public function setRepository(VersioncontrolRepository $repository) {
+    $this->repository = $repository;
+  }
+
+  public function buildForm(&$form, &$form_state) {
+    $form['behavior'] = array(
+      '#type' => 'select',
+      '#title' => 'Behavior',
+      '#options' => array(
+        self::BEHAVIOR_A => t('Behavior A'),
+        self:: BEHAVIOR_B => t('Behavior B'),
+      ),
+      '#description' => t('An option that will not change any behavior.'),
+    );
+    $form['message'] = array(
+      '#type' => 'textfield',
+      '#title' => 'Message',
+      '#description' => t('One message that will not be displayed.'),
+      '#required' => TRUE,
+    );
+  }
+
+  public function validateForm(&$form, &$form_state) {
+    // Nothing special.
+  }
+
+  public function submitForm(&$form, &$form_state) {
+    // Nothing special.
+  }
+}
diff --git a/includes/plugins/event_processor/none.inc b/includes/plugins/event_processor/none.inc
new file mode 100644
index 0000000..c2eecf4
--- /dev/null
+++ b/includes/plugins/event_processor/none.inc
@@ -0,0 +1,25 @@
+<?php
+/**
+ * @file
+ * This plugin contains the main documentation of how to make an event
+ * processor plugin.
+ * It does not really provide any functionallity.
+ */
+
+$plugin = array(
+
+  // The versioncontrol system machine name as the backend declares.
+  'vcs' => 'test',
+
+  // This title is going to be shown on the repository edition, for the
+  // user to identify the plugin.
+  'title' => t('Empty event processor'),
+
+  'handler' => array(
+    'class' => 'VersioncontrolEventProcessorNone',
+    'file' => 'VersioncontrolEventProcessorNone.inc',
+    'path' => drupal_get_path('module', 'versioncontrol') . '/includes/plugins/event_processor',
+  ),
+
+  'has_configuration_form' => TRUE,
+);
diff --git a/versioncontrol.admin.inc b/versioncontrol.admin.inc
index 09abc2f..cdb640b 100644
--- a/versioncontrol.admin.inc
+++ b/versioncontrol.admin.inc
@@ -308,6 +308,7 @@ function versioncontrol_admin_settings_plugins($form, &$form_state) {
         $form['versioncontrol_plugins_' . $vcs][$plugin_slot][$variable_name] = array(
           '#type' => 'select',
           '#title' => t('Plugin name'),
+          '#multiple' => $plugin_slot_data['multiple'],
           '#default_value' => $default_value,
           '#options' => function_exists($callback) ? $options + $callback() : $options,
         );
@@ -319,7 +320,7 @@ function versioncontrol_admin_settings_plugins($form, &$form_state) {
     }
   }
 
-  // Add special configuration for webviewer_url_handler plugin.
+  // Add special configuration for webviewer_url_handler an event_processor plugins.
   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;
@@ -544,6 +545,28 @@ function versioncontrol_admin_repository_edit($form, &$form_state, $repository,
     '#options' => versioncontrol_webviewer_url_handlers_get_names($form['#vcs']),
   );
 
+  $form['event_processor'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Event processor'),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+    '#weight' => 7,
+  );
+  if ($repository_exists) {
+    $default_event_processors = $repository->plugins['webviewer_url_handler'];
+  }
+  else {
+    $default_event_processors = versioncontrol_event_processor_get_default_plugins($form['#vcs']);
+  }
+  $form['event_processor']['processor'] = array(
+    '#type' => 'select',
+    '#multiple' => TRUE,
+    '#title' => t('Processors'),
+    '#description' => t('Which event processors will be used by this repository.'),
+    '#default_value' => $default_event_processors,
+    '#options' => versioncontrol_event_processor_get_names($form['#vcs']),
+  );
+
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Save repository'),
diff --git a/versioncontrol.module b/versioncontrol.module
index 8fe9833..f65375b 100644
--- a/versioncontrol.module
+++ b/versioncontrol.module
@@ -537,6 +537,9 @@ function versioncontrol_ctools_plugin_type() {
     'repomgr' => array(
       'classes' => array('worker'),
     ),
+    'event_processor' => array(
+      'classes' => array('handler'),
+    ),
   );
 }
 
@@ -564,6 +567,39 @@ function versioncontrol_plugin_get_names($plugin_type) {
 }
 
 /**
+ * Load the names of all required plugins with the specified vcs.
+ *
+ * To be used at forms.
+ *
+ * @todo: Let all plugins to define an optional vcs, so this can live inside
+ *        versioncontrol_plugin_get_names().
+ *
+ * @param string $plugin_type
+ *   This can be: webviewer_url_handlers, event_processor.
+ *
+ * @return array
+ *   The list of plugin titles indexed by plugin name.
+ */
+function versioncontrol_plugin_get_names_by_vcs($plugin_type, $vcs='') {
+  ctools_include('plugins');
+
+  $names = array();
+  foreach (ctools_get_plugins('versioncontrol', $plugin_type) as $name => $plugin) {
+    if (!empty($vcs)) {
+      if ($plugin['vcs'] == $vcs) {
+        $names[$name] = $plugin['title'];
+      }
+    }
+    else {
+      $names[$name] = $plugin['title'];
+    }
+  }
+
+  asort($names);
+  return $names;
+}
+
+/**
  * Load the names of all 'user_mapping_methods' for use at forms.
  */
 function versioncontrol_user_mapping_methods_get_names() {
@@ -593,27 +629,16 @@ function versioncontrol_repomgr_get_names() {
 
 /**
  * Load the names of all 'webviewer_url_handlers' for use at forms.
- *
- * @todo: Let all plugins to define an optional vcs, so this can live inside
- *        versioncontrol_plugin_get_names().
  */
-function versioncontrol_webviewer_url_handlers_get_names($vcs='') {
-  ctools_include('plugins');
-
-  $names = array();
-  foreach (ctools_get_plugins('versioncontrol', 'webviewer_url_handlers') as $name => $plugin) {
-    if (!empty($vcs)) {
-      if ($plugin['vcs'] == $vcs) {
-        $names[$name] = $plugin['title'];
-      }
-    }
-    else {
-      $names[$name] = $plugin['title'];
-    }
-  }
+function versioncontrol_webviewer_url_handlers_get_names($vcs = '') {
+  return versioncontrol_plugin_get_names_by_vcs('webviewer_url_handlers', $vcs);
+}
 
-  asort($names);
-  return $names;
+/**
+ * Load the names of all 'event_processor' plugins to be used at forms.
+ */
+function versioncontrol_event_processor_get_names($vcs = '') {
+  return versioncontrol_plugin_get_names_by_vcs('event_processor', $vcs);
 }
 
 /**
@@ -648,7 +673,37 @@ function versioncontrol_webviewer_url_handlers_get_default_plugin($vcs) {
 }
 
 /**
- * Helper function for handlin plugin settings.
+ * Retrieves the default 'event_processor' plugins.
+ *
+ * @param string $vcs
+ *   Version Control System machine name as defined by
+ *   hook_versioncontrol_backends().
+ *
+ * @return array
+ *   A list of plugin machine names. It can be empty.
+ */
+function versioncontrol_event_processor_get_default_plugins($vcs) {
+  $default_event_processors = array();
+  ctools_include('plugins');
+  $default_event_processors = variable_get('versioncontrol_repository_plugin_default_event_processor', array());
+  $valid_plugins = array();
+  foreach (ctools_get_plugins('versioncontrol', 'event_processor') as $name => $plugin) {
+    if ($plugin['vcs'] == $vcs) {
+      $valid_plugins[] = $name;
+    }
+  }
+  asort($valid_plugins);
+
+  foreach ($default_event_processors as $key => $default_event_processor) {
+    if (!in_array($default_event_processor, $valid_plugins)) {
+      unset($default_event_processors[$key]);
+    }
+  }
+  return $default_event_processors;
+}
+
+/**
+ * Helper function for handling plugin settings.
  */
 function versioncontrol_plugins_get_information() {
   return array(
@@ -656,26 +711,37 @@ function versioncontrol_plugins_get_information() {
       'author_mapper' => array(
         'name' => t('Repository author mapping'),
         'fetcher' => 'versioncontrol_user_mapping_methods_get_names',
+        'multiple' => FALSE,
       ),
       'committer_mapper'   => array(
         'name' => t('Repository committer mapping'),
         'fetcher' => 'versioncontrol_user_mapping_methods_get_names',
+        'multiple' => FALSE,
       ),
       'auth_handler' => array(
         'name' => t('Repository versioncontrol authentication'),
         'fetcher' => 'versioncontrol_auth_handlers_get_names',
+        'multiple' => FALSE,
       ),
       'webviewer_url_handler' => array(
         'name' => t('Repository webviewer URL handler'),
         'fetcher' => 'versioncontrol_webviewer_url_handlers_get_names',
+        'multiple' => FALSE,
       ),
       'repomgr' => array(
         'name' => t('Repository manager'),
         'fetcher' => 'versioncontrol_repomgr_get_names',
+        'multiple' => FALSE,
       ),
       'reposync' => array(
         'name' => t('Repository syncronization'),
         'fetcher' => 'versioncontrol_reposync_get_names',
+        'multiple' => FALSE,
+      ),
+      'event_processor' => array(
+        'name' => t('Event processor'),
+        'fetcher' => 'versioncontrol_event_processor_get_names',
+        'multiple' => TRUE,
       ),
     ),
     'view' => array(
