diff --git a/plugins/views_plugin_style_table.inc b/plugins/views_plugin_style_table.inc
index 45ed976..69b83a5 100644
--- a/plugins/views_plugin_style_table.inc
+++ b/plugins/views_plugin_style_table.inc
@@ -31,6 +31,8 @@ class views_plugin_style_table extends views_plugin_style {
     $options['default'] = array('default' => '');
     $options['info'] = array('default' => array());
     $options['override'] = array('default' => TRUE, 'bool' => TRUE);
+    $options['sort_remember'] = array('default' => FALSE, 'bool' => TRUE);
+    $options['sort_remember_roles'] = array('default' => array());
     $options['sticky'] = array('default' => FALSE, 'bool' => TRUE);
     $options['order'] = array('default' => 'asc');
     $options['caption'] = array('default' => '', 'translatable' => TRUE);
@@ -63,17 +65,26 @@ class views_plugin_style_table extends views_plugin_style {
    * Add our actual sort criteria
    */
   function build_sort_post() {
+    $session = &$this->get_session_sort_order();
     if (!isset($_GET['order'])) {
+      $remember = !empty($session['sort_by']);
       // check for a 'default' clicksort. If there isn't one, exit gracefully.
-      if (empty($this->options['default'])) {
+      if (!$remember && empty($this->options['default'])) {
         return;
       }
-      $sort = $this->options['default'];
-      if (!empty($this->options['info'][$sort]['default_sort_order'])) {
-        $this->order = $this->options['info'][$sort]['default_sort_order'];
+      if ($remember) {
+        // Get persisted sort from session.
+        $sort = $session['sort_by'];
+        $this->order = !empty($session['sort_order']) ? $session['sort_order'] : 'asc';
       }
       else {
-        $this->order = !empty($this->options['order']) ? $this->options['order'] : 'asc';
+        $sort = $this->options['default'];
+        if (!empty($this->options['info'][$sort]['default_sort_order'])) {
+          $this->order = $this->options['info'][$sort]['default_sort_order'];
+        }
+        else {
+          $this->order = !empty($this->options['order']) ? $this->options['order'] : 'asc';
+        }
       }
     }
     else {
@@ -95,11 +106,44 @@ class views_plugin_style_table extends views_plugin_style {
     // Store the $sort for later use.
     $this->active = $sort;
 
+    // Persist sort order.
+    if ($session) {
+      $session['sort_by'] = $sort;
+      $session['sort_order'] = $this->order;
+    }
+
     // Tell the field to click sort.
     $this->view->field[$sort]->click_sort($this->order);
   }
 
   /**
+   * Get session variable where persistent sort order is
+   * saved.
+   *
+   * @return &array || FALSE
+   *    FALSE if remember is disabled, otherwise array containing
+   *    sort order info:
+   *    - sort_by: Field to sort by.
+   *    - sort_order: asc or desc.
+   */
+  function &get_session_sort_order() {
+    // Persist sort order to user session.
+    if ($this->options['sort_remember']) {
+      $allowed_rids = array_filter($this->options['sort_remember_roles']);
+      $intersect_rids = array_intersect_key($allowed_rids, $GLOBALS['user']->roles);
+      if (!empty($intersect_rids)) {
+        $session = &$_SESSION['views'][$this->view->name][$this->view->current_display];
+        $session_sort = array(
+          'sort_by' => &$session['sort_by'],
+          'sort_order' => &$session['sort_order'],
+        );
+        return $session_sort;
+      }
+    }
+    return FALSE;
+  }
+
+  /**
    * Normalize a list of columns based upon the fields that are
    * available. This compares the fields stored in the style handler
    * to the list of fields actually in the view, removing fields that
@@ -173,6 +217,28 @@ class views_plugin_style_table extends views_plugin_style {
       '#default_value' => !empty($this->options['override']),
     );
 
+    $form['sort_remember'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Remember sort order'),
+      '#description' => t('Enable to remember the last sort order made by the user.'),
+      '#default_value' => $this->options['sort_remember'],
+      '#dependency' => array('edit-style-options-override' => array(TRUE)),
+    );
+
+    $role_options = array_map('check_plain', user_roles());
+    $form['sort_remember_roles'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('User roles'),
+      '#description' => t('Remember sort order only for the selected user role(s). If you select no roles, the exposed data will never be stored.'),
+      '#default_value' => $this->options['sort_remember_roles'],
+      '#options' => $role_options,
+      '#states' => array(
+        'visible' => array(
+          '#edit-style-options-sort-remember' => array('checked' => TRUE),
+        ),
+      ),
+    );
+
     $form['sticky'] = array(
       '#type' => 'checkbox',
       '#title' => t('Enable Drupal style "sticky" table headers (Javascript)'),
