diff --git a/tests/workbench_moderation.test b/tests/workbench_moderation.test
new file mode 100644
index 0000000..7a18730
--- /dev/null
+++ b/tests/workbench_moderation.test
@@ -0,0 +1,129 @@
+<?php
+/**
+ * @file
+ * state_flow.test
+ */
+/**
+ * Unit tests for the StateFlow revision state machine.
+ */
+class WorkbenchModerationWebTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Workbench Moderation basic tests',
+      'description' => 'Perform basic web tests on Workbench Moderation.',
+      'group' => 'Workbench Moderation',
+    );
+  }
+
+  function setup() {
+    // @todo These arguments might be handled by dependencies.
+    parent::setup('state_machine', 'state_flow', 'state_flow_entity', 'workbench_moderation', 'workbench_workflows', 'views');
+    // install the basic workflow.
+    module_load_include('inc', 'workbench_workflows', 'includes/workbench_workflows.starter');
+    workbench_workflows_import_starter_exportables();
+
+    $web_user = $this->drupalCreateUser(array('administer nodes', 'bypass node access'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Test embargoed nodes scheduled to publish in the future.
+   */
+  function testViewDraftTab() {
+
+    // This first chunk is not specific to the draft tab and perhaps should be
+    // abstracted to a helper function.
+
+    $edit = array();
+    $title = $this->randomName(8);
+    $edit['title'] = $title;
+    $edit['event'] = 'draft';
+    $edit['event_comment'] = $this->randomName(8);
+    $this->drupalPost("node/add/article", $edit, t('Save'));
+    $this->drupalGet("node/1");
+    $this->assertText($title, t('Title is visible on draft node for logged in user.'));
+
+    // Check that view draft tab is not displaying.
+    $this->drupalGet('node/1/draft');
+    $this->assertResponse(403, 'View Draft tab responds with 403 to logged in user');
+
+    // Check anonymous behavior. Verify access denied.
+    $this->drupalLogout();
+    $this->drupalGet("node/1");
+    $this->assertNoText($title, t('Title is not visible on draft node for anonymous user.'));
+    $this->assertResponse(403, 'Draft node page responds with 403 to anonymous user');
+
+    // Check that view draft tab is not displaying.
+    $this->drupalGet('node/1/draft');
+    $this->assertResponse(403, 'View Draft tab responds with 403 to anonymous user');
+
+    // Log in again.
+    $web_user = $this->drupalCreateUser(array('administer nodes', 'bypass node access'));
+    $this->drupalLogin($web_user);
+
+    // Set the node to published.
+    $edit =array();
+    $edit['event'] = 'published';
+    $edit['event_comment'] = $this->randomName(8);
+    $this->drupalPost("node/1/revisions-state-flow-states", $edit, t('Update State'));
+    $this->drupalGet("node/1");
+    $this->assertText($title, t('Title is visible on published node for logged in user.'));
+
+    // Check that view draft tab is not displaying.
+    $this->drupalGet('node/1/draft');
+    $this->assertResponse(403, 'View Draft tab responds with 403 to logged in user');
+
+    // Check anonymous behavior. Verify access after publishing.
+    $this->drupalLogout();
+    $this->drupalGet("node/1");
+    $this->assertText($title, t('After publishing, anonymous user can see node title.'));
+    $this->assertResponse(200, 'After publishing,  anonymous user gets a 200 for node page.');
+
+    // Check that view draft tab is not displaying.
+    $this->drupalGet('node/1/draft');
+    $this->assertResponse(403, 'View Draft tab responds with 403 to anonymous user');
+
+
+    // -------------------------------------------------------------------------
+    // Here is the part that actually tests the forward revision tab.
+
+    // Edit the node, creating a new title, set to needs review.
+
+    // @todo assert that draft tab is not avalible at this point.
+
+    // Log in again.
+    $web_user = $this->drupalCreateUser(array('administer nodes', 'bypass node access'));
+    $this->drupalLogin($web_user);
+
+    $edit = array();
+    $new_title = $this->randomName(8);
+    $edit['title'] = $new_title;
+    $edit['event'] = 'needs_review';
+    $this->drupalPost("node/1/edit", $edit, t('Save'));
+     
+
+    // Check node/1.
+    // Verify that it is still showing the old title.
+    $this->drupalGet("node/1");
+    $this->assertText($title, t('User can see published node title.'));
+    $this->assertResponse(200, 'User gets a 200 for node page.');
+    // Check node/1/draft
+    // Verify that it is showing the new draft title.
+    $this->drupalGet("node/1/draft");
+    $this->assertText($new_title, t('User can see node draft title.'));
+    $this->assertResponse(200, 'User gets a 200 for node draft page.');
+    
+    // Log out.
+    // Check node/1.
+    // Verify that it is still showing the old title to anonymous users.
+    $this->drupalLogout();
+    $this->drupalGet("node/1");
+    $this->assertText($title, t('Title is visible on published node for anonymous user.'));
+    $this->assertResponse(200, 'Anonymous user gets a 200 for node page.');
+    // Check node/1/draft
+    // Verify that gives an access denied.
+    $this->drupalGet("node/1/draft");
+    $this->assertNoText($new_title, t('Title is not visible on draft node for anonymous user.'));
+    $this->assertResponse(403, 'Draft node page responds with 403 to anonymous user');
+  }
+}
diff --git a/workbench_moderation.info b/workbench_moderation.info
index e4ea620..70713ab 100644
--- a/workbench_moderation.info
+++ b/workbench_moderation.info
@@ -6,9 +6,11 @@ core = 7.x
 ; files[] = plugins/state_flow/workbench_stateflow.inc @todo, remove this file
 
 dependencies[] = state_flow
+dependencies[] = views
 
 ; @todo, It's possible that workbench moderation could be used without
 ; workbench_workflows. There are currently coded assumptions that workbench_workflows is used.
 dependencies[] = workbench_workflows
 
 files[]=includes/workbench_moderation_handler_filter_state.inc
+files[] = tests/workbench_moderation.test
\ No newline at end of file
diff --git a/workbench_moderation.module b/workbench_moderation.module
index a26ccbf..524d62b 100644
--- a/workbench_moderation.module
+++ b/workbench_moderation.module
@@ -9,6 +9,86 @@ function workbench_moderation_views_api() {
 }
 
 /**
+ * Implements hook_menu().
+ */
+function workbench_moderation_menu() {
+  $items = array();
+
+  // View the current draft of a node.
+  $items["node/%node/draft"] = array(
+    'title' => 'View draft',
+    'page callback' => 'workbench_moderation_node_view_draft',
+    'page arguments' => array(1),
+    'access callback' => '_workbench_moderation_access_current_draft',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -9,
+  );
+
+  return $items;
+}
+
+/**
+ * Displays the current draft the node, if it is not published.
+ *
+ * @param $node
+ *   The node being acted upon.
+ *
+ * @return
+ *   A fully themed node page.
+ */
+function workbench_moderation_node_view_draft($node) {
+  //get draft node
+  $draft_node = state_flow_entity_get_active_revision($node, 'node');
+  //return themed draft node page
+  return workbench_moderation_router_item_page_callback($draft_node);
+
+}
+
+/**
+ * Get the menu router item for nodes.
+ *
+ * @param $node
+ *   The node being acted upon.
+ * @return
+ *   A fully themed node page.
+ */
+function workbench_moderation_router_item_page_callback($node) {
+  $router_item = menu_get_item('node/' . $node->nid);
+  if ($router_item['include_file']) {
+    require_once DRUPAL_ROOT . '/' . $router_item['include_file'];
+  }
+
+  // Call whatever function is assigned to the main node path but pass the
+  // current node as an argument. This approach allows for the reuse of of Panel
+  // definition acting on node/%node.
+  return $router_item['page_callback']($node);
+
+}
+
+/**
+ * Checks if the user can view the current node revision.
+ *
+ * This is the access callback for node/%node/draft as defined in
+ * workbench_moderation_menu().
+ *
+ * @param $node
+ *   The node being acted upon.
+ *
+ * @return
+ *   Booelan TRUE or FALSE.
+ */
+function _workbench_moderation_access_current_draft($node) {
+
+  $active_id = state_flow_entity_get_active_revision_id($node, 'node');
+  if($active_id == $node->vid){
+    return FALSE;
+  }
+
+  return state_flow_menu_node_access($node);
+}
+
+/**
  * Implements hook_menu_alter().
  */
 function workbench_moderation_menu_alter(&$items) {
diff --git a/workbench_moderation.node.inc b/workbench_moderation.node.inc
new file mode 100644
index 0000000..cb6be95
--- /dev/null
+++ b/workbench_moderation.node.inc
@@ -0,0 +1,8 @@
+<?php
+
+
+function workbench_moderation_node_view_draft($node) {
+
+  return 'hello world!';
+
+}
