diff --git a/core/modules/gridbuilder/config/grid.ninesixty_12.yml b/core/modules/gridbuilder/config/grid.ninesixty_12.yml
new file mode 100644
index 0000000..780ef44
--- /dev/null
+++ b/core/modules/gridbuilder/config/grid.ninesixty_12.yml
@@ -0,0 +1,9 @@
+id: ninesixty_12
+label: '960px wide, 12 column grid'
+pluginId: equal_column_grid
+pluginConfiguration:
+  type: 'fixed'
+  width: 960
+  columns: 12
+  padding_width: 20
+  gutter_width: 10
diff --git a/core/modules/gridbuilder/config/grid.ninesixty_16.yml b/core/modules/gridbuilder/config/grid.ninesixty_16.yml
new file mode 100644
index 0000000..2f9e0c4
--- /dev/null
+++ b/core/modules/gridbuilder/config/grid.ninesixty_16.yml
@@ -0,0 +1,9 @@
+id: ninesixty_16
+label: '960px wide, 16 column grid'
+pluginId: equal_column_grid
+pluginConfiguration:
+  type: 'fixed'
+  width: 960
+  columns: 16
+  padding_width: 20
+  gutter_width: 10
diff --git a/core/modules/gridbuilder/config/grid.six_column_fluid.yml b/core/modules/gridbuilder/config/grid.six_column_fluid.yml
new file mode 100644
index 0000000..67dbe56
--- /dev/null
+++ b/core/modules/gridbuilder/config/grid.six_column_fluid.yml
@@ -0,0 +1,9 @@
+id: six_column_fluid
+label: Six column fluid
+pluginId: equal_column_grid
+pluginConfiguration:
+  type: 'fluid'
+  width: 100
+  columns: 6
+  padding_width: 1.5
+  gutter_width: 2
diff --git a/core/modules/gridbuilder/config/grid.three_column_fluid.yml b/core/modules/gridbuilder/config/grid.three_column_fluid.yml
new file mode 100644
index 0000000..4e8aaf9
--- /dev/null
+++ b/core/modules/gridbuilder/config/grid.three_column_fluid.yml
@@ -0,0 +1,9 @@
+id: three_column_fluid
+label: Three column fluid
+pluginId: equal_column_grid
+pluginConfiguration:
+  type: 'fluid'
+  width: 100
+  columns: 3
+  padding_width: 1.5
+  gutter_width: 2
diff --git a/core/modules/gridbuilder/config/grid.twelve_column_fluid.yml b/core/modules/gridbuilder/config/grid.twelve_column_fluid.yml
new file mode 100644
index 0000000..b120870
--- /dev/null
+++ b/core/modules/gridbuilder/config/grid.twelve_column_fluid.yml
@@ -0,0 +1,9 @@
+id: twelve_column_fluid
+label: Twelve column fluid
+pluginId: equal_column_grid
+pluginConfiguration:
+  type: 'fluid'
+  width: 100
+  columns: 12
+  padding_width: 1.5
+  gutter_width: 2
diff --git a/core/modules/gridbuilder/gridbuilder.info b/core/modules/gridbuilder/gridbuilder.info
new file mode 100644
index 0000000..43d5f2f
--- /dev/null
+++ b/core/modules/gridbuilder/gridbuilder.info
@@ -0,0 +1,9 @@
+name = Grid builder
+description = Simple grid system builder.
+package = Core
+version = VERSION
+core = 8.x
+dependencies[] = config
+dependencies[] = breakpoint
+configure = admin/structure/grids
+
diff --git a/core/modules/gridbuilder/gridbuilder.module b/core/modules/gridbuilder/gridbuilder.module
new file mode 100644
index 0000000..ce33410
--- /dev/null
+++ b/core/modules/gridbuilder/gridbuilder.module
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Simple grid builder tool.
+ */
+
+use Drupal\gridbuilder\Grid;
+
+/**
+ * Implements hook_entity_info().
+ */
+function gridbuilder_entity_info() {
+  $types['grid'] = array(
+    'label' => 'Grid',
+    'entity class' => 'Drupal\gridbuilder\Grid',
+    'controller class' => 'Drupal\Core\Config\Entity\ConfigStorageController',
+    'config prefix' => 'grid',
+    'entity keys' => array(
+      'id' => 'id',
+      'label' => 'label',
+      'uuid' => 'uuid',
+    ),
+  );
+  return $types;
+}
+
+function gridbuilder_help() {
+  $grid1 = entity_load('grid', 'six_column_fluid');
+  $grid2 = entity_load('grid', 'ninesixty_12');
+  return $grid1->getGridCss() . $grid2->getGridCss();
+}
diff --git a/core/modules/gridbuilder/lib/Drupal/gridbuilder/Grid.php b/core/modules/gridbuilder/lib/Drupal/gridbuilder/Grid.php
new file mode 100644
index 0000000..5de4c90
--- /dev/null
+++ b/core/modules/gridbuilder/lib/Drupal/gridbuilder/Grid.php
@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\gridbuilder\Grid.
+ */
+
+namespace Drupal\gridbuilder;
+
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+
+/**
+ * Defines the grid entity.
+ */
+class Grid extends ConfigEntityBase {
+
+  /**
+   * The grid ID (machine name).
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The grid UUID.
+   *
+   * @var string
+   */
+  public $uuid;
+
+  /**
+   * The grid label.
+   *
+   * @var string
+   */
+  public $label;
+
+  /**
+   * Plugin identifier for this grid.
+   *
+   * @var string
+   */
+  public $pluginId;
+
+  /**
+   * Plugin configuration to instantiate the plugin instance.
+   *
+   * @var array
+   */
+  public $pluginConfiguration;
+
+  /**
+   * Instantiated plugin to handle the grid.
+   *
+   * @see Drupal\gridbuilder\Grid::GetPlugin().
+   *
+   * @var Drupal\gridbuilder\Plugin\GridBuilderInterface
+   */
+  public $plugin;
+
+  /**
+   * Get a plugin instance for this grid.
+   */
+  public function getPlugin() {
+    if (!isset($this->plugin)) {
+      // Pass on Grid ID as part of the configuration array.
+      $this->pluginConfiguration['id'] = $this->id;
+      $this->plugin = drupal_container()->get('plugin.manager.gridbuilder')->createInstance($this->pluginId, $this->pluginConfiguration);
+    }
+    return $this->plugin;
+  }
+
+  /**
+   * Generate the grid CSS using the plugin implementation.
+   */
+  public function getGridCss() {
+    return $this->getPlugin()->getGridCss();
+  }
+
+}
diff --git a/core/modules/gridbuilder/lib/Drupal/gridbuilder/GridBuilderBundle.php b/core/modules/gridbuilder/lib/Drupal/gridbuilder/GridBuilderBundle.php
new file mode 100644
index 0000000..2528ae9
--- /dev/null
+++ b/core/modules/gridbuilder/lib/Drupal/gridbuilder/GridBuilderBundle.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\gridbuilder\GridBuilderBundle.
+ */
+
+namespace Drupal\gridbuilder;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+/**
+ * GridBuilder dependency injection container.
+ */
+class GridBuilderBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    // Register the GridBuilderManager class with the dependency injection container.
+    $container->register('plugin.manager.gridbuilder', 'Drupal\gridbuilder\Plugin\Type\GridBuilderManager');
+  }
+}
diff --git a/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/GridBuilderInterface.php b/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/GridBuilderInterface.php
new file mode 100644
index 0000000..cbde3af
--- /dev/null
+++ b/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/GridBuilderInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\gridbuilder\Plugin\GridBuilderInterface.
+ */
+
+namespace Drupal\gridbuilder\Plugin;
+
+/**
+ * Defines the shared interface for all gridbuilder plugins.
+ */
+interface GridBuilderInterface {
+
+  /**
+   * Generates grid CSS for this grid system.
+   *
+   * @param (string) $wrapper_selector
+   *   (optional) Wrapper CSS selector to use to scope the CSS.
+   * @param (string) $col_selector_prefix
+   *   (optional) Column selector prefix to scope the CSS.
+   * @param (boolean) $skip_spacing
+   *    Whether we should skip including spacing in the output. Useful for tight
+   *    layout demonstration presentation.
+   *
+   * @return string
+   *   Grid CSS for this grid system.
+   */
+  public function getGridCss($wrapper_selector = NULL, $col_selector_prefix = NULL, $skip_spacing = FALSE);
+}
diff --git a/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/Type/GridBuilderManager.php b/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/Type/GridBuilderManager.php
new file mode 100644
index 0000000..730f04f
--- /dev/null
+++ b/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/Type/GridBuilderManager.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\gridbuilder\Plugin\Type\GridBuilderManager.
+ */
+
+namespace Drupal\gridbuilder\Plugin\Type;
+
+use Drupal\Component\Plugin\PluginManagerBase;
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+use Drupal\Component\Plugin\Factory\ReflectionFactory;
+
+/**
+ * GridBuilder plugin manager.
+ */
+class GridBuilderManager extends PluginManagerBase {
+
+  protected $defaults = array(
+    'class' => 'Drupal\gridbuilder\Plugin\gridbuilder\gridbuilder\EqualColumnGrid',
+  );
+
+  /**
+   * Overrides Drupal\Component\Plugin\PluginManagerBase::__construct().
+   */
+  public function __construct() {
+    $this->discovery = new AnnotatedClassDiscovery('gridbuilder', 'gridbuilder');
+    $this->factory = new ReflectionFactory($this);
+  }
+}
diff --git a/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/gridbuilder/gridbuilder/EqualColumnGrid.php b/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/gridbuilder/gridbuilder/EqualColumnGrid.php
new file mode 100644
index 0000000..dd1507b
--- /dev/null
+++ b/core/modules/gridbuilder/lib/Drupal/gridbuilder/Plugin/gridbuilder/gridbuilder/EqualColumnGrid.php
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\gridbuilder\Plugin\gridbuilder\gridbuilder\EqualColumnGrid.
+ */
+
+namespace Drupal\gridbuilder\Plugin\gridbuilder\gridbuilder;
+
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\gridbuilder\Plugin\GridBuilderInterface;
+use Drupal\Component\Plugin\PluginBase;
+use Drupal\Core\Annotation\Plugin;
+
+/**
+ * @Plugin(
+ *  id = "equal_column_grid",
+ *  derivative = "Drupal\gridbuilder\Plugin\Derivative\GridBuilder"
+ * )
+ */
+class EqualColumnGrid extends PluginBase implements GridBuilderInterface {
+
+  /**
+   * Overrides Drupal\Component\Plugin\PluginBase::__construct().
+   */
+  public function __construct(array $configuration, $plugin_id, DiscoveryInterface $discovery) {
+    // Get definition by discovering the declarative information.
+    $definition = $discovery->getDefinition($plugin_id);
+    parent::__construct($configuration, $plugin_id, $discovery);
+  }
+
+
+  /**
+   * Implements Drupal\gridbuilder\Plugin\GridBuilderInterface::getGridCss().
+   */
+  public function getGridCss($wrapper_selector = NULL, $col_selector_prefix = NULL, $skip_spacing = FALSE) {
+    $grid = $this->configuration;
+    $css = '';
+
+    // If the wrapper selector was not provided, generate one. This is useful for
+    // specific administration use cases when we scope the classes by grids.
+    if (empty($wrapper_selector)) {
+      $wrapper_selector = '.grid-' . $grid['id'];
+    }
+
+    // If the col span selector was not provided, generate one. This is useful
+    // for the front end to apply varying span widths under different names.
+    if (empty($col_selector_prefix)) {
+      $col_selector_prefix = '.grid-col_';
+    }
+
+    // If spacing is to be skipped, override the gutter and padding temporarily.
+    if ($skip_spacing) {
+      $grid['gutter_width'] = $grid['padding_width'] = 0;
+    }
+
+    // @todo: type constants are in the module.
+    switch ($grid['type']) {
+      case 1:
+        $size_suffix = '%';
+        // Override to 100% whatever it was.
+        $grid['width'] = '100';
+        break;
+      case 0:
+        $size_suffix = 'px';
+        break;
+    }
+
+    // Because we use the border-box box model, we only need to substract the
+    // size of margins from the full width and divide the rest by number of
+    // columns to get a value for column size.
+    $colwidth = ($grid['width'] - (($grid['columns'] - 1) * $grid['gutter_width'])) / $grid['columns'];
+
+    $css = $wrapper_selector . ' .grid-col {
+  border: 0px solid rgba(0,0,0,0);
+  float: left;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -moz-background-clip: padding-box;
+  -webkit-background-clip: padding-box;
+  background-clip: padding-box;
+  margin-left: ' . $grid['gutter_width'] . $size_suffix . ';
+  padding: 0 ' . $grid['padding_width']  . $size_suffix . ';
+}
+' . $wrapper_selector . ' .grid-col' . $col_selector_prefix .'first {
+  margin-left: 0;
+  clear: both;
+}
+';
+    for ($i = 1; $i <= $grid['columns']; $i++) {
+      $css .= $wrapper_selector . ' ' . $col_selector_prefix . $i . " {\n";
+      if ($i == 1) {
+        // The first column does not yet have any margins.
+        $css .= '  width: ' . $colwidth * $i . $size_suffix . ";\n";
+      }
+      elseif ($i == $grid['columns']) {
+        // The full width column always spans 100%.
+        $css .= "  width: " . $grid['width'] . $size_suffix . ";\n  margin-left: 0;\n";
+      }
+      else {
+        // Other columns absorb all columns that they need to include and one
+        // less margin before them.
+        $css .= '  width: ' . (($colwidth * $i) + ($grid['gutter_width'] * ($i -1))) . $size_suffix . ";\n";
+      }
+      $css .= "}\n";
+    }
+
+    return $css;
+  }
+
+}
