diff --git a/ers.module b/ers.module
index bfbc081..4df8cbc 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 87ed2eb..6924662 100644
--- a/plugins/entity/ERSEntityDefault.class.php
+++ b/plugins/entity/ERSEntityDefault.class.php
@@ -103,6 +103,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) {
@@ -369,6 +374,21 @@ class ERSEntityDefault implements ERSEntityInterface {
         ))
         ->execute();
     }
+
+    // Do we have to schedule publishing this revision?
+    if (!empty($entity->ers_new_schedule)) {
+      $this->update_entity_schedule($entity, $entity->ers_new_schedule, $revision_id);
+    }
+
+    // Store state information.
+    $this->update_entity_state($entity);
+
+    // When publishing a revision immediately after inserting the entity
+    // set_published_revision_current() doesn't get called, so we need to call
+    // it here to make sure entity types do what they need to do in this method.
+    if (!empty($entity->published_revision_id)) {
+      $this->set_published_revision_current($entity_id, $entity);
+    }
   }
 
   public function hook_entity_update($entity) {
diff --git a/plugins/entity/ERSEntityNode.class.php b/plugins/entity/ERSEntityNode.class.php
index 048fb36..362046b 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,8 +24,8 @@ 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 arguments' => array(1),
+      'access callback' => 'ers_entity_plugin_access_switcher',
+      'access arguments' => array('node', 'revisions', 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($entity->published_revision_id);
+
     node_save($published_revision);
     if ($uid != $GLOBALS['user']->uid) {
       db_update('node_revision')
@@ -70,23 +77,36 @@ 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;
-      }
-      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.');
+      // Set "published" checkbox to value, so it get hidden. And set it's
+      // value to FALSE as default.
+      $form['options']['status']['#type'] = 'value';
+      $form['options']['status']['#value'] = FALSE;
+
+      if (!empty($node->nid)) {
+        // 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['ers'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Scheduling'),
+        '#access' => ((user_access("publish node $node->type content") || user_access('administer nodes'))),
+        '#collapsible' => TRUE,
+        '#collapsed' => FALSE,
+        '#group' => 'additional_settings',
+      );
+      $form['ers'] += ers_entity_schedule_form('node', $node);
       $form['#submit'][] = 'ers_node_form_submit';
     }
   }
@@ -182,6 +202,41 @@ class ERSEntityNode extends ERSEntityDefault {
   }
 
   /**
+   * Determine if the current user has access to publish the entity.
+   *
+   * This is called indirectly via ers_entity_plugin_access_switcher which
+   * is a menu access callback.
+   *
+   * 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.
+   */
+  public function access_revisions($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];
+  }
+
+  /**
    * Implements a delegated hook_panels_pane_content_alter()
    *
    * This exists primarily to add some extra contextual items to give more
@@ -401,5 +456,5 @@ 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']);
+  ers_entity_schedule_form_submit($form['ers'], $form_state, 'node', $form_state['node']);
 }
