diff --git a/data_entity/data_entity.install b/data_entity/data_entity.install
index f98fa7f..dd16d1a 100644
--- a/data_entity/data_entity.install
+++ b/data_entity/data_entity.install
@@ -34,3 +34,28 @@ function data_entity_update_7000() {
 
   return t('Table settings have been updated.');
 }
+
+/**
+ * Update the settings on data table entity views.
+ */
+function data_entity_update_7001() {
+  $tables = data_entity_get_entity_tables();
+
+  foreach ($tables as $table) {
+    $view_name = $table->get('name');
+
+    // Not all tables have views, eg if they have no primary key.
+    if ($view = views_get_view($view_name, TRUE)) {
+      $handler =& $view->display['default']->handler;
+
+      // Add create link to entity view
+      $handler->display->display_options['header']['area_text_custom']['empty'] = 1;
+      $handler->display->display_options['header']['area_text_custom']['id'] = 'area_text_custom';
+      $handler->display->display_options['header']['area_text_custom']['table'] = 'views';
+      $handler->display->display_options['header']['area_text_custom']['field'] = 'area_text_custom';
+      $handler->display->display_options['header']['area_text_custom']['label'] = 'add_link';
+      $handler->display->display_options['header']['area_text_custom']['content'] = l('Add item', 'admin/content/data/entity/' . $table_name . '/add', array('query' => array('destination' => 'admin/content/data/view/' . $table_name)));
+      views_save_view($view);
+    }
+  }
+}
\ No newline at end of file
diff --git a/data_entity/data_entity.module b/data_entity/data_entity.module
index 2d16327..20767ca 100644
--- a/data_entity/data_entity.module
+++ b/data_entity/data_entity.module
@@ -134,6 +134,16 @@ function data_entity_menu() {
       'type' => MENU_LOCAL_TASK,
       'weight' => -2,
     );
