diff --git a/sflphone-common/src/sip/sipvoiplink.cpp b/sflphone-common/src/sip/sipvoiplink.cpp
index e2c0fda5f1d72b4972c35cf944c56b5208df67ca..db38c7cb935571fc93d3c1799c7b29999cb360d7 100644
--- a/sflphone-common/src/sip/sipvoiplink.cpp
+++ b/sflphone-common/src/sip/sipvoiplink.cpp
@@ -599,28 +599,18 @@ int SIPVoIPLink::sendRegister (AccountID id)
 
     // Initializes registration
     status = pjsip_regc_init (regc, &pjSrv, &pjFrom, &pjFrom, 1, &pjContact, expire_value);
-
-    if (! (account->getServiceRoute().empty())) {
-
-        pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool);
-        pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool);
-        pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0);
-        routing->name_addr.uri = (pjsip_uri*) url;
-        // account->getServiceRoute().append(";lr");
-        _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str());
-        pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str());
-
-        pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing));
-
-        pjsip_regc_set_route_set (regc, route_set);
-    }
-
     if (status != PJ_SUCCESS) {
         _debug ("UserAgent: Unable to initialize account %d in sendRegister", status);
         _mutexSIP.leaveMutex();
         return false;
     }
 
+    // Fill route set
+    if (! (account->getServiceRoute().empty())) {
+        pjsip_route_hdr *route_set = createRouteSet(account);
+        pjsip_regc_set_route_set (regc, route_set);
+    }
+
     pjsip_cred_info *cred = account->getCredInfo();
     int credential_count = account->getCredentialCount();
     _debug ("UserAgent: setting %d credentials in sendRegister", credential_count);
@@ -636,9 +626,8 @@ int SIPVoIPLink::sendRegister (AccountID id)
     pj_list_push_back (&hdr_list, (pjsip_hdr*) h);
     pjsip_regc_add_headers (regc, &hdr_list);
 
-    status = pjsip_regc_register (regc, PJ_TRUE, &tdata);
 
-    if (status != PJ_SUCCESS) {
+    if ((status = pjsip_regc_register (regc, PJ_TRUE, &tdata)) != PJ_SUCCESS) {
         _debug ("UserAgent: Unable to register regc.");
         _mutexSIP.leaveMutex();
         return false;
@@ -871,15 +860,7 @@ SIPVoIPLink::answer (const CallID& id)
 
 //    if (! (account->getServiceRoute().empty())) {
 //
-//        pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool);
-//        pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool);
-//        pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0);
-//        routing->name_addr.uri = (pjsip_uri*) url;
-//        _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str());
-//        pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str());
-//
-//        pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing));
-//
+//        pjsip_route_hdr *route_set = createRouteSet(account);
 //        pjsip_dlg_set_route_set (inv_session->dlg, route_set);
 //    }
 
@@ -938,17 +919,7 @@ SIPVoIPLink::hangup (const CallID& id)
 
     // _debug("Some tdata info: %",);
     if (! (account->getServiceRoute().empty())) {
-
-        _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str());
-
-        pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool);
-        pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool);
-        pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0);
-        routing->name_addr.uri = (pjsip_uri*) url;
-        pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str());
-
-        pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing));
-
+        pjsip_route_hdr *route_set = createRouteSet(account);
         pjsip_dlg_set_route_set (inv->dlg, route_set);
     }
 
@@ -1658,17 +1629,7 @@ SIPVoIPLink::SIPStartCall (SIPCall* call, const std::string& subject UNUSED)
 
 
     if (! (account->getServiceRoute().empty())) {
-
-        _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str());
-
-        pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool);
-        pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool);
-        pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0);
-        routing->name_addr.uri = (pjsip_uri*) url;
-        pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str());
-
-        pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing));
-
+        pjsip_route_hdr *route_set = createRouteSet(account);
         pjsip_dlg_set_route_set (dialog, route_set);
     }
 
@@ -1947,17 +1908,7 @@ bool SIPVoIPLink::new_ip_to_ip_call (const CallID& id, const std::string& to)
         PJ_ASSERT_RETURN (status == PJ_SUCCESS, false);
 
         if (! (account->getServiceRoute().empty())) {
-
-            _error ("UserAgent: Set Service-Route with %s", account->getServiceRoute().c_str());
-
-            pjsip_route_hdr *route_set = pjsip_route_hdr_create (_pool);
-            pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool);
-            pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0);
-            routing->name_addr.uri = (pjsip_uri*) url;
-            pj_strdup2 (_pool, &url->host, account->getServiceRoute().c_str());
-
-            pj_list_push_back (&route_set, pjsip_hdr_clone (_pool, routing));
-
+            pjsip_route_hdr *route_set = createRouteSet(account);
             pjsip_dlg_set_route_set (dialog, route_set);
         }
 
