diff --git a/core/modules/image/image.field.inc b/core/modules/image/image.field.inc
index a287620..d8be61b 100644
--- a/core/modules/image/image.field.inc
+++ b/core/modules/image/image.field.inc
@@ -318,6 +318,10 @@ function image_field_widget_process($element, &$form_state, $form) {
   $element['#theme'] = 'image_widget';
   $element['#attached']['css'][] = drupal_get_path('module', 'image') . '/image.theme.css';
 
+  // Get field settings.
+  $instance = field_widget_instance($element, $form_state);
+  $settings = $instance['settings'];
+
   // Add the image preview.
   if (!empty($element['#files']) && $element['#preview_image_style']) {
     $file = reset($element['#files']);
@@ -360,9 +364,41 @@ function image_field_widget_process($element, &$form_state, $form) {
     );
   }
 
-  // Get field settings.
-  $instance = field_widget_instance($element, $form_state);
-  $settings = $instance['settings'];
+  // Verify if alt and title elements are present & then dynamically build the
+  // definition of which fields should not be validated.
+  if ($settings['alt_field_required'] || $settings['title_field_required']) {
+    // Set helper container for collecting limit_validation_errors definitions.
+    if (!isset($form_state['_limit_validation_errors'])) {
+      $form_state['_limit_validation_errors'] = array();
+    }
+
+    // Build the limit validation error array if the triggering element is not
+    // set or for rendering the Upload element for a new file.
+    if (!isset($form_state['triggering_element']) || $form_state['triggering_element']['#value'] == t('Upload')) {
+      // For files that have just been uploaded validate only the file ID.
+      if (empty($element['#file']) || empty($element['#file']->status)) {
+        $form_state['_limit_validation_errors'][$element['#delta']] = array($instance['field_name'], $element['#language'], $element['#delta'], 'fid');
+
+        // Set alt and title values from POST as the limit validation logic will
+        // remove them from the form_state.
+        if ($element['#alt_field'] && isset($_POST[$instance['field_name']][$element['#language']][$element['#delta']]['alt'])) {
+          $item['alt'] = $_POST[$instance['field_name']][$element['#language']][$element['#delta']]['alt'];
+        }
+        if ($element['#title_field'] && isset($_POST[$instance['field_name']][$element['#language']][$element['#delta']]['title'])) {
+          $item['title'] = $_POST[$instance['field_name']][$element['#language']][$element['#delta']]['title'];
+        }
+      }
+      // Validate the whole field for previously uploaded files.
+      else {
+        $form_state['_limit_validation_errors'][$element['#delta']] = array($instance['field_name'], $element['#language'], $element['#delta']);
+      }
+    }
+
+    // Limit validation errors for the upload and remove buttons.
+    $element['upload_button']['#limit_validation_errors'] = $form_state['_limit_validation_errors'];
+    $element['remove_button']['#limit_validation_errors'] = $form_state['_limit_validation_errors'];
+  }
+
 
   // Add the additional alt and title fields.
   $element['alt'] = array(
@@ -375,6 +411,7 @@ function image_field_widget_process($element, &$form_state, $form) {
     '#weight' => -2,
     '#access' => (bool) $item['fids'] && $element['#alt_field'],
     '#element_validate' => $settings['alt_field_required'] == 1 ? array('_image_field_required_fields_validate') : array(),
+    '#required' => $settings['alt_field_required'],
   );
   $element['title'] = array(
     '#type' => 'textfield',
@@ -384,9 +421,9 @@ function image_field_widget_process($element, &$form_state, $form) {
     '#maxlength' => 1024,
     '#weight' => -1,
     '#access' => (bool) $item['fids'] && $element['#title_field'],
-    '#element_validate' => $settings['alt_field_required'] == 1 ? array('_image_field_required_fields_validate') : array(),
+    '#element_validate' => $settings['title_field_required'] == 1 ? array('_image_field_required_fields_validate') : array(),
+    '#required' => $settings['title_field_required'],
   );
-
   return $element;
 }
 
