diff --git a/app/assets/javascripts/admin/controllers/admin_logs_staff_action_logs_controller.js b/app/assets/javascripts/admin/controllers/admin_logs_staff_action_logs_controller.js
index fc87116c2..ddf94c61b 100644
--- a/app/assets/javascripts/admin/controllers/admin_logs_staff_action_logs_controller.js
+++ b/app/assets/javascripts/admin/controllers/admin_logs_staff_action_logs_controller.js
@@ -8,36 +8,52 @@
 **/
 Discourse.AdminLogsStaffActionLogsController = Ember.ArrayController.extend(Discourse.Presence, {
   loading: false,
-  filters: null,
+  filters: {},
 
-  show: function(filters) {
+  show: function() {
     var self = this;
     this.set('loading', true);
+    Discourse.URL.set('queryParams', this.get('filters')); // TODO: doesn't work
     Discourse.StaffActionLog.findAll(this.get('filters')).then(function(result) {
       self.set('content', result);
       self.set('loading', false);
     });
-  },
+  }.observes('filters.action_name', 'filters.staff_user', 'filters.target_user'),
 
   toggleFullDetails: function(target) {
     target.set('showFullDetails', !target.get('showFullDetails'));
   },
 
-  clearFiltersClass: function() {
-    if (this.get('filters') === null) {
-      return 'invisible';
-    } else {
-      return '';
-    }
-  }.property('filters'),
+  filtersExists: function() {
+    return (_.size(this.get('filters')) > 0);
+  }.property('filters.action_name', 'filters.staff_user', 'filters.target_user'),
 
-  clearFilters: function() {
-    this.set('filters', null);
-    this.show();
+  clearFilter: function(key) {
+    delete this.get('filters')[key];
+    this.notifyPropertyChange('filters');
+  },
+
+  clearAllFilters: function() {
+    this.set('filters', {});
   },
 
   filterByAction: function(action) {
-    this.set('filters', {action_name: action});
-    this.show();
+    this.set('filters.action_name', action);
+  },
+
+  actionFilter: function() {
+    if (this.get('filters.action_name')) {
+      return I18n.t("admin.logs.staff_actions.actions." + this.get('filters.action_name'));
+    } else {
+      return null;
+    }
+  }.property('filters.action_name'),
+
+  filterByStaffUser: function(staff_user) {
+    this.set('filters.staff_user', staff_user.username);
+  },
+
+  filterByTargetUser: function(target_user) {
+    this.set('filters.target_user', target_user.username);
   }
 });
diff --git a/app/assets/javascripts/admin/routes/admin_logs_routes.js b/app/assets/javascripts/admin/routes/admin_logs_routes.js
index 73cc4917d..b0a5b716b 100644
--- a/app/assets/javascripts/admin/routes/admin_logs_routes.js
+++ b/app/assets/javascripts/admin/routes/admin_logs_routes.js
@@ -43,7 +43,18 @@ Discourse.AdminLogsStaffActionLogsRoute = Discourse.Route.extend({
     this.render('admin/templates/logs/staff_action_logs', {into: 'adminLogs'});
   },
 
-  setupController: function() {
-    return this.controllerFor('adminLogsStaffActionLogs').show();
+  setupController: function(controller) {
+    var queryParams = Discourse.URL.get('queryParams');
+    if (queryParams) {
+      controller.set('filters', queryParams);
+    }
+    return controller.show();
+  },
+
+  deactivate: function() {
+    this._super();
+
+    // Clear any filters when we leave the route
+    Discourse.URL.set('queryParams', null);
   }
 });
\ No newline at end of file
diff --git a/app/assets/javascripts/admin/templates/logs/staff_action_logs.js.handlebars b/app/assets/javascripts/admin/templates/logs/staff_action_logs.js.handlebars
index 3285811c3..76623eea4 100644
--- a/app/assets/javascripts/admin/templates/logs/staff_action_logs.js.handlebars
+++ b/app/assets/javascripts/admin/templates/logs/staff_action_logs.js.handlebars
@@ -1,8 +1,26 @@
-
-<p>
-  <a {{action clearFilters}} {{bindAttr class="clearFiltersClass"}}>{{i18n admin.logs.staff_actions.clear_filters}}</a>
-</p>
-
+<div class="staff-action-logs-controls">
+  <a {{action clearAllFilters}} {{bindAttr class=":clear-filters :filter filtersExists::invisible"}}>
+    <span class="label">{{i18n admin.logs.staff_actions.clear_filters}}</span>
+  </a>
+  {{#if actionFilter}}
+    <a {{action clearFilter "action_name"}} class="filter">
+      <span class="label">{{i18n admin.logs.action}}</span>: {{actionFilter}}
+      <i class="icon icon-remove-sign"></i>
+    </a>
+  {{/if}}
+  {{#if filters.staff_user}}
+    <a {{action clearFilter "staff_user"}} class="filter">
+      <span class="label">{{i18n admin.logs.staff_actions.staff_user}}</span>: {{filters.staff_user}}
+      <i class="icon icon-remove-sign"></i>
+    </a>
+  {{/if}}
+  {{#if filters.target_user}}
+    <a {{action clearFilter "target_user"}} class="filter">
+      <span class="label">{{i18n admin.logs.staff_actions.target_user}}</span>: {{filters.target_user}}
+      <i class="icon icon-remove-sign"></i>
+    </a>
+  {{/if}}
+</div>
 
 <div class='table staff-actions'>
   <div class="heading-container">
@@ -26,3 +44,9 @@
     {{/if}}
   {{/if}}
 </div>
+
+{{#unless loading}}
+  <div class="staff-action-logs-instructions">
+    {{i18n admin.logs.staff_actions.instructions}}
+  </div>
+{{/unless}}
\ No newline at end of file
diff --git a/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.js.handlebars b/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.js.handlebars
index 830c5759f..ea423f0a3 100644
--- a/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.js.handlebars
+++ b/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.js.handlebars
@@ -1,6 +1,6 @@
 <div class="col value first staff_user">
   {{#linkTo 'adminUser' staff_user}}{{avatar staff_user imageSize="tiny"}}{{/linkTo}}
-  {{#linkTo 'adminUser' staff_user}}{{staff_user.username}}{{/linkTo}}
+  <a {{action filterByStaffUser staff_user}}>{{staff_user.username}}</a>
 </div>
 <div class="col value action">
   <a {{action filterByAction action_name}}>{{actionName}}</a>
@@ -8,7 +8,7 @@
 <div class="col value target_user">
   {{#if target_user}}
     {{#linkTo 'adminUser' target_user}}{{avatar target_user imageSize="tiny"}}{{/linkTo}}
-    {{#linkTo 'adminUser' target_user}}{{target_user.username}}{{/linkTo}}
+    <a {{action filterByTargetUser target_user}}>{{target_user.username}}</a>
   {{else}}
     &mdash;
   {{/if}}
diff --git a/app/assets/stylesheets/admin/admin_base.scss b/app/assets/stylesheets/admin/admin_base.scss
index 9f6ceb0a3..1d17eaada 100644
--- a/app/assets/stylesheets/admin/admin_base.scss
+++ b/app/assets/stylesheets/admin/admin_base.scss
@@ -739,6 +739,31 @@ table {
   }
 }
 
+.staff-action-logs-controls {
+  margin: 0 0 20px 6px;
+  a.filter {
+    display: inline-block;
+    background-color: #ddd;
+    padding: 3px 10px;
+    border-radius: 3px;
+    margin-left: 5px;
+    color: #444;
+    &:hover {
+      color: $link-color-hover;
+    }
+    .label {
+      font-weight: bold;
+    }
+    i {
+      margin-left: 6px;
+    }
+  }
+}
+
+.staff-action-logs-instructions {
+  margin: 50px 0 0 10px;
+}
+
 // Ember.ListView
 
 .ember-list-view {
diff --git a/app/controllers/admin/staff_action_logs_controller.rb b/app/controllers/admin/staff_action_logs_controller.rb
index e9b341a63..c31a03d8f 100644
--- a/app/controllers/admin/staff_action_logs_controller.rb
+++ b/app/controllers/admin/staff_action_logs_controller.rb
@@ -1,7 +1,7 @@
 class Admin::StaffActionLogsController < Admin::AdminController
 
   def index
-    staff_action_logs = StaffActionLog.with_filters(params.slice(:action_name)).limit(200).order('id DESC').includes(:staff_user, :target_user).to_a
+    staff_action_logs = StaffActionLog.with_filters(params.slice(:action_name, :staff_user, :target_user)).limit(200).order('id DESC').includes(:staff_user, :target_user).to_a
     render_serialized(staff_action_logs, StaffActionLogSerializer)
   end
 
diff --git a/app/models/staff_action_log.rb b/app/models/staff_action_log.rb
index e829a7927..5d9e2628b 100644
--- a/app/models/staff_action_log.rb
+++ b/app/models/staff_action_log.rb
@@ -17,6 +17,11 @@ class StaffActionLog < ActiveRecord::Base
     if filters[:action_name] and action_id = StaffActionLog.actions[filters[:action_name].to_sym]
       query = query.where('action = ?', action_id)
     end
+    [:staff_user, :target_user].each do |key|
+      if filters[key] and obj_id = User.where(username_lower: filters[key].downcase).pluck(:id)
+        query = query.where("#{key.to_s}_id = ?", obj_id)
+      end
+    end
     query
   end
 end
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 5443aec44..b83b89a5e 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -1177,7 +1177,8 @@ en:
             do_nothing: "do nothing"
         staff_actions:
           title: "Staff Actions"
-          clear_filters: "Show All"
+          instructions: "Click usernames and actions to filter the list. Click avatars to go to user pages."
+          clear_filters: "Show Everything"
           staff_user: "Staff User"
           target_user: "Target User"
           when: "When"
diff --git a/db/migrate/20130809204732_add_filter_indexes_to_staff_action_logs.rb b/db/migrate/20130809204732_add_filter_indexes_to_staff_action_logs.rb
new file mode 100644
index 000000000..24aa1ad1f
--- /dev/null
+++ b/db/migrate/20130809204732_add_filter_indexes_to_staff_action_logs.rb
@@ -0,0 +1,7 @@
+class AddFilterIndexesToStaffActionLogs < ActiveRecord::Migration
+  def change
+    add_index :staff_action_logs, [:action, :id]
+    add_index :staff_action_logs, [:staff_user_id, :id]
+    add_index :staff_action_logs, [:target_user_id, :id]
+  end
+end