diff --git a/includes/wizard.inc b/includes/wizard.inc
index 94e89f0..1b82272 100644
--- a/includes/wizard.inc
+++ b/includes/wizard.inc
@@ -518,11 +518,14 @@ function ctools_wizard_defaults(&$form_info) {
  * Fill in defaults for the wizard plugin type.
  */
 function ctools_wizard_process(&$plugin, $info) {
+  ctools_include('cleanstring');
   $plugin += array(
+    'forms' => array(),
     'id' => $plugin['name'],
     'form_state_key' => 'wizard',
     'title' => '',
     'description' => '',
+    'wizard paged' => FALSE,
     'show trail' => TRUE,
     'show back' => TRUE,
     'show return' => FALSE,
@@ -536,6 +539,25 @@ function ctools_wizard_process(&$plugin, $info) {
     'redirect' => $plugin['wizard path'],
   );
   $plugin += array('access arguments' => $plugin['permission']);
+
+  // process individual file paged wizard
+  if ($plugin['wizard paged']) {
+    foreach ($plugin['order'] as $page => $title) {
+      if (file_exists(DRUPAL_ROOT . "/{$plugin['path']}/$page.inc")) {
+        require_once DRUPAL_ROOT . "/{$plugin['path']}/$page.inc";
+        if (!array_key_exists($page, $plugin['forms'])) {
+          $settings = array(
+            'separator' => '_',
+            'lower case' => TRUE,
+          );
+          $plugin['forms'][$page] = array(
+            'form id' => "{$plugin['id']}_". ctools_cleanstring($page, $settings),
+            'include' => "{$plugin['path']}/$page.inc",
+          );
+        }
+      }
+    }
+  }
 }
 
 /**
@@ -574,7 +596,13 @@ function ctools_wizard_page($plugin, $step = NULL) {
     $key = $plugin['name'] . '__' . $user->uid;
   }
   else {
-    // TODO: Currently does not accommodate anonymous users.
+    // anonymous users - we use session id, dropped '0' in the spot for
+    // $user->uid and appended session id.  But since anonymous users might
+    // not yet have a session, we'll create one for those who don't.
+    if (empty($_SESSION['ctools_session_id'])) {
+      $_SESSION['ctools_hold_session'] = TRUE;
+    }
+    $key  = "{$plugin['name']}__0_" . session_id();
   }
 
   // Return the page or form specified by the handler for the current step.
@@ -676,3 +704,12 @@ function ctools_wizard_object_cache($op, $key, $values = array()) {
       return $cache;
   }
 }
+
+/**
+ * Helper function to include CTools plugins and get all wizard exportables.
+ */
+function ctools_get_wizards() {
+  ctools_include('plugins');
+  return ctools_get_plugins('ctools', 'wizard');
+}
+
diff --git a/includes/wizard.menu.inc b/includes/wizard.menu.inc
index 030c063..e8440dd 100644
--- a/includes/wizard.menu.inc
+++ b/includes/wizard.menu.inc
@@ -6,19 +6,64 @@
  */
 
 function ctools_wizard_menu(&$items) {
-  ctools_include('plugins');
-  $wizards = ctools_get_plugins('ctools', 'wizard');
-  foreach ($wizards as $wizard) {
+  ctools_include('wizard');
+  // page for wizard demo page
+  $base = array(
+    'access callback' => TRUE,
+    'page callback' => 'ctools_wizard_demo_page',
+    'file' => 'includes/wizard.menu.inc',
+    'file path' => drupal_get_path('module', 'ctools'),
+  );
+  $items['ctools_wizard_demo_page'] = array(
+    'title' => 'Chaos Tools Wizard Plugin Demo',
+    'type' => MENU_NORMAL_ITEM,
+  ) + $base;
+  // provide reasonable defaults, menu access and page callbacks, etc. for
+  // individual wizards
+  $defaults = array(
+    'page callback' => 'ctools_wizard_page',
+    'file' => 'includes/wizard.inc',
+  ) + $base;
+  foreach (ctools_get_wizards() as $wizard) {
+    if (array_key_exists('access', $wizard)) {
+      $defaults['access callback'] = $wizard['access'];
+      if (array_key_exists('access arguments', $wizard)) {
+	if (!is_array($wizard['access arguments'])) {
+	  $defaults['access arguments'] = array($wizard['access arguments']);
+	}
+	else {
+	  $defaults['access arguments'] = $wizard['access arguments'];
+	}
+      }
+    }
     $items[$wizard['wizard path']] = array(
       'title' => $wizard['title'],
       'description' => $wizard['description'],
-      'page callback' => 'ctools_wizard_page',
       'page arguments' => array($wizard),
-      'access callback' => $wizard['access'],
-      'access arguments' => array($wizard['access arguments']),
       'type' => $wizard['type'],
-      'file' => 'includes/wizard.inc',
-      'file path' => drupal_get_path('module', 'ctools'),
-    );
+    ) + $defaults;
   }
 }
+
+// -------------------------------------------------------------------------
+// Page callbacks
+
+/**
+ * Page callback to display links and render a container for wizard demo
+ * stuff.
+ */
+function ctools_wizard_demo_page() {
+  global $user;
+
+  // Create a list of clickable links.
+  $links = array();
+
+  // Two ways to do our wizard plugin example.
+  $links[] = l(t('Wizard-Plugin Example'), 'ctools-example/wizard-plugin');
+  $links[] = l(t('Paged Wizard-Plugin Example'), 'ctools-example/paged-wizard-plugin');
+
+  $output = theme('item_list', array('items' => $links, 'title' => t('Actions')));
+
+  return array('markup' => array('#markup' => $output));
+}
+
diff --git a/plugins/wizard/base/wizard.inc b/plugins/wizard/base/wizard.inc
index 90b95ae..cc12bc7 100644
--- a/plugins/wizard/base/wizard.inc
+++ b/plugins/wizard/base/wizard.inc
@@ -35,7 +35,7 @@ $plugin = array(
   'handler' => array(
     'class' => 'ctools_wizard',
   ),
-  'wizard path' => 'ctools/example/wizard-plugin',
+  'wizard path' => 'ctools-example/wizard-plugin',
   'first step' => 'page1',
   'order' => array(
     'page1' => t('Page 1'),
@@ -140,4 +140,4 @@ function ctools_wizard_example_page3($form, $form_state) {
  */
 function ctools_wizard_example_finish($values) {
   drupal_set_message('<pre>' . var_export($values, TRUE) . '</pre>');
-}
\ No newline at end of file
+}
diff --git a/plugins/wizard/paged/paged-1.inc b/plugins/wizard/paged/paged-1.inc
new file mode 100644
index 0000000..308ea92
--- /dev/null
+++ b/plugins/wizard/paged/paged-1.inc
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * A simple textfield for gathering a numeric value.
+ */
+function ctools_wizard_plugin_paged_example_paged_1($form, $form_state) {
+  $form['example_1'] = array(
+    '#type' => 'select',
+    '#options' => array(
+		    'happy' => 'happy',
+		    'angry' => 'angry', 
+		    'bored' => 'bored',
+		    'sad' => 'sad',
+                  ),
+    '#title' => t('Example Emotion 1'),
+    '#description' => t('Select an emotion, (but not angry).'),
+    '#required' => TRUE,
+    '#default_value' => isset($form_state['wizard']['example_1']) ? $form_state['wizard']['example_1'] : '',
+  );  
+  return $form;
+}
+
+/**
+ * Check the value of our form element to see that it is numeric.
+ */
+function ctools_wizard_plugin_paged_example_paged_1_validate(&$form, &$form_state) {
+  if ('angry' == $form_state['values']['example_1']) {
+    form_set_error('example_1', t('Angry emotions not allowed.'));
+  }
+}
+
+/**
+ * Place our value in the 'form_state_key' defined section of our form_state.
+ * This section is saved to the object-cache on each next callback invocation.
+ */
+function ctools_wizard_plugin_paged_example_paged_1_submit($form, &$form_state) {
+  $form_state['wizard']['example_1'] = $form_state['values']['example_1'];
+}
+
+
diff --git a/plugins/wizard/paged/paged-2.inc b/plugins/wizard/paged/paged-2.inc
new file mode 100644
index 0000000..02acf1d
--- /dev/null
+++ b/plugins/wizard/paged/paged-2.inc
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * A simple textfield for gathering a numeric value.
+ */
+function ctools_wizard_plugin_paged_example_paged_2($form, $form_state) {
+  $form['show_example_1'] = array(
+    '#type' => 'item',
+    '#title' => t('Emotion from page 1'),
+    '#markup' => isset($form_state['wizard']['example_1']) ? $form_state['wizard']['example_1'] : '',
+  );  
+  $form['example_2'] = array(
+    '#type' => 'select',
+    '#options' => array(
+		    'happy' => 'happy',
+		    'angry' => 'angry', 
+		    'bored' => 'bored',
+		    'sad' => 'sad',
+                  ),
+    '#title' => t('Example Emotion 2'),
+    '#description' => t('This field must be the same value as the previous field (%em1) to pass validation.', array('%em1' => $form_state['wizard']['example_1'])),
+
+    '#required' => TRUE,
+    '#default_value' => isset($form_state['wizard']['example_2']) ? $form_state['wizard']['example_2'] : '',
+  );  
+  return $form;
+}
+
+/**
+ * Demonstrates cross form validation with previous values. Requires the 
+ * second value to be equal to the orginal value.
+ */
+function ctools_wizard_plugin_paged_example_paged_2_validate(&$form, &$form_state) {
+  if ($form_state['values']['example_2'] != $form_state['wizard']['example_1']) {
+    form_set_error('example_2', t('This field must be equal to your example 1 answer.'));
+  }
+}
+
+/**
+ * Again, place our value in the 'form_state_key' defined section of our
+ * form_state to guarantee the values are saved.
+ */
+function ctools_wizard_plugin_paged_example_paged_2_submit($form, &$form_state) {
+  $form_state['wizard']['example_2'] = $form_state['values']['example_2'];
+}
+
+
diff --git a/plugins/wizard/paged/paged-3.inc b/plugins/wizard/paged/paged-3.inc
new file mode 100644
index 0000000..cd0f35b
--- /dev/null
+++ b/plugins/wizard/paged/paged-3.inc
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * A simple textfield for gathering a numeric value.
+ */
+function ctools_wizard_plugin_paged_example_paged_3($form, $form_state) {
+  $header = array(t('Labels'), t('Values'));
+  $rows = array(
+    array(t('Example Emotion 1'), $form_state['wizard']['example_1']),
+    array(t('Example Emotion 2'), $form_state['wizard']['example_2']),
+  );
+  $form['results']['#markup'] = theme('table', array('header' => $header, 'rows' => $rows));
+  return $form;
+}
+
diff --git a/plugins/wizard/paged/paged_wizard.inc b/plugins/wizard/paged/paged_wizard.inc
new file mode 100644
index 0000000..72ac0a1
--- /dev/null
+++ b/plugins/wizard/paged/paged_wizard.inc
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * CTools' file-paged multi-step form wizard plugin type.
+ *
+ * This plugin demostrates the necessary components for building a ctools
+ * style wizard through the simple use of the plugin with the added benefit
+ * of pages being stored in seperate files. This plugin utilizes the
+ * ctools_wizard class, in sibling 'base' directory, and simply specifies a
+ * handful of settings. because it set 'wizard paged' as true, the init from
+ * the ctools_wizard class will construct the 'form' array, and include the
+ * form, validate and submit handlers for each step (Each in it's own file).
+ * This $plugin (in this file) then specifies a 'wizard finish' callback for
+ * what to do with the final values set in the wizard itself.
+ *
+ * The difference between this and the base version is that this version
+ * demonstrates the one file per wizard page.  A feature that will make 
+ * larger wizard forms more manageable.  In escense, the difference is 
+ * adding a 'wizard paged' entry in $plugins, and removing the 'forms' entry
+ * which will be built by the process method from the 'order' sub-array, so
+ * that each step in 'order' array, represented by the keys in that array,
+ * become the files from which the forms and callbacks for the step are 
+ * loaded.  
+ *
+ * Please note in the submit handlers how all values are passed to
+ * $form_state['wizard']. This is our 'form_state_key' which could be 
+ * renamed by setting a 'form_state_key' in the $plugin array.
+ * Validate/Submit handlers assume the plugin creator will know what
+ * 'form_state_key' is being used for this plugin. If not set (as is the
+ * case in this plugin) 'form_state_key' will default to 'wizard'.
+ *
+ * 'order' => array(
+ *   'paged-1' => t('Paged File 1'),
+ *   ...
+ *
+ * And 'paged-1' is converted to 'paged-1.inc and sets a new 'forms' entry
+ * for the page's form function by composing the 'id' from $plugins with a
+ * massaged step name, where 'paged-1' becomes 'paged_1' via
+ * ctools_cleanstring.  So here, in example, with an 'id' of 
+ * 'ctools_wizard_plugin_paged_example', then the system will attempt to 
+ * open the file 'paged-1.inc' in this directory, searching for a function:
+ * 'ctools_wizard_plugin_paged_example_paged_1()' If found then that name
+ * is installed in the 'forms' array for the wizard-page step.
+ *
+ * @see ctools_wizard::process()
+ */
+
+/**
+ * An example ctools wizard file-paged plugin.
+ */
+$plugin = array(
+  'title' => 'Wizard Paged Plugin',
+  'description' => 'An example plugin for ctools wizard plugins with automatical pages (as seperate files).',
+  'id' => 'ctools_wizard_plugin_paged_example',
+  'type' => MENU_CALLBACK,
+  'wizard path' => 'ctools-example/paged-wizard-plugin',
+  'wizard paged' => TRUE,
+  'first step' => 'paged-1',
+  // each entry in order will load a page to get the forms entry and the
+  // functions asscociated with them.
+  'order' => array(
+    'paged-1' => t('Paged File 1'),
+    'paged-2' => t('Paged File 2'),
+    'paged-3' => t('Paged File 3'),
+  ),
+  'wizard finish' => 'ctools_paged_wizard_example_finish',
+);
+
+/**
+ * Prove that our values were in the object cache, and do something with 
+ * them before the object cache is cleared. This is the last function to
+ * fire before the values are lost, so if you are going to save them, now is
+ * the time to do it.
+*/   
+function ctools_paged_wizard_example_finish($values) {
+  drupal_set_message('<pre>' . var_export($values, TRUE) . '</pre>');
+} 
+
