diff --git themes/bartik/template.php themes/bartik/template.php
index b75c749..fba9109 100644
--- themes/bartik/template.php
+++ themes/bartik/template.php
@@ -124,22 +124,44 @@ function bartik_preprocess_block(&$variables) {
  */
 function bartik_page_alter(&$page) {
   // Determine the position and count of blocks within regions.
-  foreach ($page as &$region) {
-    // Make sure this is a "region" element.
-    if (is_array($region) && isset($region['#region'])) {
-      $i = 0;
-      foreach ($region as &$block) {
-        // Make sure this is a "block" element.
-        if (is_array($block) && isset($block['#block'])) {
-          $block['#block']->position = $i++;
-          // Set a flag for "first" and "last" blocks.
-          $block['#block']->position_first = ($block['#block']->position == 0);
-          $block['#block']->position_last = FALSE;
-          $last_block =& $block;
-        }
-      }
+  foreach (element_children($page) as $region_name) {
+    $current_position = 0;
+    $last_block = NULL;
+    _bartik_set_block_position($page[$region_name], $current_position, $last_block);
+    if (!empty($last_block)) {
       $last_block['#block']->position_last = TRUE;
-      $region['#block_count'] = $i;
     }
+    $page[$region_name]['#block_count'] = $current_position;
+  }
+}
+
+
+/**
+ * Utility function for bartik_page_alter() to recursively sets block position.
+ *
+ * Walks a render array looking for block arrays (identified by having
+ * a member #block) and sets $block['#block']->position, position_first, and
+ * position_last.
+ *
+ * @param $current_array
+ *   The render array being processed
+ * @param $current_position
+ *   Current block counter
+ * @param $last_block
+ *   Contains a reference to the last block processed
+ */
+function _bartik_set_block_position(&$current_array, &$current_position, &$last_block) {
+  // If we have a block (indicated by #block) at this level, add position_first
+  // and position_last.
+  if (!empty($current_array['#block']) && is_object($current_array['#block'])) {
+    $current_array['#block']->position = $current_position++;
+    // Set a flag for "first" and "last" blocks.
+    $current_array['#block']->position_first = ($current_array['#block']->position == 0);
+    $current_array['#block']->position_last = FALSE;
+    $last_block = $current_array;
+  }
+  // Now process any renderable children that might be blocks.
+  foreach (element_children($current_array, $current_position) as $next_child) {
+    _bartik_set_block_position($current_array[$next_child], $current_position, $last_block);
   }
 }
