diff --git a/core/modules/image/image.field.inc b/core/modules/image/image.field.inc
index 11152ae..a2eb7f2 100644
--- a/core/modules/image/image.field.inc
+++ b/core/modules/image/image.field.inc
@@ -317,6 +317,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 ($element['#file'] && $element['#preview_image_style']) {
     $variables = array(
@@ -358,9 +362,34 @@ function image_field_widget_process($element, &$form_state, $form) {
     );
   }
 
-  // Get field settings.
-  $instance = field_widget_instance($element, $form_state);
-  $settings = $instance['settings'];
+  // The following code dealing with limit validation errors is the logic that
+  // avoids triggering error messages on elements that are accompanying the
+  // field element. These are i.e. alt and title elements. The idea is to
+  // dynamically build the definition of which fields should not be validated.
+
+  // Set helper container for collecting limit_validation_errors definitions.
+  if (!isset($form_state['_limit_validation_errors'])) {
+    $form_state['_limit_validation_errors'] = array();
+  }
+
+  // In case the triggering element is not set - form is being rendered - or in
+  // case the rendering element is "Upload" - user uploaded new file - build
+  // the limit validation error array.
+  if (!isset($form_state['triggering_element']) || $form_state['triggering_element']['#value'] == t('Upload')) {
+    // For files that have just been uploaded validate only the fid.
+    if (empty($element['#file']) || empty($element['#file']->status)) {
+      $form_state['_limit_validation_errors'][$element['#delta']] = array($instance['field_name'], $element['#language'], $element['#delta'], 'fid');
+    }
+    // Previously uploaded files - validate whole field.
+    else {
+      $form_state['_limit_validation_errors'][$element['#delta']] = array($instance['field_name'], $element['#language'], $element['#delta']);
+    }
+  }
+
+  // Set the built limit validation error definition array for upload as well as
+  // for the remove button.
+  $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(
@@ -373,6 +402,7 @@ function image_field_widget_process($element, &$form_state, $form) {
     '#weight' => -2,
     '#access' => (bool) $item['fid'] && $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',
@@ -382,7 +412,8 @@ function image_field_widget_process($element, &$form_state, $form) {
     '#maxlength' => 1024,
     '#weight' => -1,
     '#access' => (bool) $item['fid'] && $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;
