diff --git a/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java b/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
index 921997b..c0390e3 100644
--- a/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
+++ b/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
@@ -15,6 +15,7 @@
     static public final String NEW_CALL_CREATED = "new-call-created"; 
     static public final String CALL_STATE_CHANGED = "call-state-changed";
     static public final String INCOMING_CALL = "incoming-call";
+    static public final String INCOMING_TEXT = "incoming-text";
 
     public CallManagerCallBack(Context context) {
         mContext = context;
@@ -49,6 +50,12 @@
     }
     
     @Override
+    public void on_incoming_message(String ID, String from, String msg){
+        Log.w(TAG,"on_incoming_message:"+msg);
+        sendIncomingTextMessage(ID, from, msg);
+    }
+    
+    @Override
     public void on_conference_removed(String confID){
         Log.w(TAG,"CONFERENCE REMOVED:"+confID);
     }
@@ -89,4 +96,17 @@
         intent.putExtra("com.savoirfairelinux.sflphone.service.newcall", bundle);
         LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
+    
+    private void sendIncomingTextMessage(String id, String from, String msg) {
+        Bundle bundle = new Bundle();
+
+        bundle.putString("CallID", id);
+        bundle.putString("From", from);
+        bundle.putString("Msg", msg);
+        Intent intent = new Intent(INCOMING_TEXT);
+        intent.putExtra(SIGNAL_NAME, INCOMING_TEXT); 
+        intent.putExtra("com.savoirfairelinux.sflphone.service.newtext", bundle);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
+        
+    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerJNI.java b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerJNI.java
index 765a8bf..310e5d8 100644
--- a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerJNI.java
+++ b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerJNI.java
@@ -199,6 +199,10 @@
     SFLPhoneserviceJNI.ConfigurationManagerJNI_setIsAlwaysRecording(swigCPtr, this, rec);
   }
 
+  public void setRecordingCall(String id) {
+    SFLPhoneserviceJNI.ConfigurationManagerJNI_setRecordingCall(swigCPtr, this, id);
+  }
+
   public SWIGTYPE_p_int32_t getHistoryLimit() {
     return new SWIGTYPE_p_int32_t(SFLPhoneserviceJNI.ConfigurationManagerJNI_getHistoryLimit(swigCPtr, this), true);
   }
diff --git a/src/com/savoirfairelinux/sflphone/service/ISipClient.aidl b/src/com/savoirfairelinux/sflphone/service/ISipClient.aidl
index b845f66..068b2c1 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipClient.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipClient.aidl
@@ -3,4 +3,5 @@
 interface ISipClient {
     void incomingCall(in Intent call);
     void callStateChanged(in Intent callState);
+    void incomingText(in Intent msg);
 }
\ No newline at end of file
diff --git a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
index eb76ffb..2450f97 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
@@ -17,8 +17,18 @@
     void setAccountDetails(in String accountId, in Map accountDetails);
     void setAudioPlugin(in String callID);
     String getCurrentAudioOutputPlugin();
+    
+    /* History */
     List getHistory();
     
+    /* Recording */
+    void setRecordPath(in String path);
+    String getRecordPath();
+    void setRecordingCall(in String id);
+    
+    /* IM */
+    void sendTextMessage(in String callID, in String message, in String from);
+    
     void registerClient(in ISipClient callback);
     
     void transfer(in String callID, in String to);
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index ef04a4c..03b5233 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -66,7 +66,7 @@
     private ManagerImpl managerImpl;
     private boolean isPjSipStackStarted = false;
     ISipClient client;
-    
+
     int clients = 0;
 
     private BroadcastReceiver IncomingReceiver = new BroadcastReceiver() {
@@ -79,13 +79,14 @@
                 try {
                     if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
                         Log.i(TAG, "Received" + intent.getAction());
-                    }else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_LOADED)) {
+                    } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_LOADED)) {
                         Log.i(TAG, "Received" + intent.getAction());
-                    }else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
+                    } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
                         Log.i(TAG, "Received" + intent.getAction());
-                    }
-
-                    if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
+                    } else if(intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
+                        Log.i(TAG, "Received" + intent.getAction());
+                        client.incomingText(intent);
+                    } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
                         Log.i(TAG, "Received" + intent.getAction());
                         client.incomingCall(intent);
                     } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
@@ -127,7 +128,8 @@
         callFilter.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
         callFilter.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
         callFilter.addAction(ConfigurationManagerCallback.ACCOUNTS_LOADED);
-        
+        callFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
+
         LocalBroadcastManager.getInstance(this).registerReceiver(IncomingReceiver, callFilter);
         getExecutor().execute(new StartRunnable());
     }
@@ -438,7 +440,7 @@
             CurrentAudioPlugin runInstance = new CurrentAudioPlugin();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.e(TAG, "Waiting for Nofing");
             }
             return (String) runInstance.getVal();
         }
@@ -456,7 +458,7 @@
             AccountList runInstance = new AccountList();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.e(TAG, "Waiting for Nofing");
             }
             StringVect swigvect = (StringVect) runInstance.getVal();
 
@@ -488,7 +490,7 @@
             getExecutor().execute(runInstance);
             clients++;
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Details "+clients);
+                Log.w(TAG, "Waiting for Details " + clients);
             }
             clients--;
             StringMap swigmap = (StringMap) runInstance.getVal();
@@ -528,14 +530,13 @@
                     return configurationManagerJNI.addAccount(map);
                 }
             }
-            
 
             final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig((HashMap<String, String>) map);
 
             AddAccount runInstance = new AddAccount(swigmap);
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.e(TAG, "Waiting for Nofing");
             }
             String accountId = (String) runInstance.getVal();
 
@@ -573,7 +574,7 @@
             History runInstance = new History();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.w(TAG, "Waiting for getHistory");
             }
             VectMap swigmap = (VectMap) runInstance.getVal();
 
@@ -759,7 +760,7 @@
             ConfList runInstance = new ConfList();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.w(TAG, "Waiting for getConferenceList");
             }
             StringVect swigvect = (StringVect) runInstance.getVal();
 
@@ -789,5 +790,61 @@
             return null;
         }
 
+        @Override
+        public String getRecordPath() throws RemoteException {
+            class RecordPath extends SipRunnableWithReturn {
+
+                @Override
+                protected String doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.getRecordPath() thread running...");
+                    return configurationManagerJNI.getRecordPath();
+                }
+            }
+
+            RecordPath runInstance = new RecordPath();
+            getExecutor().execute(runInstance);
+            while (!runInstance.isDone()) {
+                Log.w(TAG, "Waiting for getRecordPath");
+            }
+            String path = (String) runInstance.getVal();
+
+            return path;
+        }
+
+        @Override
+        public void setRecordingCall(final String id) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.setRecordingCall() thread running...");
+                    callManagerJNI.setRecordingCall(id);
+                }
+            });
+
+        }
+
+        @Override
+        public void setRecordPath(final String path) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.setRecordingCall() thread running...");
+                    configurationManagerJNI.setRecordPath(path);
+                }
+            });
+        }
+
+        @Override
+        public void sendTextMessage(final String callID, final String message, final String from) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.sendTextMessage() thread running...");
+                    callManagerJNI.sendTextMessage(callID, message, from);
+                }
+            });
+
+        }
+
     };
 }
