diff --git a/plugins/grid/views_bootstrap_grid_plugin_style.inc b/plugins/grid/views_bootstrap_grid_plugin_style.inc
index 9460652..d790f46 100644
--- a/plugins/grid/views_bootstrap_grid_plugin_style.inc
+++ b/plugins/grid/views_bootstrap_grid_plugin_style.inc
@@ -14,8 +14,14 @@ class ViewsBootstrapGridPluginStyle extends views_plugin_style {
   public function option_definition() {
     $options = parent::option_definition();
     $options['alignment'] = array('default' => 'horizontal');
-    $options['columns'] = array('default' => 2);
-    $options['class_prefix'] = array('default' => 'col-sm');
+    $options['columns_horizontal'] = array('default' => -1);
+    $options['columns_vertical'] = array('default' => 4);
+    $options['clear_columns'] = array('default' => TRUE, 'bool' => TRUE);
+    $options['columns_xs'] = array('default' => 12);
+    $options['columns_sm'] = array('default' => 6);
+    $options['columns_md'] = array('default' => 4);
+    $options['columns_lg'] = array('default' => 3);
+
     return $options;
   }
 
@@ -32,33 +38,113 @@ class ViewsBootstrapGridPluginStyle extends views_plugin_style {
         'horizontal' => t('Horizontal'),
         'vertical' => t('Vertical'),
       ),
-      '#description' => t('Horizontal alignment will place items starting in the upper left and moving right.
-      Vertical alignment will place items starting in the upper left and moving down.'),
+      '#required' => TRUE,
+      '#description' => t('Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down.'),
       '#default_value' => $this->options['alignment'],
     );
 
-    $options = array(1, 2, 3, 4, 6, 12);
+    $options = array(
+      1 => 1,
+      2 => 2,
+      3 => 3,
+      4 => 4,
+      6 => 6,
+      12 => 12,
+    );
 
-    $form['columns'] = array(
+    // Number of columns wrapped in a views row for horizontal alignment.
+    $form['columns_horizontal'] = array(
       '#type' => 'select',
-      '#title' => t('Number of columns'),
-      '#options' => array_combine($options, $options),
+      '#title' => t('Number of columns per views row'),
+      '#options' => array(-1 => 'Single row', 0 => 'Auto') + $options,
       '#required' => TRUE,
-      '#default_value' => $this->options['columns'],
+      '#description' => t('Choose the number of columns that views will wrap in a single row. This will be reflected in the HTML structure rendered regardless of the device size. When the "Single row" value is selected, all columns will be wrapped in one row.'),
+      '#default_value' => $this->options['columns_horizontal'],
+      '#states' => array(
+        'visible' => array(
+          'input[name="style_options[alignment]"]' => array('value' => 'horizontal'),
+        ),
+      ),
     );
 
-    $form['class_prefix'] = array(
+    // Number of columns for vertical alignment.
+    $form['columns_vertical'] = array(
       '#type' => 'select',
-      '#title' => t('Class prefix'),
-      '#description' => t('Defines the default prefix to use for column classes.'),
-      '#default_value' => $this->options['class_prefix'],
+      '#title' => t('Number of columns'),
+      '#options' => $options,
       '#required' => TRUE,
-      '#options' => array(
-        'col-xs' => t('Extra Small'),
-        'col-sm' => t('Small'),
-        'col-md' => t('Medium'),
-        'col-lg' => t('Large'),
+      '#description' => t('Choose the number of columns that content will be split into'),
+      '#default_value' => $this->options['columns_vertical'],
+      '#states' => array(
+        'visible' => array(
+          'input[name="style_options[alignment]"]' => array('value' => 'vertical'),
+        ),
       ),
     );
+
+    // Whether to clear the columns; available only in horizontal alignment and
+    // when the "Single row" option is selected.
+    $form['clear_columns'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Clear columns per device size'),
+      '#description' => t('When this option is selected, clearfix divs will be used to "clear" the columns as needed per device size (see related ') . '<a target="_blank" href="http://getbootstrap.com/css/#grid-example-mixed-complete">' . t('Bootstrap documentation') . '</a>. ' . t('This option applies only when "Single row" is selected for the "Number of columns per view row" option'),
+      '#default_value' => $this->options['clear_columns'],
+      '#states' => array(
+        'visible' => array(
+          'input[name="style_options[alignment]"]' => array('value' => 'horizontal'),
+          'select[name="style_options[columns_horizontal]"]' => array('value' => -1),
+        ),
+      ),
+    );
+
+    // Number of columns per device size. To be used for generating css classes.
+    // Options are the same for all device sizes.
+    $options = array(
+      12 => 1,
+      6 => 2,
+      4 => 3,
+      3 => 4,
+      2 => 6,
+      1 => 12,
+    );
+
+    $form['columns_xs'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of columns for extra small devices'),
+      '#options' => $options,
+      '#required' => TRUE,
+      '#description' => t('Choose the number of columns for a particular device size and up. This affects the css classes that will be applied to the columns and not the actual HTML structure that will be rendered. Not defining the number of columns for a device size will result in inheriting the number of columns from one size below.'),
+      '#default_value' => $this->options['columns_xs'],
+    );
+
+    // Add option to not define the number of columns for the rest.
+    $options[0] = 'Do not define';
+
+    $form['columns_sm'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of columns for small devices'),
+      '#options' => $options,
+      '#required' => FALSE,
+      '#description' => t('See the description on the number of columns for extra small devices.'),
+      '#default_value' => $this->options['columns_sm'],
+    );
+
+    $form['columns_md'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of columns for medium devices'),
+      '#options' => $options,
+      '#required' => FALSE,
+      '#description' => t('See the description on the number of columns for extra small devices.'),
+      '#default_value' => $this->options['columns_md'],
+    );
+
+    $form['columns_lg'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of columns for large devices'),
+      '#options' => $options,
+      '#required' => FALSE,
+      '#description' => t('See the description on the number of columns for extra small devices.'),
+      '#default_value' => $this->options['columns_lg'],
+    );
   }
 }
diff --git a/plugins/thumbnail/views_bootstrap_thumbnail_plugin_style.inc b/plugins/thumbnail/views_bootstrap_thumbnail_plugin_style.inc
index e615440..4931492 100644
--- a/plugins/thumbnail/views_bootstrap_thumbnail_plugin_style.inc
+++ b/plugins/thumbnail/views_bootstrap_thumbnail_plugin_style.inc
@@ -14,8 +14,13 @@ class ViewsBootstrapThumbnailPluginStyle extends views_plugin_style {
   public function option_definition() {
     $options = parent::option_definition();
     $options['alignment'] = array('default' => 'horizontal');
-    $options['columns'] = array('default' => 4);
-    $options['class_prefix'] = array('default' => 'col-sm');
+    $options['columns_horizontal'] = array('default' => -1);
+    $options['columns_vertical'] = array('default' => 4);
+    $options['clear_columns'] = array('default' => TRUE, 'bool' => TRUE);
+    $options['columns_xs'] = array('default' => 12);
+    $options['columns_sm'] = array('default' => 6);
+    $options['columns_md'] = array('default' => 4);
+    $options['columns_lg'] = array('default' => 3);
     return $options;
   }
 
@@ -32,33 +37,112 @@ class ViewsBootstrapThumbnailPluginStyle extends views_plugin_style {
         'horizontal' => t('Horizontal'),
         'vertical' => t('Vertical'),
       ),
-      '#description' => t('Horizontal alignment will place items starting in the upper left and moving right.
-      Vertical alignment will place items starting in the upper left and moving down.'),
+      '#description' => t('Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down.'),
       '#default_value' => $this->options['alignment'],
     );
 
-    $options = array(1, 2, 3, 4, 6, 12);
+    $options = array(
+      1 => 1,
+      2 => 2,
+      3 => 3,
+      4 => 4,
+      6 => 6,
+      12 => 12,
+    );
 
-    $form['columns'] = array(
+    // Number of columns wrapped in a views row for horizontal alignment.
+    $form['columns_horizontal'] = array(
       '#type' => 'select',
-      '#title' => t('Number of columns'),
-      '#options' => array_combine($options, $options),
+      '#title' => t('Number of columns per views row'),
+      '#options' => array(-1 => 'Single row', 0 => 'Auto') + $options,
       '#required' => TRUE,
-      '#default_value' => $this->options['columns'],
+      '#description' => t('Choose the number of columns that views will wrap in a single row. This will be reflected in the HTML structure rendered regardless of the device size. When the "Single row" value is selected, all columns will be wrapped in one row.'),
+      '#default_value' => $this->options['columns_horizontal'],
+      '#states' => array(
+        'visible' => array(
+          'input[name="style_options[alignment]"]' => array('value' => 'horizontal'),
+        ),
+      ),
     );
 
-    $form['class_prefix'] = array(
+    // Number of columns for vertical alignment.
+    $form['columns_vertical'] = array(
       '#type' => 'select',
-      '#title' => t('Class prefix'),
-      '#description' => t('Defines the default prefix to use for column classes.'),
-      '#default_value' => $this->options['class_prefix'],
+      '#title' => t('Number of columns'),
+      '#options' => $options,
       '#required' => TRUE,
-      '#options' => array(
-        'col-xs' => t('Extra Small'),
-        'col-sm' => t('Small'),
-        'col-md' => t('Medium'),
-        'col-lg' => t('Large'),
+      '#description' => t('Choose the number of columns that content will be split into'),
+      '#default_value' => $this->options['columns_vertical'],
+      '#states' => array(
+        'visible' => array(
+          'input[name="style_options[alignment]"]' => array('value' => 'vertical'),
+        ),
+      ),
+    );
+
+    // Whether to clear the columns; available only in horizontal alignment and
+    // when the "Single row" option is selected.
+    $form['clear_columns'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Clear columns per device size'),
+      '#description' => t('When this option is selected, clearfix divs will be used to "clear" the columns as needed per device size (see related ') . '<a target="_blank" href="http://getbootstrap.com/css/#grid-example-mixed-complete">' . t('Bootstrap documentation') . '</a>. ' . t('This option applies only when "Single row" is selected for the "Number of columns per view row" option'),
+      '#default_value' => $this->options['clear_columns'],
+      '#states' => array(
+        'visible' => array(
+          'input[name="style_options[alignment]"]' => array('value' => 'horizontal'),
+          'select[name="style_options[columns_horizontal]"]' => array('value' => -1),
+        ),
       ),
     );
+
+    // Number of columns per device size. To be used for generating css classes.
+    // Options are the same for all device sizes.
+    $options = array(
+      12 => 1,
+      6 => 2,
+      4 => 3,
+      3 => 4,
+      2 => 6,
+      1 => 12,
+    );
+
+    $form['columns_xs'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of columns for extra small devices'),
+      '#options' => $options,
+      '#required' => TRUE,
+      '#description' => t('Choose the number of columns for a particular device size and up. This affects the css classes that will be applied to the columns and not the actual HTML structure that will be rendered. Not defining the number of columns for a device size will result in inheriting the number of columns from one size below.'),
+      '#default_value' => $this->options['columns_xs'],
+    );
+
+    // Add option to not define the number of columns for the rest.
+    $options[0] = 'Do not define';
+
+    $form['columns_sm'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of columns for small devices'),
+      '#options' => $options,
+      '#required' => FALSE,
+      '#description' => t('See the description on the number of columns for extra small devices.'),
+      '#default_value' => $this->options['columns_sm'],
+    );
+
+    $form['columns_md'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of columns for medium devices'),
+      '#options' => $options,
+      '#required' => FALSE,
+      '#description' => t('See the description on the number of columns for extra small devices.'),
+      '#default_value' => $this->options['columns_md'],
+    );
+
+    $form['columns_lg'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of columns for large devices'),
+      '#options' => $options,
+      '#required' => FALSE,
+      '#description' => t('See the description on the number of columns for extra small devices.'),
+      '#default_value' => $this->options['columns_lg'],
+    );
   }
 }
diff --git a/templates/grid/theme.inc b/templates/grid/theme.inc
index a8379c8..5faec49 100644
--- a/templates/grid/theme.inc
+++ b/templates/grid/theme.inc
@@ -4,14 +4,5 @@
  * Implementation of template preprocess for the view.
  */
 function template_preprocess_views_bootstrap_grid_plugin_style(&$vars) {
-  $view     = $vars['view'];
-  $options  = $view->style_plugin->options;
-  $horizontal = ($options['alignment'] === 'horizontal');
-
-  $columns = $options['columns'];
-
-  // Split items by rows and columns.
-  $vars['items'] = _views_bootstrap_split_rows($vars, $columns, $horizontal);
-  $vars['column_type'] = 12 / $columns;
-  $vars['class_prefix'] = $options['class_prefix'] ?: 'col-sm';
+  _views_bootstrap_preproces_views_style_plugin_prepare_grid($vars);
 }
diff --git a/templates/grid/views-bootstrap-grid-plugin-style.tpl.php b/templates/grid/views-bootstrap-grid-plugin-style.tpl.php
index d6bea6c..ed53236 100644
--- a/templates/grid/views-bootstrap-grid-plugin-style.tpl.php
+++ b/templates/grid/views-bootstrap-grid-plugin-style.tpl.php
@@ -23,10 +23,21 @@
 
     <?php foreach ($items as $row): ?>
       <div class="row">
-        <?php foreach ($row['content'] as $column): ?>
-          <div class="col <?php print $class_prefix ?>-<?php print $column_type ?>">
+        <?php foreach ($row['content'] as $key => $column): ?>
+          <div class="<?php print $col_classes ?>">
+
             <?php print $column['content'] ?>
+
           </div>
+
+          <?php /* Add clearfix divs if required */ ?>
+          <?php if ($options['columns_horizontal'] == -1 && !empty($options['clear_columns']) && $key != 0): ?>
+            <?php foreach ($clearfix as $screen => $count): ?>
+              <?php if (($key + 1) % $count == 0): ?>
+                <div class="clearfix visible-<?php print $screen; ?>-block"></div>
+              <?php endif; ?>
+            <?php endforeach; ?>
+          <?php endif; ?>
         <?php endforeach ?>
       </div>
     <?php endforeach ?>
@@ -35,9 +46,11 @@
 
     <div class="row">
       <?php foreach ($items as $column): ?>
-        <div class="col <?php print $class_prefix ?>-<?php print $column_type ?>">
+        <div class="<?php print $col_classes ?>">
           <?php foreach ($column['content'] as $row): ?>
-            <?php print $row['content'] ?>
+
+              <?php print $row['content'] ?>
+
           <?php endforeach ?>
         </div>
       <?php endforeach ?>
diff --git a/templates/thumbnail/theme.inc b/templates/thumbnail/theme.inc
index e3bb4db..86a182a 100644
--- a/templates/thumbnail/theme.inc
+++ b/templates/thumbnail/theme.inc
@@ -4,16 +4,7 @@
  * Implementation of template preprocess for the view.
  */
 function template_preprocess_views_bootstrap_thumbnail_plugin_style(&$vars) {
-  $view     = $vars['view'];
-  $options  = $view->style_plugin->options;
-  $horizontal = ($options['alignment'] === 'horizontal');
-
-  $columns = $options['columns'];
-
-  // Split items by rows and columns.
-  $vars['items'] = _views_bootstrap_split_rows($vars, $columns, $horizontal);
-  $vars['column_type'] = 12 / $columns;
-  $vars['class_prefix'] = $options['class_prefix'] ?: 'col-sm';
+  _views_bootstrap_preproces_views_style_plugin_prepare_grid($vars);
 }
 
 /**
diff --git a/templates/thumbnail/views-bootstrap-thumbnail-plugin-style.tpl.php b/templates/thumbnail/views-bootstrap-thumbnail-plugin-style.tpl.php
index 656ea81..9e1de00 100644
--- a/templates/thumbnail/views-bootstrap-thumbnail-plugin-style.tpl.php
+++ b/templates/thumbnail/views-bootstrap-thumbnail-plugin-style.tpl.php
@@ -21,12 +21,23 @@
 
     <?php foreach ($items as $row): ?>
       <div class="row">
-        <?php foreach ($row['content'] as $column): ?>
-          <div class="col <?php print $class_prefix ?>-<?php print $column_type ?>">
+        <?php foreach ($row['content'] as $key => $column): ?>
+          <div class="<?php print $col_classes ?>">
+
             <div class="thumbnail">
               <?php print $column['content'] ?>
             </div>
+
           </div>
+
+          <?php /* Add clearfix divs if required */ ?>
+          <?php if ($options['columns_horizontal'] == -1 && !empty($options['clear_columns']) && $key != 0): ?>
+            <?php foreach ($clearfix as $screen => $count): ?>
+              <?php if (($key + 1) % $count == 0): ?>
+                <div class="clearfix visible-<?php print $screen; ?>-block"></div>
+              <?php endif; ?>
+            <?php endforeach; ?>
+          <?php endif; ?>
         <?php endforeach ?>
       </div>
     <?php endforeach ?>
@@ -35,10 +46,12 @@
 
     <div class="row">
       <?php foreach ($items as $column): ?>
-        <div class="col <?php print $class_prefix ?>-<?php print $column_type ?>">
+        <div class="<?php print $col_classes ?>">
           <?php foreach ($column['content'] as $row): ?>
             <div class="thumbnail">
+
               <?php print $row['content'] ?>
+
             </div>
           <?php endforeach ?>
         </div>
diff --git a/views_bootstrap.module b/views_bootstrap.module
index 2c6f607..8ad4031 100644
--- a/views_bootstrap.module
+++ b/views_bootstrap.module
@@ -12,61 +12,152 @@ function views_bootstrap_views_api() {
 }
 
 /**
- * Split items by rows and columns.
- * - Stolen from Drupal 8 template_preprocess_views_view_grid().
+ * Distribute items in rows/columns as required for horizontal alignment.
  *
- * @param $vars
- * @param $columns
- * @param bool $horizontal
+ * @param array $rows The rendered views result rows.
+ * @param int $nb_columns The desired number of columns per row.
  *
- * @return array
- *
- * @TODO: Use array_chunk().
+ * @return array A multi-dimensional array with the calculated rows and columns.
  */
-function _views_bootstrap_split_rows($vars, $columns, $horizontal = TRUE) {
+function _views_bootstrap_split_rows_horizontal($results, $nb_columns) {
   $col = 0;
   $row = 0;
   $items = array();
-  $remainders = count($vars['rows']) % $columns;
-  $num_rows = floor(count($vars['rows']) / $columns);
 
   // Iterate over each rendered views result row.
-  foreach ($vars['rows'] as $item) {
-
+  foreach ($results as $item) {
     // Add the item.
-    if ($horizontal) {
-      $items[$row]['content'][$col]['content'] = $item;
+    $items[$row]['content'][$col]['content'] = $item;
+
+    // If we've reached the maximum number of columns per row, reset the column
+    // index and proceed to the next row.
+    if ($col == ($nb_columns - 1)) {
+      $col = 0;
+      $row++;
     }
+    // Otherwise, proceed to the next column.
     else {
-      $items[$col]['content'][$row]['content'] = $item;
+      $col++;
     }
+  }
+
+  return $items;
+}
+
+/**
+ * Distribute items in columns as required for vertical alignment.
+ *
+ * @param array $rows The rendered views result rows.
+ * @param int $nb_columns The desired number of columns per row.
+ *
+ * @return array A multi-dimensional array with the calculated columns.
+ */
+function _views_bootstrap_split_rows_vertical($rows, $nb_columns) {
+  $col = 0;
+  $row = 0;
+  $items = array();
+  $remainders = count($rows) % $nb_columns;
+  $num_rows = floor(count($rows) / $nb_columns);
+
+  // Iterate over each rendered views result row.
+  foreach ($rows as $item) {
+    // Add the item.
+    $items[$col]['content'][$row]['content'] = $item;
 
     // Increase, decrease or reset appropriate integers.
-    if ($horizontal) {
-      if ($col == 0 && $col != ($columns - 1)) {
-        $col++;
-      }
-      elseif ($col >= ($columns - 1)) {
-        $col = 0;
-        $row++;
-      }
-      else {
-        $col++;
-      }
+    $row++;
+    if (!$remainders && $row == $num_rows) {
+      $row = 0;
+      $col++;
     }
-    else {
-      $row++;
-      if (!$remainders && $row == $num_rows) {
-        $row = 0;
-        $col++;
+    elseif ($remainders && $row == $num_rows + 1) {
+      $row = 0;
+      $col++;
+      $remainders--;
+    }
+  }
+
+  return $items;
+}
+
+/**
+ * View preprocessing that prepares the results as a Bootstrap grid.
+ *
+ * Depending on the options selected on the style plugin handler, this function
+ * distributes the results into rows and columns, calculates where clearfix divs
+ * should be added (if applicable), and prepares the bootstrap classes that
+ * should be added to each column.
+ *
+ * Used by the Bootstrap Grid and Bootstrap Thumbnail plugins.
+ *
+ * @see template_preprocess_views_bootstrap_grid_plugin_style().
+ * @see template_preprocess_views_bootstrap_thumbnail_plugin_style().
+ */
+function _views_bootstrap_preproces_views_style_plugin_prepare_grid(&$vars) {
+  $options = $vars['view']->style_options;
+
+  // Prepare column css classes. Add the class for each device size if set and if
+  // different than 0 ("Do not define" option).
+  $vars['col_classes'] = '';
+  foreach (array('xs', 'sm', 'md', 'lg') as $size) {
+    if (!empty($options["columns_$size"])) {
+      $vars['col_classes'] .= ' col-'.$size.'-'.$options["columns_$size"];
+    }
+  }
+
+  if ($options['alignment'] === 'horizontal') {
+    _views_bootstrap_preprocess_views_style_plugin_prepare_grid_horizontal($vars);
+    return;
+  }
+
+  _views_bootstrap_preprocess_views_style_plugin_prepare_grid_vertical($vars);
+}
+
+/**
+ * Further preprocessing for horizontal alignment.
+ * @see _views_bootstrap_preproces_views_style_plugin_prepare_grid().
+ */
+function _views_bootstrap_preprocess_views_style_plugin_prepare_grid_horizontal(&$vars) {
+  $options = $vars['view']->style_options;
+
+  // If columns are set to 0 (Auto), apply the maximum from the number of columns
+  // defined per device size.
+  if (!$options['columns_horizontal']) {
+    $options['columns_horizontal'] = 1;
+    foreach (array('xs', 'sm', 'md', 'lg') as $size) {
+      if (isset($options["columns_$size"]) && $options["columns_$size"] > 0) {
+        $tmpColumns = 12 / $options["columns_$size"];
+        if ($tmpColumns > $options['columns_horizontal']) {
+          $options['columns_horizontal'] = $tmpColumns;
+        }
       }
-      elseif ($remainders && $row == $num_rows + 1) {
-        $row = 0;
-        $col++;
-        $remainders--;
+    }
+  }
+
+  // Distribute items in rows and columns.
+  $vars['items'] = _views_bootstrap_split_rows_horizontal($vars['rows'], $options['columns_horizontal']);
+
+  // If the number of columns is set to -1 ("Single row" option), calculate the
+  // number of columns after which the clearfix divs should be placed for each
+  // screen size. No clearfix is necessary for large screens (lg) and when the
+  // size of the column is 12 (full row).
+  if ($options['columns_horizontal'] == -1) {
+    $vars['clearfix'] = array();
+    foreach (array('xs', 'sm', 'md', 'lg') as $size) {
+      if (!empty($options["columns_$size"]) && $options["columns_$size"] != 12) {
+        $vars['clearfix'][$size] = 12 / $options["columns_$size"];
       }
     }
   }
+}
 
-  return $items;
+/**
+ * Further preprocessing for vertical alignment.
+ * @see _views_bootstrap_preproces_views_style_plugin_prepare_grid().
+ */
+function _views_bootstrap_preprocess_views_style_plugin_prepare_grid_vertical(&$vars) {
+  $options = $vars['view']->style_options;
+
+  // Distribute items in rows and columns.
+  $vars['items'] = _views_bootstrap_split_rows_vertical($vars['rows'], $options['columns_vertical']);
 }
