diff --git a/save_draft.module b/save_draft.module
index 9ccdfc8..21d82c6 100644
--- a/save_draft.module
+++ b/save_draft.module
@@ -183,6 +183,8 @@ function save_draft_form_node_type_form_alter(&$form, &$form_state) {
  * published state for the node being edited.
  */
 function save_draft_access($form, &$form_state) {
+  global $user;
+
   // Determine if the user has access to publish / unpublish this node via the
   // status checkbox.
   $element = $form;
@@ -200,19 +202,22 @@ function save_draft_access($form, &$form_state) {
   }
 
   // If not, but the user has the 'save draft' permission, determine if the user
-  // has access to view and edit this node if it were unpublished. Don't allow a
-  // user to save a draft that they won't be able to get back to.
+  // should be able to save as both draft and published in this situation.
   if (!$access && user_access('save draft')) {
-    $node = clone($form_state['node']);
-    $node->status = FALSE;
+    $node = $form_state['node'];
+    $node_options = variable_get('node_options_' . $node->type, array('status', 'promote'));
 
-    // This might be a new node, and node_access() throws PHP warnings if nid
-    // isn't defined.
-    if (!isset($node->nid)) {
-      $node->nid = NULL;
+    // If this node type is published by default...
+    if (in_array('status', $node_options)) {
+      // ... and it's new, or it's unpublished and the current user is the owner ...
+      if (empty($node->nid) || (empty($node->status) && $node->uid == $user->uid)) {
+        // ... then allow using both the 'Publish' and 'Save as draft' buttons.
+        $access = TRUE;
+      }
     }
 
-    $access = node_access('update', $node) && node_access('view', $node);
+    // In all other situations, we deny access which means they only get the
+    // 'Save' button which does the appropriate thing.
   }
 
   return $access;
diff --git a/save_draft.test b/save_draft.test
index 3bc2f8e..4303161 100755
--- a/save_draft.test
+++ b/save_draft.test
@@ -45,6 +45,12 @@ class SaveDraftTestCase extends DrupalWebTestCase {
       'bypass node access',
     ));
     $this->save_draft_user = $this->drupalCreateUser(array(
+      'administer nodes',
+      'create article content',
+      'edit any article content',
+      'save draft',
+    ));
+    $this->limited_save_draft_user = $this->drupalCreateUser(array(
       'create article content',
       'edit any article content',
       'view own unpublished content',
@@ -138,6 +144,72 @@ class SaveDraftTestCase extends DrupalWebTestCase {
     $this->assertNoRaw('<input type="submit" id="edit-draft" name="op" value="' . $this->button_unpublish . '" class="form-submit" />', t('Save draft disabled successfully on published node edit.'));
   }
 
+  /**
+   * Make sure nodes save with right publication status for limited users
+   * that can't access the status field.
+   */
+  public function testLimitedNodeSave() {
+    // Log in as a user who should see the save draft button.
+    $this->drupalLogin($this->limited_save_draft_user);
+
+    // Testing with drafts enabled and published by default.
+    variable_set('save_draft_enabled_article', SAVE_DRAFT_ENABLED);
+    variable_set('node_options_article', array('status'));
+
+    // Make sure the publish and save as draft buttons are present when adding a
+    // node.
+    $this->drupalGet('node/add/article');
+    $this->assertRaw('<input type="submit" id="edit-submit" name="op" value="' . $this->button_publish . '" class="form-submit" />', t('Publish button visible on node create.'));
+    $this->assertRaw('<input type="submit" id="edit-draft" name="op" value="' . $this->button_save_draft . '" class="form-submit" />', t('Save as draft button visible on node create.'));
+    // Publish a node, and make sure it's published.
+    $edit = $this->getNodeArray();
+    $this->drupalPost('node/add/article', $edit, $this->button_publish);
+    $node = $this->drupalGetNodeByTitle($edit[$this->title_key]);
+    $this->assertEqual($node->status, NODE_PUBLISHED, t('Node saved correctly.'));
+
+    // Make sure it's just a save button on an already published node.
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertRaw('<input type="submit" id="edit-submit" name="op" value="' . $this->button_save . '" class="form-submit" />', t('Save button visible on published node edit.'));
+    $this->assertNoRaw('<input type="submit" id="edit-draft" name="op" value="' . $this->button_unpublish . '" class="form-submit" />', t('Unpublish button not visible on published node edit.'));
+    // Save it, and make sure it's still published.
+    $this->drupalPost('node/' . $node->nid . '/edit', array(), $this->button_save);
+    $node = node_load($node->nid, NULL, TRUE);
+    $this->assertEqual($node->status, NODE_PUBLISHED, t('Node still correctly published.'));
+
+    // Save a new node as a draft, and make sure it's unpublished.
+    $edit = $this->getNodeArray();
+    $this->drupalPost('node/add/article', $edit, $this->button_save_draft);
+    $node = $this->drupalGetNodeByTitle($edit[$this->title_key]);
+    $this->assertEqual($node->status, NODE_NOT_PUBLISHED, t('Node saved correctly as draft.'));
+
+    // Make sure the publish and save draft buttons are present when on an
+    // unpublished draft.
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertRaw('<input type="submit" id="edit-submit" name="op" value="' . $this->button_publish . '" class="form-submit" />', t('Publish button visible on draft node edit.'));
+    $this->assertRaw('<input type="submit" id="edit-draft" name="op" value="' . $this->button_save_draft . '" class="form-submit" />', t('Save draft button visible on draft node edit.'));
+    // Publish the node, and make sure it's published.
+    $this->drupalPost('node/' . $node->nid . '/edit', array(), $this->button_publish);
+    $node = node_load($node->nid, NULL, TRUE);
+    $this->assertEqual($node->status, NODE_PUBLISHED, t('Node published correctly.'));
+
+    // Testing with unpublished by default.
+    variable_set('node_options_article', array());
+
+    // Make sure the only the save button is not present when adding a node and
+    // that is unpublished by default.
+    $this->drupalGet('node/add/article');
+    $this->assertRaw('<input type="submit" id="edit-submit" name="op" value="' . $this->button_save . '" class="form-submit" />', t('Save button visible on node create.'));
+    $this->assertNoRaw('<input type="submit" id="edit-draft" name="op" value="' . $this->button_save_draft . '" class="form-submit" />', t('Save draft button not visible on node create.'));
+    // Publish a node and edit it again.
+    $edit = $this->getNodeArray();
+    $this->drupalPost('node/add/article', $edit, $this->button_save);
+    $node = $this->drupalGetNodeByTitle($edit[$this->title_key]);
+    $this->assertEqual($node->status, NODE_NOT_PUBLISHED, t('Node saved correctly as draft.'));
+
+    // Reset the node options.
+    variable_del('node_options_article');
+  }
+
   /**
    * Make sure node validation still runs even after we've altered the form.
    */
