diff --git a/app/models/host.rb b/app/models/host.rb
index 62dae9a..3a252a1 100644
--- a/app/models/host.rb
+++ b/app/models/host.rb
@@ -1,295 +1,247 @@
 # The bacula database must be independent from all of our application logic.
 # For this reason we have Host which is the application equivalent of a Bacula Client.
 #
 # A host is being created from our application. When it receives all the configuration
 # which is required it gets dispatched to bacula through some configuration files. After
 # that, a client with the exact same config is generated by bacula.
 class Host < ActiveRecord::Base
+  include Configuration::Host
+
   STATUSES = {
     pending: 0,
     configured: 1,
     dispatched: 2,
     deployed: 3,
     updated: 4,
     redispatched: 5,
     for_removal: 6,
     inactive: 7
   }
 
   has_many :ownerships
   has_many :users, through: :ownerships, inverse_of: :hosts
 
   belongs_to :client, class_name: :Client, foreign_key: :name, primary_key: :name
   belongs_to :verifier, class_name: :User, foreign_key: :verifier_id, primary_key: :id
 
   has_many :filesets, dependent: :destroy
   has_many :job_templates, dependent: :destroy
   has_many :schedules, dependent: :destroy
 
   validates :file_retention, :job_retention,
     :port, :password, presence: true
   validates :port, numericality: true
 
   validates :fqdn, presence: true, uniqueness: true
 
   validate :fqdn_format
 
   scope :not_baculized, -> {
     joins("left join Client on Client.Name = hosts.name").where(Client: { Name: nil })
   }
   scope :unverified, -> { where(verified: false) }
 
   before_validation :set_retention, :unset_baculized, :sanitize_name
 
   state_machine :status, initial: :pending do
     STATUSES.each do |status_name, value|
       state status_name, value: value
     end
 
     after_transition [:dispatched, :redispatched, :configured, :updated] => :deployed do |host|
       host.job_templates.enabled.
         update_all(baculized: true, baculized_at: Time.now, updated_at: Time.now)
     end
 
     event :add_configuration do
       transition [:pending, :dispatched, :inactive] => :configured
     end
 
     event :dispatch do
       transition :configured => :dispatched
     end
 
     event :redispatch do
       transition :updated => :redispatched
     end
 
     event :set_deployed do
       transition [:dispatched, :redispatched, :configured, :updated] => :deployed
     end
 
     event :change_deployed_config do
       transition [:deployed, :redispatched, :for_removal] => :updated
     end
 
     event :mark_for_removal do
       transition [:dispatched, :deployed, :updated, :redispatched] => :for_removal
     end
 
     event :set_inactive do
       transition [:deployed, :dispatched, :updated, :redispatched] => :inactive
     end
 
     event :disable do
       transition all => :pending
     end
   end
 
