diff --git a/build.symbian/bld.inf b/build.symbian/bld.inf
index 410ee02..f4ce903 100644
--- a/build.symbian/bld.inf
+++ b/build.symbian/bld.inf
@@ -32,3 +32,4 @@
 /* Applications */
 //symsndtest.mmp
 pjlib_test.mmp
+../pjsip-apps/src/pjsua/symbian/group/pjsua.mmp
diff --git a/pjsip-apps/src/pjsua/pjsua_app_config.h b/pjsip-apps/src/pjsua/pjsua_app_config.h
index 417bc43..40a24ed 100644
--- a/pjsip-apps/src/pjsua/pjsua_app_config.h
+++ b/pjsip-apps/src/pjsua/pjsua_app_config.h
@@ -19,6 +19,8 @@
 #ifndef __PJSUA_APP_CONFIG_H__
 #define __PJSUA_APP_CONFIG_H__
 
+#include <pjlib.h>
+
 /* This file defines the default app config. It's used by pjsua
  * *mobile* version only. If you're porting pjsua to new mobile
  * platform, you should only include this file once in one of
@@ -27,14 +29,20 @@
 const char *pjsua_app_def_argv[] = { "pjsua",
 				     "--use-cli",
 				     "--no-cli-console",
+#if defined(PJ_SYMBIAN) && PJ_SYMBIAN
+				     /* Can't reuse address on E52 */
+				     "--cli-telnet-port=0",
+#else
 				     "--cli-telnet-port=2323",
-				     "--no-vad",
+#endif
 				     "--quality=4",
 #if defined(PJ_CONFIG_BB10) && PJ_CONFIG_BB10
 			             "--add-buddy=sip:169.254.0.2",
 #endif
 			             NULL };
 
+#define pjsua_app_def_argc (PJ_ARRAY_SIZE(pjsua_app_def_argv)-1)
+
 
 #endif	/* __PJSUA_APP_CONFIG_H__ */
 
diff --git a/pjsip-apps/src/pjsua/symbian/group/pjsua.mmp b/pjsip-apps/src/pjsua/symbian/group/pjsua.mmp
index 88b87df..a65981a 100644
--- a/pjsip-apps/src/pjsua/symbian/group/pjsua.mmp
+++ b/pjsip-apps/src/pjsua/symbian/group/pjsua.mmp
@@ -101,5 +101,5 @@
 
 SOURCEPATH		..\..
 
-SOURCE 			pjsua_cli.c pjsua_legacy.c
-SOURCE 			pjsua_app.c pjsua_common.c pjsua_config.c
+SOURCE 			pjsua_app_cli.c pjsua_app_legacy.c
+SOURCE 			pjsua_app.c pjsua_app_common.c pjsua_app_config.c
diff --git a/pjsip-apps/src/pjsua/symbian/src/pjsuaAppUi.cpp b/pjsip-apps/src/pjsua/symbian/src/pjsuaAppUi.cpp
index 124417c..74b8c42 100644
--- a/pjsip-apps/src/pjsua/symbian/src/pjsuaAppUi.cpp
+++ b/pjsip-apps/src/pjsua/symbian/src/pjsuaAppUi.cpp
@@ -23,22 +23,25 @@
 // ]]] end generated region [Generated Constants]
 
 #include "../../pjsua_app.h"
+#include "../../pjsua_app_config.h"
 
 /* Global vars */
 static CpjsuaAppUi *appui = NULL;
 static pj_ioqueue_t *app_ioqueue = NULL;
-static int restart_argc = 0;
-static char **restart_argv = NULL;
+static int start_argc = 0;
+static char **start_argv = NULL;
+
+static pj_status_t InitSymbSocket();
+static void DestroySymbSocket();
 
 /* Helper funtions to init/restart/destroy the pjsua */
-static void LibInitL();
-static void LibDestroyL();
-static void LibRestartL();
+static void PjsuaInitL();
+static void PjsuaDestroyL();
 
 /* pjsua app callbacks */
