diff --git a/core/modules/picture/lib/Drupal/picture/Tests/PictureThemeFunctionsTest.php b/core/modules/picture/lib/Drupal/picture/Tests/PictureThemeFunctionsTest.php
new file mode 100644
index 0000000..1148cc0
--- /dev/null
+++ b/core/modules/picture/lib/Drupal/picture/Tests/PictureThemeFunctionsTest.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\picture\Tests\PictureThemeFunctionsTest.
+ */
+
+namespace Drupal\picture\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests picture theme functions.
+ */
+class PictureThemeFunctionsTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('picture');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Picture theme functions',
+      'description' => 'Tests the picture theme functions.',
+      'group' => 'Picture',
+    );
+  }
+
+  /**
+   * Tests usage of the theme_picture() function.
+   */
+  function testPictureThemeFunction() {
+    // Create an image.
+    $files = $this->drupalGetTestFiles('image');
+    $file = reset($files);
+    $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
+
+    // Create a style.
+    $style = entity_create('image_style', array('name' => 'test', 'label' => 'Test'));
+    $style->save();
+    $url = $style->buildUrl($original_uri);
+
+    // Test using theme_picture() with a NULL value for the alt option.
+    $path = $this->randomName();
+    $element = array(
+      '#theme' => 'picture',
+      '#uri' => $original_uri,
+      '#alt' => NULL,
+      '#style_name' => 'test',
+    );
+    $rendered_element = render($element);
+    $expected_result = '<img class="image-style-test" src="' . $url . '" />';
+    $this->assertTrue(strpos($rendered_element, $expected_result) !== FALSE, 'img element in theme_picture() correctly renders with a NULL value for the alt option.');
+    $this->assertTrue(strpos($rendered_element, '<picture>') !== FALSE, 'picture element in theme_picture() correctly renders with a NULL value for the alt option.');
+
+    // Test using theme_picture() without passing a value for the alt option.
+    unset($element['#alt']);
+    $rendered_element = render($element);
+    $expected_result = '<img class="image-style-test" src="' . $url . '" alt="" />';
+    $this->assertTrue(strpos($rendered_element, $expected_result) !== FALSE, 'img element in theme_picture() correctly renders the alt option.');
+    $this->assertTrue(strpos($rendered_element, '<picture alt="">') !== FALSE, 'picture element in theme_picture() correctly renders the alt option.');
+  }
+
+}
diff --git a/core/modules/picture/picture.module b/core/modules/picture/picture.module
index a15e06a..70ae465 100644
--- a/core/modules/picture/picture.module
+++ b/core/modules/picture/picture.module
@@ -122,6 +122,18 @@ function picture_mapping_load($id) {
 function picture_theme() {
   return array(
     'picture' => array(
+      // HTML 4 and XHTML 1.0 always require an alt attribute. The HTML 5 draft
+      // allows the alt attribute to be omitted in some cases. Therefore,
+      // default the alt attribute to an empty string, but allow code calling
+      // theme('picture') to pass explicit NULL for it to be omitted. Usually,
+      // neither omission nor an empty string satisfies accessibility
+      // requirements, so it is strongly encouraged for code calling
+      // theme('picture') to pass a meaningful value for the alt variable.
+      // - http://www.w3.org/TR/REC-html40/struct/objects.html#h-13.8
+      // - http://www.w3.org/TR/xhtml1/dtds.html
+      // - http://dev.w3.org/html5/spec/Overview.html#alt
+      // The title attribute is optional in all cases, so it is omitted by
+      // default.
       'variables' => array(
         'style_name' => NULL,
         'uri' => NULL,
@@ -189,7 +201,7 @@ function theme_picture_formatter($variables) {
     $picture['#uri'] = $variables['item']['entity']->getFileUri();
     $picture['#entity'] = $variables['item']['entity'];
   }
-  if (isset($variables['item']['alt'])) {
+  if (isset($variables['item']['alt']) || array_key_exists('alt', $variables['item'])) {
     $picture['#alt'] = $variables['item']['alt'];
   }
   if (isset($variables['item']['title']) && drupal_strlen($variables['item']['title']) != 0) {
@@ -214,7 +226,16 @@ function theme_picture_formatter($variables) {
  *     full URL.
  *   - width: The width of the image (if known).
  *   - height: The height of the image (if known).
- *   - alt: The alternative text for text-based browsers.
+ *   - alt: The alternative text for text-based browsers. HTML 4 and XHTML 1.0
+ *     always require an alt attribute. The HTML 5 draft allows the alt
+ *     attribute to be omitted in some cases. Therefore, this variable defaults
+ *     to an empty string, but can be set to NULL for the attribute to be
+ *     omitted. Usually, neither omission nor an empty string satisfies
+ *     accessibility requirements, so it is strongly encouraged for code calling
+ *     theme('picture') to pass a meaningful value for this variable.
+ *     - http://www.w3.org/TR/REC-html40/struct/objects.html#h-13.8
+ *     - http://www.w3.org/TR/xhtml1/dtds.html
+ *     - http://dev.w3.org/html5/spec/Overview.html#alt
  *   - breakpoints: An array containing breakpoints.
  *
  * @ingroup themeable
@@ -309,7 +330,7 @@ function theme_picture($variables) {
       '#height' => $variables['height'],
     );
     foreach (array('uri', 'alt', 'title', 'attributes') as $key) {
-      if (isset($variables[$key])) {
+      if (isset($variables[$key]) || array_key_exists($key, $variables)) {
         $image_style["#$key"] = $variables[$key];
       }
     }
