diff --git page_manager/plugins/tasks/user_login.inc page_manager/plugins/tasks/user_login.inc
new file mode 100755
index 0000000..a4da77d
--- /dev/null
+++ page_manager/plugins/tasks/user_login.inc
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * @file
+ * 
+ * Plugin to allow page manager to take over the user login page.
+ *
+ */
+function ctools_pages_user_login_page_manager_tasks() {
+  return array(
+    // This is a 'page' task and will fall under the page admin UI
+    'task type' => 'page',
+
+    'title' => t('User Login Page'),
+    'admin title' => t('User Login Page'),
+    'admin description' => t('When enabled, this overrides the default Drupal behavior for the user login page at <em>/user/login</em>.'),
+    'admin path' => 'user/login',
+
+    // Menu hooks so that we can alter the node/%node menu entry to point to us.
+    'hook menu alter' => 'ctools_pages_user_login_menu_alter',
+
+    // This is task uses 'context' handlers and must implement these to give the
+    // handler data it needs.
+    'handler type' => 'context',
+
+    // Allow this to be enabled or disabled:
+    'disabled' => variable_get('ctools_pages_user_login_disabled', TRUE),
+    'enable callback' => 'ctools_pages_user_login_enable',
+  );
+}
+
+function ctools_pages_user_login_menu_alter(&$items, $task) {
+  if (variable_get('ctools_pages_user_login_disabled', TRUE)) {
+    return;
+  }
+  
+  //Since user/login is by default a local task, we need to do a little probing to find the callback.
+  if($items['user/login']['type']==MENU_DEFAULT_LOCAL_TASK){
+    $callback = $items['user']['page callback'];
+  }
+  else if(isset($items['user/login']['page callback'])){
+    $callback = $items['user/login']['page callback'];
+  }
+  else{
+    $callback = 'an unknown callback';
+  }
+  
+  // Override the menu item to point to our own function.
+  if ($callback == 'user_page' || variable_get('page_manager_override_anyway', FALSE)) {
+    $items['user/login']['page callback'] = 'ctools_pages_user_login';
+    $items['user/login']['file path'] = $task['path'];
+    $items['user/login']['file'] = $task['file'];
+  }
+  else {
+    variable_set('ctools_pages_user_login_disabled', TRUE);
+    if (!empty($GLOBALS['ctools_pages_enabling_user_login'])) {
+      drupal_set_message(t('Page manager module is unable to enable poll because some other module already has overridden with %callback.', array('%callback' => $callback)), 'warning');
+    }
+    return;
+  }
+
+}
+
+function ctools_pages_user_login() {
+  // Load my task plugin
+  $task = page_manager_get_task('user_login');
+
+  ctools_include('context');
+  ctools_include('context-task-handler');
+  $output = ctools_context_handler_render($task, '', array(), array());
+  if ($output !== FALSE) {
+     return $output;
+  }
+
+  module_load_include('inc', 'user', 'user.pages');
+  $function = 'user_page';
+  foreach (module_implements('page_manager_override') as $module) {
+    $call = $module . '_page_manager_override';
+    if (($rc = $call('user_login')) && function_exists($rc)) {
+      $function = $rc;
+      break;
+    }
+  }
+
+  // Otherwise, fall back.
+  return $function();
+}
+
+/**
+ * Callback to enable/disable the page from the UI.
+ */
+function ctools_pages_user_login_enable($cache, $status) {
+  variable_set('ctools_pages_user_login_disabled', $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['ctools_pages_enabling_user_login'] = TRUE;
+  }
+}
diff --git page_manager/plugins/tasks/user_password.inc page_manager/plugins/tasks/user_password.inc
new file mode 100755
index 0000000..cb6d07a
--- /dev/null
+++ page_manager/plugins/tasks/user_password.inc
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * @file
+ * 
+ * Plugin to allow page manager to take over the user password page.
+ *
+ */
+function ctools_pages_user_password_page_manager_tasks() {
+  return array(
+    // This is a 'page' task and will fall under the page admin UI
+    'task type' => 'page',
+
+    'title' => t('User Password Recovery Page'),
+    'admin title' => t('User Password Recovery Page'),
+    'admin description' => t('When enabled, this overrides the default Drupal behavior for the user password recovery page at <em>/user/pass</em>.'),
+    'admin path' => 'user/pass',
+
+    // Menu hooks so that we can alter the node/%node menu entry to point to us.
+    'hook menu alter' => 'ctools_pages_user_password_menu_alter',
+
+    // This is task uses 'context' handlers and must implement these to give the
+    // handler data it needs.
+    'handler type' => 'context',
+
+    // Allow this to be enabled or disabled:
+    'disabled' => variable_get('ctools_pages_user_password_disabled', TRUE),
+    'enable callback' => 'ctools_pages_user_password_enable',
+  );
+}
+
+function ctools_pages_user_password_menu_alter(&$items, $task) {
+  if (variable_get('ctools_pages_user_password_disabled', TRUE)) {
+    return;
+  }
+  
+  $callback = $items['user/password']['page callback'];
+
+  // Override the menu item to point to our own function.
+  if ($callback == 'drupal_get_form' || variable_get('page_manager_override_anyway', FALSE)) {
+    $items['user/password']['page callback'] = 'ctools_pages_user_password';
+    $items['user/password']['file path'] = $task['path'];
+    $items['user/password']['file'] = $task['file'];
+  }
+  else {
+    variable_set('ctools_pages_user_password_disabled', TRUE);
+    if (!empty($GLOBALS['ctools_pages_enabling_user_password'])) {
+      drupal_set_message(t('Page manager module is unable to enable poll because some other module already has overridden with %callback.', array('%callback' => $callback)), 'warning');
+    }
+    return;
+  }
+
+}
+
+function ctools_pages_user_password() {
+  // Load my task plugin
+  $task = page_manager_get_task('user_password');
+
+  ctools_include('context');
+  ctools_include('context-task-handler');
+  $output = ctools_context_handler_render($task, '', array(), array());
+  if ($output !== FALSE) {
+     return $output;
+  }
+
+  module_load_include('inc', 'user', 'user.pages');
+  
+  foreach (module_implements('page_manager_override') as $module) {
+    $call = $module . '_page_manager_override';
+    if (($rc = $call('user_password')) && function_exists($rc)) {
+      $function = $rc;
+      break;
+    }
+  }
+
+  // Otherwise, fall back.
+  return drupal_get_form('user_pass');
+}
+
+/**
+ * Callback to enable/disable the page from the UI.
+ */
+function ctools_pages_user_password_enable($cache, $status) {
+  variable_set('ctools_pages_user_password_disabled', $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['ctools_pages_enabling_user_password'] = TRUE;
+  }
+}
diff --git page_manager/plugins/tasks/user_profile_edit.inc page_manager/plugins/tasks/user_profile_edit.inc
new file mode 100755
index 0000000..ffbddfd
--- /dev/null
+++ page_manager/plugins/tasks/user_profile_edit.inc
@@ -0,0 +1,167 @@
+<?php
+
+/*
+ * @file
+ * 
+ * Plugin to allow page manager to take over the profile category page.
+ *
+ */
+
+ //@TODO: Make it clear that this is for the page provided by profile2.  Core profile does not create profile edit pages.
+function ctools_pages_user_profile_edit_page_manager_tasks() {
+  if(module_exists('profile2')){
+    return array(
+      // This is a 'page' task and will fall under the page admin UI
+      'task type' => 'page',
+  
+      'title' => t('User Edit Profile'),
+      'admin title' => t('User Edit Profile'),
+      'admin description' => t('When enabled, this overrides the default Drupal behavior for the user register page at <em>/user/register</em>.'),
+      'admin path' => 'user/%user/edit/%profile',
+  
+      // Menu hooks so that we can alter the node/%node menu entry to point to us.
+      'hook menu alter' => 'ctools_pages_user_profile_edit_menu_alter',
+   
+      // This is task uses 'context' handlers and must implement these to give the
+      // handler data it needs.
+      'handler type' => 'context',
+      'get arguments' => 'ctools_pages_user_profile_get_arguments',
+      'get context placeholders' => 'ctools_pages_user_profile_get_contexts',
+
+  
+      // Allow this to be enabled or disabled:
+      'disabled' => variable_get('ctools_pages_user_profile_edit_disabled', TRUE),
+      'enable callback' => 'ctools_pages_user_profile_edit_enable',
+    );
+  }
+}
+
+/**
+ * Callback defined by ctools_pages_user_profile_edit_page_manager_tasks().
+ *
+ * Alter the node edit input so that node edit comes to us rather than the
+ * normal node edit process.
+ */
+function ctools_pages_user_profile_edit_menu_alter(&$items, $task) {
+  if (variable_get('ctools_pages_user_profile_edit_disabled', TRUE)) {
+    return;
+  }
+  
+  if (($categories = _user_categories()) && (count($categories) > 1)) {
+    foreach ($categories as $key => $category) {
+      // 'account' is already handled by the MENU_DEFAULT_LOCAL_TASK.
+      if ($category['name'] != 'account') {
+        $callback = $items['user/%user_category/edit/' . $category['name']]['page callback'];
+        if ($callback == 'drupal_get_form' || variable_get('page_manager_override_anyway', FALSE)) {
+          $items['user/%user_category/edit/' . $category['name']]['page callback']='ctools_pages_user_profile_edit';
+          $items['user/%user_category/edit/' . $category['name']]['file path'] = $task['path'];
+          $items['user/%user_category/edit/' . $category['name']]['file'] = $task['file'];
+          $success[] = 'user/%user_category/edit/' . $category['name'];
+        }
+        else{
+          $failed[] = 'user/%user_category/edit/' . $category['name'];
+        }
+      }
+    }
+  }
+  if(!isset($success)){
+    variable_set('ctools_pages_user_profile_edit_disabled', TRUE);
+  }
+  if(isset($failed)){
+    if (!empty($GLOBALS['ctools_pages_enabling_user_profile_edit'])) {
+      $failed_list = implode(',', $failed);
+      drupal_set_message(t('Page manager module is unable to override the following profile edit pages: <em>%callbacks</em>.', array('%callbacks' => $failed_list)), 'warning');
+    }
+  }
+   
+
+}
+
+/**
+ * Callback to get arguments provided by this task handler.
+ *
+ * Since this is the profile category eidt and there is no UI on the arguments, we
+ * create dummy arguments that contain the needed data.
+ */
+function ctools_pages_user_profile_get_arguments($task, $subtask_id) {
+  return array(
+    array(
+      'keyword' => 'profile_category',
+      'identifier' => t('Profile being edited'),
+      'id' => 1,
+      'name' => 'profile_category',
+      'settings' => array(),
+    ),
+  );
+}
+
+/**
+ * Callback to get context placeholders provided by this handler.
+ */
+function ctools_pages_user_profile_get_contexts($task, $subtask_id) {
+  return ctools_context_get_placeholders_from_argument(ctools_pages_user_profile_get_arguments($task, $subtask_id));
+}
+
+/**
+ * Entry point for our overridden node edit.
+ *
+ * This function asks its assigned handlers who, if anyone, would like
+ * to run with it. If no one does, it passes through to Drupal core's
+ * node edit, which is node_page_edit().
+ */
+function ctools_pages_user_profile_edit($form_id, $account, $category) {
+  // Load my task plugin
+  $task = page_manager_get_task('user_profile_edit');
+
+  ctools_include('context');
+  ctools_include('context-task-handler');
+  $profile = array('category' => $category, 'account' => $account);
+  $contexts = ctools_context_handler_get_task_contexts($task, '', array($profile, $account));
+  
+  $arg = array($profile);
+  
+  $output = ctools_context_handler_render($task, '', $contexts, $arg);
+  if ($output === FALSE) {
+    // Fall back!
+    // We've already built the form with the context, so we can't build it again, or
+    // form_clean_id will mess up our ids. But we don't really need to, either:
+    $context = reset($contexts);
+    $output = $context->form;
+  }
+  
+  return $output;
+
+/*OLD CODE
+  $output = ctools_context_handler_render($task, '', array(), array());
+  if ($output !== FALSE) {
+     return $output;
+  }
+
+  module_load_include('inc', 'user', 'user.pages');
+  foreach (module_implements('page_manager_override') as $module) {
+    $call = $module . '_page_manager_override';
+    if (($rc = $call('user_profile_edit')) && function_exists($rc)) {
+      $function = $rc;
+      break;
+    }
+  }
+  
+  if(isset($function)){
+    return $function;
+  }
+  // Otherwise, fall back.
+  return ctools_pages_get_form($form_id, array($account, $category), array('module' => 'user', 'file' => 'user.pages'));
+ * */
+}
+
+/**
+ * Callback to enable/disable the page from the UI.
+ */
+function ctools_pages_user_profile_edit_enable($cache, $status) {
+  variable_set('ctools_pages_user_profile_edit_disabled', $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['ctools_pages_enabling_user_profile_edit'] = TRUE;
+  }
+}
diff --git page_manager/plugins/tasks/user_register.inc page_manager/plugins/tasks/user_register.inc
new file mode 100755
index 0000000..eea3b1d
--- /dev/null
+++ page_manager/plugins/tasks/user_register.inc
@@ -0,0 +1,92 @@
+<?php
+
+/*
+ * @file
+ * 
+ * Plugin to allow page manager to take over the user register page.
+ *
+ */
+function ctools_pages_user_register_page_manager_tasks() {
+  return array(
+    // This is a 'page' task and will fall under the page admin UI
+    'task type' => 'page',
+
+    'title' => t('User Register Page'),
+    'admin title' => t('User Register Page'),
+    'admin description' => t('When enabled, this overrides the default Drupal behavior for the user register page at <em>/user/register</em>.'),
+    'admin path' => 'user/register',
+
+    // Menu hooks so that we can alter the node/%node menu entry to point to us.
+    'hook menu alter' => 'ctools_pages_user_register_menu_alter',
+
+    // This is task uses 'context' handlers and must implement these to give the
+    // handler data it needs.
+    'handler type' => 'context',
+
+    // Allow this to be enabled or disabled:
+    'disabled' => variable_get('ctools_pages_user_register_disabled', TRUE),
+    'enable callback' => 'ctools_pages_user_register_enable',
+  );
+}
+
+function ctools_pages_user_register_menu_alter(&$items, $task) {
+  if (variable_get('ctools_pages_user_register_disabled', TRUE)) {
+    return;
+  }
+  
+  $callback = $items['user/register']['page callback'];
+ 
+  // Override the menu item to point to our own function.
+  if ($callback == 'drupal_get_form' || variable_get('page_manager_override_anyway', FALSE)) {
+    $items['user/register']['page callback'] = 'ctools_pages_user_register';
+    $items['user/register']['file path'] = $task['path'];
+    $items['user/register']['file'] = $task['file'];
+  }
+  else {
+    variable_set('ctools_pages_user_register_disabled', TRUE);
+    if (!empty($GLOBALS['ctools_pages_enabling_user_register'])) {
+      drupal_set_message(t('Page manager module is unable to enable the user register page because some other module already has overridden with %callback.', array('%callback' => $callback)), 'warning');
+    }
+    return;
+  }
+
+}
+
+function ctools_pages_user_register() {
+  // Load my task plugin
+  $task = page_manager_get_task('user_register');
+
+  ctools_include('context');
+  ctools_include('context-task-handler');
+  $output = ctools_context_handler_render($task, '', array(), array());
+  if ($output !== FALSE) {
+     return $output;
+  }
+
+  module_load_include('inc', 'user', 'user.pages');
+  foreach (module_implements('page_manager_override') as $module) {
+    $call = $module . '_page_manager_override';
+    if (($rc = $call('user_register')) && function_exists($rc)) {
+      $function = $rc;
+      break;
+    }
+  }
+  
+  if(isset($function)){
+    return $function;
+  }
+  // Otherwise, fall back.
+  return drupal_get_form('user_register_form');
+}
+
+/**
+ * Callback to enable/disable the page from the UI.
+ */
+function ctools_pages_user_register_enable($cache, $status) {
+  variable_set('ctools_pages_user_register_disabled', $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['ctools_pages_enabling_user_register'] = TRUE;
+  }
+}
diff --git plugins/access/node_has_id.inc plugins/access/node_has_id.inc
new file mode 100755
index 0000000..45fc863
--- /dev/null
+++ plugins/access/node_has_id.inc
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * Plugin to provide access control based upon role membership.
+ */
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Node: Has ID"),
+  'description' => t('Will be false if the node object has no id (e.g. node/add forms)'),
+  'callback' => 'ctools_pages_node_has_id_ctools_access_check',
+  'default' => array(false),
+  'settings form' => 'ctools_pages_node_has_id_ctools_access_settings',
+  'settings form submit' => 'ctools_pages_node_has_id_ctools_access_settings_submit',
+  'summary' => 'ctools_pages_node_has_id_ctools_access_summary',
+  'required context' => new ctools_context_required(t('Node'), 'node'),
+);
+
+function ctools_pages_node_has_id_ctools_access_settings($form, &$form_state, $conf) {
+  return $form;
+}
+
+function ctools_pages_node_has_id_ctools_access_settings_submit($form, &$form_state) {
+}
+
+/**
+ * Check for access.
+ */
+function ctools_pages_node_has_id_ctools_access_check($conf, $context) {
+  // As far as I know there should always be a context at this point, but this
+  // is safe.
+  if (empty($context) || empty($context->data)) {
+    return FALSE;
+  }
+  else{
+    if(isset($context->data->nid) && $context->data->nid > 0){
+      return TRUE;
+    }
+  }
+}
+
+/**
+ * Provide a summary description based upon the checked roles.
+ */
+function ctools_pages_node_has_id_ctools_access_summary($conf, $context) {
+  return 'Node has ID';
+}
diff --git plugins/access/profile_category.inc plugins/access/profile_category.inc
new file mode 100755
index 0000000..2912fee
--- /dev/null
+++ plugins/access/profile_category.inc
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * @file
+ * Plugin to provide access control based upon role membership.
+ */
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Profile: category"),
+  'description' => t('Control access by profile category.'),
+  'callback' => 'ctools_pages_profile_category_ctools_access_check',
+  'default' => array('rids' => array()),
+  'settings form' => 'ctools_pages_profile_category_ctools_access_settings',
+  'settings form submit' => 'ctools_pages_profile_category_ctools_access_settings_submit',
+  'summary' => 'ctools_pages_profile_category_ctools_access_summary',
+  'required context' => new ctools_context_required(t('Profile Category'), 'profile_category'),
+);
+
+/**
+ * Settings form for the 'by role' access plugin
+ */
+function ctools_pages_profile_category_ctools_access_settings($form, &$form_state, $conf) {
+  $form['settings']['categories'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Category'),
+    '#default_value' => $conf['categories'],
+    '#options' => ctools_pages_get_profile_categories(),
+    '#description' => t('Only the checked categories will be granted access.'),
+  );
+  return $form;
+}
+
+/**
+ * Compress the categories allowed to the minimum.
+ */
+function ctools_pages_profile_category_ctools_access_settings_submit($form, &$form_state) {
+  $form_state['values']['settings']['categories'] = array_keys(array_filter($form_state['values']['settings']['categories']));
+}
+
+/**
+ * Check for access.
+ */
+function ctools_pages_profile_category_ctools_access_check($conf, $context) {
+  // As far as I know there should always be a context at this point, but this
+  // is safe.
+  if (empty($context) || empty($context->data)) {
+    return FALSE;
+  }
+
+  $category = $context->data;
+  return (bool) array_intersect($conf['categories'], array($category));
+}
+
+/**
+ * Provide a summary description based upon the checked roles.
+ */
+function ctools_pages_profile_category_ctools_access_summary($conf, $context) {
+  if (!isset($conf['categories'])) {
+    $conf['categories'] = array();
+  }
+  $categories = ctools_pages_get_profile_categories();
+
+  $names = array();
+  foreach (array_filter($conf['categories']) as $cat) {
+    $names[] = check_plain($categories[$cat]);
+  }
+
+  if (empty($names)) {
+    return t('@identifier can have any category', array('@identifier' => $context->identifier));
+  }
+
+  return format_plural(count($names), '@identifier has category "@cats"', '@identifier has one of "@cats"', array('@cats' => implode(', ', $names), '@identifier' => $context->identifier));
+}
+
+function ctools_pages_get_profile_categories(){
+  $categories = _user_categories();
+  $names = array();
+  foreach ($categories as $cat){
+    $names[$cat['name']] = $cat['title'];
+  }
+  return $names;
+}
+
+
diff --git plugins/arguments/profile_category.inc plugins/arguments/profile_category.inc
new file mode 100644
index 0000000..5c73aca
--- /dev/null
+++ plugins/arguments/profile_category.inc
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @file
+ *
+ * Plugin to provide an argument handler for a Taxonomy term
+ */
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Profile Category"),
+  // keyword to use for %substitution
+  'keyword' => 'profile_category',
+  'description' => t('Creates a profile context from a category machine name argument.'),
+  'context' => 'ctools_pages_profile_category_context',
+  'placeholder form' => array(
+    '#type' => 'textfield',
+    '#description' => t('Enter the profile category for this argument.'),
+  ),
+);
+
+/**
+ * Discover if this argument gives us the term we crave.
+ */
+function ctools_pages_profile_category_context($arg = NULL, $conf = NULL, $empty = FALSE) {
+  // If unset it wants a generic, unfilled context.
+  if ($empty) {
+    return ctools_context_create_empty('profile_category_form');
+  }
+  if(is_array($arg) && is_string($arg['category'])){
+    return ctools_context_create('profile_category_form', $arg);
+  }
+  
+  return NULL;
+}
\ No newline at end of file
diff --git plugins/content_types/user/profile_edit_form.inc plugins/content_types/user/profile_edit_form.inc
new file mode 100755
index 0000000..4b091a3
--- /dev/null
+++ plugins/content_types/user/profile_edit_form.inc
@@ -0,0 +1,222 @@
+<?php
+
+/**
+ * @file
+ * Handle rendering entity fields as panes.
+ */
+
+$plugin = array(
+  'title' => t('Profile Form'),
+  'defaults' => array('label' => 'title', 'formatter' => ''),
+  'content type' => 'ctools_pages_profile_edit_form_content_type_content_type',
+);
+
+/**
+ * Just one subtype.
+ *
+ * Ordinarily this function is meant to get just one subtype. However, we are
+ * using it to deal with the fact that we have changed the subtype names. This
+ * lets us translate the name properly.
+ */
+function ctools_pages_profile_edit_form_content_type_content_type($subtype) {
+  $types = ctools_pages_profile_edit_form_content_type_content_types();
+  if (isset($types[$subtype])) {
+    return $types[$subtype];
+  }
+}
+
+/**
+ * Return all field content types available.
+ */
+function ctools_pages_profile_edit_form_content_type_content_types() {
+  
+  /* @TODO this code is adapted from the node edit content type.  I think currently it does not work, 
+   * and either way it would probably be reviewed.
+   */
+  
+  // This will hold all the individual field content types.
+  $types = array();
+  $context_types = array();
+  $entities = entity_get_info();
+
+  foreach ($entities as $entity_type => $entity) {
+    foreach ($entity['bundles'] as $type => $bundle) {
+      foreach (field_info_instances($entity_type, $type) as $field_name => $field) {
+        if (!isset($types[$entity_type . ':' . $field_name])) {
+          $types[$entity_type . ':' . $field_name] = array(
+            'category' => t(ucfirst($entity_type)),
+            'icon' => 'icon_field.png',
+            'title' => t('Field: @widget_label (@field_name)', array(
+              '@widget_label' => t($field['label']),
+              '@field_name' => $field_name,
+            )),
+            'description' => t('Field on the referenced entity.'),
+            'edit form' => array(
+              'ctools_pages_profile_edit_form_content_type_formatter_options' => array(
+                'default' => TRUE,
+                'title' => t('Formatter options for: @widget_label (@field_name)', array(
+                  '@widget_label' => t($field['label']),
+                  '@field_name' => $field_name,
+                )),
+              ),
+              'ctools_pages_profile_edit_form_content_type_formatter_styles' => t('Formatter Styles'),
+            ),
+          );
+        }
+        $context_types[$entity_type . ':' . $field_name]['types'][$type] = $bundle['label'];
+      }
+    }
+  }
+
+  // Create the required context for each field related to the bundle types.
+  foreach ($types as $key => $field_content_type) {
+    list($entity_type, $field_name) = explode(':', $key, 2);
+    $types[$key]['required context'] = new ctools_context_required(t(ucfirst($entity_type)), $entity_type, array(
+      'type' => array_keys($context_types[$key]['types']),
+    ));
+    unset($context_types[$key]['types']);
+  }
+
+  return $types;
+}
+
+/**
+* Render the profile category form.
+*/
+function ctools_pages_profile_edit_form_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (empty($context) || empty($context->data)) {
+    return;
+  }
+
+  // Get a shortcut to the entity.
+  $entity = $context->data;
+  list($entity_type, $field_name) = explode(':', $subtype, 2);
+
+  // Load the entity type's information for this field.
+  $ids = entity_extract_ids($entity_type, $entity);
+  $field = field_info_instance($entity_type, $field_name, $ids[2]);
+
+  // Do not render if the entity type does not have this field.
+  if (empty($field)) {
+    return;
+  }
+  $language = field_language($entity_type, $entity, $field_name);
+
+  if (empty($conf['label']) || $conf['label'] == 'title') {
+    $label = 'hidden';
+    $conf['label'] = 'title';
+  }
+  else {
+    $label = $conf['label'];
+  }
+
+  $field_settings = array(
+    'label' => $label,
+    'type' => $conf['formatter'],
+  );
+
+  // Get the field output, and the title.\
+  if (!empty($conf['formatter_settings'])) {
+    $field_settings['settings'] = $conf['formatter_settings'];
+  }
+
+  $field_output = field_view_field($entity_type, $entity, $field_name, $field_settings, $language);
+
+  // Build the content type block.
+  $block = new stdClass();
+  if ($conf['label'] == 'title' && isset($field_output['#title'])) {
+    $block->title = $field_output['#title'];
+  }
+
+  $block->content = $field_output;
+  $block->delta   = $ids[0];
+
+  return $block;
+}
+
+/**
+* Returns an edit form for custom type settings.
+*/
+function ctools_pages_profile_edit_form_content_type_formatter_options($form, &$form_state) {
+  if (empty($form_state['conf']['formatter_settings'])) {
+    $form_state['conf']['formatter_settings'] = array();
+  }
+  $conf = $form_state['conf'];
+  $subtype = $form_state['subtype_name'];
+  list($entity_type, $field_name) = explode(':', $subtype, 2);
+
+  $field = field_info_field($field_name);
+  module_load_include('inc', 'field_ui', 'field_ui.admin');
+  $formatter_options = field_ui_formatter_options($field['type']);
+
+  $field_label_options = array(
+    'title' => t('Pane title'),
+    'above' => t('Above'),
+    'inline' => t('Inline'),
+    'hidden' => t('Hidden'),
+  );
+
+  $form['label'] = array(
+    '#type' => 'select',
+    '#title' => t('Label'),
+    '#options' => $field_label_options,
+    '#default_value' => $conf['label'],
+  );
+
+  $form['formatter'] = array(
+    '#type' => 'select',
+    '#title' => t('Select a formatter'),
+    '#options' => $formatter_options,
+    '#default_value' => $conf['formatter'],
+  );
+
+  return $form;
+}
+
+function ctools_pages_profile_edit_form_content_type_formatter_options_submit($form, &$form_state) {
+  $form_state['conf']['formatter'] = $form_state['values']['formatter'];
+  $form_state['conf']['label'] = $form_state['values']['label'];
+}
+
+function ctools_pages_profile_edit_form_content_type_formatter_styles($form, &$form_state) {
+  if (!$form_state['conf']['formatter_settings']) {
+    $form_state['conf']['formatter_settings'] = array();
+  }
+  $conf = $form_state['conf'];
+  $subtype = $form_state['subtype_name'];
+  list($entity_type, $field_name) = explode(':', $subtype, 2);
+  $field = field_info_field($field_name);
+  module_load_include('inc', 'field_ui', 'field_ui.admin');
+
+  ctools_include('fields');
+  $form['ctools_field_list'] = array(
+    '#type' => 'value',
+    '#value' => array(),
+  );
+
+  ctools_fields_get_field_formatter_settings_form($field, $conf['formatter'], $form, $form_state);
+  return $form;
+}
+
+function ctools_pages_profile_edit_form_content_type_formatter_styles_submit($form, &$form_state) {
+  $fields = $form_state['values']['ctools_field_list'];
+  $formatter_info = ctools_fields_get_field_formatter_info($fields);
+  foreach ($formatter_info as $info) {
+    if (!empty($info['settings'])) {
+      foreach ($info['settings'] as $field_name => $value) {
+        if (isset($form_state['values'][$field_name])) {
+          $form_state['conf']['formatter_settings'][$field_name] = $form_state['values'][$field_name];
+        }
+      }
+    }
+  }
+}
+
+/**
+* Returns the administrative title for a type.
+*/
+function ctools_pages_profile_edit_form_content_type_admin_title($subtype, $conf, $context) {
+  list($bundle, $field_name) = explode(':', $subtype);
+  ctools_include('fields');
+  return t('"@s" @field', array('@s' => $context->identifier, '@field' => ctools_field_label($field_name)));
+}
diff --git plugins/content_types/user/user_login_form.inc plugins/content_types/user/user_login_form.inc
new file mode 100755
index 0000000..341ad84
--- /dev/null
+++ plugins/content_types/user/user_login_form.inc
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Plugin to handle the login form content type.
+ */
+
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('User Login Form'),
+  'icon' => 'icon_user.png',
+  'description' => t('The user login form.'),
+  'category' => t('Forms'),
+);
+
+/**
+ * Outputs the login form.
+ */
+function ctools_pages_user_login_form_content_type_render($subtype, $conf, $panel_args) {
+  module_load_include('inc', 'user', 'user.pages');
+  
+  $block = new stdClass();
+  
+  $block->content = drupal_get_form('user_login');
+  return $block;
+}
+
+function ctools_pages_user_login_form_content_type_edit_form($form, &$form_state) {
+  // provide a blank form so we have a place to have context setting.
+  return $form;
+}
diff --git plugins/content_types/user/user_password_form.inc plugins/content_types/user/user_password_form.inc
new file mode 100755
index 0000000..893d8e5
--- /dev/null
+++ plugins/content_types/user/user_password_form.inc
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Plugin to handle the user password form content type.
+ */
+
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('User Password Form'),
+  'icon' => 'icon_user.png',
+  'description' => t('The user password recovery form.'),
+  'category' => t('Forms'),
+);
+
+/**
+ * Outputs the user password form.
+ */
+function ctools_pages_user_password_form_content_type_render($subtype, $conf, $panel_args) {
+  module_load_include('inc', 'user', 'user.pages');
+  
+  $block = new stdClass();
+  
+  $block->content = drupal_get_form('user_pass');
+  return $block;
+}
+
+function ctools_pages_user_password_form_content_type_edit_form($form, &$form_state) {
+  // provide a blank form so we have a place to have context setting.
+  return $form;
+}
diff --git plugins/content_types/user/user_register_form.inc plugins/content_types/user/user_register_form.inc
new file mode 100755
index 0000000..fecd77e
--- /dev/null
+++ plugins/content_types/user/user_register_form.inc
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Plugin to handle the user registration form.
+ */
+
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('User Register Form'),
+  'icon' => 'icon_user.png',
+  'description' => t('The new user registration form.'),
+  'category' => t('Forms'),
+);
+
+/**
+ * Outputs the user registration form.
+ */
+function ctools_pages_user_register_form_content_type_render($subtype, $conf, $panel_args) {
+  module_load_include('inc', 'user', 'user.pages');
+  
+  $block = new stdClass();
+  
+  $block->content = drupal_get_form('user_register_form');
+  return $block;
+}
+
+function ctools_pages_user_register_form_content_type_edit_form($form, &$form_state) {
+  // provide a blank form so we have a place to have context setting.
+  return $form;
+}
diff --git plugins/contexts/profile_category_form.inc plugins/contexts/profile_category_form.inc
new file mode 100755
index 0000000..7626731
--- /dev/null
+++ plugins/contexts/profile_category_form.inc
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * @file
+ *
+ * Plugin to provide a profile category form context
+ */
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Profile edit form"),
+  'description' => t('A node edit form.'),
+  'context' => 'ctools_pages_context_create_profile_category_form',
+  'edit form' => 'ctools_pages_context_profile_category_form_settings_form',
+  'defaults' => array('nid' => ''),
+  'keyword' => 'profile_category',
+  'context name' => 'profile_category_form',
+  'placeholder form' => array(
+    '#type' => 'textfield',
+    '#description' => t('Enter the profile category for this argument:'),
+  ),
+);
+
+/**
+ * It's important to remember that $conf is optional here, because contexts
+ * are not always created from the UI.
+ */
+function ctools_pages_context_create_profile_category_form($empty, $profile = NULL, $conf = FALSE) {
+
+  static $created;
+  
+  //Setup argument parts
+  $category = $profile['category'];
+  $account = $profile['account'];
+  
+  $context = new ctools_context(array('form', 'profile_category', 'profile_category_form'));
+  $context->plugin = 'profile_category_form';
+
+  if ($empty || (isset($created) && $created)) {
+    return $context;
+  }
+  $created = TRUE;
+
+  if ($conf) {
+    // In this case, $node is actually our $conf array.
+    $category = is_string($category) ? $category : 0;
+
+  }
+
+  if (!empty($category)) {
+    $form_id = 'user_profile_form';
+
+    $form_state = array('want form' => TRUE, 'build_info' => array('args' => array($account, $category)));
+
+    $file = drupal_get_path('module', 'user') . '/user.pages.inc';
+    require_once DRUPAL_ROOT . '/' . $file;
+    // This piece of information can let other modules know that more files
+    // need to be included if this form is loaded from cache:
+    $form_state['build_info']['files'] = array($file);
+
+    $form = drupal_build_form($form_id, $form_state);
+
+    // Fill in the 'node' portion of the context
+    $context->data     = $category;
+    $context->title    = $category;
+    $context->argument = $category;
+
+    $context->form       = $form;
+    $context->form_state = &$form_state;
+    $context->form_id    = $form_id;
+    $context->form_title = $category;
+    $context->restrictions['category'] = $category;
+    $context->restrictions['form'] = array('form');
+    return $context;
+  }
+}
+
+function ctools_pages_context_profile_category_form_settings_form($form, &$form_state) {
+  
+  // @TODO this is completely untested.  Also should be converted to list or autocomplete field.
+  $conf = &$form_state['conf'];
+
+  $form['profile_category'] = array(
+    '#title' => t('Enter the profile category'),
+    '#type' => 'textfield',
+    '#maxlength' => 512,
+    '#weight' => -10,
+  );
+
+  return $form;
+}
+
+/**
+ * Validate a node.
+ */
+function ctools_pages_context_profile_category_form_settings_form_validate($form, &$form_state) {
+  
+  // @TODO validate the value as a category type.
+  
+}
+
+function ctools_pages_context_profile_category_form_settings_form_submit($form, &$form_state) {
+  if ($form_state['values']['set_identifier']) {
+    $form_state['values']['identifier'] = $form_state['values']['profile_category'];
+  }
+
+  // This will either be the value set previously or a value set by the
+  // validator.
+  $form_state['conf']['profile_category'] = $form_state['values']['profile_category'];
+}
