* #26145 Thread was locking UI
* #26115 Unattended transfer working
diff --git a/src/com/savoirfairelinux/sflphone/adapters/ContactsAdapter.java b/src/com/savoirfairelinux/sflphone/adapters/ContactsAdapter.java
index 2f4f9f8..f84ce07 100644
--- a/src/com/savoirfairelinux/sflphone/adapters/ContactsAdapter.java
+++ b/src/com/savoirfairelinux/sflphone/adapters/ContactsAdapter.java
@@ -1,18 +1,10 @@
 package com.savoirfairelinux.sflphone.adapters;
 
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
-import android.content.ContentResolver;
-import android.content.ContentUris;
 import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.provider.ContactsContract;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 30e7066..6147e57 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -54,7 +54,7 @@
 import android.widget.Toast;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.fragments.CallActionsDFragment;
+import com.savoirfairelinux.sflphone.fragments.TransferDFragment;
 import com.savoirfairelinux.sflphone.fragments.CallFragment;
 import com.savoirfairelinux.sflphone.fragments.CallListFragment;
 import com.savoirfairelinux.sflphone.interfaces.CallInterface;
@@ -189,6 +189,7 @@
                             .setAccountID(service.getAccountList().get(1).toString()).setCallType(SipCall.state.CALL_TYPE_OUTGOING).build();
                     Bundle b = new Bundle();
                     b.putParcelable("CallInfo", call);
+                    Log.i(TAG, "Arguments set");
                     mCurrentCallFragment.setArguments(b);
                 } catch (RemoteException e) {
                     // TODO Auto-generated catch block
@@ -245,6 +246,7 @@
         try {
             map = (HashMap<String, SipCall>) service.getCallList();
             if (map.size() == 0) {
+                
                 finish();
             }
         } catch (RemoteException e) {
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
index d364aab..816e4ed 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
@@ -431,7 +431,7 @@
             break;
         case REQUEST_CODE_CALL:
             Log.w(TAG, "Result out of CallActivity");
-            
+
             break;
         }
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
index 124e806..90342d5 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
@@ -60,324 +60,333 @@
 
 public class CallFragment extends Fragment implements Callback {
 
-	static final String TAG = "CallFragment";
+    static final String TAG = "CallFragment";
 
-	static final float BUBBLE_SIZE = 75;
-	static final float ATTRACTOR_SIZE = 40;
+    static final float BUBBLE_SIZE = 75;
+    static final float ATTRACTOR_SIZE = 40;
 
-	private SipCall mCall;
+    private SipCall mCall;
 
-	private TextView callStatusTxt;
-	private BubblesView view;
-	private BubbleModel model;
+    private TextView callStatusTxt;
+    private BubblesView view;
+    private BubbleModel model;
 
-	private Callbacks mCallbacks = sDummyCallbacks;
+    private Callbacks mCallbacks = sDummyCallbacks;
 
-	private HashMap<CallContact, Bubble> contacts = new HashMap<CallContact, Bubble>();
+    private HashMap<CallContact, Bubble> contacts = new HashMap<CallContact, Bubble>();
 
-	private CallContact myself;
+    private CallContact myself;
 
-	private Bitmap hangup_icon;
-	private Bitmap call_icon;
+    private Bitmap hangup_icon;
+    private Bitmap call_icon;
 
-	@Override
-	public void onCreate(Bundle savedBundle) {
-		super.onCreate(savedBundle);
-		model = new BubbleModel(getResources().getDisplayMetrics().density);
-		//metrics = getResources().getDisplayMetrics();
-		//screenCenter = new PointF(metrics.widthPixels / 2, metrics.heightPixels / 3);
+    @Override
+    public void onCreate(Bundle savedBundle) {
+        super.onCreate(savedBundle);
+        model = new BubbleModel(getResources().getDisplayMetrics().density);
+        Bundle b = getArguments();
 
-		Bundle b = getArguments();
+        mCall = b.getParcelable("CallInfo");
 
-		mCall = b.getParcelable("CallInfo");
-		//mCall.
-	}
+    }
 
-	/**
-	 * 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 onSendMessage(SipCall call, String msg) {
-		}
+    /**
+     * 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 onSendMessage(SipCall call, String msg) {
+        }
 
-		@Override
-		public void callContact(SipCall call) {
-		}
+        @Override
+        public void callContact(SipCall call) {
+        }
 
-		@Override
-		public void onCallAccepted(SipCall call) {
-		}
+        @Override
+        public void onCallAccepted(SipCall call) {
+        }
 
-		@Override
-		public void onCallRejected(SipCall call) {
-		}
+        @Override
+        public void onCallRejected(SipCall call) {
+        }
 
-		@Override
-		public void onCallEnded(SipCall call) {
-		}
+        @Override
+        public void onCallEnded(SipCall call) {
+        }
 
-		@Override
-		public void onCallSuspended(SipCall call) {
-		}
+        @Override
+        public void onCallSuspended(SipCall call) {
+        }
 
-		@Override
-		public void onCallResumed(SipCall call) {
-		}
+        @Override
+        public void onCallResumed(SipCall call) {
+        }
 
-		@Override
-		public void onCalltransfered(SipCall call, String to) {
-		}
+        @Override
+        public void onCalltransfered(SipCall call, String to) {
+        }
 
-		@Override
-		public void onRecordCall(SipCall call) {
-		}
+        @Override
+        public void onRecordCall(SipCall call) {
+        }
 
-		@Override
-		public ISipService getService() {
-			return null;
-		}
-	};
+        @Override
+        public ISipService getService() {
+            return null;
+        }
+    };
+    
+    /**
+     * The Activity calling this fragment has to implement this interface
+     * 
+     */
+    public interface Callbacks {
 
-	/**
-	 * The Activity calling this fragment has to implement this interface
-	 * 
-	 */
-	public interface Callbacks {
+        public ISipService getService();
 
-		public ISipService getService();
+        public void callContact(SipCall call);
 
-		public void callContact(SipCall call);
+        public void onCallAccepted(SipCall call);
 
-		public void onCallAccepted(SipCall call);
+        public void onCallRejected(SipCall call);
 
-		public void onCallRejected(SipCall call);
+        public void onCallEnded(SipCall call);
 
-		public void onCallEnded(SipCall call);
+        public void onCallSuspended(SipCall call);
 
-		public void onCallSuspended(SipCall call);
+        public void onCallResumed(SipCall call);
 
-		public void onCallResumed(SipCall call);
+        public void onCalltransfered(SipCall call, String to);
 
-		public void onCalltransfered(SipCall call, String to);
+        public void onRecordCall(SipCall call);
 
-		public void onRecordCall(SipCall call);
+        public void onSendMessage(SipCall call, String msg);
+    }
 
-		public void onSendMessage(SipCall call, String msg);
-	}
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
 
-	@Override
-	public void onAttach(Activity activity) {
-		super.onAttach(activity);
+        if (!(activity instanceof Callbacks)) {
+            throw new IllegalStateException("Activity must implement fragment's callbacks.");
+        }
 
-		if (!(activity instanceof Callbacks)) {
-			throw new IllegalStateException("Activity must implement fragment's callbacks.");
-		}
+        // rootView.requestDisallowInterceptTouchEvent(true);
 
-		//rootView.requestDisallowInterceptTouchEvent(true);
+        mCallbacks = (Callbacks) activity;
+        myself = CallContact.ContactBuilder.buildUserContact(activity.getContentResolver(), "");
 
-		mCallbacks = (Callbacks) activity;
-		myself = CallContact.ContactBuilder.buildUserContact(activity.getContentResolver(), "");
-		
-	}
+    }
 
-	@Override
-	public void onDetach() {
-		super.onDetach();
-		mCallbacks = sDummyCallbacks;
-		//rootView.requestDisallowInterceptTouchEvent(false);
-	}
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        mCallbacks = sDummyCallbacks;
+        // rootView.requestDisallowInterceptTouchEvent(false);
+    }
+    
+    @Override
+    public void onStop(){
+        super.onStop();
+    }
 
