diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index 1fe1acf..7d8eb66 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -81,11 +81,9 @@
     public SipNotifications notificationManager;
     public MediaManager mediaManager;
 
-
     private HashMap<String, SipCall> current_calls = new HashMap<String, SipCall>();
     private HashMap<String, Conference> current_confs = new HashMap<String, Conference>();
     private IncomingReceiver receiver;
-    
 
     public HashMap<String, Conference> getCurrent_confs() {
         return current_confs;
@@ -97,9 +95,9 @@
         Log.i(TAG, "onUnbind(intent)");
         return true;
     }
-    
+
     @Override
-    public void onRebind(Intent i){
+    public void onRebind(Intent i) {
         super.onRebind(i);
     }
 
@@ -109,7 +107,6 @@
         Log.i(TAG, "onCreated");
         super.onCreate();
 
-
         IntentFilter callFilter = new IntentFilter(CallManagerCallBack.CALL_STATE_CHANGED);
         callFilter.addAction(CallManagerCallBack.INCOMING_CALL);
         callFilter.addAction(CallManagerCallBack.NEW_CALL_CREATED);
@@ -127,10 +124,10 @@
 
         notificationManager = new SipNotifications(this);
         mediaManager = new MediaManager(this);
-        
+
         notificationManager.onServiceCreate();
         mediaManager.startService();
-        
+
     }
 
     /* called for each startService() */
@@ -141,7 +138,6 @@
 
         receiver = new IncomingReceiver(this, mBinder);
 
-
         return START_STICKY; /* started and stopped explicitly */
     }
 
@@ -149,13 +145,13 @@
     public void onDestroy() {
         Log.i(TAG, "onDestroyed");
         /* called once by stopService() */
-        
+
         LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
         notificationManager.onServiceDestroy();
         // sflphoneApp.setServiceRunning(false);
         
-        managerImpl.finish();
 
+        getExecutor().execute(new FinalizeRunnable());
         super.onDestroy();
 
     }
@@ -165,7 +161,7 @@
         Log.i(TAG, "onBound");
         return mBinder;
     }
-    
+
     private static Looper createLooper() {
         if (executorThread == null) {
             Log.d(TAG, "Creating new handler thread");
@@ -216,6 +212,13 @@
             }
         }
     }
+    
+    private void stopDaemon(){
+        if(managerImpl != null){
+           managerImpl.finish();
+           isPjSipStackStarted = false;
+        }
+    }
 
     private void startPjSipStack() throws SameThreadException {
         if (isPjSipStackStarted)
@@ -249,14 +252,14 @@
             return;
         } catch (Exception e) {
             Log.e(TAG, "Problem with the current Pj stack...", e);
+            isPjSipStackStarted = false;
         }
 
         Log.i(TAG, "PjSIPStack started");
         managerImpl = SFLPhoneservice.instance();
 
         /* set static AppPath before calling manager.init */
-
-        // managerImpl.setPath(sflphoneApp.getAppPath());
+//        managerImpl.setPath(getApplication().getFilesDir().getAbsolutePath());
 
         callManagerJNI = new CallManager();
         callManagerCallBack = new CallManagerCallBack(this);
@@ -265,12 +268,9 @@
         configurationManagerJNI = new ConfigurationManager();
         configurationManagerCallback = new ConfigurationManagerCallback(this);
         SFLPhoneservice.setConfigurationCallbackObject(configurationManagerCallback);
-
-        Log.i(TAG, "before init");
         managerImpl.init("");
 
         Log.i(TAG, "->startPjSipStack");
-
     }
 
     public HashMap<String, SipCall> getCurrent_calls() {
@@ -332,6 +332,13 @@
             startPjSipStack();
         }
     }
+    
+    class FinalizeRunnable extends SipRunnable {
+        @Override
+        protected void doRun() throws SameThreadException {
+            stopDaemon();
+        }
+    }
 
     /* ************************************
      * 
@@ -1258,23 +1265,22 @@
 
     };
 
-
     public void changeVolume(int currentVolume) {
-//        StringVect resultsInput = configurationManagerJNI.getAudioInputDeviceList();
-//        StringVect resultsOutput = configurationManagerJNI.getAudioOutputDeviceList();
-//        
-//        Log.i(TAG, "------------------> INPUT DEVICES");
-//        for(int i = 0 ; i < resultsInput.size(); ++i){
-//            Log.i(TAG, resultsInput.get(i));
-//        }
-//        
-//        Log.i(TAG, "------------------> OUTPUT DEVICES");
-//        for(int i = 0 ; i < resultsOutput.size(); ++i){
-//            Log.i(TAG, resultsOutput.get(i));
-//        }
-        
-//        Log.i(TAG,"AudioManager ------------> "+configurationManagerJNI.getAudioManager());
-        
+        // StringVect resultsInput = configurationManagerJNI.getAudioInputDeviceList();
+        // StringVect resultsOutput = configurationManagerJNI.getAudioOutputDeviceList();
+        //
+        // Log.i(TAG, "------------------> INPUT DEVICES");
+        // for(int i = 0 ; i < resultsInput.size(); ++i){
+        // Log.i(TAG, resultsInput.get(i));
+        // }
+        //
+        // Log.i(TAG, "------------------> OUTPUT DEVICES");
+        // for(int i = 0 ; i < resultsOutput.size(); ++i){
+        // Log.i(TAG, resultsOutput.get(i));
+        // }
+
+        // Log.i(TAG,"AudioManager ------------> "+configurationManagerJNI.getAudioManager());
+
         callManagerJNI.setVolume("speaker", currentVolume);
     }
 }
