diff --git a/app/assets/javascripts/discourse/controllers/bulk_notification_level_controller.js b/app/assets/javascripts/discourse/controllers/bulk_notification_level_controller.js
index 60fb2a870..444165baf 100644
--- a/app/assets/javascripts/discourse/controllers/bulk_notification_level_controller.js
+++ b/app/assets/javascripts/discourse/controllers/bulk_notification_level_controller.js
@@ -7,7 +7,7 @@
   @module Discourse
 **/
 Discourse.BulkNotificationLevelController = Em.Controller.extend({
-  needs: ['topicBulkActions', 'discoveryTopics'],
+  needs: ['topicBulkActions'],
 
   notificationLevelId: null,
 
@@ -27,17 +27,9 @@ Discourse.BulkNotificationLevelController = Em.Controller.extend({
 
   actions: {
     changeNotificationLevel: function() {
-      var self = this;
-
-      this.get('controllers.topicBulkActions').perform({
+      this.get('controllers.topicBulkActions').performAndRefresh({
         type: 'change_notification_level',
         notification_level_id: this.get('notificationLevelId')
-      }).then(function(topics) {
-        if (topics) {
-          // Tell current route to reload
-          self.get('controllers.discoveryTopics').send('refresh');
-          self.send('closeModal');
-        }
       });
     }
   }
diff --git a/app/assets/javascripts/discourse/controllers/topic_bulk_actions_controller.js b/app/assets/javascripts/discourse/controllers/topic_bulk_actions_controller.js
index 8447491dd..3c5acaae7 100644
--- a/app/assets/javascripts/discourse/controllers/topic_bulk_actions_controller.js
+++ b/app/assets/javascripts/discourse/controllers/topic_bulk_actions_controller.js
@@ -8,6 +8,8 @@
   @module Discourse
 **/
 Discourse.TopicBulkActionsController = Ember.ArrayController.extend(Discourse.ModalFunctionality, {
+  needs: ['discoveryTopics'],
+
   onShow: function() {
     this.set('controllers.modal.modalClass', 'topic-bulk-actions-modal small');
   },
@@ -40,6 +42,14 @@ Discourse.TopicBulkActionsController = Ember.ArrayController.extend(Discourse.Mo
     });
   },
 
+  performAndRefresh: function(operation) {
+    var self = this;
+    return this.perform(operation).then(function() {
+      self.get('controllers.discoveryTopics').send('refresh');
+      self.send('closeModal');
+    });
+  },
+
   actions: {
     showChangeCategory: function() {
       this.send('changeBulkTemplate', 'modal/bulk_change_category');
@@ -66,6 +76,10 @@ Discourse.TopicBulkActionsController = Ember.ArrayController.extend(Discourse.Mo
         });
         self.send('closeModal');
       });
+    },
+
+    resetRead: function() {
+      this.performAndRefresh({ type: 'reset_read' });
     }
   }
 });
diff --git a/app/assets/javascripts/discourse/templates/modal/bulk_actions_buttons.js.handlebars b/app/assets/javascripts/discourse/templates/modal/bulk_actions_buttons.js.handlebars
index 0ae6fc38d..814f44f46 100644
--- a/app/assets/javascripts/discourse/templates/modal/bulk_actions_buttons.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/modal/bulk_actions_buttons.js.handlebars
@@ -1,3 +1,4 @@
 <button class='btn' {{action showChangeCategory}}>{{i18n topics.bulk.change_category}}</button>
 <button class='btn' {{action closeTopics}}>{{i18n topics.bulk.close_topics}}</button>
 <button class='btn' {{action showNotificationLevel}}>{{i18n topics.bulk.notification_level}}</button>
+<button class='btn' {{action resetRead}}>{{i18n topics.bulk.reset_read}}</button>
diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb
index ce7f462e3..3d76a50e7 100644
--- a/app/controllers/topics_controller.rb
+++ b/app/controllers/topics_controller.rb
@@ -88,7 +88,7 @@ class TopicsController < ApplicationController
   end
 
   def destroy_timings
-    PostTiming.destroy_for(current_user.id, params[:topic_id].to_i)
+    PostTiming.destroy_for(current_user.id, [params[:topic_id].to_i])
     render nothing: true
   end
 
diff --git a/app/models/post_timing.rb b/app/models/post_timing.rb
index 85a51a08d..b8e86c8f3 100644
--- a/app/models/post_timing.rb
+++ b/app/models/post_timing.rb
@@ -52,10 +52,10 @@ class PostTiming < ActiveRecord::Base
   end
 
 
-  def self.destroy_for(user_id, topic_id)
+  def self.destroy_for(user_id, topic_ids)
     PostTiming.transaction do
-      PostTiming.delete_all(['user_id = ? and topic_id = ?', user_id, topic_id])
-      TopicUser.delete_all(['user_id = ? and topic_id = ?', user_id, topic_id])
+      PostTiming.delete_all(['user_id = ? and topic_id in (?)', user_id, topic_ids])
+      TopicUser.delete_all(['user_id = ? and topic_id in (?)', user_id, topic_ids])
     end
   end
 
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 0ce3bbc34..b08f6f5ff 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -628,6 +628,7 @@ en:
 
     topics:
       bulk:
+        reset_read: "Reset Read"
         dismiss_read: "Dismiss Read"
         toggle: "toggle bulk selection of topics"
         actions: "Bulk Actions"
diff --git a/lib/topics_bulk_action.rb b/lib/topics_bulk_action.rb
index 5e31dc6ca..a0ee6f4ad 100644
--- a/lib/topics_bulk_action.rb
+++ b/lib/topics_bulk_action.rb
@@ -8,7 +8,7 @@ class TopicsBulkAction
   end
 
   def self.operations
-    %w(change_category close change_notification_level)
+    %w(change_category close change_notification_level reset_read)
   end
 
   def perform!
@@ -19,6 +19,10 @@ class TopicsBulkAction
 
   private
 
+    def reset_read
+      PostTiming.destroy_for(@user.id, @topic_ids)
+    end
+
     def change_category
       topics.each do |t|
         if guardian.can_edit?(t)
diff --git a/spec/components/topics_bulk_action_spec.rb b/spec/components/topics_bulk_action_spec.rb
index 23637e40d..1473677e9 100644
--- a/spec/components/topics_bulk_action_spec.rb
+++ b/spec/components/topics_bulk_action_spec.rb
@@ -27,7 +27,7 @@ describe TopicsBulkAction do
     end
 
     context "when the user can't edit the topic" do
-      it "doesn't change the category" do 
+      it "doesn't change the category" do
         Guardian.any_instance.expects(:can_edit?).returns(false)
         tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'change_category', category_name: category.name)
         topic_ids = tba.perform!