-  # Constructs the final Bacula configuration for the host by appending configs for
-  #
-  # * Client
-  # * Jobs
-  # * Schedules
-  # * Filesets
-  #
-  # by calling their `to_bacula_config_array` methods.
-  #
-  # @return [Array] containing each element's configuration line by line
-  def baculize_config
-    templates = job_templates.includes(:fileset, :schedule)
-
-    result = [self] + templates.map {|x| [x, x.fileset, x.schedule] }.flatten.compact.uniq
-    result.map(&:to_bacula_config_array)
-  end
-
-  # Constructs the final Bacula configuration for the host by appending configs for
-  #
-  # * Client
-  # * Jobs
-  # * Schedules
-  # * Filesets
-  #
-  # by calling their `to_bacula_config_array` methods.
-  #
-  # It hides the password.
-  #
-  # @return [Array] containing each element's configuration line by line
-  def baculize_config_no_pass
-    baculize_config.join("\n").gsub(/Password = ".*"$/, 'Password = "*************"')
-  end
-
-  # Constructs an array where each element is a line for the Client's bacula config
-  #
-  # @return [Array]
-  def to_bacula_config_array
-    [
-      "Client {",
-      "  Name = #{name}",
-      "  Address = #{fqdn}",
-      "  FDPort = #{port}",
-      "  Catalog = #{client_settings[:catalog]}",
-      "  Password = \"#{password}\"",
-      "  File Retention = #{file_retention} #{file_retention_period_type}",
-      "  Job Retention = #{job_retention} #{job_retention_period_type}",
-      "  AutoPrune = #{auto_prune_human}",
-      "}"
-    ]
-  end
 
   # Shows the host's auto_prune setting
   def auto_prune_human
     client_settings[:autoprune]
   end
 
   # Uploads the host's config to bacula
   # Reloads bacula server
   #
   # It updates the host's status accordingly
   def dispatch_to_bacula
     return false if not needs_dispatch?
     bacula_handler.deploy_config
   end
 
   # Removes a Host from bacula configuration.
   # Reloads bacula server
   #
   # If all go well it changes the host's status and returns true
   def remove_from_bacula
     return false unless needs_revoke?
     bacula_handler.undeploy_config
   end
 
   # Restores a host's backup to a preselected location
   #
   # @param fileset_id[Integer] the desired fileset
   # @param location[String] the desired restore location
   # @param restore_point[Datetime] the desired restore_point datetime
   def restore(file_set_id, location, restore_point=nil)
     return false if not restorable?
     job_ids = client.get_job_ids(file_set_id, restore_point)
     file_set_name = FileSet.find(file_set_id).file_set
     bacula_handler.restore(job_ids, file_set_name, location)
   end
 
   # Runs the given backup job ASAP
   def backup_now(job_name)
     bacula_handler.backup_now(job_name)
   end
 
   # Disables all jobs and sends the configuration to Bacula
   def disable_jobs_and_update
     job_templates.update_all(enabled: false)
     bacula_handler.deploy_config
   end
 
   # Determinex weather a host:
   #
   # * has all it takes to be deployed but
   # * the config is not yet sent to bacula
   #
   # @return [Boolean]
   def needs_dispatch?
     verified? && (can_dispatch? || can_redispatch?)
   end
 
   # Determines weather a host is marked for removal
   #
   # @return [Boolean]
   def needs_revoke?
     for_removal?
   end
 
   # Handles the host's job changes by updating the host's status
   def recalculate
     add_configuration || change_deployed_config
   end
 
   # Fetches an info message concerning the host's deploy status
   def display_message
     if !verified?
       { message: 'Your host needs to be verified by an admin', severity: :alert }
     elsif pending?
       { message: 'client not configured yet', severity: :alert }
     elsif configured? || dispatched?
       { message: 'client not deployed to Bacula', severity: :alert }
     elsif updated? || redispatched?
       { message: 'client configuration changed, deploy needed', severity: :alert }
     elsif for_removal?
       { message: 'pending client configuration withdraw', severity: :error }
     elsif inactive?
       { message: 'client disabled', severity: :alert }
     end
   end
 
   # Determines if a host can issue a restore job.
   #
   # @returns [Boolean] true if the host's client can issue a restore job
   def restorable?
     client.present? && client.is_backed_up?
   end
 
   # @return [User] the first of the host's users
   def first_user
     users.order('ownerships.created_at asc').first
   end
 
   # Marks the host as verified and sets the relevant metadata
   #
   # @param admin_verifier[Integer] the verifier's id
   def verify(admin_verifier)
     self.verified = true
     self.verifier_id = admin_verifier
     self.verified_at = Time.now
     save
   end
 
   # Determines if a host can be disabled or not.
   # Equivalent to is_deployed
   #
   # @return [Boolean]
   def can_be_disabled?
     dispatched? || deployed? || updated? || redispatched?
   end
 
   private
 
   # automatic setters
 
   def sanitize_name
     self.name = fqdn
   end
 
   # Sets the file and job retention according to the global settings
   def set_retention
     self.file_retention = client_settings[:file_retention]
     self.file_retention_period_type = client_settings[:file_retention_period_type]
     self.job_retention = client_settings[:job_retention]
     self.job_retention_period_type = client_settings[:job_retention_period_type]
   end
 
   def unset_baculized
     self.baculized = false if new_record?
     true
   end
 
   # validation
 
   def fqdn_format
     regex = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)/
     unless fqdn =~ regex
       self.errors.add(:fqdn)
     end
   end
 
   # Proxy object for handling bacula directives
   def bacula_handler
     BaculaHandler.new(self)
   end
 
   # Fetches and memoizes the general configuration settings for Clients
   #
   # @see ConfigurationSetting.current_client_settings
   # @return [Hash] containing the settings
   def client_settings
     @client_settings ||= ConfigurationSetting.current_client_settings
   end
 end
