diff --git a/src/com/savoirfairelinux/sflphone/adapters/CallPagerAdapter.java b/src/com/savoirfairelinux/sflphone/adapters/CallPagerAdapter.java
new file mode 100644
index 0000000..8daa9f1
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/adapters/CallPagerAdapter.java
@@ -0,0 +1,127 @@
+package com.savoirfairelinux.sflphone.adapters;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.support.v13.app.FragmentStatePagerAdapter;
+import android.util.Log;
+
+import com.savoirfairelinux.sflphone.R;
+import com.savoirfairelinux.sflphone.fragments.CallElementListFragment;
+import com.savoirfairelinux.sflphone.fragments.CallFragment;
+import com.savoirfairelinux.sflphone.fragments.DialingFragment;
+import com.savoirfairelinux.sflphone.fragments.HistoryFragment;
+
+public class CallPagerAdapter extends FragmentStatePagerAdapter {
+    
+    private static final String TAG = SectionsPagerAdapter.class.getSimpleName();
+    Context mContext;
+    
+
+    
+    HashMap<String,Fragment> calls;
+
+    public CallPagerAdapter(Context c, FragmentManager fm) {
+        super(fm);
+        mContext = c;
+        calls = new HashMap<String,Fragment>();
+    }
+
+    @Override
+    public Fragment getItem(int i) {
+        
+        for(int j = 0 ; j <= i ; ++j){
+            calls.entrySet().iterator().next();
+        }
+        
+        
+        return calls.entrySet().iterator().next().getValue();
+    }
+
+//    public Fragment getFragment(int i) {
+//        Fragment fragment;
+//
+//        switch (i) {
+//        case 0:
+//            fragment = new DialingFragment();
+//            break;
+//        case 1:
+//            fragment = new CallElementListFragment();
+//            break;
+//        case 2:
+//            fragment = new HistoryFragment();
+//            break;
+//        default:
+//            Log.e(TAG, "getClassName: unknown fragment position " + i);
+//            fragment = null;
+//        }
+
+        // Log.w(TAG, "getFragment: fragment=" + fragment);
+//        return fragment;
+//    }
+
+    public String getClassName(int i) {
+        String name;
+
+        switch (i) {
+        case 0:
+            name = DialingFragment.class.getName();
+            break;
+        case 1:
+            name = CallElementListFragment.class.getName();
+            break;
+        case 2:
+            name = HistoryFragment.class.getName();
+            break;
+
+        default:
+            Log.e(TAG, "getClassName: unknown fragment position " + i);
+            return null;
+        }
+
+        // Log.w(TAG, "getClassName: name=" + name);
+        return name;
+    }
+
+    @Override
+    public int getCount() {
+        return calls.size();
+    }
+
+    @Override
+    public CharSequence getPageTitle(int position) {
+        switch (position) {
+        case 0:
+            return mContext.getString(R.string.title_section0).toUpperCase();
+        case 1:
+            return mContext.getString(R.string.title_section1).toUpperCase();
+        case 2:
+            return mContext.getString(R.string.title_section2).toUpperCase();
+        default:
+            Log.e(TAG, "getPageTitle: unknown tab position " + position);
+            break;
+        }
+        return null;
+    }
+
+    public void addCall(String mCallID, CallFragment newCall) {
+        Log.w(TAG, "Put "+mCallID);
+        calls.put(mCallID,newCall);
+        notifyDataSetChanged();
+    }
+
+    public Fragment getCall(String callID) {
+        Log.w(TAG, "Get "+callID);
+        return calls.get(callID);
+        
+    }
+
+    public void remove(String callID) {
+//        calls.remove(callID);
+//        notifyDataSetChanged();
+        
+    }
+}
\ No newline at end of file
diff --git a/src/com/savoirfairelinux/sflphone/adapters/ContactPictureLoader.java b/src/com/savoirfairelinux/sflphone/adapters/ContactPictureLoader.java
index 5e358b0..b020e50 100644
--- a/src/com/savoirfairelinux/sflphone/adapters/ContactPictureLoader.java
+++ b/src/com/savoirfairelinux/sflphone/adapters/ContactPictureLoader.java
@@ -19,67 +19,67 @@
 
 import com.savoirfairelinux.sflphone.R;
 
