diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index bd0c6c1..7e31e7b 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -782,3 +782,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 1080984..3a732d9 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -968,6 +968,15 @@ function _book_link_defaults($nid) {
 }
 
 /**
+ * Implements hook_preprocess_block().
+ */
+function book_preprocess_block(&$variables) {
+  if ($variables['block']-> module == 'book') {
+    $variables['attributes_array']['role'] = 'navigation';
+  }
+}
+
+/**
  * Process variables for book-all-books-block.tpl.php.
  *
  * The $variables array contains the following arguments:
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 7793499..24086b0 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -2038,6 +2038,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';
+  }
+}
+
+/**
  * Process variables for comment.tpl.php.
  *
  * @see comment.tpl.php
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 3575bfd..3fcbf3c 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 5168a24..4742294 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -1073,6 +1073,15 @@ function locale_block_view($type) {
 }
 
 /**
+ * Implements hook_preprocess_block().
+ */
+function locale_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'locale') {
+    $variables['attributes_array']['role'] = 'complementary';
+  }
+}
+
+/**
  * 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 b10a17a..2a5a4f2 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 4dc5934..f1e8f56 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1467,6 +1467,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 ec5452e..7aeff13 100644
--- a/core/modules/poll/poll.module
+++ b/core/modules/poll/poll.module
@@ -785,6 +785,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 e731e4f..06cae73 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 34177bb..3ed60fd 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 4f72553..fb5bd01 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 e0529df..c59b010 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2096,9 +2096,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 2dded35..3a1c444 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
