diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index 5614fc1124367768efbc9131fa7bd7cd9d106bda..b7dc560bdfbae4b631f7ba38ef68efefe105243d 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -5,14 +5,14 @@
 class RegistrationsController < Devise::RegistrationsController
   before_action :check_registrations_open_or_valid_invite!, :check_valid_invite!
 
-  layout ->(c) { request.format == :mobile ? "application" : "with_header" }, :only => [:new]
+  layout -> { request.format == :mobile ? "application" : "with_header" }
 
   def create
     @user = User.build(user_params)
-    @user.process_invite_acceptence(invite) if invite.present?
 
     if @user.sign_up
-      flash[:notice] = I18n.t 'registrations.create.success'
+      flash[:notice] = t("registrations.create.success")
+      @user.process_invite_acceptence(invite) if invite.present?
       @user.seed_aspects
       @user.send_welcome_message
       sign_in_and_redirect(:user, @user)
@@ -22,14 +22,10 @@ class RegistrationsController < Devise::RegistrationsController
 
       flash.now[:error] = @user.errors.full_messages.join(" - ")
       logger.info "event=registration status=failure errors='#{@user.errors.full_messages.join(', ')}'"
-      render action: "new", layout: request.format == :mobile ? "application" : "with_header"
+      render action: "new"
     end
   end
 
-  def new
-    super
-  end
-
   private
 
   def check_valid_invite!
@@ -48,9 +44,7 @@ class RegistrationsController < Devise::RegistrationsController
   end
 
   def invite
-    if params[:invite].present?
-      @invite ||= InvitationCode.find_by_token(params[:invite][:token])
-    end
+    @invite ||= InvitationCode.find_by_token(params[:invite][:token]) if params[:invite].present?
   end
 
   helper_method :invite
diff --git a/app/models/invitation_code.rb b/app/models/invitation_code.rb
index 35fa80d490fc24bcf60d193c51b834f81e96f545..10bf5c8d3d89fe65c7bdde226cf7d998b5f3bea2 100644
--- a/app/models/invitation_code.rb
+++ b/app/models/invitation_code.rb
@@ -6,9 +6,9 @@ class InvitationCode < ActiveRecord::Base
   before_create :generate_token, :set_default_invite_count
 
   delegate :name, to: :user, prefix: true
-  
+
   def to_param
-    token 
+    token
   end
 
   def can_be_used?
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 78f5afb20707c60af1d23745250186d9cf2accd1..41e3916c9411a796f14bb87b16c5b7c63cd3b1ae 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -2,20 +2,23 @@
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
-require 'spec_helper'
+require "spec_helper"
 
 describe RegistrationsController, type: :controller do
   before do
     request.env["devise.mapping"] = Devise.mappings[:user]
-    @valid_params = {:user => {
-      :username => "jdoe",
-      :email    => "jdoe@example.com",
-      :password => "password",
-      :password_confirmation => "password"
+  end
+
+  let(:valid_params) {
+    {
+      user: {
+        username:              "jdoe",
+        email:                 "jdoe@example.com",
+        password:              "password",
+        password_confirmation: "password"
       }
     }
-    allow(Person).to receive(:find_or_fetch_by_identifier).and_return(FactoryGirl.create(:person))
-  end
+  }
 
   describe '#check_registrations_open!' do
     before do
@@ -29,7 +32,7 @@ describe RegistrationsController, type: :controller do
     end
 
     it 'redirects #create to the login page' do
-      post :create, @valid_params
+      post :create, valid_params
       expect(flash[:error]).to eq(I18n.t('registrations.closed'))
       expect(response).to redirect_to new_user_session_path
     end
@@ -58,58 +61,71 @@ describe RegistrationsController, type: :controller do
 
       it "creates a user" do
         expect {
-          get :create, @valid_params
+          get :create, valid_params
         }.to change(User, :count).by(1)
       end
 
       it "assigns @user" do
-        get :create, @valid_params
+        get :create, valid_params
         expect(assigns(:user)).to be_truthy
       end
 
       it "sets the flash" do
-        get :create, @valid_params
+        get :create, valid_params
         expect(flash[:notice]).not_to be_blank
       end
 
+      it "uses the invite code" do
+        code = InvitationCode.create(user: bob)
+
+        expect {
+          get :create, valid_params.merge(invite: {token: code.token})
+        }.to change { code.reload.count }.by(-1)
+      end
+
       it "redirects to the home path" do
-        get :create, @valid_params
+        get :create, valid_params
         expect(response).to be_redirect
         expect(response.location).to match /^#{stream_url}\??$/
       end
     end
 
     context "with invalid parameters" do
-      before do
-        @invalid_params = @valid_params
-        @invalid_params[:user][:password_confirmation] = "baddword"
-      end
+      let(:invalid_params) { valid_params.deep_merge(user: {password_confirmation: "baddword"}) }
 
       it "does not create a user" do
-        expect { get :create, @invalid_params }.not_to change(User, :count)
+        expect { get :create, invalid_params }.not_to change(User, :count)
       end
 
       it "does not create a person" do
-        expect { get :create, @invalid_params }.not_to change(Person, :count)
+        expect { get :create, invalid_params }.not_to change(Person, :count)
       end
 
       it "assigns @user" do
-        get :create, @invalid_params
+        get :create, invalid_params
         expect(assigns(:user)).not_to be_nil
       end
 
       it "sets the flash error" do
-        get :create, @invalid_params
+        get :create, invalid_params
         expect(flash[:error]).not_to be_blank
       end
 
+      it "doesn't reduce number of available invites" do
+        code = InvitationCode.create(user: bob)
+
+        expect {
+          get :create, invalid_params.merge(invite: {token: code.token})
+        }.not_to change { code.reload.count }
+      end
+
       it "renders new" do
-        get :create, @invalid_params
+        get :create, invalid_params
         expect(response).to render_template("registrations/new")
       end
 
       it "keeps invalid params in form" do
-        get :create, @invalid_params
+        get :create, invalid_params
         expect(response.body).to match /jdoe@example.com/m
       end
     end