diff --git a/components/date.inc b/components/date.inc
index bc9dc4735..264a5f325 100644
--- a/components/date.inc
+++ b/components/date.inc
@@ -28,6 +28,7 @@ function _webform_defaults_date() {
       'description_above' => FALSE,
       'private' => FALSE,
       'analysis' => FALSE,
+      'required_error' => '',
     ),
   );
 }
@@ -468,7 +469,13 @@ function webform_validate_date($element, $form_state) {
     }
   }
   elseif ($element['#required']) {
-    form_error($element, t('!name field is required.', array('!name' => $element['#title'])));
+    $component = $element['#webform_component'];
+    if (isset($component['extra']['required_error']) && drupal_strlen($component['extra']['required_error'])) {
+      form_error($element, $component['extra']['required_error']);
+    }
+    else {
+      form_error($element, t('!name field is required.', array('!name' => $element['#title'])));
+    }
   }
 }
 
diff --git a/components/email.inc b/components/email.inc
index 6430843da..f19d449ee 100644
--- a/components/email.inc
+++ b/components/email.inc
@@ -21,6 +21,7 @@ function _webform_defaults_email() {
       'format' => 'short',
       'width' => '',
       'unique' => 0,
+      'unique_error' => '',
       'disabled' => 0,
       'title_display' => 0,
       'description' => '',
@@ -29,6 +30,7 @@ function _webform_defaults_email() {
       'attributes' => array(),
       'private' => FALSE,
       'analysis' => FALSE,
+      'required_error' => '',
     ),
   );
 }
@@ -126,6 +128,18 @@ function _webform_edit_email($component) {
     '#default_value' => $component['extra']['unique'],
     '#parents' => array('extra', 'unique'),
   );
+  $form['validation']['unique_error'] = array(
+    '#type' => 'textfield',
+    '#title' => t("Error message if the value isn't unique"),
+    '#default_value' => $component['extra']['unique_error'],
+    '#description' => t("Error message if the value isn't unique, you can use the placeholders %value and %title. Leaving blank will use the default message."),
+    '#weight' => 2,
+    '#size' => 60,
+    '#parents' => array('extra', 'unique_error'),
+    '#states' => array(
+      'visible' => array(':input[name="extra[unique]"]' => array('checked' => TRUE)),
+    ),
+  );
   return $form;
 }
 
@@ -213,6 +227,11 @@ function _webform_render_email($component, $value = NULL, $filter = TRUE, $submi
     $element['#size'] = $component['extra']['width'];
   }
 
+  // If needed set custom validation error for required element.
+  if ($component['required'] && isset($component['extra']['required_error']) && drupal_strlen($component['extra']['required_error'])) {
+    $element['#required_error'] = $component['extra']['required_error'];
+  }
+
   return $element;
 }
 
diff --git a/components/file.inc b/components/file.inc
index b8233e507..578553986 100644
--- a/components/file.inc
+++ b/components/file.inc
@@ -36,6 +36,7 @@ function _webform_defaults_file() {
       'attributes' => array(),
       'private' => FALSE,
       'analysis' => FALSE,
+      'required_error' => '',
     ),
   );
 }
@@ -367,6 +368,11 @@ function _webform_render_file($component, $value = NULL, $filter = TRUE, $submis
     $element['#description'] = theme('file_upload_help', array('description' => $element['#description'], 'upload_validators' => $element['#upload_validators']));
   }
 
+  // If needed set custom validation error for required element.
+  if ($component['required'] && isset($component['extra']['required_error']) && drupal_strlen($component['extra']['required_error'])) {
+    $element['#required_error'] = $component['extra']['required_error'];
+  }
+
   return $element;
 }
 
diff --git a/components/grid.inc b/components/grid.inc
index eb8061133..e9aef592b 100644
--- a/components/grid.inc
+++ b/components/grid.inc
@@ -25,6 +25,7 @@ function _webform_defaults_grid() {
       'optrand' => 0,
       'qrand' => 0,
       'unique' => 0,
+      'unique_error' => '',
       'title_display' => 0,
       'custom_option_keys' => 0,
       'custom_question_keys' => 0,
@@ -33,6 +34,7 @@ function _webform_defaults_grid() {
       'description_above' => FALSE,
       'private' => FALSE,
       'analysis' => TRUE,
+      'required_error' => '',
     ),
   );
 }