-static void lib_on_started(pj_status_t status, const char* title);
-static pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv);
-static void lib_on_config_init(pjsua_app_config *cfg);
+static void PjsuaOnStarted(pj_status_t status, const char* title);
+static void PjsuaOnStopped(pj_bool_t restart, int argc, char** argv);
+static void PjsuaOnConfig(pjsua_app_config *cfg);
 
 /* Helper class to schedule function execution */
 class MyTimer : public CActive 
@@ -208,14 +211,24 @@
 	StatusPane()->MakeVisible(EFalse);
 	Cba()->MakeVisible(EFalse);
 
-	// Schedule Lib Init
-	MyTimer::NewL(100, &LibInitL);
+	if (InitSymbSocket() != PJ_SUCCESS) {
+	    PutMsg("Failed to initialize Symbian network param.");
+	} else {	
+	    start_argc = pjsua_app_def_argc;
+	    start_argv = (char**)pjsua_app_def_argv;
+
+	    // Schedule Lib Init
+	    MyTimer::NewL(100, &PjsuaInitL);
+	}
+	
 	}
 
 /* Called by Symbian GUI framework when app is about to exit */
 void CpjsuaAppUi::PrepareToExit()
 {
-    TRAPD(result, LibDestroyL());
+    TRAPD(result, PjsuaDestroyL());
+    DestroySymbSocket();
+    CloseSTDLIB();
     CAknViewAppUi::PrepareToExit();
 }
 
@@ -231,32 +244,40 @@
 static RConnection aConn;
 
 /* Called when pjsua is started */
-void lib_on_started(pj_status_t status, const char* title)
+void PjsuaOnStarted(pj_status_t status, const char* title)
 {
+    char err_msg[128];
+
+    if (status != PJ_SUCCESS || title == NULL) {
+	char err_str[PJ_ERR_MSG_SIZE];
+	pj_strerror(status, err_str, sizeof(err_str));
+	pj_ansi_snprintf(err_msg, sizeof(err_msg), "%s: %s",
+			 (title?title:"App start error"), err_str);
+	title = err_msg;
+    }
+
     appui->PutMsg(title);
 }
 
 /* Called when pjsua is stopped */
-pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv)
+void PjsuaOnStopped(pj_bool_t restart, int argc, char** argv)
 {
     if (restart) {
-	restart_argc = argc;
-	restart_argv = argv;
+	start_argc = argc;
+	start_argv = argv;
 
 	// Schedule Lib Init
-	MyTimer::NewL(100, &LibRestartL);
+	MyTimer::NewL(100, &PjsuaInitL);
     } else {
 	/* Destroy & quit GUI, e.g: clean up window, resources  */
 	appui->Exit();
     }
-
-    return PJ_FALSE;
 }
 
 /* Called before pjsua initializing config.
  * We need to override some settings here.
  */
-void lib_on_config_init(pjsua_app_config *cfg)
+void PjsuaOnConfig(pjsua_app_config *cfg)
 {
     /* Disable threading */
     cfg->cfg.thread_cnt = 0;
@@ -271,59 +292,66 @@
     cfg->cli_cfg.telnet_cfg.ioqueue = app_ioqueue; 
 }
 
-void LibInitL()
+// Set Symbian OS parameters in pjlib.
+// This must be done before pj_init() is called.
+pj_status_t InitSymbSocket()
 {
     pj_symbianos_params sym_params;
-    char* argv[] = {
-	"",
-	"--use-cli",
-	"--cli-telnet-port=0",
-	"--no-cli-console"
-    };
-    app_cfg_t app_cfg;
-    pj_status_t status;
     TInt err;
-
+    
     // Initialize RSocketServ
     if ((err=aSocketServer.Connect(32)) != KErrNone) {
-    	status = PJ_STATUS_FROM_OS(err);
-    	goto on_return;
+	return PJ_STATUS_FROM_OS(err);
     }
     
     // Open up a connection
     if ((err=aConn.Open(aSocketServer)) != KErrNone) {
 	aSocketServer.Close();
-	status = PJ_STATUS_FROM_OS(err);
-    	goto on_return;
+	return PJ_STATUS_FROM_OS(err);
     }
     if ((err=aConn.Start()) != KErrNone) {
 	aConn.Close();
-    	aSocketServer.Close();
-    	status = PJ_STATUS_FROM_OS(err);
-    	goto on_return;
+	aSocketServer.Close();
+	return PJ_STATUS_FROM_OS(err);
     }
     
-    // Set Symbian OS parameters in pjlib.
-    // This must be done before pj_init() is called.
     pj_bzero(&sym_params, sizeof(sym_params));
     sym_params.rsocketserv = &aSocketServer;
     sym_params.rconnection = &aConn;
     pj_symbianos_set_params(&sym_params);
+    
+    return PJ_SUCCESS;
+}
 
