diff --git a/app/assets/javascripts/admin/templates/badges.js.handlebars b/app/assets/javascripts/admin/templates/badges.js.handlebars
index e7a869f46..8ee9affe5 100644
--- a/app/assets/javascripts/admin/templates/badges.js.handlebars
+++ b/app/assets/javascripts/admin/templates/badges.js.handlebars
@@ -77,13 +77,20 @@
         </span>
       </div>
 
-      {{#unless readOnly}}
-        <div class='buttons'>
-          <button {{action save}} {{bind-attr disabled=controller.disableSave}} class='btn btn-primary'>{{i18n admin.badges.save}}</button>
-          <span class='saving'>{{savingStatus}}</span>
+      <div>
+        <span>
+          {{input type="checkbox" checked=enabled}}
+          {{i18n admin.badges.enabled}}
+        </span>
+      </div>
+
+      <div class='buttons'>
+        <button {{action save}} {{bind-attr disabled=controller.disableSave}} class='btn btn-primary'>{{i18n admin.badges.save}}</button>
+        <span class='saving'>{{savingStatus}}</span>
+        {{#unless readOnly}}
           <a {{action destroy}} class='delete-link'>{{i18n admin.badges.delete}}</a>
-        </div>
-      {{/unless}}
+        {{/unless}}
+      </div>
     </form>
   </div>
 
diff --git a/app/assets/javascripts/discourse/models/badge.js b/app/assets/javascripts/discourse/models/badge.js
index ebbf09a1b..a848d3268 100644
--- a/app/assets/javascripts/discourse/models/badge.js
+++ b/app/assets/javascripts/discourse/models/badge.js
@@ -118,6 +118,7 @@ Discourse.Badge = Discourse.Model.extend({
         allow_title: !!this.get('allow_title'),
         multiple_grant: !!this.get('multiple_grant'),
         listable: !!this.get('listable'),
+        enabled: !!this.get('enabled'),
         icon: this.get('icon')
       }
     }).then(function(json) {
diff --git a/app/controllers/admin/badges_controller.rb b/app/controllers/admin/badges_controller.rb
index 9fbf58cbf..f85633954 100644
--- a/app/controllers/admin/badges_controller.rb
+++ b/app/controllers/admin/badges_controller.rb
@@ -30,7 +30,7 @@ class Admin::BadgesController < Admin::AdminController
     end
 
     def update_badge_from_params(badge)
-      params.permit(:name, :description, :badge_type_id, :allow_title, :multiple_grant, :listable)
+      params.permit(:name, :description, :badge_type_id, :allow_title, :multiple_grant, :listable, :enabled)
       badge.name = params[:name]
       badge.description = params[:description]
       badge.badge_type = BadgeType.find(params[:badge_type_id])
@@ -38,6 +38,7 @@ class Admin::BadgesController < Admin::AdminController
       badge.multiple_grant = params[:multiple_grant]
       badge.icon = params[:icon]
       badge.listable = params[:listable]
+      badge.enabled = params[:enabled]
       badge
     end
 end
diff --git a/app/controllers/badges_controller.rb b/app/controllers/badges_controller.rb
index 603dc89ef..3520f0dfe 100644
--- a/app/controllers/badges_controller.rb
+++ b/app/controllers/badges_controller.rb
@@ -3,7 +3,7 @@ class BadgesController < ApplicationController
 
   def index
     badges = Badge.all
-    badges = badges.where(listable: true) if(params[:only_listable] == "true") || !request.xhr?
+    badges = badges.where(enabled: true, listable: true) if(params[:only_listable] == "true") || !request.xhr?
     badges = badges.to_a
     serialized = MultiJson.dump(serialize_data(badges, BadgeSerializer, root: "badges"))
     respond_to do |format|
@@ -17,7 +17,7 @@ class BadgesController < ApplicationController
 
   def show
     params.require(:id)
-    badge = Badge.find(params[:id])
+    badge = Badge.enabled.find(params[:id])
 
     if current_user
       user_badge = UserBadge.find_by(user_id: current_user.id, badge_id: badge.id)
diff --git a/app/controllers/user_badges_controller.rb b/app/controllers/user_badges_controller.rb
index 1372adc62..946289a00 100644
--- a/app/controllers/user_badges_controller.rb
+++ b/app/controllers/user_badges_controller.rb
@@ -17,7 +17,8 @@ class UserBadgesController < ApplicationController
     user_badges = user_badges.includes(:user, :granted_by, badge: :badge_type, post: :topic)
 
     if params[:grouped]
-      user_badges = user_badges.group(:badge_id).select(UserBadge.attribute_names.map {|x| "MAX(#{x}) as #{x}" }, 'COUNT(*) as count')
+      user_badges = user_badges.group(:badge_id)
+                               .select(UserBadge.attribute_names.map {|x| "MAX(#{x}) as #{x}" }, 'COUNT(*) as count')
     end
 
     render_serialized(user_badges, UserBadgeSerializer, root: "user_badges")
@@ -60,9 +61,9 @@ class UserBadgesController < ApplicationController
       params.permit(:badge_name)
       if params[:badge_name].nil?
         params.require(:badge_id)
-        badge = Badge.find_by(id: params[:badge_id])
+        badge = Badge.find_by(id: params[:badge_id], enabled: true)
       else
-        badge = Badge.find_by(name: params[:badge_name])
+        badge = Badge.find_by(name: params[:badge_name], enabled: true)
       end
       raise Discourse::NotFound.new if badge.blank?
 
diff --git a/app/models/badge.rb b/app/models/badge.rb
index c5c9252a7..9eff812bb 100644
--- a/app/models/badge.rb
+++ b/app/models/badge.rb
@@ -134,6 +134,8 @@ SQL
   validates :allow_title, inclusion: [true, false]
   validates :multiple_grant, inclusion: [true, false]
 
+  scope :enabled, ->{ where(enabled: true) }
+
 
   def self.trust_level_badge_ids
     (1..4).to_a
diff --git a/app/models/user.rb b/app/models/user.rb
index 318ce9f12..4b8e07673 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -23,7 +23,7 @@ class User < ActiveRecord::Base
   has_many :user_open_ids, dependent: :destroy
   has_many :user_actions, dependent: :destroy
   has_many :post_actions, dependent: :destroy
-  has_many :user_badges, dependent: :destroy
+  has_many :user_badges, -> {where('user_badges.badge_id IN (SELECT id FROM badges where enabled)')}, dependent: :destroy
   has_many :badges, through: :user_badges
   has_many :email_logs, dependent: :destroy
   has_many :post_timings
diff --git a/app/serializers/badge_serializer.rb b/app/serializers/badge_serializer.rb
index 4848536ce..9cb4b40ed 100644
--- a/app/serializers/badge_serializer.rb
+++ b/app/serializers/badge_serializer.rb
@@ -1,5 +1,5 @@
 class BadgeSerializer < ApplicationSerializer
-  attributes :id, :name, :description, :grant_count, :allow_title, :multiple_grant, :icon, :listable
+  attributes :id, :name, :description, :grant_count, :allow_title, :multiple_grant, :icon, :listable, :enabled
 
   has_one :badge_type
 end
diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb
index 24d6e81dc..f7fd0624b 100644
--- a/app/services/badge_granter.rb
+++ b/app/services/badge_granter.rb
@@ -62,7 +62,7 @@ class BadgeGranter
   end
 
   def self.backfill(badge)
-    return unless badge.query.present?
+    return unless badge.query.present? && badge.enabled
 
     post_clause = badge.target_posts ? "AND q.post_id = ub.post_id" : ""
     post_id_field = badge.target_posts ? "q.post_id" : "NULL"
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 1bc19fe8f..87e59b774 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -1892,6 +1892,7 @@ en:
         allow_title: Allow badge to be used as a title
         multiple_grant: Can be granted multiple times
         listable: Show badge on the public badges page
+        enabled: Enable badge
         icon: Icon
 
     lightbox:
diff --git a/db/migrate/20140714060646_add_enabled_to_badges.rb b/db/migrate/20140714060646_add_enabled_to_badges.rb
new file mode 100644
index 000000000..c381511a0
--- /dev/null
+++ b/db/migrate/20140714060646_add_enabled_to_badges.rb
@@ -0,0 +1,5 @@
+class AddEnabledToBadges < ActiveRecord::Migration
+  def change
+    add_column :badges, :enabled, :boolean, default: true, null: false
+  end
+end
diff --git a/spec/controllers/admin/badges_controller_spec.rb b/spec/controllers/admin/badges_controller_spec.rb
index 478b61b68..5d418ba99 100644
--- a/spec/controllers/admin/badges_controller_spec.rb
+++ b/spec/controllers/admin/badges_controller_spec.rb
@@ -35,12 +35,12 @@ describe Admin::BadgesController do
 
     context '.update' do
       it 'returns success' do
-        xhr :put, :update, id: badge.id, name: "123456", badge_type_id: badge.badge_type_id, allow_title: false, multiple_grant: false
+        xhr :put, :update, id: badge.id, name: "123456", badge_type_id: badge.badge_type_id, allow_title: false, multiple_grant: false, enabled: true
         response.should be_success
       end
 
       it 'updates the badge' do
-        xhr :put, :update, id: badge.id, name: "123456", badge_type_id: badge.badge_type_id, allow_title: false, multiple_grant: true
+        xhr :put, :update, id: badge.id, name: "123456", badge_type_id: badge.badge_type_id, allow_title: false, multiple_grant: true, enabled: true
         badge.reload.name.should eq('123456')
       end
     end