diff --git a/daemon/src/sip/Makefile.am b/daemon/src/sip/Makefile.am
index 0bb68fdc2cb777dadb0de19ac4e2ff429ff9dc67..973744a56f188759a57ea4e05002399dfabb419d 100644
--- a/daemon/src/sip/Makefile.am
+++ b/daemon/src/sip/Makefile.am
@@ -20,9 +20,8 @@ libsiplink_la_SOURCES = \
 		pres_sub_server.cpp\
 		pres_sub_server.h\
 		pres_sub_client.cpp\
-		pres_sub_client.h\
-		sippublish.cpp\
-		sippublish.h
+		pres_sub_client.h
+
 if BUILD_SDES
 libsiplink_la_SOURCES+= sdes_negotiator.cpp \
 			sdes_negotiator.h \
diff --git a/daemon/src/sip/sippresence.cpp b/daemon/src/sip/sippresence.cpp
index 03f06005922f5c6b3497b355368d70c2f6e81e34..7bc7171b79fd666191f265d7dad5b82195216786 100644
--- a/daemon/src/sip/sippresence.cpp
+++ b/daemon/src/sip/sippresence.cpp
@@ -30,14 +30,14 @@
  */
 
 
+#include "sippresence.h"
 #include "logger.h"
 #include "manager.h"
 #include "client/client.h"
 #include "client/callmanager.h"
 #include "client/presencemanager.h"
 #include "sipaccount.h"
-#include "sippublish.h"
-#include "sippresence.h"
+#include "sip_utils.h"
 #include "pres_sub_server.h"
 #include "pres_sub_client.h"
 #include "sipvoiplink.h"
@@ -46,7 +46,7 @@
 #define MAX_N_PRES_SUB_CLIENT 20
 
 SIPPresence::SIPPresence(SIPAccount *acc)
-    : publish_sess()
+    : publish_sess_()
     , pres_status_data_()
     , enabled_(true)
     , acc_(acc)
@@ -74,10 +74,10 @@ SIPPresence::SIPPresence(SIPAccount *acc)
 SIPPresence::~SIPPresence()
 {
     /* Flush the lists */
-    for (const auto &c : pres_sub_client_list_)
+    for (const auto & c : pres_sub_client_list_)
         removePresSubClient(c) ;
 
-    for (const auto &s : pres_sub_server_list_)
+    for (const auto & s : pres_sub_server_list_)
         removePresSubServer(s);
 }
 
