diff --git a/app/assets/javascripts/app/views/post-viewer/nav.js b/app/assets/javascripts/app/views/post-viewer/nav.js
index 736535d7604d1f308bde2aacad5a0c4733ff03ea..1fa714fa6c8fcfdbdc1279e2e77c23ccc801d5ce 100644
--- a/app/assets/javascripts/app/views/post-viewer/nav.js
+++ b/app/assets/javascripts/app/views/post-viewer/nav.js
@@ -1,11 +1,6 @@
 app.views.PostViewerNav = app.views.Base.extend({
-
   templateName: "post-viewer/nav",
 
-  events : {
-    "click a" : "pjax"
-  },
-
   postRenderTemplate : function() {
     var mappings = {"#forward" : "next_post",
                     "#back" : "previous_post"};
@@ -17,14 +12,5 @@ app.views.PostViewerNav = app.views.Base.extend({
 
   setArrow : function(arrow, loc) {
     loc ? arrow.attr('href', loc) : arrow.remove()
-  },
-
-  pjax : function(evt) {
-    if(evt) { evt.preventDefault(); }
-    var link;
-
-    evt.target.tagName != "A" ? link = $(evt.target).closest("a") : link = $(evt.target)
-    app.router.navigate(link.attr("href").substring(1), true)
   }
-
 });
\ No newline at end of file
diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb
index e3d86b0c40c5ee072c2c907b27133f8d58e40252..12d047e98318f08deaced8f3b710a76c79eea74a 100644
--- a/app/controllers/posts_controller.rb
+++ b/app/controllers/posts_controller.rb
@@ -9,6 +9,7 @@ class PostsController < ApplicationController
   
   before_filter :authenticate_user!, :except => [:show, :iframe, :oembed]
   before_filter :set_format_if_malformed_from_status_net, :only => :show
+  before_filter :find_post, :only => [:show, :next, :previous]
 
   layout 'post'
 
@@ -24,28 +25,19 @@ class PostsController < ApplicationController
   end
 
   def show
-    @post = find_by_guid_or_id_with_current_user(params[:id])
-
-    if @post
-      # @commenting_disabled = can_not_comment_on_post?
-      # mark corresponding notification as read
-      if user_signed_in? && notification = Notification.where(:recipient_id => current_user.id, :target_id => @post.id).first
-        notification.unread = false
-        notification.save
-      end
-
-      respond_to do |format|
-        format.html{ gon.post = postJson; render 'posts/show.html.haml' }
-        format.xml{ render :xml => @post.to_diaspora_xml }
-        format.mobile{render 'posts/show.mobile.haml', :layout => "application"}
-        format.json{ render :json => postJson }
-      end
+    return log_and_redirect_back unless @post
+    # @commenting_disabled = can_not_comment_on_post?
+    # mark corresponding notification as read
+    if user_signed_in? && notification = Notification.where(:recipient_id => current_user.id, :target_id => @post.id).first
+      notification.unread = false
+      notification.save
+    end
 
-    else
-      user_id = (user_signed_in? ? current_user : nil)
-      Rails.logger.info(":event => :link_to_nonexistent_post, :ref => #{request.env['HTTP_REFERER']}, :user_id => #{user_id}, :post_id => #{params[:id]}")
-      flash[:error] = I18n.t('posts.show.not_found')
-      redirect_to :back
+    respond_to do |format|
+      format.html{ gon.post = postJson; render 'posts/show.html.haml' }
+      format.xml{ render :xml => @post.to_diaspora_xml }
+      format.mobile{render 'posts/show.mobile.haml', :layout => "application"}
+      format.json{ render :json => postJson }
     end
   end
 
@@ -88,8 +80,31 @@ class PostsController < ApplicationController
     end
   end
 
+  def next
+    redirect_to post_path(post_base.newer(@post))
+  end
+
+  def previous
+    redirect_to post_path(post_base.older(@post))
+  end
+
   protected
 
+  def log_and_redirect_back #preserving old functionality, but this should probably be removed
+    user_id = (user_signed_in? ? current_user : nil)
+    Rails.logger.info(":event => :link_to_nonexistent_post, :ref => #{request.env['HTTP_REFERER']}, :user_id => #{user_id}, :post_id => #{params[:id]}")
+    flash[:error] = I18n.t('posts.show.not_found')
+    redirect_to :back
+  end
+
+  def find_post
+    @post = find_by_guid_or_id_with_current_user(params[:id])
+  end
+
+  def post_base
+    Post.visible_from_author(@post.author, current_user)
+  end
+
   def postJson
     PostPresenter.new(@post, current_user).to_json
   end
@@ -101,7 +116,6 @@ class PostsController < ApplicationController
     else
       Post.where(key => id, :public => true).includes(:author, :comments => :author).first
     end
-
   end
 
   def set_format_if_malformed_from_status_net
diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb
index 5d22950a7ea81eb500c4b48f7aa6f7714a3f8999..ebb65d937f8bcf0cf5e251e38232fd5aeb7c26df 100644
--- a/app/presenters/post_presenter.rb
+++ b/app/presenters/post_presenter.rb
@@ -4,116 +4,94 @@ class PostPresenter
   attr_accessor :post, :current_user
 
   def initialize(post, current_user = nil)
-    self.post = post
-    self.current_user = current_user
+    @post = post
+    @current_user = current_user
   end
 
   def to_json(options = {})
-    self.post.as_api_response(:backbone).update(
+    @post.as_api_response(:backbone).update(
         {
-        :user_like => self.user_like,
-        :user_participation => self.user_participation,
-        :likes_count => self.post.likes.count,
-        :participations_count => self.post.participations.count,
-        :reshares_count => self.post.reshares.count,
-        :user_reshare => self.user_reshare,
-        :next_post => self.next_post_path,
-        :previous_post => self.previous_post_path,
-        :likes => self.likes,
-        :reshares => self.reshares,
-        :comments => self.comments,
-        :participations => self.participations,
-        :frame_name => self.post.frame_name || template_name,
+        :user_like => user_like,
+        :user_participation => user_participation,
+        :likes_count => @post.likes.count,
+        :participations_count => @post.participations.count,
+        :reshares_count => @post.reshares.count,
+        :user_reshare => user_reshare,
+        :next_post => next_post_path,
+        :previous_post => previous_post_path,
+        :likes => likes,
+        :reshares => reshares,
+        :comments => comments,
+        :participations => participations,
+        :frame_name => @post.frame_name || template_name,
         :title => title
       })
   end
 
+  def next_post_path
+    Rails.application.routes.url_helpers.next_post_path(@post)
+  end
+
+  def previous_post_path
+    Rails.application.routes.url_helpers.previous_post_path(@post)
+  end
+
   def comments
-    as_api(post.comments)
+    as_api(@post.comments)
   end
 
   def likes
-    as_api(post.likes)
+    as_api(@post.likes)
   end
 
   def reshares
-    as_api(post.reshares)
+    as_api(@post.reshares)
   end
 
   def participations
-    as_api(post.participations)
+    as_api(@post.participations)
   end
 
-
   def user_like
     return unless user_signed_in?
-    if like = post.likes.where(:author_id => person.id).first
-      like.as_api_response(:backbone)
-    end
+    @post.likes.where(:author_id => person.id).first.try(:as_api_response, :backbone)
   end
 
   def user_participation
     return unless user_signed_in?
-    if participation = post.participations.where(:author_id => person.id).first
-      participation.as_api_response(:backbone)
-    end
+    @post.participations.where(:author_id => person.id).first.try(:as_api_response, :backbone)
   end
 
   def user_reshare
     return unless user_signed_in?
-    self.post.reshares.where(:author_id => person.id).first
-  end
-
-  def next_post_path
-    if n = next_post
-      Rails.application.routes.url_helpers.post_path(n)
-    end
-  end
-
-  def previous_post_path
-    if p = previous_post
-      Rails.application.routes.url_helpers.post_path(p)
-    end
+    @post.reshares.where(:author_id => person.id).first
   end
 
   def title
-    if post.text.present?
-      post.text(:plain_text => true)
+    if @post.text.present?
+      @post.text(:plain_text => true)
     else
-      I18n.translate('posts.presenter.title', :name => post.author.name)
+      I18n.translate('posts.presenter.title', :name => @post.author.name)
     end  
   end
 
-  def template_name
-    @template_name ||= TemplatePicker.new(post).template_name
+  def template_name #kill me, lol, I should be client side
+    @template_name ||= TemplatePicker.new(@post).template_name
   end
 
   protected
 
-  def next_post
-    post_base.newer(post)
-  end
-
-  def previous_post
-    post_base.older(post)
-  end
-
   def as_api(collection)
     collection.includes(:author => :profile).all.map do |element|
       element.as_api_response(:backbone)
     end
   end
 
-  def post_base
-    Post.visible_from_author(self.post.author, current_user)
-  end
-
   def person
-    self.current_user.person
+    @current_user.person
   end
 
   def user_signed_in?
-    current_user.present?
+    @current_user.present?
   end
-
 end
diff --git a/config/routes.rb b/config/routes.rb
index 389b3c0e61d6ab6dade9890ba69971e1ee7ccc84..26a500e586b5b5c044256427ce6a1dc2ac3ed3c7 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -12,6 +12,10 @@ Diaspora::Application.routes.draw do
   resources :status_messages, :only => [:new, :create]
 
   resources :posts do
+    member do
+      get :next
+      get :previous
+    end
     resources :likes, :only => [:create, :destroy, :index]
     resources :participations, :only => [:create, :destroy, :index]
     resources :comments, :only => [:new, :create, :destroy, :index]