+
+    $items['admin/content/data/entity/%data_ui_table/add'] = array(
+      'title' => 'Add data item',
+      'load arguments' => array(4),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('data_entity_entity_edit_form', 4),
+      'file' => 'data_entity.pages.inc',
+      'access callback' => 'data_entity_table_menu_access',
+      'access arguments' => array(4),
+    );
   }
 
   $items['admin/content/data/entity/%data_ui_table/%data_entity_item'] = array(
@@ -150,6 +160,13 @@ function data_entity_menu() {
 }
 
 /**
+ * Create a data entity object
+ */
+function data_entity_create($table_name, $values = array()) {
+  return entity_create('data_' . $table_name, $values);
+}
+
+/**
  * Implements hook_menu_alter().
  */
 function data_entity_menu_alter(&$items) {
diff --git a/data_entity/data_entity.pages.inc b/data_entity/data_entity.pages.inc
index c5c8ddc..a196e4c 100644
--- a/data_entity/data_entity.pages.inc
+++ b/data_entity/data_entity.pages.inc
@@ -8,17 +8,22 @@
  * Form builder for viewing and editing a data entity.
  */
 function data_entity_entity_edit_form($form, &$form_state, $table, $data_entity = NULL) {
+  if (is_null($data_entity)) {
+    $data_entity = data_entity_create($table->name);
+  }
+
   $form = array();
 
   // Add in our defaults to the table meta data.
   data_entity_meta_add_defaults($table->meta);
 
   // Get entity defaults.
-  $entity_type = $data_entity->entity_type;
+  $entity_type = 'data_' . $table->name;
   $entity_info = entity_get_info($entity_type);
   list($id, ) = entity_extract_ids($entity_type, $data_entity);
 
-  drupal_set_title(t('Edit @item item @id', array(
+  drupal_set_title(t('@op @item item @id', array(
+    '@op' => empty($data_entity->is_new) ? 'Edit' : 'Add',
     '@item' => $entity_info['label'],
     '@id'   => $id,
   )));
@@ -78,7 +83,7 @@ function data_entity_entity_edit_form($form, &$form_state, $table, $data_entity
  */
 function data_entity_entity_edit_form_validate($form, &$form_state) {
   $data_entity = $form['#entity'];
-  $entity_type = $data_entity->entity_type;
+  $entity_type = $form['#entity_type'];
 
   // Build a pseudo entity for FieldAPI field attach.
   $pseudo_entity = $form_state['values'];
@@ -96,7 +101,10 @@ function data_entity_entity_edit_form_submit($form, &$form_state) {
   //dsm($form_state, 'fs');
 
   $data_entity = $form['#entity'];
-  $entity_type = $data_entity->entity_type;
+
+  $entity_type = 'data_' . $table->name;
+
+  $entity_info = entity_get_info($entity_type);
 
   // Build a pseudo entity for FieldAPI field attach.
   $pseudo_entity = $form_state['values'];
@@ -109,7 +117,13 @@ function data_entity_entity_edit_form_submit($form, &$form_state) {
   $table = $form_state['values']['table'];
 
   $record = $form_state['values']['data'];
-  drupal_write_record($table->name, $record, $table->table_schema['primary key']);
+  
+  if (empty($data_entity->is_new)) {
+    drupal_write_record($table->name, $record, $entity_info['entity keys']['id']);
+  }
+  else {
+    drupal_write_record($table->name, $record);
+  }
 
   // Save fields.
   field_attach_update($entity_type, $pseudo_entity);
diff --git a/data_entity/views/data_entity.views.inc b/data_entity/views/data_entity.views.inc
index aaff52e..a9642f1 100644
--- a/data_entity/views/data_entity.views.inc
+++ b/data_entity/views/data_entity.views.inc
@@ -46,6 +46,13 @@ function data_entity_views_default_views_alter(&$views) {
       $handler->display->display_options['fields']['edit_link']['id'] = 'edit_link';
       $handler->display->display_options['fields']['edit_link']['table'] = $table_name;
       $handler->display->display_options['fields']['edit_link']['field'] = 'edit_link';
+      /* Header: Global: Unfiltered text */
+      $handler->display->display_options['header']['area_text_custom']['empty'] = 1;
+      $handler->display->display_options['header']['area_text_custom']['id'] = 'area_text_custom';
+      $handler->display->display_options['header']['area_text_custom']['table'] = 'views';
+      $handler->display->display_options['header']['area_text_custom']['field'] = 'area_text_custom';
+      $handler->display->display_options['header']['area_text_custom']['label'] = 'add_link';
+      $handler->display->display_options['header']['area_text_custom']['content'] = l('Add item', 'admin/content/data/entity/' . $table_name . '/add', array('query' => array('destination' => 'admin/content/data/view/' . $table_name)));
     }
   }
 }
diff --git a/data_entity/views/data_entity_views_handler_field_edit_link.inc b/data_entity/views/data_entity_views_handler_field_edit_link.inc
index a3adb57..fa24cb3 100644
--- a/data_entity/views/data_entity_views_handler_field_edit_link.inc
+++ b/data_entity/views/data_entity_views_handler_field_edit_link.inc
@@ -22,10 +22,14 @@ class data_entity_views_handler_field_edit_link extends views_handler_field {
 
   function render($values) {
     $table = $this->view->base_table;
-    $base_field = $this->view->base_field;
+    $entity_type = 'data_' . $table;
+    $entity_info = entity_get_info($entity_type);
+    $entity_id_field = $entity_info['entity keys']['id'];
+    $entity_id_field_alias = $this->view->field[$entity_id_field]->field_alias;
+    $entity_id = $values->$entity_id_field_alias;
 
     $this->options['alter']['make_link'] = TRUE;
-    $this->options['alter']['path'] = 'admin/content/data/entity/' . $table . '/' . $values->$base_field;
+    $this->options['alter']['path'] = 'admin/content/data/entity/' . $table . '/' . $entity_id;
     $this->options['alter']['query'] = drupal_get_destination();
 
     return t('edit item');
