diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index e96ef4a1cc91e2136f7cc5a45219ff8a95b77b9e..2848ea62e183e09a9f9260f136b36a1a1e621afb 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -1,5 +1,6 @@
 class AccountsController < ApplicationController
   before_action :set_account
+  before_action :set_webfinger_header
 
   def show
     respond_to do |format|
@@ -13,4 +14,12 @@ class AccountsController < ApplicationController
   def set_account
     @account = Account.find_by!(username: params[:username], domain: nil)
   end
+
+  def set_webfinger_header
+    response.headers['Link'] = "<#{webfinger_account_url}>; rel=\"lrdd\"; type=\"application/xrd+xml\""
+  end
+
+  def webfinger_account_url
+    webfinger_url(resource: "acct:#{@account.acct}@#{Rails.configuration.x.local_domain}")
+  end
 end
diff --git a/app/controllers/api/salmon_controller.rb b/app/controllers/api/salmon_controller.rb
index 99ec15bff2e46d9af328c3ac1745b0e74f316dac..1df98970059a5e0c3628c233342fdafd8f90e374 100644
--- a/app/controllers/api/salmon_controller.rb
+++ b/app/controllers/api/salmon_controller.rb
@@ -1,4 +1,4 @@
-class Api::SalmonController < ApplicationController
+class Api::SalmonController < ApiController
   before_action :set_account
 
   def update
diff --git a/app/controllers/api/subscriptions_controller.rb b/app/controllers/api/subscriptions_controller.rb
index 56deae10c4a21441fe18e09d5085197b5883afdd..038d6c87761348619d30fd14bff6fff78fc6bd31 100644
--- a/app/controllers/api/subscriptions_controller.rb
+++ b/app/controllers/api/subscriptions_controller.rb
@@ -1,4 +1,4 @@
-class Api::SubscriptionsController < ApplicationController
+class Api::SubscriptionsController < ApiController
   before_action :set_account
 
   def show
diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..eb2e464ebdcdb5eb5f4ffca67a3e590ba2e57c83
--- /dev/null
+++ b/app/controllers/api_controller.rb
@@ -0,0 +1,3 @@
+class ApiController < ApplicationController
+  protect_from_forgery with: :null_session
+end
diff --git a/app/views/accounts/show.atom.ruby b/app/views/accounts/show.atom.ruby
index 54f1185e4fd07e05c1e4efdf054397480d3e906d..eaa4c63b135e2dd48749bd1fe4f9d916f7f2ee9a 100644
--- a/app/views/accounts/show.atom.ruby
+++ b/app/views/accounts/show.atom.ruby
@@ -4,7 +4,7 @@ Nokogiri::XML::Builder.new do |xml|
     title      xml, @account.display_name
     subtitle   xml, @account.note
     updated_at xml, stream_updated_at
-    logo       xml, asset_url(@account.avatar.url(:medium))
+    logo       xml, asset_url(@account.avatar.url(:medium, false))
 
     author(xml) do
       include_author xml, @account
diff --git a/app/views/xrd/webfinger.xml.ruby b/app/views/xrd/webfinger.xml.ruby
index ac0fd3d0ed34a9161bc83b8bbdf2619cc135a2bf..7c920b678dce08380439430c198b56a39dee27fa 100644
--- a/app/views/xrd/webfinger.xml.ruby
+++ b/app/views/xrd/webfinger.xml.ruby
@@ -3,7 +3,7 @@ Nokogiri::XML::Builder.new do |xml|
     xml.Subject @canonical_account_uri
     xml.Alias url_for_target(@account)
     xml.Link(rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: url_for_target(@account))
