diff --git a/data.module b/data.module
index c490d93..8392141 100644
--- a/data.module
+++ b/data.module
@@ -16,6 +16,9 @@ function data_views_api() {
 
 /**
  * Load all data tables.
+ *
+ * @return \DataTable[]
+ *   All defined data tables.
  */
 function data_get_all_tables($reset = FALSE) {
   $tables = array();
@@ -43,7 +46,7 @@ function data_get_all_tables($reset = FALSE) {
  * @param $title
  *   A natural title for the table.
  *
- * @return
+ * @return \DataTable|false
  *   A DataTable object if one could be created, FALSE otherwise.
  */
 function data_create_table($name, $schema, $title = NULL) {
@@ -65,7 +68,7 @@ function data_create_table($name, $schema, $title = NULL) {
  * @param $name
  *   Unique name of the table.
  *
- * @return
+ * @return \DataTable|false
  *   A unique DataTable object if defined, FALSE otherwise.
  *
  * Note: In some circumstances, a table may be defined while it does not exist
diff --git a/data.views.inc b/data.views.inc
index b426790..185c9bc 100644
--- a/data.views.inc
+++ b/data.views.inc
@@ -71,6 +71,11 @@ function data_views_data() {
       }
     }
 
+    // Support for Editable Views module.
+    if ($table->isEntityType()) {
+      $table_data['table']['entity type'] = $table->getEntityTypeName();
+    }
+
     $data[$table->get('name')] = $table_data;
   }
 
diff --git a/data_entity/data_entity.admin.inc b/data_entity/data_entity.admin.inc
index 35725ae..616f826 100644
--- a/data_entity/data_entity.admin.inc
+++ b/data_entity/data_entity.admin.inc
@@ -51,7 +51,7 @@ function data_entity_admin_entity_type_form($form, &$form_state, $table) {
 
   // Get field instances. They will be on the bundle which has the same name
   // as the entity type.
-  $entity_type = 'data_' . $table->name;
+  $entity_type = $table->getEntityTypeName();
   $instances = field_info_instances($entity_type);
   if (!empty($instances[$entity_type])) {
     $form['is_entity_type']['#disabled'] = TRUE;
diff --git a/data_entity/data_entity.entity.inc b/data_entity/data_entity.entity.inc
index a2fd2b4..2e1bf9b 100644
--- a/data_entity/data_entity.entity.inc
+++ b/data_entity/data_entity.entity.inc
@@ -14,16 +14,21 @@ class DataEntityController extends EntityAPIController implements EntityAPIContr
   public function __construct($entityType) {
     parent::__construct($entityType);
 
-    // Set our data table. Our entity type is 'data_TABLENAME'.
-    $this->dataTable = substr($entityType, 5);
+    $table = data_entity_get_table_by_entity_type($entityType);
+    $this->dataTable = $table->get('name');
   }
 
   function load($ids = array(), $conditions = array()) {
     $entities = parent::load($ids, $conditions);
 
     foreach ($entities as $id => $entity) {
-      $entity->data_table   = $this->dataTable;
-      // Needed until Drupal core fixes this WTF. @see http://drupal.org/node/1042822.
+      $entity->data_table = $this->dataTable;
+      // Do not use unless you really need to. (The fact that Drupal 7 entities
+      // don't know their own type, is by design and the opinion of the
+      // creator(s) of the Entity API is that code should always be able to
+      // derive it in other ways. In our case, we nowadays only use it in
+      // data_entity_uri(). We'll leave the property in but data_entity_uri()
+      // could also derive the info it needs through $entity->data_table.)
       $entity->entity_type  = $this->entityType;
     }
 
diff --git a/data_entity/data_entity.info.inc b/data_entity/data_entity.info.inc
index a7c9e8d..1630c08 100644
--- a/data_entity/data_entity.info.inc
+++ b/data_entity/data_entity.info.inc
@@ -17,7 +17,7 @@ function data_entity_entity_property_info() {
     foreach ($table->table_schema['fields'] as $field_name => $field) {
       // Deduce the property type from the schema.
       if ($type = _entity_metadata_convert_schema_type($field['type'])) {
-        $info['data_' . $table->name]['properties'][$field_name] = array(
+        $info[$table->getEntityTypeName()]['properties'][$field_name] = array(
           'label' => !empty($table->meta['fields'][$field_name]['label']) ? $table->meta['fields'][$field_name]['label'] : $field_name,
           'description' => 'Field of type ' . $field['type'] . '.',
           'type' => $type,
diff --git a/data_entity/data_entity.module b/data_entity/data_entity.module
index 2d16327..e9183f4 100644
--- a/data_entity/data_entity.module
+++ b/data_entity/data_entity.module
@@ -23,8 +23,44 @@ function data_entity_get_entity_tables($reset = FALSE) {
   return $entity_tables;
 }
 
+/**
+ * Gets a table for an entity type.
+ *
+ * @param string $entity_type
+ *   The entity type.
+ *
+ * @return \DataTable|false
+ *   A unique DataTable object if defined, FALSE otherwise.
+ */
+function data_entity_get_table_by_entity_type($entity_type) {
+  // This is the 'canonical' location for the conversion logic, which is really
+  // straightforward, but it's still good to have a canonical location. It's in
+  // this load function rather than being a separate conversion function
+  // because this matches most expected usage, and matches the direction most
+  // code seems to be heading these days (which is: loading/using full objects
+  // even if you might just want a single property/field; see Entity API). The
+  // reverse logic is DataTable::getEntityTypeName().
+  $table_name = substr($entity_type, 5);
+  // A note: data_entity_feed_unique_callback() used to have another
+  // way of deriving the data table through the entity info. It seems like we
+  // should be using the straight reverse of getEntityTypeName() though.
+  //$entity_info = entity_get_info($entity_type);
+  //$table_name = $entity_info['base table'];
+  return data_get_table($table_name);
+}
+
 /**
  * Adds our default values to a table's meta information.
+ *
+ * @todo get rid of this function:
+ *   - The 'locked/required' part doesn't look like it should be here at all:
+ *     it's now possibility that those properties are saved with the table
+ *     configuration (because the below modification sometimes get saved and
+ *     sometimes don't), and it's not clear that this was a conscious decision.
+ *     Also, the standard edit screens for a data item don't need this
+ *     (anymore); they can derive their own defaults.
+ *   - The other property default, if they are mandatory for an entity, can be
+ *     moved into DataTable::get() nowadays.
  */
 function data_entity_meta_add_defaults(&$meta) {
   foreach ($meta['fields'] as $field => $data) {
@@ -43,9 +79,7 @@ function data_entity_meta_add_defaults(&$meta) {
 /**
  * Implements hook_entity_info().
  *
- * Declare every data table as an entity.
- *
- * @todo Add an admin UI to request tables for this rather than do all.
+ * Declare the data tables who have been configured as such, as an entity.
  */
 function data_entity_entity_info() {
   $tables = data_entity_get_entity_tables();
@@ -59,7 +93,7 @@ function data_entity_entity_info() {
       continue;
     }
 
-    $entity_type = 'data_' . $table_name;
+    $entity_type = $table->getEntityTypeName();
 
     $info[$entity_type] = array(
       'label' => $table->title,
@@ -290,7 +324,7 @@ function data_entity_feed_unique_callback(FeedsSource $source, $entity_type, $bu
   $entity_id_key = $entity_info['entity keys']['id'];
 
   // Attempt to load the table.
-  if ($table = data_get_table($entity_info['base table'])) {
+  if ($table = data_entity_get_table_by_entity_type($entity_type)) {
     // Get the single value out of the array. Not sure why it has to be an array
     // but as we deal in database columns, we know it's always a single value.
     $value = array_pop($values);
diff --git a/data_entity/views/data_entity.views.inc b/data_entity/views/data_entity.views.inc
index b4209c1..d316bad 100644
--- a/data_entity/views/data_entity.views.inc
+++ b/data_entity/views/data_entity.views.inc
@@ -18,11 +18,6 @@ function data_entity_views_data_alter(&$data) {
         'handler' => 'data_entity_views_handler_field_edit_link',
       ),
     );
-
-    // Support for Editable Views module.
-    if ($table->meta['is_entity_type']) {
-      $data[$table_name]['table']['entity type'] = 'data_' . $table_name;
-    }
   }
 }
 
diff --git a/includes/DataTable.inc b/includes/DataTable.inc
index b6d1e5b..3b33081 100644
--- a/includes/DataTable.inc
+++ b/includes/DataTable.inc
@@ -6,6 +6,16 @@
 
 /**
  * Manages data access and manipulation for a single data table.
+ *
+ * This class holds a combination of:
+ * - a 'value object', holding the table's properties and some methods to get
+ *   derived properties;
+ * - 'handler' methods for the table properties which change / update those
+ *   properties in our storage for those properties, and change the actual
+ *   table / database schema. (Interestingly, the loading of those properties
+ *   from our property storage is in an external function.)
+ * - some general purpose methods.
+ *
  * Use data_create_table() or data_get_table() to instantiate an object from this class.
  *
  * @see data_create_table().
@@ -69,6 +79,74 @@ class DataTable {
     }
   }
 
+  /// 'Property' methods.
+
+  /**
+   * Gets a property of the DataTable object.
+   *
+   * Note there's no set(). (The update() method instead is a 'handler' method
+   * which would be the counterpart of a 'load' method, not of get().)
+   *
+   * Also note the 'meta' information is missing defaults for entity types.
+   *
+   * @param string $property
+   *   One of 'name', 'title', 'table_schema', 'meta', 'export_type'.
+   * @return mixed
+   *   The unserialized value of the property.
+   *
+   * @see \data_entity_meta_add_defaults()
+   */
+  public function get($property) {
+    if (in_array($property, array('name', 'title', 'table_schema', 'meta', 'export_type'))) {
+      return $this->$property;
+    }
+  }
+
+  /**
+   * Determines whether the table is configured to be an entity type.
+   *
+   * If it is, then there's still no harm in accessing it just as any other
+   * table record (i.e. using DataHandler) but you'll get an incomplete
+   * entity, so it's likely better to use entity_load(), entity_save() etc.
+   * instead.
+   *
+   * @return bool
+   *   True if the table is configured to be an entity type.
+   */
+  public function isEntityType() {
+    return !empty($this->meta['is_entity_type']);
+  }
+
+  /**
+   * Return the name for the entity type used for this table.
+   *
+   * @return string
+   *   The entity type name or the value that would be used as such. (A value
+   *   is also returned if the table isn't actually configured to be an entity
+   *   type; it's just meaningless.)
+   */
+  public function getEntityTypeName() {
+    return 'data_' . $this->name;
+  }
+
+  /**
+   * Determines whether a table is defined.
+   *
+   * If a table is defined it does not mean that it actually exists in the
+   * database.
+   *
+   * @return bool
+   *   TRUE if the table is defined, FALSE otherwise.
+   */
+  public function defined() {
+    // This executes a relatively large amount of code (compared to, say,
+    // remembering a 'defined' property after we called _data_load_table() in
+    // the constructor ) but is still fast - if the return value is TRUE.
+    return _data_load_table($this->name) ? TRUE : FALSE;
+  }
+
+  /// 'Handler' methods.
+
   /**
    * Create a table.
    *
@@ -192,34 +270,6 @@ class DataTable {
     return ($num_deleted == 1);
   }
 
-  /**
-   * Determine whether a table is defined.
-   *
-   * @return
-   *   TRUE if the table is defined, FALSE otherwise.
-   *   Note: If a table is defined it does not mean that it actually exists in the
-   *   database.
-   */
-  public function defined() {
-    return _data_load_table($this->name) ? TRUE : FALSE;
-  }
-
-  /**
-   * Get a property of the DataTable object.
-   *
-   * @todo: use __get()
-   *
-   * @param $property
-   *   One of 'name', 'title', 'table_schema', 'meta'.
-   * @return
-   *   The unserialized value of the property.
-   */
-  public function get($property) {
-    if (in_array($property, array('name', 'title', 'table_schema', 'meta', 'export_type'))) {
-      return $this->$property;
-    }
-  }
-
   /**
    * Update table properties.
    *
@@ -573,6 +623,8 @@ class DataTable {
     $this->update(array('meta' => $this->meta));
   }
 
+  /// General purpose methods.
+
   /**
    * Convenience method.
    */
