diff --git a/core/modules/image/image.field.inc b/core/modules/image/image.field.inc
index 9609960..bb7938d 100644
--- a/core/modules/image/image.field.inc
+++ b/core/modules/image/image.field.inc
@@ -328,6 +328,41 @@ function image_field_widget_process($element, &$form_state, $form) {
     );
   }
 
+  // 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'] = check_plain($_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'] = check_plain($_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(
     '#title' => t('Alternate text'),
@@ -339,6 +374,7 @@ function image_field_widget_process($element, &$form_state, $form) {
     '#weight' => -2,
     '#access' => (bool) $item['fids'] && $element['#alt_field'],
     '#element_validate' => $element['#alt_field_required'] == 1 ? array('_image_field_required_fields_validate') : array(),
+    '#required' => $settings['alt_field_required'],
   );
   $element['title'] = array(
     '#type' => 'textfield',
@@ -349,6 +385,8 @@ function image_field_widget_process($element, &$form_state, $form) {
     '#weight' => -1,
     '#access' => (bool) $item['fids'] && $element['#title_field'],
     '#element_validate' => $element['#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;