-    xml.Link(rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: atom_user_stream_url(id: @account.id))
+    xml.Link(rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom'))
     xml.Link(rel: 'salmon', href: api_salmon_url(@account.id))
     xml.Link(rel: 'magic-public-key', href: @magic_key)
   end
diff --git a/spec/services/fetch_feed_service_spec.rb b/spec/services/fetch_feed_service_spec.rb
index c6a3d389bfc13e5e6ea8e2c4d497cd6efe2892b2..a28333fe3794a129bc89ee917e6db50a6eff79f9 100644
--- a/spec/services/fetch_feed_service_spec.rb
+++ b/spec/services/fetch_feed_service_spec.rb
@@ -1,5 +1,8 @@
 require 'rails_helper'
 
 RSpec.describe FetchFeedService do
-  pending
+  subject { FetchFeedService.new }
+
+  it 'fetches remote user\'s feed'
+  it 'processes the feed'
 end
diff --git a/spec/services/follow_remote_account_service_spec.rb b/spec/services/follow_remote_account_service_spec.rb
index fbe7e767a4686f58b7fa43a3dd5b1c35ed4c0e8f..27df76457e8582d926d53dd4df733ebb03e576f9 100644
--- a/spec/services/follow_remote_account_service_spec.rb
+++ b/spec/services/follow_remote_account_service_spec.rb
@@ -1,5 +1,12 @@
 require 'rails_helper'
 
 RSpec.describe FollowRemoteAccountService do
-  pending
+  subject { FollowRemoteAccountService.new }
+
+  it 'returns nil if no such user can be resolved via webfinger'
+  it 'returns nil if the domain does not have webfinger'
+  it 'returns nil if remote user does not offer a hub URL'
+  it 'returns an already existing remote account'
+  it 'returns a new remote account'
+  it 'fills the remote account with profile information'
 end
diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb
index ba393f5ab75938b0596c5cd3a3ab88672a0fa539..304e0cf71a2ff0c164675bebd050d588bcf7c9b2 100644
--- a/spec/services/follow_service_spec.rb
+++ b/spec/services/follow_service_spec.rb
@@ -1,5 +1,9 @@
 require 'rails_helper'
 
 RSpec.describe FollowService do
-  pending
+  subject { FollowService.new }
+
+  it 'creates a following relation'
+  it 'creates local account for remote user'
+  it 'sends follow to the remote user'
 end
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index 43d58719d623af15970ca3f6bd8a9b3ca63791ec..9ee4daf6f5f2e2fde4e60ef5b9cf79550b8ccfca 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -1,5 +1,10 @@
 require 'rails_helper'
 
 RSpec.describe PostStatusService do
-  pending
+  subject { PostStatusService.new }
+
+  it 'creates a new status'
+  it 'creates a new response status'
+  it 'processes mentions'
+  it 'pings PuSH hubs'
 end
diff --git a/spec/services/process_feed_service_spec.rb b/spec/services/process_feed_service_spec.rb
index 087979ded119fe70c653234a852e0b010fc1bfaa..85805382381bd3e7ce3e5b3014ac0206ee575f6d 100644
--- a/spec/services/process_feed_service_spec.rb
+++ b/spec/services/process_feed_service_spec.rb
@@ -1,5 +1,8 @@
 require 'rails_helper'
 
 RSpec.describe ProcessFeedService do
-  pending
+  subject { ProcessFeedService.new }
+
+  it 'updates remote user\'s account information'
+  it 'creates local copies of all notes and comments'
 end
diff --git a/spec/services/process_interaction_service_spec.rb b/spec/services/process_interaction_service_spec.rb
index 8624d0b0cd39d843b7b3228ea85cea8ff0b1f5f7..931815dc2cf52f8a912047eccf9cab2d8db550d3 100644
--- a/spec/services/process_interaction_service_spec.rb
+++ b/spec/services/process_interaction_service_spec.rb
@@ -1,5 +1,15 @@
 require 'rails_helper'
 
 RSpec.describe ProcessInteractionService do
-  pending
+  subject { ProcessInteractionService.new }
+
+  it 'creates account for new remote user'
+  it 'updates account for existing remote user'
+  it 'ignores envelopes that do not address the local user'
+  it 'accepts a status that mentions the local user'
+  it 'accepts a status that is a reply to the local user\'s'
+  it 'accepts a favourite to a status by the local user'
+  it 'accepts a reblog of a status of the local user'
+  it 'accepts a follow of the local user'
+  it 'accepts an unfollow of the local user'
 end
diff --git a/spec/services/process_mentions_service_spec.rb b/spec/services/process_mentions_service_spec.rb
index ae86d17dc9980b07dfc798818ef2feab74d97247..984d1374651b0c01c09f56debc48b6370fa3bae6 100644
--- a/spec/services/process_mentions_service_spec.rb
+++ b/spec/services/process_mentions_service_spec.rb
@@ -1,5 +1,22 @@
 require 'rails_helper'
 
 RSpec.describe ProcessMentionsService do
-  pending
+  let(:account)     { Fabricate(:account, username: 'alice') }
+  let(:remote_user) { Fabricate(:account, username: 'remote_user', domain: 'example.com', salmon_url: 'http://salmon.example.com') }
+  let(:status)      { Fabricate(:status, account: account, text: "Hello @#{remote_user.acct}") }
+
+  subject { ProcessMentionsService.new }
+
+  before do
+    stub_request(:post, remote_user.salmon_url)
+    subject.(status)
+  end
+
+  it 'creates a mention' do
+    expect(remote_user.mentions.where(status: status).count).to eq 1
+  end
+
+  it 'posts to remote user\'s Salmon end point' do
+    expect(a_request(:post, remote_user.salmon_url)).to have_been_made
+  end
 end
diff --git a/spec/services/send_interaction_service_spec.rb b/spec/services/send_interaction_service_spec.rb
index ae4ab01c54aab74bd960c1222ec2933a17aa3f73..ff08394b0f6329d1a3d6552299ee23d56e349322 100644
--- a/spec/services/send_interaction_service_spec.rb
+++ b/spec/services/send_interaction_service_spec.rb
@@ -1,5 +1,7 @@
 require 'rails_helper'
 
 RSpec.describe SendInteractionService do
-  pending
+  subject { SendInteractionService.new }
+
+  it 'sends an XML envelope to the Salmon end point of remote user'
 end
diff --git a/spec/services/setup_local_account_service_spec.rb b/spec/services/setup_local_account_service_spec.rb
index 709f170b689b01c02ebc475635956ece8978099b..2e85fc4f5c2f69252c6db5e544ada63464054869 100644
--- a/spec/services/setup_local_account_service_spec.rb
+++ b/spec/services/setup_local_account_service_spec.rb
@@ -1,5 +1,8 @@
 require 'rails_helper'
 
 RSpec.describe SetupLocalAccountService do
-  pending
+  subject { SetupLocalAccountService.new }
+
+  it 'creates a user'
+  it 'creates an account for the user'
 end
diff --git a/spec/services/unfollow_service_spec.rb b/spec/services/unfollow_service_spec.rb
index 60121b675fbd74bed3aff513b3d1428cf7aee05a..58467ff007389d67fa71c053dd3eff90c1e1bdcd 100644
--- a/spec/services/unfollow_service_spec.rb
+++ b/spec/services/unfollow_service_spec.rb
@@ -1,5 +1,8 @@
 require 'rails_helper'
 
 RSpec.describe UnfollowService do
-  pending
+  subject { UnfollowService.new }
+
+  it 'destroys the following relation'
+  it 'sends remote interactionf or remote user'
 end