diff --git a/daemon/src/dbus/configurationmanager.cpp b/daemon/src/dbus/configurationmanager.cpp
index 40374d99431a6898fb503644399eb75caf31db29..f1043603cb7ce6d805b6fe82e7fe9728ac3a85e3 100644
--- a/daemon/src/dbus/configurationmanager.cpp
+++ b/daemon/src/dbus/configurationmanager.cpp
@@ -389,13 +389,13 @@ void ConfigurationManager::setAddressbookList(
 
 std::map<std::string, std::string> ConfigurationManager::getHookSettings()
 {
-    return Manager::instance().getHookSettings();
+    return Manager::instance().hookPreference.toMap();
 }
 
 void ConfigurationManager::setHookSettings(const std::map<std::string,
         std::string>& settings)
 {
-    Manager::instance().setHookSettings(settings);
+    Manager::instance().hookPreference = HookPreference(settings);
 }
 
 void ConfigurationManager::setAccountsOrder(const std::string& order)
diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp
index 4c1e8cbc4f07e259d2073af9acfdfeb8df0e08b9..a9b190d1ad311a14c10e0b6d12b8097d43343a7c 100644
--- a/daemon/src/managerimpl.cpp
+++ b/daemon/src/managerimpl.cpp
@@ -191,9 +191,7 @@ bool ManagerImpl::outgoingCall(const std::string& account_id,
 
     std::string current_call_id(getCurrentCallId());
 
-    std::string prefix;
-    if (hookPreference.getNumberEnabled())
-        prefix = hookPreference.getNumberAddPrefix();
+    std::string prefix(hookPreference.getNumberAddPrefix());
 
     std::string to_cleaned(NumberCleaner::clean(to, prefix));
 
@@ -2748,30 +2746,6 @@ std::vector<std::string> ManagerImpl::getAddressbookList() const
     return unserialize(addressbookPreference.getList());
 }
 
-std::map<std::string, std::string> ManagerImpl::getHookSettings() const
-{
-    std::map<std::string, std::string> settings;
-
-    settings["URLHOOK_IAX2_ENABLED"] = hookPreference.getIax2Enabled() ? "true" : "false";
-    settings["PHONE_NUMBER_HOOK_ADD_PREFIX"] = hookPreference.getNumberAddPrefix();
-    settings["PHONE_NUMBER_HOOK_ENABLED"] = hookPreference.getNumberEnabled() ? "true" : "false";
-    settings["URLHOOK_SIP_ENABLED"] = hookPreference.getSipEnabled() ? "true" : "false";
-    settings["URLHOOK_COMMAND"] = hookPreference.getUrlCommand();
-    settings["URLHOOK_SIP_FIELD"] = hookPreference.getUrlSipField();
-
-    return settings;
-}
-
-void ManagerImpl::setHookSettings(const std::map<std::string, std::string>& settings)
-{
-    hookPreference.setIax2Enabled(settings.find("URLHOOK_IAX2_ENABLED")->second == "true");
-    hookPreference.setNumberAddPrefix(settings.find("PHONE_NUMBER_HOOK_ADD_PREFIX")->second);
-    hookPreference.setNumberEnabled(settings.find("PHONE_NUMBER_HOOK_ENABLED")->second == "true");
-    hookPreference.setSipEnabled(settings.find("URLHOOK_SIP_ENABLED")->second == "true");
-    hookPreference.setUrlCommand(settings.find("URLHOOK_COMMAND")->second);
-    hookPreference.setUrlSipField(settings.find("URLHOOK_SIP_FIELD")->second);
-}
-
 void ManagerImpl::setIPToIPForCall(const std::string& callID, bool IPToIP)
 {
     if (not isIPToIP(callID)) // no IPToIP calls with the same ID
diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h
index 19ff01b301885535cab3d9ed3fd7ac6b9c1773c6..432f65adb2abcd74733c01632dfb8669529b5571 100644
--- a/daemon/src/managerimpl.h
+++ b/daemon/src/managerimpl.h
@@ -691,17 +691,6 @@ class ManagerImpl {
          */
         std::vector <std::string> getAddressbookList() const;
 
-        /**
-         * Hook configuration
-         */
-        std::map<std::string, std::string> getHookSettings() const;
-
-        /**
-         * Hook configuration
-         */
-        void setHookSettings(const std::map<std::string, std::string>& settings);
-
-
         /**
          * Get the audio manager
          * @return int The audio manager
diff --git a/daemon/src/preferences.cpp b/daemon/src/preferences.cpp
index 7b8f93dc97ebfa328719e28e7a72db05ead5e9db..caa7623b7ea86f25f262ec4ebdbc8e689537e511 100644
--- a/daemon/src/preferences.cpp
+++ b/daemon/src/preferences.cpp
@@ -33,6 +33,7 @@
 #include "audio/pulseaudio/pulselayer.h"
 #include "config/yamlemitter.h"
 #include "config/yamlnode.h"
+#include "hooks/urlhook.h"
 #include <sstream>
 #include "global.h"
 #include <cassert>
@@ -216,6 +217,28 @@ HookPreference::HookPreference() : iax2Enabled_(false)
     , urlSipField_("X-sflphone-url")
 {}
 
+HookPreference::HookPreference(const std::map<std::string, std::string> &settings) :
+    iax2Enabled_(settings.find("URLHOOK_IAX2_ENABLED")->second == "true")
+    , numberAddPrefix_(settings.find("PHONE_NUMBER_HOOK_ADD_PREFIX")->second)
+    , numberEnabled_(settings.find("PHONE_NUMBER_HOOK_ENABLED")->second == "true")
+    , sipEnabled_(settings.find("URLHOOK_SIP_ENABLED")->second == "true")
+    , urlCommand_(settings.find("URLHOOK_COMMAND")->second)
+    , urlSipField_(settings.find("URLHOOK_SIP_FIELD")->second)
+{}
+
+std::map<std::string, std::string> HookPreference::toMap() const
+{
+    std::map<std::string, std::string> settings;
+    settings["URLHOOK_IAX2_ENABLED"] = iax2Enabled_ ? "true" : "false";
+    settings["PHONE_NUMBER_HOOK_ADD_PREFIX"] = numberAddPrefix_;
+    settings["PHONE_NUMBER_HOOK_ENABLED"] = numberEnabled_ ? "true" : "false";
+    settings["URLHOOK_SIP_ENABLED"] = sipEnabled_ ? "true" : "false";
+    settings["URLHOOK_COMMAND"] = urlCommand_;
+    settings["URLHOOK_SIP_FIELD"] = urlSipField_;
+
+    return settings;
+}
+
 void HookPreference::serialize(Conf::YamlEmitter *emitter)
 {
     Conf::MappingNode preferencemap(NULL);
@@ -252,6 +275,11 @@ void HookPreference::unserialize(const Conf::MappingNode *map)
     map->getValue(urlSipFieldKey, &urlSipField_);
 }
 
+void HookPreference::run(const std::string &header)
+{
+    UrlHook::runAction(urlCommand_, header);
+}
+
 AudioPreference::AudioPreference() :
     audioApi_(PULSEAUDIO_API_STR)
     , cardin_(atoi(ALSA_DFT_CARD)) // ALSA_DFT_CARD
diff --git a/daemon/src/preferences.h b/daemon/src/preferences.h
index 8b176a579f56c1e28b7db4e3df5481e647fc20fa..24d15a524e17a27429f6473a1debbcb6eb8bdd2c 100644
--- a/daemon/src/preferences.h
+++ b/daemon/src/preferences.h
@@ -335,56 +335,23 @@ class AddressbookPreference : public Serializable {
 class HookPreference : public Serializable {
     public:
         HookPreference();
+        HookPreference(const std::map<std::string, std::string> &settings);
 
         virtual void serialize(Conf::YamlEmitter *emitter);
 
         virtual void unserialize(const Conf::MappingNode *map);
 
-        bool getIax2Enabled() const {
-            return iax2Enabled_;
-        }
-
-        void setIax2Enabled(bool i) {
-            iax2Enabled_ = i;
-        }
-
         std::string getNumberAddPrefix() const {
-            return numberAddPrefix_;
-        }
-
-        void setNumberAddPrefix(const std::string &n) {
-            numberAddPrefix_ = n;
-        }
-
-        bool getNumberEnabled() const {
-            return numberEnabled_;
-        }
-
-        void setNumberEnabled(bool n) {
-            numberEnabled_ = n;
+            if (numberEnabled_)
+                return numberAddPrefix_;
+            else
+                return "";
         }
 
-        bool getSipEnabled() const {
-            return sipEnabled_;
-        }
-
-        void setSipEnabled(bool s) {
-            sipEnabled_ = s;
-        }
-
-        std::string getUrlCommand() const {
-            return urlCommand_;
-        }
-        void setUrlCommand(const std::string &u) {
-            urlCommand_ = u;
-        }
-
-        std::string getUrlSipField() const {
-            return urlSipField_;
-        }
-        void setUrlSipField(const std::string &u) {
-            urlSipField_ = u;
-        }
+        std::map<std::string, std::string> toMap() const;
+        bool getSipEnabled() const { return sipEnabled_; }
+        std::string getUrlSipField() const { return urlSipField_; }
+        void run(const std::string &header);
 
     private:
         bool iax2Enabled_;
@@ -393,7 +360,6 @@ class HookPreference : public Serializable {
         bool sipEnabled_;
         std::string urlCommand_;
         std::string urlSipField_;
-
 };
 
 class AudioPreference : public Serializable {
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index dfd8f6a5032ec2f29f31a22491a0d124ee3ce1df..bf8f5f277f405ad0254ae0216de5ae93621354cb 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -48,7 +48,6 @@
 #include "dbus/dbusmanager.h"
 #include "dbus/callmanager.h"
 
-#include "hooks/urlhook.h"
 #include "im/instant_messaging.h"
 
 #include "audio/audiolayer.h"
@@ -309,7 +308,7 @@ pj_bool_t transaction_request_cb(pjsip_rx_data *rdata)
 
     if (Manager::instance().hookPreference.getSipEnabled()) {
         std::string header_value(fetchHeaderValue(rdata->msg_info.msg, Manager::instance().hookPreference.getUrlSipField()));
-        UrlHook::runAction(Manager::instance().hookPreference.getUrlCommand(), header_value);
+        Manager::instance().hookPreference.run(header_value);
     }
 
     SIPCall* call = new SIPCall(Manager::instance().getNewCallID(), Call::INCOMING, cp_);
@@ -2126,14 +2125,14 @@ std::string fetchHeaderValue(pjsip_msg *msg, const std::string &field)
     if (!hdr)
         return "";
 
-    std::string value(std::string(hdr->hvalue.ptr, hdr->hvalue.slen));
+    std::string value(hdr->hvalue.ptr, hdr->hvalue.slen);
 
     size_t pos = value.find("\n");
 
-    if (pos == std::string::npos)
+    if (pos != std::string::npos)
+        return value.substr(0, pos);
+    else
         return "";
-
-    return value.substr(0, pos);
 }
 } // end anonymous namespace