diff --git entity/entity.features.inc entity/entity.features.inc
new file mode 100644
index 0000000..077357e
--- /dev/null
+++ entity/entity.features.inc
@@ -0,0 +1,153 @@
+<?php
+// $name$
+
+/**
+ * @file
+ * Provides Entity metadata integration for entities provided via the CRUD API.
+ */
+
+/**
+ * Returns the configured entity features controller.
+ */
+function entity_features_get_controller($type) {
+  $static = &drupal_static(__FUNCTION__);
+  if (!isset($static[$type])) {
+    $info = entity_get_info($type);
+    $info += array('features controller class' => 'EntityDefaultFeaturesController');
+    $static[$type] = new $info['features controller class']($type);
+  }
+  return $static[$type];
+}
+
+/**
+ * Default controller for generating some basic metadata.
+ */
+class EntityDefaultFeaturesController {
+
+  protected $type, $info;
+
+  public function __construct($type) {
+    $this->type = $type;
+    $this->info = entity_get_info($type);
+    $this->statusKey = isset($this->entityInfo['export']['status key']) ? $this->entityInfo['export']['status key'] : 'status';
+  }
+
+  /**
+   * Defines the result for hook_features_api().
+   */
+  public function api() {
+    return array(
+      // The entity type has to be the features component name.
+      $this->type => array(
+        'name' => $this->info['label'],
+        'feature_source' => TRUE,
+        'default_hook' => isset($this->info['export']['default hook']) ? $this->info['export']['default hook'] : 'default_' . $this->type,
+        // Use the provided component callbacks making use of the controller.
+        'base' => 'entity',
+      ),
+    );
+  }
+
+  /**
+   * Generates the result for hook_features_export_options().
+   */
+  public function export_options() {
+    $options = array();
+    foreach (entity_load($this->type, FALSE) as $name => $entity) {
+      $options[$name] = entity_label($this->type, $entity);
+    }
+    return $options;
+  }
+
+  /**
+   * Generates the result for hook_features_export().
+   */
+  public function export($data, &$export, $module_name = '') {
+
+    foreach (entity_load($this->type, $data) as $name => $entity) {
+      // If this entity is provided by a different module, add it as dependency.
+      if ($entity->{$this->statusKey} & ENTITY_IN_CODE) {
+        // @todo Add the providing module.
+        $export['dependencies']['entity'] = 'entity';
+      }
+      // Otherwise export the entity.
+      else {
+        $export['features'][$this->type][$name] = $name;
+        if (!empty($this->info['module'])) {
+          $export['dependencies'][$this->info['module']] = $this->info['module'];
+        }
+      }
+
+    }
+    return array();
+  }
+
+  /**
+   * Generates the result for hook_features_export_render().
+   */
+  function export_render($module, $data, $export = NULL) {
+    $output = array();
+    $output[] = '  $items = array(';
+    foreach (entity_load($this->type, $data) as $name => $entity) {
+      $output[] = "    '$name' => " . entity_export($this->type, $entity, '    ') . ',';
+    }
+    $output[] = '  );';
+    $output[] = '  return $items;';
+    $output = implode("\n", $output);
+
+    $hook = isset($this->info['export']['default hook']) ? $this->info['export']['default hook'] : 'default_' . $this->type;
+    return array($hook => $output);
+  }
+
+  /**
+   * Generates the result for hook_features_revert().
+   */
+  function revert($module = NULL) {
+    if ($defaults = features_get_default('node', $module)) {
+      foreach ($defaults as $name => $entity) {
+        entity_delete($this->type, $entity);
+      }
+    }
+  }
+}
+
+/**
+ * Implements of hook_features_api().
+ */
+function entity_features_api() {
+  $items = array();
+  foreach (entity_crud_get_info() as $type => $info) {
+    if (!empty($info['exportable'])) {
+      $items += entity_features_get_controller($type)->api();
+    }
+  }
+  return $items;
+}
+
+/**
+ * Features component callback.
+ */
+function entity_features_export_options($entity_type) {
+  return entity_features_get_controller($entity_type)->export_options();
+}
+
+/**
+ * Features component callback.
+ */
+function entity_features_export($data, &$export, $module_name = '', $entity_type) {
+  return entity_features_get_controller($entity_type)->export($data, $export, $module_name);
+}
+
+/**
+ * Features component callback.
+ */
+function entity_features_export_render($module, $data, $export = NULL, $entity_type) {
+  return entity_features_get_controller($entity_type)->export_render($module, $data, $export);
+}
+
+/**
+ * Features component callback.
+ */
+function entity_features_revert($module = NULL, $entity_type) {
+  return entity_features_get_controller($entity_type)->revert($module);
+}
