diff --git a/plugins/context_reaction_block.inc b/plugins/context_reaction_block.inc
index 52f9fe9..7f7f136 100644
--- a/plugins/context_reaction_block.inc
+++ b/plugins/context_reaction_block.inc
@@ -220,13 +220,44 @@ class context_reaction_block extends context_reaction {
     foreach (array_keys($all_regions) as $region) {
       if ($this->is_enabled_region($region)) {
         if ($blocks = $this->block_get_blocks_by_region($region)) {
-          $page[$region] = isset($page[$region]) ? array_merge($page[$region], $blocks) : $blocks;
+          if (isset($page[$region]))
+          {
+            $blocks_from_region = array_filter($page[$region], array('context_reaction_block', 'filter_is_block'));
+            $blocks_from_context = array_filter($blocks, array('context_reaction_block', 'filter_is_block'));
+            $page[$region] = array_diff($page[$region], $blocks_from_region);
+            $blocks = array_diff($blocks, $blocks_from_context);
+            $sorted_blocks = array_merge($blocks_from_region, $blocks_from_context);
+            uasort($sorted_blocks, array('context_reaction_block', 'block_sort_original_weight'));
+            $weight = 0;
+            foreach ($sorted_blocks as $key => $value)
+              $value['#weight'] = $weight++;
+            $page[$region] = array_merge($page[$region], $blocks, $sorted_blocks);
+          }
+          else
+            $page[$region] = $blocks;
         }
       }
     }
   }
 
   /**
+   * Block filter callback.
+   */
+  static function filter_is_block($value)
+  {
+    return is_array($value) && array_key_exists('#block', $value);
+  }
+
+  /**
+   * Sort callback.
+   */
+  static function block_sort_original_weight($a, $b) {
+    if ($a['#block']->weight == $b['#block']->weight)
+      return 0;
+    return $a['#block']->weight < $b['#block']->weight ? -1 : 1;
+  }
+   
+  /**
    * Return a list of enabled regions for which blocks should be built.
    * Split out into a separate method for easy overrides in extending classes.
    */
