diff --git a/message_notify.info b/message_notify.info
index dcef414..9755d7e 100644
--- a/message_notify.info
+++ b/message_notify.info
@@ -5,4 +5,4 @@ package = Message
 dependencies[] = message
 
 files[] = includes/message_notify.exception.inc
-
+files[] = plugins/notifier/abstract.inc
\ No newline at end of file
diff --git a/message_notify.install b/message_notify.install
new file mode 100644
index 0000000..a7c7a3a
--- /dev/null
+++ b/message_notify.install
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Install, update, and uninstall functions for the message notify module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function message_notify_install() {
+  // Create instance of the message text in our custom bundle.
+  $instance = array(
+    'field_name' => MESSAGE_FIELD_MESSAGE_TEXT,
+    'bundle' => 'message_type_email',
+    'entity_type' => 'message_type',
+    'label' => t('Message email body'),
+    'description' => t('This is the body of the email.'),
+    'required' => TRUE,
+    'settings' => array(
+      'text_processing' => 1,
+    ),
+  );
+  field_create_instance($instance);
+
+  // Create the field holding the message email "subject", in our custom bundle.
+  $field = array(
+    'field_name' => 'message_text_subject',
+    'type' => 'text',
+    'entity_types' => array('message_type'),
+    'cardinality' => 1,
+    'translatable' => TRUE,
+    'locked' => TRUE,
+  );
+  $field = field_create_field($field);
+
+  $instance = array(
+    'field_name' => 'message_text_subject',
+    'bundle' => 'message_type_email',
+    'entity_type' => 'message_type',
+    'label' => t('Message email subject'),
+    'description' => t('This is the subject of the email.'),
+    'required' => TRUE,
+    'widget' => array(
+      // Position above the text field.
+      'weight' => -10,
+    ),
+  );
+  field_create_instance($instance);
+}
\ No newline at end of file
diff --git a/message_notify.module b/message_notify.module
old mode 100755
new mode 100644
index 3dd8ed1..a4a86d3
--- a/message_notify.module
+++ b/message_notify.module
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Extends the message API to send messages as notifications.
+ * Message notify.
  */
 
 /**
@@ -11,7 +11,7 @@
  * @param $message
  *   The message entity being used for the notification.
  * @param $options
- *
+ *   Array of options to override the plugin's default ones.
  * @param $notifier_name
  *   Optional; The name of the notifier to use. Defaults to "email"
  *   sending method.
@@ -19,72 +19,60 @@
  * @return
  *   Boolean value denoting success or failure of the notification.
  */
