diff --git a/sites/all/modules/contrib/draggableviews/README.txt b/sites/all/modules/contrib/draggableviews/README.txt
index c509432..545abab 100644
--- a/sites/all/modules/contrib/draggableviews/README.txt
+++ b/sites/all/modules/contrib/draggableviews/README.txt
@@ -1,5 +1,6 @@
 DraggableViews
----------------
+==============
+
 This module provides dragging entities and saving their order.
 
 Quick install:
@@ -13,3 +14,34 @@ Quick install:
 In the case of table standard drupal tabledrag.js javascript is used.
 
 We also support jQuery UI Sortable javascript. In order to use it please set display style HTML List.
+
+Permissions
+===========
+
+Please add "Access draggable views" permission to users who should be able to reorder views.
+
+Arguments handling
+==================
+
+Every time we save the order of a view, current set of arguments are saved with order.
+You can see this in draggableviews_structure table "args" column. By default when we display order we use all
+currently passed arguments to a view to "match" arguments in "args" column. This means that we can create
+a view with contextual filter or exposed filter criteria and save different orders for different sets of arguments.
+
+We can also completely ignore passed arguments using "Do not use any arguments (use empty arguments)" option
+in Arguments handling of Sort criteria Draggable views weight. Be aware that in this case empty arguments set
+will be used. So you can set order for a view when no arguments passed and then whatever arguments passed,
+empty set will be used.
+
+Prepare arguments with PHP code is an option when you would like to alter arguments before they passed to
+"matching" with "args" column. For us this means that we can create for example several exposed filters,
+but pass values of only one of values of exposed filters instead of all of them (like we create two exposed
+filters: author and node type, but take into account for ordering only node type).
+Please be aware that in PHP code arguments are passed as $arguments variable and you should return array.
+Contextual filters are number keyed and exposed filters are name keyed.
+
+Contextual link "Order view"
+============================
+
+If there is view with sort order draggableviews weight and the order is set by another view we show "Order view"
+contextual link for opening a view that sets the order.
diff --git a/sites/all/modules/contrib/draggableviews/draggableviews.info b/sites/all/modules/contrib/draggableviews/draggableviews.info
index ec9c90f..7e1c208 100644
--- a/sites/all/modules/contrib/draggableviews/draggableviews.info
+++ b/sites/all/modules/contrib/draggableviews/draggableviews.info
@@ -7,9 +7,9 @@ core = 7.x
 files[] = views/draggableviews_handler_field_draggable.inc
 files[] = views/draggableviews_handler_sort.inc
 files[] = views/draggableviews_join_handler.inc
-; Information added by drupal.org packaging script on 2011-12-17
+; Information added by drupal.org packaging script on 2012-01-21
 version = "7.x-2.x-dev"
 core = "7.x"
 project = "draggableviews"
-datestamp = "1324080854"
+datestamp = "1327148306"
 
