diff --git a/entity_view_mode.features.inc b/entity_view_mode.features.inc
new file mode 100644
index 0000000..80899dd
--- /dev/null
+++ b/entity_view_mode.features.inc
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * @file
+ * Features integration for the entity_view_mode module.
+ */
+
+/**
+ * Implements hook_features_api().
+ */
+function entity_view_mode_features_api() {
+  return array(
+    'entity_view_mode' => array(
+      'name' => 'Entity view modes',
+      'feature_source' => TRUE,
+      'default_file' => FEATURES_DEFAULTS_CUSTOM,
+      'default_filename' => 'entity',
+      //'duplicates' => FEATURES_DUPLICATES_CONFLICT,
+      'default_hook' => 'entity_view_mode_info',
+      'alter_hook' => 'entity_view_mode_info',
+      'file' => drupal_get_path('module', 'entity_view_mode') . '/entity_view_mode.features.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_features_export_options().
+ */
+function entity_view_mode_features_export_options() {
+  $options = array();
+
+  $view_modes = variable_get('entity_view_modes', array());
+  foreach ($view_modes as $entity_type => $modes) {
+    foreach ($modes as $key => $view_mode) {
+      $options[$entity_type . ':' . $key] = $entity_type . ':' . $key;
+    }
+  }
+
+  return $options;
+}
+
+/**
+ * Implements hook_features_export().
+ */
+function entity_view_mode_features_export($data, &$export, $module_name) {
+  // Do not add a dependency on features since the exported hook will be
+  // included by entity_view_mode no matter if features is enabled or not.
+  $export['dependencies']['entity_view_mode'] = 'entity_view_mode';
+
+  $map = features_get_default_map('entity_view_mode');
+
+  foreach ($data as $component) {
+    // If another module provides this style, add it as a dependency
+    if (isset($map[$component]) && $map[$component] != $module_name) {
+      $module = $map[$style];
+      $export['dependencies'][$module] = $module;
+    }
+    elseif (_entity_view_mode_features_component_exists($component)) {
+      $export['features']['entity_view_mode'][$component] = $component;
+    }
+  }
+
+  // No pipe.
+  return array();
+}
+
+/**
+ * Implements hook_features_export_render().
+ */
+function entity_view_mode_features_export_render($module_name, $data, $export = NULL) {
+  $code = array();
+  $code[] = "  \$info = array();";
+  $code[] = "";
+
+  foreach ($data as $name) {
+    if (_entity_view_mode_features_component_exists($name)) {
+      list($entity_type, $machine_name) = explode(':', $name);
+      $view_mode = entity_view_mode_load($entity_type, $machine_name);
+      $view_mode = _entity_view_mode_sanitize($view_mode);
+
+      if (isset($view_mode) && is_array($view_mode)) {
+        $code[] = "  \$info['{$entity_type}']['{$machine_name}'] = " . features_var_export($view_mode, '  ') . ";";
+        $code[] = "";
+      }
+    }
+  }
+
+  $code[] = "  return \$info;";
+  $code = implode("\n", $code);
+
+  // The key is the default hook defined in
+  // entity_view_mode_extra_featrues_api().
+  return array('entity_view_mode_info' => $code);
+}
+
+/**
+ * Implements hook_features_revert().
+ */
+function entity_view_mode_features_revert($module_name) {
+  $entity_view_modes = module_invoke($module_name, 'entity_view_mode_info');
+
+  // Loop through all entity types.
+  foreach ($entity_view_modes as $entity_type => $view_modes) {
+
+    // Loop through all view modes of a entity type.
+    foreach ($view_modes as $machine_name => $view_mode) {
+      entity_view_mode_save($entity_type, $view_mode);
+    }
+
+  }
+}
+
+/**
+ * Helper function to check if view mode with component name exists.
+ */
+function _entity_view_mode_features_component_exists($component) {
+  list($entity_type, $machine_name) = explode(':', $component);
+
+  if (!empty($entity_type) && !empty($machine_name)) {
+    return (bool) entity_view_mode_load($entity_type, $machine_name);
+  }
+  return FALSE;
+}
diff --git a/entity_view_mode.module b/entity_view_mode.module
index e021d1e..a2d4aa8 100644
--- a/entity_view_mode.module
+++ b/entity_view_mode.module
@@ -164,8 +164,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] += array('custom settings' => TRUE);
+  $view_modes[$entity_type][$view_mode_name] = _entity_view_mode_sanitize($view_mode);
   variable_set('entity_view_modes', $view_modes);
 
   // Allow modules to respond after the view mode is saved.
@@ -418,3 +417,11 @@ function entity_view_mode_get_possible_bundles($entity_type) {
 
   return $bundles;
 }
+
+/**
+ * Prepare a view mode for the format used in hook_entity_view_mode_info().
+ */
+function _entity_view_mode_sanitize($view_mode) {
+  // @todo Should the 'custom settings' default value be TRUE?
+  return array_intersect_key($view_mode, drupal_map_assoc(array('label', 'custom settings'))) + array('custom settings' => FALSE);
+}
