diff --git entity.api.php entity.api.php
index 9d60309..675d1c6 100644
--- entity.api.php
+++ entity.api.php
@@ -95,6 +95,12 @@
  *   Features module integration for exportable entities. The given class has to
  *   inherit from the default class being EntityDefaultFeaturesController. Set
  *   it to FALSE to disable this feature.
+ * - views controller class: (optional) A controller class for providing views
+ *   integration. The given class has to inherit from the class
+ *   EntityDefaultViewsController, which is set as default in case the providing
+ *   module has been specified (see 'module') and the module does not provide
+ *   any views integration. Else it defaults to FALSE, which disables this
+ *   feature. See EntityDefaultViewsController.
  * - access callback: (optional) Specify a callback that returns access
  *   permissions for the operations 'create', 'updated', 'delete' and 'view'.
  *   The callback gets optionally the entity and the user account to check for
diff --git entity.features.inc entity.features.inc
index 214997d..407ce7f 100644
--- entity.features.inc
+++ entity.features.inc
@@ -20,7 +20,7 @@ function entity_features_get_controller($type) {
 }
 
 /**
- * Default controller for generating some basic metadata.
+ * Default controller for generating basic features integration.
  */
 class EntityDefaultFeaturesController {
 
diff --git entity.module entity.module
index 5e623ce..d4e6abb 100644
--- entity.module
+++ entity.module
@@ -853,6 +853,16 @@ function entity_ui_get_form($entity_type, $entity, $op = 'edit') {
 }
 
 /**
+ * Implements hook_views_api().
+ */
+function entity_views_api() {
+  return array(
+    'api' => '3.0-alpha1',
+    'path' => drupal_get_path('module', 'entity') . '/views',
+  );
+}
+
+/**
  * Returns a property wrapper for the given data.
  *
  * If an entity is wrapped, the wrapper can be used to retrieve further wrappers
diff --git views/entity.views.inc views/entity.views.inc
new file mode 100644
index 0000000..9731a5a
--- /dev/null
+++ views/entity.views.inc
@@ -0,0 +1,169 @@
+<?php
+
+/**
+ * @file
+ * Provide views data for modules making use of the entity CRUD API.
+ */
+
+/**
+ * Implements hook_views_data()
+ */
+function entity_views_data() {
+  $data = array();
+  foreach (entity_crud_get_info() as $type => $info) {
+    // Only enable the integration by default, it we know the module providing
+    // the entity and it does not provide views integration yet.
+    if (!isset($info['views controller class'])) {
+      $info['views controller class'] = isset($info['module']) && !module_hook($info['module'], 'views_data') ? 'EntityDefaultViewsController' : FALSE;
+    }
+    if ($info['views controller class']) {
+      $controller = new $info['views controller class']($type);
+      $data += $controller->views_data();
+    }
+  }
+  return $data;
+}
+
+/**
+ * Default controller for generating basic views integration.
+ *
+ * The controller tries to generate suiting views integration for the entity
+ * based upon the schema information of its base table and the provided entity
+ * property information.
+ * For that it is possible to map a property name to its schema/views field
+ * name by adding a 'views field' key with the name of the field as value to the
+ * property info.
+ */
+class EntityDefaultViewsController {
+
+  protected $type, $info;
+
+  public function __construct($type) {
+    $this->type = $type;
+    $this->info = entity_get_info($type);
+  }
+
+  /**
+   * Defines the result for hook_views_data().
+   */
+  public function views_data() {
+    $data = array();
+    if (!empty($this->info['base table'])) {
+      $table = $this->info['base table'];
+      // Define the base group of this table. Fields that don't
+      // have a group defined will go into this field by default.
+      $data[$table]['table']['group']  = drupal_ucfirst($this->info['label']);
+
+      $data[$table]['table']['base'] = array(
+        'field' => $this->info['entity keys']['id'],
+        'title' => drupal_ucfirst($this->info['label']),
+        // @todo: Support an entity info description key or such?
+        'help' => '',
+      );
+      $data[$table] += $this->schema_fields();
+    }
+    return $data;
+  }
+
+  /**
+   * Try to come up with some views fields with the help of the schema and
+   * the entity property information.
+   */
+  protected function schema_fields() {
+    $schema = drupal_get_schema($this->info['base table']);
+    $properties = entity_get_property_info($this->type);
+    $data = array();
+
+    foreach ($properties['properties'] as $name => $property_info) {
+      $views_field_name = isset($property_info['views field']) ? $property_info['views field'] : $name;
+      if (isset($schema['fields'][$views_field_name])) {
+        if ($views_info = $this->map_from_schema_info($name, $schema['fields'][$views_field_name], $property_info)) {
+          $data[$name] = $views_info + array(
+            'title' => $property_info['label'],
+            'help' => $property_info['description'],
+          );
+        }
+      }
+    }
+    return $data;
+  }
+
+  /**
+   * Comes up with views information based on the given schema and property
+   * info.
+   */
+  protected function map_from_schema_info($name, $schema_field_info, $property_info) {
+    $type = isset($property_info['type']) ? $property_info['type'] : 'text';
+    $views_field_name = isset($property_info['views field']) ? $property_info['views field'] : $name;
+
+    // Add in relationships to related entities.
+    if (($info = entity_get_info($type)) && !empty($info['base table'])) {
+      return array(
+        'relationship' => array(
+          'label' => drupal_ucfirst($info['label']),
+          'handler' => 'views_handler_relationship',
+          'base' => $info['base table'],
+          'base field' => $info['entity keys']['id'],
+          'relationship field' => $views_field_name,
+        ),
+      );
+    }
+
+    switch ($type) {
+      case 'text':
+        return array(
+          'field' => array(
+            'field' => $views_field_name,
+            'handler' => 'views_handler_field',
+            'click sortable' => TRUE,
+           ),
+          'sort' => array(
+            'handler' => 'views_handler_sort',
+          ),
+          'filter' => array(
+            'handler' => 'views_handler_filter_string',
+          ),
+          'argument' => array(
+            'handler' => 'views_handler_argument_string',
+          ),
+        );
+
+      case 'decimal':
+      case 'integer':
+        return array(
+          'field' => array(
+            'field' => $views_field_name,
+            'handler' => 'views_handler_field_numeric',
+            'click sortable' => TRUE,
+           ),
+          'sort' => array(
+            'handler' => 'views_handler_sort',
+          ),
+          'filter' => array(
+            'handler' => 'views_handler_filter_numeric',
+          ),
+          'argument' => array(
+            'handler' => 'views_handler_argument_numeric',
+          ),
+        );
+
+      case 'date':
+        return array(
+          'field' => array(
+            'field' => $views_field_name,
+            'handler' => 'views_handler_field_date',
+            'click sortable' => TRUE,
+           ),
+          'sort' => array(
+            'handler' => 'views_handler_sort_date',
+          ),
+          'filter' => array(
+            'handler' => 'views_handler_filter_date',
+          ),
+          'argument' => array(
+            'handler' => 'views_handler_argument_date',
+          ),
+        );
+    }
+  }
+}