-	@Override
-	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-		ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.frag_call, container, false);
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.frag_call, container, false);
 
-		view = (BubblesView) rootView.findViewById(R.id.main_view);
-		view.setModel(model);
-		view.getHolder().addCallback(this);
+        view = (BubblesView) rootView.findViewById(R.id.main_view);
+        view.setModel(model);
+        view.getHolder().addCallback(this);
 
-		callStatusTxt = (TextView) rootView.findViewById(R.id.call_status_txt);
+        callStatusTxt = (TextView) rootView.findViewById(R.id.call_status_txt);
 
-		hangup_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hangup);
-		call_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_call);
+        hangup_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hangup);
+        call_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_call);
 
-		// Do nothing here, the view is not initialized yet.
-		return rootView;
-	}
+        // Do nothing here, the view is not initialized yet.
+        return rootView;
+    }
 
-	private void initNormalStateDisplay() {
-		Log.i(TAG, "Start normal display");
+    private void initNormalStateDisplay() {
+        Log.i(TAG, "Start normal display");
 
-		callStatusTxt.setText("0 min");
+        callStatusTxt.setText("0 min");
 
-		getBubbleFor(mCall.getContacts().get(0), model.width/2, model.height/3);
-		getBubbleFor(myself, model.width/2, model.height/2);
+        int radiusCalls = model.width / 2 - 150;
+        int angle_part = 360 / mCall.getContacts().size();
+        double dX = 0;
+        double dY = 0;
 
-		model.clearAttractors();
-		model.addAttractor(new Attractor(new PointF(model.width / 2, model.height * .8f), ATTRACTOR_SIZE, new Attractor.Callback() {
-			@Override
-			public boolean onBubbleSucked(Bubble b) {
-				Log.w(TAG, "Bubble sucked ! ");
-				mCallbacks.onCallEnded(mCall);
-				bubbleRemoved(b);
-				return true;
-			}
-		}, hangup_icon));
+        getBubbleFor(myself, model.width / 2, model.height / 2);
+        for (int i = 0; i < mCall.getContacts().size(); ++i) {
+            dX = Math.cos(Math.toRadians(angle_part * i)) * radiusCalls;
+            dY = Math.sin(Math.toRadians(angle_part * i)) * radiusCalls;
+            
+            getBubbleFor(mCall.getContacts().get(i),(int) (model.width / 2 + dX), (int) (model.height / 2 + dY));
+        }
+
+        model.clearAttractors();
+        model.addAttractor(new Attractor(new PointF(model.width / 2, model.height * .8f), ATTRACTOR_SIZE, new Attractor.Callback() {
+            @Override
+            public boolean onBubbleSucked(Bubble b) {
+                Log.w(TAG, "Bubble sucked ! ");
+                mCallbacks.onCallEnded(mCall);
+                bubbleRemoved(b);
+                return true;
+            }
+        }, hangup_icon));
 
-	}
+    }
 