-public class ContactPictureLoader implements Runnable
-{
-	private ImageView view;
-	private long cid;
-	private ContentResolver cr;
-	private final String TAG = ContactPictureLoader.class.getSimpleName();
+public class ContactPictureLoader implements Runnable {
+    private ImageView view;
+    private long cid;
+    private ContentResolver cr;
+    private final String TAG = ContactPictureLoader.class.getSimpleName();
 
-	public ContactPictureLoader(Context context, ImageView element, long contact_id)
-	{
-		cid = contact_id;
-		cr = context.getContentResolver();
-		view = element;
-	}
+    public ContactPictureLoader(Context context, ImageView element, long contact_id) {
+        cid = contact_id;
+        cr = context.getContentResolver();
+        view = element;
+    }
 
-	public static Bitmap loadContactPhoto(ContentResolver cr, long id)
-	{
-		Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
-		InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
-		if (input == null) {
-			return null;
-		}
-		return BitmapFactory.decodeStream(input);
-	}
+    public static Bitmap loadContactPhoto(ContentResolver cr, long id) {
+        Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
+        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
+        if (input == null) {
+            return null;
+        }
+        return BitmapFactory.decodeStream(input);
+    }
 
-	@Override
-	public void run()
-	{
-		Bitmap photo_bmp = loadContactPhoto(cr, cid);
+    @Override
+    public void run() {
+        Bitmap photo_bmp = loadContactPhoto(cr, cid);
 
-		if (photo_bmp == null) {
-			photo_bmp = BitmapFactory.decodeResource(view.getResources(), R.drawable.ic_contact_picture);
-		}
+        if (photo_bmp == null) {
+            photo_bmp = BitmapFactory.decodeResource(view.getResources(), R.drawable.ic_contact_picture);
+        }
 
-		int w = photo_bmp.getWidth(), h = photo_bmp.getHeight();
+        int w = photo_bmp.getWidth(), h = photo_bmp.getHeight();
+        if (w > h) {
+            w = h;
+        } else if (h > w) {
+            h = w;
+        }
 
-		final Bitmap externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+        final Bitmap externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
 
-		int radius = externalBMP.getWidth() / 2;
-		Path path = new Path();
+        int radius = externalBMP.getWidth() / 2;
+        Path path = new Path();
 
-		path.addCircle(radius, radius, radius, Path.Direction.CW);
-		Paint mPaintPath = new Paint(Paint.ANTI_ALIAS_FLAG);
-		mPaintPath.setStyle(Paint.Style.FILL);
-		mPaintPath.setAntiAlias(true);
-		Bitmap circle = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
-		Canvas circle_drawer = new Canvas(circle);
-		circle_drawer.drawOval(new RectF(0, 0, w, h), mPaintPath);
-		mPaintPath.setFilterBitmap(false);
+        path.addCircle(radius, radius, radius, Path.Direction.CW);
+        Paint mPaintPath = new Paint(Paint.ANTI_ALIAS_FLAG);
+        mPaintPath.setStyle(Paint.Style.FILL);
+        mPaintPath.setAntiAlias(true);
+        Bitmap circle = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+        Canvas circle_drawer = new Canvas(circle);
+        circle_drawer.drawOval(new RectF(0, 0, w, h), mPaintPath);
+        mPaintPath.setFilterBitmap(false);
 
-		Canvas internalCanvas = new Canvas(externalBMP);
-		internalCanvas.drawBitmap(photo_bmp, 0, 0, mPaintPath);
-		mPaintPath.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
-		internalCanvas.drawBitmap(circle, 0, 0, mPaintPath);
+        Canvas internalCanvas = new Canvas(externalBMP);
+        internalCanvas.drawBitmap(photo_bmp, 0, 0, mPaintPath);
+        mPaintPath.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
+        internalCanvas.drawBitmap(circle, 0, 0, mPaintPath);
 
-		view.post(new Runnable() {
-			@Override
-			public void run()
-			{
-				view.setImageBitmap(externalBMP);
-				view.invalidate();
-			}
-		});
-	}
+        view.post(new Runnable() {
+            @Override
+            public void run() {
+                view.setImageBitmap(externalBMP);
+                view.invalidate();
+            }
+        });
+    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/adapters/MenuAdapter.java b/src/com/savoirfairelinux/sflphone/adapters/MenuAdapter.java
index 2f9ac3f..bf4a807 100644
--- a/src/com/savoirfairelinux/sflphone/adapters/MenuAdapter.java
+++ b/src/com/savoirfairelinux/sflphone/adapters/MenuAdapter.java
@@ -1,53 +1,117 @@
 package com.savoirfairelinux.sflphone.adapters;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
+
 import android.content.Context;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Adapter;
+import android.widget.ArrayAdapter;
 import android.widget.BaseAdapter;
-import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
 
-public class MenuAdapter extends BaseAdapter{
-    
-    private static final String TAG = MenuAdapter.class.getSimpleName();
-    private Context mContext;
-    String categories[];
+public class MenuAdapter extends BaseAdapter {
+    public final Map<String, Adapter> sections = new LinkedHashMap<String, Adapter>();
+    public final ArrayAdapter<String> headers;
+    public final static int TYPE_SECTION_HEADER = 0;
 
-    public MenuAdapter(Context c, String[] cat) {
-        mContext = c;
-        categories = cat;
+    public MenuAdapter(Context context) {
+        headers = new ArrayAdapter<String>(context, R.layout.item_menu_header);
     }
 
-    @Override
-    public View getView(int pos, View convertView, ViewGroup parent) {
-        View v = convertView;
+    public void addSection(String section, Adapter adapter) {
+        this.headers.add(section);
+        this.sections.put(section, adapter);
+    }
 
-        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        if (v == null) {
-            v = inflater.inflate(R.layout.item_menu, null);
+    public Object getItem(int position) {
+        for (Object section : this.sections.keySet()) {
+            Adapter adapter = sections.get(section);
+            int size = adapter.getCount() + 1;
+
+            // check if position inside this section
+            if (position == 0)
+                return section;
+            if (position < size)
+                return adapter.getItem(position - 1);
+
+            // otherwise jump into next section
+            position -= size;
         }
-
-        ((TextView) v.findViewById(R.id.menu_title_categorie)).setText(categories[pos]);
-
-        return v;
+        return null;
     }
 
-    @Override
     public int getCount() {
-        return categories.length;
+        // total together all sections, plus one for each section header
+        int total = 0;
+        for (Adapter adapter : this.sections.values())
+            total += adapter.getCount() + 1;
+        return total;
     }
 
     @Override
-    public String getItem(int pos) {
-        return categories[pos];
+    public int getViewTypeCount() {
+        // assume that headers count as one, then total all sections
+        int total = 1;
+        for (Adapter adapter : this.sections.values())
+            total += adapter.getViewTypeCount();
+        return total;
     }
 
     @Override
-    public long getItemId(int arg0) {
-        return 0;
-    }
- 
+    public int getItemViewType(int position) {
+        int type = 1;
+        for (Object section : this.sections.keySet()) {
+            Adapter adapter = sections.get(section);
+            int size = adapter.getCount() + 1;
 
-}
+            // check if position inside this section
+            if (position == 0)
+                return TYPE_SECTION_HEADER;
+            if (position < size)
+                return type + adapter.getItemViewType(position - 1);
+
+            // otherwise jump into next section
+            position -= size;
+            type += adapter.getViewTypeCount();
+        }
+        return -1;
+    }
+
+    public boolean areAllItemsSelectable() {
+        return false;
+    }
+
+    @Override
+    public boolean isEnabled(int position) {
+        return (getItemViewType(position) != TYPE_SECTION_HEADER);
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        int sectionnum = 0;
+        for (Object section : this.sections.keySet()) {
+            Adapter adapter = sections.get(section);
+            int size = adapter.getCount() + 1;
+
+            // check if position inside this section
+            if (position == 0)
+                return headers.getView(sectionnum, convertView, parent);
+            if (position < size)
+                return adapter.getView(position - 1, convertView, parent);
+
+            // otherwise jump into next section
+            position -= size;
+            sectionnum++;
+        }
+        return null;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+}
\ No newline at end of file
diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 122ee33..1f39852 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -32,8 +32,6 @@
 
 package com.savoirfairelinux.sflphone.client;
 
-import java.util.HashMap;
-import java.util.Random;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -41,48 +39,37 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.ServiceConnection;
-import android.graphics.Bitmap;
-import android.graphics.PointF;
 import android.os.Bundle;
 import android.os.IBinder;
-import android.os.Parcelable;
 import android.os.RemoteException;
-import android.util.DisplayMetrics;
+import android.support.v4.view.ViewPager;
 import android.util.Log;
 import android.widget.Toast;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.adapters.ContactPictureLoader;
-import com.savoirfairelinux.sflphone.client.receiver.CallListReceiver;
-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.adapters.CallPagerAdapter;
+import com.savoirfairelinux.sflphone.client.receiver.CallReceiver;
+import com.savoirfairelinux.sflphone.fragments.CallFragment;
+import com.savoirfairelinux.sflphone.interfaces.CallInterface;
 import com.savoirfairelinux.sflphone.model.SipCall;
-import com.savoirfairelinux.sflphone.service.ISipClient;
+import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.service.SipService;
 
-public class CallActivity extends Activity {
+public class CallActivity extends Activity implements CallInterface, CallFragment.Callbacks {
     static final String TAG = "CallActivity";
     private ISipService service;
+
     private String pendingAction = null;
-    private SipCall mCall;
-
-    private BubblesView view;
-    private BubbleModel model;
-    private PointF screenCenter;
-    private DisplayMetrics metrics;
-
-    private HashMap<CallContact, Bubble> contacts = new HashMap<CallContact, Bubble>();
 
     private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
+    CallReceiver receiver;
 
-    public interface CallFragment {
-        void setCall(SipCall c);
-    }
+    ViewPager vp;
+    private CallPagerAdapter mCallPagerAdapter;
+    private ViewPager mViewPager;
 
     /*
      * private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@@ -93,140 +80,50 @@
      * if (signalName.equals(CallManagerCallBack.NEW_CALL_CREATED)) { } else if (signalName.equals(CallManagerCallBack.CALL_STATE_CHANGED)) {
      * processCallStateChangedSignal(intent); } else if (signalName.equals(CallManagerCallBack.INCOMING_CALL)) { } } };
      */
-    private ISipClient callback = new ISipClient.Stub() {
-
-        @Override
-        public void incomingCall(Intent call) throws RemoteException {
-            Log.i(TAG, "Incoming call transfered from Service");
-            SipCall.CallInfo infos = new SipCall.CallInfo(call);
-            SipCall c = new SipCall(infos);
-            //
-        }
-
-        @Override
-        public void callStateChanged(Intent callState) throws RemoteException {
-            Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
-            String cID = b.getString("CallID");
-            String state = b.getString("State");
-            Log.i(TAG, "callStateChanged" + cID + "    " + state);
-            processCallStateChangedSignal(cID, state);
-        }
-
-        @Override
-        public void incomingText(Intent msg) throws RemoteException {
-            Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-            b.getString("CallID");
-            String from = b.getString("From");
-            String mess = b.getString("Msg");
-            Toast.makeText(getApplicationContext(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
-        }
-    };
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.bubbleview_layout);
+        setContentView(R.layout.activity_call_layout);
 
-        model = new BubbleModel(getResources().getDisplayMetrics().density);
-        metrics = getResources().getDisplayMetrics();
-        screenCenter = new PointF(metrics.widthPixels / 2, metrics.heightPixels / 3);
-        // radiusCalls = metrics.widthPixels / 2 - 150;
-        // model.listBubbles.add(new Bubble(this, metrics.widthPixels / 2, metrics.heightPixels / 4, 150, R.drawable.me));
-        // model.listBubbles.add(new Bubble(this, metrics.widthPixels / 2, metrics.heightPixels / 4 * 3, 150, R.drawable.callee));
+        receiver = new CallReceiver(this);
 
-        view = (BubblesView) findViewById(R.id.main_view);
-        view.setModel(model);
+        if (mCallPagerAdapter == null) {
+            mCallPagerAdapter = new CallPagerAdapter(this, getFragmentManager());
+        }
+
+        mViewPager = (ViewPager) findViewById(R.id.pager);
+
+        mViewPager.setAdapter(mCallPagerAdapter);
 
         Bundle b = getIntent().getExtras();
 
-        
-        SipCall.CallInfo info = b.getParcelable("CallInfo");
-        Log.i(TAG, "Starting activity for call " + info.mCallID);
-        mCall = new SipCall(info);
-
         Intent intent = new Intent(this, SipService.class);
 
         // setCallStateDisplay(mCall.getCallStateString());
 
-        pendingAction = b.getString("action");
-        if (pendingAction != null && pendingAction.equals("call")) {
-            CallContact contact = b.getParcelable("CallContact");
-
-            Log.i(TAG, "Calling " + contact.getmDisplayName());
-            callContact(contact);
-            // SipCall.CallInfo info = new SipCall.CallInfo();
-            // Random random = new Random();
-            // String callID = Integer.toString(random.nextInt());
-            // Phone phone = contact.getSipPhone();
-
-            // info.mCallID = callID;
-            // info.mAccountID = ""+contact.getId();
-            // info.mDisplayName = contact.getmDisplayName();
-            // info.mPhone = phone==null?null:phone.toString();
-            // info.mEmail = contact.getmEmail();
-            // info.mCallType = SipCall.CALL_TYPE_OUTGOING;
-
-            // mCall = CallListReceiver.getCallInstance(info);
-
-            // mCallbacks.onCallSelected(call);
-
-            /*
-             * try { service.placeCall(info.mAccountID, info.mCallID, info.mPhone); } catch (RemoteException e) { Log.e(TAG,
-             * "Cannot call service method", e); }
-             */
-
-        } else if (pendingAction.equals("incoming")) {
-            callIncoming();
-        }
 
         bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
 
-        /*
-         * LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(CallManagerCallBack.NEW_CALL_CREATED));
-         * LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(CallManagerCallBack.CALL_STATE_CHANGED));
-         * LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(CallManagerCallBack.INCOMING_CALL));
-         */
     }
 
-    private void callContact(final CallContact contact) {
-        // TODO off-thread image loading
-        Bubble contact_bubble;
-        if (contact.getPhoto_id() > 0) {
-            Bitmap photo = ContactPictureLoader.loadContactPhoto(getContentResolver(), contact.getId());
-            contact_bubble = new Bubble(this, screenCenter.x, screenCenter.y, 150, photo);
-        } else {
-            contact_bubble = new Bubble(this, screenCenter.x, screenCenter.y, 150, R.drawable.ic_contact_picture);
-        }
-
-        model.attractors.clear();
-        model.attractors.add(new Attractor(new PointF(metrics.widthPixels / 2, metrics.heightPixels * .8f), new Attractor.Callback() {
-            @Override
-            public void onBubbleSucked(Bubble b) {
-                Log.w(TAG, "Bubble sucked ! ");
-                onCallEnded();
-            }
-        }));
-
-        contact_bubble.contact = contact;
-        model.listBubbles.add(contact_bubble);
-        contacts.put(contact, contact_bubble);
+    /* activity gets back to the foreground and user input */
+    @Override
+    protected void onResume() {
+        Log.i(TAG, "onResume");
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
+        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
+        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
+        registerReceiver(receiver, intentFilter);
+        super.onResume();
     }
 
-    private void callIncoming() {
-        model.attractors.clear();
-        model.attractors.add(new Attractor(new PointF(3 * metrics.widthPixels / 4, metrics.heightPixels / 4), new Attractor.Callback() {
-            @Override
-            public void onBubbleSucked(Bubble b) {
-                onCallAccepted();
-            }
-        }));
-        model.attractors.add(new Attractor(new PointF(metrics.widthPixels / 4, metrics.heightPixels / 4), new Attractor.Callback() {
-            @Override
-            public void onBubbleSucked(Bubble b) {
-                onCallRejected();
-            }
-        }));
-
+    /* activity no more in foreground */
+    @Override
+    protected void onPause() {
+        super.onPause();
+        unregisterReceiver(receiver);
     }
 
     @Override
@@ -243,30 +140,13 @@
         @Override
         public void onServiceConnected(ComponentName className, IBinder binder) {
             service = ISipService.Stub.asInterface(binder);
-            try {
-                service.registerClient(callback);
-                if (pendingAction != null && pendingAction.contentEquals("call")) {
+                Log.i(TAG, "Placing call");
+                CallFragment newCall = new CallFragment();
+                newCall.setArguments(getIntent().getExtras());
+                getIntent().getExtras();
+                SipCall.CallInfo info = getIntent().getExtras().getParcelable("CallInfo");
+                mCallPagerAdapter.addCall(info.mCallID, newCall);
 
-                    Log.i(TAG, "Placing call");
-                    CallContact contact = model.listBubbles.get(0).contact;
-
-                    String callID = Integer.toString(new Random().nextInt());
-                    SipCall.CallInfo info = new SipCall.CallInfo();
-                    info.mCallID = callID;
-                    info.mAccountID = service.getAccountList().get(0).toString();
-                    info.mDisplayName = contact.getmDisplayName();
-                    info.mPhone = contact.getSipPhone().getNumber();
-                    info.mEmail = contact.getmEmail();
-                    info.mCallType = SipCall.CALL_TYPE_OUTGOING;
-
-                    mCall = CallListReceiver.getCallInstance(info);
-
-                    service.placeCall(info.mAccountID, info.mCallID, info.mPhone);
-                    pendingAction = null;
-                }
-            } catch (RemoteException e) {
-                Log.e(TAG, e.toString());
-            }
         }
 
         @Override
@@ -274,104 +154,73 @@
         }
     };
 
-    private void processCallStateChangedSignal(String callID, String newState) {
+    @Override
+    public void incomingCall(Intent call) {
+        Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
+
+        // TODO Handle multicall here
+
+    }
+
+    @Override
+    public void callStateChanged(Intent callState) {
+
+        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
+        processCallStateChangedSignal(b.getString("CallID"), b.getString("State"));
+
+    }
+
+    public void processCallStateChangedSignal(String callID, String newState) {
         /*
          * Bundle bundle = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate"); String callID = bundle.getString("CallID"); String
          * newState = bundle.getString("State");
          */
+        CallFragment fr = (CallFragment) mCallPagerAdapter.getCall(callID);
 
         if (newState.equals("INCOMING")) {
-            mCall.setCallState(SipCall.CALL_STATE_INCOMING);
-            setCallStateDisplay(newState);
+            fr.changeCallState(SipCall.CALL_STATE_INCOMING);
+
         } else if (newState.equals("RINGING")) {
-            mCall.setCallState(SipCall.CALL_STATE_RINGING);
-            setCallStateDisplay(newState);
+            fr.changeCallState(SipCall.CALL_STATE_RINGING);
+
         } else if (newState.equals("CURRENT")) {
-            mCall.setCallState(SipCall.CALL_STATE_CURRENT);
-            setCallStateDisplay(newState);
+            fr.changeCallState(SipCall.CALL_STATE_CURRENT);
+
         } else if (newState.equals("HUNGUP")) {
-            mCall.setCallState(SipCall.CALL_STATE_HUNGUP);
-            setCallStateDisplay(newState);
-            finish();
+//            mCallPagerAdapter.remove(callID);
+
         } else if (newState.equals("BUSY")) {
-            mCall.setCallState(SipCall.CALL_STATE_BUSY);
-            setCallStateDisplay(newState);
+//            mCallPagerAdapter.remove(callID);
+
         } else if (newState.equals("FAILURE")) {
-            mCall.setCallState(SipCall.CALL_STATE_FAILURE);
-            setCallStateDisplay(newState);
+//            mCallPagerAdapter.remove(callID);
+
         } else if (newState.equals("HOLD")) {
-            mCall.setCallState(SipCall.CALL_STATE_HOLD);
-            setCallStateDisplay(newState);
+            fr.changeCallState(SipCall.CALL_STATE_HOLD);
+
         } else if (newState.equals("UNHOLD")) {
-            mCall.setCallState(SipCall.CALL_STATE_CURRENT);
-            setCallStateDisplay("CURRENT");
+            fr.changeCallState(SipCall.CALL_STATE_CURRENT);
+
         } else {
-            mCall.setCallState(SipCall.CALL_STATE_NONE);
-            setCallStateDisplay(newState);
+            fr.changeCallState(SipCall.CALL_STATE_NONE);
+
         }
 
         Log.w(TAG, "processCallStateChangedSignal " + newState);
 
     }
 
-    private void setCallStateDisplay(String newState) {
-        if (newState == null || newState.equals("NULL")) {
-            newState = "INCOMING";
-        }
+    @Override
+    public void incomingText(Intent msg) {
+        Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
 
-        Log.w(TAG, "setCallStateDisplay " + newState);
-
-        /*
-         * mCall.printCallInfo();
-         * 
-         * FragmentManager fm = getFragmentManager(); Fragment newf, f = fm.findFragmentByTag("call_fragment"); boolean replace = true; if
-         * (newState.equals("INCOMING") && !(f instanceof IncomingCallFragment)) { newf = new IncomingCallFragment(); } else if
-         * (!newState.equals("INCOMING") && !(f instanceof OngoingCallFragment)) { newf = new OngoingCallFragment(); } else { replace = false; newf =
-         * f; }
-         * 
-         * ((CallFragment) newf).setCall(mCall);
-         * 
-         * if (replace) { FragmentTransaction ft = fm.beginTransaction(); if(f != null) // do not animate if there is no previous fragment
-         * ft.setCustomAnimations(R.animator.slide_in, R.animator.slide_out); //ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
-         * ft.replace(R.id.fragment_layout, newf, "call_fragment").commit(); }
-         */
-    }
-
-    public void onCallAccepted() {
-        mCall.notifyServiceAnswer(service);
-    }
-
-    public void onCallRejected() {
-        if (mCall.notifyServiceHangup(service))
-            finish();
-    }
-
-    public void onCallEnded() {
-        if (mCall.notifyServiceHangup(service))
-            finish();
-    }
-
-    public void onCallSuspended() {
-        mCall.notifyServiceHold(service);
-    }
-
-    public void onCallResumed() {
-        mCall.notifyServiceUnhold(service);
-    }
-
-    public void onCalltransfered(String to) {
-        mCall.notifyServiceTransfer(service, to);
+        // TODO link text message to associate call and display it at the right place
 
     }
 
-    public void onRecordCall() {
-        mCall.notifyServiceRecord(service);
-
-    }
-
-    public void onSendMessage(String msg) {
-        mCall.notifyServiceSendMsg(service, msg);
-
+    @Override
+    public ISipService getService() {
+        return service;
     }
 
 }
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
index 1a26b15..c0b9409 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
@@ -30,6 +30,8 @@
  */
 package com.savoirfairelinux.sflphone.client;
 
+import java.util.Random;
+
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.Fragment;
@@ -37,6 +39,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -48,28 +51,31 @@
 import android.util.Log;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.widget.ImageButton;
 import android.widget.RelativeLayout;
 import android.widget.Toast;
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.adapters.SectionsPagerAdapter;
+import com.savoirfairelinux.sflphone.client.receiver.CallReceiver;
 import com.savoirfairelinux.sflphone.fragments.CallElementListFragment;
 import com.savoirfairelinux.sflphone.fragments.ContactListFragment;
 import com.savoirfairelinux.sflphone.fragments.DialingFragment;
 import com.savoirfairelinux.sflphone.fragments.HistoryFragment;
 import com.savoirfairelinux.sflphone.fragments.MenuFragment;
+import com.savoirfairelinux.sflphone.interfaces.CallInterface;
+import com.savoirfairelinux.sflphone.model.CallContact;
+import com.savoirfairelinux.sflphone.model.CallContact.ContactBuilder;
 import com.savoirfairelinux.sflphone.model.SipCall;
-import com.savoirfairelinux.sflphone.service.ISipClient;
+import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.service.SipService;
 import com.savoirfairelinux.sflphone.views.CustomSlidingDrawer;
 
-public class SFLPhoneHomeActivity extends Activity implements ActionBar.TabListener, DialingFragment.Callbacks, CallElementListFragment.Callbacks,
-        HistoryFragment.Callbacks {
+public class SFLPhoneHomeActivity extends Activity implements ActionBar.TabListener, DialingFragment.Callbacks, ContactListFragment.Callbacks,
+        CallElementListFragment.Callbacks, HistoryFragment.Callbacks, CallInterface {
     SectionsPagerAdapter mSectionsPagerAdapter = null;
-    static final String TAG = "SFLPhoneHome";
+    static final String TAG = "SFLPhoneHomeActivity";
 
     ImageButton buttonCall, buttonHangup;
     private ContactListFragment mContactsFragment = null;
@@ -94,15 +100,15 @@
 
     RelativeLayout mSliderButton;
     CustomSlidingDrawer mDrawer;
-
     private DrawerLayout mDrawerLayout;
-
     private ActionBarDrawerToggle mDrawerToggle;
     /**
      * The {@link ViewPager} that will host the section contents.
      */
     ViewPager mViewPager;
 
+    CallReceiver receiver;
+
     final private int[] icon_res_id = { R.drawable.ic_tab_call, R.drawable.ic_tab_call, R.drawable.ic_tab_history };
 
     // public SFLPhoneHome extends Activity implements ActionBar.TabListener, OnClickListener
@@ -127,6 +133,8 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        receiver = new CallReceiver(this);
+
         String libraryPath = getApplicationInfo().dataDir + "/lib";
         Log.i(TAG, libraryPath);
 
@@ -175,17 +183,9 @@
         }
 
         mDrawer = (CustomSlidingDrawer) findViewById(R.id.custom_sliding_drawer);
-        mSliderButton = (RelativeLayout) findViewById(R.id.slider_button);
-        ((ImageButton) mSliderButton.findViewById(R.id.contact_search)).setTag(R.id.contact_search, false);
-        ((ImageButton) mSliderButton.findViewById(R.id.contact_search)).setOnClickListener(new OnClickListener() {
 
-            @Override
-            public void onClick(View v) {
-                Log.i(TAG, "Click on serach");
-                mDrawer.toggle();
+        mContactsFragment.setHandleView((RelativeLayout) findViewById(R.id.slider_button));
 
-            }
-        });
         mDrawer.setmTrackHandle(findViewById(R.id.handle_title));
 
         final ActionBar actionBar = getActionBar();
@@ -262,6 +262,11 @@
     @Override
     protected void onResume() {
         Log.i(TAG, "onResume");
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
+        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
+        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
+        registerReceiver(receiver, intentFilter);
         super.onResume();
     }
 
@@ -269,6 +274,7 @@
     @Override
     protected void onPause() {
         super.onPause();
+        unregisterReceiver(receiver);
     }
 
     /* activity is no longer visible */
@@ -287,63 +293,23 @@
             mBound = false;
         }
 
-        /* unregister broadcast receiver */
-        // LocalBroadcastManager.getInstance(this).unregisterReceiver(mCallList);
-        // LocalBroadcastManager.getInstance(this).unregisterReceiver(mAccountList);
-
         super.onDestroy();
     }
 
-    public void launchCallActivity(SipCall.CallInfo infos) {
+    public void launchCallActivity(SipCall.CallInfo infos, String action) {
         Log.i(TAG, "Launch Call Activity");
         Bundle bundle = new Bundle();
-        bundle.putString("action", "incoming");
+        bundle.putString("action", action);
         // bundle.putParcelable("CallContact", mListAdapter.getItem(pos));
         bundle.putParcelable("CallInfo", infos);
         Intent intent = new Intent().setClass(this, CallActivity.class);
         intent.putExtras(bundle);
         startActivityForResult(intent, REQUEST_CODE_CALL);
     }
-    
-    private ISipClient callback = new ISipClient.Stub() {
-
-        @Override
-        public void incomingCall(Intent call) throws RemoteException {
-            Log.i(TAG, "Incoming call transfered from Service");
-            SipCall.CallInfo infos = new SipCall.CallInfo(call);
-
-            SipCall c = new SipCall(infos);
-            mCallElementList.addCall(c);
-
-            launchCallActivity(infos);
-        }
-
-        @Override
-        public void callStateChanged(Intent callState) throws RemoteException {
-            Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
-            String cID = b.getString("CallID");
-            String state = b.getString("State");
-            Log.i(TAG, "callStateChanged" + cID + "    " + state);
-            mCallElementList.updateCall(cID, state);
-
-        }
-
-        @Override
-        public void incomingText(Intent msg) throws RemoteException {
-            Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-            b.getString("CallID");
-            String from = b.getString("From");
-            String mess = b.getString("Msg");
-            Toast.makeText(getApplicationContext(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
-
-        }
-    };
 
     /** Defines callbacks for service binding, passed to bindService() */
     private ServiceConnection mConnection = new ServiceConnection() {
 
-        
-
         @Override
         public void onServiceConnected(ComponentName className, IBinder binder) {
             service = ISipService.Stub.asInterface(binder);
@@ -354,11 +320,6 @@
             mDialingFragment.onServiceSipBinded(service);
             Log.d(TAG, "Service connected service=" + service);
 
-            try {
-                service.registerClient(callback);
-            } catch (RemoteException e) {
-                Log.e(TAG, e.toString());
-            }
         }
 
         @Override
@@ -376,16 +337,6 @@
         if (mDrawerToggle.onOptionsItemSelected(item)) {
             return true;
         }
-        // switch(item.getItemId()){
-        // case R.id.menu_settings :
-        // Intent launchPreferencesIntent = new Intent().setClass(this, SFLPhonePreferenceActivity.class);
-        // startActivityForResult(launchPreferencesIntent, REQUEST_CODE_PREFERENCES);
-        // break;
-        // case R.id.menu_custom_draw:
-        // Intent launchNewInterfaceIntent = new Intent().setClass(this, BubblesViewActivity.class);
-        // startActivityForResult(launchNewInterfaceIntent, 0);
-        // break;
-        // }
 
         return super.onOptionsItemSelected(item);
     }
@@ -393,17 +344,13 @@
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
-        
-        switch (requestCode){
+
+        switch (requestCode) {
         case REQUEST_CODE_PREFERENCES:
             mCallElementList.onServiceSipBinded(service);
             break;
         case REQUEST_CODE_CALL:
-            try {
-                service.registerClient(callback);
-            } catch (RemoteException e) {
-                Log.e(TAG,e.toString());
-            }
+
             break;
         }
 
@@ -438,7 +385,7 @@
 
     @Override
     public void onCallSelected(SipCall c) {
-        launchCallActivity(c.mCallInfo);
+        // launchCallActivity(c.mCallInfo);
 
     }
 
@@ -447,11 +394,81 @@
         return service;
     }
 
+    /**
+     * Interface implemented to handle incoming events
+     */
     @Override
-    public void onCallCreated(SipCall c) {
+    public void incomingCall(Intent call) {
+        Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
+        SipCall.CallInfo infos = new SipCall.CallInfo(call);
+        SipCall c = new SipCall(infos);
         mCallElementList.addCall(c);
-        launchCallActivity(c.mCallInfo);
+
+        CallContact.ContactBuilder builder = new ContactBuilder();
+        infos.contact = builder.buildUnknownContact(infos.mPhone);
         
+        launchCallActivity(infos, CallManagerCallBack.INCOMING_CALL);
+
+    }
+
+    @Override
+    public void callStateChanged(Intent callState) {
+        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
+        String cID = b.getString("CallID");
+        String state = b.getString("State");
+        Log.i(TAG, "callStateChanged" + cID + "    " + state);
+        mCallElementList.updateCall(cID, state);
+
+    }
+
+    @Override
+    public void incomingText(Intent msg) {
+        Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
+        b.getString("CallID");
+        String from = b.getString("From");
+        String mess = b.getString("Msg");
+        Toast.makeText(getApplicationContext(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
+    }
+
+    @Override
+    public void onContactSelected(CallContact c) {
+        String callID = Integer.toString(new Random().nextInt());
+        SipCall.CallInfo info = new SipCall.CallInfo();
+        info.mCallID = callID;
+        try {
+            info.mAccountID = service.getAccountList().get(1).toString();
+        } catch (RemoteException e) {
+            Log.e(TAG, e.toString());
+        }
+        info.mDisplayName = c.getmDisplayName();
+        info.mPhone = c.getSipPhone().getNumber();
+        info.mEmail = c.getmEmail();
+        info.mCallType = SipCall.CALL_TYPE_OUTGOING;
+        info.contact = c;
+
+        launchCallActivity(info, "call");
+
+    }
+
+    @Override
+    public void onCallDialed(String accountID, String to) {
+        Random random = new Random();
+        String callID = Integer.toString(random.nextInt());
+        SipCall.CallInfo info = new SipCall.CallInfo();
+
+        info.mCallID = callID;
+        info.mAccountID = accountID;
+        info.mDisplayName = "Username";
+        info.mPhone = to;
+        info.mEmail = "username@xxxx.com";
+        info.mCallType = SipCall.CALL_TYPE_OUTGOING;
+
+        CallContact.ContactBuilder builder = new ContactBuilder();
+
+        info.contact = builder.buildUnknownContact(to);
+
+        launchCallActivity(info, "call");
+
     }
 
 }
diff --git a/src/com/savoirfairelinux/sflphone/client/receiver/CallReceiver.java b/src/com/savoirfairelinux/sflphone/client/receiver/CallReceiver.java
new file mode 100644
index 0000000..f014e70
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/client/receiver/CallReceiver.java
@@ -0,0 +1,68 @@
+/*
+ *  Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
+ *
+ *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+package com.savoirfairelinux.sflphone.client.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import com.savoirfairelinux.sflphone.interfaces.CallInterface;
+import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
+
+public class CallReceiver extends BroadcastReceiver{
+    
+    static final String TAG = CallReceiver.class.getSimpleName();
+
+    CallInterface callback;
+    
+    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 {
+	        Log.e(TAG, "Unknown action: "+intent.getAction());
+	    }
+
+	}
+	
+	
+
+}
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
new file mode 100644
index 0000000..5596565
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
@@ -0,0 +1,203 @@
+package com.savoirfairelinux.sflphone.fragments;
+
+import java.util.HashMap;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.graphics.Bitmap;
+import android.graphics.PointF;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.savoirfairelinux.sflphone.R;
+import com.savoirfairelinux.sflphone.adapters.ContactPictureLoader;
+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.SipCall;
+import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
+import com.savoirfairelinux.sflphone.service.ISipService;
+
+public class CallFragment extends Fragment {
+    static final String TAG = "CallFragment";
+
+    private SipCall mCall;
+
+    private BubblesView view;
+    private BubbleModel model;
+    private PointF screenCenter;
+    private DisplayMetrics metrics;
+
+    private Callbacks mCallbacks = sDummyCallbacks;
+
+    private HashMap<CallContact, Bubble> contacts = new HashMap<CallContact, Bubble>();
+
+    private TextView contact_name_txt;
+
+    @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);
+    }
+
+    /**
+     * 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 ISipService getService() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    };
+
+    /**
+     * The Activity calling this fragment has to implement this interface
+     * 
+     */
+    public interface Callbacks {
+        public ISipService getService();
+
+    }
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+
+        if (!(activity instanceof Callbacks)) {
+            throw new IllegalStateException("Activity must implement fragment's callbacks.");
+        }
+
+        mCallbacks = (Callbacks) activity;
+    }
+
+    @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);
+
+        Bundle b = getArguments();
+
+        SipCall.CallInfo info = b.getParcelable("CallInfo");
+        Log.i(TAG, "Starting fragment for call " + info.mCallID);
+        mCall = new SipCall(info);
+
+        String pendingAction = b.getString("action");
+        if (pendingAction != null && pendingAction.contentEquals("call")) {
+            callContact(info);
+        } else if (pendingAction.equals(CallManagerCallBack.INCOMING_CALL)) {
+            callIncoming();
+        }
+
+        return rootView;
+    }
+
+    private void callContact(SipCall.CallInfo infos) {
+        // TODO off-thread image loading
+        Bubble contact_bubble;
+        if (infos.contact.getPhoto_id() > 0) {
+            Bitmap photo = ContactPictureLoader.loadContactPhoto(getActivity().getContentResolver(), infos.contact.getId());
+            contact_bubble = new Bubble(getActivity(), screenCenter.x, screenCenter.y, 150, photo);
+        } else {
+            contact_bubble = new Bubble(getActivity(), screenCenter.x, screenCenter.y, 150, R.drawable.ic_contact_picture);
+        }
+
+        model.attractors.clear();
+        model.attractors.add(new Attractor(new PointF(metrics.widthPixels / 2, metrics.heightPixels * .8f), new Attractor.Callback() {
+            @Override
+            public void onBubbleSucked(Bubble b) {
+                Log.w(TAG, "Bubble sucked ! ");
+                onCallEnded();
+            }
+        }));
+
+        contact_bubble.contact = infos.contact;
+        model.listBubbles.add(contact_bubble);
+        contacts.put(infos.contact, contact_bubble);
+        
+        try {
+            mCallbacks.getService().placeCall(infos.mAccountID, infos.mCallID, infos.mPhone);
+        } catch (RemoteException e) {
+            Log.e(TAG, e.toString());
+        }
+    }
+
+    private void callIncoming() {
+        model.attractors.clear();
+        model.attractors.add(new Attractor(new PointF(3 * metrics.widthPixels / 4, metrics.heightPixels / 4), new Attractor.Callback() {
+            @Override
+            public void onBubbleSucked(Bubble b) {
+                onCallAccepted();
+            }
+        }));
+        model.attractors.add(new Attractor(new PointF(metrics.widthPixels / 4, metrics.heightPixels / 4), new Attractor.Callback() {
+            @Override
+            public void onBubbleSucked(Bubble b) {
+                onCallRejected();
+            }
+        }));
+
+    }
+
+    
+
+    public void onCallAccepted() {
+
+        mCall.notifyServiceAnswer(mCallbacks.getService());
+    }
+
+    public void onCallRejected() {
+        if (mCall.notifyServiceHangup(mCallbacks.getService()))
+            ;
+
+    }
+
+    public void onCallEnded() {
+        if (mCall.notifyServiceHangup(mCallbacks.getService()))
+            ;
+
+    }
+
+    public void onCallSuspended() {
+        mCall.notifyServiceHold(mCallbacks.getService());
+    }
+
+    public void onCallResumed() {
+        mCall.notifyServiceUnhold(mCallbacks.getService());
+    }
+
+    public void onCalltransfered(String to) {
+        mCall.notifyServiceTransfer(mCallbacks.getService(), to);
+
+    }
+
+    public void onRecordCall() {
+        mCall.notifyServiceRecord(mCallbacks.getService());
+
+    }
+
+    public void onSendMessage(String msg) {
+        mCall.notifyServiceSendMsg(mCallbacks.getService(), msg);
+
+    }
+
+    public void changeCallState(int callState) {
+        mCall.setCallState(callState);
+    }
+
+
+
+}
diff --git a/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
index 2f6eed6..a330843 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
@@ -50,26 +50,32 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.DragShadowBuilder;
+import android.view.View.OnClickListener;
 import android.view.View.OnDragListener;
 import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.ImageButton;
 import android.widget.ListView;
+import android.widget.RelativeLayout;
 import android.widget.SearchView;
 import android.widget.SearchView.OnQueryTextListener;
+import android.widget.ViewSwitcher;
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.adapters.ContactsAdapter;
 import com.savoirfairelinux.sflphone.adapters.StarredContactsAdapter;
 import com.savoirfairelinux.sflphone.client.CallActivity;
+import com.savoirfairelinux.sflphone.fragments.HistoryFragment.Callbacks;
 import com.savoirfairelinux.sflphone.loaders.ContactsLoader;
 import com.savoirfairelinux.sflphone.model.CallContact;
 import com.savoirfairelinux.sflphone.model.SipCall;
+import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.views.TACGridView;
 
 public class ContactListFragment extends Fragment implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Bundle> {
-    final String TAG = "ContactListFragment";
+    private static final String TAG = "ContactListFragment";
     ContactsAdapter mListAdapter;
     StarredContactsAdapter mGridAdapter;
 
@@ -84,9 +90,38 @@
         mGridAdapter = new StarredContactsAdapter(getActivity());
     }
 
+    private Callbacks mCallbacks = sDummyCallbacks;
+    /**
+     * 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 onContactSelected(CallContact c) {
+        }
+
+        @Override
+        public ISipService getService() {
+            Log.i(TAG, "Dummy");
+            return null;
+        }
+
+    };
+
+    public interface Callbacks {
+        void onContactSelected(CallContact c);
+
+        public ISipService getService();
+
+    }
+
     @Override
     public void onAttach(Activity activity) {
         super.onAttach(activity);
+        if (!(activity instanceof Callbacks)) {
+            throw new IllegalStateException("Activity must implement fragment's callbacks.");
+        }
+
+        mCallbacks = (Callbacks) activity;
     }
 
     @Override
@@ -112,15 +147,15 @@
 
     };
 
-    private void launchCallActivity(CallContact c) {
-        Log.i(TAG, "Launch Call Activity");
-        Bundle bundle = new Bundle();
-        bundle.putString("action", "call");
-        bundle.putParcelable("CallContact", c);
-        Intent intent = new Intent().setClass(getActivity(), CallActivity.class);
-        intent.putExtras(bundle);
-        getActivity().startActivity(intent);
-    }
+//    private void launchCallActivity(CallContact c) {
+//        Log.i(TAG, "Launch Call Activity");
+//        Bundle bundle = new Bundle();
+//        bundle.putString("action", "call");
+//        bundle.putParcelable("CallContact", c);
+//        Intent intent = new Intent().setClass(getActivity(), CallActivity.class);
+//        intent.putExtras(bundle);
+//        getActivity().startActivity(intent);
+//    }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -132,7 +167,7 @@
 
             @Override
             public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
-                launchCallActivity(mListAdapter.getItem(pos));
+                mCallbacks.onContactSelected(mListAdapter.getItem(pos));
                 
             }
         });
@@ -152,8 +187,8 @@
 
             @Override
             public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
-                launchCallActivity(mGridAdapter.getItem(pos));
-                
+//                launchCallActivity(mGridAdapter.getItem(pos));
+                mCallbacks.onContactSelected(mGridAdapter.getItem(pos));
             }
         });
         grid.setOnItemLongClickListener(mItemLongClickListener);
@@ -187,15 +222,16 @@
         }
 
     };
+    private RelativeLayout mHandle;
 
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         // Place an action bar item for searching
-        inflater.inflate(R.menu.contact_list_menu, menu);
-        MenuItem item = menu.findItem(R.id.menu_search);
-        SearchView sv = new SearchView(getActivity());
-        sv.setOnQueryTextListener(this);
-        item.setActionView(sv);
+//        inflater.inflate(R.menu.contact_list_menu, menu);
+//        MenuItem item = menu.findItem(R.id.menu_search);
+//        SearchView sv = new SearchView(getActivity());
+//        sv.setOnQueryTextListener(this);
+//        item.setActionView(sv);
     }
 
     @Override
@@ -256,4 +292,26 @@
         // Thi is called when the last Cursor provided to onLoadFinished
         // mListAdapter.swapCursor(null);
     }
+
+    public void setHandleView(RelativeLayout handle) {
+        mHandle = handle;
+        
+//        ((ImageButton) handle.findViewById(R.id.contact_search)).setTag(R.id.contact_search, false);
+        
+        ((SearchView)mHandle.findViewById(R.id.contact_search_text)).setOnQueryTextListener(this);
+        
+        
+//        ((ImageButton) mHandle.findViewById(R.id.contact_search)).setOnClickListener(new OnClickListener() {
+//
+//            @Override
+//            public void onClick(View v) {
+//                Log.i(TAG, "Click on serach");
+////                ((ViewSwitcher)mHandle.findViewById(R.id.view_switcher)).showNext();
+////                ((SearchView)mHandle.findViewById(R.id.contact_search_text)).
+//                
+//
+//            }
+//        });
+        
+    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java b/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
index 1ab198a..724e2f9 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
@@ -42,7 +42,7 @@
      */
     private static Callbacks sDummyCallbacks = new Callbacks() {
         @Override
-        public void onCallCreated(SipCall c) {
+        public void onCallDialed(String account, String to) {
         }
 
         @Override
@@ -57,7 +57,7 @@
      * 
      */
     public interface Callbacks {
-        public void onCallCreated(SipCall c);
+        void onCallDialed(String account, String to);
 
         public ISipService getService();
 
@@ -95,7 +95,10 @@
         ((ImageButton) inflatedView.findViewById(R.id.buttonCall)).setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
-                processingNewCallAction();
+                
+                String accountID = mAccountSelectionSpinner.getAccount();
+                String to = textField.getText().toString();
+                mCallbacks.onCallDialed(accountID, to);
             }
         });
 
@@ -133,33 +136,6 @@
 
     }
 
-    public void processingNewCallAction() {
-        // String accountID = mAccountList.currentAccountID;
-        String accountID = mAccountSelectionSpinner.getAccount();
-
-        String to = textField.getText().toString();
-
-        Random random = new Random();
-        String callID = Integer.toString(random.nextInt());
-        SipCall.CallInfo info = new SipCall.CallInfo();
-
-        info.mCallID = callID;
-        info.mAccountID = accountID;
-        info.mDisplayName = "Cool Guy!";
-        info.mPhone = to;
-        info.mEmail = "coolGuy@coolGuy.com";
-        info.mCallType = SipCall.CALL_TYPE_OUTGOING;
-
-        SipCall call = CallListReceiver.getCallInstance(info);
-        mCallbacks.onCallCreated(call);
-
-        try {
-            service.placeCall(info.mAccountID, info.mCallID, info.mPhone);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot call service method", e);
-        }
-
-    }
 
     public String getSelectedAccount() {
         return mAccountSelectionSpinner.getAccount();
diff --git a/src/com/savoirfairelinux/sflphone/fragments/MenuFragment.java b/src/com/savoirfairelinux/sflphone/fragments/MenuFragment.java
index f8a206c..93ab1e5 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/MenuFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/MenuFragment.java
@@ -6,23 +6,23 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
 import android.widget.ListView;
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.adapters.MenuAdapter;
 
-public class MenuFragment extends Fragment{
-    
+public class MenuFragment extends Fragment {
+
     private static final String TAG = MenuFragment.class.getSimpleName();
     public static final String ARG_SECTION_NUMBER = "section_number";
 
     MenuAdapter mAdapter;
 
-
     @Override
     public void onAttach(Activity activity) {
         super.onAttach(activity);
-        
+
     }
 
     @Override
@@ -33,8 +33,20 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        
-         mAdapter = new MenuAdapter(getActivity(),getResources().getStringArray(R.array.menu_categories));
+
+        mAdapter = new MenuAdapter(getActivity());
+
+        String[] categories = getResources().getStringArray(R.array.menu_categories);
+        ArrayAdapter<String> paramAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_menu, getResources().getStringArray(
+                R.array.menu_items_param));
+        ArrayAdapter<String> helpAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_menu, getResources().getStringArray(
+                R.array.menu_items_help));
+
+        // Add Sections
+
+        mAdapter.addSection(categories[0], paramAdapter);
+        mAdapter.addSection(categories[1], helpAdapter);
+
     }
 
     @Override
@@ -51,5 +63,4 @@
 
     }
 
-
 }
diff --git a/src/com/savoirfairelinux/sflphone/interfaces/CallInterface.java b/src/com/savoirfairelinux/sflphone/interfaces/CallInterface.java
new file mode 100644
index 0000000..bf50872
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/interfaces/CallInterface.java
@@ -0,0 +1,13 @@
+package com.savoirfairelinux.sflphone.interfaces;
+
+import android.content.Intent;
+
+public interface CallInterface {
+
+    public void incomingCall(Intent call);
+
+    public void callStateChanged(Intent callState);
+
+    public void incomingText(Intent msg);
+    
+}
diff --git a/src/com/savoirfairelinux/sflphone/model/CallContact.java b/src/com/savoirfairelinux/sflphone/model/CallContact.java
index c658b8a..4a69012 100644
--- a/src/com/savoirfairelinux/sflphone/model/CallContact.java
+++ b/src/com/savoirfairelinux/sflphone/model/CallContact.java
@@ -155,6 +155,13 @@
             return new ContactBuilder();
         }
 
+        public CallContact buildUnknownContact(String to) {
+            phones = new ArrayList<Phone>();
+            phones.add(new Phone(to, 0));
+            
+            return new CallContact(-1, to, 0, phones, new ArrayList<CallContact.Phone>(), "");
+        }
+
     }
 
     @Override
diff --git a/src/com/savoirfairelinux/sflphone/model/SipCall.java b/src/com/savoirfairelinux/sflphone/model/SipCall.java
index fcd826e..c00f757 100644
--- a/src/com/savoirfairelinux/sflphone/model/SipCall.java
+++ b/src/com/savoirfairelinux/sflphone/model/SipCall.java
@@ -76,6 +76,7 @@
         public String mPhone = "";
         public String mEmail = "";
         public String mRemoteContact = "";
+        public CallContact contact = null;
         public int mCallType = CALL_TYPE_UNDETERMINED;
         public int mCallState = CALL_STATE_NONE;
         public int mMediaState = MEDIA_STATE_NONE;
@@ -98,6 +99,7 @@
             list.add(mRemoteContact);
 
             out.writeStringList(list);
+            out.writeParcelable(contact, 0);
             out.writeInt(mCallType);
             out.writeInt(mCallState);
             out.writeInt(mMediaState);
@@ -126,6 +128,7 @@
             mEmail = list.get(4);
             mRemoteContact = list.get(5);
 
+            contact = in.readParcelable(CallContact.class.getClassLoader());
             mCallType = in.readInt();
             mCallState = in.readInt();
             mMediaState = in.readInt();
diff --git a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
index 25ac69c..b57b81d 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
@@ -1,6 +1,5 @@
 package com.savoirfairelinux.sflphone.service;
 
-import com.savoirfairelinux.sflphone.service.ISipClient;
 
 interface ISipService {
     void placeCall(String accountID, in String callID, in String to);
@@ -29,9 +28,7 @@
     
     /* IM */
     void sendTextMessage(in String callID, in String message, in String from);
-    
-    void registerClient(in ISipClient callback);
-    
+        
     void transfer(in String callID, in String to);
     void attendedTransfer(in String transferID, in String targetID);
     
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index c8b5d3d..094bb8c 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -66,7 +66,6 @@
     private ConfigurationManagerCallback configurationManagerCallback;
     private ManagerImpl managerImpl;
     private boolean isPjSipStackStarted = false;
-    ISipClient client;
 
     int clients = 0;
 
@@ -76,31 +75,23 @@
         public void onReceive(Context context, Intent intent) {
             // Get instance of Vibrator from current Context
 
-            if (client != null) {
-                try {
-                    if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
-                        Log.i(TAG, "Received" + intent.getAction());
-                    } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_LOADED)) {
-                        Log.i(TAG, "Received" + intent.getAction());
-                    } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
-                        Log.i(TAG, "Received" + intent.getAction());
-                    } else if(intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
-                        Log.i(TAG, "Received" + intent.getAction());
-                        client.incomingText(intent);
-                    } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
-                        Log.i(TAG, "Received" + intent.getAction());
-                        client.incomingCall(intent);
-                    } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
-                        Log.i(TAG, "Received" + intent.getAction());
-                        client.callStateChanged(intent);
-                    } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
-                        Log.i(TAG, "Received" + intent.getAction());
-                        Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
-                        mVibrator.vibrate(300);
-                    }
-                } catch (RemoteException e) {
-                    Log.e(TAG, e.toString());
-                }
+            if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
+                Log.i(TAG, "Received" + intent.getAction());
+            } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_LOADED)) {
+                Log.i(TAG, "Received" + intent.getAction());
+            } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
+                Log.i(TAG, "Received" + intent.getAction());
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
+                Log.i(TAG, "Received" + intent.getAction());
+                sendBroadcast(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
+                sendBroadcast(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
+                sendBroadcast(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
+                Log.i(TAG, "Received" + intent.getAction());
+                Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+                mVibrator.vibrate(300);
             }
 
         }
@@ -442,7 +433,7 @@
             CurrentAudioPlugin runInstance = new CurrentAudioPlugin();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-//                Log.e(TAG, "Waiting for Nofing");
+                // Log.e(TAG, "Waiting for Nofing");
             }
             return (String) runInstance.getVal();
         }
