diff --git a/media_multiselect.module b/media_multiselect.module
index 6caa609..469d653 100644
--- a/media_multiselect.module
+++ b/media_multiselect.module
@@ -151,6 +151,10 @@ function media_multiselect_field_widget_form(&$form, &$form_state, $field, $inst
  * of the value-elements with their own #process-instruction.
  */
 function media_multiselect_process_widget_form($element) {
+  // Add media required validation
+  $element['add_more']['#skip_required'] = TRUE;
+  $element['#element_validate'] = array('multiselect_field_validate');
+
   $element['add_more']['#media_multiselect_field_wrapper'] = $element['#array_parents'];
 
   preg_match('/id="(.*?)"/', $element['#prefix'], $matches);
@@ -370,6 +374,27 @@ function _media_multiselect_filter_empty_value($value) {
 }
 
 /**
+ * Validate multiselect field.
+ */
+function multiselect_field_validate(&$element, &$form_state) {
+  $skip = !empty($form_state['triggering_element']['#skip_required']);
+  if (!$skip && !empty($element['#required'])) {
+    $has_value = FALSE;
+    $widget_parents = $element['#array_parents'];
+    $items = drupal_array_get_nested_value($form_state['values'], $widget_parents);
+    foreach ($items as $value) {
+      if (is_array($value) && !empty($value['fid'])) {
+        $has_value = TRUE;
+        break;
+      }
+    }
+    if (!$has_value) {
+      form_error($element, t('%element_title is required.', array('%element_title' => $element['#title'])));
+    }
+  }
+}
+
+/**
  * Implements hook_field_validate()
  */
 function media_multiselect_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
