diff --git a/app/assets/javascripts/app/app.js b/app/assets/javascripts/app/app.js
index 2991abf414b0fa1d174e4549454097817084744b..21849fcacb1df18bc05315bf7421b74a9140502c 100644
--- a/app/assets/javascripts/app/app.js
+++ b/app/assets/javascripts/app/app.js
@@ -61,7 +61,7 @@ var app = {
       var preload = window.preloads[prop]
       delete window.preloads[prop] //prevent dirty state across navigates
 
-      return JSON.parse(preload)
+      return(preload)
   }
 };
 
diff --git a/app/assets/javascripts/app/models/post.js b/app/assets/javascripts/app/models/post.js
index 0f3b2b771f2d9c2b2982e71e1818e0ade644c600..e6f01de60d83ed7183ba68e5f16ea7036f065c81 100644
--- a/app/assets/javascripts/app/models/post.js
+++ b/app/assets/javascripts/app/models/post.js
@@ -91,6 +91,12 @@ app.models.Post = Backbone.Model.extend(_.extend({}, app.models.formatDateMixin,
     var body = this.get("text").trim()
       , newlineIdx = body.indexOf("\n")
     return (newlineIdx > 0 ) ? body.substr(newlineIdx+1, body.length) : ""
+  },
+
+  //returns a promise
+  preloadOrFetch : function(){
+    var action = app.hasPreload("post") ? this.set(app.parsePreload("post")) : this.fetch()
+    return $.when(action)
   }
 }), {
   headlineLimit : 118,
diff --git a/app/assets/javascripts/app/pages/post-viewer.js b/app/assets/javascripts/app/pages/post-viewer.js
index 45b88b4abf5824390004b0b5de991cd95342911a..832f95cc60ad95ba2a7d288f0d4849dd82076f83 100644
--- a/app/assets/javascripts/app/pages/post-viewer.js
+++ b/app/assets/javascripts/app/pages/post-viewer.js
@@ -10,7 +10,7 @@ app.pages.PostViewer = app.views.Base.extend({
 
   initialize : function(options) {
     this.model = new app.models.Post({ id : options.id });
-    this.model.fetch().success(_.bind(this.initViews, this));
+    this.model.preloadOrFetch().done(_.bind(this.initViews, this));
 
     this.prepIdleHooks();
 
diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb
index 379ee52f91521e89a15de18aa12e66eb66fa5fcc..81a3b2b836eedf9652fe7d475b013b7aeafb349e 100644
--- a/app/controllers/people_controller.rb
+++ b/app/controllers/people_controller.rb
@@ -119,8 +119,7 @@ class PeopleController < ApplicationController
       format.all do
         if params[:ex]
           @page = :experimental
-          json = @stream.stream_posts.as_api_response(:backbone).to_json
-          gon.stream = json
+          gon.stream = @stream.stream_posts.as_api_response(:backbone).as_json
           render :nothing => true, :layout => 'post'
         else
           respond_with @person, :locals => {:post_type => :all}
diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb
index 7e9aa8a621016b109982285e9870c3aa23ce195b..e3d86b0c40c5ee072c2c907b27133f8d58e40252 100644
--- a/app/controllers/posts_controller.rb
+++ b/app/controllers/posts_controller.rb
@@ -35,10 +35,10 @@ class PostsController < ApplicationController
       end
 
       respond_to do |format|
-        format.html{render 'posts/show.html.haml'}
+        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 => PostPresenter.new(@post, current_user).to_json }
+        format.json{ render :json => postJson }
       end
 
     else
@@ -88,7 +88,11 @@ class PostsController < ApplicationController
     end
   end
 
-  private
+  protected
+
+  def postJson
+    PostPresenter.new(@post, current_user).to_json
+  end
 
   def find_by_guid_or_id_with_current_user(id)
     key = id.to_s.length <= 8 ? :id : :guid