diff --git a/entity_view_mode.module b/entity_view_mode.module
index 58548d4..3cbacef 100644
--- a/entity_view_mode.module
+++ b/entity_view_mode.module
@@ -1,6 +1,22 @@
 <?php
 
 /**
+ * Implements hook_hook_info().
+ */
+function entity_view_mode_hook_info() {
+  $hooks = array(
+    'entity_view_mode_info',
+    'entity_view_mode_info_alter',
+    'entity_view_mode_presave',
+    'entity_view_mode_insert',
+    'entity_view_mode_update',
+    'entity_view_mode_delete',
+  );
+
+  return array_fill_keys($hooks, array('group' => 'entity'));
+}
+
+/**
  * Implements hook_permission().
  */
 function entity_view_mode_permission() {
@@ -15,9 +31,18 @@ function entity_view_mode_permission() {
  * Implements hook_entity_info_alter().
  */
 function entity_view_mode_entity_info_alter(&$info) {
-  foreach (variable_get('entity_view_modes', array()) as $entity_type => $view_modes) {
-    if (isset($info[$entity_type]['view modes'])) {
-      $info[$entity_type]['view modes'] += $view_modes;
+  $view_mode_info = module_invoke_all('entity_view_mode_info');
+  drupal_alter('entity_view_mode_info', $view_mode_info);
+
+  // Add in the variable entity view modes.
+  $view_mode_info = variable_get('entity_view_modes', array()) + $view_mode_info;
+
+  foreach ($view_mode_info as $entity_type => $view_modes) {
+    if (isset($info[$entity_type])) {
+      if (!isset($info[$entity_type]['view modes'])) {
+        $info[$entity_type]['view modes'] = array();
+      }
+      $info[$entity_type]['view modes'] = $info[$entity_type]['view modes'] + $view_modes;
     }
   }
 }
@@ -115,7 +140,7 @@ function entity_view_mode_save($entity_type, $view_mode) {
   // Save the view mode.
   $view_modes = variable_get('entity_view_modes', array());
   unset($view_modes[$entity_type][$existing_view_mode]);
-  $view_modes[$entity_type][$view_mode_name] = array_intersect_key($view_mode, drupal_map_assoc(array('label', 'custom settings')));
+  $view_modes[$entity_type][$view_mode_name] = __entity_view_mode_sanitize($view_mode);
   $view_modes[$entity_type][$view_mode_name] += array('custom settings' => TRUE);
   variable_set('entity_view_modes', $view_modes);
 
@@ -291,3 +316,7 @@ function entity_view_mode_get_possible_bundles($entity_type) {
 
   return $bundles;
 }
+
+function _entity_view_mode_sanitize($view_mode) {
+  return array_intersect_key($view_mode, drupal_map_assoc(array('label', 'custom settings')));
+}
