diff --git a/eck.module b/eck.module
index 59c1130..a8da47d 100644
--- a/eck.module
+++ b/eck.module
@@ -104,6 +104,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;
+  }
 }
 
 /**
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;
+}