diff --git a/sites/all/modules/contrib/draggableviews/draggableviews.install b/sites/all/modules/contrib/draggableviews/draggableviews.install
index 5341380..00bb4cb 100644
--- a/sites/all/modules/contrib/draggableviews/draggableviews.install
+++ b/sites/all/modules/contrib/draggableviews/draggableviews.install
@@ -12,6 +12,12 @@ function draggableviews_schema() {
   $schema['draggableviews_structure'] = array(
     'description' => 'The table saves the order settings of an draggableview.',
     'fields' => array(
+      'dvid' => array(
+        'description' => 'The primary identifier.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
       'view_name' => array(
         'description' => 'Makes the order unique for each view.',
         'type' => 'varchar',
@@ -47,7 +53,10 @@ function draggableviews_schema() {
         'default' => 0,
       ),
     ),
-//    'primary key' => array('entity_id', 'view_name', 'view_display', 'args'),
+    'unique keys' => array(
+      'dvid' => array('dvid'),
+    ),
+    'primary key' => array('dvid'),
   );
   return $schema;
 }
diff --git a/sites/all/modules/contrib/draggableviews/draggableviews.module b/sites/all/modules/contrib/draggableviews/draggableviews.module
index 8cb95b4..ea0bd8d 100644
--- a/sites/all/modules/contrib/draggableviews/draggableviews.module
+++ b/sites/all/modules/contrib/draggableviews/draggableviews.module
@@ -19,24 +19,33 @@ function draggableviews_views_api() {
 function draggableviews_views_form_submit($form, &$form_state) {
   $fv = $form_state['values'];
 
+  // Ensure view object exists.
+  if (!isset($fv['view'])) {
+    return;
+  }
   $view = $fv['view'];
   $view_name = $view->name;
   $view_display = $view->current_display;
-  $args_string = json_encode($view->args);
+  // View arguments.
+  $arguments = $view->args;
+  if (isset($view->exposed_input)) {
+    $arguments += $view->exposed_input;
+    ksort($arguments);
+    // Redirect view to the same page with exposed filters set.
+    $form_state['redirect'] = array(current_path(), array('query' => $view->exposed_input));
+  }
+  $args_string = json_encode($arguments);
 
   // Save records to our custom table.
   foreach ($fv['draggableviews'] as $item) {
     // Delete previous order record.
-    db_query('DELETE FROM {draggableviews_structure} WHERE
-      view_name = :view_name
-      AND view_display = :view_display
-      AND args = :args
-      AND entity_id = :entity_id', array(
-        ':view_name' => $view_name,
-        ':view_display' => $view_display,
-        ':args' => $args_string,
-        ':entity_id' => $item['id'],
-      ));
+    db_delete('draggableviews_structure')
+      ->condition('view_name', $view_name)
+      ->condition('view_display', $view_display)
+      ->condition('args', $args_string)
+      ->condition('entity_id', $item['id'])
+      ->execute();
+
     // Create new order record.
     $record = array(
       'view_name' => $view_name,
@@ -61,6 +70,11 @@ function draggableviews_views_form_submit($form, &$form_state) {
  */
 function draggableviews_form_alter(&$form, &$form_state, $form_id) {
   if (isset($form['draggableviews']) && !empty($form['draggableviews'])) {
+    // Check permissions.
+    if (!user_access('access draggableviews')) {
+      $form['actions']['submit']['#access'] = FALSE;
+      return;
+    }
     $label = $form['view']['#value']->field['draggableviews']->options['draggableviews']['save_button_label'];
     $form['actions']['submit']['#value'] = t($label);
   }
@@ -75,6 +89,11 @@ function draggableviews_preprocess_views_view_table(&$vars) {
     return;
   }
 
+  // Check permissions.
+  if (!user_access('access draggableviews')) {
+    return;
+  }
+
   // Add table class.
   $vars['classes_array'][] = 'draggable';
 
@@ -98,6 +117,11 @@ function draggableviews_preprocess_views_view_list(&$vars) {
     return;
   }
 
+  // Check permissions.
+  if (!user_access('access draggableviews')) {
+    return;
+  }
+
   // Add class to ul item of the view.
   $class = 'draggableviews-grid-' . rand(0, 1000);
   $vars['list_type_prefix'] = str_replace('>', ' class="' . $class . '">', $vars['list_type_prefix']);
@@ -110,3 +134,97 @@ function draggableviews_preprocess_views_view_list(&$vars) {
   drupal_add_js(drupal_get_path('module', 'draggableviews') . '/js/draggableviews_list.js');
   drupal_add_css(drupal_get_path('module', 'draggableviews') . '/css/draggableviews_list.css');
 }
+
+/**
+ * Implements hook_permission().
+ */
+function draggableviews_permission() {
+  return array(
+    'access draggableviews' => array(
+      'title' => t('Access draggable views'),
+      'description' => t('Give users the right to sort their views'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_contextual_links_view_alter().
+ *
+ * Adds "Order view" contextual link.
+ */
+function draggableviews_contextual_links_view_alter(&$element, $items) {
+  // Check permission to use draggable.
+  if (!user_access('access draggableviews')) {
+    return;
+  }
+  // Remove contextual links from being rendered, when so desired, such as
+  // within a View preview.
+  if (views_ui_contextual_links_suppress()) {
+    $element['#links'] = array();
+  }
+  // Append the display ID to the Views UI edit links, so that clicking on the
+  // contextual link takes you directly to the correct display tab on the edit
+  // screen.
+  elseif (!empty($element['#links']['views-ui-edit']) && !empty($element['#element']['#views_contextual_links_info']['views_ui']['view_display_id'])) {
+    $display_id = $element['#element']['#views_contextual_links_info']['views_ui']['view_display_id'];
+    $view_name = $element['#element']['#views_contextual_links_info']['views_ui']['view_name'];
+    $view = views_get_view($view_name);
+    $view->build($display_id);
+
+    // Proceed only if there is draggableviews weight sort criteria available.
+    if (!$sort_key = draggable_views_get_draggable_sort($view)) {
+      return;
+    }
+
+    // Proceed only if order view is no self.
+    $order_view_display = $view->sort['weight']->options['draggableviews_setting_view'];
+    if ($order_view_display == 'self') {
+      return;
+    }
+    list($order_view_name, $order_view_display_id) = explode(':', $order_view_display);
+    // Load order view and check its path.
+    $order_view = views_get_view($order_view_name);
+    if (isset($order_view->display[$order_view_display_id]->display_options['path'])) {
+      $path = $order_view->display[$order_view_display_id]->display_options['path'];
+      $element['#links']['draggableviews-order'] = array(
+        'title' => t('Order view'),
+        'href' => $path,
+        'query' => array('destination' => current_path()),
+      );
+    }
+  }
+}
+
+/**
+ * Get the draggable views weight sort of a view if there is one and return its
+ * ID. If there are multiple of these sorts the first is returned.
+ *
+ * @param $view
+ *   The view object.
+ *
+ * @return
+ *   The ID of the sort or FALSE if there isn't one.
+ */
+function draggable_views_get_draggable_sort($view) {
+  foreach ($view->sort as $id => $sort) {
+    if ($sort->definition['handler'] == 'draggableviews_handler_sort') {
+      return $id;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Evalutes the given PHP code, with the given variables defined.
+ *
+ * @param $code
+ *   The PHP code to run, without <?php ?>
+ * @param $arguments
+ *   Views arguments including values of exposed filters.
+ *
+ * @return
+ *   The return value of the evaled code.
+ */
+function draggableviews_eval_return($code, $arguments) {
+  return eval($code);
+}
diff --git a/sites/all/modules/contrib/draggableviews/js/draggableviews_list.js b/sites/all/modules/contrib/draggableviews/js/draggableviews_list.js
index a1dd16d..4cd93e6 100644
--- a/sites/all/modules/contrib/draggableviews/js/draggableviews_list.js
+++ b/sites/all/modules/contrib/draggableviews/js/draggableviews_list.js
@@ -15,6 +15,11 @@
         $( ".draggableviews-weight" ).each(function (i, Val) {
           $(this).val(i);
         });
+        if (!$(this).hasClass('draggableviews-changed')) {
+          $('<div class="draggableviews-changed-warning messages warning">' + Drupal.t('Changes made in this list will not be saved until the form is submitted.') + '</div>')
+            .insertBefore($(this).parents('.views-form')).hide().fadeIn('slow');
+          $(this).addClass('draggableviews-changed');
+        }
       },
       containment: 'parent',
       cursor: 'move'
diff --git a/sites/all/modules/contrib/draggableviews/views/draggableviews_handler_field_draggable.inc b/sites/all/modules/contrib/draggableviews/views/draggableviews_handler_field_draggable.inc
index a7a0b1e..1d714de 100644
--- a/sites/all/modules/contrib/draggableviews/views/draggableviews_handler_field_draggable.inc
+++ b/sites/all/modules/contrib/draggableviews/views/draggableviews_handler_field_draggable.inc
@@ -44,7 +44,9 @@ class draggableviews_handler_field_draggable extends views_handler_field {
   }
 
   function render($values) {
-    return '<!--form-item-' . $this->options['id'] . '--' . $this->view->row_index . '-->';
+    if (user_access('access draggableviews')) {
+      return '<!--form-item-' . $this->options['id'] . '--' . $this->view->row_index . '-->';
+    }
   }
 
   /**
diff --git a/sites/all/modules/contrib/draggableviews/views/draggableviews_handler_sort.inc b/sites/all/modules/contrib/draggableviews/views/draggableviews_handler_sort.inc
index ccb9e9e..24a5ea2 100644
--- a/sites/all/modules/contrib/draggableviews/views/draggableviews_handler_sort.inc
+++ b/sites/all/modules/contrib/draggableviews/views/draggableviews_handler_sort.inc
@@ -1,11 +1,26 @@
 <?php
+
 /**
- * Sort handler for ordering by width
+ * Sort handler for ordering by weight.
  */
 class draggableviews_handler_sort extends views_handler_sort {
   function query() {
     $this->ensure_my_table();
-    $this->query->add_orderby($this->table_alias, $this->real_field);
+    // If new items should be placed in the bottom.
+    if ($this->options['draggableviews_setting_new_items_bottom_list']) {
+      // ORDER BY COALESCE(weight, 10000)
+      // New items will get big default instead of NULL
+      $as = $this->table_alias . '_' . $this->real_field;
+      $as = $this->query->add_field($this->table_alias, $this->real_field, $as, array());
+      $this->query->orderby[] = array(
+        'field' => 'COALESCE(' . $as . ', 10000)',
+        'direction' => strtoupper($this->options['order'])
+      );
+    }
+    else {
+      // New items will be placed at the top as have NULL value.
+      $this->query->add_orderby($this->table_alias, $this->real_field);
+    }
   }
 
   function option_definition() {
@@ -21,11 +36,17 @@ class draggableviews_handler_sort extends views_handler_sort {
       $options['draggableviews_setting_view'] = array('default' => NULL);
     }
 
+    $options['draggableviews_setting_arguments'] = array('default' => 'all');
+    $options['draggableviews_setting_arguments_php'] = array('default' => '');
+    $options['draggableviews_setting_new_items_bottom_list'] = array('default' => TRUE);
+
     return $options;
   }
 
   function options_form(&$form, &$form_state) {
     parent::options_form($form, $form_state);
+    $form['order']['#access'] = FALSE;
+    $form['expose_button']['#access'] = FALSE;
 
     // Check whether current views display doesn't have draggableviews field.
     // If it has, it means that this is setting view so we should set
@@ -42,10 +63,6 @@ class draggableviews_handler_sort extends views_handler_sort {
 
       // Convert list of objects to options for the form.
       foreach ($views_list as $view_name => $view_object) {
-        // Skip current view.
-        if ($view_name == $this->view->name) {
-          continue;
-        }
         foreach ($view_object->display as $display_name => $display) {
           if ($display_name == 'default') {
             continue;
@@ -82,5 +99,33 @@ class draggableviews_handler_sort extends views_handler_sort {
         drupal_set_message(t('First you should create a view that sets sorting order.'), 'error');
       }
     }
+
+    $form['draggableviews_setting_arguments'] = array(
+      '#title' => t('Arguments handling'),
+      '#type' => 'radios',
+      '#options' => array(
+        'all' => t('Use all arguments'),
+        'none' => t('Do not use any arguments (use empty arguments)'),
+        'php' => t('Prepare arguments with PHP code'),
+      ),
+      '#default_value' => $this->options['draggableviews_setting_arguments'],
+      '#description' => t('When sorting order is saved all arguments passed are saved with order. In display view we can choose how to use these arguments.')
+    );
+    $form['draggableviews_setting_arguments_php'] = array(
+      '#title' => t('PHP code to prepare arguments'),
+      '#type' => 'textarea',
+      '#default_value' => $this->options['draggableviews_setting_arguments_php'],
+      '#states' => array(
+        'visible' => array(
+          'input[name="options[draggableviews_setting_arguments]"]' => array('value' => 'php'),
+        ),
+      ),
+    );
+    $form['draggableviews_setting_new_items_bottom_list'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('New items appear bottom of the list'),
+      '#description' => t('New items means elements (for example nodes) that do not have saved weight (newly created).'),
+      '#default_value' => $this->options['draggableviews_setting_new_items_bottom_list'],
+    );
   }
 }
diff --git a/sites/all/modules/contrib/draggableviews/views/draggableviews_join_handler.inc b/sites/all/modules/contrib/draggableviews/views/draggableviews_join_handler.inc
index a76dced..79ed355 100644
--- a/sites/all/modules/contrib/draggableviews/views/draggableviews_join_handler.inc
+++ b/sites/all/modules/contrib/draggableviews/views/draggableviews_join_handler.inc
@@ -41,6 +41,23 @@ class draggableviews_join_handler extends views_join {
         $arguments[':view_name'] = $setting_view_name;
         $arguments[':view_display'] = $setting_view_display;
       }
+
+      // Arguments passed to view (including exposed filters).
+      $view_arguments = $view_query->view->args;
+      if (isset($view_query->view->exposed_input)) {
+        $view_arguments += $view_query->view->exposed_input;
+        ksort($view_arguments);
+      }
+      // Alter arguments according to sort criteria settings.
+      if ($view_query->view->sort['weight']->options['draggableviews_setting_arguments'] == 'none') {
+        $view_arguments = array();
+      }
+      // If PHP arguments processing is set.
+      if ($view_query->view->sort['weight']->options['draggableviews_setting_arguments'] == 'php') {
+        $view_arguments = draggableviews_eval_return($view_query->view->sort['weight']->options['draggableviews_setting_arguments_php'], $view_arguments);
+      }
+      $condition .= " AND $table[alias].args = :view_arguments";
+      $arguments[':view_arguments'] = json_encode($view_arguments);
     }
 
     $select_query->addJoin($this->type, $right_table, $table['alias'], $condition, $arguments);
