diff --git a/eck.entity.inc b/eck.entity.inc
index 68b1689..e257d9f 100644
--- a/eck.entity.inc
+++ b/eck.entity.inc
@@ -94,9 +94,8 @@ function eck__entity__menu($entity_type, $bundle) {
   );
   
   $crud_info = get_bundle_crud_info($entity_type->name, $bundle->name);
-  
+
   foreach($crud_info as $action => $info){
-      
     $action_label = ucfirst($action);
     $args = array();
     
@@ -106,17 +105,18 @@ function eck__entity__menu($entity_type, $bundle) {
     
     $args = array_merge(array($entity_type->name, $bundle->name), $args);
     $access_args = array_merge(array($action), $args);
-    
+
     $menu[$info['path']] = array(
       'title' => "{$action_label} {$bundle->label}",
       'description' => "{$action_label} an entity of type {$entity_type->label} with bundle {$bundle->label}",
       'page callback' => "eck__entity__{$action}",
       'page arguments' => $args,
+      'load arguments' => array($entity_type->name),
       'access callback' => 'eck__entity_menu_access',
       'access arguments' => $access_args,
       'file' => 'eck.entity.inc',
     );
-    
+
     //I think it would be useful to have the edit, delete, and list tabs at the view also
     //But lets leave this out for right now
     if($action == 'view'){
@@ -264,7 +264,10 @@ function eck__entity__add($entity_type_name, $bundle_name) {
  * @param $entity_type
  *  (String) entity type
  * @param $id
- *  (int) The entities id
+ *  (mixed) The entity id or the entity object itself
+ *  Normally you wouldn't need to call this function if you already have the
+ *  loaded entity but there are some workflows where an object is passed.
+ *  So this function handles that case as well.
  */
 function eck__entity__build($entity_type, $bundle, $id) {
   if (is_numeric($id)) {
@@ -272,25 +275,31 @@ function eck__entity__build($entity_type, $bundle, $id) {
     $entities = entity_load($entity_type->name, array($id));
     if(array_key_exists($id, $entities)){
      $entity = $entities[$id];
-    }else{
+    }
+    else {
       $entity = NULL;
     }
-  }else{
+  }
+  elseif (is_object($id) and isset($id->type) and $entity_type->name == $id->type) {
+    $entity = $id;
+  }
+  else {
     drupal_not_found();
     exit();
   }
   
-  if(!$entity){
+  if (!$entity) {
     drupal_not_found();
     exit();
-  }else{
-    if($entity->type == $bundle->name){
+  }
+  else {
+    if ($entity->type == $bundle->name) {
       return $entity->view();
-    }else{
+    }
+    else {
       drupal_not_found();
       exit();
     }
-
   }
 }
 
@@ -309,6 +318,9 @@ function eck__entity__edit($entity_type_name, $bundle_name, $id) {
     $entities = entity_load($entity_type_name, array($id));
     $entity = $entities[$id];
   }
+  elseif (is_object($id) and isset($id->type) and $id->type == $entity_type_name) {
+    $entity = $id;
+  }
 
   return drupal_get_form("eck__entity__form_edit_{$entity_type_name}_{$bundle_name}", $entity);
 }
@@ -324,25 +336,26 @@ function eck__entity__edit($entity_type_name, $bundle_name, $id) {
  *  (String) entity type
  * @param $bundle
  *  (String) Bundle
- * @param $id
- *  (int) the Id of the entity to be deleted
+ * @param $entity
+ *  (object) entity object to be deleted.
  */
-function eck__entity__delete($entity_type_name, $bundle_name, $id) {
+function eck__entity__delete($entity_type_name, $bundle_name, $entity) {
   $entity_type = entity_type_load($entity_type_name);
   $bundle = bundle_load($entity_type_name, $bundle_name);
-  return drupal_get_form('eck__entity__delete_form', $entity_type, $bundle, $id);
+  return drupal_get_form('eck__entity__delete_form', $entity_type, $bundle, $entity);
   
 }
 
-function eck__entity__delete_form($form, &$form_state, $entity_type, $bundle, $id){
+/**
+ * Delete form
+ */
+function eck__entity__delete_form($form, &$form_state, $entity_type, $bundle, $entity){
   $path = eck__entity_type__path();
-    
-  $entities = entity_load($entity_type->name, array($id));
 
   $form['entity'] =
       array(
         '#type' => 'value',
-        '#value' => $entities[$id],
+        '#value' => $entity,
   );
 
   $form['entity_type'] =
@@ -364,7 +377,7 @@ function eck__entity__delete_form($form, &$form_state, $entity_type, $bundle, $i
   );
 
   $message = t("Are you sure that you want to delete %id",
-          array("%id" => $id));
+          array("%id" => $entity->id));
 
   $caption = t("This action cannot be undone.");
 
@@ -523,12 +536,16 @@ function eck__entity__form_submit($form, &$state) {
  * @param $bundle
  *  (String) Bundle
  * @param $id
- *  (int) the Id of the entity to be deleted
+ *  (mixed) ID or Entity Object being viewed
  */
 function eck__entity__view($entity_type_name, $bundle_name, $id) {
-  $entity = entity_load($entity_type_name, array($id));
-  $entity = $entity[$id];
-  
+  if (is_object($id) and $id->type == $entity_type_name) {
+    $entity = $id;
+  }
+  else {
+    $entity = entity_load_single($entity_type_name, $id);    
+  }
+
   $entity_type = entity_type_load($entity_type_name);
   $properties = $entity_type->properties;
   $bundle = bundle_load($entity_type_name, $bundle_name);
diff --git a/eck.entity_type.inc b/eck.entity_type.inc
index 2ce5644..4314744 100644
--- a/eck.entity_type.inc
+++ b/eck.entity_type.inc
@@ -431,17 +431,17 @@ function eck__entity_type__info($entity_type) {
         ),
         'edit' => 
         array(
-          'path' => $path."/%/edit",
+          'path' => $path."/%eckentity/edit",
           'entity_id' => 5
         ),
         'delete' => 
         array(
-          'path' => $path."/%/delete",
+          'path' => $path."/%eckentity/delete",
           'entity_id' => 5
         ),
         'view' => 
         array(
-          'path' => "{$entity_type->name}/{$bundle->name}/%",
+          'path' => "{$entity_type->name}/{$bundle->name}/%eckentity",
           'entity_id' => 2
         )
       )
diff --git a/eck.module b/eck.module
index e934d7b..0b29ee4 100644
--- a/eck.module
+++ b/eck.module
@@ -12,6 +12,13 @@ module_load_include('inc', 'eck', 'eck.property_behavior');
 module_load_include('inc', 'eck', 'includes/eck.references_dialog');
 
 /**
+ * Load callback for %eckentity
+ */
+function eckentity_load($id, $type) {
+  return entity_load_single($type, $id);
+}
+
+/**
  * Implements hook_views_api().
  */
 function eck_views_api() {
@@ -126,7 +133,7 @@ function eck__entity__uri($entity) {
 
   module_load_include('inc', 'eck', 'eck.entity');
   $crud_info = get_bundle_crud_info($entity->entityType(), $entity->type);
-  $view_path = str_replace('%', $ids[0], $crud_info['view']['path']);
+  $view_path = str_replace('%eckentity', $ids[0], $crud_info['view']['path']);
   
   return array('path' => $view_path);
 }
@@ -183,13 +190,13 @@ function entity_table($entities, $select = FALSE) {
     $destination = drupal_get_destination();
     //Check that the user has permissions to edit:
     if (eck__entity_menu_access('edit', $entity_type, $bundle, $id)) {
-      $edit_path = str_replace('%', $id, $crud_info['edit']['path']);
+      $edit_path = str_replace('%eckentity', $id, $crud_info['edit']['path']);
       $allowed_operations = l(t('edit'), $edit_path, array('query' => $destination));
     }
     
     //Check that the user has permissions to delete:
     if (eck__entity_menu_access('delete', $entity_type, $bundle, $id)) {
-      $delete_path = str_replace('%', $id, $crud_info['delete']['path']);
+      $delete_path = str_replace('%eckentity', $id, $crud_info['delete']['path']);
       $allowed_operations .= (($allowed_operations)?'<br />':'').l(t('delete'), $delete_path, array('query' => $destination));
     }
     $uri = entity_uri($entity_type, $entity);
@@ -842,8 +849,8 @@ function eck_entity_delete($entity, $entity_type){
  *   A string representing the entity type to check.
  * @param $bundle_name
  *   A string representing the entity bundle to check.
- * @param $entity_id
- *   (optional) The ID of the entity to check. This should be passed whenever
+ * @param mixed $entity_id
+ *   (optional) The entity object or ID to check. This should be passed whenever
  *   it is available (i.e., for any action besides "add", since in that case
  *   there is no existing entity to check).
  *
@@ -855,13 +862,17 @@ function eck__entity_menu_access($action, $entity_type_name, $bundle_name, $enti
   // provided. (The latter is to allow eck__entity_access() to work similarly
   // to node_access() in the case of the "add" operation.)
   if (isset($entity_id)) {
-    $entities = entity_load($entity_type_name, array($entity_id));
-    if (isset($entities[$entity_id])) {
-      $entity_or_bundle = $entities[$entity_id];
+    if (is_object($entity_id) and $entity_id->type == $entity_type_name) {
+      // You already have the entity
+      $entity_or_bundle = $entity_id;
     }
     else {
+      $entity_or_bundle = entity_load_single($entity_type_name, $entity_id);
+    }
+
+    if (empty($entity_or_bundle)) {
       // Deny access if the requested entity doesn't exist.
-      return FALSE;
+      return FALSE;      
     }
   }
   else {
diff --git a/views/handlers/eck_views_handler_field_link.inc b/views/handlers/eck_views_handler_field_link.inc
index 0703d49..75d2efa 100644
--- a/views/handlers/eck_views_handler_field_link.inc
+++ b/views/handlers/eck_views_handler_field_link.inc
@@ -33,7 +33,7 @@ class eck_views_handler_field_link extends views_handler_field_entity {
   function render_link($entity, $values) {
     $crud_info = get_bundle_crud_info($entity->entityType(), $entity->type);
     $this->options['alter']['make_link'] = TRUE;
-    $this->options['alter']['path'] = str_replace('%', $entity->id, $crud_info['view']['path']);
+    $this->options['alter']['path'] = str_replace('%eckentity', $entity->id, $crud_info['view']['path']);
     $text = !empty($this->options['text']) ? $this->options['text'] : t('view');
     
     return $text;
diff --git a/views/handlers/eck_views_handler_field_link_delete.inc b/views/handlers/eck_views_handler_field_link_delete.inc
index 8160e0d..2b10541 100644
--- a/views/handlers/eck_views_handler_field_link_delete.inc
+++ b/views/handlers/eck_views_handler_field_link_delete.inc
@@ -19,7 +19,7 @@ class eck_views_handler_field_link_delete extends eck_views_handler_field_link {
         
       $crud_info = get_bundle_crud_info($entity_type, $bundle);
       $this->options['alter']['make_link'] = TRUE;
-      $this->options['alter']['path'] = str_replace('%', $entity->id, $crud_info['delete']['path']);
+      $this->options['alter']['path'] = str_replace('%eckentity', $entity->id, $crud_info['delete']['path']);
       $this->options['alter']['query'] = drupal_get_destination();
       $text = !empty($this->options['text']) ? $this->options['text'] : t('delete');
 
diff --git a/views/handlers/eck_views_handler_field_link_edit.inc b/views/handlers/eck_views_handler_field_link_edit.inc
index 52654a5..85cd237 100644
--- a/views/handlers/eck_views_handler_field_link_edit.inc
+++ b/views/handlers/eck_views_handler_field_link_edit.inc
@@ -18,7 +18,7 @@ class eck_views_handler_field_link_edit extends eck_views_handler_field_link {
       
       $crud_info = get_bundle_crud_info($entity_type, $bundle);
       $this->options['alter']['make_link'] = TRUE;
-      $this->options['alter']['path'] = str_replace('%', $entity->id, $crud_info['edit']['path']);
+      $this->options['alter']['path'] = str_replace('%eckentity', $entity->id, $crud_info['edit']['path']);
       $this->options['alter']['query'] = drupal_get_destination();
       $text = !empty($this->options['text']) ? $this->options['text'] : t('edit');
 
