diff --git a/src/org/sflphone/fragments/CallListFragment.java b/src/org/sflphone/fragments/CallListFragment.java
index 825d16d..d306609 100644
--- a/src/org/sflphone/fragments/CallListFragment.java
+++ b/src/org/sflphone/fragments/CallListFragment.java
@@ -194,7 +194,6 @@
         } catch (RemoteException e) {
             e.printStackTrace();
         }
-
     }
 
     @Override
@@ -280,14 +279,6 @@
 
         }
 
-        public ArrayList<Conference> getDataset() {
-            return calls;
-        }
-
-        public void remove(Conference transfer) {
-
-        }
-
         public void updateDataset(ArrayList<Conference> list) {
             calls.clear();
             calls.addAll(list);
@@ -411,10 +402,7 @@
                     Conference c = data.getParcelableExtra("target");
                     transfer = data.getParcelableExtra("transfer");
                     try {
-
                         mCallbacks.getService().attendedTransfer(transfer.getParticipants().get(0).getCallId(), c.getParticipants().get(0).getCallId());
-                        mConferenceAdapter.remove(transfer);
-                        mConferenceAdapter.remove(c);
                         mConferenceAdapter.notifyDataSetChanged();
                     } catch (RemoteException e) {
                         // TODO Auto-generated catch block
diff --git a/src/org/sflphone/model/Conference.java b/src/org/sflphone/model/Conference.java
index 3c30c9b..2e60e8f 100644
--- a/src/org/sflphone/model/Conference.java
+++ b/src/org/sflphone/model/Conference.java
@@ -50,7 +50,7 @@
         return participants.get(0).isRinging();
     }
 
-    public void removeParticipant(String toRemove) {
+    public void removeParticipant(SipCall toRemove) {
         participants.remove(toRemove);
     }
 
@@ -111,6 +111,7 @@
         }
     };
 
+
     private Conference(Parcel in) {
         participants = new ArrayList<SipCall>();
         id = in.readString();
diff --git a/src/org/sflphone/service/CallManagerCallBack.java b/src/org/sflphone/service/CallManagerCallBack.java
index 40ae6ac..7cc6f4a 100644
--- a/src/org/sflphone/service/CallManagerCallBack.java
+++ b/src/org/sflphone/service/CallManagerCallBack.java
@@ -80,21 +80,17 @@
                 mService.mHistoryManager.insertNewEntry(mService.getConferences().get(callID));
                 mService.getConferences().remove(callID);
             } else {
-                ArrayList<Conference> it = new ArrayList<Conference>(mService.getConferences().values());
 
-                boolean found = false;
-                int i = 0;
-                while (!found && i < it.size()) {
-                    Conference tmp = it.get(i);
-
-                    for (SipCall call : tmp.getParticipants()) {
-                        if (call.getCallId().contentEquals(callID)) {
-                            mService.mHistoryManager.insertNewEntry(call);
-                            mService.getConferences().get(tmp.getId()).removeParticipant(call.getCallId());
-                            found = true;
+                Iterator<Map.Entry<String, Conference>> it = mService.getConferences().entrySet().iterator();
+                while (it.hasNext()) {
+                    Conference tmp = it.next().getValue();
+                    for (SipCall c : tmp.getParticipants()) {
+                        if (c.getCallId().contentEquals(callID)) {
+                            mService.mHistoryManager.insertNewEntry(c);
+                            mService.getConferences().get(tmp.getId()).removeParticipant(c);
+                            break;
                         }
                     }
-                    ++i;
                 }
             }
 
@@ -200,7 +196,7 @@
                     for (SipCall c : tmp.getParticipants()) {
                         if (c.getCallId().contentEquals(all_participants.get(i))) {
                             created.addParticipant(c);
-                            mService.getConferences().get(tmp.getId()).removeParticipant(c.getCallId());
+                            mService.getConferences().get(tmp.getId()).removeParticipant(c);
                         }
                     }
                 }
@@ -279,10 +275,10 @@
                 }
             }
         } else if (toModify.getParticipants().size() > newParticipants.size()) {
-
+            Log.i(TAG, "toModify.getParticipants().size() > newParticipants.size()");
             for (SipCall participant : toModify.getParticipants()) {
                 if (!newParticipants.contains(participant.getCallId())) {
-                    mService.removeCallFromConference(toModify.getId(), participant.getCallId());
+                    mService.detachCallFromConference(toModify.getId(), participant);
                 }
             }
         }
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index c5de94d..3bee57a 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -86,16 +86,18 @@
     public void addCallToConference(String confId, String callId) {
         if(mConferences.get(callId) != null){
             // We add a simple call to a conference
+            Log.i(TAG, "// We add a simple call to a conference");
             mConferences.get(confId).addParticipant(mConferences.get(callId).getParticipants().get(0));
             mConferences.remove(callId);
         } else {
+            Log.i(TAG, "addCallToConference");
             Iterator<Map.Entry<String, Conference>> it = mConferences.entrySet().iterator();
             while (it.hasNext()) {
                 Conference tmp = it.next().getValue();
                 for (SipCall c : tmp.getParticipants()) {
                     if (c.getCallId().contentEquals(callId)) {
                         mConferences.get(confId).addParticipant(c);
-                        mConferences.get(tmp.getId()).removeParticipant(c.getCallId());
+                        mConferences.get(tmp.getId()).removeParticipant(c);
                     }
                 }
             }
@@ -103,10 +105,11 @@
 
     }
 
-    public void removeCallFromConference(String confId, String callId) {
-        SipCall call = mConferences.get(confId).getCallById(callId);
+    public void detachCallFromConference(String confId, SipCall call) {
+        Log.i(TAG, "detachCallFromConference");
         Conference separate = new Conference(call);
         mConferences.put(separate.getId(), separate);
+        mConferences.get(confId).removeParticipant(call);
     }
 
 
