diff --git a/ds.api.php b/ds.api.php
index 20a0265..e2dbfba 100644
--- a/ds.api.php
+++ b/ds.api.php
@@ -410,6 +410,22 @@ function hook_ds_layout_info() {
 }
 
 /**
+ * Alter the layout render array.
+ *
+ * @param $layout_render_array
+ *   The render array
+ * @param $context
+ *   An array with the context that is being rendered. Available keys are
+ *   - entity
+ *   - entity_type
+ *   - bundle
+ *   - view_mode
+ */
+function hook_ds_pre_render_alter(&$layout_render_array, $context) {
+  $layout_render_array['left'][] = array('#markup' => 'cool!', '#weight' => 20);
+}
+
+/**
  * Alter layouts found by Display Suite.
  *
  * @param $layouts
diff --git a/ds.module b/ds.module
index 265a4c2..e363bfc 100644
--- a/ds.module
+++ b/ds.module
@@ -885,7 +885,7 @@ function ds_entity_variables(&$vars) {
       $object = 'term';
     }
     if (isset($vars[$object]->preprocess_fields)) {
-      foreach ($vars[$object]->preprocess_fields as $key => $field) {
+      foreach ($vars[$object]->preprocess_fields as $field) {
 
         // Process RDF if the module is enabled before moving preprocess fields.
         if (module_exists('rdf')) {
@@ -934,7 +934,12 @@ function ds_entity_variables(&$vars) {
     foreach ($layout['regions'] as $region_name => $region) {
 
       // Create the region content.
-      $vars[$region_name] = ds_render_region($vars[$render_container], $region_name, $layout);
+      $layout_render_array[$region_name] = array();
+      if (isset($layout['settings']['regions'][$region_name])) {
+        foreach ($layout['settings']['regions'][$region_name] as $field) {
+          $layout_render_array[$region_name][] = $vars[$render_container][$field];
+        }
+      }
 
       // In case this is a panels layout, add the variable to the $content variable.
       if (isset($layout['module']) && $layout['module'] == 'panels') {
@@ -954,6 +959,13 @@ function ds_entity_variables(&$vars) {
 
     // Add a layout wrapper
     $vars['layout_wrapper'] = isset($layout['settings']['layout_wrapper']) ? $layout['settings']['layout_wrapper'] : 'div';
+
+    // Let other modules alter the ds array before creating the region variables.
+    $context = array('entity' => $object, 'entity_type' => $vars['elements']['#entity_type'], 'bundle' => $vars['elements']['#bundle'], 'view_mode' => $vars['elements']['#view_mode']);
+    drupal_alter('ds_pre_render', $layout_render_array, $context);
+    foreach ($layout_render_array as $region_name => $content) {
+      $vars[$region_name] = render($content);
+    }
   }
 }
 
diff --git a/tests/ds_test.module b/tests/ds_test.module
index 3b00d9a..68cd830 100644
--- a/tests/ds_test.module
+++ b/tests/ds_test.module
@@ -24,6 +24,13 @@ function ds_test_install() {
 }
 
 /**
+ * Implements hook_ds_pre_render_alter().
+ */
+function ds_test_ds_pre_render_alter(&$layout_render_array, $context) {
+  $layout_render_array['left'][] = array('#markup' => 'cool!', '#weight' => 20);
+}
+
+/**
  * Implements hook_views_api().
  */
 function ds_test_views_api($module, $api) {
