diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 0dda1353a..88427ee16 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -65,14 +65,13 @@ class ApplicationController < ActionController::Base
   end
 
   rescue_from Discourse::NotFound do
-    if !request.format || request.format.html?
-      # for now do a simple remap, we may look at cleaner ways of doing the render
-      #
-      # Sam: I am confused about this, we need a comment that explains why this is conditional
-      raise ActiveRecord::RecordNotFound
-    else
-      render file: 'public/404', formats: [:html], layout: false, status: 404
-    end
+
+    f = Topic.where(deleted_at: nil, archetype: "regular")
+    @latest = f.order('views desc').take(10)
+    @recent = f.order('created_at desc').take(10)
+    @slug =  params[:slug].class == String ? params[:slug] : ''
+    @slug.gsub!('-',' ')
+    render status: 404, layout: 'no_js', template: '/exceptions/not_found'
   end
 
   rescue_from Discourse::InvalidAccess do
diff --git a/app/controllers/exceptions_controller.rb b/app/controllers/exceptions_controller.rb
index 9814bbbfd..55fb96172 100644
--- a/app/controllers/exceptions_controller.rb
+++ b/app/controllers/exceptions_controller.rb
@@ -1,14 +1,9 @@
 class ExceptionsController < ApplicationController
   skip_before_filter :check_xhr
-  layout 'no_js'
 
   def not_found
-    f = Topic.where(deleted_at: nil, archetype: "regular")
-
-    @latest = f.order('views desc').take(10)
-    @recent = f.order('created_at desc').take(10)
-    @slug =  params[:slug].class == String ? params[:slug] : ''
-    @slug.gsub!('-',' ')
-    render status: 404
+    # centralize all rendering of 404 into app controller
+    raise Discourse::NotFound
   end
+
 end
diff --git a/app/controllers/static_controller.rb b/app/controllers/static_controller.rb
index 87386d1ce..834ee57c3 100644
--- a/app/controllers/static_controller.rb
+++ b/app/controllers/static_controller.rb
@@ -21,7 +21,7 @@ class StaticController < ApplicationController
       return
     end
 
-    render file: 'public/404', layout: false, status: 404
+    raise Discourse::NotFound
   end
 
   # This method just redirects to a given url.
diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb
index 8875599bd..8617ab91b 100644
--- a/app/controllers/topics_controller.rb
+++ b/app/controllers/topics_controller.rb
@@ -25,7 +25,10 @@ class TopicsController < ApplicationController
   caches_action :avatar, cache_path: Proc.new {|c| "#{c.params[:post_number]}-#{c.params[:topic_id]}" }
 
   def show
-    create_topic_view
+    opts = params.slice(:username_filters, :best_of, :page, :post_number, :posts_before, :posts_after, :best)
+    @topic_view = TopicView.new(params[:id] || params[:topic_id], current_user, opts)
+
+    raise Discourse::NotFound unless @topic_view.posts.present?
 
     anonymous_etag(@topic_view.topic) do
       redirect_to_correct_topic && return if slugs_do_not_match
@@ -196,11 +199,6 @@ class TopicsController < ApplicationController
 
   private
 
-  def create_topic_view
-    opts = params.slice(:username_filters, :best_of, :page, :post_number, :posts_before, :posts_after, :best)
-    @topic_view = TopicView.new(params[:id] || params[:topic_id], current_user, opts)
-  end
-
   def toggle_mute(v)
     @topic = Topic.where(id: params[:topic_id].to_i).first
     guardian.ensure_can_see!(@topic)
diff --git a/lib/topic_view.rb b/lib/topic_view.rb
index bad4704b5..6bad3c1a3 100644
--- a/lib/topic_view.rb
+++ b/lib/topic_view.rb
@@ -286,6 +286,9 @@ class TopicView
     post_count = (filtered_post_ids.length - 1)
 
     max = [max, post_count].min
+
+    return @posts = [] if min > max
+
     min = [[min, max].min, 0].max
 
     @index_offset = min
diff --git a/public/404.html b/public/404.html
deleted file mode 100644
index 4a8c7246b..000000000
--- a/public/404.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>The resource you wanted can't be found (404)</title>
-  <style type="text/css">
-    body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
-    div.dialog {
-      width: 25em;
-      padding: 0 4em;
-      margin: 4em auto 0 auto;
-      border: 1px solid #ccc;
-      border-right-color: #999;
-      border-bottom-color: #999;
-    }
-    h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
-  </style>
-</head>
-
-<body>
-  <!-- This file lives in public/422.html -->
-  <div class="dialog">
-    <h1>The resource you want can't be found.</h1>
-  </div>
-</body>
-</html>
diff --git a/spec/components/topic_view_spec.rb b/spec/components/topic_view_spec.rb
index 78c3a929f..547d1a477 100644
--- a/spec/components/topic_view_spec.rb
+++ b/spec/components/topic_view_spec.rb
@@ -227,20 +227,11 @@ describe TopicView do
     describe '#filter_posts_paged' do
       before { SiteSetting.stubs(:posts_per_page).returns(1) }
 
-      it 'returns correct posts for first page' do
+      it 'returns correct posts for all pages' do
         topic_view.filter_posts_paged(1).should == [p1, p2]
-      end
-
-      it 'returns correct posts for requested page number' do
         topic_view.filter_posts_paged(2).should == [p2, p3]
-      end
-
-      it 'returns correct posts for last page' do
         topic_view.filter_posts_paged(4).should == [p5]
-      end
-
-      it 'returns posts for last page when page is out of range' do
-        topic_view.filter_posts_paged(100).should == [p5]
+        topic_view.filter_posts_paged(100).should == []
       end
     end