+
+void DestroySymbSocket()
+{
+    aConn.Close();
+    aSocketServer.Close();
+}
+
+
+void PjsuaInitL()
+{
+    pjsua_app_cfg_t app_cfg;
+    pj_status_t status;
+    
+    PjsuaDestroyL();
+    
     pj_bzero(&app_cfg, sizeof(app_cfg));
-    app_cfg.argc = PJ_ARRAY_SIZE(argv);
-    app_cfg.argv = argv;
-    app_cfg.on_started = &lib_on_started;
-    app_cfg.on_stopped = &lib_on_stopped;
-    app_cfg.on_config_init = &lib_on_config_init;
+    app_cfg.argc = start_argc;
+    app_cfg.argv = start_argv;
+    app_cfg.on_started = &PjsuaOnStarted;
+    app_cfg.on_stopped = &PjsuaOnStopped;
+    app_cfg.on_config_init = &PjsuaOnConfig;
 
     appui->PutMsg("Initializing..");
-    status = app_init(&app_cfg);
+    status = pjsua_app_init(&app_cfg);
     if (status != PJ_SUCCESS)
 	goto on_return;
     
     appui->PutMsg("Starting..");
-    status = app_run(PJ_FALSE);
+    status = pjsua_app_run(PJ_FALSE);
     if (status != PJ_SUCCESS)
 	goto on_return;
 
@@ -332,49 +360,11 @@
 	appui->PutMsg("Initialization failed");
 }
 
-void LibDestroyL()
+void PjsuaDestroyL()
 {
     if (app_ioqueue) {
 	pj_ioqueue_destroy(app_ioqueue);
 	app_ioqueue = NULL;
     }
-    app_destroy();
-    CloseSTDLIB();
-}
-
-void LibRestartL()
-{
-    app_cfg_t app_cfg;
-    pj_status_t status;
-    
-    /* Destroy pjsua app first */
-
-    if (app_ioqueue) {
-	pj_ioqueue_destroy(app_ioqueue);
-	app_ioqueue = NULL;
-    }
-    app_destroy();
-
-    /* Reinit pjsua app */
-    
-    pj_bzero(&app_cfg, sizeof(app_cfg));
-    app_cfg.argc = restart_argc;
-    app_cfg.argv = restart_argv;
-    app_cfg.on_started = &lib_on_started;
-    app_cfg.on_stopped = &lib_on_stopped;
-    app_cfg.on_config_init = &lib_on_config_init;
-
-    status = app_init(&app_cfg);
-    if (status != PJ_SUCCESS) {
-	appui->PutMsg("app_init() failed");
-	return;
-    }
-	
-    /* Run pjsua app */
-
-    status = app_run(PJ_FALSE);
-    if (status != PJ_SUCCESS) {
-	appui->PutMsg("app_run() failed");
-	return;
-    }
+    pjsua_app_destroy();
 }
diff --git a/pjsip-apps/src/pjsua/wm/main_wm.c b/pjsip-apps/src/pjsua/wm/main_wm.c
index 8ab1338..311ca77 100644
--- a/pjsip-apps/src/pjsua/wm/main_wm.c
+++ b/pjsip-apps/src/pjsua/wm/main_wm.c
@@ -16,13 +16,10 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  */
-#include <windows.h>
-
-#include <pjlib.h>
-#include <windows.h>
 #include <winuserm.h>
 #include <aygshell.h>
 #include "..\pjsua_app.h"
+#include "..\pjsua_app_config.h"
 
 #define MAINWINDOWCLASS TEXT("PjsuaDlg")
 #define MAINWINDOWTITLE TEXT("PJSUA")