@@ -191,6 +193,18 @@ function _webform_edit_grid($component) {
     '#default_value' => $component['extra']['unique'],
     '#parents' => array('extra', 'unique'),
   );
+  $form['validation']['unique_error'] = array(
+    '#type' => 'textfield',
+    '#title' => t("Error message if the value isn't unique"),
+    '#default_value' => $component['extra']['unique_error'],
+    '#description' => t("Error message if the value has the same answer for more than one question, you can use the placeholder %title. Leaving blank will use the default message."),
+    '#weight' => 2,
+    '#size' => 60,
+    '#parents' => array('extra', 'unique_error'),
+    '#states' => array(
+      'visible' => array(':input[name="extra[unique]"]' => array('checked' => TRUE)),
+    ),
+  );
 
   return $form;
 }
@@ -234,6 +248,11 @@ function _webform_render_grid($component, $value = NULL, $filter = TRUE, $submis
     $element['#element_validate'][] = '_webform_edit_grid_unique_validate';
   }
 
+  // If needed set custom validation error for required element.
+  if ($component['required'] && isset($component['extra']['required_error']) && drupal_strlen($component['extra']['required_error'])) {
+    $element['#required_error'] = $component['extra']['required_error'];
+  }
+
   return $element;
 }
 
@@ -667,7 +686,12 @@ function _webform_edit_grid_unique_validate($element) {
     // Fewer unique values than values means that at least one value is duplicated.
     // Fewer unique values than possible values means that there is a possible choice
     // that wasn't used.
-    form_error($element, t('!title is not allowed to have the same answer for more than one question.', array('!title' => $element['#title'])));
+    if (isset($element['#webform_component']['extra']['unique_error']) && !empty($element['#webform_component']['extra']['unique_error'])) {
+      form_error($element, t($element['#webform_component']['extra']['unique_error'], array('%title' => $element['#title'])));
+    }
+    else {
+       form_error($element, t('!title is not allowed to have the same answer for more than one question.', array('!title' => $element['#title'])));
+    }
   }
 }
 
diff --git a/components/number.inc b/components/number.inc
index 8c24b3562..20b03d475 100644
--- a/components/number.inc
+++ b/components/number.inc
@@ -22,6 +22,7 @@ function _webform_defaults_number() {
       'field_suffix' => '',
       'disabled' => 0,
       'unique' => 0,
+      'unique_error' => '',
       'title_display' => 0,
       'description' => '',
       'description_above' => FALSE,
@@ -175,6 +176,18 @@ function _webform_edit_number($component) {
     '#default_value' => $component['extra']['unique'],
     '#parents' => array('extra', 'unique'),
   );
+  $form['validation']['unique_error'] = array(
+    '#type' => 'textfield',
+    '#title' => t("Error message if the value isn't unique"),
+    '#default_value' => $component['extra']['unique_error'],
+    '#description' => t("Error message if the value isn't unique, you can use the placeholders %value and %title. Leaving blank will use the default message."),
+    '#weight' => 2,
+    '#size' => 60,
+    '#parents' => array('extra', 'unique_error'),
+    '#states' => array(
+      'visible' => array(':input[name="extra[unique]"]' => array('checked' => TRUE)),
+    ),
+  );
   $form['validation']['integer'] = array(
     '#type' => 'checkbox',
     '#title' => t('Integer'),
diff --git a/components/select.inc b/components/select.inc
index 2b1b7fff9..ac2fd7a65 100644
--- a/components/select.inc
+++ b/components/select.inc
@@ -31,6 +31,7 @@ function _webform_defaults_select() {
       'options_source' => '',
       'private' => FALSE,
       'analysis' => TRUE,
+      'required_error' => '',
     ),
   );
 }
@@ -447,6 +448,11 @@ function _webform_render_select($component, $value = NULL, $filter = TRUE, $subm
     }
   }
 
+// If needed set custom validation error for required element.
+  if ($component['required'] && isset($component['extra']['required_error']) && drupal_strlen($component['extra']['required_error'])) {
+    $element['#required_error'] = $component['extra']['required_error'];
+  }
+
   return $element;
 }
 