@@ -460,7 +451,7 @@
             AccountList runInstance = new AccountList();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-//                Log.e(TAG, "Waiting for Nofing");
+                // Log.e(TAG, "Waiting for Nofing");
             }
             StringVect swigvect = (StringVect) runInstance.getVal();
 
@@ -538,7 +529,7 @@
             AddAccount runInstance = new AddAccount(swigmap);
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-//                Log.e(TAG, "Waiting for Nofing");
+                // Log.e(TAG, "Waiting for Nofing");
             }
             String accountId = (String) runInstance.getVal();
 
@@ -556,11 +547,7 @@
             });
         }
 
-        @Override
-        public void registerClient(ISipClient callback) throws RemoteException {
-            client = callback;
-        }
-
+        
         @Override
         public ArrayList<HashMap<String, String>> getHistory() throws RemoteException {
             class History extends SipRunnableWithReturn {
@@ -576,7 +563,7 @@
             History runInstance = new History();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-//                Log.w(TAG, "Waiting for getHistory");
+                // Log.w(TAG, "Waiting for getHistory");
             }
             VectMap swigmap = (VectMap) runInstance.getVal();
 
@@ -602,7 +589,7 @@
                         Intent intent = new Intent(CallManagerCallBack.CALL_STATE_CHANGED);
                         intent.putExtra(CallManagerCallBack.SIGNAL_NAME, CallManagerCallBack.CALL_STATE_CHANGED);
                         intent.putExtra("com.savoirfairelinux.sflphone.service.newstate", bundle);
-                        client.callStateChanged(intent);
+                        sendBroadcast(intent);
                     } else
                         Log.i(TAG, "NOT OK");
                 }
@@ -762,7 +749,7 @@
             ConfList runInstance = new ConfList();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-//                Log.w(TAG, "Waiting for getConferenceList");
+                // Log.w(TAG, "Waiting for getConferenceList");
             }
             StringVect swigvect = (StringVect) runInstance.getVal();
 
@@ -806,7 +793,7 @@
             RecordPath runInstance = new RecordPath();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-//                Log.w(TAG, "Waiting for getRecordPath");
+                // Log.w(TAG, "Waiting for getRecordPath");
             }
             String path = (String) runInstance.getVal();
 
@@ -888,7 +875,7 @@
                 Log.w(TAG, "Waiting for getAudioCodecList");
             }
             StringVect swigmap = (StringVect) runInstance.getVal();
-            
+
             ArrayList<String> nativemap = new ArrayList<String>();
             for (int i = 0; i < swigmap.size(); ++i) {
 
