diff --git a/src/org/sflphone/model/BubblesView.java b/src/org/sflphone/model/BubblesView.java
index c53f18a..6c2923f 100644
--- a/src/org/sflphone/model/BubblesView.java
+++ b/src/org/sflphone/model/BubblesView.java
@@ -370,7 +370,8 @@
                     return true;
                 case Bubble.actions.RECORD:
                     try {
-                        callback.mCallbacks.getService().toggleRecordingCall(expand.getCallID());
+                        boolean isRecording = callback.mCallbacks.getService().toggleRecordingCall(expand.getCallID());
+                        ((BubbleUser) expand).associated_call.setRecording(isRecording);
                     } catch (RemoteException e1) {
                         e1.printStackTrace();
                     }
diff --git a/src/org/sflphone/model/Conference.java b/src/org/sflphone/model/Conference.java
index 9ff5570..3303d4b 100644
--- a/src/org/sflphone/model/Conference.java
+++ b/src/org/sflphone/model/Conference.java
@@ -146,7 +146,10 @@
     }
 
     public boolean isRecording() {
-        return recording;
+        if(hasMultipleParticipants())
+            return recording;
+        else
+            return participants.get(0).isRecording();
     }
 
     public boolean isOnGoing() {
diff --git a/src/org/sflphone/model/SipCall.java b/src/org/sflphone/model/SipCall.java
index 63989f5..f70649b 100644
--- a/src/org/sflphone/model/SipCall.java
+++ b/src/org/sflphone/model/SipCall.java
@@ -338,7 +338,7 @@
 
         public static SipCall buildMyselfCall(ContentResolver cr, String displayName) {
             return new SipCall("default", null, SipCall.state.CALL_TYPE_UNDETERMINED, state.CALL_STATE_NONE, state.MEDIA_STATE_NONE,
-                    CallContact.ContactBuilder.buildUserContact(cr, displayName));
+                    CallContact.ContactBuilder.buildUserContact(cr));
 
         }
 
diff --git a/src/org/sflphone/receivers/IncomingReceiver.java b/src/org/sflphone/receivers/IncomingReceiver.java
index 77c96ba..077be7c 100644
--- a/src/org/sflphone/receivers/IncomingReceiver.java
+++ b/src/org/sflphone/receivers/IncomingReceiver.java
@@ -270,27 +270,27 @@
 
             Log.i(TAG, "Received" + intent.getAction());
 
-            try {
-                if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
-                    callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-                } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
-                    callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-                } else {
-                    // A call in a conference has been put on hold
-                    Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
-                    while (it.hasNext()) {
-                        Conference c = it.next();
-                        if (c.getCall(intent.getStringExtra("id")) != null)
-                            c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-                    }
-                }
-                // Re sending the same intent to the app
-                callback.sendBroadcast(intent);
-                ;
-            } catch (RemoteException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
+//            try {
+//                if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
+//                    callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+//                } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
+//                    callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+//                } else {
+//                    // A call in a conference has been put on hold
+//                    Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
+//                    while (it.hasNext()) {
+//                        Conference c = it.next();
+//                        if (c.getCall(intent.getStringExtra("id")) != null)
+//                            c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+//                    }
+//                }
+//                // Re sending the same intent to the app
+//                callback.sendBroadcast(intent);
+//                ;
+//            } catch (RemoteException e) {
+//                // TODO Auto-generated catch block
+//                e.printStackTrace();
+//            }
 
         }
 
diff --git a/src/org/sflphone/service/ISipService.aidl b/src/org/sflphone/service/ISipService.aidl
index 572bf55..f93952f 100644
--- a/src/org/sflphone/service/ISipService.aidl
+++ b/src/org/sflphone/service/ISipService.aidl
@@ -41,7 +41,6 @@
     boolean toggleRecordingCall(in String id);
     boolean startRecordedFilePlayback(in String filepath);
 	void stopRecordedFilePlayback(in String filepath);
-	boolean isRecording(in String id);
 	
 	/* DTMF */
 	void playDtmf(in String key);
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index 732ee98..8f253f3 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -949,7 +949,22 @@
                 @Override
                 protected Boolean doRun() throws SameThreadException {
                     Log.i(TAG, "SipService.toggleRecordingCall() thread running...");
-                    return callManagerJNI.toggleRecording(id);
+                    boolean result = callManagerJNI.toggleRecording(id);
+                    
+                    if(getCurrent_calls().containsKey(id)){
+                        getCurrent_calls().get(id).setRecording(result);
+                    } else if(getCurrent_confs().containsKey(id)){
+                        getCurrent_confs().get(id).setRecording(result);
+                    } else {
+                        // A call in a conference has been put on hold
+                        Iterator<Conference> it = getCurrent_confs().values().iterator();
+                        while (it.hasNext()) {
+                            Conference c = it.next();
+                            if (c.getCall(id) != null)
+                                c.getCall(id).setRecording(result);
+                        }
+                    }
+                    return result;
                 }
             }
 
@@ -963,26 +978,6 @@
         }
 
         @Override
-        public boolean isRecording(final String id) throws RemoteException {
-            class IsRecording extends SipRunnableWithReturn {
-
-                @Override
-                protected Boolean doRun() throws SameThreadException {
-                    Log.i(TAG, "SipService.isRecording() thread running...");
-                    return callManagerJNI.getIsRecording(id);
-                }
-            }
-
-            IsRecording runInstance = new IsRecording();
-            getExecutor().execute(runInstance);
-            while (!runInstance.isDone()) {
-            }
-
-            return (Boolean) runInstance.getVal();
-
-        }
-
-        @Override
         public boolean startRecordedFilePlayback(final String filepath) throws RemoteException {
             getExecutor().execute(new SipRunnable() {
                 @Override
