diff --git a/sites/all/modules/contrib/webform/includes/webform.pages.inc b/sites/all/modules/contrib/webform/includes/webform.pages.inc
index 782dfb9..728c551 100644
--- a/sites/all/modules/contrib/webform/includes/webform.pages.inc
+++ b/sites/all/modules/contrib/webform/includes/webform.pages.inc
@@ -337,7 +337,7 @@ function webform_configure_form($form, &$form_state, $node) {
     '#type' => 'checkbox',
     '#title' => t('Show "Save draft" button'),
     '#default_value' => $node->webform['allow_draft'],
-    '#description' => t('Allow your users to save and finish the form later. This option is available only for authenticated users.'),
+    '#description' => t('Allow your users to save and finish the form later. This option needs to use Cookie to save a draft for anonymous user.'),
   );
   $form['advanced']['auto_save'] = array(
     '#type' => 'checkbox',
diff --git a/sites/all/modules/contrib/webform/includes/webform.submissions.inc b/sites/all/modules/contrib/webform/includes/webform.submissions.inc
index e3a656e..3d76a9d 100644
--- a/sites/all/modules/contrib/webform/includes/webform.submissions.inc
+++ b/sites/all/modules/contrib/webform/includes/webform.submissions.inc
@@ -931,6 +931,40 @@ function webform_get_submission($nid, $sid) {
   return $submissions[$sid];
 }
 
+/**
+ * Fetch sid of a specified submission for a webform node by access token.
+ */
+function webform_get_sid_by_access_token($nid, $token, $uid = 0, $is_draft = NULL) {
+	$submissions = &drupal_static(__FUNCTION__, array());
+
+	// Load the submission if it is not in the static array.
+	if (!isset($submissions[$token])) {
+		// Get all submissions of the node which submitted by the user
+		$query = db_select('webform_submissions')
+		->fields('webform_submissions', array('sid', 'submitted'))
+		->condition('nid', $nid)
+		->condition('uid', $uid)
+		->orderBy('submitted', 'DESC');
+		
+		if ($is_draft !== NULL) {
+			$query->condition('is_draft', $is_draft);
+		}
+		$result = $query->execute();
+		
+        //Iterate all submissions to find the one which has the same access token
+		while ($submission = $result->fetchObject()) {
+			if (webform_get_submission_access_token($submission) === $token) {
+				$submissions[$token] = $submission->sid;
+				return $submission->sid;
+			}
+		}
+		//The submission doesn't exist
+		$submissions[$token] = FALSE;
+	}
+
+	return $submissions[$token];
+}
+
 function _webform_submission_spam_check($to, $subject, $from, $headers = array()) {
   $headers = implode('\n', (array)$headers);
   // Check if they are attempting to spam using a bcc or content type hack.
diff --git a/sites/all/modules/contrib/webform/webform.module b/sites/all/modules/contrib/webform/webform.module
index 56f4b17..bfab061 100644
--- a/sites/all/modules/contrib/webform/webform.module
+++ b/sites/all/modules/contrib/webform/webform.module
@@ -1964,7 +1964,7 @@ function webform_node_view($node, $view_mode) {
 
   // Check if this user has a draft for this webform.
   $resume_draft = FALSE;
-  if (($node->webform['allow_draft'] || $node->webform['auto_save']) && $user->uid != 0) {
+  if (($node->webform['allow_draft'] || $node->webform['auto_save'])) {
     // Draft found - display form with draft data for further editing.
     if ($draft_sid = _webform_fetch_draft_sid($node->nid, $user->uid)) {
       module_load_include('inc', 'webform', 'includes/webform.submissions');
@@ -2647,7 +2647,7 @@ function webform_client_form($form, &$form_state, $node, $submission = FALSE, $r
     );
 
     // Add the draft button.
-    if ($node->webform['allow_draft'] && (empty($submission) || $submission->is_draft) && $user->uid != 0) {
+    if ($node->webform['allow_draft'] && (empty($submission) || $submission->is_draft)) {
       $form['actions']['draft'] = array(
         '#type' => 'submit',
         '#value' => t('Save Draft'),
@@ -3306,11 +3306,20 @@ function webform_client_form_submit($form, &$form_state) {
     // Set a cookie including the server's submission time. The cookie expires
     // in the length of the interval plus a day to compensate for timezones.
     $tracking_mode = webform_variable_get('webform_tracking_mode');
-    if ($tracking_mode === 'cookie' || $tracking_mode === 'strict') {
-      $cookie_name = 'webform-' . $node->nid;
-      $time = REQUEST_TIME;
-      $params = session_get_cookie_params();
-      setcookie($cookie_name . '[' . $time . ']', $time, $time + $node->webform['submit_interval'] + 86400, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+    if (($tracking_mode === 'cookie' || $tracking_mode === 'strict')) {
+      //Record the submission time for a non-draft submission in a cookie
+      if (!$is_draft) {
+        $cookie_name = 'webform-' . $node->nid;
+        $time = REQUEST_TIME;
+        $params = session_get_cookie_params();
+        setcookie($cookie_name . '[' . $time . ']', $time, $time + $node->webform['submit_interval'] + 86400, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+      }
+      else {
+        //Record the access token of this draft for an anonymous in a cookie
+        $cookie_name = 'webform-anony-draft' . $node->nid;
+        $params = session_get_cookie_params();
+        setcookie($cookie_name, webform_get_submission_access_token($submission), REQUEST_TIME + $node->webform['submit_interval'] + 86400, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+      }
     }
 
     // Save session information about this submission for anonymous users,
@@ -3320,6 +3329,27 @@ function webform_client_form_submit($form, &$form_state) {
     }
   }
   else {
+    if (!$is_draft) {
+      //Set a cookie stored the submitting time for a submission which previously was a draft.
+      if ($submission->original->is_draft == 1) {
+        $tracking_mode = webform_variable_get('webform_tracking_mode');
+        //Only set the cookie if the tracking mode is cookie or strict
+        if (($tracking_mode === 'cookie' || $tracking_mode === 'strict')) {
+          $cookie_name = 'webform-' . $node->nid;
+          $time = REQUEST_TIME;
+          $params = session_get_cookie_params();
+          //Record the submitting time in the cookie
+          setcookie($cookie_name . '[' . $time . ']', $time, $time + $node->webform['submit_interval'] + 86400, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+          
+          //Empty the draft access token cookie, since it is no longer a draft now.
+          $cookie_name = 'webform-anony-draft' . $node->nid;
+          $params = session_get_cookie_params();
+          setcookie($cookie_name, '', 0, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+          $_COOKIE[$cookie_name] = '';
+        }
+      }
+      
+    }
     // Sid was found thus update the existing sid in the database.
     webform_submission_update($node, $submission);
     $form_state['values']['details']['is_new'] = FALSE;
@@ -3838,6 +3868,20 @@ function theme_webform_mail_headers($variables) {
  * Check if current user has a draft of this webform, and return the sid.
  */
 function _webform_fetch_draft_sid($nid, $uid) {
+  //For an anonymous user, only check if there is a access token of a draft stored in a cookie
+  if ($uid === 0) {
+    //Check if the tracking mode is cookie or strict
+    $tracking_mode = webform_variable_get('webform_tracking_mode');
+    if ($tracking_mode === 'cookie' || $tracking_mode === 'strict') {
+      $cookie_name = 'webform-anony-draft' . $nid; 
+      if (!empty($_COOKIE[$cookie_name])) {    	
+      	return webform_get_sid_by_access_token($nid, $_COOKIE[$cookie_name], $uid, 1);
+      }
+    }
+    //Can not find the access token stored in a cookie for anonymous
+    return FALSE;
+  }
+  
   // Detect whether a webform draft is being edited. If so, that is the one that
   // should be returned.
   if (isset($_POST['form_id']) && stripos($_POST['form_id'], 'webform_client_form_') === 0 &&