@@ -38,10 +38,20 @@ describe TopicsBulkAction do
     end
   end
 
+  describe "reset_read" do
+    let(:topic) { Fabricate(:topic) }
+
+    it "delegates to PostTiming.destroy_for" do
+      tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'reset_read')
+      PostTiming.expects(:destroy_for).with(topic.user_id, [topic.id])
+      topic_ids = tba.perform!
+    end
+  end
+
   describe "change_notification_level" do
     let(:topic) { Fabricate(:topic) }
 
-    context "when the user can edit the topic" do
+    context "when the user can see the topic" do
       it "updates the notification level" do
         tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'change_notification_level', notification_level_id: 2)
         topic_ids = tba.perform!
@@ -50,7 +60,7 @@ describe TopicsBulkAction do
       end
     end
 
-    context "when the user can't edit the topic" do
+    context "when the user can't see the topic" do
       it "doesn't change the level" do
         Guardian.any_instance.expects(:can_see?).returns(false)
         tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'change_notification_level', notification_level_id: 2)
diff --git a/spec/controllers/topics_controller_spec.rb b/spec/controllers/topics_controller_spec.rb
index a6eaedd8a..51006b533 100644
--- a/spec/controllers/topics_controller_spec.rb
+++ b/spec/controllers/topics_controller_spec.rb
@@ -345,7 +345,7 @@ describe TopicsController do
       end
 
       it 'deletes the forum topic user record' do
-        PostTiming.expects(:destroy_for).with(@user.id, @topic.id)
+        PostTiming.expects(:destroy_for).with(@user.id, [@topic.id])
         xhr :delete, :destroy_timings, topic_id: @topic.id
       end