diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index b7dc560bdfbae4b631f7ba38ef68efefe105243d..561c52ea0945064f7b5d1a5d25959656ba92f8a7 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -3,7 +3,7 @@
 #   the COPYRIGHT file.
 
 class RegistrationsController < Devise::RegistrationsController
-  before_action :check_registrations_open_or_valid_invite!, :check_valid_invite!
+  before_action :check_registrations_open_or_valid_invite!
 
   layout -> { request.format == :mobile ? "application" : "with_header" }
 
@@ -28,19 +28,11 @@ class RegistrationsController < Devise::RegistrationsController
 
   private
 
-  def check_valid_invite!
-    return true if AppConfig.settings.enable_registrations? #this sucks
-    return true if invite && invite.can_be_used?
-    flash[:error] = t('registrations.invalid_invite')
-    redirect_to new_user_session_path
-  end
-
   def check_registrations_open_or_valid_invite!
-    return true if invite.present?
-    unless AppConfig.settings.enable_registrations?
-      flash[:error] = t('registrations.closed')
-      redirect_to new_user_session_path
-    end
+    return true if AppConfig.settings.enable_registrations? || invite.try(:can_be_used?)
+
+    flash[:error] = params[:invite] ? t("registrations.invalid_invite") : t("registrations.closed")
+    redirect_to new_user_session_path
   end
 
   def invite
diff --git a/app/models/user.rb b/app/models/user.rb
index 8d941a8c540ce0644babfe1ad75a781d98b6f1a5..e2243d73b0e7b727db6aa74a79215057cc1399c0 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -99,10 +99,9 @@ class User < ActiveRecord::Base
 
   def process_invite_acceptence(invite)
     self.invited_by = invite.user
-    invite.use!
+    invite.use! unless AppConfig.settings.enable_registrations?
   end
 
-
   def invitation_code
     InvitationCode.find_or_create_by(user_id: self.id)
   end
diff --git a/app/views/invitations/new.html.haml b/app/views/invitations/new.html.haml
index 43a3603977e4a4e03933dc8b139f3a83191599c2..187a6fa12a91c01280ee1c07e603af0eea027ba6 100644
--- a/app/views/invitations/new.html.haml
+++ b/app/views/invitations/new.html.haml
@@ -1,7 +1,7 @@
 #paste_link
   = t('.paste_link')
   %span#codes_left
-    = '(' + t('.codes_left', count: @invite_code.count) + ')'
+    = "(" + t(".codes_left", count: @invite_code.count) + ")" unless AppConfig.settings.enable_registrations?
 .form-horizontal
   .control-group
     = invite_link(@invite_code)
diff --git a/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb b/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb
index b1bbf103aac527e668de71281d0c3980fe79cceb..0ef8272490556dc0fea41f42e6d08b2c338c55d3 100644
--- a/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb
+++ b/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb
@@ -1,4 +1,7 @@
 class CleanupInvitationColumnsFromUsers < ActiveRecord::Migration
+  class InvitationCode < ActiveRecord::Base
+  end
+
   class User < ActiveRecord::Base
   end
 
@@ -20,7 +23,7 @@ class CleanupInvitationColumnsFromUsers < ActiveRecord::Migration
 
     add_index :users, :email, name: :index_users_on_email, unique: true, length: 191
 
-    drop_invitations_table
+    cleanup_invitations
   end
 
   def username_not_null
@@ -36,10 +39,14 @@ class CleanupInvitationColumnsFromUsers < ActiveRecord::Migration
     end
   end
 
-  def drop_invitations_table
+  def cleanup_invitations
     reversible do |dir|
       dir.up do
         drop_table :invitations
+
+        # reset negative invitation counters
+        new_counter = AppConfig.settings.enable_registrations? ? AppConfig["settings.invitations.count"] : 0
+        InvitationCode.where("count < 0").update_all(count: new_counter)
       end
 
       dir.down do
diff --git a/features/step_definitions/user_steps.rb b/features/step_definitions/user_steps.rb
index 45e1ded4c97a063ccda36c63f5585af5291dbaa3..af59a406cd2bed94bbf67f288678a3c1f38bcdd0 100644
--- a/features/step_definitions/user_steps.rb
+++ b/features/step_definitions/user_steps.rb
@@ -47,6 +47,7 @@ Given /^I have been invited by an admin$/ do
 end
 
 Given /^I have been invited by "([^\"]+)"$/ do |email|
+  AppConfig.settings.enable_registrations = false
   @inviter = User.find_by_email(email)
   @inviter_invite_count = @inviter.invitation_code.count
   i = EmailInviter.new("new_invitee@example.com", @inviter)