-	private void initIncomingCallDisplay() {
-		Log.i(TAG, "Start incoming display");
+    private void initIncomingCallDisplay() {
+        Log.i(TAG, "Start incoming display");
 
-		callStatusTxt.setText("Incomming call");
+        callStatusTxt.setText("Incomming call");
 
-		Bubble contact_bubble = getBubbleFor(mCall.getContacts().get(0), model.width/2, model.height/2);
-		contacts.put(mCall.getContacts().get(0), contact_bubble);
+        Bubble contact_bubble = getBubbleFor(mCall.getContacts().get(0), model.width / 2, model.height / 2);
+        contacts.put(mCall.getContacts().get(0), contact_bubble);
 
-		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(mCall);
-				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(mCall);
-				bubbleRemoved(b);
-				return true;
-			}
-		}, hangup_icon));
-	}
+        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(mCall);
+                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(mCall);
+                bubbleRemoved(b);
+                return true;
+            }
+        }, hangup_icon));
+    }
 
-	private void initOutGoingCallDisplay() {
-		Log.i(TAG, "Start outgoing display");
+    private void initOutGoingCallDisplay() {
+        Log.i(TAG, "Start outgoing display");
 
-		callStatusTxt.setText("Calling...");
+        callStatusTxt.setText("Calling...");
 
-		// TODO off-thread image loading
-		getBubbleFor(mCall.getContacts().get(0), model.width/2, model.height/3);
-		getBubbleFor(myself, model.width/2, model.height/2);
+        // TODO off-thread image loading
+        getBubbleFor(mCall.getContacts().get(0), model.width / 2, model.height / 3);
+        getBubbleFor(myself, model.width / 2, model.height / 2);
 
-		model.clearAttractors();
-		model.addAttractor(new Attractor(new PointF(model.width / 2, model.height * .8f), 40, new Attractor.Callback() {
-			@Override
-			public boolean onBubbleSucked(Bubble b) {
-				Log.w(TAG, "Bubble sucked ! ");
-				mCallbacks.onCallEnded(mCall);
-				bubbleRemoved(b);
-				return true;
-			}
-		}, hangup_icon));
-	}
+        model.clearAttractors();
+        model.addAttractor(new Attractor(new PointF(model.width / 2, model.height * .8f), 40, new Attractor.Callback() {
+            @Override
+            public boolean onBubbleSucked(Bubble b) {
+                Log.w(TAG, "Bubble sucked ! ");
+                mCallbacks.onCallEnded(mCall);
+                bubbleRemoved(b);
+                return true;
+            }
+        }, hangup_icon));
+    }
 
-	/**
-	 * Retrieves or create a bubble for a given contact.
-	 * If the bubble exists, it is moved to the new location.
-	 * 
-	 * @param contact The contact
-	 * @param x Initial or new x position.
-	 * @param y Initial or new y position.
-	 * @return Bubble corresponding to the contact.
-	 */
-	private Bubble getBubbleFor(CallContact contact, float x, float y) {
-		Bubble contact_bubble = contacts.get(contact);
-		if(contact_bubble != null) {
-			contact_bubble.attractor.set(x, y);
-			return contact_bubble;
-		}
+    /**
+     * Retrieves or create a bubble for a given contact. If the bubble exists, it is moved to the new location.
+     * 
+     * @param contact
+     *            The contact
+     * @param x
+     *            Initial or new x position.
+     * @param y
+     *            Initial or new y position.
+     * @return Bubble corresponding to the contact.
+     */
+    private Bubble getBubbleFor(CallContact contact, float x, float y) {
+        Bubble contact_bubble = contacts.get(contact);
+        if (contact_bubble != null) {
+            contact_bubble.attractor.set(x, y);
+            return contact_bubble;
+        }
 
-		// TODO off-thread image loading
-		if (contact.getPhoto_id() > 0) {
-			Bitmap photo = ContactPictureLoader.loadContactPhoto(getActivity().getContentResolver(), contact.getId());
-			contact_bubble = new Bubble(x, y, BUBBLE_SIZE, photo);
-		} else {
-			contact_bubble = new Bubble(x, y, BUBBLE_SIZE, getActivity(), R.drawable.ic_contact_picture);
-		}
-		contact_bubble.contact = contact;
+        // TODO off-thread image loading
+        if (contact.getPhoto_id() > 0) {
+            Bitmap photo = ContactPictureLoader.loadContactPhoto(getActivity().getContentResolver(), contact.getId());
+            contact_bubble = new Bubble(x, y, BUBBLE_SIZE, photo);
+        } else {
+            contact_bubble = new Bubble(x, y, BUBBLE_SIZE, getActivity(), R.drawable.ic_contact_picture);
+        }
+        contact_bubble.contact = contact;
 
-		model.addBubble(contact_bubble);
-		contacts.put(contact, contact_bubble);
+        model.addBubble(contact_bubble);
+        contacts.put(contact, contact_bubble);
 
-		return contact_bubble;
-	}
+        return contact_bubble;
+    }
 
-	/**
-	 * Should be called when a bubble is removed from the model
-	 */
-	void bubbleRemoved(Bubble b) {
-		if(b.contact == null) {
-			return;
-		}
+    /**
+     * Should be called when a bubble is removed from the model
+     */
+    void bubbleRemoved(Bubble b) {
+        if (b.contact == null) {
+            return;
+        }
 
-		contacts.remove(b.contact);
-	}
+        contacts.remove(b.contact);
+    }
 
