diff --git a/masonry_context/masonry_context.info b/masonry_context/masonry_context.info
new file mode 100644
index 0000000..5c4b2b8
--- /dev/null
+++ b/masonry_context/masonry_context.info
@@ -0,0 +1,7 @@
+name = Masonry Context
+description = "Provides a Context reacton plugin to display content in a jQuery Masonry grid."
+core = 7.x
+package = User interface
+
+dependencies[] = masonry
+dependencies[] = context
diff --git a/masonry_context/masonry_context.module b/masonry_context/masonry_context.module
new file mode 100644
index 0000000..28e900c
--- /dev/null
+++ b/masonry_context/masonry_context.module
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @file
+ */
+
+/**
+ * Implements hook_page_build().
+ */
+function masonry_context_page_build(&$page) {
+  if ($plugin = context_get_plugin('reaction', 'masonry')) {
+    $plugin->execute();
+  }
+}
+
+/**
+ * Implements hook_context_plugins().
+ */
+function masonry_context_context_plugins() {
+  $plugins = array();
+
+  $plugins['context_reaction_masonry'] = array(
+    'handler' => array(
+      'path' => drupal_get_path('module', 'masonry_context') . '/plugins',
+      'file' => 'context_reaction_masonry.inc',
+      'class' => 'context_reaction_masonry',
+      'parent' => 'context_reaction',
+    ),
+  );
+
+  return $plugins;
+}
+
+/**
+ * Implements hook_context_registry().
+ */
+function masonry_context_context_registry() {
+  return array(
+    'reactions' => array(
+      'masonry' => array(
+        'title' => t('Masonry'),
+        'plugin' => 'context_reaction_masonry',
+      ),
+    ),
+  );
+}
diff --git a/masonry_context/plugins/context_reaction_masonry.inc b/masonry_context/plugins/context_reaction_masonry.inc
new file mode 100644
index 0000000..e55e87c
--- /dev/null
+++ b/masonry_context/plugins/context_reaction_masonry.inc
@@ -0,0 +1,116 @@
+<?php
+/**
+ * @file
+ * Masonry reaction for Context module.
+ */
+
+/**
+ * Adds Masonry javascript to the page.
+ */
+class context_reaction_masonry extends context_reaction {
+  /**
+   * Masonry settings form.
+   */
+  function options_form($context) {
+    $form = array();
+    $settings = $this->fetch_from_context($context);
+
+    // Get default Masonry options.
+    $settings += masonry_default_options();
+
+    $form['container'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Container'),
+      '#default_value' => isset($settings['container']) ? $settings['container'] : NULL,
+      '#description' => t('The jQuery selector of the Masonry container (ie, .region-content-inner).'),
+    );
+
+    $form['item'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Item selector'),
+      '#default_value' => isset($settings['item']) ? $settings['item'] : NULL,
+      '#description' => t('The jQuery selector of the Masonry item container (ie, section).'),
+    );
+
+    // Add Masonry options to an existing form.
+    masonry_options_form($form, $settings);
+
+    $form['masonry_animated_duration']['#states'] = array(
+      'visible' => array(
+        'input.form-checkbox[name$="[masonry_animated]"]' => array('checked' => TRUE),
+      ),
+    );
+
+    return $form;
+  }
+
+  /**
+   * Execution callback.
+   */
+  function execute() {
+    $script = '';
+    $styles = '';
+
+    foreach ($this->get_contexts() as $delta => $context) {
+      if (!empty($context->reactions['masonry'])) {
+        $settings = $context->reactions['masonry'];
+
+        // Add default styling to make grids display properly out-of-the-box
+        $css_margin = ($settings['masonry_width_unit'] == 'px') ? '10px' : '2%';
+        $css_width = ($settings['masonry_width_unit'] == 'px') ? ($settings['masonry_width'] - 20) . 'px' : ($settings['masonry_width'] - 5) . '%';
+        $styles .= '
+          ' . $settings['container'] . ' ' . $settings['item'] . ' {
+            float: left;
+            margin: ' . $css_margin . ';
+            width: ' . $css_width . ';
+          }
+        ';
+        if ($settings['masonry_center']) {
+          $styles .= '
+            ' . $settings['container'] . ' ' . $settings['item'] . ' {
+              margin: 0 auto;
+            }
+          ';
+        }
+
+        // Get column width
+        if ($settings['masonry_width_unit'] == 'px') {
+          $column_width = (int) $settings['masonry_width'];
+        }
+        else {
+          $percentage = $settings['masonry_width'] / 100;
+          $column_width = 'function (containerWidth) {
+            return containerWidth * ' . $percentage . ';
+          }';
+        }
+
+        $script .= '
+  $("' . $settings['container'] . '").imagesLoaded(function() {
+    $("' . $settings['container'] . '").masonry({
+      itemSelector: "' . $settings['item'] . '",
+      columnWidth: ' . $column_width . ',
+      isAnimated: ' . $settings['masonry_animated'] . ',
+      animationOptions: {
+        duration: ' . (int) $settings['masonry_animated_duration'] . '
+      },
+      isResizable: ' . $settings['masonry_resizable'] . ',
+      isFitWidth: ' . $settings['masonry_center'] . ',
+      gutterWidth: ' . (int) $settings['masonry_gutter'] . ',
+      isRTL: ' . $settings['masonry_rtl'] . '
+    });
+  });
+';
+      }
+    }
+
+    // Initialize Masonry
+    if (!empty($script) && ($library = libraries_load('masonry')) && !empty($library['loaded'])) {
+      $script = '(function ($) { ' . $script . '})(jQuery);';
+      drupal_add_css($styles, 'inline');
+      drupal_add_js($script, array(
+        'type' => 'inline',
+        'scope' => 'footer',
+      ));
+    }
+  }
+}
