diff --git a/src/com/savoirfairelinux/sflphone/adapters/AccountSelectionAdapter.java b/src/com/savoirfairelinux/sflphone/adapters/AccountSelectionAdapter.java
index 6226021..13cb87e 100644
--- a/src/com/savoirfairelinux/sflphone/adapters/AccountSelectionAdapter.java
+++ b/src/com/savoirfairelinux/sflphone/adapters/AccountSelectionAdapter.java
@@ -23,7 +23,7 @@
     ArrayList<Account> accounts;
     Context mContext;
     ISipService service;
-    int selectedAccount = 0;
+    int selectedAccount = -1;
 
     public AccountSelectionAdapter(Context cont, ISipService s, ArrayList<Account> newList) {
         super();
@@ -90,6 +90,9 @@
     }
 
     public Account getSelectedAccount() {
+        if(selectedAccount == -1){
+            return null;
+        }
         return accounts.get(selectedAccount);
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 75ce0c3..16c47e1 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -33,7 +33,6 @@
 
 package com.savoirfairelinux.sflphone.client;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 
 import android.app.Activity;
@@ -44,7 +43,6 @@
 import android.content.ServiceConnection;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.Environment;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.support.v4.widget.SlidingPaneLayout;
@@ -57,6 +55,7 @@
 import com.savoirfairelinux.sflphone.fragments.CallListFragment;
 import com.savoirfairelinux.sflphone.interfaces.CallInterface;
 import com.savoirfairelinux.sflphone.model.CallContact;
+import com.savoirfairelinux.sflphone.model.Conference;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.model.SipCall.state;
 import com.savoirfairelinux.sflphone.receivers.CallReceiver;
@@ -75,6 +74,7 @@
 
     CallListFragment mCallsFragment;
     CallFragment mCurrentCallFragment;
+    private boolean fragIsChanging;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -88,9 +88,7 @@
         getFragmentManager().beginTransaction().replace(R.id.calllist_pane, mCallsFragment).commit();
 
         slidingPaneLayout = (CallPaneLayout) findViewById(R.id.slidingpanelayout);
-        // slidingPaneLayout.
-        // slidingPaneLayout.requestDisallowInterceptTouchEvent(disallowIntercept)
-        // Toast.makeText(this, getIntent().getData().toString(), Toast.LENGTH_LONG).show();
+
         slidingPaneLayout.setPanelSlideListener(new SlidingPaneLayout.PanelSlideListener() {
 
             @Override
@@ -115,8 +113,14 @@
 
                 switch (view.getId()) {
                 case R.id.ongoingcall_pane:
-                    Log.i(TAG, "PANEL CLOSED DRAWING SHOULD RESTART");
-                    mCurrentCallFragment.getBubbleView().restartDrawing();
+                    if (fragIsChanging) {
+                        getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment).commit();
+
+                        fragIsChanging = false;
+                    } else {
+                        mCurrentCallFragment.getBubbleView().restartDrawing();
+                    }
+
                     break;
                 default:
                     break;
@@ -126,7 +130,7 @@
 
         Intent intent = new Intent(this, SipService.class);
         bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
-
+        slidingPaneLayout.setCoveredFadeColor(0xFFFF0000);
     }
 
     /* activity gets back to the foreground and user input */
@@ -137,6 +141,10 @@
         intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
         intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
         intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
+        intentFilter.addAction(CallManagerCallBack.CONF_CREATED);
+        intentFilter.addAction(CallManagerCallBack.CONF_REMOVED);
+        intentFilter.addAction(CallManagerCallBack.CONF_CHANGED);
+        intentFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
         registerReceiver(receiver, intentFilter);
         super.onResume();
     }
@@ -175,7 +183,7 @@
         @Override
         public void onServiceConnected(ComponentName className, IBinder binder) {
             service = ISipService.Stub.asInterface(binder);
-            Log.i(TAG, "Placing call");
+
             mCurrentCallFragment = new CallFragment();
             Uri u = getIntent().getData();
             if (u != null) {
@@ -184,20 +192,31 @@
                     service.destroyNotification();
                     SipCall call = SipCall.SipCallBuilder.getInstance().startCallCreation().setContact(c)
                             .setAccountID(service.getAccountList().get(1).toString()).setCallType(SipCall.state.CALL_TYPE_OUTGOING).build();
+                    Conference tmp = new Conference("-1");
+                    tmp.getParticipants().add(call);
                     Bundle b = new Bundle();
-                    b.putParcelable("CallInfo", call);
+                    b.putParcelable("conference", tmp);
                     Log.i(TAG, "Arguments set");
                     mCurrentCallFragment.setArguments(b);
                 } catch (RemoteException e) {
-                    // TODO Auto-generated catch block
                     e.printStackTrace();
                 } catch (Exception e) {
-                    // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
-
             } else {
-                mCurrentCallFragment.setArguments(getIntent().getExtras());
+                if (getIntent().getBooleanExtra("resuming", false)) {
+
+                    Bundle b = new Bundle();
+                    try {
+                        b.putParcelable("conference", (Conference) service.getCurrentCall());
+                        mCurrentCallFragment.setArguments(b);
+                    } catch (RemoteException e) {
+                        e.printStackTrace();
+                    }
+                } else {
+                    mCurrentCallFragment.setArguments(getIntent().getExtras());
+                }
+
             }
 
             slidingPaneLayout.setCurFragment(mCurrentCallFragment);
@@ -239,10 +258,9 @@
 
         mCurrentCallFragment.changeCallState(callID, newState);
 
-        HashMap<String, SipCall> callMap;
         try {
-            callMap = (HashMap<String, SipCall>) service.getCallList();
-            ArrayList<String> confMap = (ArrayList<String>) service.getConferenceList();
+            HashMap<String, SipCall> callMap = (HashMap<String, SipCall>) service.getCallList();
+            HashMap<String, Conference> confMap = (HashMap<String, Conference>) service.getConferenceList();
             if (callMap.size() == 0 && confMap.size() == 0) {
 
                 finish();
@@ -269,22 +287,25 @@
     }
 
     @Override
-    public void onCallSelected(ArrayList<SipCall> calls) {
+    public void onCallSelected(Conference conf) {
 
-        mCurrentCallFragment.getBubbleView().restartDrawing();
+        if(mCurrentCallFragment.getBubbleView() == null){
+            return;
+        }
+        mCurrentCallFragment.getBubbleView().stopThread();
         mCurrentCallFragment = new CallFragment();
         Bundle b = new Bundle();
 
-        b.putParcelableArrayList("CallsInfo", calls);
+        b.putParcelable("conference", conf);
         mCurrentCallFragment.setArguments(b);
-        getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment).commit();
 
-        if(calls.size() == 1){
-            onCallResumed(calls.get(0));
-        }
-        
+        // if (calls.size() == 1) {
+        // onCallResumed(calls.get(0));
+        // }
+
         slidingPaneLayout.setCurFragment(mCurrentCallFragment);
         slidingPaneLayout.closePane();
+        fragIsChanging = true;
 
     }
 
@@ -387,11 +408,11 @@
     @Override
     public void onRecordCall(SipCall call) {
         try {
-            if (call.getCallStateInt() == state.CALL_STATE_CURRENT) {
-//                service.setRecordPath(Environment.getExternalStorageDirectory().getAbsolutePath());
+
+                // service.setRecordPath(Environment.getExternalStorageDirectory().getAbsolutePath());
                 Log.w(TAG, "Recording path" + service.getRecordPath());
                 service.setRecordingCall(call.getCallId());
-            }
+            
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
@@ -436,7 +457,18 @@
 
     @Override
     public void onCallsTerminated() {
-        Toast.makeText(this, "No Calls ", Toast.LENGTH_SHORT).show();
+
+    }
+
+    @Override
+    public void recordingChanged(Intent intent) {
+        mCallsFragment.update();
+    }
+
+    @Override
+    public void replaceCurrentCallDisplayed() {
+        mCurrentCallFragment.getBubbleView().stopThread();
+        getFragmentManager().beginTransaction().remove(mCurrentCallFragment).commit();
 
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
index 64abea2..2f1041d 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
@@ -31,7 +31,6 @@
  */
 package com.savoirfairelinux.sflphone.client;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -71,6 +70,7 @@
 import com.savoirfairelinux.sflphone.interfaces.CallInterface;
 import com.savoirfairelinux.sflphone.loaders.LoaderConstants;
 import com.savoirfairelinux.sflphone.model.CallContact;
+import com.savoirfairelinux.sflphone.model.Conference;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.receivers.CallReceiver;
 import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
@@ -345,11 +345,11 @@
     public void launchCallActivity(SipCall infos) {
         Log.i(TAG, "Launch Call Activity");
         Bundle bundle = new Bundle();
-        ArrayList<SipCall> tmp = new ArrayList<SipCall>();
-        tmp.add(infos);
-        bundle.putParcelableArrayList("CallsInfo", tmp);
+        Conference tmp = new Conference("-1");
+        tmp.getParticipants().add(infos);
+        bundle.putParcelable("conference", tmp);
         Intent intent = new Intent().setClass(this, CallActivity.class);
-
+        intent.putExtra("resuming", false);
         intent.putExtras(bundle);
         startActivityForResult(intent, REQUEST_CODE_CALL);
     }
@@ -367,6 +367,7 @@
                 getFragmentManager().beginTransaction().replace(R.id.left_drawer, fMenu).commit();
                 mSectionsPagerAdapter = new SectionsPagerAdapter(SFLPhoneHomeActivity.this, getFragmentManager());
                 initialiseTabHost(null);
+                mViewPager.setOffscreenPageLimit(2);
                 mViewPager.setAdapter(mSectionsPagerAdapter);
                 mTabHost.setCurrentTab(1);
                 service.destroyNotification();
@@ -410,19 +411,13 @@
             break;
         case REQUEST_CODE_CALL:
             Log.w(TAG, "Result out of CallActivity");
-
+            getLoaderManager().restartLoader(LoaderConstants.HISTORY_LOADER, null, (HistoryFragment) mSectionsPagerAdapter.getItem(2));
             break;
         }
 
     }
 
     @Override
-    public void onCallSelected(SipCall c) {
-        launchCallActivity(c);
-
-    }
-
-    @Override
     public ISipService getService() {
         return service;
     }
@@ -507,6 +502,11 @@
     @Override
     public void onCallDialed(String to) {
 
+        if (fMenu.getSelectedAccount() == null) {
+            Toast.makeText(this, "No Account Selected", Toast.LENGTH_SHORT).show();
+            return;
+        }
+
         SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
         callBuilder.startCallCreation().setAccountID(fMenu.getSelectedAccount().getAccountID()).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
         callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(to));
@@ -586,19 +586,32 @@
     @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 resumeCallActivity() {
+        Intent intent = new Intent().setClass(this, CallActivity.class);
+        intent.putExtra("resuming", true);
+        startActivityForResult(intent, REQUEST_CODE_CALL);
     }
 
 }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
index b79d2a3..6917f02 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
@@ -31,9 +31,6 @@
 
 package com.savoirfairelinux.sflphone.fragments;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-
 import android.app.Activity;
 import android.app.Fragment;
 import android.graphics.Bitmap;
@@ -47,14 +44,13 @@
 import android.view.SurfaceHolder.Callback;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.model.Attractor;
 import com.savoirfairelinux.sflphone.model.Bubble;
 import com.savoirfairelinux.sflphone.model.BubbleModel;
 import com.savoirfairelinux.sflphone.model.BubblesView;
-import com.savoirfairelinux.sflphone.model.CallContact;
+import com.savoirfairelinux.sflphone.model.Conference;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.views.CounterTextView;
@@ -66,7 +62,7 @@
     static final float BUBBLE_SIZE = 75;
     static final float ATTRACTOR_SIZE = 40;
 
-    private ArrayList<SipCall> mCalls;
+    private Conference conf;
 
     private CounterTextView callStatusTxt;
     private BubblesView view;
@@ -74,20 +70,17 @@
 
     private Callbacks mCallbacks = sDummyCallbacks;
 
-    private HashMap<CallContact, Bubble> contacts = new HashMap<CallContact, Bubble>();
-
     private SipCall myself;
 
-    private Bitmap hangup_icon;
+    private Bitmap hangup_icon, separate_icon;
     private Bitmap call_icon;
 
     @Override
     public void onCreate(Bundle savedBundle) {
         super.onCreate(savedBundle);
-        model = new BubbleModel(getResources().getDisplayMetrics().density);
         Bundle b = getArguments();
-
-        mCalls = b.getParcelableArrayList("CallsInfo");
+        conf = b.getParcelable("conference");
+        model = new BubbleModel(getResources().getDisplayMetrics().density);
 
     }
 
@@ -135,6 +128,10 @@
         public ISipService getService() {
             return null;
         }
+
+        @Override
+        public void replaceCurrentCallDisplayed() {
+        }
     };
 
     /**
@@ -162,6 +159,8 @@
         public void onRecordCall(SipCall call);
 
         public void onSendMessage(SipCall call, String msg);
+
+        public void replaceCurrentCallDisplayed();
     }
 
     @Override
@@ -204,6 +203,7 @@
 
         hangup_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hangup);
         call_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_call);
+        separate_icon = BitmapFactory.decodeResource(getResources(), R.drawable.icon_separate);
 
         // Do nothing here, the view is not initialized yet.
         return rootView;
@@ -216,58 +216,76 @@
 
         getBubbleFor(myself, model.width / 2, model.height / 2);
 
-        int angle_part = 360 / mCalls.size();
+        int angle_part = 360 / conf.getParticipants().size();
         double dX = 0;
         double dY = 0;
         int radiusCalls = model.width / 2 - 150;
-        for (int i = 0; i < mCalls.size(); ++i) {
+        for (int i = 0; i < conf.getParticipants().size(); ++i) {
+
+            if (conf.getParticipants().get(i) == null) {
+                Log.i(TAG, i + " null ");
+                continue;
+            }
             dX = Math.cos(Math.toRadians(angle_part * i - 90)) * radiusCalls;
             dY = Math.sin(Math.toRadians(angle_part * i - 90)) * radiusCalls;
-            getBubbleFor(mCalls.get(i), (int) (model.width / 2 + dX), (int) (model.height / 2 + dY));
+            getBubbleFor(conf.getParticipants().get(i), (int) (model.width / 2 + dX), (int) (model.height / 2 + dY));
         }
 
         model.clearAttractors();
-//        model.addAttractor(new Attractor(new PointF(model.width / 1.1f, model.height * .1f), ATTRACTOR_SIZE, new Attractor.Callback() {
-//            @Override
-//            public boolean onBubbleSucked(Bubble b) {
-//                Log.w(TAG, "Bubble sucked ! ");
-//                if (mCalls.size() == 1) {
-//                    mCallbacks.onCallEnded(b.associated_call);
-//                } else {
-//                    try {
-//                        mCallbacks.getService().detachParticipant(b.associated_call.getCallId());
-//                    } catch (RemoteException e) {
-//                        e.printStackTrace();
-//                    }
-//                }
-//
-//                bubbleRemoved(b);
-//                return true;
-//            }
-//        }, hangup_icon));
+        model.addAttractor(new Attractor(new PointF(model.width / 1.1f, model.height * .1f), ATTRACTOR_SIZE, new Attractor.Callback() {
+            @Override
+            public boolean onBubbleSucked(Bubble b) {
+                Log.w(TAG, "Bubble sucked ! ");
+
+                mCallbacks.onCallEnded(b.associated_call);
+
+                bubbleRemoved(b);
+                return true;
+            }
+        }, hangup_icon));
+
+        // if (conf.hasMultipleParticipants()) {
+        // model.addAttractor(new Attractor(new PointF(model.width / 1.1f, model.height * .9f), ATTRACTOR_SIZE, new Attractor.Callback() {
+        // @Override
+        // public boolean onBubbleSucked(Bubble b) {
+        //
+        // try {
+        // mCallbacks.getService().detachParticipant(b.associated_call.getCallId());
+        // } catch (RemoteException e) {
+        // e.printStackTrace();
+        // }
+        //
+        // bubbleRemoved(b);
+        // return true;
+        // }
+        // }, separate_icon));
+        // }
+
+        // if(mCalls.size() == 1 && mCalls.get(0).isOnHold()){
+        // mCallbacks.onCallResumed(mCalls.get(0));
+        // }
 
     }
 
     private void initIncomingCallDisplay() {
         Log.i(TAG, "Start incoming display");
 
-        callStatusTxt.setText("Incomming call");
+        callStatusTxt.setText("Incoming call");
 
-        Bubble contact_bubble = getBubbleFor(mCalls.get(0), model.width / 2, model.height / 2);
-        contacts.put(mCalls.get(0).getContact(), contact_bubble);
+        getBubbleFor(conf.getParticipants().get(0), model.width / 2, model.height / 2);
 
         model.clearAttractors();
         model.addAttractor(new Attractor(new PointF(4 * model.width / 5, model.height / 2), ATTRACTOR_SIZE, new Attractor.Callback() {
             @Override
             public boolean onBubbleSucked(Bubble b) {
-                mCallbacks.onCallAccepted(mCalls.get(0));
+                mCallbacks.onCallAccepted(conf.getParticipants().get(0));
                 return false;
             }
         }, call_icon));
         model.addAttractor(new Attractor(new PointF(model.width / 5, model.height / 2), ATTRACTOR_SIZE, new Attractor.Callback() {
             @Override
             public boolean onBubbleSucked(Bubble b) {
-                mCallbacks.onCallRejected(mCalls.get(0));
+                mCallbacks.onCallRejected(conf.getParticipants().get(0));
                 bubbleRemoved(b);
                 return true;
             }
@@ -279,17 +297,25 @@
 
         callStatusTxt.setText("Calling...");
 
-        // TODO off-thread image loading
         getBubbleFor(myself, model.width / 2, model.height / 2);
 
-        getBubbleFor(mCalls.get(0), (int) (model.width / 2), (int) (model.height / 3));
+        // TODO off-thread image loading
+        int angle_part = 360 / conf.getParticipants().size();
+        double dX = 0;
+        double dY = 0;
+        int radiusCalls = model.width / 2 - 150;
+        for (int i = 0; i < conf.getParticipants().size(); ++i) {
+            dX = Math.cos(Math.toRadians(angle_part * i - 90)) * radiusCalls;
+            dY = Math.sin(Math.toRadians(angle_part * i - 90)) * radiusCalls;
+            getBubbleFor(conf.getParticipants().get(i), (int) (model.width / 2 + dX), (int) (model.height / 2 + dY));
+        }
 
         model.clearAttractors();
         model.addAttractor(new Attractor(new PointF(model.width / 1.1f, model.height * .1f), 40, new Attractor.Callback() {
             @Override
             public boolean onBubbleSucked(Bubble b) {
                 Log.w(TAG, "Bubble sucked ! ");
-                mCallbacks.onCallEnded(mCalls.get(0));
+                mCallbacks.onCallEnded(conf.getParticipants().get(0));
                 bubbleRemoved(b);
                 return true;
             }
@@ -308,7 +334,7 @@
      * @return Bubble corresponding to the contact.
      */
     private Bubble getBubbleFor(SipCall call, float x, float y) {
-        Bubble contact_bubble = contacts.get(call.getContact());
+        Bubble contact_bubble = model.getBubble(call);
         if (contact_bubble != null) {
             contact_bubble.attractor.set(x, y);
             return contact_bubble;
@@ -317,8 +343,6 @@
         contact_bubble = new Bubble(getActivity(), call, x, y, BUBBLE_SIZE);
 
         model.addBubble(contact_bubble);
-        contacts.put(call.getContact(), contact_bubble);
-
         return contact_bubble;
     }
 
@@ -329,28 +353,42 @@
         if (b.associated_call == null) {
             return;
         }
-        contacts.remove(b.associated_call.getContact());
     }
 
     public void changeCallState(String callID, String newState) {
 
-        Log.w(TAG, "Changing call state of " + callID);
-        if (mCalls.size() == 1) {
-            if (callID.equals(mCalls.get(0).getCallId()))
-                mCalls.get(0).setCallState(newState);
-
-            if (mCalls.get(0).isOngoing()) {
-                initNormalStateDisplay();
-            }
-        } else {
-            for (int i = 0; i < mCalls.size(); ++i) {
-                mCalls.get(i).printCallInfo();
-
-                if (callID.equals(mCalls.get(i).getCallId()))
-                    mCalls.get(i).setCallState(newState);
-
+        if (newState.contentEquals("FAILURE")) {
+            try {
+                mCallbacks.getService().hangUp(callID);
+            } catch (RemoteException e) {
+                e.printStackTrace();
             }
         }
+        if (conf.getParticipants() == null) {
+            return;
+        }
+
+        for (int i = 0; i < conf.getParticipants().size(); ++i) {
+            // conf.getParticipants().get(i).printCallInfo();
+
+            if (callID.equals(conf.getParticipants().get(i).getCallId())) {
+                if (newState.contentEquals("HUNGUP")) {
+
+                    model.removeBubble(conf.getParticipants().get(i));
+                    conf.getParticipants().remove(i);
+                } else {
+                    conf.getParticipants().get(i).setCallState(newState);
+                }
+            }
+        }
+
+        if (conf.isOnGoing())
+            initNormalStateDisplay();
+
+        if (conf.getParticipants().size() == 0) {
+            mCallbacks.replaceCurrentCallDisplayed();
+        }
+
     }
 
     public boolean draggingBubble() {
@@ -362,19 +400,20 @@
         // Log.i(TAG, "Init fragment " + mCall.getCallId());
 
         // mCall.printCallInfo();
-        if (mCalls.size() == 1) {
+        if (conf.getParticipants().size() == 1) {
 
-            if (mCalls.get(0).isIncoming() && mCalls.get(0).isRinging()) {
+            if (conf.getParticipants().get(0).isIncoming() && conf.getParticipants().get(0).isRinging()) {
                 initIncomingCallDisplay();
             } else {
-                if (mCalls.get(0).isRinging()) {
+                if (conf.getParticipants().get(0).isRinging()) {
                     initOutGoingCallDisplay();
                 }
                 try {
-                    if (mCalls.get(0).isOutGoing() && mCallbacks.getService().getCall(mCalls.get(0).getCallId()) == null) {
-                        mCallbacks.getService().placeCall(mCalls.get(0));
+                    if (conf.getParticipants().get(0).isOutGoing()
+                            && mCallbacks.getService().getCall(conf.getParticipants().get(0).getCallId()) == null) {
+                        mCallbacks.getService().placeCall(conf.getParticipants().get(0));
                         initOutGoingCallDisplay();
-                    } else if (mCalls.get(0).isOutGoing() && mCalls.get(0).isRinging()) {
+                    } else if (conf.getParticipants().get(0).isOutGoing() && conf.getParticipants().get(0).isRinging()) {
                         initOutGoingCallDisplay();
                     }
                 } catch (RemoteException e) {
@@ -382,10 +421,10 @@
                 }
             }
 
-            if (mCalls.get(0).isOngoing()) {
+            if (conf.getParticipants().get(0).isOngoing()) {
                 initNormalStateDisplay();
             }
-        } else {
+        } else if (conf.getParticipants().size() > 1) {
             initNormalStateDisplay();
         }
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
index b8eba9f..9abaad3 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
@@ -90,7 +90,7 @@
         }
 
         @Override
-        public void onCallSelected(ArrayList<SipCall> call) {
+        public void onCallSelected(Conference conf) {
         }
 
         @Override
@@ -105,7 +105,7 @@
     public interface Callbacks {
         public ISipService getService();
 
-        public void onCallSelected(ArrayList<SipCall> call);
+        public void onCallSelected(Conference conf);
 
         public void onCallsTerminated();
 
@@ -149,33 +149,34 @@
             Log.w(TAG, "Updating");
             HashMap<String, SipCall> list = (HashMap<String, SipCall>) mCallbacks.getService().getCallList();
 
-            Toast.makeText(getActivity(), "Calls: "+list.size(), Toast.LENGTH_SHORT).show();
+            // Toast.makeText(getActivity(), "Calls: " + list.size(), Toast.LENGTH_SHORT).show();
             ArrayList<Conference> conferences = new ArrayList<Conference>();
-            ArrayList<String> tmp = (ArrayList<String>) mCallbacks.getService().getConferenceList();
-            for (String confid : tmp) {
-                Log.w(TAG, "Conference:"+confid);
-                Conference toAdd = new Conference(confid);
-                
-                toAdd.setState(mCallbacks.getService().getConferenceDetails(confid));
-                Toast.makeText(getActivity(), "State of Conf: "+toAdd.getState(), Toast.LENGTH_SHORT).show();
-                ArrayList<String> conf_participants = (ArrayList<String>) mCallbacks.getService().getParticipantList(confid);
-                for (String part : conf_participants) {
-                    Log.w(TAG, "participant:"+part);
-                    toAdd.getParticipants().add(list.get(part));
-                    list.remove(part);
-                }
-                conferences.add(toAdd);
-            }
+            HashMap<String, Conference> tmp = (HashMap<String, Conference>) mCallbacks.getService().getConferenceList();
+            conferences.addAll(tmp.values());
+//            for (String confid : tmp) {
+//                Log.w(TAG, "Conference:" + confid);
+//                Conference toAdd = new Conference(confid);
+//
+//                toAdd.setState(mCallbacks.getService().getConferenceDetails(confid));
+//                // Toast.makeText(getActivity(), "State of Conf: " + toAdd.getState(), Toast.LENGTH_SHORT).show();
+////                ArrayList<String> conf_participants = (ArrayList<String>) mCallbacks.getService().getParticipantList(confid);
+////                for (String part : conf_participants) {
+////                    Log.w(TAG, "participant:" + part);
+////                    toAdd.getParticipants().add(list.get(part));
+////                    list.remove(part);
+////                }
+//                conferences.add(toAdd);
+//            }
 
             ArrayList<SipCall> simple_calls = new ArrayList<SipCall>(list.values());
             for (SipCall call : simple_calls) {
-                Log.w(TAG, "SimpleCall:"+call.getCallId());
+                Log.w(TAG, "SimpleCall:" + call.getCallId());
                 Conference confOne = new Conference("-1");
                 confOne.getParticipants().add(call);
                 conferences.add(confOne);
             }
-            
-            if(conferences.isEmpty()){
+
+            if (conferences.isEmpty()) {
                 mCallbacks.onCallsTerminated();
             }
 
@@ -193,7 +194,7 @@
         if (mAdapter.getGroup(groupPosition).getParticipants().size() == 1) {
             Bundle b = new Bundle();
             b.putParcelableArrayList("calls", mAdapter.getConcurrentCalls(groupPosition));
-            b.putParcelable("call_selected", mAdapter.getGroup(groupPosition).getParticipants().get(0));
+            b.putParcelable("call_selected", mAdapter.getGroup(groupPosition));
             editNameDialog.setArguments(b);
             editNameDialog.setTargetFragment(this, REQUEST_TRANSFER);
             editNameDialog.show(fm, "dialog");
@@ -207,31 +208,27 @@
         FragmentManager fm = getFragmentManager();
         ConferenceDFragment confDialog = ConferenceDFragment.newInstance();
 
-        if (mAdapter.getGroup(groupPosition).getParticipants().size() == 1) {
-            Bundle b = new Bundle();
-            b.putParcelableArrayList("calls", mAdapter.getConcurrentCalls(groupPosition));
-            b.putParcelable("call_selected", mAdapter.getGroup(groupPosition));
-            confDialog.setArguments(b);
-            confDialog.setTargetFragment(this, REQUEST_CONF);
-            confDialog.show(fm, "dialog");
-        } else {
-            Toast.makeText(getActivity(), "Already a Conference", Toast.LENGTH_SHORT).show();
-        }
+        Bundle b = new Bundle();
+        b.putParcelableArrayList("calls", mAdapter.getConcurrentCalls(groupPosition));
+        b.putParcelable("call_selected", mAdapter.getGroup(groupPosition));
+        confDialog.setArguments(b);
+        confDialog.setTargetFragment(this, REQUEST_CONF);
+        confDialog.show(fm, "dialog");
 
     }
 
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
-        SipCall transfer = null;
+        Conference transfer = null;
         if (requestCode == REQUEST_TRANSFER) {
             switch (resultCode) {
             case 0:
-                SipCall c = data.getParcelableExtra("target");
+                Conference c = data.getParcelableExtra("target");
                 transfer = data.getParcelableExtra("transfer");
                 try {
 
-                    mCallbacks.getService().attendedTransfer(transfer.getCallId(), c.getCallId());
+                    mCallbacks.getService().attendedTransfer(transfer.getParticipants().get(0).getCallId(), c.getParticipants().get(0).getCallId());
                     mAdapter.remove(transfer);
 
                     mAdapter.notifyDataSetChanged();
@@ -246,9 +243,10 @@
                 String to = data.getStringExtra("to_number");
                 transfer = data.getParcelableExtra("transfer");
                 try {
-                    Toast.makeText(getActivity(), "Transferring " + transfer.getContact().getmDisplayName() + " to " + to, Toast.LENGTH_SHORT).show();
-                    mCallbacks.getService().transfer(transfer.getCallId(), to);
-
+                    Toast.makeText(getActivity(), "Transferring " + transfer.getParticipants().get(0).getContact().getmDisplayName() + " to " + 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();
@@ -261,12 +259,28 @@
         } else if (requestCode == REQUEST_CONF) {
             switch (resultCode) {
             case 0:
-                Conference call1 = data.getParcelableExtra("call1");
-                Conference call2 = data.getParcelableExtra("call2");
+                Conference call_to_add = data.getParcelableExtra("call_to_add");
+                Conference call_target = data.getParcelableExtra("call_target");
                 try {
 
-                    mCallbacks.getService().joinParticipant(call1.getParticipants().get(0).getCallId(), call2.getParticipants().get(0).getCallId());
+                    if (call_target.hasMultipleParticipants() && !call_to_add.hasMultipleParticipants()) {
 
+                        mCallbacks.getService().addParticipant(call_to_add.getParticipants().get(0), call_target.getId());
+
+                    } else if (call_target.hasMultipleParticipants() && call_to_add.hasMultipleParticipants()) {
+
+                        // We join two conferences
+                        mCallbacks.getService().joinConference(call_to_add.getId(), call_target.getId());
+
+                    } else if (!call_target.hasMultipleParticipants() && call_to_add.hasMultipleParticipants()) {
+
+                        mCallbacks.getService().addParticipant(call_target.getParticipants().get(0), call_to_add.getId());
+
+                    } else {
+                        // We join two single calls to create a conf
+                        mCallbacks.getService().joinParticipant(call_to_add.getParticipants().get(0).getCallId(),
+                                call_target.getParticipants().get(0).getCallId());
+                    }
                     // ArrayList<String> tmp = new ArrayList<String>();
                     // tmp.add(call1.getCallId());
                     // tmp.add(call2.getCallId());
@@ -302,7 +316,7 @@
             mContext = activity;
         }
 
-        public void remove(SipCall transfer) {
+        public void remove(Conference transfer) {
             calls.remove(transfer);
 
         }
@@ -343,12 +357,9 @@
 
         public View getChildView(final int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
 
-            if (convertView == null)
-                convertView = LayoutInflater.from(mContext).inflate(R.layout.expandable_child, null);
-            
+            convertView = LayoutInflater.from(mContext).inflate(R.layout.expandable_child, null);
+
             convertView.setAnimation(AnimationUtils.loadAnimation(getActivity(), R.animator.slide_down));
-            
-            
 
             ((ImageButton) convertView.findViewById(R.id.action_hangup)).setOnClickListener(new OnClickListener() {
 
@@ -367,6 +378,9 @@
                 }
             });
 
+            if(getGroup(groupPosition).isOnHold()){
+                ((Button) convertView.findViewById(R.id.action_hold)).setText("Unhold");
+            }
             ((Button) convertView.findViewById(R.id.action_hold)).setOnClickListener(new OnClickListener() {
 
                 @Override
@@ -439,7 +453,7 @@
             // as new group to expand
             if (groupPosition != lastExpandedGroupPosition) {
                 list.collapseGroup(lastExpandedGroupPosition);
-                
+
             }
 
             super.onGroupExpanded(groupPosition);
@@ -459,16 +473,17 @@
             Conference call = getGroup(groupPosition);
             if (call.getParticipants().size() == 1) {
                 ((TextView) convertView.findViewById(R.id.call_title)).setText(call.getParticipants().get(0).getContact().getmDisplayName());
-                ((TextView) convertView.findViewById(R.id.call_status)).setText(call.getParticipants().get(0).getCallStateString());
+                ((TextView) convertView.findViewById(R.id.call_status)).setText(call.getState());
             } else {
-                ((TextView) convertView.findViewById(R.id.call_title)).setText("Conference with "+call.getParticipants().size()+" participants");
+                ((TextView) convertView.findViewById(R.id.call_title)).setText("Conference with " + call.getParticipants().size() + " participants");
+                ((TextView) convertView.findViewById(R.id.call_status)).setText(call.getState());
             }
 
             ((RelativeLayout) convertView.findViewById(R.id.call_entry)).setOnClickListener(new OnClickListener() {
 
                 @Override
                 public void onClick(View v) {
-                    mCallbacks.onCallSelected(getGroup(groupPosition).getParticipants());
+                    mCallbacks.onCallSelected(getGroup(groupPosition));
 
                 }
             });
diff --git a/src/com/savoirfairelinux/sflphone/fragments/ConferenceDFragment.java b/src/com/savoirfairelinux/sflphone/fragments/ConferenceDFragment.java
index 3c5ae73..7fb6c9a 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/ConferenceDFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/ConferenceDFragment.java
@@ -67,8 +67,8 @@
 
                 Intent in = new Intent();
                 
-                in.putExtra("call1", call_selected);
-                in.putExtra("call2", mAdapter.getItem(pos));
+                in.putExtra("call_to_add", call_selected);
+                in.putExtra("call_target", mAdapter.getItem(pos));
                 getTargetFragment().onActivityResult(getTargetRequestCode(), 0, in);
                 dismiss();
             }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/HomeFragment.java b/src/com/savoirfairelinux/sflphone/fragments/HomeFragment.java
index ded9c96..a5cc407 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/HomeFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/HomeFragment.java
@@ -47,15 +47,13 @@
 import android.widget.Toast;
 
 import com.savoirfairelinux.sflphone.R;
+import com.savoirfairelinux.sflphone.model.Conference;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.service.ISipService;
 
-
 public class HomeFragment extends Fragment {
     private static final String TAG = HomeFragment.class.getSimpleName();
 
-
-
     private Callbacks mCallbacks = sDummyCallbacks;
     Button access_calls;
 
@@ -63,15 +61,16 @@
      * A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity.
      */
     private static Callbacks sDummyCallbacks = new Callbacks() {
-        @Override
-        public void onCallSelected(SipCall c) {
-        }
 
         @Override
         public ISipService getService() {
             Log.i(TAG, "I'm a dummy");
             return null;
         }
+
+        @Override
+        public void resumeCallActivity() {            
+        }
     };
 
     /**
@@ -79,10 +78,11 @@
      * 
      */
     public interface Callbacks {
-        public void onCallSelected(SipCall c);
 
         public ISipService getService();
 
+        public void resumeCallActivity();
+
     }
 
     @Override
@@ -94,25 +94,24 @@
         }
 
         mCallbacks = (Callbacks) activity;
-        
-        
+
     }
-    
+
     @Override
-    public void onResume(){
+    public void onResume() {
         super.onResume();
         if (mCallbacks.getService() != null) {
             try {
                 HashMap<String, SipCall> calls = (HashMap<String, SipCall>) mCallbacks.getService().getCallList();
-                Log.i(TAG, "Call size "+calls.size());
-                access_calls.setText(calls.size()+" on going calls");
+                HashMap<String, Conference> confs = (HashMap<String, Conference>) mCallbacks.getService().getConferenceList();
+                Log.i(TAG, "Call size " + calls.size());
+                access_calls.setText(calls.size() + " on going calls and "+confs.size()+" conferences");
 
-                
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
         }
-        
+
     }
 
     @Override
@@ -124,8 +123,8 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-//        mAdapter = new CallElementAdapter(getActivity(), new ArrayList<SipCall>());
-        
+        // mAdapter = new CallElementAdapter(getActivity(), new ArrayList<SipCall>());
+
     }
 
     @Override
@@ -139,8 +138,6 @@
         // We have a menu item to show in action bar.
         setHasOptionsMenu(true);
 
-        
-
     }
 
     @Override
@@ -149,7 +146,6 @@
 
     }
 
-
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         Log.i(TAG, "onCreateView");
@@ -161,13 +157,16 @@
 
             @Override
             public void onClick(View v) {
-                HashMap<String, SipCall> calls;
+
                 try {
-                    calls = (HashMap<String, SipCall>) mCallbacks.getService().getCallList();
-                    if (calls.size() == 0) {
+                    HashMap<String, SipCall> calls = (HashMap<String, SipCall>) mCallbacks.getService().getCallList();
+                    HashMap<String, Conference> confs = (HashMap<String, Conference>) mCallbacks.getService().getConferenceList();
+                    if (calls.isEmpty() && confs.isEmpty()) {
                         Toast.makeText(getActivity(), "No calls", Toast.LENGTH_SHORT).show();
                     } else {
-                        mCallbacks.onCallSelected((SipCall) calls.values().toArray()[0]);
+                        
+                       mCallbacks.resumeCallActivity();
+                        
                     }
                 } catch (RemoteException e) {
                     Log.e(TAG, e.toString());
@@ -179,5 +178,4 @@
         return inflatedView;
     }
 
-
 }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java b/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
index 7e5a080..c410211 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
@@ -36,6 +36,7 @@
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.loaders.ContactsLoader;
 import com.savoirfairelinux.sflphone.model.CallContact;
+import com.savoirfairelinux.sflphone.model.Conference;
 import com.savoirfairelinux.sflphone.model.SipCall;
 
 public class TransferDFragment extends DialogFragment implements LoaderManager.LoaderCallbacks<Bundle> {
@@ -65,8 +66,8 @@
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         View rootView = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_transfer, null);
 
-        ArrayList<SipCall> calls = getArguments().getParcelableArrayList("calls");
-        final SipCall call_selected = getArguments().getParcelable("call_selected");
+        ArrayList<Conference> calls = getArguments().getParcelableArrayList("calls");
+        final Conference call_selected = getArguments().getParcelable("call_selected");
 
         mAdapter = new SimpleCallListAdapter(getActivity(), calls);
         ListView list = (ListView) rootView.findViewById(R.id.concurrent_calls);
@@ -89,7 +90,7 @@
         mEditText.setAdapter(autoCompleteAdapter);
 
         final AlertDialog a = new AlertDialog.Builder(getActivity()).setView(rootView)
-                .setTitle("Transfer " + call_selected.getContact())
+                .setTitle("Transfer " + call_selected.getParticipants().get(0).getContact().getmDisplayName())
                 .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int whichButton) {
                         
@@ -227,9 +228,9 @@
     private class SimpleCallListAdapter extends BaseAdapter {
 
         private LayoutInflater mInflater;
-        ArrayList<SipCall> calls;
+        ArrayList<Conference> calls;
 
-        public SimpleCallListAdapter(final Context context, ArrayList<SipCall> calls2) {
+        public SimpleCallListAdapter(final Context context, ArrayList<Conference> calls2) {
             super();
             mInflater = LayoutInflater.from(context);
             calls = calls2;
@@ -244,7 +245,7 @@
                 tv = (TextView) mInflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
             }
 
-            tv.setText(calls.get(position).getContact().getmDisplayName());
+            tv.setText(calls.get(position).getParticipants().get(0).getContact().getmDisplayName());
             return tv;
         }
 
@@ -254,7 +255,7 @@
         }
 
         @Override
-        public SipCall getItem(int pos) {
+        public Conference getItem(int pos) {
             return calls.get(pos);
         }
 
diff --git a/src/com/savoirfairelinux/sflphone/interfaces/CallInterface.java b/src/com/savoirfairelinux/sflphone/interfaces/CallInterface.java
index ce89fda..4c70821 100644
--- a/src/com/savoirfairelinux/sflphone/interfaces/CallInterface.java
+++ b/src/com/savoirfairelinux/sflphone/interfaces/CallInterface.java
@@ -16,4 +16,6 @@
 
     public void confChanged(Intent intent);
     
+    public void recordingChanged(Intent intent);
+    
 }
diff --git a/src/com/savoirfairelinux/sflphone/loaders/AccountsLoader.java b/src/com/savoirfairelinux/sflphone/loaders/AccountsLoader.java
index 7194096..be14488 100644
--- a/src/com/savoirfairelinux/sflphone/loaders/AccountsLoader.java
+++ b/src/com/savoirfairelinux/sflphone/loaders/AccountsLoader.java
@@ -55,6 +55,8 @@
             }
         } catch (RemoteException e) {
             Log.e(TAG, e.toString());
+        } catch (NullPointerException e1){
+            Log.e(TAG, e1.toString());
         }
 
         return result;
diff --git a/src/com/savoirfairelinux/sflphone/model/Bubble.java b/src/com/savoirfairelinux/sflphone/model/Bubble.java
index 420fb6a..7d9bf2c 100644
--- a/src/com/savoirfairelinux/sflphone/model/Bubble.java
+++ b/src/com/savoirfairelinux/sflphone/model/Bubble.java
@@ -210,6 +210,19 @@
         canvas.drawBitmap(circle, 0, 0, circlePaint);
 
     }
+    
+
+    /**
+     * Compare bubbles based on call ID
+     */
+    @Override
+    public boolean equals(Object c) {
+        if (c instanceof Bubble && ((Bubble) c).associated_call.getCallId().contentEquals(associated_call.getCallId())) {
+            return true;
+        }
+        return false;
+
+    }
 
     /**
      * When bubble is expanded we need to check on wich action button the user tap
diff --git a/src/com/savoirfairelinux/sflphone/model/BubbleModel.java b/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
index 8650230..c1a87cb 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
@@ -4,6 +4,7 @@
 import java.util.List;
 
 import android.graphics.PointF;
+import android.util.Log;
 
 public class BubbleModel
 {
@@ -182,5 +183,25 @@
 		}
 	}
 
+    public Bubble getBubble(SipCall call) {
+        for(Bubble b : bubbles){
+            if(call == null){
+                Log.e(TAG, "call null");
+            } 
+            if(b.associated_call.getCallId() == null){
+                Log.e(TAG, "id null");
+            }
+            if(b.associated_call.getCallId().contentEquals(call.getCallId()))
+                return b;
+        }
+        return null;
+    }
+
+    public void removeBubble(SipCall sipCall) {
+        
+        bubbles.remove(getBubble(sipCall));
+        
+    }
+
 
 }
diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
index f365ec2..0e3864a 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubblesView.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -34,13 +34,11 @@
 
 import java.util.List;
 
-import android.app.FragmentManager;
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
 import android.graphics.Paint.Align;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
 import android.util.AttributeSet;
@@ -56,7 +54,6 @@
 
 import com.savoirfairelinux.sflphone.client.CallActivity;
 import com.savoirfairelinux.sflphone.fragments.CallFragment;
-import com.savoirfairelinux.sflphone.fragments.TransferDFragment;
 
 public class BubblesView extends SurfaceView implements SurfaceHolder.Callback, OnTouchListener {
     private static final String TAG = BubblesView.class.getSimpleName();
@@ -279,8 +276,18 @@
                         canvas.drawText(first_plan.associated_call.getContact().getmDisplayName(), first_plan.getPosX(), first_plan.getPosY() - 50
                                 * density, getNamePaint(first_plan));
                         canvas.drawText("Transfer", first_plan.getPosX(), first_plan.getPosY() + 70 * density, getNamePaint(first_plan));
-                        canvas.drawText("Hold", first_plan.getPosX() - 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
-                        canvas.drawText("Record", first_plan.getPosX() + 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
+                        if (first_plan.associated_call.isOnHold()) {
+                            canvas.drawText("Unhold", first_plan.getPosX() - 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
+                        } else {
+                            canvas.drawText("Hold", first_plan.getPosX() - 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
+                        }
+                        if (first_plan.associated_call.isRecording()) {
+                            canvas.drawText("Stop\nRecording", first_plan.getPosX() + 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
+                        } else {
+                            canvas.drawText("Record", first_plan.getPosX() + 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
+
+                        }
+
                     }
 
                 } catch (IndexOutOfBoundsException e) {
@@ -344,6 +351,27 @@
         return null;
     }
 
+    public void restartDrawing() {
+        if (thread != null && thread.suspendFlag) {
+            Log.i(TAG, "Relaunch drawing thread");
+            thread.setPaused(false);
+        }
+    }
+
+    public void setFragment(CallFragment callFragment) {
+        callback = callFragment;
+
+    }
+
+    public void stopThread() {
+        if (thread != null && thread.suspendFlag) {
+            Log.i(TAG, "Stop drawing thread");
+            thread.setRunning(false);
+            thread.setPaused(false);
+        }
+
+    }
+
     class MyOnGestureListener implements OnGestureListener {
         @Override
         public boolean onDown(MotionEvent event) {
@@ -360,8 +388,12 @@
                         expand.retract();
                         break;
                     case 1:
-                        Log.d("Main", "onCallSuspended");
-                        ((CallActivity) callback.getActivity()).onCallSuspended(expand.associated_call);
+                        if (expand.associated_call.isOnHold()) {
+                            ((CallActivity) callback.getActivity()).onCallResumed(expand.associated_call);
+                        } else {
+                            ((CallActivity) callback.getActivity()).onCallSuspended(expand.associated_call);
+                        }
+
                         break;
                     case 2:
                         Log.d("Main", "onRecordCall");
@@ -450,17 +482,4 @@
             return true;
         }
     }
-
-    public void restartDrawing() {
-        if (thread != null && thread.suspendFlag) {
-            Log.i(TAG, "Relaunch drawing thread");
-            thread.setPaused(false);
-        }
-    }
-
-    public void setFragment(CallFragment callFragment) {
-        callback = callFragment;
-
-    }
-
 }
diff --git a/src/com/savoirfairelinux/sflphone/model/CallContact.java b/src/com/savoirfairelinux/sflphone/model/CallContact.java
index 75c8b6b..4e3ae1a 100644
--- a/src/com/savoirfairelinux/sflphone/model/CallContact.java
+++ b/src/com/savoirfairelinux/sflphone/model/CallContact.java
@@ -37,7 +37,6 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.provider.ContactsContract.Profile;
-import android.util.Log;
 
 public class CallContact implements Parcelable {
 
@@ -49,7 +48,7 @@
 
     private CallContact(long cID, String displayName, long photoID, ArrayList<Phone> p, ArrayList<Phone> sip, String mail) {
         id = cID;
-        mDisplayName = displayName;
+        mDisplayName = displayName.substring(0, displayName.length() > 10 ? 10 : displayName.length());;
         phones = p;
         sip_phones = sip;
         mEmail = mail;
@@ -68,10 +67,6 @@
         return mDisplayName;
     }
 
-    public void setmDisplayName(String mDisplayName) {
-        this.mDisplayName = mDisplayName;
-    }
-
     public long getPhoto_id() {
         return photo_id;
     }
@@ -131,6 +126,7 @@
 
         public ContactBuilder startNewContact(long id, String displayName, long photo_id) {
             contactID = id;
+            
             contactName = displayName;
             contactPhoto = photo_id;
             phones = new ArrayList<Phone>();
@@ -169,7 +165,6 @@
             CallContact result = null;
             if (mProfileCursor.getCount() > 0) {
                 mProfileCursor.moveToFirst();
-                Log.i("CallContact", "THERE IS AN ENTRY");
                 result = new CallContact(mProfileCursor.getLong(mProfileCursor.getColumnIndex(Profile._ID)), displayName,
                         mProfileCursor.getLong(mProfileCursor.getColumnIndex(Profile.PHOTO_ID)), new ArrayList<Phone>(),
                         new ArrayList<CallContact.Phone>(), "");
diff --git a/src/com/savoirfairelinux/sflphone/model/Conference.aidl b/src/com/savoirfairelinux/sflphone/model/Conference.aidl
new file mode 100644
index 0000000..a959fe3
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/model/Conference.aidl
@@ -0,0 +1,4 @@
+package com.savoirfairelinux.sflphone.model;
+
+
+parcelable Conference;
\ No newline at end of file
diff --git a/src/com/savoirfairelinux/sflphone/model/Conference.java b/src/com/savoirfairelinux/sflphone/model/Conference.java
index 26ddf63..02d06c7 100644
--- a/src/com/savoirfairelinux/sflphone/model/Conference.java
+++ b/src/com/savoirfairelinux/sflphone/model/Conference.java
@@ -9,8 +9,9 @@
 public class Conference implements Parcelable {
 
     private String id;
-    private String state;
+    private String state = "";
     private ArrayList<SipCall> participants;
+    private boolean recording;
 
     public interface state {
         int ACTIVE_ATTACHED = 0;
@@ -68,6 +69,9 @@
     }
 
     public String getState() {
+        if(participants.size() == 1){
+            return participants.get(0).getCallStateString();
+        }
         return state;
     }
 
@@ -95,4 +99,32 @@
         return null;
     }
 
+    public boolean hasMultipleParticipants() {
+        return participants.size() > 1;
+    }
+
+    public boolean isOnHold() {
+        if(participants.size() == 1 && participants.get(0).isOnHold())
+            return true;
+        return state.contentEquals("HOLD");
+    }
+
+    public void setRecording(boolean b) {
+        recording = b;
+    }
+
+    public boolean isRecording() {
+        return recording;
+    }
+
+    public boolean isOnGoing() {
+        if(participants.size() == 1 && participants.get(0).isOngoing())
+            return true;
+        
+        if (participants.size() > 1)
+            return true;
+        
+        return false;
+    }
+
 }
diff --git a/src/com/savoirfairelinux/sflphone/model/SipCall.java b/src/com/savoirfairelinux/sflphone/model/SipCall.java
index 2e7018d..3f38733 100644
--- a/src/com/savoirfairelinux/sflphone/model/SipCall.java
+++ b/src/com/savoirfairelinux/sflphone/model/SipCall.java
@@ -45,7 +45,8 @@
     private String mCallID = "";
     private String mAccountID = "";
     private CallContact contact = null;
-    
+    private boolean isRecording = false;
+
     public static final String USER_ID = "user_id";
 
     private int mCallType = state.CALL_TYPE_UNDETERMINED;
@@ -59,24 +60,15 @@
     private SipCall(Parcel in) {
         ArrayList<String> list = in.createStringArrayList();
 
-        // Don't mess with this order!!!
         mCallID = list.get(0);
         mAccountID = list.get(1);
-        // mDisplayName = list.get(2);
-        // mPhone = list.get(3);
-        // mEmail = list.get(4);
-        // mRemoteContact = list.get(5);
-
         contact = in.readParcelable(CallContact.class.getClassLoader());
-
+        isRecording = in.readByte() == 1;
         mCallType = in.readInt();
         mCallState = in.readInt();
         mMediaState = in.readInt();
     }
 
-    // public SipCall(Intent call) {
-
-    // }
 
     public SipCall(String id, String account, int call_type, int call_state, int media_state, CallContact c) {
         mCallID = id;
@@ -87,8 +79,6 @@
         contact = c;
     }
 
-    // public SipCall() {
-    // }
 
     public interface state {
         public static final int CALL_TYPE_UNDETERMINED = 0;
@@ -127,6 +117,7 @@
 
         out.writeStringList(list);
         out.writeParcelable(contact, 0);
+        out.writeByte((byte) (isRecording ? 1 : 0));
         out.writeInt(mCallType);
         out.writeInt(mCallState);
         out.writeInt(mMediaState);
@@ -269,6 +260,14 @@
         return mMediaState;
     }
 
+    public boolean isRecording() {
+        return isRecording;
+    }
+
+    public void setRecording(boolean isRecording) {
+        this.isRecording = isRecording;
+    }
+
     public static class SipCallBuilder {
 
         private String bCallID = "";
@@ -332,7 +331,7 @@
 
         public static SipCall buildMyselfCall(ContentResolver cr, String displayName) {
             return new SipCall("default", "default", SipCall.state.CALL_TYPE_UNDETERMINED, state.CALL_STATE_NONE, state.MEDIA_STATE_NONE,
-                    CallContact.ContactBuilder.buildUserContact(cr, ""));
+                    CallContact.ContactBuilder.buildUserContact(cr, displayName));
 
         }
 
@@ -401,6 +400,7 @@
 
     }
 
+
     public boolean isOngoing() {
         if (mCallState == state.CALL_STATE_RINGING || mCallState == state.CALL_STATE_NONE || mCallState == state.CALL_STATE_FAILURE
                 || mCallState == state.CALL_STATE_BUSY || mCallState == state.CALL_STATE_HUNGUP)
@@ -409,4 +409,8 @@
         return true;
     }
 
+    public boolean isOnHold() {
+        return mCallState == state.CALL_STATE_HOLD;
+    }
+
 }
diff --git a/src/com/savoirfairelinux/sflphone/receivers/CallReceiver.java b/src/com/savoirfairelinux/sflphone/receivers/CallReceiver.java
index 4642b54..f025212 100644
--- a/src/com/savoirfairelinux/sflphone/receivers/CallReceiver.java
+++ b/src/com/savoirfairelinux/sflphone/receivers/CallReceiver.java
@@ -38,37 +38,36 @@
 import com.savoirfairelinux.sflphone.interfaces.CallInterface;
 import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
 
-public class CallReceiver extends BroadcastReceiver{
-    
+public class CallReceiver extends BroadcastReceiver {
+
     static final String TAG = CallReceiver.class.getSimpleName();
 
     CallInterface callback;
-    
-    public CallReceiver(CallInterface client){
+
+    public CallReceiver(CallInterface client) {
         callback = client;
     }
-    
-	@Override
-	public void onReceive(Context context, Intent intent)
-	{
-	    if( intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)){
-	        callback.incomingCall(intent);
-	    } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)){
-	        callback.incomingText(intent);
-	    } else if(intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)){
-	        callback.callStateChanged(intent);
-	    } else if(intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)){
-            callback.confCreated(intent);
-        }else if(intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)){
-            callback.confRemoved(intent);
-        }else if(intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)){
-            callback.confChanged(intent);
-        }else {
-	        Log.e(TAG, "Unknown action: "+intent.getAction());
-	    }
 
-	}
-	
-	
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
+            callback.incomingCall(intent);
+        } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
+            callback.incomingText(intent);
+        } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
+            callback.callStateChanged(intent);
+        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
+            callback.confCreated(intent);
+        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
+            callback.confRemoved(intent);
+        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
+            callback.confChanged(intent);
+        } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
+            callback.recordingChanged(intent);
+        } else {
+            Log.e(TAG, "Unknown action: " + intent.getAction());
+        }
+
+    }
 
 }
diff --git a/src/com/savoirfairelinux/sflphone/receivers/IncomingReceiver.java b/src/com/savoirfairelinux/sflphone/receivers/IncomingReceiver.java
index 69cbed9..4fab834 100644
--- a/src/com/savoirfairelinux/sflphone/receivers/IncomingReceiver.java
+++ b/src/com/savoirfairelinux/sflphone/receivers/IncomingReceiver.java
@@ -10,7 +10,6 @@
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.util.Log;
-import android.widget.Toast;
 
 import com.savoirfairelinux.sflphone.model.CallContact;
 import com.savoirfairelinux.sflphone.model.Conference;
@@ -90,26 +89,28 @@
                 } else {
                     // Check if call is in a conference
                     Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
-                    while(it.hasNext()){
+                    while (it.hasNext()) {
                         Conference tmp = it.next().getValue();
-                        for(SipCall c : tmp.getParticipants()){
-                            if(c.getCallId().contentEquals(b.getString("CallID")));
-                                c.setCallState(SipCall.state.CALL_STATE_HOLD);
+                        for (SipCall c : tmp.getParticipants()) {
+                            if (c.getCallId().contentEquals(b.getString("CallID")))
+                                ;
+                            c.setCallState(SipCall.state.CALL_STATE_HOLD);
                         }
                     }
                 }
             } else if (newState.equals("UNHOLD")) {
-                
+
                 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
                     callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
                 } else {
                     // Check if call is in a conference
                     Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
-                    while(it.hasNext()){
+                    while (it.hasNext()) {
                         Conference tmp = it.next().getValue();
-                        for(SipCall c : tmp.getParticipants()){
-                            if(c.getCallId().contentEquals(b.getString("CallID")));
-                                c.setCallState(SipCall.state.CALL_STATE_CURRENT);
+                        for (SipCall c : tmp.getParticipants()) {
+                            if (c.getCallId().contentEquals(b.getString("CallID")))
+                                ;
+                            c.setCallState(SipCall.state.CALL_STATE_CURRENT);
                         }
                     }
                 }
@@ -127,11 +128,12 @@
 
             Log.i(TAG, "Received" + intent.getAction());
             Conference created = new Conference(intent.getStringExtra("confID"));
-            ArrayList<String> all_participants;
+
             try {
-                all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
+                ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
                 for (String participant : all_participants) {
                     created.getParticipants().add(callback.getCurrent_calls().get(participant));
+                    callback.getCurrent_calls().remove(participant);
                 }
                 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
                 toSend.putExtra("newconf", created);
@@ -150,13 +152,58 @@
                 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
             }
             callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
-            Toast.makeText(callback, "Removed conf ", Toast.LENGTH_SHORT).show();
+            callback.sendBroadcast(intent);
 
         } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
 
+            ArrayList<String> all_participants;
+            try {
+                all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
+                for (String participant : all_participants) {
+                    if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
+                            && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
+                        callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
+                                .add(callback.getCurrent_calls().get(participant));
+                        callback.getCurrent_calls().remove(participant);
+                        callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
+                        callback.sendBroadcast(intent);
+                        return;
+                    }
+                }
+            } catch (RemoteException e) {
+                e.printStackTrace();
+            }
+
             Log.i(TAG, "Received" + intent.getAction());
             callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
-            Toast.makeText(callback, "Changing conf state: " + intent.getStringExtra("State"), Toast.LENGTH_SHORT).show();
+            callback.sendBroadcast(intent);
+
+        } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
+
+            Log.i(TAG, "Received" + intent.getAction());
+
+            try {
+                if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
+                    callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+                } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null){
+                    callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+                } else {
+                    // A call in a conference has been put on hold
+                    Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
+                    while(it.hasNext()){
+                        Conference c = it.next();
+                        if(c.getCall(intent.getStringExtra("id")) != null)
+                            c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+                    }
+                }
+                // Re sending the same intent to the app
+                callback.sendBroadcast(intent);
+                ;
+            } catch (RemoteException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+
         }
 
     }
diff --git a/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java b/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
index f8a352f..965d2b8 100644
--- a/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
+++ b/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
@@ -18,6 +18,7 @@
     static public final String CONF_CREATED = "conf_created";
     static public final String CONF_REMOVED = "conf_removed";
     static public final String CONF_CHANGED = "conf_changed";
+    static public final String RECORD_STATE_CHANGED = "record_state";
 
 
     public CallManagerCallBack(Context context) {
@@ -33,13 +34,24 @@
     @Override
     public void on_call_state_changed(String callID, String state) {
         Log.d(TAG, "on_call_state_changed(" + callID + ", " + state + ")");
-        sendCallStateChangedMessage(callID, state);
+        Bundle bundle = new Bundle();
+        bundle.putString("CallID", callID);
+        bundle.putString("State", state);
+        Intent intent = new Intent(CALL_STATE_CHANGED);
+        intent.putExtra("com.savoirfairelinux.sflphone.service.newstate", bundle);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
 
     @Override
     public void on_incoming_call(String accountID, String callID, String from) {
         Log.d(TAG, "on_incoming_call(" + accountID + ", " + callID + ", " + from + ")");
-        sendIncomingCallMessage(accountID, callID, from);
+        Bundle bundle = new Bundle();
+        bundle.putString("AccountID", accountID);
+        bundle.putString("CallID", callID);
+        bundle.putString("From", from);
+        Intent intent = new Intent(INCOMING_CALL);
+        intent.putExtra("com.savoirfairelinux.sflphone.service.newcall", bundle);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
     
     @Override
@@ -58,12 +70,18 @@
     @Override
     public void on_incoming_message(String ID, String from, String msg){
         Log.w(TAG,"on_incoming_message:"+msg);
-        sendIncomingTextMessage(ID, from, msg);
+        Bundle bundle = new Bundle();
+
+        bundle.putString("CallID", ID);
+        bundle.putString("From", from);
+        bundle.putString("Msg", msg);
+        Intent intent = new Intent(INCOMING_TEXT); 
+        intent.putExtra("com.savoirfairelinux.sflphone.service.newtext", bundle);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
     
     @Override
     public void on_conference_removed(String confID){
-        Log.w(TAG,"CONFERENCE REMOVED:"+confID);
         Intent intent = new Intent(CONF_REMOVED);
         intent.putExtra("confID", confID);
         LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
@@ -71,41 +89,18 @@
     
     @Override
     public void on_conference_state_changed(String confID, String state){
-        Log.w(TAG,"CONFERENCE STATE CHANGED:"+confID);
         Intent intent = new Intent(CONF_CHANGED);
         intent.putExtra("confID", confID);
         intent.putExtra("State", state);
         LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
-
-    private void sendCallStateChangedMessage(String callID, String state) {
-        Bundle bundle = new Bundle();
-        bundle.putString("CallID", callID);
-        bundle.putString("State", state);
-        Intent intent = new Intent(CALL_STATE_CHANGED);
-        intent.putExtra("com.savoirfairelinux.sflphone.service.newstate", bundle);
-        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
-    }
-
-    private void sendIncomingCallMessage(String accountID, String callID, String from) {
-        Bundle bundle = new Bundle();
-        bundle.putString("AccountID", accountID);
-        bundle.putString("CallID", callID);
-        bundle.putString("From", from);
-        Intent intent = new Intent(INCOMING_CALL);
-        intent.putExtra("com.savoirfairelinux.sflphone.service.newcall", bundle);
-        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
-    }
     
-    private void sendIncomingTextMessage(String id, String from, String msg) {
-        Bundle bundle = new Bundle();
-
-        bundle.putString("CallID", id);
-        bundle.putString("From", from);
-        bundle.putString("Msg", msg);
-        Intent intent = new Intent(INCOMING_TEXT); 
-        intent.putExtra("com.savoirfairelinux.sflphone.service.newtext", bundle);
+    @Override
+    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);
         LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
-        
     }
+
 }
diff --git a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
index 3a6cb3c..3a79892 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
@@ -1,6 +1,7 @@
 package com.savoirfairelinux.sflphone.service;
 
 import com.savoirfairelinux.sflphone.model.SipCall;
+import com.savoirfairelinux.sflphone.model.Conference;
 
 interface ISipService {
     /*void placeCall(String accountID, in String callID, in String to);*/
@@ -34,6 +35,7 @@
     void setRecordingCall(in String id);
     boolean startRecordedFilePlayback(in String filepath);
 	void stopRecordedFilePlayback(in String filepath);
+	boolean isRecording(in String id);
     
     /* IM */
     void sendTextMessage(in String callID, in String message, in String from);
@@ -53,12 +55,14 @@
     void hangUpConference(in String confID);
     void holdConference(in String confID);
     void unholdConference(in String confID);
-    List getConferenceList();
+    Map getConferenceList();
     Map getCallList();
     List getParticipantList(in String confID);
     String getConferenceId(in String callID);
     String getConferenceDetails(in String callID);
     
+    Conference getCurrentCall();
+    
     
     /*   */
     
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index 94afa54..3ab830e 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -114,6 +114,7 @@
         callFilter.addAction(CallManagerCallBack.CONF_CREATED);
         callFilter.addAction(CallManagerCallBack.CONF_REMOVED);
         callFilter.addAction(CallManagerCallBack.CONF_CHANGED);
+        callFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
         receiver = new IncomingReceiver(this, mBinder);
         LocalBroadcastManager.getInstance(this).registerReceiver(receiver, callFilter);
 
@@ -771,28 +772,29 @@
         }
 
         @Override
-        public List getConferenceList() throws RemoteException {
-            class ConfList extends SipRunnableWithReturn {
-                @Override
-                protected StringVect doRun() throws SameThreadException {
-                    Log.i(TAG, "SipService.getConferenceList() thread running...");
-                    return callManagerJNI.getConferenceList();
-                }
-            }
-            ;
-            ConfList runInstance = new ConfList();
-            getExecutor().execute(runInstance);
-            while (!runInstance.isDone()) {
-                // Log.w(TAG, "Waiting for getConferenceList");
-            }
-            StringVect swigvect = (StringVect) runInstance.getVal();
-
-            ArrayList<String> nativelist = new ArrayList<String>();
-
-            for (int i = 0; i < swigvect.size(); i++)
-                nativelist.add(swigvect.get(i));
-
-            return nativelist;
+        public HashMap<String, Conference> getConferenceList() throws RemoteException {
+//            class ConfList extends SipRunnableWithReturn {
+//                @Override
+//                protected StringVect doRun() throws SameThreadException {
+//                    Log.i(TAG, "SipService.getConferenceList() thread running...");
+//                    return callManagerJNI.getConferenceList();
+//                }
+//            }
+//            ;
+//            ConfList runInstance = new ConfList();
+//            getExecutor().execute(runInstance);
+//            while (!runInstance.isDone()) {
+//                // Log.w(TAG, "Waiting for getConferenceList");
+//            }
+//            StringVect swigvect = (StringVect) runInstance.getVal();
+//
+//            ArrayList<String> nativelist = new ArrayList<String>();
+//
+//            for (int i = 0; i < swigvect.size(); i++)
+//                nativelist.add(swigvect.get(i));
+//
+//            return nativelist;
+            return current_confs;
         }
 
         @Override
@@ -880,6 +882,26 @@
         }
         
         @Override
+        public boolean isRecording(final String id) throws RemoteException {
+            class IsRecording extends SipRunnableWithReturn {
+
+                @Override
+                protected Boolean doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.isRecording() thread running...");
+                    return callManagerJNI.getIsRecording(id);
+                }
+            }
+
+            IsRecording runInstance = new IsRecording();
+            getExecutor().execute(runInstance);
+            while (!runInstance.isDone()) {
+            }
+
+            return (Boolean) runInstance.getVal();
+            
+        }
+        
+        @Override
         public boolean startRecordedFilePlayback(final String filepath) throws RemoteException {
             getExecutor().execute(new SipRunnable() {
                 @Override
@@ -1027,6 +1049,24 @@
             nm.cancel(NOTIFICATION_ID);
         }
 
+        @Override
+        public Conference getCurrentCall() throws RemoteException {
+            for(SipCall i : current_calls.values()){
+                if(i.isOngoing()){
+                    Conference tmp = new Conference("-1");
+                    tmp.getParticipants().add(i);
+                    return tmp;
+                }
+            }
+            
+            if(!current_confs.isEmpty()){
+                return (Conference) current_confs.values().toArray()[0];
+            }
+            return null;
+        }
+
+        
+
 
 
     };