@@ -3029,25 +2980,69 @@ bool SIPVoIPLink::loadSIPLocalIP (std::string *addr)
     return returnValue;
 }
 
-bool SIPVoIPLink::dnsResolution(std::string& name) {
+pjsip_route_hdr *SIPVoIPLink::createRouteSet(Account *account)
+{
+	size_t found;
+	std::string host = "";
+	std::string port = "";
+	pjsip_route_hdr *route_set;
+
+	SIPAccount *sipaccount = dynamic_cast<SIPAccount *>(account);
+    std::string route = sipaccount->getServiceRoute();
+    _error ("UserAgent: Set Service-Route with %s", route.c_str());
+
+    found = route.find(":");
+	if(found != std::string::npos) {
+		host = route.substr(0, found);
+		port = route.substr(found + 1, route.length());
+	}
+	else {
+		host = route;
+		port = "0";
+	}
+
+	std::cout << "Host: " << host << ", Port: " << port << std::endl;
+
+    route_set = pjsip_route_hdr_create (_pool);
+    pjsip_route_hdr *routing = pjsip_route_hdr_create (_pool);
+    pjsip_sip_uri *url = pjsip_sip_uri_create (_pool, 0);
+    routing->name_addr.uri = (pjsip_uri*) url;
+    pj_strdup2 (_pool, &url->host, host.c_str());
+    url->port = atoi(port.c_str());
+
+    pj_list_push_back (route_set, pjsip_hdr_clone (_pool, routing));
+
+    return route_set;
+
+}
+
+bool SIPVoIPLink::dnsResolution(pjsip_tx_data *tdata) {
 	pj_addrinfo ai;
 	unsigned count;
-	int af;
-	pjsip_server_addresses svr_addr;
+	// pjsip_server_addresses svr_addr;
 	pj_status_t status;
+	pjsip_host_info dest_info;
+
+	_debug("UserAgent: Dns Resolution");
 
-	pjsip_host_info *target;
+	int af = pj_AF_INET();
 
-	af = pj_AF_INET();
+    status = pjsip_process_route_set(tdata, &dest_info);
 
-	pj_sockaddr_init(pj_AF_INET(), &svr_addr.entry[0].addr, NULL, 0);
+	pj_sockaddr_init(pj_AF_INET(), &tdata->dest_info.addr.entry[0].addr, NULL, 0);
 
 	/* Resolve */
 	count = 1;
-	status = pj_getaddrinfo(af, &target->addr.host, &count, &ai);
+	if((status = pj_getaddrinfo(af, &dest_info.addr.host, &count, &ai)) != PJ_SUCCESS) {
+		_error("UserAgent: Unable to perform DNS resolution");
+	}
+
+	_debug("UserAgent: Found address %s", pj_inet_ntoa (ai.ai_addr.ipv4.sin_addr));
+
+	tdata->dest_info.addr.entry[0].addr.addr.sa_family = (pj_uint16_t)af;
+	pj_memcpy(&tdata->dest_info.addr.entry[0].addr, &ai.ai_addr, sizeof(pj_sockaddr));
 
-	svr_addr.entry[0].addr.addr.sa_family = (pj_uint16_t)af;
-	pj_memcpy(&svr_addr.entry[0].addr, &ai.ai_addr, sizeof(pj_sockaddr));
+	tdata->dest_info.addr.count = count;
 
 	return true;
 }
diff --git a/sflphone-common/src/sip/sipvoiplink.h b/sflphone-common/src/sip/sipvoiplink.h
index 8efa336c64a2f9d3a2e7521e107bc6457dc0129d..3d3523b50ead8f0156044be9e3dcbd6158ffd722 100644
--- a/sflphone-common/src/sip/sipvoiplink.h
+++ b/sflphone-common/src/sip/sipvoiplink.h
@@ -377,10 +377,15 @@ class SIPVoIPLink : public VoIPLink
          */
         bool loadSIPLocalIP (std::string *addr);
 
+        /**
+         * Helper function for creating a route set
+         */
+        pjsip_route_hdr *createRouteSet(Account *account);
+
         /**
          * Wrapper around getaddrinfo
          */
-        bool dnsResolution(std::string& name);
+        bool dnsResolution(pjsip_tx_data *tdata);
 
         /**
          * This function unset the transport for a given account. It tests wether the