diff --git a/components/textarea.inc b/components/textarea.inc
index 7a173d41f..5caa5ef13 100644
--- a/components/textarea.inc
+++ b/components/textarea.inc
@@ -28,6 +28,7 @@ function _webform_defaults_textarea() {
       'attributes' => array(),
       'private' => FALSE,
       'analysis' => FALSE,
+      'required_error' => '',
     ),
   );
 }
@@ -147,6 +148,11 @@ function _webform_render_textarea($component, $value = NULL, $filter = TRUE, $su
     $element['#default_value'] = $value[0];
   }
 
+  // If needed set custom validation error for required element.
+  if ($component['required'] && isset($component['extra']['required_error']) && drupal_strlen($component['extra']['required_error'])) {
+    $element['#required_error'] = $component['extra']['required_error'];
+  }
+
   return $element;
 }
 
diff --git a/components/textfield.inc b/components/textfield.inc
index d7bb1a3d8..0e4591ad9 100644
--- a/components/textfield.inc
+++ b/components/textfield.inc
@@ -24,6 +24,7 @@ function _webform_defaults_textfield() {
       'field_suffix' => '',
       'disabled' => 0,
       'unique' => 0,
+      'unique_error' => '',
       'title_display' => 0,
       'description' => '',
       'description_above' => FALSE,
@@ -31,6 +32,7 @@ function _webform_defaults_textfield() {
       'attributes' => array(),
       'private' => FALSE,
       'analysis' => FALSE,
+      'required_error' => '',
     ),
   );
 }
@@ -117,6 +119,18 @@ function _webform_edit_textfield($component) {
     '#default_value' => $component['extra']['unique'],
     '#parents' => array('extra', 'unique'),
   );
+  $form['validation']['unique_error'] = array(
+    '#type' => 'textfield',
+    '#title' => t("Error message if the value isn't unique"),
+    '#default_value' => $component['extra']['unique_error'],
+    '#description' => t("Error message if the value isn't unique, you can use the placeholders %value and %title. Leaving blank will use the default message."),
+    '#weight' => 2,
+    '#size' => 60,
+    '#parents' => array('extra', 'unique_error'),
+    '#states' => array(
+      'visible' => array(':input[name="extra[unique]"]' => array('checked' => TRUE)),
+    ),
+  );
   $form['validation']['maxlength'] = array(
     '#type' => 'textfield',
     '#title' => t('Maxlength'),
@@ -124,7 +138,7 @@ function _webform_edit_textfield($component) {
     '#description' => t('Maximum length of the textfield value.'),
     '#size' => 5,
     '#maxlength' => 10,
-    '#weight' => 2,
+    '#weight' => 3,
     '#parents' => array('extra', 'maxlength'),
   );
   $form['validation']['minlength'] = array(
@@ -204,6 +218,11 @@ function _webform_render_textfield($component, $value = NULL, $filter = TRUE, $s
     $element['#default_value'] = $value[0];
   }
 
+  // If needed set custom validation error for required element.
+  if ($component['required'] && isset($component['extra']['required_error']) && drupal_strlen($component['extra']['required_error'])) {
+    $element['#required_error'] = $component['extra']['required_error'];
+  }
+
   return $element;
 }
 
diff --git a/components/time.inc b/components/time.inc
index aaedb7385..727f07663 100644
--- a/components/time.inc
+++ b/components/time.inc
@@ -30,6 +30,7 @@ function _webform_defaults_time() {
       'description_above' => FALSE,
       'private' => FALSE,
       'analysis' => FALSE,
+      'required_error' => '',
     ),
   );
 }