-	public void changeCallState(String callID, String newState) {
+    public void changeCallState(String callID, String newState) {
 
-		Log.w(TAG, "Changing call state of "+callID);
-		mCall.printCallInfo();
-		if(!callID.equals(mCall.getCallId()))
-			return;
+        Log.w(TAG, "Changing call state of " + callID);
+        mCall.printCallInfo();
+        if (!callID.equals(mCall.getCallId()))
+            return;
 
-		mCall.setCallState(newState);
-		if(mCall.isOngoing()){
-			initNormalStateDisplay();
-		}
-	}
+        mCall.setCallState(newState);
+        if (mCall.isOngoing()) {
+            initNormalStateDisplay();
+        }
+    }
 
-	public boolean draggingBubble()
-	{
-		return view == null ? false : view.isDraggingBubble();
-	}
+    public boolean draggingBubble() {
+        return view == null ? false : view.isDraggingBubble();
+    }
 
-	@Override
-	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
-	{
-		Log.i(TAG, "Init fragment " + mCall.getCallId());
+    @Override
+    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+        Log.i(TAG, "Init fragment " + mCall.getCallId());
 
-		mCall.printCallInfo();
+        mCall.printCallInfo();
 
-		if (mCall.isIncoming() && mCall.isRinging()) {
-			initIncomingCallDisplay();
-		} else {
-			if (mCall.isRinging()) {
-				initOutGoingCallDisplay();
-			}
-			try {
-				if (mCall.isOutGoing() && mCallbacks.getService().getCall(mCall.getCallId()) == null) {
-					mCallbacks.getService().placeCall(mCall);
-					initOutGoingCallDisplay();
-				} else if(mCall.isOutGoing() && mCall.isRinging()){
-					initOutGoingCallDisplay();
-				}
-			} catch (RemoteException e) {
-				Log.e(TAG, e.toString());
-			}
-		}
+        if (mCall.isIncoming() && mCall.isRinging()) {
+            initIncomingCallDisplay();
+        } else {
+            if (mCall.isRinging()) {
+                initOutGoingCallDisplay();
+            }
+            try {
+                if (mCall.isOutGoing() && mCallbacks.getService().getCall(mCall.getCallId()) == null) {
+                    mCallbacks.getService().placeCall(mCall);
+                    initOutGoingCallDisplay();
+                } else if (mCall.isOutGoing() && mCall.isRinging()) {
+                    initOutGoingCallDisplay();
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, e.toString());
+            }
+        }
 
-		if(mCall.isOngoing()){
-			initNormalStateDisplay();
-		}
+        if (mCall.isOngoing()) {
+            initNormalStateDisplay();
+        }
 
-	}
+    }
 
-	@Override
-	public void surfaceCreated(SurfaceHolder holder)
-	{
-	}
+    @Override
+    public void surfaceCreated(SurfaceHolder holder) {
+    }
 
-	@Override
-	public void surfaceDestroyed(SurfaceHolder holder)
-	{
-	}
+    @Override
+    public void surfaceDestroyed(SurfaceHolder holder) {
+    }
 
     public BubblesView getBubbleView() {
         return view;
-        
-    }
 
+    }
 
 }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
index d308743..f91c24d 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
@@ -51,10 +51,10 @@
 import android.widget.BaseExpandableListAdapter;
 import android.widget.Button;
 import android.widget.ExpandableListView;
-import android.widget.Toast;
-import android.widget.ExpandableListView.OnGroupClickListener;
 import android.widget.ImageButton;
+import android.widget.RelativeLayout;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.model.SipCall;
@@ -67,6 +67,9 @@
 
     CallListAdapter mAdapter;
 
+    public static final int REQUEST_TRANSFER = 10;
+    public static final int REQUEST_CONF = 20;
+
     @Override
     public void onCreate(Bundle savedBundle) {
         super.onCreate(savedBundle);
@@ -127,23 +130,10 @@
         list = (ExpandableListView) rootView.findViewById(R.id.call_list);
         list.setDividerHeight(2);
         list.setGroupIndicator(null);
-        list.setClickable(true);
-
         list.setAdapter(mAdapter);
 
+        list.setClickable(true);
         list.setItemsCanFocus(true);
-        // list.setOnItemClickListener(itemClickListener);
-        // list.setOnItemLongClickListener(itemLongClickListener);
-        list.setOnGroupClickListener(new OnGroupClickListener() {
-
-            @Override
-            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
-                mCallbacks.onCallSelected(mAdapter.getGroup(groupPosition));
-                // if (v.getId() == R.id.expand_button)
-                // Log.i(TAG, "View clicked ");
-                return true;
-            }
-        });
         return rootView;
     }
 
@@ -157,50 +147,90 @@
 
     }
 
