diff --git a/README.txt b/README.txt
index 968147f..72ba7da 100644
--- a/README.txt
+++ b/README.txt
@@ -14,4 +14,14 @@ Install
    (/admin/build/modules).
 
 3) Now when you create a new node, a 'Save as Draft' button will be
-   added to the form.
\ No newline at end of file
+   added to the form.
+
+
+Developers
+----------
+If your module adds a button to the node form module and are using the
+"Skip required validation" option you can allow your button to also skip
+required validation by adding the #skip_required_validation property to your
+button. For example, if you are adding a button 'my_button' to the form actions
+you would add this property also:
+$form['actions']['my_button']['#skip_required_validation'] = TRUE;
diff --git a/save_draft.module b/save_draft.module
old mode 100644
new mode 100755
index e2675e0..57c4c9c
--- a/save_draft.module
+++ b/save_draft.module
@@ -87,6 +87,20 @@ function save_draft_form_node_form_alter(&$form, &$form_state) {
       $form['actions']['submit']['#value'] = t('Save');
       $form['actions']['draft']['#value'] = t('Unpublish');
     }
+
+    if (variable_get('save_draft_skip_required_' . $form['#node']->type, FALSE)) {
+      // Add a flag to buttons that can skip required validation.
+      $form['actions']['draft']['#skip_required_validation'] = TRUE;
+      if (isset($form['actions']['preview'])) {
+        $form['actions']['preview']['#skip_required_validation'] = TRUE;
+      }
+      if (isset($form['actions']['delete'])) {
+        $form['actions']['delete']['#skip_required_validation'] = TRUE;
+      }
+      // Add an after build callback so we can modify the form before validation
+      // in the case that a button is clicked that can skip validation.
+      $form['#after_build'][] = 'save_draft_form_after_build';
+    }
   }
 }
 
@@ -130,6 +144,13 @@ function save_draft_form_node_type_form_alter(&$form, &$form_state) {
     '#description' => t('Enable save as draft functionality for this content type.'),
     '#default_value' => $enabled,
   );
+
+  $form['save_draft']['save_draft_skip_required'] = array(
+    '#title' => t('Skip required validation'),
+    '#type' => 'checkbox',
+    '#description' => t('Allow users to save a draft without having entered a value for required fields. If unchecked, all required fields must be filled before a draft can be saved.'),
+    '#default_value' => variable_get('save_draft_skip_required_' . $form['#node_type']->type, FALSE),
+  );
 }
 
 /**
@@ -177,3 +198,52 @@ function save_draft_access($form, &$form_state) {
 function save_draft_node_type_delete($info) {
   variable_del('save_draft_enabled_' . $info->type);
 }
+
+/**
+ * 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 (!empty($form_state['triggering_element']['#skip_required_validation'])) {
+      _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.
+ *
+ * @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;
+  }
+}