@@ -311,7 +312,13 @@ function webform_validate_time($element, $form_state) {
   if ($element['#required']) {
     foreach (array('hour', 'minute', 'ampm') as $field_type) {
       if (isset($element[$field_type]) && $element[$field_type]['#value'] === '') {
-        form_error($element, t('!name field is required.', array('!name' => $element['#title'])));
+        $component = $element['#webform_component'];
+        if (isset($component['extra']['required_error']) && drupal_strlen($component['extra']['required_error'])) {
+          form_error($element, $component['extra']['required_error']);
+        }
+        else {
+          form_error($element, t('!name field is required.', array('!name' => $element['#title'])));
+        }
         return;
       }
     }
diff --git a/includes/webform.components.inc b/includes/webform.components.inc
index af7d48b61..b40dde99f 100644
--- a/includes/webform.components.inc
+++ b/includes/webform.components.inc
@@ -542,6 +542,18 @@ function webform_component_edit_form($form, $form_state, $node, $component, $clo
       '#weight' => -1,
       '#parents' => array('required'),
     );
+
+    $form['validation']['required_error'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Mandatory error message'),
+      '#default_value' => isset($component['extra']['required_error']) ? $component['extra']['required_error'] : '',
+      '#description' => t('This is used as a custom validation error for mandatory element.'),
+      '#weight' => 0,
+      '#parents' => array('extra', 'required_error'),
+      '#states' => array(
+        'visible' => array(':input[name="required"]' => array('checked' => TRUE)),
+      ),
+    );
   }
 
   // Position settings, only shown if JavaScript is disabled.
@@ -1235,7 +1247,13 @@ function webform_validate_unique($element, $form_state) {
     }
     $count = $query->execute()->fetchField();
     if ($count) {
-      form_error($element, t('The value %value has already been submitted once for the %title field. You may have already submitted this form, or you need to use a different value.', array('%value' => $element['#value'], '%title' => $element['#title'])));
+      //form_error($element, t('The value %value has already been submitted once for the %title field. You may have already submitted this form, or you need to use a different value.', array('%value' => $element['#value'], '%title' => $element['#title'])));
+      if (isset($element['#webform_component']['extra']['unique_error']) && !empty($element['#webform_component']['extra']['unique_error'])) {
+        form_error($element, t($element['#webform_component']['extra']['unique_error'], array('%value' => $element['#value'], '%title' => $element['#title'])));
+      }
+      else {
+        form_error($element, t('The value %value has already been submitted once for the %title field. You may have already submitted this form, or you need to use a different value.', array('%value' => $element['#value'], '%title' => $element['#title'])));
+      }
     }
   }
 }
diff --git a/webform.api.php b/webform.api.php
index a30a0431a..0c90aaa83 100644
--- a/webform.api.php
+++ b/webform.api.php
@@ -893,6 +893,7 @@ function _webform_defaults_component() {
       'description_above' => FALSE,
       'private' => FALSE,
       'analysis' => TRUE,
+      'required_error' => '',
     ),
   );
 }
diff --git a/webform.module b/webform.module
index 127154cd9..3a077f39c 100644
--- a/webform.module
+++ b/webform.module
@@ -3106,7 +3106,12 @@ function _webform_client_form_validate(&$elements, &$form_state, $form_id = NULL
       $value_is_empty_string = is_string($elements['#value']) && strlen(trim($elements['#value'])) === 0;
       $value_is_empty_array = is_array($elements['#value']) && !$elements['#value'];
       if ($elements['#required'] && ($value_is_empty_string || $value_is_empty_array || $elements['#value'] === FALSE || $elements['#value'] === NULL)) {
-        form_error($elements, t('!name field is required.', array('!name' => $elements['#title'])));
+        if (isset($elements['#required_error']) && drupal_strlen($elements['#required_error'])) {
+          form_error($elements, $elements['#required_error']);
+        }
+        else {
+          form_error($elements, t('!name field is required.', array('!name' => $elements['#title'])));
+        }
       }
 
       // Verify that the value is not longer than #maxlength.
@@ -3139,7 +3144,7 @@ function _webform_client_form_validate(&$elements, &$form_state, $form_id = NULL
             }
           }
         }
-        elseif ($elements['#value'] !== '' && !isset($options[$elements['#value']])) {
+        elseif ($elements['#value'] !==  FALSE && !isset($options[$elements['#value']])) {
           form_error($elements, t('An illegal choice has been detected. Please contact the site administrator.'));
           watchdog('form', 'Illegal choice %choice in %name element.', array('%choice' => $elements['#value'], '%name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']), WATCHDOG_ERROR);
         }
