diff --git a/app/models/photo.rb b/app/models/photo.rb
index 6c96e425cebcbec153c1ac1ae8b7c8e81769c037..1eb0aa10e6b0e145e82c00aee993a41b8996a3ac 100644
--- a/app/models/photo.rb
+++ b/app/models/photo.rb
@@ -34,15 +34,11 @@ class Photo < Post
   before_destroy :ensure_user_picture
 
   def self.instantiate(params = {})
+    photo = super(params)
     image_file = params.delete(:user_file)
-    person = params.delete(:person)
-
-    photo = Photo.new(params)
-    photo.diaspora_handle = params[:diaspora_handle]
 
+    photo.album_id = params[:album_id]
     photo.image.store! image_file
-    photo.person = person
-    photo.save
     photo
   end
 
diff --git a/app/models/user.rb b/app/models/user.rb
index 516a6cc71e391fb2fae7751c707ae72eb9b482a4..9784a480f7660f1cb565aef52da53d2126bbb3cc 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -138,29 +138,43 @@ class User
   end
 
   ######## Posting ########
-  def post(class_name, options = {})
-    if class_name == :photo && !options[:album_id].to_s.empty?
-      aspect_ids = aspects_with_post(options[:album_id])
+  def post(class_name, opts = {})
+    post = build_post(class_name, opts)
+
+    if post.save
+      raise 'MongoMapper failed to catch a failed save' unless post.id
+      dispatch_post(post, :to => opts[:to])
+    end
+    post
+  end
+
+  def build_post(class_name, opts = {})
+    opts[:person] = self.person
+    opts[:diaspora_handle] = self.person.diaspora_handle
+
+    model_class = class_name.to_s.camelize.constantize
+    model_class.instantiate(opts)
+  end
+
+  def dispatch_post(post, opts = {})
+    if post.is_a?(Photo) && post.album_id
+      aspect_ids = aspects_with_post(post.album_id)
       aspect_ids.map! { |aspect| aspect.id }
     else
-      aspect_ids = options.delete(:to)
+      aspect_ids = opts.delete(:to)
     end
 
     aspect_ids = validate_aspect_permissions(aspect_ids)
-
-    post = build_post(class_name, options)
-
-    if post.persisted?
-      Rails.logger.info("Pushing: #{post.inspect} out to aspects")
-      push_to_aspects(post, aspect_ids)
-      post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid)
-      if options[:public] == true
-        self.services.each do |service|
-          self.send("post_to_#{service.provider}".to_sym, service, post.message)
-        end
+    self.raw_visible_posts << post
+    self.save
+    Rails.logger.info("Pushing: #{post.inspect} out to aspects")
+    push_to_aspects(post, aspect_ids)
+    post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid)
+    if post.public
+      self.services.each do |service|
+        self.send("post_to_#{service.provider}".to_sym, service, post.message)
       end
     end
-    post
   end
 
   def post_to_facebook(service, message)
@@ -178,6 +192,8 @@ class User
   def update_post(post, post_hash = {})
     if self.owns? post
       post.update_attributes(post_hash)
+      aspects = aspects_with_post(post.id)
+      self.push_to_aspects(post, aspects)
     end
   end
 
@@ -201,20 +217,6 @@ class User
     aspect_ids
   end
 
-  def build_post(class_name, options = {})
-    options[:person] = self.person
-    options[:diaspora_handle] = self.person.diaspora_handle
-
-    model_class = class_name.to_s.camelize.constantize
-    post = model_class.instantiate(options)
-    if post.save
-      raise 'MongoMapper failed to catch a failed save' unless post.id
-      self.raw_visible_posts << post
-      self.save
-    end
-    post
-  end
-
   def push_to_aspects(post, aspect_ids)
     if aspect_ids == :all || aspect_ids == "all"
       aspects = self.aspects
diff --git a/lib/em-webfinger.rb b/lib/em-webfinger.rb
index f5c4c6148611699500134c182ede0013e85ef948..f6a3539f704f670e04a15dcbb0154475218d6658 100644
--- a/lib/em-webfinger.rb
+++ b/lib/em-webfinger.rb
@@ -6,6 +6,7 @@ class EMWebfinger
   def initialize(account)
     @account = account.strip.gsub('acct:','').to_s
     @callbacks = []
+    @ssl = true 
     # Raise an error if identifier has a port number 
     raise "Identifier is invalid" if(@account.strip.match(/\:\d+$/))
     # Raise an error if identifier is not a valid email (generous regexp)
@@ -34,12 +35,21 @@ class EMWebfinger
       profile_url = webfinger_profile_url(http.response)
       if profile_url 
         get_webfinger_profile(profile_url) 