diff --git a/lib/configuration/host.rb b/lib/configuration/host.rb
new file mode 100644
index 0000000..78bf31c
--- /dev/null
+++ b/lib/configuration/host.rb
@@ -0,0 +1,56 @@
+module Configuration
+  # Helper module to add configuration getters for Host
+  module Host
+
+    # Constructs the final Bacula configuration for the host by appending configs for
+    #
+    # * Client
+    # * Jobs
+    # * Schedules
+    # * Filesets
+    #
+    # by calling their `to_bacula_config_array` methods.
+    #
+    # @return [Array] containing each element's configuration line by line
+    def baculize_config
+      templates = job_templates.includes(:fileset, :schedule)
+
+      result = [self] + templates.map {|x| [x, x.fileset, x.schedule] }.flatten.compact.uniq
+      result.map(&:to_bacula_config_array)
+    end
+
+    # Constructs the final Bacula configuration for the host by appending configs for
+    #
+    # * Client
+    # * Jobs
+    # * Schedules
+    # * Filesets
+    #
+    # by calling their `to_bacula_config_array` methods.
+    #
+    # It hides the password.
+    #
+    # @return [Array] containing each element's configuration line by line
+    def baculize_config_no_pass
+      baculize_config.join("\n").gsub(/Password = ".*"$/, 'Password = "*************"')
+    end
+
+    # Constructs an array where each element is a line for the Client's bacula config
+    #
+    # @return [Array]
+    def to_bacula_config_array
+      [
+        "Client {",
+        "  Name = #{name}",
+        "  Address = #{fqdn}",
+        "  FDPort = #{port}",
+        "  Catalog = #{client_settings[:catalog]}",
+        "  Password = \"#{password}\"",
+          "  File Retention = #{file_retention} #{file_retention_period_type}",
+        "  Job Retention = #{job_retention} #{job_retention_period_type}",
+        "  AutoPrune = #{auto_prune_human}",
+        "}"
+      ]
+    end
+  end
+end
diff --git a/spec/lib/configuration/host_spec.rb b/spec/lib/configuration/host_spec.rb
new file mode 100644
index 0000000..52a4cd0
--- /dev/null
+++ b/spec/lib/configuration/host_spec.rb
@@ -0,0 +1,83 @@
+require 'spec_helper'
+
+describe Configuration::Host do
+  describe '#to_bacula_config_array' do
+    let(:host) { FactoryGirl.create(:host) }
+
+    it "is a valid client directive" do
+      expect(host.to_bacula_config_array).to include('Client {')
+      expect(host.to_bacula_config_array).to include('}')
+    end
+
+    it "contains Address directive" do
+      expect(host.to_bacula_config_array).to include("  Address = #{host.fqdn}")
+    end
+
+    it "contains FDPort directive" do
+      expect(host.to_bacula_config_array).to include("  FDPort = #{host.port}")
+    end
+
+    it "contains Catalog directive" do
+      expect(host.to_bacula_config_array).
+        to include("  Catalog = #{ConfigurationSetting.current_client_settings[:catalog]}")
+    end
+
+    it "contains Password directive" do
+      expect(host.to_bacula_config_array).to include("  Password = \"#{host.password}\"")
+    end
+
+    it "contains File Retention directive" do
+      expect(host.to_bacula_config_array).
+        to include("  File Retention = #{host.file_retention} days")
+    end
+
+    it "contains Job Retention directive" do
+      expect(host.to_bacula_config_array).
+        to include("  Job Retention = #{host.job_retention} days")
+    end
+
+    it "contains AutoPrune directive" do
+      expect(host.to_bacula_config_array).to include("  AutoPrune = yes")
+    end
+  end
+
+  describe '#baculize_config' do
+    let!(:host) { FactoryGirl.create(:host) }
+
+    let!(:fileset) { FactoryGirl.create(:fileset, host: host) }
+    let!(:other_fileset) { FactoryGirl.create(:fileset, host: host) }
+
+    let!(:schedule) { FactoryGirl.create(:schedule) }
+    let!(:other_schedule) { FactoryGirl.create(:schedule) }
+
+    let!(:enabled_job) do
+      FactoryGirl.create(:job_template, host: host, schedule: schedule,
+                         fileset: fileset, enabled: true)
+    end
+    let!(:disabled_job) do
+      FactoryGirl.create(:job_template, host: host, schedule: other_schedule,
+                         fileset: other_fileset, enabled: false)
+    end
+
+    subject { host.baculize_config }
+
+    it 'includes the client\'s config' do
+      expect(subject).to include(host.to_bacula_config_array)
+    end
+
+    it 'includes the all the job template\'s configs' do
+      expect(subject).to include(enabled_job.to_bacula_config_array)
+      expect(subject).to include(disabled_job.to_bacula_config_array)
+    end
+
+    it 'includes all the used schedules\'s configs' do
+      expect(subject).to include(schedule.to_bacula_config_array)
+      expect(subject).to include(other_schedule.to_bacula_config_array)
+    end
+
+    it 'includes all the used filesets\'s configs' do
+      expect(subject).to include(fileset.to_bacula_config_array)
+      expect(subject).to include(other_fileset.to_bacula_config_array)
+    end
+  end
+end
diff --git a/spec/models/host_spec.rb b/spec/models/host_spec.rb
index 38b3592..fb228d0 100644
--- a/spec/models/host_spec.rb
+++ b/spec/models/host_spec.rb
@@ -1,290 +1,210 @@
 require 'spec_helper'
 
 describe Host do
   context 'validates' do
     it "presence of Password" do
         expect(Host.new).to have(1).errors_on(:password)
     end
 
     it 'numericality of :port' do
       expect(Host.new(port: :lala)).to have(2).errors_on(:port)
     end
 
     [:file_retention, :job_retention, :name].each do |field|
       it "#{field} is set automatically" do
         host = Host.new(fqdn: 'test')
         host.valid?
         expect(host.send(field)).to be_present
       end
     end
   end
 
   context 'when fqdn is invalid' do
     let(:host) { FactoryGirl.build(:host, fqdn: :lala) }
 
     it 'has errors' do
       expect(host).to have(1).errors_on(:fqdn)
     end
   end
 
   context 'name field' do
     let(:host) { FactoryGirl.create(:host, name: nil) }
     it 'is generated by the system' do
       expect(host.name).to be
     end
   end
 