@@ -160,13 +160,14 @@ void SIPPresence::reportPresSubClientNotification(const std::string& uri, pjsip_
 void SIPPresence::subscribeClient(const std::string& uri, bool flag)
 {
     /* Check if the buddy was already subscribed */
-    for (const auto &c : pres_sub_client_list_)
+    for (const auto & c : pres_sub_client_list_) {
         if (c->getURI() == uri) {
             DEBUG("-PresSubClient:%s exists in the list. Replace it.", uri.c_str());
             delete c;
             removePresSubClient(c);
             break;
         }
+    }
 
     if (pres_sub_client_list_.size() >= MAX_N_PRES_SUB_CLIENT) {
         WARN("Can't add PresSubClient, max number reached.");
@@ -210,12 +211,13 @@ void SIPPresence::reportnewServerSubscriptionRequest(PresSubServer *s)
 
 void SIPPresence::approvePresSubServer(const std::string& uri, bool flag)
 {
-    for (const auto &s : pres_sub_server_list_)
+    for (const auto & s : pres_sub_server_list_) {
         if (s->matches((char *) uri.c_str())) {
             DEBUG("Approve Presence_subscription_server for %s: %s.", s->remote, flag ? "true" : "false");
             s->approve(flag);
             // return; // 'return' would prevent multiple-time subscribers from spam
         }
+    }
 }
 
 
@@ -240,7 +242,7 @@ void SIPPresence::notifyPresSubServer()
 {
     DEBUG("Iterating through Presence_subscription_server:");
 
-    for (const auto &s : pres_sub_server_list_)
+    for (const auto & s : pres_sub_server_list_)
         s->notify();
 }
 
@@ -292,3 +294,190 @@ void SIPPresence::fillDoc(pjsip_tx_data *tdata, const pres_msg_data *msg_data)
         tdata->msg->body = body;
     }
 }
+
+static const pjsip_publishc_opt my_publish_opt = {true}; // this is queue_request
+
+/*
+ * Client presence publication callback.
+ */
+void
+SIPPresence::pres_publish_cb(struct pjsip_publishc_cbparam *param)
+{
+    SIPPresence *pres = (SIPPresence*) param->token;
+
+    if (param->code / 100 != 2 || param->status != PJ_SUCCESS) {
+
+        pjsip_publishc_destroy(param->pubc);
+        pres->publish_sess_ = NULL;
+
+        if (param->status != PJ_SUCCESS) {
+            char errmsg[PJ_ERR_MSG_SIZE];
+
+            pj_strerror(param->status, errmsg, sizeof(errmsg));
+            ERROR("Client publication (PUBLISH) failed, status=%d, msg=%s", param->status, errmsg);
+        } else if (param->code == 412) {
+            /* 412 (Conditional Request Failed)
+             * The PUBLISH refresh has failed, retry with new one.
+             */
+            WARN("Publish retry.");
+            pres_publish(pres);
+        } else {
+            ERROR("Client publication (PUBLISH) failed (%u/%.*s)",
+                  param->code, param->reason.slen, param->reason.ptr);
+        }
+
+    } else {
+        if (param->expiration < 1) {
+            /* Could happen if server "forgot" to include Expires header
+             * in the response. We will not renew, so destroy the pubc.
+             */
+            pjsip_publishc_destroy(param->pubc);
+            pres->publish_sess_ = NULL;
+        }
+    }
+}
+
+/*
+ * Send PUBLISH request.
+ */
+pj_status_t
+SIPPresence::pres_send_publish(SIPPresence * pres, pj_bool_t active)
+{
+    pjsip_tx_data *tdata;
+    pj_status_t status;
+
+    DEBUG("Send presence %sPUBLISH..", (active ? "" : "un-"));
+
+    SIPAccount * acc = pres->getAccount();
+    std::string contactWithAngles =  acc->getFromUri();
+    contactWithAngles.erase(contactWithAngles.find('>'));
+    int semicolon = contactWithAngles.find_first_of(":");
+    std::string contactWithoutAngles = contactWithAngles.substr(semicolon + 1);
+//    pj_str_t contact = pj_str(strdup(contactWithoutAngles.c_str()));
+//    pj_memcpy(&pres_status_data.info[0].contact, &contt, sizeof(pj_str_t));;
+
+    /* Create PUBLISH request */
+    if (active) {
+        char *bpos;
+        pj_str_t entity;
+
+        status = pjsip_publishc_publish(pres->publish_sess_, PJ_TRUE, &tdata);
+
+        if (status != PJ_SUCCESS) {
+            ERROR("Error creating PUBLISH request", status);
+            goto on_error;
+        }
+
+        pj_str_t from = pj_str(strdup(acc->getFromUri().c_str()));
+
+        if ((bpos = pj_strchr(&from, '<')) != NULL) {
+            char *epos = pj_strchr(&from, '>');
+
+            if (epos - bpos < 2) {
+                pj_assert(!"Unexpected invalid URI");
+                status = PJSIP_EINVALIDURI;
+                goto on_error;
+            }
+
+            entity.ptr = bpos + 1;
+            entity.slen = epos - bpos - 1;
+        } else {
+            entity = from;
+        }
+
+        /* Create and add PIDF message body */
+        status = pjsip_pres_create_pidf(tdata->pool, pres->getStatus(),
+                                        &entity, &tdata->msg->body);
+
+        if (status != PJ_SUCCESS) {
+            ERROR("Error creating PIDF for PUBLISH request");
+            pjsip_tx_data_dec_ref(tdata);
+            goto on_error;
+        }
+
+    } else {
+        WARN("Unpublish is not implemented.");
+    }
+
+
+    pres_msg_data msg_data;
+    pj_bzero(&msg_data, sizeof(msg_data));
+    pj_list_init(&msg_data.hdr_list);
+    pjsip_media_type_init(&msg_data.multipart_ctype, NULL, NULL);
+    pj_list_init(&msg_data.multipart_parts);
+
+    pres->fillDoc(tdata, &msg_data);
+
+    /* Send the PUBLISH request */
+    status = pjsip_publishc_send(pres->publish_sess_, tdata);
+
+    if (status == PJ_EPENDING) {
+        WARN("Previous request is in progress, ");
+    } else if (status != PJ_SUCCESS) {
+        ERROR("Error sending PUBLISH request");
+        goto on_error;
+    }
+
+    return PJ_SUCCESS;
+
+on_error:
+
+    if (pres->publish_sess_) {
+        pjsip_publishc_destroy(pres->publish_sess_);
+        pres->publish_sess_ = NULL;
+    }
+
+    return status;
+}
+
+
+/* Create client publish session */
+pj_status_t
+SIPPresence::pres_publish(SIPPresence *pres)
+{
+    pj_status_t status;
+    const pj_str_t STR_PRESENCE = pj_str("presence");
+    SIPAccount * acc = pres->getAccount();
+    pjsip_endpoint *endpt = ((SIPVoIPLink*) acc->getVoIPLink())->getEndpoint();
+
+    /* Create and init client publication session */
+
+    /* Create client publication */
+    status = pjsip_publishc_create(endpt, &my_publish_opt,
+                                   pres, &pres_publish_cb,
+                                   &pres->publish_sess_);
+
+    if (status != PJ_SUCCESS) {
+        pres->publish_sess_ = NULL;
+        ERROR("Failed to create a publish seesion.");
+        return status;
+    }
+
+    /* Initialize client publication */
+    pj_str_t from = pj_str(strdup(acc->getFromUri().c_str()));
+    status = pjsip_publishc_init(pres->publish_sess_, &STR_PRESENCE, &from, &from, &from, 0xFFFF);
+
+    if (status != PJ_SUCCESS) {
+        ERROR("Failed to init a publish session");
+        pres->publish_sess_ = NULL;
+        return status;
+    }
+
+    /* Add credential for authentication */
+    if (acc->hasCredentials() and pjsip_publishc_set_credentials(pres->publish_sess_, acc->getCredentialCount(), acc->getCredInfo()) != PJ_SUCCESS) {
+        ERROR("Could not initialize credentials for invite session authentication");
+        return status;
+    }
+
+    /* Set route-set */
+    if (acc->hasServiceRoute())
+        pjsip_regc_set_route_set(acc->getRegistrationInfo(), sip_utils::createRouteSet(acc->getServiceRoute(), pres->getPool()));
+
+    /* Send initial PUBLISH request */
+    status = pres_send_publish(pres, PJ_TRUE);
+
+    if (status != PJ_SUCCESS)
+        return status;
+
+    return PJ_SUCCESS;
+}
diff --git a/daemon/src/sip/sippresence.h b/daemon/src/sip/sippresence.h
index 26b95626b9c757b6bd032032dcc37b73d0f06647..0612e0fb3b73758470b7bfa7752addb43e6ef889 100644
--- a/daemon/src/sip/sippresence.h
+++ b/daemon/src/sip/sippresence.h
@@ -44,26 +44,25 @@
 #include "pjsip-simple/rpid.h"
 #include <pj/pool.h>
 
-struct pres_msg_data
-{
+struct pres_msg_data {
     /**
      * Additional message headers as linked list. Application can add
      * headers to the list by creating the header, either from the heap/pool
      * or from temporary local variable, and add the header using
      * linked list operation. See pjsip_apps.c for some sample codes.
      */
-    pjsip_hdr	hdr_list;
+    pjsip_hdr    hdr_list;
 
     /**
      * MIME type of optional message body.
      */
-    pj_str_t	content_type;
+    pj_str_t    content_type;
 
     /**
      * Optional message body to be added to the message, only when the
      * message doesn't have a body.
      */
-    pj_str_t	msg_body;
+    pj_str_t    msg_body;
 
     /**
      * Content type of the multipart body. If application wants to send
@@ -102,133 +101,136 @@ struct pj_caching_pool;
 
 class SIPPresence {
 
-public:
-
-    /**
-     * Constructor
-     * @param acc the associated sipaccount
-     */
-    SIPPresence(SIPAccount * acc);
-    /**
-     * Destructor
-     */
-    ~SIPPresence();
-
-    /**
-     * Return associated sipaccount
-     */
-    SIPAccount * getAccount() const;
-    /**
-     * Return presence data.
-     */
-    pjsip_pres_status * getStatus();
-    /**
-     * Return presence module ID which is actually the same as the VOIP link
-     */
-    int getModId() const;
-    /**
-     *  Return a pool for generic functions.
-     */
-    pj_pool_t*  getPool() const;
-    /**
-     * Activate the module (PUBLISH/SUBSCRIBE)
-     */
-    void enable(bool flag);
-     /**
-     * Fill xml document, the header and the body
-     */
-    void fillDoc(pjsip_tx_data *tdata, const pres_msg_data *msg_data);
-    /**
-     * Modify the presence data
-     * @param status is basically "open" or "close"
-     */
-    void updateStatus(bool status, const std::string &note);
-    /**
-     * Send the presence data in a PUBLISH to the PBX or in a NOTIFY
-     * to a remote subscriber (IP2IP)
-     */
-    void sendPresence(bool status, const std::string &note);
-    /**
-     * Send a signal to the client on DBus. The signal contain the status
-     * of a remote user.
-     */
-    void reportPresSubClientNotification(const std::string& uri, pjsip_pres_status * status);
-    /**
-     * Send a SUBSCRIBE request to PBX/IP2IP
-     * @param buddyUri  Remote user that we want to subscribe
-     */
-    void subscribeClient(const std::string& uri, bool flag);
-    /**
-     * Add a buddy in the buddy list.
-     * @param b     PresSubClient pointer
-     */
-    void addPresSubClient(PresSubClient *b);
-    /**
-     * Remove a buddy from the list.
-     * @param b     PresSubClient pointer
-     */
-    void removePresSubClient(PresSubClient *b);
-
-    /**
-     * IP2IP context.
-     * Report new Subscription to the client, waiting for approval.
-     * @param s     PresenceSubcription pointer.
-     */
-    void reportnewServerSubscriptionRequest(PresSubServer *s);
-     /**
-     * IP2IP context.
-     * Process new subscription based on client decision.
-     * @param flag     client decision.
-     * @param uri       uri of the remote subscriber
-     */
-    void approvePresSubServer(const std::string& uri, bool flag);
-    /**
-     * IP2IP context.
-     * Add a server associated to a subscriber in the list.
-     * @param s     PresenceSubcription pointer.
-     */
-    void addPresSubServer(PresSubServer *s);
-    /**
-     * IP2IP context.
-     * Remove a server associated to a subscriber from the list.
-     * @param s     PresenceSubcription pointer.
-     */
-    void removePresSubServer(PresSubServer *s);
-    /**
-     * IP2IP context.
-     * Iterate through the subscriber list and send NOTIFY to each.
-     */
-    void notifyPresSubServer();
-
-    bool isEnabled() const {
-        return enabled_;
-    }
-
-    const std::list< PresSubClient *> getClientSubscriptions() {
-        return pres_sub_client_list_;
-    }
-
-    void lock();
-    void unlock();
-
-    pjsip_publishc  *publish_sess;  /**< Client publication session.*/
-private:
-    pjsip_pres_status pres_status_data_; /**< Presence Data.*/
-
-    pj_bool_t enabled_; /**< Allow for status publish,*/
-    NON_COPYABLE(SIPPresence);
-
-    SIPAccount * acc_; /**<  Associated SIP account. */
-    std::list< PresSubServer *> pres_sub_server_list_; /**< Subscribers list.*/
-    std::list< PresSubClient *> pres_sub_client_list_; /**< Subcribed buddy list.*/
-
-    pj_mutex_t	*mutex_;	    /**< Mutex protection for this data	*/
-    unsigned	mutex_nesting_level_; /**< Mutex nesting level.	*/
-    pj_thread_t	*mutex_owner_; /**< Mutex owner.			*/
-    pj_caching_pool     cp_;	    /**< Global pool factory.		*/
-    pj_pool_t	*pool_;	    /**< pjsua's private pool.		*/
-
-
+    public:
+
+        /**
+         * Constructor
+         * @param acc the associated sipaccount
+         */
+        SIPPresence(SIPAccount * acc);
+        /**
+         * Destructor
+         */
+        ~SIPPresence();
+
+        /**
+         * Return associated sipaccount
+         */
+        SIPAccount * getAccount() const;
+        /**
+         * Return presence data.
+         */
+        pjsip_pres_status * getStatus();
+        /**
+         * Return presence module ID which is actually the same as the VOIP link
+         */
+        int getModId() const;
+        /**
+         *  Return a pool for generic functions.
+         */
+        pj_pool_t*  getPool() const;
+        /**
+         * Activate the module (PUBLISH/SUBSCRIBE)
+         */
+        void enable(bool flag);
+        /**
+        * Fill xml document, the header and the body
+        */
+        void fillDoc(pjsip_tx_data *tdata, const pres_msg_data *msg_data);
+        /**
+         * Modify the presence data
+         * @param status is basically "open" or "close"
+         */
+        void updateStatus(bool status, const std::string &note);
+        /**
+         * Send the presence data in a PUBLISH to the PBX or in a NOTIFY
+         * to a remote subscriber (IP2IP)
+         */
+        void sendPresence(bool status, const std::string &note);
+        /**
+         * Send a signal to the client on DBus. The signal contain the status
+         * of a remote user.
+         */
+        void reportPresSubClientNotification(const std::string& uri, pjsip_pres_status * status);
+        /**
+         * Send a SUBSCRIBE request to PBX/IP2IP
+         * @param buddyUri  Remote user that we want to subscribe
+         */
+        void subscribeClient(const std::string& uri, bool flag);
+        /**
+         * Add a buddy in the buddy list.
+         * @param b     PresSubClient pointer
+         */
+        void addPresSubClient(PresSubClient *b);
+        /**
+         * Remove a buddy from the list.
+         * @param b     PresSubClient pointer
+         */
+        void removePresSubClient(PresSubClient *b);
+
+        /**
+         * IP2IP context.
+         * Report new Subscription to the client, waiting for approval.
+         * @param s     PresenceSubcription pointer.
+         */
+        void reportnewServerSubscriptionRequest(PresSubServer *s);
+        /**
+        * IP2IP context.
+        * Process new subscription based on client decision.
+        * @param flag     client decision.
+        * @param uri       uri of the remote subscriber
+        */
+        void approvePresSubServer(const std::string& uri, bool flag);
+        /**
+         * IP2IP context.
+         * Add a server associated to a subscriber in the list.
+         * @param s     PresenceSubcription pointer.
+         */
+        void addPresSubServer(PresSubServer *s);
+        /**
+         * IP2IP context.
+         * Remove a server associated to a subscriber from the list.
+         * @param s     PresenceSubcription pointer.
+         */
+        void removePresSubServer(PresSubServer *s);
+        /**
+         * IP2IP context.
+         * Iterate through the subscriber list and send NOTIFY to each.
+         */
+        void notifyPresSubServer();
+
+        bool isEnabled() const {
+            return enabled_;
+        }
+
+        const std::list< PresSubClient *> getClientSubscriptions() {
+            return pres_sub_client_list_;
+        }
+
+        void lock();
+        void unlock();
+
+    private:
+        NON_COPYABLE(SIPPresence);
+
+        static pj_status_t pres_publish(SIPPresence *pres);
+        static void pres_publish_cb(struct pjsip_publishc_cbparam *param);
+        static pj_status_t pres_send_publish(SIPPresence *pres, pj_bool_t active);
+
+        pjsip_publishc  *publish_sess_;  /**< Client publication session.*/
+        pjsip_pres_status pres_status_data_; /**< Presence Data.*/
+
+        pj_bool_t enabled_; /**< Allow for status publish,*/
+
+        SIPAccount * acc_; /**<  Associated SIP account. */
+        std::list< PresSubServer *> pres_sub_server_list_; /**< Subscribers list.*/
+        std::list< PresSubClient *> pres_sub_client_list_; /**< Subcribed buddy list.*/
+
+        pj_mutex_t      *mutex_;
+        unsigned         mutex_nesting_level_;
+        pj_thread_t     *mutex_owner_;
+        pj_caching_pool  cp_;
+        pj_pool_t       *pool_;
 };
 
 #endif
diff --git a/daemon/src/sip/sippublish.cpp b/daemon/src/sip/sippublish.cpp
deleted file mode 100644
index 9d147463890dc842823efe2c610b7f1380d6cf16..0000000000000000000000000000000000000000
--- a/daemon/src/sip/sippublish.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
-*
-*  Author: Patrick Keroulas <patrick.keroulas@savoirfairelinux.com>
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 3 of the License, or
-*  (at your option) any later version.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  You should have received a copy of the GNU General Public License
-*  along with this program; if not, write to the Free Software
-*  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- *
- *  Additional permission under GNU GPL version 3 section 7:
- *
- *  If you modify this program, or any covered work, by linking or
- *  combining it with the OpenSSL project's OpenSSL library (or a
- *  modified version of that library), containing parts covered by the
- *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
- *  grants you additional permission to convey the resulting work.
- *  Corresponding Source for a non-source form of such a combination
- *  shall include the source code for the parts of OpenSSL used as well
- *  as that of the covered work.
-*/
-
-#include <pjsip/sip_endpoint.h>
-
-#include "sippresence.h"
-#include "sip_utils.h"
-#include "sippublish.h"
-#include "logger.h"
-#include "sipvoiplink.h"
-
-void pres_publish_cb(struct pjsip_publishc_cbparam *param);
-pj_status_t pres_send_publish(SIPPresence * pres, pj_bool_t active);
-const pjsip_publishc_opt my_publish_opt = {true}; // this is queue_request
-
-
-/*
- * Client presence publication callback.
- */
-void pres_publish_cb(struct pjsip_publishc_cbparam *param)
-{
-    SIPPresence *pres = (SIPPresence*) param->token;
-
-    if (param->code / 100 != 2 || param->status != PJ_SUCCESS) {
-
-        pjsip_publishc_destroy(param->pubc);
-        pres->publish_sess = NULL;
-
-        if (param->status != PJ_SUCCESS) {
-            char errmsg[PJ_ERR_MSG_SIZE];
-
-            pj_strerror(param->status, errmsg, sizeof(errmsg));
-            ERROR("Client publication (PUBLISH) failed, status=%d, msg=%s", param->status, errmsg);
-        } else if (param->code == 412) {
-            /* 412 (Conditional Request Failed)
-             * The PUBLISH refresh has failed, retry with new one.
-             */
-            WARN("Publish retry.");
-            pres_publish(pres);
-        } else {
-            ERROR("Client publication (PUBLISH) failed (%u/%.*s)",
-                  param->code, param->reason.slen, param->reason.ptr);
-        }
-
-    } else {
-        if (param->expiration < 1) {
-            /* Could happen if server "forgot" to include Expires header
-             * in the response. We will not renew, so destroy the pubc.
-             */
-            pjsip_publishc_destroy(param->pubc);
-            pres->publish_sess = NULL;
-        }
-    }
-}
-
-/*
- * Send PUBLISH request.
- */
-pj_status_t pres_send_publish(SIPPresence * pres, pj_bool_t active)
-{
-    pjsip_tx_data *tdata;
-    pj_status_t status;
-
-    DEBUG("Send presence %sPUBLISH..", (active ? "" : "un-"));
-
-    SIPAccount * acc = pres->getAccount();
-    std::string contactWithAngles =  acc->getFromUri();
-    contactWithAngles.erase(contactWithAngles.find('>'));
-    int semicolon = contactWithAngles.find_first_of(":");
-    std::string contactWithoutAngles = contactWithAngles.substr(semicolon + 1);
-//    pj_str_t contact = pj_str(strdup(contactWithoutAngles.c_str()));
-//    pj_memcpy(&pres_status_data.info[0].contact, &contt, sizeof(pj_str_t));;
-
-    /* Create PUBLISH request */
-    if (active) {
-        char *bpos;
-        pj_str_t entity;
-
-        status = pjsip_publishc_publish(pres->publish_sess, PJ_TRUE, &tdata);
-
-        if (status != PJ_SUCCESS) {
-            ERROR("Error creating PUBLISH request", status);
-            goto on_error;
-        }
-
-        pj_str_t from = pj_str(strdup(acc->getFromUri().c_str()));
-
-        if ((bpos = pj_strchr(&from, '<')) != NULL) {
-            char *epos = pj_strchr(&from, '>');
-
-            if (epos - bpos < 2) {
-                pj_assert(!"Unexpected invalid URI");
-                status = PJSIP_EINVALIDURI;
-                goto on_error;
-            }
-
-            entity.ptr = bpos + 1;
-            entity.slen = epos - bpos - 1;
-        } else {
-            entity = from;
-        }
-
-        /* Create and add PIDF message body */
-        status = pjsip_pres_create_pidf(tdata->pool, pres->getStatus(),
-                                        &entity, &tdata->msg->body);
-
-        if (status != PJ_SUCCESS) {
-            ERROR("Error creating PIDF for PUBLISH request");
-            pjsip_tx_data_dec_ref(tdata);
-            goto on_error;
-        }
-
-    } else {
-        WARN("Unpublish is not implemented.");
-    }
-
-
-    pres_msg_data msg_data;
-    pj_bzero(&msg_data, sizeof(msg_data));
-    pj_list_init(&msg_data.hdr_list);
-    pjsip_media_type_init(&msg_data.multipart_ctype, NULL, NULL);
-    pj_list_init(&msg_data.multipart_parts);
-
-    pres->fillDoc(tdata, &msg_data);
-
-    /* Send the PUBLISH request */
-    status = pjsip_publishc_send(pres->publish_sess, tdata);
-
-    if (status == PJ_EPENDING) {
-        WARN("Previous request is in progress, ");
-    } else if (status != PJ_SUCCESS) {
-        ERROR("Error sending PUBLISH request");
-        goto on_error;
-    }
-
-    return PJ_SUCCESS;
-
-on_error:
-
-    if (pres->publish_sess) {
-        pjsip_publishc_destroy(pres->publish_sess);
-        pres->publish_sess = NULL;
-    }
-
-    return status;
-}
-
-
-/* Create client publish session */
-pj_status_t pres_publish(SIPPresence *pres)
-{
-    pj_status_t status;
-    const pj_str_t STR_PRESENCE = pj_str("presence");
-    SIPAccount * acc = pres->getAccount();
-    pjsip_endpoint *endpt = ((SIPVoIPLink*) acc->getVoIPLink())->getEndpoint();
-
-    /* Create and init client publication session */
-
-    /* Create client publication */
-    status = pjsip_publishc_create(endpt, &my_publish_opt,
-                                   pres, &pres_publish_cb,
-                                   &pres->publish_sess);
-
-    if (status != PJ_SUCCESS) {
-        pres->publish_sess = NULL;
-        ERROR("Failed to create a publish seesion.");
-        return status;
-    }
-
-    /* Initialize client publication */
-    pj_str_t from = pj_str(strdup(acc->getFromUri().c_str()));
-    status = pjsip_publishc_init(pres->publish_sess, &STR_PRESENCE, &from, &from, &from, 0xFFFF);
-
-    if (status != PJ_SUCCESS) {
-        ERROR("Failed to init a publish session");
-        pres->publish_sess = NULL;
-        return status;
-    }
-
-    /* Add credential for authentication */
-    if (acc->hasCredentials() and pjsip_publishc_set_credentials(pres->publish_sess, acc->getCredentialCount(), acc->getCredInfo()) != PJ_SUCCESS) {
-        ERROR("Could not initialize credentials for invite session authentication");
-        return status;
-    }
-
-    /* Set route-set */
-    if (acc->hasServiceRoute())
-        pjsip_regc_set_route_set(acc->getRegistrationInfo(), sip_utils::createRouteSet(acc->getServiceRoute(), pres->getPool()));
-
-    /* Send initial PUBLISH request */
-    status = pres_send_publish(pres, PJ_TRUE);
-
-    if (status != PJ_SUCCESS)
-        return status;
-
-    return PJ_SUCCESS;
-}
diff --git a/daemon/src/sip/sippublish.h b/daemon/src/sip/sippublish.h
deleted file mode 100644
index 4971abaa08840e7106b25f30dabb6e0b72ae2a3d..0000000000000000000000000000000000000000
--- a/daemon/src/sip/sippublish.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
-*
-*  Author: Patrick Keroulas <patrick.keroulas@savoirfairelinux.com>
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 3 of the License, or
-*  (at your option) any later version.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  You should have received a copy of the GNU General Public License
-*  along with this program; if not, write to the Free Software
-*  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- *
- *  Additional permission under GNU GPL version 3 section 7:
- *
- *  If you modify this program, or any covered work, by linking or
- *  combining it with the OpenSSL project's OpenSSL library (or a
- *  modified version of that library), containing parts covered by the
- *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
- *  grants you additional permission to convey the resulting work.
- *  Corresponding Source for a non-source form of such a combination
- *  shall include the source code for the parts of OpenSSL used as well
- *  as that of the covered work.
-*/
-
-
-#ifndef PUBLISH_H
-#define	PUBLISH_H
-
-
-#include <pjsip_simple.h>
-
-#include "sippresence.h"
-
-class SIPPresence;
-
-pj_status_t pres_publish(SIPPresence *pres);
-
-#endif