diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index 72e31c3..6ba67d7 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 ce3c9e4..0eedd48 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -970,6 +970,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 ae9278c..1ab479c 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -2256,6 +2256,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 65c5489..1ed72d2 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -959,6 +959,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 103c284..6038942 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -1023,6 +1023,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 cd42256..50c7e3a 100644
--- a/core/modules/menu/menu.module
+++ b/core/modules/menu/menu.module
@@ -775,3 +775,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 c429fe5..3ba58da 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1424,6 +1424,23 @@ function node_is_page($node) {
 }
 
 /**
+ * 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;
+    }
+  }
+}
+
+/**
  * Process variables for node.tpl.php
  *
  * Most themes utilize their own copy of node.tpl.php. The default is located
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..cc06447 100644
--- a/core/modules/search/search.module
+++ b/core/modules/search/search.module
@@ -1326,3 +1326,11 @@ function search_forms() {
   return $forms;
 }
 
+/**
+ * Implements hook_preprocess_block().
+ */
+function search_preprocess_block(&$variables) {
+  if ($variables['block']->module == 'search') {
+    $variables['attributes_array']['role'] = 'search';
+  }
+}
diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index f8ddcc2..4a47ab2 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 f16b73f..726fa72 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 260124c..864ca7c 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -1352,6 +1352,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