-  describe '#to_bacula_config_array' do
-    let(:host) { FactoryGirl.create(:host) }
-
-    it "is a valid client directive" do
-      expect(host.to_bacula_config_array).to include('Client {')
-      expect(host.to_bacula_config_array).to include('}')
-    end
-
-    it "contains Address directive" do
-      expect(host.to_bacula_config_array).to include("  Address = #{host.fqdn}")
-    end
-
-    it "contains FDPort directive" do
-      expect(host.to_bacula_config_array).to include("  FDPort = #{host.port}")
-    end
-
-    it "contains Catalog directive" do
-      expect(host.to_bacula_config_array).
-        to include("  Catalog = #{ConfigurationSetting.current_client_settings[:catalog]}")
-    end
-
-    it "contains Password directive" do
-      expect(host.to_bacula_config_array).to include("  Password = \"#{host.password}\"")
-    end
-
-    it "contains File Retention directive" do
-      expect(host.to_bacula_config_array).
-        to include("  File Retention = #{host.file_retention} days")
-    end
-
-    it "contains Job Retention directive" do
-      expect(host.to_bacula_config_array).
-        to include("  Job Retention = #{host.job_retention} days")
-    end
-
-    it "contains AutoPrune directive" do
-      expect(host.to_bacula_config_array).to include("  AutoPrune = yes")
-    end
-  end
-
-  describe '#baculize_config' do
-    let!(:host) { FactoryGirl.create(:host) }
-
-    let!(:fileset) { FactoryGirl.create(:fileset, host: host) }
-    let!(:other_fileset) { FactoryGirl.create(:fileset, host: host) }
-
-    let!(:schedule) { FactoryGirl.create(:schedule) }
-    let!(:other_schedule) { FactoryGirl.create(:schedule) }
-
-    let!(:enabled_job) do
-      FactoryGirl.create(:job_template, host: host, schedule: schedule,
-                         fileset: fileset, enabled: true)
-    end
-    let!(:disabled_job) do
-      FactoryGirl.create(:job_template, host: host, schedule: other_schedule,
-                         fileset: other_fileset, enabled: false)
-    end
-
-    subject { host.baculize_config }
-
-    it 'includes the client\'s config' do
-      expect(subject).to include(host.to_bacula_config_array)
-    end
-
-    it 'includes the all the job template\'s configs' do
-      expect(subject).to include(enabled_job.to_bacula_config_array)
-      expect(subject).to include(disabled_job.to_bacula_config_array)
-    end
-
-    it 'includes all the used schedules\'s configs' do
-      expect(subject).to include(schedule.to_bacula_config_array)
-      expect(subject).to include(other_schedule.to_bacula_config_array)
-    end
-
-    it 'includes all the used filesets\'s configs' do
-      expect(subject).to include(fileset.to_bacula_config_array)
-      expect(subject).to include(other_fileset.to_bacula_config_array)
-    end
-  end
-
   describe '#dispatch_to_bacula' do
     let(:configured_host) { FactoryGirl.create(:host, :configured) }
     let(:updated_host) { FactoryGirl.create(:host, :updated) }
 
     context 'for non verified hosts' do
       let(:unverified_host) { FactoryGirl.create(:host, :configured) }
 
       it 'returns false' do
         expect(unverified_host.dispatch_to_bacula).to eq(false)
       end
     end
 
     it 'calls BaculaHandler#deploy_config' do
       BaculaHandler.any_instance.should_receive(:deploy_config)
       configured_host.dispatch_to_bacula
     end
 
     context 'when the config does not reach bacula' do
       before do
         BaculaHandler.any_instance.should_receive(:send_config) { false }
       end
 
       it 'returns false' do
         expect(configured_host.dispatch_to_bacula).to eq(false)
       end
 
       it 'does not change the status of a configured host' do
         expect { configured_host.dispatch_to_bacula }.
           to_not change { configured_host.reload.status }
       end
 
       it 'does not change the status of an updated host' do
         expect { updated_host.dispatch_to_bacula }.
           to_not change { updated_host.reload.status }
       end
     end
 
     context 'when the config is sent to bacula' do
       before do
         BaculaHandler.any_instance.should_receive(:send_config) { true }
       end
 
       context 'and bacula gets reloaded' do
         before do
           BaculaHandler.any_instance.should_receive(:reload_bacula) { true }
         end
 
         it 'makes the configured host deployed' do
           configured_host.dispatch_to_bacula
           expect(configured_host.reload).to be_deployed
         end
 
         it 'makes the updated host deployed' do
           updated_host.dispatch_to_bacula
           expect(updated_host.reload).to be_deployed
         end
       end
 
       context 'but bacula fails to reload' do
         before do
           BaculaHandler.any_instance.should_receive(:reload_bacula) { false }
         end
 
         it 'makes the configured host dispatcheda' do
           configured_host.dispatch_to_bacula
           expect(configured_host.reload).to be_dispatched
         end
 
         it 'makes the updated host redispatched' do
           updated_host.dispatch_to_bacula
           expect(updated_host.reload).to be_redispatched
         end
       end
     end
   end
 
   describe '#remove_from_bacula' do
     let(:host) { FactoryGirl.create(:host, status: Host::STATUSES[:for_removal]) }
 
     context 'when the config is NOT removed from bacula' do
       before { BaculaHandler.any_instance.should_receive(:remove_config) { false } }
 
       it 'returns false' do
         expect(host.remove_from_bacula).to eq(false)
       end
 
       it 'does not alter the host\'s status' do
         expect { host.remove_from_bacula }.
           to_not change { host.reload.status }
       end
     end
 
     context 'when the config is removed from bacula' do
       before { BaculaHandler.any_instance.should_receive(:remove_config) { true } }
 
       context 'and bacula gets reloaded' do
         before { BaculaHandler.any_instance.should_receive(:reload_bacula) { true } }
 
         it 'returns true' do
           expect(host.remove_from_bacula).to eq(true)
         end
 
         it 'changes the host\'s status to pending' do
           expect { host.remove_from_bacula }.
             to change { host.reload.human_status_name }.from('for removal').to('pending')
         end
       end
     end
   end
 
   describe '#recalculate' do
     let(:host) { FactoryGirl.create(:host, :with_enabled_jobs) }
 
     [:configured, :updated].each do |status|
       context "a #{status} host" do
         before { host.update_column(:status, Host::STATUSES[status]) }
 
         it "stays #{status}" do
           expect { host.recalculate }.to_not change { host.reload.status }
         end
       end
     end
 
     [:pending, :dispatched, :inactive].each do |status|
       context "a #{status} host" do
         before { host.update_column(:status, Host::STATUSES[status]) }
 
         it 'becomes configured' do
           expect { host.recalculate }.
             to change { host.reload.human_status_name }.
             from(host.human_status_name).to('configured')
         end
       end
     end
 
     context 'a dispatched host' do
       before { host.update_column(:status, Host::STATUSES[:dispatched]) }
 
       it 'becomes configured' do
         expect { host.recalculate }.
           to change { host.reload.human_status_name }.
           from('dispatched').to('configured')
       end
     end
 
     [:deployed, :redispatched, :for_removal].each do |status|
       context "a #{status} host" do
         before { host.update_column(:status, Host::STATUSES[status]) }
 
         it 'becomes updated' do
           expect { host.recalculate }.
             to change { host.reload.human_status_name }.
             from(host.human_status_name).to('updated')
         end
       end
     end
   end
 
   describe '#verify' do
     let!(:host) { FactoryGirl.create(:host, verified: false) }
     let(:admin) { FactoryGirl.create(:user, :admin) }
 
     it 'verifies host' do
       host.verify(admin.id)
       expect(host).to be_verified
     end
 
     it 'sets the verification credentials' do
       host.verify(admin.id)
       expect(host.verifier_id).to eq(admin.id)
       expect(host.verified_at).not_to be nil
     end
   end
 end