diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp
index 3c559c0c74f21a6d7f25c83d6f075c5defb46478..6334e686e1e6292107f9eb5ebdb33f4937639e0f 100644
--- a/src/sipvoiplink.cpp
+++ b/src/sipvoiplink.cpp
@@ -184,6 +184,9 @@ SIPVoIPLink::sendUnregister()
 {
   _debug("SEND UNREGISTER for account %s\n" , getAccountID().c_str());
 
+  if(!_bRegister)
+      return true;
+  
   _bRegister = false;
   
   Manager::instance().getUserAgent()->removeAccount(_regc);
diff --git a/src/sipvoiplink.h b/src/sipvoiplink.h
index 979085a7a9f6a58507a958b1668e69b990cf0105..e8805bcff8c0960162ac3ddaa5044112cf47c2ce 100644
--- a/src/sipvoiplink.h
+++ b/src/sipvoiplink.h
@@ -213,6 +213,8 @@ class SIPVoIPLink : public VoIPLink
     void setPortNumber(const std::string& port);
  
     bool isRegister() {return _bRegister;}
+    
+    void setRegister(bool result) {_bRegister = result;}
 
   public:
 
diff --git a/src/useragent.cpp b/src/useragent.cpp
index 7fc5c1e4d61e3537e350c897ba5bdb4cb28a8412..009afa64706ef389169977a0b2dd572ab5de5958 100644
--- a/src/useragent.cpp
+++ b/src/useragent.cpp
@@ -17,6 +17,9 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <string>
+
+
 #include <iostream>
 
 #include "manager.h"
@@ -485,9 +488,18 @@ pj_status_t UserAgent::stunServerResolve() {
     stun_status = PJ_EPENDING;
 
     // Init STUN socket
-    pj_strdup2(_pool, &stun_adr, _stunServer.data());
-    stun_status = pj_sockaddr_in_init(&stun_srv.ipv4, &stun_adr, (pj_uint16_t) 3478);
-
+    size_t pos = _stunServer.find(':');
+    if(pos == std::string::npos) {
+        pj_strdup2(_pool, &stun_adr, _stunServer.data());
+        stun_status = pj_sockaddr_in_init(&stun_srv.ipv4, &stun_adr, (pj_uint16_t) 3478);
+    } else {
+        std::string serverName = _stunServer.substr(0, pos);
+        std::string serverPort = _stunServer.substr(pos + 1);
+        int nPort = atoi(serverPort.data());
+        pj_strdup2(_pool, &stun_adr, serverName.data());
+        stun_status = pj_sockaddr_in_init(&stun_srv.ipv4, &stun_adr, (pj_uint16_t) nPort);
+    }
+    
     if (stun_status != PJ_SUCCESS) {
         _debug("UserAgent: Unresolved stun server!\n");
         stun_status = pj_gethostbyname(&stun_adr, &he);
@@ -556,6 +568,9 @@ void UserAgent::regc_cb(struct pjsip_regc_cbparam *param) {
     SIPVoIPLink *voipLink;
     
     _debug("UserAgent: Account ID is %s, Register result: %d, Status: %d\n", id->data(), param->status, param->code);
+    voipLink = dynamic_cast<SIPVoIPLink *>(Manager::instance().getAccountLink(*id));
+    if(!voipLink)
+        return;
     
     if (param->status == PJ_SUCCESS) {
         if (param->code < 0 || param->code >= 300) {
@@ -563,18 +578,20 @@ void UserAgent::regc_cb(struct pjsip_regc_cbparam *param) {
              * So checking the code for real result
              */
             Manager::instance().getAccountLink(*id)->setRegistrationState(VoIPLink::Error);
-        } else
+            voipLink->setRegister(false);
+        } else {
             // Registration/Unregistration is success
-            voipLink = dynamic_cast<SIPVoIPLink *>(Manager::instance().getAccountLink(*id));
-            if(!voipLink)
-                return;
         
             if(voipLink->isRegister())
                 Manager::instance().getAccountLink(*id)->setRegistrationState(VoIPLink::Registered);
-            else
+            else {
                 Manager::instance().getAccountLink(*id)->setRegistrationState(VoIPLink::Unregistered);
+                voipLink->setRegister(false);
+            }
+        }
     } else {
         Manager::instance().getAccountLink(*id)->setRegistrationState(VoIPLink::Error);
+        voipLink->setRegister(false);
     }
 }