diff --git a/app/assets/javascripts/discourse/controllers/header.js.es6 b/app/assets/javascripts/discourse/controllers/header.js.es6
index 74e2e133c..c0c4cb17d 100644
--- a/app/assets/javascripts/discourse/controllers/header.js.es6
+++ b/app/assets/javascripts/discourse/controllers/header.js.es6
@@ -99,6 +99,7 @@ HeaderController.reopenClass({
 });
 
 addFlagProperty('currentUser.site_flagged_posts_count');
+addFlagProperty('currentUser.post_queue_new_count');
 
 export { addFlagProperty };
 export default HeaderController;
diff --git a/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6 b/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6
index 9689614dd..bb808e5c2 100644
--- a/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6
+++ b/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6
@@ -27,10 +27,13 @@ export default {
       bus.callbackInterval = siteSettings.polling_interval;
       bus.enableLongPolling = true;
 
-      if (user.admin || user.moderator) {
-        bus.subscribe('/flagged_counts', function(data) {
+      if (user.get('staff')) {
+        bus.subscribe('/flagged_counts', (data) => {
           user.set('site_flagged_posts_count', data.total);
         });
+        bus.subscribe('/queue_counts', (data) => {
+          user.set('post_queue_new_count', data.post_queue_new_count);
+        });
       }
       bus.subscribe("/notification/" + user.get('id'), (function(data) {
         const oldUnread = user.get('unread_notifications');
diff --git a/app/assets/javascripts/discourse/templates/site-map.hbs b/app/assets/javascripts/discourse/templates/site-map.hbs
index c781c3a91..0bbe1dd96 100644
--- a/app/assets/javascripts/discourse/templates/site-map.hbs
+++ b/app/assets/javascripts/discourse/templates/site-map.hbs
@@ -26,6 +26,17 @@
       <li>{{#link-to 'users'}}{{i18n "directory.title"}}{{/link-to}}</li>
     {{/if}}
 
+    {{#if currentUser.staff}}
+      <li>
+        <a href="/queued-posts">
+          {{i18n "queue.title"}}
+          {{#if currentUser.post_queue_new_count}}
+          <span class='badge-notification flagged-posts'>{{currentUser.post_queue_new_count}}</span>
+          {{/if}}
+        </a>
+      </li>
+    {{/if}}
+
     {{plugin-outlet "site-map-links"}}
 
     {{#if showKeyboardShortcuts}}
diff --git a/app/models/queued_post.rb b/app/models/queued_post.rb
index 2b1cdacaf..03d5e352a 100644
--- a/app/models/queued_post.rb
+++ b/app/models/queued_post.rb
@@ -26,6 +26,15 @@ class QueuedPost < ActiveRecord::Base
     @states ||= Enum.new(:new, :approved, :rejected)
   end
 
+  def self.new_count
+    where(state: states[:new]).count
+  end
+
+  def self.publish_new!
+    msg = { post_queue_new_count: QueuedPost.new_count }
+    MessageBus.publish('/queue_counts', msg, user_ids: User.staff.pluck(:id))
+  end
+
   def reject!(rejected_by)
     change_to!(:rejected, rejected_by)
   end
@@ -73,6 +82,8 @@ class QueuedPost < ActiveRecord::Base
       # Update the record in memory too, and clear the dirty flag
       updates.each {|k, v| send("#{k}=", v) }
       changes_applied
+
+      QueuedPost.publish_new!
     end
 
 end
diff --git a/app/serializers/current_user_serializer.rb b/app/serializers/current_user_serializer.rb
index e8b3e717a..7784d3545 100644
--- a/app/serializers/current_user_serializer.rb
+++ b/app/serializers/current_user_serializer.rb
@@ -26,7 +26,8 @@ class CurrentUserSerializer < BasicUserSerializer
              :custom_fields,
              :muted_category_ids,
              :dismissed_banner_key,
-             :is_anonymous
+             :is_anonymous,
+             :post_queue_new_count
 
   def include_site_flagged_posts_count?
     object.staff?
@@ -107,4 +108,12 @@ class CurrentUserSerializer < BasicUserSerializer
     object.anonymous?
   end
 
+  def post_queue_new_count
+    QueuedPost.new_count
+  end
+
+  def include_post_queue_new_count?
+    object.staff?
+  end
+
 end
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 6e2a44369..cbfa19f3a 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -226,6 +226,8 @@ en:
         placeholder: "type the topic title here"
 
     queue:
+      title: "Needs Approval"
+
       approval:
         title: "Post Needs Approval"
         description: "We've received your new post but it needs to be approved by a moderator before it will appear. Please be patient."
diff --git a/lib/new_post_manager.rb b/lib/new_post_manager.rb
index 323acaa7e..f892dcbb6 100644
--- a/lib/new_post_manager.rb
+++ b/lib/new_post_manager.rb
@@ -43,6 +43,8 @@ class NewPostManager
     enqueuer = PostEnqueuer.new(@user, queue)
     post = enqueuer.enqueue(@args)
 
+    QueuedPost.publish_new! if post && post.errors.empty?
+
     result.check_errors_from(enqueuer)
     result
   end
diff --git a/spec/components/new_post_manager_spec.rb b/spec/components/new_post_manager_spec.rb
index 523d8652a..78bc12506 100644
--- a/spec/components/new_post_manager_spec.rb
+++ b/spec/components/new_post_manager_spec.rb
@@ -52,7 +52,7 @@ describe NewPostManager do
       expect(result).to be_success
       expect(result.post).to be_blank
       expect(@counter).to be(1)
-      expect(QueuedPost.count).to be(0)
+      expect(QueuedPost.new_count).to be(0)
     end
 
     it "calls custom enqueuing handlers" do
@@ -63,7 +63,7 @@ describe NewPostManager do
       expect(result.action).to eq(:enqueued)
       expect(result).to be_success
       expect(result.post).to be_blank
-      expect(QueuedPost.count).to be(1)
+      expect(QueuedPost.new_count).to be(1)
       expect(@counter).to be(0)
     end