-    // OnItemClickListener itemClickListener = new OnItemClickListener() {
-    // @Override
-    // public void onItemClick(AdapterView<?> arg0, View view, final int pos, long arg3) {
-    // Toast.makeText(getActivity(), "ItemClicked", Toast.LENGTH_SHORT).show();
-    // mCallbacks.onCallSelected(mAdapter.getGroup(pos));
-    // }
-    // };
-
-    //
-    // private OnItemLongClickListener itemLongClickListener = new OnItemLongClickListener() {
-    //
-    // @Override
-    // public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
-    //
-    // return false;
-    // }
-    // };
-
-    private void makeTransferDialog() {
+    private void makeTransferDialog(int groupPosition) {
         FragmentManager fm = getFragmentManager();
-        CallActionsDFragment editNameDialog = new CallActionsDFragment();
+        TransferDFragment editNameDialog = new TransferDFragment();
 
         Bundle b = new Bundle();
-        b.putParcelableArrayList("calls", mAdapter.getConcurrentCalls());
-
+        b.putParcelableArrayList("calls", mAdapter.getConcurrentCalls(groupPosition));
+        b.putParcelable("call_selected", mAdapter.getGroup(groupPosition));
         editNameDialog.setArguments(b);
-        editNameDialog.setTargetFragment(this, 10);
+        editNameDialog.setTargetFragment(this, REQUEST_TRANSFER);
         editNameDialog.show(fm, "dialog");
 
     }
 
+    private void makeConferenceDialog(int groupPosition) {
+        FragmentManager fm = getFragmentManager();
+        ConferenceDFragment confDialog = new ConferenceDFragment();
+
+        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;
+        if (requestCode == REQUEST_TRANSFER) {
+            switch (resultCode) {
+            case 0:
+                SipCall c = data.getParcelableExtra("target");
+                transfer = data.getParcelableExtra("transfer");
+                try {
 
-        if (requestCode == 10) {
-            SipCall c = data.getParcelableExtra("selected_call");
-            try {
-                mCallbacks.getService().attendedTransfer(mAdapter.getCurrentCall(), c.getCallId());
-            } catch (RemoteException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
+                    mCallbacks.getService().attendedTransfer(transfer.getCallId(), c.getCallId());
+                    mAdapter.remove(transfer);
+
+                    mAdapter.notifyDataSetChanged();
+                } catch (RemoteException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+                Toast.makeText(getActivity(), "Transfer complete", Toast.LENGTH_LONG).show();
+                break;
+
+            case 1:
+                String to = data.getStringExtra("to_number");
+                transfer = data.getParcelableExtra("transfer");
+                try {
+                    Toast.makeText(getActivity(), "Transferring " + transfer.getContacts().get(0).getmDisplayName() + " to " + to, Toast.LENGTH_SHORT)
+                            .show();
+                    mCallbacks.getService().transfer(transfer.getCallId(), to);
+
+                } catch (RemoteException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+                break;
+
+            default:
+                break;
             }
-            Toast.makeText(getActivity(), "Thats ok", Toast.LENGTH_LONG).show();
+        } else if(requestCode == REQUEST_CONF){
+            switch (resultCode) {
+            case 0:
+                SipCall call1 = data.getParcelableExtra("call1");
+                SipCall call2 = data.getParcelableExtra("call2");
+                try {
+
+                    mCallbacks.getService().createConference(call1.getCallId(), call2.getCallId());
+
+                } catch (RemoteException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+                Toast.makeText(getActivity(), "Conference created", Toast.LENGTH_LONG).show();
+                break;
+
+            default:
+                break;
+            }
         }
     }
 
@@ -221,18 +251,23 @@
             mContext = activity;
         }
 
+        public void remove(SipCall transfer) {
+            calls.remove(transfer);
+
+        }
+
         public String getCurrentCall() {
-            for(int i = 0 ; i < calls.size(); ++i){
-                if(calls.get(i).getCallStateInt() == SipCall.state.CALL_STATE_CURRENT)
+            for (int i = 0; i < calls.size(); ++i) {
+                if (calls.get(i).getCallStateInt() == SipCall.state.CALL_STATE_CURRENT)
                     return calls.get(i).getCallId();
             }
             return "";
         }
 
-        public ArrayList<SipCall> getConcurrentCalls() {
+        public ArrayList<SipCall> getConcurrentCalls(int position) {
             ArrayList<SipCall> toReturn = new ArrayList<SipCall>();
             for (int i = 0; i < calls.size(); ++i) {
-                if (calls.get(i).getCallStateInt() != SipCall.state.CALL_STATE_CURRENT)
+                if (position != i)
                     toReturn.add(calls.get(i));
             }
             return toReturn;
@@ -297,15 +332,16 @@
 
                 @Override
                 public void onClick(View v) {
-
+                    makeConferenceDialog(groupPosition);
                 }
+
             });
 
             ((Button) convertView.findViewById(R.id.action_transfer)).setOnClickListener(new OnClickListener() {
 
                 @Override
                 public void onClick(View v) {
-                    makeTransferDialog();
+                    makeTransferDialog(groupPosition);
                 }
 
             });
@@ -355,6 +391,15 @@
             ((TextView) convertView.findViewById(R.id.call_title)).setText(call.getContacts().get(0).getmDisplayName());
             ((TextView) convertView.findViewById(R.id.call_status)).setText("" + call.getCallStateString());
 
+            ((RelativeLayout) convertView.findViewById(R.id.call_entry)).setOnClickListener(new OnClickListener() {
+
+                @Override
+                public void onClick(View v) {
+                    mCallbacks.onCallSelected(getGroup(groupPosition));
+
+                }
+            });
+
             ((ImageButton) convertView.findViewById(R.id.expand_button)).setOnClickListener(new OnClickListener() {
 
                 @Override
@@ -362,11 +407,11 @@
                     final Animation animRotate = AnimationUtils.loadAnimation(getActivity(), R.animator.anim_rotate);
                     if (isExpanded) {
                         list.collapseGroup(groupPosition);
-//                        ((ImageButton) v).startAnimation(animRotate);
+                        // ((ImageButton) v).startAnimation(animRotate);
                         ((ImageButton) v).setRotation(0);
                     } else {
                         list.expandGroup(groupPosition);
-//                        ((ImageButton) v).startAnimation(animRotate);
+                        // ((ImageButton) v).startAnimation(animRotate);
                         ((ImageButton) v).setRotation(180);
 
                     }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/ConferenceDFragment.java b/src/com/savoirfairelinux/sflphone/fragments/ConferenceDFragment.java
new file mode 100644
index 0000000..f8ba81d
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/fragments/ConferenceDFragment.java
@@ -0,0 +1,170 @@
+package com.savoirfairelinux.sflphone.fragments;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.LoaderManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnShowListener;
+import android.content.Intent;
+import android.content.Loader;
+import android.location.Address;
+import android.location.Geocoder;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.Filter;
+import android.widget.Filterable;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.savoirfairelinux.sflphone.R;
+import com.savoirfairelinux.sflphone.loaders.ContactsLoader;
+import com.savoirfairelinux.sflphone.model.CallContact;
+import com.savoirfairelinux.sflphone.model.SipCall;
+
+public class ConferenceDFragment extends DialogFragment implements LoaderManager.LoaderCallbacks<Bundle> {
+
+
+    SimpleCallListAdapter mAdapter;
+
+    /**
+     * Create a new instance of CallActionsDFragment
+     */
+    static ConferenceDFragment newInstance(int num) {
+        ConferenceDFragment f = new ConferenceDFragment();
+        return f;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Pick a style based on the num.
+        int style = DialogFragment.STYLE_NORMAL, theme = 0;
+        setStyle(style, theme);
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        View rootView = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_conference, null);
+
+        ArrayList<SipCall> calls = getArguments().getParcelableArrayList("calls");
+        final SipCall call_selected = getArguments().getParcelable("call_selected");
+
+        mAdapter = new SimpleCallListAdapter(getActivity(), calls);
+        ListView list = (ListView) rootView.findViewById(R.id.concurrent_calls);
+        list.setAdapter(mAdapter);
+        list.setOnItemClickListener(new OnItemClickListener() {
+
+            @Override
+            public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
+
+                Intent in = new Intent();
+                
+                in.putExtra("call1", call_selected);
+                in.putExtra("call2", mAdapter.getItem(pos));
+                getTargetFragment().onActivityResult(getTargetRequestCode(), 0, in);
+                dismiss();
+            }
+        });
+        list.setEmptyView(rootView.findViewById(R.id.empty_view));
+
+        
+
+        final AlertDialog a = new AlertDialog.Builder(getActivity()).setView(rootView).setTitle("Transfer " + call_selected.getContacts().get(0))
+                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+
+                        dismiss();
+                    }
+                }).create();
+
+        return a;
+    }
+
+    @Override
+    public Loader<Bundle> onCreateLoader(int id, Bundle args) {
+        Uri baseUri;
+
+        if (args != null) {
+            baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(args.getString("filter")));
+        } else {
+            baseUri = Contacts.CONTENT_URI;
+        }
+        ContactsLoader l = new ContactsLoader(getActivity(), baseUri);
+        l.forceLoad();
+        return l;
+    }
+
+    @Override
+    public void onLoadFinished(Loader<Bundle> loader, Bundle data) {
+
+        ArrayList<CallContact> tmp = data.getParcelableArrayList("Contacts");
+
+    }
+
+    @Override
+    public void onLoaderReset(Loader<Bundle> loader) {
+        // Thi is called when the last Cursor provided to onLoadFinished
+        // mListAdapter.swapCursor(null);
+    }
+
+    
+
+    private class SimpleCallListAdapter extends BaseAdapter {
+
+        private LayoutInflater mInflater;
+        ArrayList<SipCall> calls;
+
+        public SimpleCallListAdapter(final Context context, ArrayList<SipCall> calls2) {
+            super();
+            mInflater = LayoutInflater.from(context);
+            calls = calls2;
+        }
+
+        @Override
+        public View getView(final int position, final View convertView, final ViewGroup parent) {
+            final TextView tv;
+            if (convertView != null) {
+                tv = (TextView) convertView;
+            } else {
+                tv = (TextView) mInflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
+            }
+
+            tv.setText(calls.get(position).getContacts().get(0).getmDisplayName());
+            return tv;
+        }
+
+        @Override
+        public int getCount() {
+            return calls.size();
+        }
+
+        @Override
+        public SipCall getItem(int pos) {
+            return calls.get(pos);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return 0;
+        }
+    }
+
+}
diff --git a/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java b/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
index e3dcebe..73a4e76 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
@@ -65,7 +65,7 @@
 
 public class DialingFragment extends Fragment implements LoaderCallbacks<ArrayList<Account>> {
 
-    private static final String TAG = HistoryFragment.class.getSimpleName();
+    private static final String TAG = DialingFragment.class.getSimpleName();
     public static final String ARG_SECTION_NUMBER = "section_number";
     private boolean isReady;
     private ISipService service;
diff --git a/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java b/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java
index ad1e472..1f494a4 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java
@@ -114,7 +114,7 @@
     public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
         View inflatedView = inflater.inflate(R.layout.frag_history, parent, false);
 
-        ((ListView)inflatedView.findViewById(android.R.id.list)).setOnItemClickListener(new OnItemClickListener() {
+        ((ListView) inflatedView.findViewById(android.R.id.list)).setOnItemClickListener(new OnItemClickListener() {
 
             @Override
             public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
@@ -128,18 +128,21 @@
     public void onStart() {
         super.onStart();
         Log.w(TAG, "onStart");
-        
+        getLoaderManager().restartLoader(LoaderConstants.HISTORY_LOADER, null, this);
+
     }
 
-    public void makeNewCall(int position){
+    public void makeNewCall(int position) {
         mCallbacks.onCallDialed(String.valueOf(mAdapter.getItem(position).getAccountID()), mAdapter.getItem(position).getNumber());
     }
 
     @Override
     public Loader<ArrayList<HistoryEntry>> onCreateLoader(int id, Bundle args) {
+
         HistoryLoader loader = new HistoryLoader(getActivity(), mCallbacks.getService());
         loader.forceLoad();
         return loader;
+        
     }
 
     @Override
@@ -155,4 +158,5 @@
         // TODO Auto-generated method stub
 
     }
+
 }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallActionsDFragment.java b/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
similarity index 74%
rename from src/com/savoirfairelinux/sflphone/fragments/CallActionsDFragment.java
rename to src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
index 62d3daa..18bc424 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallActionsDFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
@@ -10,6 +10,7 @@
 import android.app.LoaderManager;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.DialogInterface.OnShowListener;
 import android.content.Intent;
 import android.content.Loader;
 import android.location.Address;
@@ -25,26 +26,29 @@
 import android.widget.ArrayAdapter;
 import android.widget.AutoCompleteTextView;
 import android.widget.BaseAdapter;
+import android.widget.Button;
 import android.widget.Filter;
 import android.widget.Filterable;
 import android.widget.ListView;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.loaders.ContactsLoader;
 import com.savoirfairelinux.sflphone.model.CallContact;
 import com.savoirfairelinux.sflphone.model.SipCall;
 
-public class CallActionsDFragment extends DialogFragment implements LoaderManager.LoaderCallbacks<Bundle>{
+public class TransferDFragment extends DialogFragment implements LoaderManager.LoaderCallbacks<Bundle> {
 
     private AutoCompleteTextView mEditText;
     private AutoCompleteAdapter autoCompleteAdapter;
     SimpleCallListAdapter mAdapter;
+
     /**
      * Create a new instance of CallActionsDFragment
      */
-    static CallActionsDFragment newInstance(int num) {
-        CallActionsDFragment f = new CallActionsDFragment();
+    static TransferDFragment newInstance(int num) {
+        TransferDFragment f = new TransferDFragment();
         return f;
     }
 
@@ -56,33 +60,14 @@
         int style = DialogFragment.STYLE_NORMAL, theme = 0;
         setStyle(style, theme);
     }
-    
-//    @Override
-//    public Dialog onCreateDialog(Bundle savedInstanceState) {   
-//        return new AlertDialog.Builder(getActivity())                
-//                .setPositiveButton(android.R.string.ok,
-//                    new DialogInterface.OnClickListener() {
-//                        public void onClick(DialogInterface dialog, int whichButton) {                          
-//
-//                        }
-//                    }
-//                )
-//                .setNegativeButton(android.R.string.no,
-//                    new DialogInterface.OnClickListener() {
-//                        public void onClick(DialogInterface dialog, int whichButton) {
-//
-//                        }
-//                    }
-//                )
-//                .create();
-//    }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        View rootView = inflater.inflate(R.layout.dialog_action_calls, container);
-        
+    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");
+
         mAdapter = new SimpleCallListAdapter(getActivity(), calls);
         ListView list = (ListView) rootView.findViewById(R.id.concurrent_calls);
         list.setAdapter(mAdapter);
@@ -90,24 +75,58 @@
 
             @Override
             public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
-                
+
                 Intent in = new Intent();
-                in.putExtra("selected_call", mAdapter.getItem(pos));
+                in.putExtra("target", mAdapter.getItem(pos));
+                in.putExtra("transfer", call_selected);
                 getTargetFragment().onActivityResult(getTargetRequestCode(), 0, in);
                 dismiss();
             }
         });
         list.setEmptyView(rootView.findViewById(R.id.empty_view));
-        
+
         mEditText = (AutoCompleteTextView) rootView.findViewById(R.id.external_number);
         mEditText.setAdapter(autoCompleteAdapter);
-        getDialog().setTitle("Transfer");
 
-        
+        final AlertDialog a = new AlertDialog.Builder(getActivity()).setView(rootView)
+                .setTitle("Transfer " + call_selected.getContacts().get(0))
+                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                        
+                    }
+                }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
 
-        return rootView;
+                        dismiss();
+                    }
+                }).create();
+
+        a.setOnShowListener(new OnShowListener() {
+
+            @Override
+            public void onShow(DialogInterface dialog) {
+                Button b = a.getButton(AlertDialog.BUTTON_POSITIVE);
+                b.setOnClickListener(new View.OnClickListener() {
+
+                    @Override
+                    public void onClick(View view) {
+                        if(mEditText.getText().length() == 0){
+                            Toast.makeText(getActivity(), "Enter a number to transfer this call", Toast.LENGTH_SHORT).show();
+                        } else {
+                            Intent in = new Intent();
+                            in.putExtra("to_number", mEditText.getText().toString());
+                            in.putExtra("transfer", call_selected);
+                            getTargetFragment().onActivityResult(getTargetRequestCode(), 1, in);
+                            dismiss();
+                        }
+                    }
+                });
+
+            }
+        });
+        return a;
     }
