diff --git a/views.install b/views.install
index 35be514..92a953b 100644
--- a/views.install
+++ b/views.install
@@ -13,6 +13,7 @@
         access varchar(255),
         -- page fields
         page int(1),
+        page_pars varchar(255),
         page_title varchar(255),
         page_header longtext,
         page_header_format int(4) NOT NULL,
@@ -32,6 +33,7 @@
         menu_title varchar(255),
         -- block fields
         block int(1),
+        block_pars varchar(255),
         block_title varchar(255),
         block_use_page_header int(1),
         block_header longtext,
@@ -133,6 +135,7 @@
         access varchar(255),
         -- page fields
         page smallint,
+        page_pars varchar(255),
         page_title varchar(255),
         page_header text,
         page_header_format smallint NOT NULL,
@@ -152,6 +155,7 @@
         menu_title varchar(255),
         -- block fields
         block smallint,
+        block_pars varchar(255),
         block_title varchar(255),
         block_use_page_header smallint,
         block_header text,
@@ -397,3 +401,10 @@ function views_update_12() {
 
   return $ret;
 }
+
+function views_update_13() {
+  $ret = array();
+  db_add_column($ret, 'view_view', 'page_pars', 'varchar(255)');
+  db_add_column($ret, 'view_view', 'block_pars', 'varchar(255)');
+  return $ret;
+}
diff --git a/views.module b/views.module
index 61e87a2..f67fcd6 100644
--- a/views.module
+++ b/views.module
@@ -784,7 +784,7 @@ function views_invalidate_cache() {
  * Provide all the fields in a view.
  */
 function _views_view_fields() {
-  return array('vid', 'name', 'description', 'access', 'page', 'page_title', 'page_header', 'page_header_format', 'page_footer', 'page_footer_format', 'page_empty', 'page_empty_format', 'page_type', 'use_pager', 'nodes_per_page', 'url', 'menu', 'menu_tab', 'menu_tab_default', 'menu_tab_weight', 'menu_title', 'block', 'block_title', 'block_use_page_header', 'block_header', 'block_header_format', 'block_use_page_footer', 'block_footer', 'block_footer_format', 'block_use_page_empty', 'block_empty', 'block_empty_format', 'block_type', 'nodes_per_block', 'block_more', 'url', 'breadcrumb_no_home', 'changed', 'view_args_php', 'is_cacheable');
+  return array('vid', 'name', 'description', 'access', 'page', 'page_pars', 'page_title', 'page_header', 'page_header_format', 'page_footer', 'page_footer_format', 'page_empty', 'page_empty_format', 'page_type', 'use_pager', 'nodes_per_page', 'url', 'menu', 'menu_tab', 'menu_tab_default', 'menu_tab_weight', 'menu_title', 'block', 'block_pars', 'block_title', 'block_use_page_header', 'block_header', 'block_header_format', 'block_use_page_footer', 'block_footer', 'block_footer_format', 'block_use_page_empty', 'block_empty', 'block_empty_format', 'block_type', 'nodes_per_block', 'block_more', 'url', 'breadcrumb_no_home', 'changed', 'view_args_php', 'is_cacheable');
 }
 
 /**
@@ -1360,6 +1360,14 @@ function theme_views_view_teasers($view, $nodes, $type) {
  * Display the nodes of a view as plain nodes.
  */
 function theme_views_view_nodes($view, $nodes, $type, $teasers = false, $links = true) {
+  if ($view->display_pars && ($view->display_pars['cols'] > 1)) {
+    if ($view->display_pars['grid']) {
+      return views_display_nodes_grid($view, $nodes, $type, $teasers, $links);
+    }
+    else {
+      return views_display_nodes_cols($view, $nodes, $type, $teasers, $links);
+    }
+  }
   foreach ($nodes as $n) {
     $node = node_load($n->nid);
     $output .= node_view($node, $teasers, false, $links);
@@ -1367,6 +1375,73 @@ function theme_views_view_nodes($view, $nodes, $type, $teasers = false, $links =
   return $output;
 }
 
+/**
+ * Display the nodes in a table-grid.
+ * Function is called if the display-parameter 'cols' is set and >1 and
+ * the display-parameter 'grid' is set.
+ * Number of columns is taken from display-parameter 'cols'.
+ */
+function views_display_nodes_grid($view, $nodes, $type, $teasers = false, $links = true) {
+  $cols = $view->display_pars['cols'];
+  $o = "<table class='views-layout-table views-layout-table-$cols-cols'>";
+  $o .= "<colgroup>";
+  for ($i = 0; $i < $cols; $i++) {
+    $o .= "<col class='views-layout-col views-layout-col-$i'/>";
+  }
+  $o .= "</colgroup>";
+  $i = 0;
+  $cell = array('class' => 'views-layout-cell');
+  while ($i < count($nodes)) {
+    if (($i % $cols) == 0) {
+      $rownum = (int) ($i / $cols);
+      $even = ($rownum % 2) ? 'even' : 'odd';
+      $o .= "<tr class='views-layout-row views-layout-row-$rownum views-layout-row-$even'>";
+    }
+    $n = node_load($nodes[$i]->nid);
+    $cell['data'] = node_view($n, $teasers, false, $links);
+    $o .= _theme_table_cell($cell);
+    $i++;
+    if (($i % $cols) == 0) $o .= "</tr>";
+  }
+  if (($i % $cols) != 0) $o .= "</tr>";
+  $o .= '</table>';
+  return $o;
+}
+
+/**
+ * Display the nodes in multiples regions (columns).
+ * Function is called if the display-parameter 'cols' is set and >1, and
+ * the display-parameter 'grid' is not set.
+ * Number of columns is taken from display-parameter 'cols'.
+ * Note: if the columns aren't css-styled to appear beside each other,
+ * they will all consume the whole width and be displayed below each other.
+ * TODO: add some default css-styles
+ */
+function views_display_nodes_cols($view, $nodes, $type, $teasers = false, $links = true) {
+  $cols = $view->display_pars['cols'];
+  $out = array();
+  for ($i = 0; $i < count($nodes); $i++) {
+    $n = node_load($nodes[$i]->nid);
+    $out[$i % $cols] .= node_view($n, $teasers, false, $links);
+  }
+  $i = 0;
+  $o = "<div class='views-layout-cols views-layout-$cols-cols'>";
+  while ($i < $cols) {
+    $o .= "<div class='views-layout-col views-layout-col-$i'>$out[$i]</div>";
+    $i++;
+  }
+  $o .= '<div class="views-layout-cols-closer"></div></div>';
+  // add some style
+  drupal_set_html_head(
+    "<style type=\"text/css\">\n" .
+    ".views-layout-$cols-cols .views-layout-col {" .
+    sprintf("  float: left; width: %d%%; }\n", 100/$cols) .
+    ".views-layout-cols-closer { clear: left; }\n" .
+    "</style>"
+  );
+  return $o;
+}
+
 function views_set_breadcrumb($view) {
   $breadcrumb = drupal_get_breadcrumb();
   if ($view->breadcrumb_no_home) {
@@ -1436,6 +1511,14 @@ function theme_views_view($view, $type, $nodes, $level = NULL, $args = NULL) {
   $plugins = _views_get_style_plugins();
   $view_type = ($type == 'block') ? $view->block_type : $view->page_type;
   if ($num_nodes || $plugins[$view_type]['even_empty']) {
+    // set display_pars if we have some
+    if ($type == 'block') {
+      $view->display_pars = unserialize($view->block_pars);
+    }
+    else {
+      $view->display_pars = unserialize($view->page_pars);
+    }
+
     if ($level !== NULL) {
       $output .= "<div class='view-summary ". views_css_safe('view-summary-'. $view->name) ."'>". views_theme($plugins[$view_type]['summary_theme'], $view, $type, $level, $nodes, $args) . '</div>';
     }
@@ -1974,7 +2057,6 @@ function theme_view($view_name, $limit = NULL, $use_pager = NULL, $type = 'embed
   }
 }
 
-
 /**
  * This function is used as a central place to manage some translatable text strings
  * that are used in different places.
diff --git a/views_ui.module b/views_ui.module
index 31e922f..3311e39 100644
--- a/views_ui.module
+++ b/views_ui.module
@@ -841,6 +841,8 @@ function views_edit_view($view, $op = '') {
     '#description' => t('How the nodes should be displayed to the user.'),
   );
 
+  $form['page-info']['page_pars'] = view_display_pars_fields($view, 'page');
+
   $form['page-info']['page_title'] = array(
     '#type' => 'textfield',
     '#title' => t('Title'),
@@ -994,6 +996,8 @@ function views_edit_view($view, $op = '') {
     '#description' => t('How the nodes should be displayed to the user.'),
   );
 
+  $form['block-info']['block_pars'] = view_display_pars_fields($view, 'block');
+
   $form['block-info']['block_title'] = array(
     '#type' => 'textfield',
     '#title' => t('Title'),
@@ -1146,6 +1150,42 @@ function views_edit_view($view, $op = '') {
 }
 
 /**
+ * Create form elements for additonal parameter for view-display
+ */
+function view_display_pars_fields(&$view, $dtype = 'page') {
+  $par_field = "{$dtype}_pars";
+  $r = array(
+    '#type' => 'fieldset',
+    '#title' => t('Advanced view display parameters'),
+    '#collapsible' => true,
+    '#collapsed' => true,
+    '#description' => t('Parameters to be passed to the theming-function.'),
+  );
+
+  $dpars = unserialize($view->$par_field);
+  if(!$dpars) $dpars = array();
+
+  $r["{$dtype}_cols"] = array(
+    '#type' => 'textfield',
+    '#title' => t('Number of columns'),
+    '#default_value' => $dpars['cols'] ? $dpars['cols'] : '',
+    '#size' => 3,
+    '#maxlength' => 3,
+  );
+  $r["{$dtype}_grid"] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show node-data in a table grid'),
+    '#default_value' => $dpars['grid'] ? $dpars['grid'] : 0,
+    '#return_value' => 1,
+    '#size' => 3,
+    '#maxlength' => 3,
+    '#description' => t('Only used when cols > 1'),
+  );
+
+  return $r;
+}
+
+/**
  * separately build a piece of the form
  */
 function views_ui_build_form(&$form) {
@@ -1778,6 +1818,10 @@ function views_edit_view_submit($form_id, $form) {
   $view->nodes_per_block = intval($view->nodes_per_block);
   $view->menu_tab_weight = intval($view->menu_tab_weight);
 
+  // get display parameters as strings
+  $view->page_pars = _views_get_display_pars($form, 'page');
+  $view->block_pars = _views_get_display_pars($form, 'block');
+
   // re-order things as they were ordered on the form.
   foreach (array('field', 'argument', 'filter', 'sort', 'exposed_filter') as $section) {
     views_ui_reorder($view->$section);
@@ -1804,6 +1848,21 @@ function views_edit_view_submit($form_id, $form) {
 }
 
 /**
+ * convert the display parameters to a serialized array
+ */
+function _views_get_display_pars(&$form, $dtype = 'page') {
+  $p = array();
+
+  $v = intval($form["{$dtype}_cols"]);
+  if($v > 1) $p['cols'] = $v;
+
+  $v = (boolean) $form["{$dtype}_grid"];
+  if($v) $p['grid'] = 1;
+
+  return serialize($p);
+}
+
+/**
  * Validate a view with a type: list.
  */
 function views_ui_plugin_validate_list($type, $view, $form) {
