* #38606: client now handles only Conferences

Every call is considered has a Conference, holding one or several SipCall.
This simplify extraction and storage of calls in history. It also provide a unique interface
to handle calls instead of two (which were SipCall and Conference).
diff --git a/src/org/sflphone/client/HomeActivity.java b/src/org/sflphone/client/HomeActivity.java
index 7abceb5..47ab996 100644
--- a/src/org/sflphone/client/HomeActivity.java
+++ b/src/org/sflphone/client/HomeActivity.java
@@ -90,7 +90,7 @@
 import android.widget.Toast;
 
 public class HomeActivity extends FragmentActivity implements DialingFragment.Callbacks, AccountsManagementFragment.Callbacks,
-        ContactListFragment.Callbacks, CallListFragment.Callbacks, HistoryFragment.Callbacks, CallInterface, MenuFragment.Callbacks {
+        ContactListFragment.Callbacks, CallListFragment.Callbacks, HistoryFragment.Callbacks, MenuFragment.Callbacks {
 
     static final String TAG = HomeActivity.class.getSimpleName();
 
@@ -107,7 +107,6 @@
     private DrawerLayout mNavigationDrawer;
     private ActionBarDrawerToggle mDrawerToggle;
 
-    CallReceiver callReceiver;
     private boolean isClosing = false;
     private Timer t = new Timer();
 
@@ -125,7 +124,6 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        callReceiver = new CallReceiver(this);
 
         setContentView(R.layout.activity_home);
 
@@ -300,12 +298,6 @@
     @Override
     protected void onResume() {
         super.onResume();
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
-        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
-        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
-        registerReceiver(callReceiver, intentFilter);
-
     }
 
     @Override
@@ -356,7 +348,7 @@
     @Override
     protected void onPause() {
         super.onPause();
-        unregisterReceiver(callReceiver);
+
         if (mBound) {
             unbindService(mConnection);
             mBound = false;
@@ -456,36 +448,6 @@
         return service;
     }
 
-    /**
-     * Interface implemented to handle incoming events
-     */
-    @Override
-    public void incomingCall(Intent call) {
-        SipCall infos = call.getParcelableExtra("newcall");
-
-        launchCallActivity(infos);
-
-    }
-
-    @Override
-    public void callStateChanged(Intent callState) {
-        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
-        String cID = b.getString("CallID");
-        String state = b.getString("State");
-        Log.i(TAG, "callStateChanged" + cID + "    " + state);
-        // mSectionsPagerAdapter.updateHome();
-
-    }
-
-    @Override
-    public void incomingText(Intent msg) {
-        Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-        b.getString("CallID");
-        String from = b.getString("From");
-        String mess = b.getString("Msg");
-        Toast.makeText(getApplicationContext(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
-    }
-
     @Override
     public void onTextContact(final CallContact c) {
         // TODO
@@ -641,30 +603,6 @@
     }
 
     @Override
-    public void confCreated(Intent intent) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void confRemoved(Intent intent) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void confChanged(Intent intent) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void recordingChanged(Intent intent) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
     public void selectedCall(Conference c) {
         Intent intent = new Intent().setClass(this, CallActivity.class);
         intent.putExtra("resuming", true);
diff --git a/src/org/sflphone/fragments/CallFragment.java b/src/org/sflphone/fragments/CallFragment.java
index 0a098f6..60f33a7 100644
--- a/src/org/sflphone/fragments/CallFragment.java
+++ b/src/org/sflphone/fragments/CallFragment.java
@@ -511,7 +511,7 @@
                 }
                 try {
                     if (conf.getParticipants().get(0).isOutGoing()
-                            && mCallbacks.getService().getCall(conf.getParticipants().get(0).getCallId()) == null) {
+                            && mCallbacks.getService().getConference(conf.getId()) == null) {
                         mCallbacks.getService().placeCall(conf.getParticipants().get(0));
                         initOutGoingCallDisplay();
                     } else if (conf.getParticipants().get(0).isOutGoing() && conf.getParticipants().get(0).isRinging()) {
diff --git a/src/org/sflphone/fragments/CallListFragment.java b/src/org/sflphone/fragments/CallListFragment.java
index 7bfa23f..1264e54 100644
--- a/src/org/sflphone/fragments/CallListFragment.java
+++ b/src/org/sflphone/fragments/CallListFragment.java
@@ -35,10 +35,13 @@
 import java.util.Observable;
 import java.util.Observer;
 
+import android.content.IntentFilter;
 import org.sflphone.R;
+import org.sflphone.interfaces.CallInterface;
 import org.sflphone.model.CallTimer;
 import org.sflphone.model.Conference;
-import org.sflphone.model.SipCall;
+import org.sflphone.receivers.CallReceiver;
+import org.sflphone.service.CallManagerCallBack;
 import org.sflphone.service.ISipService;
 
 import android.app.Activity;
@@ -68,13 +71,14 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-public class CallListFragment extends Fragment {
+public class CallListFragment extends Fragment implements CallInterface{
     private static final String TAG = CallListFragment.class.getSimpleName();
 
     private Callbacks mCallbacks = sDummyCallbacks;
     private TextView nb_calls, nb_confs;
     CallListAdapter confs_adapter, calls_adapter;
     CallTimer timer;
+    CallReceiver callReceiver;
 
     public static final int REQUEST_TRANSFER = 10;
     public static final int REQUEST_CONF = 20;
@@ -95,9 +99,59 @@
         }
     };
 
+    @Override
+    public void incomingCall(Intent call) {
+
+    }
+
+    @Override
+    public void callStateChanged(Intent callState) {
+        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
+        String cID = b.getString("CallID");
+        String state = b.getString("State");
+        Log.i(TAG, "callStateChanged" + cID + "    " + state);
+        try {
+            updateLists();
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void incomingText(Intent msg) {
+        Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
+        b.getString("CallID");
+        String from = b.getString("From");
+        String mess = b.getString("Msg");
+        Toast.makeText(getActivity(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
+    }
+
+    @Override
+    public void confCreated(Intent intent) {
+        try {
+            updateLists();
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void confRemoved(Intent intent) {
+
+    }
+
+    @Override
+    public void confChanged(Intent intent) {
+
+    }
+
+    @Override
+    public void recordingChanged(Intent intent) {
+
+    }
+
     /**
      * The Activity calling this fragment has to implement this interface
-     * 
      */
     public interface Callbacks {
 
@@ -138,6 +192,11 @@
     @Override
     public void onResume() {
         super.onResume();
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
+        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
+        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
+        getActivity().registerReceiver(callReceiver, intentFilter);
         if (mCallbacks.getService() != null) {
             try {
                 updateLists();
@@ -155,34 +214,30 @@
     @SuppressWarnings("unchecked")
     // No proper solution with HashMap runtime cast
     public void updateLists() throws RemoteException {
-        HashMap<String, SipCall> calls = (HashMap<String, SipCall>) mCallbacks.getService().getCallList();
         HashMap<String, Conference> confs = (HashMap<String, Conference>) mCallbacks.getService().getConferenceList();
-
-        updateCallList(calls);
-        updateConferenceList(confs);
+        Log.i(TAG, "There are " + confs.size());
+        sortConferences(confs);
     }
 
-    private void updateConferenceList(HashMap<String, Conference> confs) {
-        nb_confs.setText("" + confs.size());
-        confs_adapter.updateDataset(new ArrayList<Conference>(confs.values()));
-    }
+    private void sortConferences(HashMap<String, Conference> conferences) {
 
-    private void updateCallList(HashMap<String, SipCall> calls) {
-        nb_calls.setText("" + calls.size());
-        ArrayList<Conference> conferences = new ArrayList<Conference>();
-        for (SipCall call : calls.values()) {
-            Conference confOne = new Conference("-1");
-            confOne.getParticipants().add(call);
-            conferences.add(confOne);
+        ArrayList<Conference> multiConfs = new ArrayList<Conference>();
+        ArrayList<Conference> oneToOneConfs = new ArrayList<Conference>();
+        for (Conference conf : conferences.values()) {
+            if (conf.hasMultipleParticipants())
+                multiConfs.add(conf);
+            else
+                oneToOneConfs.add(conf);
         }
 
-        calls_adapter.updateDataset(conferences);
-
+        nb_confs.setText("" + multiConfs.size());
+        nb_calls.setText("" + oneToOneConfs.size());
+        confs_adapter.updateDataset(new ArrayList<Conference>(multiConfs));
+        calls_adapter.updateDataset(oneToOneConfs);
     }
 
     @Override
     public void onDetach() {
-
         super.onDetach();
         mCallbacks = sDummyCallbacks;
 
@@ -191,26 +246,19 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        callReceiver = new CallReceiver(this);
     }
 
     @Override
     public void onPause() {
         super.onPause();
         mHandler.removeCallbacks(mUpdateTimeTask);
+        getActivity().unregisterReceiver(callReceiver);
     }
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
-
         super.onActivityCreated(savedInstanceState);
-
-        // Give some text to display if there is no data. In a real
-        // application this would come from a resource.
-        // setEmptyText("No phone numbers");
-
-        // We have a menu item to show in action bar.
-        setHasOptionsMenu(true);
-
     }
 
     @Override
@@ -345,51 +393,51 @@
         @Override
         public boolean onDrag(View v, DragEvent event) {
             switch (event.getAction()) {
-            case DragEvent.ACTION_DRAG_STARTED:
-                // Do nothing
-                // Log.w(TAG, "ACTION_DRAG_STARTED");
-                break;
-            case DragEvent.ACTION_DRAG_ENTERED:
-                // Log.w(TAG, "ACTION_DRAG_ENTERED");
-                v.setBackgroundColor(Color.GREEN);
-                break;
-            case DragEvent.ACTION_DRAG_EXITED:
-                // Log.w(TAG, "ACTION_DRAG_EXITED");
-                v.setBackgroundDrawable(getResources().getDrawable(R.drawable.item_generic_selector));
-                break;
-            case DragEvent.ACTION_DROP:
-                // Log.w(TAG, "ACTION_DROP");
-                View view = (View) event.getLocalState();
+                case DragEvent.ACTION_DRAG_STARTED:
+                    // Do nothing
+                    // Log.w(TAG, "ACTION_DRAG_STARTED");
+                    break;
+                case DragEvent.ACTION_DRAG_ENTERED:
+                    // Log.w(TAG, "ACTION_DRAG_ENTERED");
+                    v.setBackgroundColor(Color.GREEN);
+                    break;
+                case DragEvent.ACTION_DRAG_EXITED:
+                    // Log.w(TAG, "ACTION_DRAG_EXITED");
+                    v.setBackgroundDrawable(getResources().getDrawable(R.drawable.item_generic_selector));
+                    break;
+                case DragEvent.ACTION_DROP:
+                    // Log.w(TAG, "ACTION_DROP");
+                    View view = (View) event.getLocalState();
 
-                Item i = event.getClipData().getItemAt(0);
-                Intent intent = i.getIntent();
-                intent.setExtrasClassLoader(Conference.class.getClassLoader());
+                    Item i = event.getClipData().getItemAt(0);
+                    Intent intent = i.getIntent();
+                    intent.setExtrasClassLoader(Conference.class.getClassLoader());
 
-                Conference initial = (Conference) view.getTag();
-                Conference target = (Conference) v.getTag();
+                    Conference initial = (Conference) view.getTag();
+                    Conference target = (Conference) v.getTag();
 
-                if (initial == target) {
-                    return true;
-                }
+                    if (initial == target) {
+                        return true;
+                    }
 
-                DropActionsChoice dialog = DropActionsChoice.newInstance();
-                Bundle b = new Bundle();
-                b.putParcelable("call_initial", initial);
-                b.putParcelable("call_targeted", target);
-                dialog.setArguments(b);
-                dialog.setTargetFragment(CallListFragment.this, 0);
-                dialog.show(getChildFragmentManager(), "dialog");
+                    DropActionsChoice dialog = DropActionsChoice.newInstance();
+                    Bundle b = new Bundle();
+                    b.putParcelable("call_initial", initial);
+                    b.putParcelable("call_targeted", target);
+                    dialog.setArguments(b);
+                    dialog.setTargetFragment(CallListFragment.this, 0);
+                    dialog.show(getChildFragmentManager(), "dialog");
 
-                // view.setBackgroundColor(Color.WHITE);
-                // v.setBackgroundColor(Color.BLACK);
-                break;
-            case DragEvent.ACTION_DRAG_ENDED:
-                // Log.w(TAG, "ACTION_DRAG_ENDED");
-                View view1 = (View) event.getLocalState();
-                view1.setVisibility(View.VISIBLE);
-                v.setBackgroundDrawable(getResources().getDrawable(R.drawable.item_generic_selector));
-            default:
-                break;
+                    // view.setBackgroundColor(Color.WHITE);
+                    // v.setBackgroundColor(Color.BLACK);
+                    break;
+                case DragEvent.ACTION_DRAG_ENDED:
+                    // Log.w(TAG, "ACTION_DRAG_ENDED");
+                    View view1 = (View) event.getLocalState();
+                    view1.setVisibility(View.VISIBLE);
+                    v.setBackgroundDrawable(getResources().getDrawable(R.drawable.item_generic_selector));
+                default:
+                    break;
             }
             return true;
         }
@@ -402,50 +450,50 @@
         Conference transfer = null;
         if (requestCode == REQUEST_TRANSFER) {
             switch (resultCode) {
-            case 0:
-                Conference c = data.getParcelableExtra("target");
-                transfer = data.getParcelableExtra("transfer");
-                try {
+                case 0:
+                    Conference c = data.getParcelableExtra("target");
+                    transfer = data.getParcelableExtra("transfer");
+                    try {
 
-                    mCallbacks.getService().attendedTransfer(transfer.getParticipants().get(0).getCallId(), c.getParticipants().get(0).getCallId());
-                    calls_adapter.remove(transfer);
-                    calls_adapter.remove(c);
-                    calls_adapter.notifyDataSetChanged();
-                } catch (RemoteException e) {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-                Toast.makeText(getActivity(), getString(R.string.home_transfer_complet), Toast.LENGTH_LONG).show();
-                break;
+                        mCallbacks.getService().attendedTransfer(transfer.getParticipants().get(0).getCallId(), c.getParticipants().get(0).getCallId());
+                        calls_adapter.remove(transfer);
+                        calls_adapter.remove(c);
+                        calls_adapter.notifyDataSetChanged();
+                    } catch (RemoteException e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    }
+                    Toast.makeText(getActivity(), getString(R.string.home_transfer_complet), Toast.LENGTH_LONG).show();
+                    break;
 
-            case 1:
-                String to = data.getStringExtra("to_number");
-                transfer = data.getParcelableExtra("transfer");
-                try {
-                    Toast.makeText(getActivity(), getString(R.string.home_transfering,transfer.getParticipants().get(0).getContact().getmDisplayName(),to),
-                            Toast.LENGTH_SHORT).show();
-                    mCallbacks.getService().transfer(transfer.getParticipants().get(0).getCallId(), to);
-                    mCallbacks.getService().hangUp(transfer.getParticipants().get(0).getCallId());
-                } catch (RemoteException e) {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-                break;
+                case 1:
+                    String to = data.getStringExtra("to_number");
+                    transfer = data.getParcelableExtra("transfer");
+                    try {
+                        Toast.makeText(getActivity(), getString(R.string.home_transfering, transfer.getParticipants().get(0).getContact().getmDisplayName(), to),
+                                Toast.LENGTH_SHORT).show();
+                        mCallbacks.getService().transfer(transfer.getParticipants().get(0).getCallId(), to);
+                        mCallbacks.getService().hangUp(transfer.getParticipants().get(0).getCallId());
+                    } catch (RemoteException e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    }
+                    break;
 
-            default:
-                break;
+                default:
+                    break;
             }
         } else if (requestCode == REQUEST_CONF) {
             switch (resultCode) {
-            case 0:
-                Conference call_to_add = data.getParcelableExtra("transfer");
-                Conference call_target = data.getParcelableExtra("target");
+                case 0:
+                    Conference call_to_add = data.getParcelableExtra("transfer");
+                    Conference call_target = data.getParcelableExtra("target");
 
-                bindCalls(call_to_add, call_target);
-                break;
+                    bindCalls(call_to_add, call_target);
+                    break;
 
-            default:
-                break;
+                default:
+                    break;
             }
         }
     }
@@ -453,6 +501,8 @@
     private void bindCalls(Conference call_to_add, Conference call_target) {
         try {
 
+            Log.i(TAG, "joining calls:"+ call_to_add.getId() + " and " + call_target.getId());
+
             if (call_target.hasMultipleParticipants() && !call_to_add.hasMultipleParticipants()) {
 
                 mCallbacks.getService().addParticipant(call_to_add.getParticipants().get(0), call_target.getId());
diff --git a/src/org/sflphone/history/HistoryCall.java b/src/org/sflphone/history/HistoryCall.java
index af029bb..05d3591 100644
--- a/src/org/sflphone/history/HistoryCall.java
+++ b/src/org/sflphone/history/HistoryCall.java
@@ -81,19 +81,6 @@
     @DatabaseField
     long callID;
 
-    public HistoryCall(HashMap<String, String> entry) {
-        call_end = Long.parseLong(entry.get(ServiceConstants.history.TIMESTAMP_STOP_KEY));
-        call_start = Long.parseLong(entry.get(ServiceConstants.history.TIMESTAMP_START_KEY));
-        accountID = entry.get(ServiceConstants.history.ACCOUNT_ID_KEY);
-
-        direction = entry.get(ServiceConstants.history.DIRECTION_KEY);
-        missed = entry.get(ServiceConstants.history.MISSED_KEY).contentEquals("true");
-
-        recordPath = entry.get(ServiceConstants.history.RECORDING_PATH_KEY);
-        number = entry.get(ServiceConstants.history.PEER_NUMBER_KEY);
-        timeFormatted = HistoryTimeModel.timeToHistoryConst(call_start);
-    }
-
     /* Needed by ORMLite */
     public HistoryCall() {
     }
@@ -188,7 +175,7 @@
     }
 
     public boolean isIncoming() {
-        return direction.contentEquals(ServiceConstants.history.INCOMING_STRING);
+        return true;
     }
 
     public boolean isMissed() {
diff --git a/src/org/sflphone/model/Conference.java b/src/org/sflphone/model/Conference.java
index 0047f3b..3c30c9b 100644
--- a/src/org/sflphone/model/Conference.java
+++ b/src/org/sflphone/model/Conference.java
@@ -39,11 +39,21 @@
 public class Conference implements Parcelable {
 
     private String id;
-    private String state = "";
+    private int mConfState;
     private ArrayList<SipCall> participants;
     private boolean recording;
     private ArrayList<SipMessage> messages;
 
+    public static String DEFAULT_ID = "-1";
+
+    public boolean isRinging() {
+        return participants.get(0).isRinging();
+    }
+
+    public void removeParticipant(String toRemove) {
+        participants.remove(toRemove);
+    }
+
     public interface state {
         int ACTIVE_ATTACHED = 0;
         int ACTIVE_DETACHED = 1;
@@ -53,6 +63,30 @@
         int HOLD_REC = 5;
     }
 
+    public void setCallState(String callID, int newState) {
+        if(id.contentEquals(callID))
+            mConfState = newState;
+        else {
+            getCallById(callID).setCallState(newState);
+        }
+    }
+
+    public void setCallState(String confID, String newState) {
+        if (newState.equals("ACTIVE_ATTACHED")) {
+            setCallState(confID, state.ACTIVE_ATTACHED);
+        } else if (newState.equals("ACTIVE_DETACHED")) {
+            setCallState(confID, state.ACTIVE_DETACHED);
+        } else if (newState.equals("ACTIVE_ATTACHED_REC")) {
+            setCallState(confID, state.ACTIVE_ATTACHED_REC);
+        } else if (newState.equals("ACTIVE_DETACHED_REC")) {
+            setCallState(confID, state.ACTIVE_DETACHED_REC);
+        } else if (newState.equals("HOLD")) {
+            setCallState(confID, state.HOLD);
+        } else if (newState.equals("HOLD_REC")) {
+            setCallState(confID, state.HOLD_REC);
+        }
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -61,7 +95,7 @@
     @Override
     public void writeToParcel(Parcel out, int flags) {
         out.writeString(id);
-        out.writeString(state);
+        out.writeInt(mConfState);
         out.writeTypedList(participants);
         out.writeByte((byte) (recording ? 1 : 0));
         out.writeTypedList(messages);
@@ -80,13 +114,18 @@
     private Conference(Parcel in) {
         participants = new ArrayList<SipCall>();
         id = in.readString();
-        state = in.readString();
+        mConfState = in.readInt();
         in.readTypedList(participants, SipCall.CREATOR);
         recording = in.readByte() == 1 ? true : false;
         messages = new ArrayList<SipMessage>();
         in.readTypedList(messages, SipMessage.CREATOR);
     }
 
+    public Conference(SipCall call) {
+        this(DEFAULT_ID);
+        participants.add(call);
+    }
+
     public Conference(String cID) {
         id = cID;
         participants = new ArrayList<SipCall>();
@@ -96,7 +135,7 @@
 
     public Conference(Conference c) {
         id = c.id;
-        state = c.state;
+        mConfState = c.mConfState;
         participants = new ArrayList<SipCall>(c.participants);
         recording = c.recording;
         messages = new ArrayList<SipMessage>();
@@ -113,11 +152,37 @@
         if (participants.size() == 1) {
             return participants.get(0).getCallStateString();
         }
-        return state;
+        return getConferenceStateString();
     }
 
-    public void setState(String state) {
-        this.state = state;
+    public String getConferenceStateString() {
+
+        String text_state;
+
+        switch (mConfState) {
+            case state.ACTIVE_ATTACHED:
+                text_state = "ACTIVE_ATTACHED";
+                break;
+            case state.ACTIVE_DETACHED:
+                text_state = "ACTIVE_DETACHED";
+                break;
+            case state.ACTIVE_ATTACHED_REC:
+                text_state = "ACTIVE_ATTACHED_REC";
+                break;
+            case state.ACTIVE_DETACHED_REC:
+                text_state = "ACTIVE_DETACHED_REC";
+                break;
+            case state.HOLD:
+                text_state = "HOLD";
+                break;
+            case state.HOLD_REC:
+                text_state = "HOLD_REC";
+                break;
+            default:
+                text_state = "NULL";
+        }
+
+        return text_state;
     }
 
     public ArrayList<SipCall> getParticipants() {
@@ -132,7 +197,7 @@
         return false;
     }
 
-    public SipCall getCall(String callID) {
+    public SipCall getCallById(String callID) {
         for (int i = 0; i < participants.size(); ++i) {
             if (participants.get(i).getCallId().contentEquals(callID))
                 return participants.get(i);
@@ -169,9 +234,16 @@
     public boolean isOnHold() {
         if (participants.size() == 1 && participants.get(0).isOnHold())
             return true;
-        return state.contentEquals("HOLD");
+        return getConferenceStateString().contentEquals("HOLD");
     }
 
+    public boolean isIncoming() {
+        if (participants.size() == 1 && participants.get(0).isIncoming())
+            return true;
+        return false;
+    }
+
+
     public void setRecording(boolean b) {
         recording = b;
     }
@@ -192,15 +264,15 @@
     }
 
     public ArrayList<SipMessage> getMessages() {
-        if (hasMultipleParticipants())
-            return messages;
-        else
-            return participants.get(0).getMessages();
-
+        return messages;
     }
 
     public void addSipMessage(SipMessage sipMessage) {
         messages.add(sipMessage);
     }
 
+    public void addParticipant(SipCall part) {
+        participants.add(part);
+    }
+
 }
diff --git a/src/org/sflphone/model/SipCall.java b/src/org/sflphone/model/SipCall.java
index 184ab7d..a8574a4 100644
--- a/src/org/sflphone/model/SipCall.java
+++ b/src/org/sflphone/model/SipCall.java
@@ -54,8 +54,6 @@
     private int mCallType = state.CALL_TYPE_UNDETERMINED;
     private int mCallState = state.CALL_STATE_NONE;
     private int mMediaState = state.MEDIA_STATE_NONE;
-    
-    ArrayList<SipMessage> messages;
 
     /************************
      * Construtors
@@ -71,10 +69,7 @@
         mCallState = in.readInt();
         mMediaState = in.readInt();
         timestamp_start = in.readLong();
-        
-        messages = new ArrayList<SipMessage>();
-        in.readTypedList(messages, SipMessage.CREATOR);
-    }
+            }
 
     public SipCall(String id, Account account, int call_type, int call_state, int media_state, CallContact c) {
         mCallID = id;
@@ -83,7 +78,6 @@
         mCallState = call_state;
         mMediaState = media_state;
         contact = c;
-        messages = new ArrayList<SipMessage>();
     }
 
     public interface state {
@@ -125,8 +119,6 @@
         out.writeInt(mCallState);
         out.writeInt(mMediaState);
         out.writeLong(timestamp_start);
-        
-        out.writeTypedList(messages);
     }
 
     public static final Parcelable.Creator<SipCall> CREATOR = new Parcelable.Creator<SipCall>() {
@@ -418,13 +410,4 @@
     public boolean isCurrent() {
         return mCallState == state.CALL_STATE_CURRENT;
     }
-
-    public void addSipMessage(SipMessage message) {
-        messages.add(message);
-    }
-
-    public ArrayList<SipMessage> getMessages() {
-        return messages;
-    }
-
 }
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
diff --git a/src/org/sflphone/utils/SipNotifications.java b/src/org/sflphone/utils/SipNotifications.java
index eaf9fb0..47961cc 100644
--- a/src/org/sflphone/utils/SipNotifications.java
+++ b/src/org/sflphone/utils/SipNotifications.java
@@ -38,6 +38,7 @@
 
 import org.sflphone.R;
 import org.sflphone.client.HomeActivity;
+import org.sflphone.model.Conference;
 import org.sflphone.model.SipCall;
 
 import android.app.Notification;
@@ -145,7 +146,7 @@
         cancelVoicemails();
     }
 
-    public void publishMissedCallNotification(SipCall sipCall) {
+    public void publishMissedCallNotification(Conference missedConf) {
 
         CharSequence tickerText = context.getString(R.string.notif_missed_call_title);
         long when = System.currentTimeMillis();
@@ -157,7 +158,7 @@
         nb.setTicker(tickerText);
         nb.setWhen(when);
         nb.setContentTitle(context.getString(R.string.notif_missed_call_title));
-        nb.setContentText(context.getString(R.string.notif_missed_call_content, sipCall.getContact().getmDisplayName()));
+        nb.setContentText(context.getString(R.string.notif_missed_call_content, missedConf.getParticipants().get(0).getContact().getmDisplayName()));
         Intent notificationIntent = new Intent(context, HomeActivity.class);
         notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
         PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);