-    
+
     @Override
     public Loader<Bundle> onCreateLoader(int id, Bundle args) {
         Uri baseUri;
@@ -125,11 +144,8 @@
     @Override
     public void onLoadFinished(Loader<Bundle> loader, Bundle data) {
 
-
         ArrayList<CallContact> tmp = data.getParcelableArrayList("Contacts");
 
-
-
     }
 
     @Override
@@ -137,20 +153,19 @@
         // Thi is called when the last Cursor provided to onLoadFinished
         // mListAdapter.swapCursor(null);
     }
-    
 
     private class AutoCompleteAdapter extends ArrayAdapter<Address> implements Filterable {
-     
+
         private LayoutInflater mInflater;
         private Geocoder mGeocoder;
         private StringBuilder mSb = new StringBuilder();
-     
+
         public AutoCompleteAdapter(final Context context) {
             super(context, -1);
             mInflater = LayoutInflater.from(context);
             mGeocoder = new Geocoder(context);
         }
-     
+
         @Override
         public View getView(final int position, final View convertView, final ViewGroup parent) {
             final TextView tv;
@@ -159,12 +174,10 @@
             } else {
                 tv = (TextView) mInflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
             }
-     
+
             return tv;
         }
-     
 
-     
         @Override
         public Filter getFilter() {
             Filter myFilter = new Filter() {
@@ -180,14 +193,14 @@
                     if (addressList == null) {
                         addressList = new ArrayList<Address>();
                     }
-     
+
                     final FilterResults filterResults = new FilterResults();
                     filterResults.values = addressList;
                     filterResults.count = addressList.size();
-     
+
                     return filterResults;
                 }
-     
+
                 @SuppressWarnings("unchecked")
                 @Override
                 protected void publishResults(final CharSequence contraint, final FilterResults results) {
@@ -201,7 +214,7 @@
                         notifyDataSetInvalidated();
                     }
                 }
