Index: image_captcha/image_captcha.admin.inc
===================================================================
--- image_captcha/image_captcha.admin.inc	(revision 57322)
+++ image_captcha/image_captcha.admin.inc	(working copy)
@@ -59,6 +59,11 @@
     '#default_value' => (int) variable_get('image_captcha_code_length', 5),
     '#description' => t('The code length influences the size of the image. Note that larger values make the image generation more CPU intensive.'),
   );
+  $form['image_captcha_code_settings']['image_captcha_image_reload_button'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Add a "reload CAPTCHA" link'),
+    '#default_value' => variable_get('image_captcha_image_reload_button', FALSE),
+  );
 
   // Font related stuff.
   $form['image_captcha_font_settings'] = _image_captcha_settings_form_font_section();
Index: image_captcha/image_captcha.js
===================================================================
--- image_captcha/image_captcha.js	(revision 57326)
+++ image_captcha/image_captcha.js	(working copy)
@@ -33,4 +33,11 @@
 	// Show or hide appropriately on page load.
 	smooth_distortion_shower(0)
 
+  $("#image-captcha-reload").click(function() {
+    var src = $("#image-captcha").attr("src");
+    var fragments = src.split("/");
+    fragments[fragments.length - 1] = (new Date).getTime();
+    $("#image-captcha").attr("src", fragments.join("/") + "&r=1");
+    return false;
+  });
 });
Index: image_captcha/image_captcha.module
===================================================================
--- image_captcha/image_captcha.module	(revision 57326)
+++ image_captcha/image_captcha.module	(working copy)
@@ -203,12 +203,7 @@
           return captcha_captcha('generate', 'Math');
         }
         // generate a CAPTCHA code
-        $allowed_chars = _image_captcha_utf8_split(variable_get('image_captcha_image_allowed_chars', IMAGE_CAPTCHA_ALLOWED_CHARACTERS));
-        $code_length = (int)variable_get('image_captcha_code_length', 5);
-        $code = '';
-        for ($i = 0; $i < $code_length; $i++) {
-          $code .= $allowed_chars[array_rand($allowed_chars)];
-        }
+        $code = _image_captcha_generate_code();
 
         // build the result to return
         $result = array();
@@ -220,9 +215,19 @@
         $img_src = check_url(url("image_captcha/$captcha_sid/". time()));
         $result['form']['captcha_image'] = array(
           '#type' => 'markup',
-          '#value' => '<img src="'. $img_src .'" alt="'. t('Image CAPTCHA') .'" title="'. t('Image CAPTCHA') .'" />',
-          '#weight' => -2,
+          '#value' => '<img id="image-captcha" src="'. $img_src .'" alt="'. t('Image CAPTCHA') .'" title="'. t('Image CAPTCHA') .'" />',
+        '#weight' => -2,
         );
+
+        if (variable_get('image_captcha_image_reload_button', FALSE)) {
+          drupal_add_js(drupal_get_path('module', 'image_captcha') . '/image_captcha.js');
+          $result['form']['captcha_image_reload'] = array(
+            '#type' => 'markup',
+            '#value' => '<div class="description">' . t("Can't see text on image? You can <a id='image-captcha-reload' href=''>!reload</a>", array('!reload' => 'reload it')) . '</div>',
+            '#weight' => -1,
+          );
+        }
+
         $result['form']['captcha_response'] = array(
           '#type' => 'textfield',
           '#title' => t('What code is in the image?'),
@@ -249,3 +254,18 @@
 
   }
 }
+
+/**
+ * Move new code generation function for reusability.
+ *
+ * @return image captcha code string
+ */
+function _image_captcha_generate_code() {
+  $allowed_chars = _image_captcha_utf8_split(variable_get('image_captcha_image_allowed_chars', IMAGE_CAPTCHA_ALLOWED_CHARACTERS));
+  $code_length = (int)variable_get('image_captcha_code_length', 5);
+  $code = '';
+  for ($i = 0; $i < $code_length; $i++) {
+    $code .= $allowed_chars[array_rand($allowed_chars)];
+  }
+  return $code;
+}
Index: image_captcha/image_captcha.user.inc
===================================================================
--- image_captcha/image_captcha.user.inc	(revision 57322)
+++ image_captcha/image_captcha.user.inc	(working copy)
@@ -17,8 +17,15 @@
     exit();
   }
 
-  // Get solution (the code to show).
-  $code = db_result(db_query("SELECT solution FROM {captcha_sessions} WHERE csid = %d", (int)($captcha_sid)));
+  if ($_GET['r']) {
+    // Generate a new code, user clicked the "reload image" button.
+    $code = _image_captcha_generate_code();
+    db_query('UPDATE {captcha_sessions} SET solution = "%s" WHERE csid = %d', $code, (int)($captcha_sid));
+  }
+  else {
+    // Get solution (the code to show).
+    $code = db_result(db_query("SELECT solution FROM {captcha_sessions} WHERE csid = %d", (int)($captcha_sid)));
+  }
 
   // Only generate captcha if code exists in the session.
   if ($code !== FALSE) {