@@ -39,18 +36,17 @@
 static HWND		 g_hWndImg;
 static HBITMAP		 g_hBmp;
 
-static int restart_argc = 0;
-static char **restart_argv = NULL;
+static int		 start_argc;
+static char	       **start_argv;
 
-/* Helper funtions to init/restart/destroy the pjsua */
-static void LibInit();
-static void LibDestroy();
-static void LibRestart();
+/* Helper funtions to init/destroy the pjsua */
+static void PjsuaInit();
+static void PjsuaDestroy();
 
 /* pjsua app callbacks */
-static void lib_on_started(pj_status_t status, const char* title);
-static pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv);
-static void lib_on_config_init(pjsua_app_config *cfg);
+static void PjsuaOnStarted(pj_status_t status, const char* title);
+static void PjsuaOnStopped(pj_bool_t restart, int argc, char** argv);
+static void PjsuaOnConfig(pjsua_app_config *cfg);
 
 LRESULT CALLBACK DialogProc(const HWND hWnd,
 			    const UINT Msg, 
@@ -85,18 +81,14 @@
 	return (LRESULT)GetStockObject(BLACK_BRUSH);
 
     case WM_APP_INIT:
-	LibInit();
+    case WM_APP_RESTART:
+	PjsuaInit();
 	break;
 
     case WM_APP_DESTROY:
-	LibDestroy();
 	PostQuitMessage(0);
 	break;
 
-    case WM_APP_RESTART:
-	LibRestart();
-	break;
-
     default:
 	return DefWindowProc(hWnd, Msg, wParam, lParam);
     }
@@ -107,7 +99,7 @@
 
 /* === GUI === */
 