-     
+
                 @Override
                 public CharSequence convertResultToString(final Object resultValue) {
                     return resultValue == null ? "" : ((Address) resultValue).getAddressLine(0);
@@ -210,19 +223,18 @@
             return myFilter;
         }
     }
-    
-    private class SimpleCallListAdapter extends BaseAdapter  {
-        
+
+    private class SimpleCallListAdapter extends BaseAdapter {
+
         private LayoutInflater mInflater;
         ArrayList<SipCall> calls;
-        
-     
+
         public SimpleCallListAdapter(final Context context, ArrayList<SipCall> calls2) {
             super();
             mInflater = LayoutInflater.from(context);
             calls = calls2;
         }
-     
+
         @Override
         public View getView(final int position, final View convertView, final ViewGroup parent) {
             final TextView tv;
@@ -231,7 +243,7 @@
             } else {
                 tv = (TextView) mInflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
             }
-     
+
             tv.setText(calls.get(position).getContacts().get(0).getmDisplayName());
             return tv;
         }
diff --git a/src/com/savoirfairelinux/sflphone/loaders/HistoryLoader.java b/src/com/savoirfairelinux/sflphone/loaders/HistoryLoader.java
index 91a83bf..fea6fd3 100644
--- a/src/com/savoirfairelinux/sflphone/loaders/HistoryLoader.java
+++ b/src/com/savoirfairelinux/sflphone/loaders/HistoryLoader.java
@@ -39,6 +39,9 @@
 
         historyEntries = new HashMap<String, HistoryEntry>();
 
+        if(service == null){
+            return new ArrayList<HistoryEntry>();
+        }
         try {
             ArrayList<HashMap<String, String>> history = (ArrayList<HashMap<String, String>>) service.getHistory();
             Log.i(TAG, "history size:" + history.size());
diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
index 1beb761..8accf4c 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubblesView.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -148,13 +148,16 @@
         Log.w(TAG, "surfaceDestroyed");

         boolean retry = true;

         thread.setRunning(false);

+        thread.setPaused(false);

         while (retry) {

             try {

+                Log.w(TAG, "joining...");

                 thread.join();

                 retry = false;

             } catch (InterruptedException e) {

             }

         }

+        Log.w(TAG, "done");

         thread = null;

     }

 

diff --git a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
index 589bdb4..bfcfeb5 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
@@ -40,6 +40,7 @@
     void attendedTransfer(in String transferID, in String targetID);
     
     /* Conference related methods */
+    void createConference(in String call1, in String call2);
     void removeConference(in String confID);
     void joinParticipant(in String sel_callID, in String drag_callID);
     void createConfFromParticipantList(in List participants);
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index 7bc1696..51c823b 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -593,6 +593,7 @@
             while (!runInstance.isDone()) {
                 // Log.w(TAG, "Waiting for getHistory");
             }
+            Log.i(TAG, "SipService.getHistory() DONE");
             VectMap swigmap = (VectMap) runInstance.getVal();
 
             ArrayList<HashMap<String, String>> nativemap = HistoryHandler.convertSwigToNative(swigmap);
@@ -793,6 +794,17 @@
             Log.e(TAG, "getConferenceList not implemented");
             return null;
         }
+        
+        @Override
+        public void createConference(final String call1, final String call2) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.createConference() thread running...");
+                    callManagerJNI.createConference(call1, call2);
+                }
+            });
+        }
 
         @Override
         public String getConferenceId(String callID) throws RemoteException {
@@ -964,5 +976,7 @@
 
         }
 
+        
+
     };
 }