diff --git a/handlers/views_handler_argument.inc b/handlers/views_handler_argument.inc
index 6e83175..e589542 100644
--- a/handlers/views_handler_argument.inc
+++ b/handlers/views_handler_argument.inc
@@ -31,6 +31,8 @@
  */
 class views_handler_argument extends views_handler {
   var $name_field = NULL;
+  var $validator = NULL;
+
   /**
    * Constructor
    */
@@ -723,6 +725,20 @@ class views_handler_argument extends views_handler {
   }
 
   /**
+   * Process the summary arguments for display.
+   *
+   * For example, the validation plugin may want to alter an argument for use in
+   * the URL.
+   */
+  function process_summary_arguments(&$args) {
+    if ($this->options['validate']['type'] != 'none') {
+      if (isset($this->validator) || $this->validator = $this->get_plugin('argument validator')) {
+        $this->validator->process_summary_arguments($args);
+      }
+    }
+  }
+
+  /**
    * Default action: summary.
    *
    * If an argument was expected and was not given, in this case, display
diff --git a/modules/user/views_plugin_argument_validate_user.inc b/modules/user/views_plugin_argument_validate_user.inc
index 18603ba..77c703d 100644
--- a/modules/user/views_plugin_argument_validate_user.inc
+++ b/modules/user/views_plugin_argument_validate_user.inc
@@ -121,4 +121,16 @@ class views_plugin_argument_validate_user extends views_plugin_argument_validate
     $this->argument->validated_title = check_plain($account->name);
     return TRUE;
   }
+
+  function process_summary_arguments(&$args) {
+    // If the validation says the input is an username, we should reverse the
+    // argument so it works for example for generation summary urls.
+    $uids_arg_keys = array_flip($args);
+    if ($this->options['type'] == 'name') {
+      $users = user_load_multiple($args);
+      foreach ($users as $uid => $account) {
+        $args[$uids_arg_keys[$uid]] = $account->name;
+      }
+    }
+  }
 }
diff --git a/plugins/views_plugin_argument_validate.inc b/plugins/views_plugin_argument_validate.inc
index fd68094..7071a62 100644
--- a/plugins/views_plugin_argument_validate.inc
+++ b/plugins/views_plugin_argument_validate.inc
@@ -84,6 +84,16 @@ class views_plugin_argument_validate extends views_plugin {
   }
 
   function validate_argument($arg) { return TRUE; }
+
+  /**
+   * Process the summary arguments for displaying.
+   *
+   * Some plugins alter the argument so it uses something else interal.
+   * For example the user validation set's the argument to the uid,
+   * for a faster query. But there are use cases where you want to use
+   * the old value again, for example the summary.
+   */
+  function process_summary_arguments(&$args) { }
 }
 
 /**
diff --git a/plugins/views_plugin_style_summary_jump_menu.inc b/plugins/views_plugin_style_summary_jump_menu.inc
index b2e3eed..b520ef0 100644
--- a/plugins/views_plugin_style_summary_jump_menu.inc
+++ b/plugins/views_plugin_style_summary_jump_menu.inc
@@ -89,9 +89,15 @@ class views_plugin_style_summary_jump_menu extends views_plugin_style {
 
     $options = array();
     $default_value = '';
+    $row_args = array();
+    foreach ($this->view->result as $id => $row) {
+      $row_args[$id] = $argument->summary_argument($row);
+    }
+    $argument->process_summary_arguments($row_args);
+
     foreach ($this->view->result as $id => $row) {
       $args = $this->view->args;
-      $args[$argument->position] = $argument->summary_argument($row);
+      $args[$argument->position] = $row_args[$id];
       $base_path = NULL;
       if (!empty($argument->options['style_options']['base_path'])) {
         $base_path = $argument->options['style_options']['base_path'];
diff --git a/theme/theme.inc b/theme/theme.inc
index b0f235f..61eea65 100644
--- a/theme/theme.inc
+++ b/theme/theme.inc
@@ -328,12 +328,21 @@ function template_preprocess_views_view_summary(&$vars) {
   if (!empty($view->exposed_raw_input)) {
     $url_options['query'] = $view->exposed_raw_input;
   }
+
+  // Collect all arguments foreach row, to be able to alter them for example by the validator.
+  // This is not done per single argument value, because this could cause performance problems.
+  $row_args = array();
+  foreach ($vars['rows'] as $id => $row) {
+    $row_args[$id] = $argument->summary_argument($row);
+  }
+  $argument->process_summary_arguments($row_args);
+
   foreach ($vars['rows'] as $id => $row) {
     $vars['row_classes'][$id] = '';
 
     $vars['rows'][$id]->link = $argument->summary_name($row);
     $args = $view->args;
-    $args[$argument->position] = $argument->summary_argument($row);
+    $args[$argument->position] = $row_args[$id];
 
     $base_path = NULL;
     if (!empty($argument->options['summary_options']['base_path'])) {
@@ -363,6 +372,15 @@ function template_preprocess_views_view_summary_unformatted(&$vars) {
   }
 
   $count = 0;
+
+  // Collect all arguments foreach row, to be able to alter them for example by the validator.
+  // This is not done per single argument value, because this could cause performance problems.
+  $row_args = array();
+  foreach ($vars['rows'] as $id => $row) {
+    $row_args[$id] = $argument->summary_argument($row);
+  }
+  $argument->process_summary_arguments($row_args);
+
   foreach ($vars['rows'] as $id => $row) {
     // only false on first time:
     if ($count++) {
@@ -370,7 +388,7 @@ function template_preprocess_views_view_summary_unformatted(&$vars) {
     }
     $vars['rows'][$id]->link = $argument->summary_name($row);
     $args = $view->args;
-    $args[$argument->position] = $argument->summary_argument($row);
+    $args[$argument->position] = $row_args[$id];
 
     $base_path = NULL;
     if (!empty($argument->options['summary_options']['base_path'])) {