+      elsif @ssl
+        @ssl = false
+        get_xrd
       else
         process_callbacks  "webfinger does not seem to be enabled for #{@account}'s host"
       end
     }
 
-    http.errback { process_callbacks "there was an error getting the xrd from account#{@account}" }
+    http.errback {
+      if @ssl
+        @ssl = false
+        get_xrd
+      else
+        process_callbacks "there was an error getting the xrd from account#{@account}" 
+      end }
   end
 
 
@@ -73,25 +83,18 @@ class EMWebfinger
   ##helpers
   private
 
-  def check_nil_response(html)
-
-  end
-
-
-
   def webfinger_profile_url(xrd_response)
     doc = Nokogiri::XML::Document.parse(xrd_response)  
     return nil if doc.namespaces["xmlns"] != "http://docs.oasis-open.org/ns/xri/xrd-1.0" 
     swizzle doc.at('Link[rel=lrdd]').attribute('template').value
   end
 
-  def xrd_url(ssl = false)
+  def xrd_url
     domain = @account.split('@')[1]
-    "http#{'s' if ssl}://#{domain}/.well-known/host-meta"
+    "http#{'s' if @ssl}://#{domain}/.well-known/host-meta"
   end
   
   def swizzle(template)
     template.gsub '{uri}', @account
   end
-
 end
diff --git a/lib/tasks/cruise.rake b/lib/tasks/cruise.rake
index e3a7a65a132200618979edff52b6f32055039e2c..91c3f31d889a14a6e1db5deb562f510f94354c61 100644
--- a/lib/tasks/cruise.rake
+++ b/lib/tasks/cruise.rake
@@ -1,10 +1,13 @@
 namespace :cruise do
   desc "Run all specs and features"
   task :cruise => :environment do
-    system('/etc/init.d/xvfb start')
+    puts "Starting virtual display..."
+    `sh -e /etc/init.d/xvfb start`
+    puts "Starting specs..."
     system('export DISPLAY=:99.0 && export SELENIUM_SERVER_PORT=53809 && bundle exec rake')
     exit_status = $?.exitstatus
-    system('/etc/init.d/xvfb stop')
+    puts "Stopping virtual display..."
+    `sh -e /etc/init.d/xvfb stop`
     raise "tests failed!" unless exit_status == 0
   end
 end
diff --git a/spec/lib/em-webfinger_spec.rb b/spec/lib/em-webfinger_spec.rb
index 9c6d384a2e7dc8f01a5edbcc5fe61cdbf474970c..5441d3f911de94a1aee7bbaade4a409229fde973 100644
--- a/spec/lib/em-webfinger_spec.rb
+++ b/spec/lib/em-webfinger_spec.rb
@@ -47,6 +47,11 @@ describe EMWebfinger do
           EMWebfinger.new('eviljoe@diaspora.local:3000')
         }.should raise_error(RuntimeError, "Identifier is invalid")
       end  
+
+      it 'should set ssl as the default' do
+        foo = EMWebfinger.new(account)
+        foo.instance_variable_get(:@ssl).should be true
+      end
     end
 
 
@@ -94,14 +99,14 @@ describe EMWebfinger do
       end
 
       describe '#xrd_url' do
-        it 'should return canonical host-meta url' do
+        it 'should return canonical host-meta url for http' do
+          finger.instance_variable_set(:@ssl, false)
           finger.send(:xrd_url).should == "http://tom.joindiaspora.com/.well-known/host-meta"
         end
 
         it 'can return the https version' do
-          finger.send(:xrd_url, true).should == "https://tom.joindiaspora.com/.well-known/host-meta"
+          finger.send(:xrd_url).should == "https://tom.joindiaspora.com/.well-known/host-meta"
         end
-
       end
     end
 
