diff --git a/ers.module b/ers.module
index da520bc..5765288 100644
--- a/ers.module
+++ b/ers.module
@@ -459,20 +459,13 @@ function ers_entity_schedule_form($entity_type, $entity, $checkbox = TRUE) {
     ),
   );
 
-  if (empty($revision_id)) {
-    // If there is no revision id yet, the first revision MUST be the published
-    // So hide the scheduling widget.
-    $form['ers']['#access'] = FALSE;
-    return $form;
-  }
-
   if (module_exists('date_popup')) {
     $form['ers']['ers_publish_schedule']['#type'] = 'date_popup';
     $form['ers']['ers_publish_schedule']['#description'] = t('Leave blank to publish this draft immediately.');
     unset($form['ers']['ers_publish_schedule']['#maxlength']);
   }
 
-  if (!empty($entity->ers_schedule[$revision_id])) {
+  if (!empty($revision_id) && !empty($entity->ers_schedule[$revision_id])) {
     $schedule = $entity->ers_schedule[$revision_id];
     $form['ers']['ers_publish']['#default_value'] = TRUE;
     if (module_exists('date_popup')) {
diff --git a/plugins/entity/ERSEntityDefault.class.php b/plugins/entity/ERSEntityDefault.class.php
index 8bfc620..66e16a5 100644
--- a/plugins/entity/ERSEntityDefault.class.php
+++ b/plugins/entity/ERSEntityDefault.class.php
@@ -96,6 +96,11 @@ class ERSEntityDefault implements ERSEntityInterface {
   public $entity_type = '';
 
   /**
+   * Whether the entity supports published/unpublished state.
+   */
+  public $supports_publishing_flag = FALSE;
+
+  /**
    * Initialize the plugin and store the plugin info.
    */
   function init($plugin) {
diff --git a/plugins/entity/ERSEntityNode.class.php b/plugins/entity/ERSEntityNode.class.php
index 5aaaa11..a9edd6a 100644
--- a/plugins/entity/ERSEntityNode.class.php
+++ b/plugins/entity/ERSEntityNode.class.php
@@ -10,6 +10,9 @@
  * Handles node specific functionality for ERS.
  */
 class ERSEntityNode extends ERSEntityDefault {
+
+  public $supports_publishing_flag = TRUE;
+
   public function hook_menu_alter(&$items) {
     // Provide a nicer title to remind the user that this will edit drafts.
     $items['node/%node/edit']['title'] = 'Edit';
@@ -21,7 +24,7 @@ class ERSEntityNode extends ERSEntityDefault {
       'title' => 'Revisions',
       'page callback' => 'ers_entity_plugin_switcher_page',
       'page arguments' => array('node', 'revisions', 1),
-      'access callback' => '_node_revision_access',
+      'access callback' => '_ers_node_revision_access',
       'access arguments' => array(1),
       'weight' => 2,
       'type' => MENU_LOCAL_TASK,
@@ -42,6 +45,10 @@ class ERSEntityNode extends ERSEntityDefault {
     // which we absolutely do no want in this context. So we store that
     // UID and restore it after the node_save.
     $uid = $published_revision->revision_uid;
+
+    // If node is unpublished, publish it.
+    $published_revision->status = !empty($published_revision->published_revision_id);
+
     node_save($published_revision);
     if ($uid != $GLOBALS['user']->uid) {
       db_update('node_revision')
@@ -70,24 +77,31 @@ class ERSEntityNode extends ERSEntityDefault {
         return;
       }
 
-      if (empty($node->nid)) {
-        return;
-      }
+      // Make sure to include this file when form is cached.
+      $form_state['build_info']['files'][] = $this->plugin['path'] . '/' . $this->plugin['handler'] . '.class.php';
 
-      // Reset the revision field.
-      if ($node->published_revision_id == $node->draft_revision_id) {
-        $form['revision_information']['revision']['#default_value'] = TRUE;
-        $form['revision_information']['revision']['#description'] = t('Creating a new revision will create a draft revision. This revision will not be published until it is published from the revisions tab. Creating a new revision will create a new draft revision only.');
-        $form['revision_information']['revision']['#disabled'] = TRUE;
+      if (empty($node->nid)) {
+        $form['options']['status']['#disabled'] = TRUE;
+        $form['options']['status']['#default_value'] = FALSE;
+        $form['options'] += ers_entity_schedule_form('node', $node);
+        $form['#submit'][] = 'ers_node_form_submit';
       }
       else {
-        $form['revision_information']['revision']['#default_value'] = FALSE;
-        $form['revision_information']['revision']['#description'] = t('You are currently editing the draft revision. This draft will not be published until it is published from the revisions tab.');
+        // Reset the revision field.
+        if ($node->published_revision_id == $node->draft_revision_id) {
+          $form['revision_information']['revision']['#default_value'] = TRUE;
+          $form['revision_information']['revision']['#description'] = t('Creating a new revision will create a draft revision. This revision will not be published until it is published from the revisions tab. Creating a new revision will create a new draft revision only.');
+          $form['revision_information']['revision']['#disabled'] = TRUE;
+        }
+        else {
+          $form['revision_information']['revision']['#default_value'] = FALSE;
+          $form['revision_information']['revision']['#description'] = t('You are currently editing the draft revision. This draft will not be published until it is published from the revisions tab.');
+        }
+  
+        // Provide a scheduling widget to schedule this draft.
+        $form['revision_information'] += ers_entity_schedule_form('node', $node);
+        $form['#submit'][] = 'ers_node_form_submit';
       }
-
-      // Provide a scheduling widget to schedule this draft.
-      $form['revision_information'] += ers_entity_schedule_form('node', $node);
-      $form['#submit'][] = 'ers_node_form_submit';
     }
   }
 
@@ -240,5 +254,36 @@ class ERSEntityNode extends ERSEntityDefault {
 }
 
 function ers_node_form_submit($form, &$form_state) {
-  ers_entity_schedule_form_submit($form['revision_information'], $form_state, 'node', $form_state['node']);
+  $node = &$form_state['node'];
+  ers_entity_schedule_form_submit((empty($node->nid) ? $form['options'] : $form['revision_information']), $form_state, 'node', $node);
+}
+
+/**
+ * Access callback for "Revisions tab". This is a stripped down version of
+ * _node_revision_access() to handle only 'view' operation and to allow it to
+ * show up when there's only one revision.
+ */
+function _ers_node_revision_access($node) {
+  $access = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($access[$node->vid])) {
+    if ((!user_access('view revisions') && !user_access('administer nodes'))) {
+      $access[$node->vid] = FALSE;
+      return FALSE;
+    }
+
+    $node_current_revision = node_load($node->nid);
+    $is_current_revision = $node_current_revision->vid == $node->vid;
+
+    if (user_access('administer nodes')) {
+      $access[$node->vid] = TRUE;
+    }
+    else {
+      // First check the access to the current revision and finally, if the
+      // node passed in is not the current revision then access to that, too.
+      $access[$node->vid] = node_access('view', $node_current_revision) && ($is_current_revision || node_access('view', $node));
+    }
+  }
+
+  return $access[$node->vid];
 }
