diff --git a/checklistapi.css b/checklistapi.css
index b7cc6ea..96a991c 100644
--- a/checklistapi.css
+++ b/checklistapi.css
@@ -23,3 +23,16 @@
 #checklistapi-checklist-form .progress .filled {
   background-image: none;
 }
+
+/**
+ * Optional tasks
+ */
+div.form-checkboxes.checklistapi-item-optional div:first-child span.checklistapi-title-ignored {
+  text-decoration: line-through;
+}
+div.form-checkboxes.checklistapi-item-optional div:first-child+div {
+  padding-left: 1em;
+}
+div.form-checkboxes.checklistapi-item-optional div:first-child+div label {
+  opacity: 0.66;
+}
diff --git a/checklistapi.pages.inc b/checklistapi.pages.inc
index 3a99cf8..558fd64 100644
--- a/checklistapi.pages.inc
+++ b/checklistapi.pages.inc
@@ -100,7 +100,7 @@ function checklistapi_checklist_form($form, &$form_state, $id, $field_data = arr
       $saved_item = !empty($checklist->savedProgress[$item_key]) ? $checklist->savedProgress[$item_key] : 0;
       // Build title.
       $title = filter_xss($item['#title']);
-      if ($saved_item) {
+      if (isset($saved_item['#completed'])) {
         // Append completion details.
         $user = user_load($saved_item['#uid']);
         $title .= t(
@@ -142,6 +142,38 @@ function checklistapi_checklist_form($form, &$form_state, $id, $field_data = arr
         '#title' => filter_xss_admin($title),
         '#type' => 'checkbox',
       );
+      // Add an optional N/A checkbox
+      if (isset($item['#optional']) && $item['#optional']) {
+        // Only add N/A checkbox if the item is not marked complete.
+        if (!isset($saved_item['#completed'])) {
+          $ignored_key = $item_key . '_ignored';
+          $ignored = isset($saved_item[$ignored_key]['#ignored']) ? $saved_item[$ignored_key] : FALSE;
+          $default_value = array ($item_key => FALSE);
+          $default_value[$ignored_key] = $ignored ? $ignored_key : FALSE;
+          $optional_text = $item['#optional'] === TRUE ? t('n/a') : filter_xss_admin($item['#optional']);
+          if ($ignored) {
+            // Append ignore details.
+            $user = user_load($ignored['#uid']);
+            $title = '<span class="checklistapi-title-ignored">' . $title . '</span>';
+            $title .= t(
+              '<span class="completion-details"> - Ignored @time by !user</a>',
+              array(
+                '@time' => format_date($ignored['#ignored'], 'short'),
+                '!user' => theme('username', array('account' => $user)),
+              )
+            );
+          }
+          unset($form['checklistapi'][$group_key][$item_key]['#title']);
+          $form['checklistapi'][$group_key][$item_key]['#tree'] = TRUE;
+          $form['checklistapi'][$group_key][$item_key]['#type'] = 'checkboxes';
+          $form['checklistapi'][$group_key][$item_key]['#default_value'] = $default_value;
+          $form['checklistapi'][$group_key][$item_key]['#attributes'] = array('class' => array('checklistapi-item-optional'));
+          $form['checklistapi'][$group_key][$item_key]['#options'] = array(
+            $item_key => (!$ignored ? t('(Optional) ') : '') . filter_xss_admin($title),
+            $item_key . '_ignored' => filter_xss_admin($optional_text),
+          );
+        }
+      }
     }
   }
 
diff --git a/checklistapi_example/checklistapi_example.module b/checklistapi_example/checklistapi_example.module
index ca3a964..f1f1b9b 100644
--- a/checklistapi_example/checklistapi_example.module
+++ b/checklistapi_example/checklistapi_example.module
@@ -24,6 +24,7 @@ function checklistapi_example_checklistapi_checklist_info() {
       '#description' => t('<p>Gain these skills to pass the <em><a href="http://headrush.typepad.com/creating_passionate_users/2005/10/getting_users_p.html">suck threshold</a></em> and start being creative with Drupal.</p>'),
       'install_configure' => array(
         '#title' => t('Installation and configuration of Drupal core'),
+        '#optional' => t('Some text for optional steps'),
         'handbook_page' => array(
           '#text' => t('Installation Guide'),
           '#path' => 'http://drupal.org/documentation/install',
diff --git a/lib/Drupal/checklistapi/ChecklistapiChecklist.php b/lib/Drupal/checklistapi/ChecklistapiChecklist.php
index 7a732e4..19f4c62 100644
--- a/lib/Drupal/checklistapi/ChecklistapiChecklist.php
+++ b/lib/Drupal/checklistapi/ChecklistapiChecklist.php
@@ -253,7 +253,8 @@ class ChecklistapiChecklist {
           continue;
         }
         $old_item = (!empty($this->savedProgress[$item_key])) ? $this->savedProgress[$item_key] : 0;
-        if ($item == 1) {
+        $ignored_key = $item_key . '_ignored';
+        if ($item === 1) {
           // Item is checked.
           $progress['#completed_items']++;
           if ($old_item) {
@@ -269,6 +270,38 @@ class ChecklistapiChecklist {
             $num_changed_items++;
           }
         }
+        elseif (is_array($item) && array_key_exists($ignored_key, $item)) {
+          // Handle optional items, whose '#type' will be 'checkboxes'.
+          if ($item[$item_key] === $item_key) {
+            // Item is newly checked, otherwise we wouldn't be in this loop.
+            $progress['#completed_items']++;
+            $new_item = array(
+              '#completed' => $time,
+              '#uid' => $user->uid,
+            );
+             $num_changed_items++;
+          }
+          elseif (isset($item[$ignored_key]) && $item[$ignored_key]) {
+            // Item was ignored.
+            $old_item = (!empty($this->savedProgress[$item_key][$ignored_key])) ? $this->savedProgress[$item_key][$ignored_key] : 0;
+            if ($old_item[$ignored_key]) {
+              // Item was previously ignored. Use saved value.
+              $new_item = $old_item;
+            }
+            else {
+              // Item is newly ignored. Set new value.
+              $new_item = array(
+                $ignored_key => array(
+                  '#ignored' => $time,
+                  '#uid' => $user->uid,
+                ),
+              );
+              $num_changed_items++;
+            }
+            // todo: Reduce the total items count by 1, etc.
+
+          }
+        }
         else {
           // Item is unchecked.
           $new_item = 0;
