diff --git a/src/org/sflphone/service/CallManagerCallBack.java b/src/org/sflphone/service/CallManagerCallBack.java
index 8126c8b..5ba0d67 100644
--- a/src/org/sflphone/service/CallManagerCallBack.java
+++ b/src/org/sflphone/service/CallManagerCallBack.java
@@ -2,22 +2,20 @@
 
 import android.content.Intent;
 import android.os.Bundle;
-import android.os.RemoteException;
 import android.support.v4.content.LocalBroadcastManager;
 import android.util.Log;
 import org.sflphone.client.CallActivity;
 import org.sflphone.model.*;
+import org.sflphone.utils.SwigNativeConverter;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
 public class CallManagerCallBack extends Callback {
-    
+
     private static final String TAG = "CallManagerCallBack";
-    private final ISipService.Stub mBinder;
-    private  SipService mService;
+    private SipService mService;
 
     static public final String CALL_STATE_CHANGED = "call-state-changed";
     static public final String INCOMING_CALL = "incoming-call";
@@ -28,14 +26,13 @@
     static public final String RECORD_STATE_CHANGED = "record_state";
 
 
-    public CallManagerCallBack(SipService context, ISipService.Stub bind) {
+    public CallManagerCallBack(SipService context) {
         mService = context;
-        mBinder = bind;
     }
 
     @Override
     public void on_call_state_changed(String callID, String newState) {
-       Log.d(TAG, "on_call_state_changed : (" + callID + ", " + newState + ")");
+        Log.d(TAG, "on_call_state_changed : (" + callID + ", " + newState + ")");
         Bundle bundle = new Bundle();
         bundle.putString("CallID", callID);
         bundle.putString("State", newState);
@@ -52,23 +49,23 @@
 
 
         if (newState.equals("INCOMING")) {
-            mService.getCurrentCalls().get(callID).setCallState(SipCall.state.CALL_STATE_INCOMING);
+            mService.getCurrentConfs().get(callID).setCallState(callID, SipCall.state.CALL_STATE_INCOMING);
         } else if (newState.equals("RINGING")) {
             try {
-                mService.getCurrentCalls().get(callID).setCallState(SipCall.state.CALL_STATE_RINGING);
+                mService.getCurrentConfs().get(callID).setCallState(callID, SipCall.state.CALL_STATE_RINGING);
             } catch (NullPointerException e) {
-                if (mService.getCurrentCalls() == null) {
+                if (mService.getCurrentConfs() == null) {
                     return;
                 }
-                if (mService.getCurrentCalls().get(callID) == null) {
+                if (mService.getCurrentConfs().get(callID) == null) {
                     Log.e(TAG, "call for " + callID + " is null");
                     return;
                 }
             }
 
         } else if (newState.equals("CURRENT")) {
-            if (mService.getCurrentCalls().get(callID) != null) {
-                mService.getCurrentCalls().get(callID).setCallState(SipCall.state.CALL_STATE_CURRENT);
+            if (mService.getCurrentConfs().get(callID) != null) {
+                mService.getCurrentConfs().get(callID).setCallState(callID, SipCall.state.CALL_STATE_CURRENT);
             } else {
                 // Check if call is in a conference
                 Iterator<Map.Entry<String, Conference>> it = mService.getCurrentConfs().entrySet().iterator();
@@ -84,11 +81,11 @@
         } else if (newState.equals("HUNGUP")) {
 
             Log.d(TAG, "Hanging up " + callID);
-            if (mService.getCurrentCalls().get(callID) != null) {
-                if (mService.getCurrentCalls().get(callID).isRinging()
-                        && mService.getCurrentCalls().get(callID).isIncoming())
-                    mService.notificationManager.publishMissedCallNotification(mService.getCurrentCalls().get(callID));
-                mService.getCurrentCalls().remove(callID);
+            if (mService.getCurrentConfs().get(callID) != null) {
+                if (mService.getCurrentConfs().get(callID).isRinging()
+                        && mService.getCurrentConfs().get(callID).isIncoming())
+                    mService.notificationManager.publishMissedCallNotification(mService.getCurrentConfs().get(callID));
+                mService.getCurrentConfs().remove(callID);
             } else {
                 ArrayList<Conference> it = new ArrayList<Conference>(mService.getCurrentConfs().values());
 
@@ -109,15 +106,13 @@
                 }
             }
 
-            mService.sendBroadcast(intent);
-
         } else if (newState.equals("BUSY")) {
-            mService.getCurrentCalls().remove(callID);
+            mService.getCurrentConfs().remove(callID);
         } else if (newState.equals("FAILURE")) {
-            mService.getCurrentCalls().remove(callID);
+            mService.getCurrentConfs().remove(callID);
         } else if (newState.equals("HOLD")) {
-            if (mService.getCurrentCalls().get(callID) != null) {
-                mService.getCurrentCalls().get(callID).setCallState(SipCall.state.CALL_STATE_HOLD);
+            if (mService.getCurrentConfs().get(callID) != null) {
+                mService.getCurrentConfs().get(callID).setCallState(callID, SipCall.state.CALL_STATE_HOLD);
             } else {
                 // Check if call is in a conference
                 Iterator<Map.Entry<String, Conference>> it = mService.getCurrentConfs().entrySet().iterator();
@@ -131,8 +126,8 @@
             }
         } else if (newState.equals("UNHOLD")) {
 
-            if (mService.getCurrentCalls().get(callID) != null) {
-                mService.getCurrentCalls().get(callID).setCallState(SipCall.state.CALL_STATE_CURRENT);
+            if (mService.getCurrentConfs().get(callID) != null) {
+                mService.getCurrentConfs().get(callID).setCallState(callID, SipCall.state.CALL_STATE_CURRENT);
             } else {
                 // Check if call is in a conference
                 Iterator<Map.Entry<String, Conference>> it = mService.getCurrentConfs().entrySet().iterator();
@@ -145,7 +140,7 @@
                 }
             }
         } else {
-            mService.getCurrentCalls().get(callID).setCallState(SipCall.state.CALL_STATE_NONE);
+            mService.getCurrentConfs().get(callID).setCallState(callID, SipCall.state.CALL_STATE_NONE);
         }
 
 
@@ -160,10 +155,9 @@
 
         SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
         try {
-            HashMap<String, String> details = (HashMap<String, String>) mBinder.getAccountDetails(accountID);
-            ArrayList<HashMap<String, String>> credentials = (ArrayList<HashMap<String, String>>) mBinder
-                    .getCredentials(accountID);
-            Account acc = new Account(accountID, details, credentials);
+            StringMap details = mService.getConfigurationManagerJNI().getAccountDetails(accountID);
+            VectMap credentials = mService.getConfigurationManagerJNI().getCredentials(accountID);
+            Account acc = new Account(accountID, SwigNativeConverter.convertAccountToNative(details), SwigNativeConverter.convertCredentialsToNative(credentials));
             callBuilder.startCallCreation(callID).setAccount(acc).setCallState(SipCall.state.CALL_STATE_RINGING)
                     .setCallType(SipCall.state.CALL_TYPE_INCOMING);
             callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(from));
@@ -174,99 +168,116 @@
 
             SipCall newCall = callBuilder.build();
             toSend.putExtra("newcall", newCall);
-            HashMap<String, String> callDetails = (HashMap<String, String>) mBinder.getCallDetails(callID);
+            StringMap callDetails = mService.getCallManagerJNI().getCallDetails(callID);
 
             newCall.setTimestamp_start(Long.parseLong(callDetails.get(ServiceConstants.call.TIMESTAMP_START)));
-            mService.getCurrentCalls().put(newCall.getCallId(), newCall);
+
+            Conference toAdd = new Conference(newCall);
+
+            mService.getCurrentConfs().put(toAdd.getId(), toAdd);
 
             Bundle bundle = new Bundle();
-            Conference tmp = new Conference("-1");
 
-            tmp.getParticipants().add(newCall);
-
-            bundle.putParcelable("conference", tmp);
+            bundle.putParcelable("conference", toAdd);
             toSend.putExtra("resuming", false);
             toSend.putExtras(bundle);
             mService.startActivity(toSend);
             mService.mediaManager.startRing("");
             mService.mediaManager.obtainAudioFocus(true);
-        } catch (RemoteException e1) {
-            e1.printStackTrace();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
-    
+
     @Override
-    public void on_transfer_state_changed(String result){
-        Log.w(TAG,"TRANSFER STATE CHANGED:"+result);
+    public void on_transfer_state_changed(String result) {
+        Log.w(TAG, "TRANSFER STATE CHANGED:" + result);
     }
-    
+
     @Override
-    public void on_conference_created(String confID){
-        Log.w(TAG,"CONFERENCE CREATED:"+confID);
+    public void on_conference_created(final String confID) {
+        Log.w(TAG, "CONFERENCE CREATED:" + confID);
         Intent intent = new Intent(CONF_CREATED);
         Conference created = new Conference(confID);
 
-        try {
-            ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
-            for (String participant : all_participants) {
-                created.getParticipants().add(mService.getCurrentCalls().get(participant));
-                mService.getCurrentCalls().remove(participant);
+        StringVect all_participants = mService.getCallManagerJNI().getParticipantList(confID);
+        Log.w(TAG, "all_participants:" + all_participants.size());
+        for (int i = 0; i < all_participants.size(); ++i) {
+            if (mService.getCurrentConfs().get(all_participants.get(i)) != null) {
+                created.addParticipant(mService.getCurrentConfs().get(all_participants.get(i)).getCallById(all_participants.get(i)));
+                mService.getCurrentConfs().remove(all_participants.get(i));
+            } else {
+                Iterator<Map.Entry<String, Conference>> it = mService.getCurrentConfs().entrySet().iterator();
+                while (it.hasNext()) {
+                    Conference tmp = it.next().getValue();
+                    for (SipCall c : tmp.getParticipants()) {
+                        if (c.getCallId().contentEquals(all_participants.get(i))) {
+                            created.addParticipant(c);
+                            mService.getCurrentConfs().get(tmp.getId()).removeParticipant(c.getCallId());
+                        }
+                    }
+                }
             }
-            intent.putExtra("newconf", created);
-            mService.getCurrentConfs().put(confID, created);
-            mService.sendBroadcast(intent);
-        } catch (RemoteException e1) {
-            e1.printStackTrace();
         }
-        Log.i(TAG, "current_confs size " + mService.getCurrentConfs().size());
+        intent.putExtra("newconf", created);
+        mService.getCurrentConfs().put(created.getId(), created);
+        mService.sendBroadcast(intent);
     }
-    
+
     @Override
-    public void on_incoming_message(String ID, String from, String msg){
-        Log.w(TAG,"on_incoming_message:"+msg);
+    public void on_incoming_message(String ID, String from, String msg) {
+        Log.w(TAG, "on_incoming_message:" + msg);
         Bundle bundle = new Bundle();
 
         bundle.putString("CallID", ID);
         bundle.putString("From", from);
         bundle.putString("Msg", msg);
-        Intent intent = new Intent(INCOMING_TEXT); 
+        Intent intent = new Intent(INCOMING_TEXT);
         intent.putExtra("com.savoirfairelinux.sflphone.service.newtext", bundle);
 
 
-        if (mService.getCurrentCalls().get(ID) != null) {
-            mService.getCurrentCalls().get(ID).addSipMessage(new SipMessage(true, msg));
-        } else if (mService.getCurrentConfs().get(ID) != null) {
+        if (mService.getCurrentConfs().get(ID) != null) {
             mService.getCurrentConfs().get(ID).addSipMessage(new SipMessage(true, msg));
-        } else
-            return;
+        } else {
+            Iterator<Map.Entry<String, Conference>> it = mService.getCurrentConfs().entrySet().iterator();
+            while (it.hasNext()) {
+                Conference tmp = it.next().getValue();
+                for (SipCall c : tmp.getParticipants()) {
+                    if (c.getCallId().contentEquals(ID)) {
+                        mService.getCurrentConfs().get(tmp.getId()).addSipMessage(new SipMessage(true, msg));
+                    }
+                }
+            }
+
+        }
 
         mService.sendBroadcast(intent);
     }
-    
+
     @Override
-    public void on_conference_removed(String confID){
+    public void on_conference_removed(String confID) {
         Intent intent = new Intent(CONF_REMOVED);
         intent.putExtra("confID", confID);
 
-        Conference toDestroy = mService.getCurrentConfs().get(confID);
-        for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
+        Conference toReInsert = mService.getCurrentConfs().get(confID);
+        /*for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
             mService.getCurrentCalls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
-        }
+        }*/
         mService.getCurrentConfs().remove(confID);
+        mService.getCurrentConfs().put(toReInsert.getId(), toReInsert);
         mService.sendBroadcast(intent);
 
     }
-    
+
     @Override
-    public void on_conference_state_changed(String confID, String state){
+    public void on_conference_state_changed(String confID, String state) {
+
         Intent intent = new Intent(CONF_CHANGED);
         intent.putExtra("confID", confID);
         intent.putExtra("State", state);
         ArrayList<String> all_participants;
 
-        try {
+/*        try {
             all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
             for (String participant : all_participants) {
                 if (mService.getCurrentConfs().get(confID).getParticipants().size() < all_participants.size()
@@ -281,17 +292,17 @@
             }
         } catch (RemoteException e) {
             e.printStackTrace();
-        }
+        }*/
 
         Log.i(TAG, "Received" + intent.getAction());
         if (mService.getCurrentConfs().get(confID) != null) {
-            mService.getCurrentConfs().get(confID).setState(intent.getStringExtra("State"));
+            mService.getCurrentConfs().get(confID).setCallState(confID, state);
             mService.sendBroadcast(intent);
         }
     }
-    
+
     @Override
-    public void on_record_playback_filepath(String id, String filename){
+    public void on_record_playback_filepath(String id, String filename) {
         Intent intent = new Intent(RECORD_STATE_CHANGED);
         intent.putExtra("id", id);
         intent.putExtra("file", filename);
diff --git a/src/org/sflphone/service/ConfigurationManagerCallback.java b/src/org/sflphone/service/ConfigurationManagerCallback.java
index 0a02925..32c2e9c 100644
--- a/src/org/sflphone/service/ConfigurationManagerCallback.java
+++ b/src/org/sflphone/service/ConfigurationManagerCallback.java
@@ -22,21 +22,17 @@
  */
 package org.sflphone.service;
 
-import android.content.Context;
 import android.content.Intent;
-import android.support.v4.content.LocalBroadcastManager;
 
 public class ConfigurationManagerCallback extends ConfigurationCallback {
 //    private static final String TAG = "ConfigurationManagerCallback";
-private final ISipService.Stub mBinder;
     private  SipService mService;
 
     static public final String ACCOUNTS_CHANGED = "accounts-changed";
     static public final String ACCOUNT_STATE_CHANGED = "account-state-changed";
 
-    public ConfigurationManagerCallback(SipService context, ISipService.Stub bind) {
+    public ConfigurationManagerCallback(SipService context) {
         mService = context;
-        mBinder = bind;
     }
 
     @Override
diff --git a/src/org/sflphone/service/ISipService.aidl b/src/org/sflphone/service/ISipService.aidl
index c4c5e18..cb8b64c 100644
--- a/src/org/sflphone/service/ISipService.aidl
+++ b/src/org/sflphone/service/ISipService.aidl
@@ -74,16 +74,13 @@
     void unholdConference(in String confID);
     boolean isConferenceParticipant(in String callID);
     Map getConferenceList();
-    Map getCallList();
     List getParticipantList(in String confID);
     String getConferenceId(in String callID);
     String getConferenceDetails(in String callID);
     
     Conference getCurrentCall();
     List getConcurrentCalls();
-    
-    
-    /*   */
-    
-    SipCall getCall(String callID);
+
+    Conference getConference(in String id);
+
 }
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index c76ad97..bfc6ac2 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -49,7 +49,6 @@
 import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteException;
-import android.support.v4.content.LocalBroadcastManager;
 import android.util.Log;
 
 public class SipService extends Service {
@@ -57,9 +56,19 @@
     static final String TAG = "SipService";
     private SipServiceExecutor mExecutor;
     private static HandlerThread executorThread;
+
+    public CallManager getCallManagerJNI() {
+        return callManagerJNI;
+    }
+
     private CallManager callManagerJNI;
     private ManagerImpl managerImpl;
     private CallManagerCallBack callManagerCallBack;
+
+    public ConfigurationManager getConfigurationManagerJNI() {
+        return configurationManagerJNI;
+    }
+
     private ConfigurationManager configurationManagerJNI;
     private ConfigurationManagerCallback configurationManagerCallback;
     private boolean isPjSipStackStarted = false;
@@ -67,16 +76,16 @@
     public SipNotifications notificationManager;
     public MediaManager mediaManager;
 
-    private HashMap<String, SipCall> current_calls = new HashMap<String, SipCall>();
+    /*private HashMap<String, SipCall> current_calls = new HashMap<String, SipCall>();*/
     private HashMap<String, Conference> current_confs = new HashMap<String, Conference>();
 
     public HashMap<String, Conference> getCurrentConfs() {
         return current_confs;
     }
 
-    public HashMap<String, SipCall> getCurrentCalls() {
+    /*public HashMap<String, SipCall> getCurrentCalls() {
         return current_calls;
-    }
+    }*/
 
     @Override
     public boolean onUnbind(Intent i) {
@@ -144,28 +153,27 @@
     public SipServiceExecutor getExecutor() {
         // create mExecutor lazily
         if (mExecutor == null) {
-            mExecutor = new SipServiceExecutor(this);
+            mExecutor = new SipServiceExecutor();
         }
         return mExecutor;
     }
 
     // Executes immediate tasks in a single executorThread.
     public static class SipServiceExecutor extends Handler {
-        WeakReference<SipService> handlerService;
 
-        SipServiceExecutor(SipService s) {
+        SipServiceExecutor() {
             super(createLooper());
-            handlerService = new WeakReference<SipService>(s);
         }
 
         public void execute(Runnable task) {
             // TODO: add wakelock
-            Message.obtain(this, 0/* don't care */, task).sendToTarget();
+            Message.obtain(SipServiceExecutor.this, 0/* don't care */, task).sendToTarget();
             Log.w(TAG, "SenT!");
         }
 
         @Override
         public void handleMessage(Message msg) {
+            Log.w(TAG, "handleMessage");
             if (msg.obj instanceof Runnable) {
                 executeInternal((Runnable) msg.obj);
             } else {
@@ -216,11 +224,11 @@
         // managerImpl.setPath(getApplication().getFilesDir().getAbsolutePath());
 
         callManagerJNI = new CallManager();
-        callManagerCallBack = new CallManagerCallBack(this, mBinder);
+        callManagerCallBack = new CallManagerCallBack(this);
         SFLPhoneservice.setCallbackObject(callManagerCallBack);
 
         configurationManagerJNI = new ConfigurationManager();
-        configurationManagerCallback = new ConfigurationManagerCallback(this, mBinder);
+        configurationManagerCallback = new ConfigurationManagerCallback(this);
         SFLPhoneservice.setConfigurationCallbackObject(configurationManagerCallback);
         managerImpl.init("");
 
@@ -255,7 +263,7 @@
         Object obj = null;
         boolean done = false;
 
-        protected abstract Object doRun() throws SameThreadException;
+        protected abstract Object doRun() throws SameThreadException, RemoteException;
 
         public Object getVal() {
             return obj;
@@ -273,6 +281,8 @@
                 done = true;
             } catch (SameThreadException e) {
                 Log.e(TAG, "Not done from same thread");
+            } catch (RemoteException e) {
+                Log.e(TAG, e.toString());
             }
         }
     }
@@ -311,7 +321,8 @@
                     HashMap<String, String> details = SwigNativeConverter.convertCallDetailsToNative(callManagerJNI.getCallDetails(call.getCallId()));
                     // watchout timestamp stored by sflphone is in seconds
                     call.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
-                    getCurrentCalls().put(call.getCallId(), call);
+                    Conference toAdd = new Conference(call);
+                    current_confs.put(toAdd.getId(), toAdd);
                     mediaManager.obtainAudioFocus(false);
                 }
             });
@@ -647,7 +658,7 @@
                     // Generate a CONF_CREATED callback
                 }
             });
-
+            Log.i(TAG, "After joining participants");
         }
 
         @Override
@@ -688,7 +699,8 @@
                         Conference tmp = it.next().getValue();
                         Log.i(TAG, "conf has " + tmp.getParticipants().size() + " participants");
                         if (tmp.contains(callID)) {
-                            current_calls.put(callID, tmp.getCall(callID));
+                            Conference toDetach = new Conference(tmp.getCallById(callID));
+                            current_confs.put(toDetach.getId(), toDetach);
                             Log.i(TAG, "Call found and put in current_calls");
                         }
                     }
@@ -796,7 +808,7 @@
             class PartList extends SipRunnableWithReturn {
                 @Override
                 protected StringVect doRun() throws SameThreadException {
-                    Log.i(TAG, "SipService.getAccountList() thread running...");
+                    Log.i(TAG, "SipService.getParticipantList() thread running...");
                     return callManagerJNI.getParticipantList(confID);
                 }
             }
@@ -804,10 +816,10 @@
             PartList runInstance = new PartList();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                // Log.w(TAG, "Waiting for getConferenceList");
+                Log.w(TAG, "getParticipantList");
             }
             StringVect swigvect = (StringVect) runInstance.getVal();
-
+            Log.w(TAG, "After that");
             ArrayList<String> nativelist = new ArrayList<String>();
 
             for (int i = 0; i < swigvect.size(); i++)
@@ -873,17 +885,14 @@
                     Log.i(TAG, "SipService.toggleRecordingCall() thread running...");
                     boolean result = callManagerJNI.toggleRecording(id);
 
-                    if (getCurrentCalls().containsKey(id)) {
-                        getCurrentCalls().get(id).setRecording(result);
-                    } else if (getCurrentConfs().containsKey(id)) {
+                    if (getCurrentConfs().containsKey(id)) {
                         getCurrentConfs().get(id).setRecording(result);
                     } else {
-                        // A call in a conference has been put on hold
                         Iterator<Conference> it = getCurrentConfs().values().iterator();
                         while (it.hasNext()) {
                             Conference c = it.next();
-                            if (c.getCall(id) != null)
-                                c.getCall(id).setRecording(result);
+                            if (c.getCallById(id) != null)
+                                c.getCallById(id).setRecording(result);
                         }
                     }
                     return result;
@@ -940,9 +949,7 @@
                 protected void doRun() throws SameThreadException, RemoteException {
                     Log.i(TAG, "SipService.sendTextMessage() thread running...");
                     callManagerJNI.sendTextMessage(callID, message.comment);
-                    if (getCurrentCalls().get(callID) != null)
-                        getCurrentCalls().get(callID).addSipMessage(message);
-                    else if (getCurrentConfs().get(callID) != null)
+                    if (getCurrentConfs().get(callID) != null)
                         getCurrentConfs().get(callID).addSipMessage(message);
                 }
             });
@@ -964,10 +971,6 @@
                         results.add(new Codec(active_payloads.get(i), configurationManagerJNI.getAudioCodecDetails(active_payloads.get(i)), true));
 
                     }
-
-                    // if (results.get(active_payloads.get(i)) != null) {
-                    // results.get(active_payloads.get(i)).setEnabled(true);
-
                     IntVect payloads = configurationManagerJNI.getAudioCodecList();
 
                     for (int i = 0; i < payloads.size(); ++i) {
@@ -984,11 +987,6 @@
 
                     }
 
-                    // if (!results.containsKey(payloads.get(i))) {
-                    // results.put(payloads.get(i), new Codec(payloads.get(i), configurationManagerJNI.getAudioCodecDetails(payloads.get(i)), false));
-                    // Log.i(TAG, "Other, Adding:" + results.get((payloads.get(i))).getName());
-                    // }
-
                     return results;
                 }
             }
@@ -1040,84 +1038,46 @@
             });
         }
 
-        @Override
-        public HashMap<String, SipCall> getCallList() throws RemoteException {
-            // class CallList extends SipRunnableWithReturn {
-            //
-            // @Override
-            // protected StringVect doRun() throws SameThreadException {
-            // Log.i(TAG, "SipService.getCallList() thread running...incoming");
-            // return callManagerJNI.getCallList();
-            // }
-            // }
-            //
-            // CallList runInstance = new CallList();
-            // getExecutor().execute(runInstance);
-            // while (!runInstance.isDone()) {
-            // Log.w(TAG, "Waiting for getAudioCodecList");
-            // }
-            // StringVect swigmap = (StringVect) runInstance.getVal();
-            //
-            // ArrayList<String> nativemap = new ArrayList<String>();
-            // for (int i = 0; i < swigmap.size(); ++i) {
-            //
-            // String t = swigmap.get(i);
-            // nativemap.add(t);
-            // }
-            // if(callManagerJNI == null)
-            // return new HashMap<String, SipCall>();
-            //
-            //
-            // HashMap<String, SipCall> results = new HashMap<String, SipCall>();
-            // StringVect calls = callManagerJNI.getCallList();
-            // for(int i = 0 ; i < calls.size(); ++i){
-            // results.put(calls.get(i), new SipCall(calls.get(i), callManagerJNI.getCallDetails(calls.get(i))));
-            // }
-
-            return getCurrentCalls();
-        }
-
-        @Override
-        public SipCall getCall(String callID) throws RemoteException {
-            return getCurrentCalls().get(callID);
-        }
+/*        @Override
+        public Conference getCallById(String callID) throws RemoteException {
+            if(current_confs.containsKey(callID))
+                return current_confs.get(callID);
+            else{
+                Iterator<Conference> it = getCurrentConfs().values().iterator();
+                while (it.hasNext()) {
+                    Conference c = it.next();
+                    if (c.getCallById(callID) != null)
+                        return c;
+                }
+            }
+            return null;
+        }*/
 
         /***********************
          * Notification API
          ***********************/
         @Override
         public void createNotification() throws RemoteException {
-            notificationManager.makeNotification(getCurrentCalls());
 
         }
 
         @Override
         public void destroyNotification() throws RemoteException {
-            notificationManager.removeNotification();
 
         }
 
         @Override
         public Conference getCurrentCall() throws RemoteException {
-            for (SipCall i : current_calls.values()) {
-
-                // Incoming >> Ongoing
-                if (i.isIncoming()) {
-                    Conference tmp = new Conference("-1");
-                    tmp.getParticipants().add(i);
-                    return tmp;
-                }
-
-                if (i.isOngoing()) {
-                    Conference tmp = new Conference("-1");
-                    tmp.getParticipants().add(i);
-                    return tmp;
-                }
+            for (Conference conf : current_confs.values()) {
+                if (conf.isIncoming())
+                    return conf;
             }
 
-            if (!current_confs.isEmpty()) {
-                return (Conference) current_confs.values().toArray()[0];
+            for (Conference conf : current_confs.values()) {
+                if (conf.isOnGoing())
+                    return conf;
             }
+
             return null;
         }
 
@@ -1134,19 +1094,12 @@
 
         @Override
         public List getConcurrentCalls() throws RemoteException {
-            ArrayList<Conference> toReturn = new ArrayList<Conference>();
+            return new ArrayList(current_confs.values());
+        }
 
-            for (SipCall sip : current_calls.values()) {
-                if (!sip.isCurrent()) {
-                    Conference tmp = new Conference("-1");
-                    tmp.getParticipants().add(sip);
-                    toReturn.add(tmp);
-                }
-            }
-
-            Log.i(TAG, "toReturn SIZE " + toReturn.size());
-
-            return toReturn;
+        @Override
+        public Conference getConference(String id) throws RemoteException {
+            return current_confs.get(id);
         }
 
         @Override
