diff --git a/save_draft.module b/save_draft.module
index 6e0123a..a91de44 100644
--- a/save_draft.module
+++ b/save_draft.module
@@ -77,6 +77,10 @@ function save_draft_form_node_form_alter(&$form, &$form_state) {
       $form['actions']['submit']['#value'] = t('Save');
       $form['actions']['draft']['#value'] = t('Unpublish');
     }
+
+    // Add an after build callback so we can modify the form before validation
+    // in the case that the save draft button is pressed.
+    $form['#after_build'][] = 'save_draft_form_after_build';
   }
 }
 
@@ -132,3 +136,54 @@ function save_draft_access($form, &$form_state) {
 
   return $access;
 }
+
+/**
+ * After build callback for the save draft module.
+ *
+ * This is used to modify the form after it has been submitted, but before it
+ * has been validated.
+ * This means we can remove required flags if someone has pressed the save draft
+ * button.
+ *
+ * @param array $element
+ *   An associative array containing the structure of a form element.
+ *   In this case the form.
+ * @param array $form_state
+ *   The form state array.
+ *
+ * @return array
+ *   An associative array containing the structure of a form element.
+ */
+function save_draft_form_after_build($element, &$form_state) {
+  // Check that the form has been submitted.
+  if ($form_state['process_input']) {
+    // If the save draft button was pressed.
+    if ($form_state['triggering_element']['#value'] == $element['actions']['draft']['#value']) {
+      _save_draft_remove_required($element);
+    }
+  }
+  return $element;
+}
+
+/**
+ * Make all elements of a form not required.
+ *
+ * This is used only when saving drafts, so that users can save an unfinished
+ * form that is missing required values.
+ *
+ * Nodes must have a title to be saved, so node title is excluded from this.
+ *
+ * @param array $elements
+ *   An associative array containing the structure of a form.
+ */
+function _save_draft_remove_required(&$elements) {
+  // Recurse through all children.
+  foreach (element_children($elements) as $key) {
+    if (isset($elements[$key]) && $elements[$key]) {
+      _save_draft_remove_required($elements[$key]);
+    }
+  }
+  if (!empty($elements['#required'])) {
+    $elements['#required'] = FALSE;
+  }
+}
