diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 504030e..5cccc20 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -2331,7 +2331,7 @@ function template_preprocess(&$variables, $hook) {
     $default_variables = _template_preprocess_default_variables();
   }
   if (!isset($default_attributes)) {
-    $default_attributes = drupal_attributes(array('class' => array()));
+    $default_attributes = drupal_attributes();
   }
   $variables += $default_variables + array(
     'attributes' => clone $default_attributes,
diff --git a/core/lib/Drupal/Core/Template/Attribute.php b/core/lib/Drupal/Core/Template/Attribute.php
index 3004c71..92b579b 100644
--- a/core/lib/Drupal/Core/Template/Attribute.php
+++ b/core/lib/Drupal/Core/Template/Attribute.php
@@ -61,10 +61,17 @@ class Attribute implements ArrayAccess, IteratorAggregate {
   /**
    * Implements ArrayAccess::offsetGet().
    */
-  public function offsetGet($name) {
+  public function &offsetGet($name) {
     if (isset($this->storage[$name])) {
       return $this->storage[$name];
     }
+    else {
+      // If $name is not set it is likely the result of a multi-dimmensional
+      // array being passed in via overloading. In that case offsetGet() is called first.
+      // Creating a placeholder in storage and return by reference corrects this.
+      $this->offsetSet($name, array());
+      return $this->storage[$name];
+    }
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Template/AttributeArray.php b/core/lib/Drupal/Core/Template/AttributeArray.php
index d4f8771..f934989 100644
--- a/core/lib/Drupal/Core/Template/AttributeArray.php
+++ b/core/lib/Drupal/Core/Template/AttributeArray.php
@@ -33,7 +33,7 @@ class AttributeArray extends AttributeValueBase implements ArrayAccess, Iterator
   /**
    * Implements ArrayAccess::offsetGet().
    */
-  public function offsetGet($offset) {
+  public function &offsetGet($offset) {
     return $this->value[$offset];
   }
 
