diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index ff4773f..bb66cbe 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -786,3 +786,12 @@ function aggregator_sanitize_configuration() {
 function _aggregator_items($count) {
   return format_plural($count, '1 item', '@count items');
 }
+
+/**
+ * Implements hook_preprocess_block().
+ */
+function aggregator_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'aggregator') {
+    $variables['attributes_array']['role'] = 'complementary';
+  }
+}
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 5cda5e2..f9ae921 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -1058,6 +1058,15 @@ function _book_link_defaults($nid) {
   return array('original_bid' => 0, 'menu_name' => '', 'nid' => $nid, 'bid' => 0, 'router_path' => 'node/%', 'plid' => 0, 'mlid' => 0, 'has_children' => 0, 'weight' => 0, 'module' => 'book', 'options' => array());
 }
 
+ /**
+ * Implements hook_preprocess_block().
+ */
+function book_preprocess_block(&$variables) {
+  if ($variables['block']-> module == 'book') {
+    $variables['attributes_array']['role'] = 'navigation';
+  }
+}
+
 /**
  * Processes variables for book-all-books-block.tpl.php.
  *
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index d69ea94..8a8ae33 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -2090,6 +2090,15 @@ function comment_form_submit($form, &$form_state) {
 }
 
 /**
+ * Implements hook_preprocess_block().
+ */
+function comment_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'comment') {
+    $variables['attributes_array']['role'] = 'navigation';
+  }
+}
+
+/**
  * Preprocesses variables for comment.tpl.php.
  *
  * @see comment.tpl.php
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 26ab78f..90b1f89 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -962,6 +962,15 @@ function forum_get_topics($tid, $sortby, $forum_per_page) {
 }
 
 /**
+ * Implements hook_preprocess_block().
+ */
+function forum_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'forum') {
+    $variables['attributes_array']['role'] = 'navigation';
+  }
+}
+
+/**
  * Process variables for forums.tpl.php
  *
  * The $variables array contains the following arguments:
diff --git a/core/modules/help/help.module b/core/modules/help/help.module
index 773a52d..2bb81a6 100644
--- a/core/modules/help/help.module
+++ b/core/modules/help/help.module
@@ -61,3 +61,12 @@ function help_help($path, $arg) {
       return $output;
   }
 }
+
+/**
+ * Implements hook_preprocess_block().
+ */
+function help_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'help') {
+    $variables['attributes_array']['role'] = 'complementary';
+  }
+}
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 0a2e70e..17c4459 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -993,6 +993,15 @@ function locale_block_view($type) {
 }
 
 /**
+ * Implements hook_preprocess_block().
+ */
+function locale_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'locale') {
+    $variables['attributes_array']['role'] = 'navigation';
+  }
+}
+
+/**
  * Implements hook_url_outbound_alter().
  *
  * Rewrite outbound URLs with language based prefixes.
diff --git a/core/modules/menu/menu.module b/core/modules/menu/menu.module
index 0b213c4..93d767d 100644
--- a/core/modules/menu/menu.module
+++ b/core/modules/menu/menu.module
@@ -793,3 +793,12 @@ function menu_get_menus($all = TRUE) {
   }
   return $custom_menus;
 }
+
+/**
+ * Implements hook_preprocess_block().
+ */
+function menu_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'menu') {
+    $variables['attributes_array']['role'] = 'navigation';
+  }
+}
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 2910e1a..57f750e 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1480,6 +1480,22 @@ function node_is_page($node) {
   return (!empty($page_node) ? $page_node->nid == $node->nid : FALSE);
 }
 