-function message_notify_send_message(Message $message, $options = array(), $notifier_name = 'email') {
-  ctools_include('plugins');
-  if (!$class = ctools_plugin_load_class('message_notify', 'notifier', $notifier_name, 'class')) {
-    throw new MessageNotifyException(format_string('Could not send notification using the "@notifier" notifier.'), array('@notifier' => $notifier_name));
-  }
-
-  // Set default values.
-  // Defaults can be overridden by notifiers and directly via the function
-  // parameter.
-  $options = array_merge_recursive($options, $notifier['defaults'], array(
-  ));
-
-  $notifier = new $class($message, $options);
-  return $notifier->send();
-
-  $account = user_load($message->uid);
-
-  // Process rendered fields.
-  if (!empty($options['rendered fields']) && is_array($options['rendered fields'])) {
-    $rendered_fields = $options['rendered fields'];
-    foreach ($rendered_fields as $rendered_name => $field_name) {
-      $message->$rendered_name = $message->getText($account->language, array('field name' => $field_name));
-    }
-
-    // Rendered field saving. Fields must be present in both arrays.
-    if (!empty($options['save rendered fields']) && is_array($options['save rendered fields'])) {
-      $save_fields = array_filter($options['save rendered fields']);
-      // We can't save fields that aren't in the rendered fields array.
-      $save_fields = array_intersect_key($save_fields, $rendered_fields);
-      if (!empty($save_fields)) {
-        $wrapper = entity_metadata_wrapper('message', $message);
-        foreach ($save_fields as $rendered_name => $field_name) {
-          // Get the format from the field.
-          if (!empty($wrapper->type->{$rendered_fields[$rendered_name]}->format)) {
-            $format = $wrapper->type->{$rendered_fields[$rendered_name]}->format->value();
-            $wrapper->{$field_name}->set(array('value' => $message->$rendered_name, 'format' => $format));
-          }
-          else {
-            $wrapper->{$field_name}->set($message->$rendered_name);
-          }
-        }
-      }
-    }
+function message_notify_send_message(Message $message, array $options = array(), $notifier_name = 'email') {
+  if (!$plugin = message_notify_get_notifier($notifier_name)) {
+   throw new MessageNotifyException(format_string('Could not send notification using the "@notifier" notifier.'), array('@notifier' => $notifier_name));
   }
+  $options += $plugin['options'];
+  $plugin['options'] = $options;
 
-  // Send out via the requested notification method.
-  if (!empty($notifier['handler'])) {
-    $result = $mailnotifier->message_notify_send($message, $account);
-  }
-  else {
-    watchdog('message_notify', t('Could not send notification using the "@notifier" notifier to user ID @uid because the notifer has no send callback.'), array('@notifier' => $notifier_name, '@uid' => $message->uid), WATCHDOG_ERROR);
-    return FALSE;
+  $class = ctools_plugin_load_class('message_notify', 'notifier', $notifier_name, 'class');
+  $notifier = new $class($plugin, $message);
+  if ($notifier->access()) {
+    return $notifier->send();
   }
+}
 
-  if (!$result) {
-    watchdog('message_notify', t('Could not send notification using the "@notifier" notifier to user ID @uid'), array('@notifier' => $notifier_name, '@uid' => $message->uid), WATCHDOG_ERROR);
-    if ($options['save on fail']) {
-      $message->save();
+/**
+ * Implements hook_entity_info_alter().
+ *
+ * Add a the notifiers view modes.
+ */
+function message_notify_entity_info_alter(&$entity_info) {
+  foreach (message_notify_get_notifiers() as $notifier_name => $plugin) {
+    $class = ctools_plugin_load_class('message_notify', 'notifier', $notifier_name, 'class');
+    $view_modes = $class::viewModes();
+    // Set default values.
+    foreach ($view_modes as &$view_mode) {
+      $view_mode += array('custom settings' => FALSE);
     }
+    $entity_info['message']['view modes'] += $view_modes;
   }
-  elseif ($result && $options['save on success']) {
-    $message->save();
-  }
-  return $result;
 }
 
+/**
+ * Implements hook_default_message_type_category().
+ */
+function message_notify_default_message_type_category() {
+  $items = array();
+  $items['message_type_email'] = entity_import('message_type_category', '{
+    "category" : "message_type_email",
+    "description" : "Message type email",
+    "statusKey" : "status",
+    "rdf_mapping" : []
+  }');
+  return $items;
+}
+
+/**
+ * Implements hook_mail().
+ *
+ * Set's the message subject and body as configured.
+ */
+function message_notify_mail($key, &$message, $params) {
+  $message['subject'] = $params['message_notify_email_subject'];
+  $message['body'][] = $params['message_notify_email_body'];
+}
 
 /**
  * Implements hook_ctools_plugin_api().
@@ -117,15 +105,39 @@ function message_notify_ctools_plugin_directory($module, $plugin) {
 
 /**
  * CTools callback; Process the notifier plugins.
+ *
+ * TODO: document keys.
  */
 function message_notify_plugin_process(&$plugin, $info) {
   $plugin += array(
-    'save on fail' => TRUE,
-    'save on success' => TRUE,
-    // Override mail.
-    'mail' => FALSE,
-    // Override user's language, and use Message language.
-    'language override' => FALSE,
-    'rendered fields' => array(),
+    'description' => '',
+    'options' => array(
+      'save on fail' => TRUE,
+      'save on success' => TRUE,
+      // Override mail.
+      'mail' => FALSE,
+      // Override user's language, and use Message language.
+      'language override' => FALSE,
+      'rendered fields' => array(),
+    ),
   );
-}
\ No newline at end of file
+}
+
+/**
+ * Helper function to include CTools plugins and get a notifier plguin.
+ *
+ * @param $plugin_name
+ *   The plugin that should be laoded.
+ */
+function message_notify_get_notifier($notifier_name) {
+  ctools_include('plugins');
+  return ctools_get_plugins('message_notify', 'notifier', $notifier_name);
+}
+
+/**
+ * Helper function to include CTools plugins and get all notifier plugins.
+ */
+function message_notify_get_notifiers() {
+  ctools_include('plugins');
+  return ctools_get_plugins('message_notify', 'notifier');
+}
diff --git a/message_notify_email/message_notify_email.info b/message_notify_email/message_notify_email.info
deleted file mode 100755
index 1919a49..0000000
--- a/message_notify_email/message_notify_email.info
+++ /dev/null
@@ -1,8 +0,0 @@
-name = Message notify email
-description = An email notifier for message notify. Comes with an email message type.
-core = 7.x
-package = Message
-dependencies[] = message_notify
-dependencies[] = ctools
-
-files[] = plugins/notifier/email.inc
diff --git a/message_notify_email/message_notify_email.install b/message_notify_email/message_notify_email.install
deleted file mode 100755
index 0a78e77..0000000
--- a/message_notify_email/message_notify_email.install
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-/**
- * @file
- * Install, update and uninstall functions for the message notify email module.
- */
-
-/**
- * Implements hook_install().
- */
-function message_notify_email_install() {
-  // Create instance of the message text in our custom bundle.
-  $instance = array(
-    'field_name' => MESSAGE_FIELD_MESSAGE_TEXT,
-    'bundle' => 'message_type_email',
-    'entity_type' => 'message_type',
-    'label' => st('Message email body'),
-    'description' => st('This is the body of the email.'),
-    'required' => TRUE,
-    'settings' => array(
-      'text_processing' => 1,
-    ),
-  );
-  field_create_instance($instance);
-
-  // Create the field holding the message email "subject", in our custom bundle.
-  $field = array(
-    'field_name' => 'message_text_subject',
-    'type' => 'text',
-    'entity_types' => array('message_type'),
-    'cardinality' => 1,
-    'translatable' => TRUE,
-    'locked' => TRUE,
-  );
-  $field = field_create_field($field);
-
-  $instance = array(
-    'field_name' => 'message_text_subject',
-    'bundle' => 'message_type_email',
-    'entity_type' => 'message_type',
-    'label' => st('Message email subject'),
-    'description' => st('This is the subject of the email.'),
-    'required' => TRUE,
-    'widget' => array(
-      // Position above the text field.
-      'weight' => -10,
-    ),
-  );
-  field_create_instance($instance);
-}
diff --git a/message_notify_email/message_notify_email.module b/message_notify_email/message_notify_email.module
deleted file mode 100755
index c41a947..0000000
--- a/message_notify_email/message_notify_email.module
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * @file
- * An email notifier for message notify. Comes with an email message type.
- */
-
-/**
- * Implements hook_default_message_type_category().
- */
-function message_notify_email_default_message_type_category() {
-  $items = array();
-  $items['message_type_email'] = entity_import('message_type_category', '{
-    "category" : "message_type_email",
-    "description" : "Message type email",
-    "statusKey" : "status",
-    "rdf_mapping" : []
-  }');
-  return $items;
-}
-
-/**
- * Implements hook_mail().
- *
- * Sets the message subject and body as configured.
- */
-function message_notify_email_mail($key, &$message, $params) {
-  $message['subject'] = $params['rendered_subject'];
-  $message['body'][] = $params['rendered_body'];
-}
-
-/**
- * Implements hook_message_view().
- */
-function message_notify_email_message_view($message, $view_mode, $langcode) {
-  if ($message->getType()->category == 'message_type_email') {
-    $message->content['subject'] = array(
-      // Add the subject field.
-      '#markup' => $message->getText($langcode, array('field name' => 'message_text_subject')),
-    );
-  }
-}
-
-/**
- * Implements hook_ctools_plugin_dierctory().
- *
- * Used to let the system know we implement plugins.
- */
-function message_notify_email_ctools_plugin_directory($module, $plugin) {
-  if ($module == 'message_notify') {
-    return 'plugins/' . $plugin;
-  }
-}
diff --git a/message_notify_email/plugins/notifier/email.inc b/message_notify_email/plugins/notifier/email.inc
deleted file mode 100755
index 70d39fd..0000000
--- a/message_notify_email/plugins/notifier/email.inc
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/**
- * @file
- * Plugin to provide an email notifier.
- */
-
-/**
- * Plugins are described by creating a $plugin array which will be used
- * by the system that includes this file.
- */
-$path = drupal_get_path('module', 'message_notify');
-include($path . '/notifier.inc');
-
-$plugin = array(
-  'title' => t("Email"),
-  'description' => t('Send notification messages via email'),
-  'handler' => array(
-    'class' => 'EmailNotifier',
-  ),
-  //'send_callback' => 'message_notify_email_send',
-  'defaults' => array(
-    'rendered fields' => array(
-      'rendered_subject' => 'message_text_subject',
-      'rendered_body' => MESSAGE_FIELD_MESSAGE_TEXT,
-    ),
-  ),
-);
-
-/**
- * Send callback for the email notifier plugin.
- */
-
-class EmailNotifier extends notifier{
-public function message_notify_send() {
-  $this->message = $message;
-  $this->account = $account;
-  $lang = !empty($account->language) ? $languages[$account->language]: language_default();
-  $params = array(
-    'message_entity' => $message,
-    'rendered_subject' => $message->rendered_subject,
-    'rendered_body' => $message->rendered_body,
-  );
-  $result = drupal_mail('message_notify_email', $message->type, $account->mail, $lang, $params);
-}
-}
diff --git a/message_notify_example/message_notify_example.features.field.inc b/message_notify_example/message_notify_example.features.field.inc
deleted file mode 100644
index f31db29..0000000
--- a/message_notify_example/message_notify_example.features.field.inc
+++ /dev/null
@@ -1,232 +0,0 @@
-<?php
-/**
- * @file
- * message_notify_example.features.field.inc
- */
-
-/**
- * Implements hook_field_default_fields().
- */
-function message_notify_example_field_default_fields() {
-  $fields = array();
-
-  // Exported field: 'message-comment_insert-field_comment_ref'
-  $fields['message-comment_insert-field_comment_ref'] = array(
-    'field_config' => array(
-      'active' => '1',
-      'cardinality' => '1',
-      'deleted' => '0',
-      'entity_types' => array(),
-      'field_name' => 'field_comment_ref',
-      'foreign keys' => array(
-        'comment' => array(
-          'columns' => array(
-            'target_id' => 'cid',
-          ),
-          'table' => 'comment',
-        ),
-      ),
-      'indexes' => array(
-        'target_id' => array(
-          0 => 'target_id',
-        ),
-      ),
-      'module' => 'entityreference',
-      'settings' => array(
-        'handler' => 'base',
-        'handler_settings' => array(
-          'behaviors' => array(
-            'views-select-list' => array(
-              'status' => 0,
-            ),
-          ),
-          'sort' => array(
-            'direction' => 'ASC',
-            'field' => 'comment_body:value',
-            'property' => 'nid',
-            'type' => 'none',
-          ),
-          'target_bundles' => array(),
-        ),
-        'handler_submit' => 'Change handler',
-        'target_type' => 'comment',
-      ),
-      'translatable' => '0',
-      'type' => 'entityreference',
-    ),
-    'field_instance' => array(
-      'bundle' => 'comment_insert',
-      'default_value' => NULL,
-      'default_value_function' => '',
-      'deleted' => '0',
-      'description' => '',
-      'display' => array(
-        'default' => array(
-          'label' => 'above',
-          'module' => 'entityreference',
-          'settings' => array(
-            'link' => FALSE,
-          ),
-          'type' => 'entityreference_label',
-          'weight' => 3,
-        ),
-      ),
-      'entity_type' => 'message',
-      'field_name' => 'field_comment_ref',
-      'label' => 'Comment reference',
-      'required' => 1,
-      'settings' => array(
-        'behaviors' => array(
-          'prepopulate' => array(
-            'action' => 'none',
-            'fallback' => 'none',
-            'skip_perm' => '0',
-            'status' => 0,
-          ),
-        ),
-        'user_register_form' => FALSE,
-      ),
-      'widget' => array(
-        'active' => 1,
-        'module' => 'entityreference',
-        'settings' => array(
-          'match_operator' => 'CONTAINS',
-          'path' => '',
-          'size' => '60',
-        ),
-        'type' => 'entityreference_autocomplete',
-        'weight' => '3',
-      ),
-    ),
-  );
-
-  // Exported field: 'message-comment_insert-field_message_rendered_body'
-  $fields['message-comment_insert-field_message_rendered_body'] = array(
-    'field_config' => array(
-      'active' => '1',
-      'cardinality' => '1',
-      'deleted' => '0',
-      'entity_types' => array(),
-      'field_name' => 'field_message_rendered_body',
-      'foreign keys' => array(
-        'format' => array(
-          'columns' => array(
-            'format' => 'format',
-          ),
-          'table' => 'filter_format',
-        ),
-      ),
-      'indexes' => array(
-        'format' => array(
-          0 => 'format',
-        ),
-      ),
-      'module' => 'text',
-      'settings' => array(),
-      'translatable' => '0',
-      'type' => 'text_long',
-    ),
-    'field_instance' => array(
-      'bundle' => 'comment_insert',
-      'default_value' => NULL,
-      'deleted' => '0',
-      'description' => '',
-      'display' => array(
-        'default' => array(
-          'label' => 'above',
-          'module' => 'text',
-          'settings' => array(),
-          'type' => 'text_default',
-          'weight' => 1,
-        ),
-      ),
-      'entity_type' => 'message',
-      'field_name' => 'field_message_rendered_body',
-      'label' => 'Rendered body',
-      'required' => 0,
-      'settings' => array(
-        'text_processing' => '1',
-        'user_register_form' => FALSE,
-      ),
-      'widget' => array(
-        'active' => 1,
-        'module' => 'text',
-        'settings' => array(
-          'rows' => '5',
-        ),
-        'type' => 'text_textarea',
-        'weight' => '1',
-      ),
-    ),
-  );
-
-  // Exported field: 'message-comment_insert-field_message_rendered_subject'
-  $fields['message-comment_insert-field_message_rendered_subject'] = array(
-    'field_config' => array(
-      'active' => '1',
-      'cardinality' => '1',
-      'deleted' => '0',
-      'entity_types' => array(),
-      'field_name' => 'field_message_rendered_subject',
-      'foreign keys' => array(
-        'format' => array(
-          'columns' => array(
-            'format' => 'format',
-          ),
-          'table' => 'filter_format',
-        ),
-      ),
-      'indexes' => array(
-        'format' => array(
-          0 => 'format',
-        ),
-      ),
-      'module' => 'text',
-      'settings' => array(
-        'max_length' => '255',
-      ),
-      'translatable' => '0',
-      'type' => 'text',
-    ),
-    'field_instance' => array(
-      'bundle' => 'comment_insert',
-      'default_value' => NULL,
-      'deleted' => '0',
-      'description' => '',
-      'display' => array(
-        'default' => array(
-          'label' => 'above',
-          'module' => 'text',
-          'settings' => array(),
-          'type' => 'text_default',
-          'weight' => 2,
-        ),
-      ),
-      'entity_type' => 'message',
-      'field_name' => 'field_message_rendered_subject',
-      'label' => 'Rendered subject',
-      'required' => 0,
-      'settings' => array(
-        'text_processing' => '0',
-        'user_register_form' => FALSE,
-      ),
-      'widget' => array(
-        'active' => 1,
-        'module' => 'text',
-        'settings' => array(
-          'size' => '60',
-        ),
-        'type' => 'text_textfield',
-        'weight' => '0',
-      ),
-    ),
-  );
-
-  // Translatables
-  // Included for use with string extractors like potx.
-  t('Comment reference');
-  t('Rendered body');
-  t('Rendered subject');
-
-  return $fields;
-}
diff --git a/message_notify_example/message_notify_example.features.inc b/message_notify_example/message_notify_example.features.inc
deleted file mode 100644
index 7cb3f7e..0000000
--- a/message_notify_example/message_notify_example.features.inc
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * @file
- * message_notify_example.features.inc
- */
-
-/**
- * Implements hook_views_api().
- */
-function message_notify_example_views_api() {
-  list($module, $api) = func_get_args();
-  if ($module == "views" && $api == "views_default") {
-    return array("version" => "3.0");
-  }
-}
-
-/**
- * Implements hook_default_message_type().
- */
-function message_notify_example_default_message_type() {
-  $items = array();
-  $items['comment_insert'] = entity_import('message_type', '{
-    "name" : "comment_insert",
-    "description" : "Comment insert",
-    "argument_keys" : [],
-    "argument" : [],
-    "category" : "message_type_email",
-    "data" : { "purge" : { "override" : 0, "enabled" : 0, "quota" : "", "days" : "" } },
-    "language" : "",
-    "arguments" : null,
-    "message_text" : { "und" : [
-        {
-          "value" : "Hello [message:field-comment-ref:node:author],\\r\\n\\r\\n\\u003Ca href=\\u0022[message:field-comment-ref:author:url]\\u0022\\u003E[message:field-comment-ref:author:name]\\u003C\\/a\\u003E has commented on your post \\u003Ca href=\\u0022[message:field-comment-ref:node:url]\\u0022\\u003E[message:field-comment-ref:node:title]\\u003C\\/a\\u003E.\\r\\n\\r\\nCheers,\\r\\nMessage notify example robot\\r\\n",
-          "format" : "full_html",
-          "safe_value" : "\\u003Cp\\u003EHello [message:field-comment-ref:node:author],\\u003C\\/p\\u003E\\n\\u003Cp\\u003E\\u003Ca href=\\u0022[message:field-comment-ref:author:url]\\u0022\\u003E[message:field-comment-ref:author:name]\\u003C\\/a\\u003E has commented on your post \\u003Ca href=\\u0022[message:field-comment-ref:node:url]\\u0022\\u003E[message:field-comment-ref:node:title]\\u003C\\/a\\u003E.\\u003C\\/p\\u003E\\n\\u003Cp\\u003ECheers,\\u003Cbr \\/\\u003E\\nMessage notify example robot\\u003C\\/p\\u003E\\n"
-        }
-      ]
-    },
-    "message_text_subject" : { "und" : [
-        {
-          "value" : "[message:field-comment-ref:author] commented on [message:field-comment-ref:node:title]",
-          "format" : null,
-          "safe_value" : "[message:field-comment-ref:author] commented on [message:field-comment-ref:node:title]"
-        }
-      ]
-    },
-    "rdf_mapping" : []
-  }');
-  return $items;
-}
diff --git a/message_notify_example/message_notify_example.info b/message_notify_example/message_notify_example.info
deleted file mode 100644
index 9022738..0000000
--- a/message_notify_example/message_notify_example.info
+++ /dev/null
@@ -1,18 +0,0 @@
-name = Message notify example
-description = Message notify example
-core = 7.x
-package = Features
-php = 5.2.4
-project = message_notify
-dependencies[] = "entityreference"
-dependencies[] = "features"
-dependencies[] = "message"
-dependencies[] = "message_notify"
-dependencies[] = "views"
-dependencies[] = entity_token
-features[ctools][] = "views:views_default:3.0"
-features[field][] = "message-comment_insert-field_comment_ref"
-features[field][] = "message-comment_insert-field_message_rendered_body"
-features[field][] = "message-comment_insert-field_message_rendered_subject"
-features[message_type][] = "comment_insert"
-features[views_view][] = "message_notify_example"
diff --git a/message_notify_example/message_notify_example.module b/message_notify_example/message_notify_example.module
deleted file mode 100644
index 8b4fcee..0000000
--- a/message_notify_example/message_notify_example.module
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * @file
- * Code for the Message notify example feature.
- */
-
-include_once('message_notify_example.features.inc');
-
-/**
- * Implements hook_comment_insert().
- *
- * Send a message to the node author when a new comment is created.
- */
-function message_notify_example_comment_insert($comment) {
-  $node = node_load($comment->nid);
-  if ($comment->uid == $node->uid) {
-    // The comment author is also the node author.
-    return;
-  }
-
-  // Create a new message, assigned to the comment author, and add a
-  // reference to the comment, so we can later use tokens related to that
-  // comment.
-  $message = message_create('comment_insert', array('uid' => $comment->uid));
-  $wrapper = entity_metadata_wrapper('message', $message);
-  $wrapper->field_comment_ref->set($comment);
-
-  // Let message-notify deliver the email, and send the message for us.
-  // We pass in the options the field names, that will be used to capture
-  // the rendered message, and provide an email log.
-  $options = array(
-    'rendered subject field' => 'field_message_rendered_subject',
-    'rendered body field' => 'field_message_rendered_body',
-  );
-  message_notify_send_message($message, 'email', $options);
-}
diff --git a/message_notify_example/message_notify_example.views_default.inc b/message_notify_example/message_notify_example.views_default.inc
deleted file mode 100644
index 7e1a1bd..0000000
--- a/message_notify_example/message_notify_example.views_default.inc
+++ /dev/null
@@ -1,212 +0,0 @@
-<?php
-/**
- * @file
- * message_notify_example.views_default.inc
- */
-
-/**
- * Implements hook_views_default_views().
- */
-function message_notify_example_views_default_views() {
-  $export = array();
-
-  $view = new view;
-  $view->name = 'message_notify_example';
-  $view->description = 'Show messages that were sent by email.';
-  $view->tag = 'default';
-  $view->base_table = 'message';
-  $view->human_name = 'Message notify example';
-  $view->core = 7;
-  $view->api_version = '3.0';
-  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
-
-  /* Display: Master */
-  $handler = $view->new_display('default', 'Master', 'default');
-  $handler->display->display_options['title'] = 'Message notify example';
-  $handler->display->display_options['access']['type'] = 'none';
-  $handler->display->display_options['cache']['type'] = 'none';
-  $handler->display->display_options['query']['type'] = 'views_query';
-  $handler->display->display_options['query']['options']['query_comment'] = FALSE;
-  $handler->display->display_options['exposed_form']['type'] = 'basic';
-  $handler->display->display_options['pager']['type'] = 'full';
-  $handler->display->display_options['pager']['options']['items_per_page'] = '25';
-  $handler->display->display_options['style_plugin'] = 'table';
-  $handler->display->display_options['style_options']['group_rendered'] = 1;
-  $handler->display->display_options['style_options']['columns'] = array(
-    'field_message_rendered_body' => 'field_message_rendered_body',
-    'field_message_rendered_subject' => 'field_message_rendered_subject',
-    'timestamp' => 'timestamp',
-    'name' => 'name',
-  );
-  $handler->display->display_options['style_options']['default'] = '-1';
-  $handler->display->display_options['style_options']['info'] = array(
-    'field_message_rendered_body' => array(
-      'sortable' => 0,
-      'default_sort_order' => 'asc',
-      'align' => '',
-      'separator' => '',
-      'empty_column' => 0,
-    ),
-    'field_message_rendered_subject' => array(
-      'sortable' => 0,
-      'default_sort_order' => 'asc',
-      'align' => '',
-      'separator' => '',
-      'empty_column' => 0,
-    ),
-    'timestamp' => array(
-      'sortable' => 0,
-      'default_sort_order' => 'asc',
-      'align' => '',
-      'separator' => '',
-      'empty_column' => 0,
-    ),
-    'name' => array(
-      'sortable' => 0,
-      'default_sort_order' => 'asc',
-      'align' => '',
-      'separator' => '',
-      'empty_column' => 0,
-    ),
-  );
-  $handler->display->display_options['style_options']['override'] = 1;
-  $handler->display->display_options['style_options']['sticky'] = 0;
-  $handler->display->display_options['style_options']['empty_table'] = 0;
-  /* Relationship: Message: User uid */
-  $handler->display->display_options['relationships']['user']['id'] = 'user';
-  $handler->display->display_options['relationships']['user']['table'] = 'message';
-  $handler->display->display_options['relationships']['user']['field'] = 'user';
-  $handler->display->display_options['relationships']['user']['required'] = 0;
-  /* Field: Message: Rendered subject */
-  $handler->display->display_options['fields']['field_message_rendered_subject']['id'] = 'field_message_rendered_subject';
-  $handler->display->display_options['fields']['field_message_rendered_subject']['table'] = 'field_data_field_message_rendered_subject';
-  $handler->display->display_options['fields']['field_message_rendered_subject']['field'] = 'field_message_rendered_subject';
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['alter_text'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['make_link'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['absolute'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['external'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['replace_spaces'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['trim_whitespace'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['nl2br'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['word_boundary'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['ellipsis'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['strip_tags'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['trim'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['alter']['html'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['element_label_colon'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['element_default_classes'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['hide_empty'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['empty_zero'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['hide_alter_empty'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_subject']['field_api_classes'] = 0;
-  /* Field: Message: Rendered body */
-  $handler->display->display_options['fields']['field_message_rendered_body']['id'] = 'field_message_rendered_body';
-  $handler->display->display_options['fields']['field_message_rendered_body']['table'] = 'field_data_field_message_rendered_body';
-  $handler->display->display_options['fields']['field_message_rendered_body']['field'] = 'field_message_rendered_body';
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['alter_text'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['make_link'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['absolute'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['external'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['replace_spaces'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['trim_whitespace'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['nl2br'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['word_boundary'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['ellipsis'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['strip_tags'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['trim'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['alter']['html'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['element_label_colon'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_body']['element_default_classes'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_body']['hide_empty'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['empty_zero'] = 0;
-  $handler->display->display_options['fields']['field_message_rendered_body']['hide_alter_empty'] = 1;
-  $handler->display->display_options['fields']['field_message_rendered_body']['field_api_classes'] = 0;
-  /* Field: User: Name */
-  $handler->display->display_options['fields']['name']['id'] = 'name';
-  $handler->display->display_options['fields']['name']['table'] = 'users';
-  $handler->display->display_options['fields']['name']['field'] = 'name';
-  $handler->display->display_options['fields']['name']['relationship'] = 'user';
-  $handler->display->display_options['fields']['name']['alter']['alter_text'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['make_link'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['absolute'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['external'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['replace_spaces'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['trim_whitespace'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['nl2br'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['word_boundary'] = 1;
-  $handler->display->display_options['fields']['name']['alter']['ellipsis'] = 1;
-  $handler->display->display_options['fields']['name']['alter']['strip_tags'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['trim'] = 0;
-  $handler->display->display_options['fields']['name']['alter']['html'] = 0;
-  $handler->display->display_options['fields']['name']['element_label_colon'] = 1;
-  $handler->display->display_options['fields']['name']['element_default_classes'] = 1;
-  $handler->display->display_options['fields']['name']['hide_empty'] = 0;
-  $handler->display->display_options['fields']['name']['empty_zero'] = 0;
-  $handler->display->display_options['fields']['name']['hide_alter_empty'] = 1;
-  $handler->display->display_options['fields']['name']['link_to_user'] = 1;
-  $handler->display->display_options['fields']['name']['overwrite_anonymous'] = 0;
-  $handler->display->display_options['fields']['name']['format_username'] = 1;
-  /* Field: Message: Timestamp */
-  $handler->display->display_options['fields']['timestamp']['id'] = 'timestamp';
-  $handler->display->display_options['fields']['timestamp']['table'] = 'message';
-  $handler->display->display_options['fields']['timestamp']['field'] = 'timestamp';
-  $handler->display->display_options['fields']['timestamp']['alter']['alter_text'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['make_link'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['absolute'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['external'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['replace_spaces'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['trim_whitespace'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['nl2br'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['word_boundary'] = 1;
-  $handler->display->display_options['fields']['timestamp']['alter']['ellipsis'] = 1;
-  $handler->display->display_options['fields']['timestamp']['alter']['strip_tags'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['trim'] = 0;
-  $handler->display->display_options['fields']['timestamp']['alter']['html'] = 0;
-  $handler->display->display_options['fields']['timestamp']['element_label_colon'] = 1;
-  $handler->display->display_options['fields']['timestamp']['element_default_classes'] = 1;
-  $handler->display->display_options['fields']['timestamp']['hide_empty'] = 0;
-  $handler->display->display_options['fields']['timestamp']['empty_zero'] = 0;
-  $handler->display->display_options['fields']['timestamp']['hide_alter_empty'] = 1;
-  $handler->display->display_options['fields']['timestamp']['date_format'] = 'long';
-  /* Sort criterion: Message: Message ID */
-  $handler->display->display_options['sorts']['mid']['id'] = 'mid';
-  $handler->display->display_options['sorts']['mid']['table'] = 'message';
-  $handler->display->display_options['sorts']['mid']['field'] = 'mid';
-  $handler->display->display_options['sorts']['mid']['order'] = 'DESC';
-  /* Filter criterion: Message: Type */
-  $handler->display->display_options['filters']['type']['id'] = 'type';
-  $handler->display->display_options['filters']['type']['table'] = 'message';
-  $handler->display->display_options['filters']['type']['field'] = 'type';
-  $handler->display->display_options['filters']['type']['value'] = array(
-    'comment_insert' => 'comment_insert',
-  );
-
-  /* Display: Page */
-  $handler = $view->new_display('page', 'Page', 'page');
-  $handler->display->display_options['path'] = 'message-notify-example';
-  $handler->display->display_options['menu']['type'] = 'normal';
-  $handler->display->display_options['menu']['title'] = 'Message notify example';
-  $handler->display->display_options['menu']['weight'] = '0';
-  $translatables['message_notify_example'] = array(
-    t('Master'),
-    t('Message notify example'),
-    t('more'),
-    t('Apply'),
-    t('Reset'),
-    t('Sort by'),
-    t('Asc'),
-    t('Desc'),
-    t('Items per page'),
-    t('- All -'),
-    t('Offset'),
-    t('User'),
-    t('Rendered subject'),
-    t('Rendered body'),
-    t('Name'),
-    t('Timestamp'),
-    t('Page'),
-  );
-  $export['message_notify_example'] = $view;
-
-  return $export;
-}
diff --git a/plugins/notifier/abstract.inc b/plugins/notifier/abstract.inc
new file mode 100644
index 0000000..600dd20
--- /dev/null
+++ b/plugins/notifier/abstract.inc
@@ -0,0 +1,150 @@
+<?php
+
+/**
+ * Additional behaviors for a Entity Reference field.
+ *
+ * Implementations that wish to provide an implementation of this should
+ * register it using CTools' plugin system.
+ */
+interface MessageNotifierInterface {
+
+  /**
+   * Constructor for the notifier.
+   *
+   * @param $plugin
+   *   The notifier plugin object. Note the "options" values might have
+   *   been overriden in message_notify_send_message().
+   * @param Message $message
+   *   The Message entity.
+   */
+  public function __construct($plugin, Message $message);
+
+  /**
+   * Entry point to send and process a message.
+   */
+  public function send();
+
+  /**
+   * Deliver a message via the required transport method.
+   *
+   * @param $output
+   *   Array keyed by the view mode, and the rendered entity in the
+   *   specified view mode.
+   *
+   * @return
+   *   TRUE or FALSE based on delivery status.
+   */
+  public function deliver(array $output = array());
+
+  /**
+   * Post send operations.
+   */
+  public function postSend($result, array $output = array());
+
+  /**
+   * Determine if user can access notifier.
+   */
+  public function access();
+
+  /**
+   * Allow notifier to define its own view modes.
+   *
+   * Those view modes are later going to be rendered and sent.
+   */
+  public static function viewModes();
+}
+
+/**
+ * An abstract implementation of MessageNotifierInterface.
+ */
+abstract class MessageNotifierBase implements MessageNotifierInterface {
+
+  /**
+   * The plugin definition.
+   */
+  protected $plugin;
+
+  /**
+   * The message entity.
+   */
+  protected $message;
+
+  public function __construct($plugin, Message $message) {
+    $this->plugin = $plugin;
+    $this->message = $message;
+  }
+
+  public function send() {
+    $message = $this->message;
+    $output = array();
+    foreach ($this->viewModes() as $view_mode => $value) {
+      $output[$view_mode] = render($message->view($view_mode));
+    }
+    $result = $this->deliver($output);
+    $this->postSend($result, $output);
+  }
+
+  public function deliver(array $output = array()) {}
+
+  /**
+   * Act upon send result.
+   *
+   * - Save the rendered messages if needed.
+   * - Invoke watchdog error on failure.
+   */
+  public function postSend($result, array $output = array()) {
+    $plugin = $this->plugin;
+    $message = $this->message;
+
+    $options = $plugin['options'];
+
+    $save = FALSE;
+    if (!$result) {
+      watchdog('message_notify', t('Could not send message using @title to user ID @uid.'), array('@label' => $plugin['title'], '@uid' => $message->uid), WATCHDOG_ERROR);
+      if ($options['save on fail']) {
+        $save = TRUE;
+      }
+    }
+    elseif ($result && $options['save on success']) {
+      $save = TRUE;
+    }
+
+    if (!$save) {
+      return;
+    }
+
+    if ($options['rendered fields']) {
+      // Save the rendered output into matching fields.
+      $wrapper = entity_metadata_wrapper('message', $message);
+      foreach ($this->viewModes() as $view_mode) {
+        if (empty($options['rendered fields'][$view_mode])) {
+          throw new MessageNotifyException(format_string('The rendered view mode @mode cannot be saved to field, as there is not a matching one.', array('@mode' => $view_mode)));
+        }
+        $field_name = $options['rendered fields'][$view_mode];
+
+        // Get the format from the field. We assume the first delta is the
+        // same as the rest.
+        if (empty($wrapper->{$field_name}->format)) {
+          $wrapper->{$field_name}->set($output[$view_mode]);
+        }
+        else {
+          $format = $wrapper->type->{MESSAGE_FIELD_MESSAGE_TEXT}->get(0)->format->value();
+          $wrapper->{$field_name}->set(array('value' => $output[$view_mode], 'format' => $format));
+        }
+      }
+    }
+
+    if ($save) {
+      $message->save();
+    }
+  }
+
+  public function access() {
+    return TRUE;
+  }
+
+  public static function viewModes() {
+    return array();
+  }
+
+}
diff --git a/plugins/notifier/email/MessageNotifierEmail.class.php b/plugins/notifier/email/MessageNotifierEmail.class.php
new file mode 100644
index 0000000..6f41331
--- /dev/null
+++ b/plugins/notifier/email/MessageNotifierEmail.class.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Email notifier.
+ */
+class MessageNotifierEmail extends MessageNotifierBase {
+
+  /**
+   * Add Message notify view mode.
+   */
+  public static function viewModes() {
+    return array(
+      'message_notify_email_subject' => array('label' => t('Notify - Email subject')),
+      'message_notify_email_body' => array('label' => t('Notify - Email subject')),
+    );
+  }
+
+  public function deliver(array $output = array()) {
+    $plugin = $this->plugin;
+    $message = $this->message;
+
+    $options = $plugin['options'];
+
+    $account = user_load($message->uid);
+    $mail = $options['mail'] ? $options['mail'] : $account->mail;
+
+    $languages = language_list();
+    if (!$options['language override']) {
+      $lang = !empty($account->language) && $account->language != LANGUAGE_NONE ? $languages[$account->language]: language_default();
+    }
+    else {
+      $lang = $languages[$message->language];
+    }
+
+    return drupal_mail('message_notify', $message->type, $mail, $lang, $output);
+  }
+
+}
diff --git a/plugins/notifier/email/email.inc b/plugins/notifier/email/email.inc
new file mode 100644
index 0000000..fb55c30
--- /dev/null
+++ b/plugins/notifier/email/email.inc
@@ -0,0 +1,7 @@
+<?php
+
+$plugin = array(
+  'title' => t('Email'),
+  'description' => t('Send Message via email.'),
+  'class' => 'MessageNotifierEmail',
+);
diff --git a/plugins/notifier/notifier.inc b/plugins/notifier/notifier.inc
deleted file mode 100644
index 9ce71bc..0000000
--- a/plugins/notifier/notifier.inc
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-/**
- * main class. All plugin class should extend it.
- */
-class notifier {
-
-/**
- * Save arguments locally.
- */
-  function __construct(Message $message, $account) {
-    $this->message = $message;
-    $this->account = $account;
-  }
-
-public function message_notify_send() {
-  // $lang = !empty($account->language) ? $languages[$account->language]: language_default();
-  // $params = array(
-  //   'message_entity' => $message,
-  //   'rendered_subject' => $message->rendered_subject,
-  //   'rendered_body' => $message->rendered_body,
-  // );
-  // $result = drupal_mail('message_notify_email', $message->type, $account->mail, $lang, $params);
-  // return $result;
-}
-
-}
\ No newline at end of file