-pj_status_t gui_init()
+pj_status_t GuiInit()
 {
     WNDCLASS wc;
     HWND hWnd = NULL;	
@@ -192,7 +184,7 @@
 #endif
 
     /* Create logo */
-    g_hBmp = SHLoadDIBitmap(LOGO_PATH); // for jpeg, uses SHLoadImageFile()
+    g_hBmp = SHLoadDIBitmap(LOGO_PATH); /* for jpeg, uses SHLoadImageFile() */
     if (g_hBmp == NULL) {
 	DWORD err = GetLastError();
 	return PJ_RETURN_OS_ERROR(err);
@@ -227,7 +219,7 @@
 }
 
 
-pj_status_t gui_start()
+pj_status_t GuiStart()
 {
     MSG msg;
     while (GetMessage(&msg, NULL, 0, 0)) {
@@ -238,7 +230,7 @@
     return (msg.wParam);
 }
 
-void gui_destroy(void)
+void GuiDestroy(void)
 {
     if (g_hWndMain) {
 	DestroyWindow(g_hWndMain);
@@ -266,22 +258,29 @@
 /* === ENGINE === */
 
 /* Called when pjsua is started */
-void lib_on_started(pj_status_t status, const char* title)
+void PjsuaOnStarted(pj_status_t status, const char* title)
 {
     wchar_t wtitle[128];
+    char err_msg[128];
 
-    PJ_UNUSED_ARG(status);
+    if (status != PJ_SUCCESS || title == NULL) {
+	char err_str[PJ_ERR_MSG_SIZE];
+	pj_strerror(status, err_str, sizeof(err_str));
+	pj_ansi_snprintf(err_msg, sizeof(err_msg), "%s: %s",
+			 (title?title:"App start error"), err_str);
+	title = err_msg;
+    }
 
     pj_ansi_to_unicode(title, strlen(title), wtitle, PJ_ARRAY_SIZE(wtitle));
     SetWindowText(g_hWndLbl, wtitle);
 }
 
 /* Called when pjsua is stopped */
-pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv)
+void PjsuaOnStopped(pj_bool_t restart, int argc, char** argv)
 {
     if (restart) {
-	restart_argc = argc;
-	restart_argv = argv;
+	start_argc = argc;
+	start_argv = argv;
 
 	// Schedule Lib Restart
 	PostMessage(g_hWndMain, WM_APP_RESTART, 0, 0);
@@ -289,41 +288,37 @@
 	/* Destroy & quit GUI, e.g: clean up window, resources  */
 	PostMessage(g_hWndMain, WM_APP_DESTROY, 0, 0);
     }
-
-    return PJ_FALSE;
 }
 
 /* Called before pjsua initializing config. */
-void lib_on_config_init(pjsua_app_config *cfg)
+void PjsuaOnConfig(pjsua_app_config *cfg)
 {
     PJ_UNUSED_ARG(cfg);
 }
 
-void LibInit()
+void PjsuaInit()
 {
-    char* argv[] = {
-	"",
-	"--use-cli",
-	"--cli-telnet-port=0",
-	"--no-cli-console"
-    };
-    app_cfg_t app_cfg;
+    pjsua_app_cfg_t app_cfg;
     pj_status_t status;
 
+    /* Destroy pjsua app first */
+    pjsua_app_destroy();
+
+    /* Init pjsua app */
     pj_bzero(&app_cfg, sizeof(app_cfg));
-    app_cfg.argc = PJ_ARRAY_SIZE(argv);
-    app_cfg.argv = argv;
-    app_cfg.on_started = &lib_on_started;
-    app_cfg.on_stopped = &lib_on_stopped;
-    app_cfg.on_config_init = &lib_on_config_init;
+    app_cfg.argc = start_argc;
+    app_cfg.argv = start_argv;
+    app_cfg.on_started = &PjsuaOnStarted;
+    app_cfg.on_stopped = &PjsuaOnStopped;
+    app_cfg.on_config_init = &PjsuaOnConfig;
 
     SetWindowText(g_hWndLbl, _T("Initializing.."));
-    status = app_init(&app_cfg);
+    status = pjsua_app_init(&app_cfg);
     if (status != PJ_SUCCESS)
 	goto on_return;
     
     SetWindowText(g_hWndLbl, _T("Starting.."));
-    status = app_run(PJ_FALSE);
+    status = pjsua_app_run(PJ_FALSE);
     if (status != PJ_SUCCESS)
 	goto on_return;
 
@@ -332,45 +327,11 @@
 	SetWindowText(g_hWndLbl, _T("Initialization failed"));
 }
 
-void LibDestroy()
+void PjsuaDestroy()
 {
-    app_destroy();
+    pjsua_app_destroy();
 }
 
-void LibRestart()
-{
-    app_cfg_t app_cfg;
-    pj_status_t status;
-    
-    /* Destroy pjsua app first */
-
-    app_destroy();
-
-    /* Reinit pjsua app */
-    
-    pj_bzero(&app_cfg, sizeof(app_cfg));
-    app_cfg.argc = restart_argc;
-    app_cfg.argv = restart_argv;
-    app_cfg.on_started = &lib_on_started;
-    app_cfg.on_stopped = &lib_on_stopped;
-    app_cfg.on_config_init = &lib_on_config_init;
-
-    status = app_init(&app_cfg);
-    if (status != PJ_SUCCESS) {
-	SetWindowText(g_hWndLbl, _T("app_init() failed"));
-	return;
-    }
-	
-    /* Run pjsua app */
-
-    status = app_run(PJ_FALSE);
-    if (status != PJ_SUCCESS) {
-	SetWindowText(g_hWndLbl, _T("app_run() failed"));
-	return;
-    }
-}
-
-
 /* === MAIN === */
 
 int WINAPI WinMain(
@@ -389,18 +350,21 @@
     // store the hInstance in global
     g_hInst = hInstance;
 
-    status = gui_init();
+    // Start GUI
+    status = GuiInit();
     if (status != 0)
 	goto on_return;
 
-    // Start the engine
+    // Setup args and start pjsua
+    start_argc = pjsua_app_def_argc;
+    start_argv = (char**)pjsua_app_def_argv;
     PostMessage(g_hWndMain, WM_APP_INIT, 0, 0);
 
-    status = gui_start();
+    status = GuiStart();
 	
 on_return:
-    LibDestroy();
-    gui_destroy();
+    PjsuaDestroy();
+    GuiDestroy();
 
     return status;
 }