+ /**
+ * Implements hook_preprocess_block().
+ */
+function node_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'node') {
+    switch ($variables['block']->delta) {
+      case 'syndicate':
+        $variables['attributes_array']['role'] = 'complementary';
+        break;
+      case 'recent':
+        $variables['attributes_array']['role'] = 'navigation';
+        break;
+    }
+  }
+}
+
 /**
  * Processes variables for node.tpl.php.
  *
diff --git a/core/modules/poll/poll.module b/core/modules/poll/poll.module
index c4adcf5..40a481a 100644
--- a/core/modules/poll/poll.module
+++ b/core/modules/poll/poll.module
@@ -790,6 +790,15 @@ function poll_vote($form, &$form_state) {
 }
 
 /**
+ * Implements hook_preprocess_block().
+ */
+function poll_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'poll') {
+    $variables['attributes_array']['role'] = 'complementary';
+  }
+}
+
+/**
  * Themes the voting form for a poll.
  *
  * Inputs: $form
diff --git a/core/modules/search/search.module b/core/modules/search/search.module
index 4d6f1be..14ffc80 100644
--- a/core/modules/search/search.module
+++ b/core/modules/search/search.module
@@ -158,6 +158,7 @@ function search_block_view($delta = '') {
  */
 function search_preprocess_block(&$variables) {
   if ($variables['block']->module == 'search' && $variables['block']->delta == 'form') {
+    $variables['attributes_array']['role'] = 'search';
     $variables['content_attributes_array']['class'][] = 'container-inline';
   }
 }
@@ -1325,4 +1326,3 @@ function search_forms() {
   );
   return $forms;
 }
-
diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index a60f8d8..b057e4b 100644
--- a/core/modules/shortcut/shortcut.module
+++ b/core/modules/shortcut/shortcut.module
@@ -640,6 +640,15 @@ function shortcut_renderable_links($shortcut_set = NULL) {
 }
 
 /**
+ * Implements hook_preprocess_block().
+ */
+function shortcut_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'shortcut') {
+    $variables['attributes_array']['role'] = 'navigation';
+  }
+}
+
+/**
  * Implements hook_preprocess_page().
  */
 function shortcut_preprocess_page(&$variables) {
diff --git a/core/modules/statistics/statistics.module b/core/modules/statistics/statistics.module
index 191d82b..eda808f 100644
--- a/core/modules/statistics/statistics.module
+++ b/core/modules/statistics/statistics.module
@@ -428,3 +428,11 @@ function statistics_ranking() {
 function statistics_update_index() {
   variable_set('node_cron_views_scale', 1.0 / max(1, db_query('SELECT MAX(totalcount) FROM {node_counter}')->fetchField()));
 }
+/**
+ * Implements hook_preprocess_block().
+ */
+function statistics_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'statistics') {
+    $variables['attributes_array']['role'] = 'navigation';
+  }
+}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 725cad7..41ba22b 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2089,9 +2089,23 @@ function system_block_view($delta = '') {
  * Implements hook_preprocess_block().
  */
 function system_preprocess_block(&$variables) {
-  // System menu blocks should get the same class as menu module blocks.
-  if ($variables['block']->module == 'system' && in_array($variables['block']->delta, array_keys(menu_list_system_menus()))) {
-    $variables['classes_array'][] = 'block-menu';
+  if ($variables['block']->module == 'system') {
+
+    switch ($variables['block']->delta) {
+      case 'powered-by':
+        $variables['attributes_array']['role'] = 'complementary';
+        break;
+      case 'help':
+        $variables['attributes_array']['role'] = 'complementary';
+        break;
+
+      // System menu blocks should get the same class as menu module blocks.
+      default:
+        if (in_array($variables['block']->delta, array_keys(menu_list_system_menus()))) {
+          $variables['attributes_array']['role'] = 'navigation';
+          $variables['classes_array'][] = 'block-menu';
+        }
+    }
   }
 }
 
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 009a716..576a260 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -1353,6 +1353,25 @@ function user_block_view($delta = '') {
 }
 
 /**
+ * Implements hook_preprocess_block().
+ */
+function user_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'user') {
+    switch ($variables['block']->delta) {
+      case 'login':
+        $variables['attributes_array']['role'] = 'form';
+        break;
+      case 'new':
+        $variables['attributes_array']['role'] = 'complementary';
+        break;
+      case 'online':
+        $variables['attributes_array']['role'] = 'complementary';
+        break;
+    }
+  }
+}
+
+/**
  * Format a username.
  *
  * By default, the passed-in object's 'name' property is used if it exists, or
