diff --git a/eck.module b/eck.module
index d39bd1a..d45195f 100644
--- a/eck.module
+++ b/eck.module
@@ -91,6 +91,9 @@ function eck_ctools_plugin_directory($owner, $plugin_type) {
   if ($owner == 'eck' && $plugin_type == 'property_behavior') {
     return 'plugins/' . $plugin_type;
   }
+  if ($owner == 'page_manager' && $plugin_type == 'tasks') {
+    return 'plugins/' . $plugin_type;
+  }
 }
 
 /**
@@ -169,15 +172,15 @@ function eck_schema_alter(&$schema) {
       // The function eck__entity_type__schema returns a schema for that
       // entity type given and entity_type object.
       $schema = array_merge($schema, array("eck_{$entity_type->name}" => eck__entity_type__schema($entity_type)));
-      
+
       // Allow properties to modify the schema
       $vars = array('entity_type' => $entity_type, 'schema' => $schema);
-      
+
       // The behavior hook should return its modifications in the same format that
       // they were sent to it. So we would be expecting an array with an
       // entity_type key, and a schema key.
       $vars = eck_property_behavior_invoke_plugin_alter($entity_type, 'schema', $vars);
-      
+
       if (array_key_exists('schema', $vars) && isset($vars['schema'])) {
         $schema = array_merge($schema, $vars['schema']);
       }
@@ -227,7 +230,7 @@ function entity_table($entities, $select = FALSE) {
       $delete_path = str_replace('%eckentity', $id, $crud_info['delete']['path']);
       $allowed_operations .= (($allowed_operations) ? '<br />' : '') . l(t('delete'), $delete_path, array('query' => $destination));
     }
-    
+
     // Check that the user has permissions to view.
     if (eck__entity_menu_access('view', $entity_type, $bundle, $id)) {
       $uri = entity_uri($entity_type, $entity);
@@ -240,7 +243,7 @@ function entity_table($entities, $select = FALSE) {
         entity_label($entity_type, $entity),
       );
     }
-   
+
     $row[] = array('data' => $allowed_operations);
     $info['entity'] = $entity;
     drupal_alter("entity_{$entity_type}_{$bundle}_tr", $row, $info);
@@ -817,9 +820,9 @@ function eck__entity_access($op, $entity_or_bundle, $account, $entity_type_name)
  */
 function eck_entity_view_alter(&$build, $entity_type) {
   $entity_types = EntityType::loadAll();
-  
+
   $this_entity_type = $build['#entity_type'];
-  
+
   foreach($entity_types as $et){
     if($et->name == $this_entity_type){
       $entity = $build['#entity'];
@@ -828,7 +831,7 @@ function eck_entity_view_alter(&$build, $entity_type) {
       // the paths of any of the possible operations, since contextual links
       // are dependent on the hierarchy of those paths, changing the paths
       // could cause of contextual links not to work correctly.
-      
+
       $build['#contextual_links']['eck'] =
       array(
         "{$this_entity_type}/{$this_bundle}",array($entity->id));
@@ -847,10 +850,10 @@ function eck_init() {
   // Let's initialize our global caches
   global $eck_entity_types_cache;
   global $eck_bundles_cache;
-  
+
   $eck_entity_types_cache = new ECKCache("entity_types");
   $eck_bundles_cache = new ECKCache("bundles");
-  
+
   if (variable_get("eck_clear_caches", FALSE)) {
     variable_set("eck_clear_caches", FALSE);
     eck_clean_up();
diff --git a/plugins/tasks/eck.inc b/plugins/tasks/eck.inc
new file mode 100644
index 0000000..f934161
--- /dev/null
+++ b/plugins/tasks/eck.inc
@@ -0,0 +1,196 @@
+<?php
+
+/**
+ * @file
+ * Handle the 'entity view' override task for ECK entities.
+ *
+ * This plugin overrides ECK entity displays and reroutes them to the page
+ * manager, where a list of tasks can be used to service this request based upon
+ * criteria supplied by access plugins.
+ */
+
+/**
+ * Specialized implementation of hook_page_manager_task_tasks(). See api-task.html for
+ * more information.
+ */
+function eck_eck_page_manager_tasks() {
+  return array(
+    // This is a 'page' task and will fall under the page admin UI
+    'task type' => 'page',
+    'title'     => t('ECK templates'),
+
+    // There are multiple pages, let's override each of them
+    // separately.
+    'subtasks' => TRUE,
+    'subtask callback' => 'eck_pm_subtask',
+    'subtasks callback' => 'eck_pm_subtasks',
+
+    // Alter the %type/%bundle/%eckentity menu entry to point to us.
+    'hook menu alter' => 'eck_pm_menu_alter',
+
+    // This task uses 'context' handlers and must implement these to give the
+    // handler data it needs.
+    'handler type' => 'context',
+    'get arguments' => 'eck_pm_get_arguments',
+    'get context placeholders' => 'eck_pm_get_contexts',
+  );
+}
+
+/**
+ * Callback defined by eck_eck_page_manager_tasks().
+ *
+ * Alter the entity view input so that entity view comes to us rather than the
+ * normal process.
+ */
+function eck_pm_menu_alter(&$items, $task) {
+  foreach (eck_entity_info() as $task_id => $info) {
+    if (variable_get('eck_pm_disabled_' . $task_id, TRUE)) {
+      continue;
+    }
+
+    // Override paths for all bundles
+    foreach ($info['bundles'] as $bundle) {
+      if (isset($items[$bundle['crud']['view']['path']])) {
+        $item     = &$items[$bundle['crud']['view']['path']];
+        $callback = $item['page callback'];
+
+        if ($callback == 'eck__entity__view' || variable_get('page_manager_override_anyway', FALSE)) {
+          $item['page callback']  = 'eck_pm_page';
+          $item['file path']      = $task['path'];
+          $item['file']           = $task['file'];
+          $item['load arguments'] = array($task_id, 2);
+        }
+        else {
+          // Automatically disable this task if it cannot be enabled.
+          variable_set('eck_pm_disabled_' . $task_id, TRUE);
+          if (!empty($GLOBALS['page_manager_enabling_eck'])) {
+            drupal_set_message(t('Page manager module is unable to enable %path because some other module already has overridden with %callback.', array('%path' => $bundle['crud']['view']['path'], '%callback' => $callback)), 'error');
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Entry point for our overridden entity view.
+ *
+ * This function asks its assigned handlers who, if anyone, would like
+ * to run with it. If no one does, it passes through to ECK's entity view, which
+ * is eck__entity__view().
+ */
+function eck_pm_page($entity_type, $bundle, $entity) {
+  // Load my task plugin
+  $task = page_manager_get_task('eck');
+  $subtask = page_manager_get_task_subtask($task, $entity_type);
+
+  // Load the book into a context.
+  ctools_include('context');
+  ctools_include('context-task-handler');
+
+  // We need to mimic Drupal's behavior of setting the entity title here.
+  drupal_set_title($entity->label());
+  $uri = entity_uri($entity_type, $entity);
+  // Set the path as the canonical URL to prevent duplicate content.
+  drupal_add_html_head_link(array('rel' => 'canonical', 'href' => url($uri['path'], $uri['options'])), TRUE);
+  // Set the non-aliased path as a default shortlink.
+  drupal_add_html_head_link(array('rel' => 'shortlink', 'href' => url($uri['path'], array_merge($uri['options'], array('alias' => TRUE)))), TRUE);
+
+  $contexts = ctools_context_handler_get_task_contexts($task, $subtask, array($entity));
+  $output   = ctools_context_handler_render($task, $subtask, $contexts, array($entity->id));
+
+  if ($output != FALSE) {
+    return $output;
+  }
+
+  $function = 'eck__entity__view';
+  foreach (module_implements('page_manager_override') as $module) {
+    $call = $module . '_page_manager_override';
+    if (($rc = $call('eck__entity__view')) && function_exists($rc)) {
+      $function = $rc;
+      break;
+    }
+  }
+
+  // Otherwise, fall back.
+  return $function($entity_type, $bundle, $entity->id);
+}
+
+/**
+ * Callback to get arguments provided by this task handler.
+ *
+ * Since this is the entity view and there is no UI on the arguments, we
+ * create dummy arguments that contain the needed data.
+ */
+function eck_pm_get_arguments($task, $subtask_id) {
+  return array(
+    array(
+      'keyword' => $subtask_id['name'],
+      'identifier' => t('@type being viewed', array('@type' => ucfirst(check_plain($subtask_id['name'])))),
+      'id' => 1,
+      'name' => 'entity_id:' . $subtask_id['name'],
+      'settings' => array(),
+    ),
+  );
+}
+
+/**
+ * Callback to get context placeholders provided by this handler.
+ */
+function eck_pm_get_contexts($task, $subtask_id) {
+  return ctools_context_get_placeholders_from_argument(eck_pm_get_arguments($task, $subtask_id));
+}
+
+/**
+ * Callback to enable/disable the page from the UI.
+ */
+function eck_pm_enable($cache, $status) {
+  variable_set('eck_pm_disabled_' . $cache->subtask_id, $status);
+
+  // Set a global flag so that the menu routine knows it needs
+  // to set a message if enabling cannot be done.
+  if (!$status) {
+    $GLOBALS['page_manager_enabling_eck'] = TRUE;
+  }
+}
+
+/**
+ * Callback to get a subtask definition.
+ */
+function eck_pm_subtask($task, $subtask_id) {
+  return eck_pm_build_subtask($task, $subtask_id);
+}
+
+/**
+ * Build out a subtask.
+ */
+function eck_pm_build_subtask($task, $subtask_id) {
+  $info = entity_get_info($subtask_id);
+  $path = "{$subtask_id}/%/%eckentity";
+
+  $subtask = array(
+    'name' => $subtask_id,
+    'admin title' => "ECK {$info['label']} template",
+    'admin path' => $path,
+    'admin description' => check_plain($info['label']),
+    'admin type' => t('ECK'),
+    'storage' => t('In code'),
+    'disabled' => variable_get('eck_pm_disabled_' . $subtask_id, TRUE),
+    'enable callback' => 'eck_pm_enable',
+  );
+
+  return $subtask;
+}
+
+/**
+ * Callback to define a group of subtasks.
+ */
+function eck_pm_subtasks($task) {
+  $return = array();
+
+  foreach (eck_entity_info() as $task_id => $info) {
+    $return[$task_id] = eck_pm_build_subtask($task, $task_id);
+  }
+
+  return $return;
+}