@@ -127,7 +132,58 @@ describe EMWebfinger do
 
         EM.run {
           f.on_person{ |p| 
-          p.valid?.should be true 
+            p.valid?.should be true 
+            EM.stop
+          }
+        }
+      end
+      
+      it 'should retry with http if https fails' do
+        good_request.callbacks = [nil, diaspora_xrd, diaspora_finger, hcard_xml]
+
+        #new_person = Factory.build(:person, :diaspora_handle => "tom@tom.joindiaspora.com")
+        # http://tom.joindiaspora.com/.well-known/host-meta 
+        f = EMWebfinger.new("tom@tom.joindiaspora.com") 
+
+        EventMachine::HttpRequest.should_receive(:new).exactly(4).times.and_return(good_request)
+
+        f.should_receive(:xrd_url).twice
+
+        EM.run {
+          f.on_person{ |p| 
+            EM.stop
+          }
+        }
+      end
+
+      it 'must try https first' do
+        single_request = FakeHttpRequest.new(:success)
+        single_request.callbacks = [diaspora_xrd]
+        good_request.callbacks = [diaspora_finger, hcard_xml]
+        EventMachine::HttpRequest.should_receive(:new).with("https://tom.joindiaspora.com/.well-known/host-meta").and_return(single_request)
+        EventMachine::HttpRequest.should_receive(:new).exactly(2).and_return(good_request)
+
+        f = EMWebfinger.new("tom@tom.joindiaspora.com") 
+
+        EM.run {
+          f.on_person{ |p| 
+            EM.stop
+          }
+        }
+      end
+
+      it 'should retry with http if https fails with an http error code' do
+        bad_request = FakeHttpRequest.new(:failure)
+
+        good_request.callbacks = [diaspora_xrd, diaspora_finger, hcard_xml]
+
+        EventMachine::HttpRequest.should_receive(:new).with("https://tom.joindiaspora.com/.well-known/host-meta").and_return(bad_request)
+        EventMachine::HttpRequest.should_receive(:new).exactly(3).and_return(good_request)
+
+        f = EMWebfinger.new("tom@tom.joindiaspora.com") 
+
+        EM.run {
+          f.on_person{ |p| 
           EM.stop
         }
         }
diff --git a/spec/lib/websocket_spec.rb b/spec/lib/websocket_spec.rb
index e3917008a05713a3a9980a3bdbc0d599e05b7fb2..2615ac82d05c721ae545dcff3602a3d7f435c662 100644
--- a/spec/lib/websocket_spec.rb
+++ b/spec/lib/websocket_spec.rb
@@ -9,6 +9,7 @@ describe Diaspora::WebSocket do
     @user = make_user
     @aspect = @user.aspects.create(:name => "losers")
     @post = @user.build_post(:status_message, :message => "hey", :to => @aspect.id)
+    @post.save
   end
 
   it 'should queue a job' do
diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb
index f0e38fa4210cf4737000f6ecadcc065e01bc2040..0e2513e1dc051db86e3c58fef636f41535683fa6 100644
--- a/spec/models/photo_spec.rb
+++ b/spec/models/photo_spec.rb
@@ -42,16 +42,19 @@ describe Photo do
     it 'sets the persons diaspora handle' do
       @photo2.diaspora_handle.should == @user.person.diaspora_handle
     end
-  end
+    it 'has a constructor' do
+      image = File.open(@fixture_name)
+      photo = Photo.instantiate(
+                :person => @user.person, :album => @album, :user_file => image)
+      photo.created_at.nil?.should be true
+      photo.image.read.nil?.should be false
+      photo.album.should == @album
+    end
 
-  it 'has a constructor' do
-    image = File.open(@fixture_name)
-    photo = Photo.instantiate(
-              :person => @user.person, :album => @album, :user_file => image)
-    photo.created_at.nil?.should be false
-    photo.image.read.nil?.should be false
   end
 
+
+
   it 'should save a photo' do
     @photo.image.store! File.open(@fixture_name)
     @photo.save.should == true
diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb
index 734c187fcab3ac6884b6b8d092b879ed2afa2343..79233cb4c1f7f2eb2359cdb1c7ae67b8026f27c0 100644
--- a/spec/models/user/posting_spec.rb
+++ b/spec/models/user/posting_spec.rb
@@ -36,7 +36,19 @@ describe User do
     end
   end
 
-  describe '#post' do
+  describe '#build_post' do
+    it 'does not save a status_message' do
+      post = user.build_post(:status_message, :message => "hey", :to => aspect.id)
+      post.persisted?.should be_false
+    end
+
+    it 'does not save an album' do
+      post = user.build_post(:album, :name => "hey", :to => aspect.id)
+      post.persisted?.should be_false
+    end
+  end
+
+  describe '#dispatch_post' do
     it 'should put the post in the aspect post array' do
       post = user.post(:status_message, :message => "hey", :to => aspect.id)
       aspect.reload
@@ -67,7 +79,6 @@ describe User do
       user.should_receive(:post_to_facebook).exactly(0).times
       user.post :status_message, :message => "hi", :to => "all"
     end
-
   end
 
   describe '#update_post' do
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 55c5575fb2816bf708d48b7e3e5d3519033aa111..6c5a2d0bce9d2f7a6764c01efc716abf1f685eab 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -226,6 +226,15 @@ describe User do
     end
   end
 
+  describe '#update_post' do
+
+    it 'sends a notification to aspects' do
+      user.should_receive(:push_to_aspects).twice
+      album = user.post(:album, :name => "cat", :to => aspect.id)
+      user.update_post(album, :name => 'bat')
+    end
+  end
+
   describe 'account removal' do
     it 'should unfriend everyone' do
       user.should_receive(:unfriend_everyone)