* #32662: start and finish daemon from ExecutorThread
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f6296a8..92371d3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -32,7 +32,7 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.sflphone"
-    android:versionCode="5"
+    android:versionCode="6"
     android:versionName="1.2.3.03" >
 
     <uses-sdk
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);
     }
 }