diff --git a/features/support/env.rb b/features/support/env.rb
index 297b63f3e95b76b5b80d8eef1944eec9912aec58..c26248a98fe76bfdae01016fce3e7af761b64455 100644
--- a/features/support/env.rb
+++ b/features/support/env.rb
@@ -70,6 +70,9 @@ Before do |scenario|
   page.driver.headers = if scenario.source_tag_names.include? "@mobile"
                           {"User-Agent" => "Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0"}
                         else
-                          page.driver.headers = {}
+                          {}
                         end
+
+  # Reset overridden settings
+  AppConfig.reset_dynamic!
 end
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 41e3916c9411a796f14bb87b16c5b7c63cd3b1ae..1a7c4398713b243a9e8ce2a61f4183db9ab1a123 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -20,32 +20,50 @@ describe RegistrationsController, type: :controller do
     }
   }
 
-  describe '#check_registrations_open!' do
+  describe "#check_registrations_open_or_valid_invite!" do
     before do
       AppConfig.settings.enable_registrations = false
     end
 
-    it 'redirects #new to the login page' do
+    it "redirects #new to the login page" do
       get :new
-      expect(flash[:error]).to eq(I18n.t('registrations.closed'))
+      expect(flash[:error]).to eq(I18n.t("registrations.closed"))
       expect(response).to redirect_to new_user_session_path
     end
 
-    it 'redirects #create to the login page' do
+    it "redirects #create to the login page" do
       post :create, valid_params
-      expect(flash[:error]).to eq(I18n.t('registrations.closed'))
+      expect(flash[:error]).to eq(I18n.t("registrations.closed"))
       expect(response).to redirect_to new_user_session_path
     end
 
-    it 'does not redirect if there is a valid invite token' do
-      i = InvitationCode.create(:user => bob)
-      get :new, :invite => {:token => i.token}
+    it "does not redirect if there is a valid invite token" do
+      code = InvitationCode.create(user: bob)
+      get :new, invite: {token: code.token}
       expect(response).not_to be_redirect
     end
 
-    it 'does redirect if there is an  invalid invite token' do
-      get :new, :invite => {:token => 'fssdfsd'}
-      expect(response).to be_redirect
+    it "does redirect if there is an invalid invite token" do
+      get :new, invite: {token: "fssdfsd"}
+      expect(response).to redirect_to new_user_session_path
+    end
+
+    it "does redirect if there are no invites available with this code" do
+      code = InvitationCode.create(user: bob)
+      code.update_attributes(count: 0)
+
+      get :new, invite: {token: code.token}
+      expect(response).to redirect_to new_user_session_path
+    end
+
+    it "does not redirect when the registration is open" do
+      AppConfig.settings.enable_registrations = true
+
+      code = InvitationCode.create(user: bob)
+      code.update_attributes(count: 0)
+
+      get :new, invite: {token: code.token}
+      expect(response).not_to be_redirect
     end
   end
 
@@ -53,12 +71,6 @@ describe RegistrationsController, type: :controller do
     render_views
 
     context "with valid parameters" do
-      before do
-        AppConfig.settings.enable_registrations = true
-        user = FactoryGirl.build(:user)
-        allow(User).to receive(:build).and_return(user)
-      end
-
       it "creates a user" do
         expect {
           get :create, valid_params
@@ -75,18 +87,38 @@ describe RegistrationsController, type: :controller do
         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
         expect(response).to be_redirect
-        expect(response.location).to match /^#{stream_url}\??$/
+        expect(response.location).to match(/^#{getting_started_url}$/)
+      end
+
+      context "with invite code" do
+        it "reduces number of available invites when the registration is closed" do
+          AppConfig.settings.enable_registrations = false
+
+          code = InvitationCode.create(user: bob)
+
+          expect {
+            get :create, valid_params.merge(invite: {token: code.token})
+          }.to change { code.reload.count }.by(-1)
+        end
+
+        it "doesn't reduce number of available invites when the registration is open" do
+          code = InvitationCode.create(user: bob)
+
+          expect {
+            get :create, valid_params.merge(invite: {token: code.token})
+          }.not_to change { code.reload.count }
+        end
+
+        it "links inviter with the user" do
+          code = InvitationCode.create(user: bob)
+
+          post :create, valid_params.merge(invite: {token: code.token})
+
+          expect(User.find_by(username: "jdoe").invited_by).to eq(bob)
+        end
       end
     end
 
@@ -112,6 +144,8 @@ describe RegistrationsController, type: :controller do
       end
 
       it "doesn't reduce number of available invites" do
+        AppConfig.settings.enable_registrations = false
+
         code = InvitationCode.create(user: bob)
 
         expect {