diff --git a/src/com/savoirfairelinux/sflphone/client/CallElementList.java b/src/com/savoirfairelinux/sflphone/client/CallElementList.java
index 255666a..a78c1ec 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallElementList.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallElementList.java
@@ -161,15 +161,17 @@
 	 * A CursorAdapter that creates and update call elements using corresponding contact infos.
 	 * TODO: handle contact list separatly to allow showing synchronized contacts on Call cards with multiple contacts etc.
 	 */
-	class CallElementAdapter extends ArrayAdapter
+	public static class CallElementAdapter extends ArrayAdapter
 	{
 		private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
                 private ContactManager mContactManager;
+                private Context mContext;
 
 		public CallElementAdapter(Context context, ContactManager manager)
 		{
 			super(context, R.layout.call_element, manager.getContactList());
                         mContactManager = manager;
+                        mContext = context;
 		}
 
                 @Override
@@ -179,10 +181,10 @@
                     CallElementView callElementView = null;
 
                     if(rowView == null) {
-                        LayoutInflater inflater = LayoutInflater.from(getActivity());
+                        LayoutInflater inflater = LayoutInflater.from(mContext);
                         final long contact_id = 0;
                         rowView = inflater.inflate(R.layout.call_element, parent, false);
-                        infos_fetcher.execute(new InfosLoader(getActivity(), rowView, contact_id));
+                        infos_fetcher.execute(new InfosLoader(mContext, rowView, contact_id));
 
                         callElementView = new CallElementView();
                         // callElementView.toggleButton = (ImageButton) rowView.findViewById(R.id.toggleButton1);
@@ -233,7 +235,7 @@
 
 	};
 
-        public class CallElementView
+        public static class CallElementView
         {
             protected ImageButton toggleButton;
             protected Button button;
diff --git a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
new file mode 100644
index 0000000..136095c
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
@@ -0,0 +1,73 @@
+/*
+ *  Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
+ *
+ *  Author: Adrien Beraud <adrien.beraud@gmail.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;
+
+import android.app.ListFragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+import android.util.Log;
+
+import com.savoirfairelinux.sflphone.R;
+
+public class ContactListFragment extends ListFragment
+{
+    ContactManager mContactManager;
+    CallElementList.CallElementAdapter mAdapter;
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState)
+    {
+        super.onActivityCreated(savedInstanceState);
+
+        setHasOptionsMenu(true);
+
+        mContactManager = new ContactManager(getActivity());
+
+        mAdapter = new CallElementList.CallElementAdapter(getActivity(), mContactManager);
+        setListAdapter(mAdapter);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
+    {
+        return inflater.inflate(R.layout.call_element_list, container, false);
+    }
+
+    @Override
+    public void onListItemClick(ListView l, View v, int position, long id)
+    {
+        // Insert desired behavior here.
+        Log.i("FragmentConplexList", "Item clicked: " + id);
+    }
+}
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
index d3f000e..900dfde 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
@@ -82,7 +82,7 @@
 	 */
 	ViewPager mViewPager;
 	
-	final private int[] icon_res_id = {R.drawable.ic_tab_call, R.drawable.ic_tab_history, R.drawable.ic_tab_play_selected};
+	final private int[] icon_res_id = {R.drawable.ic_tab_call, R.drawable.ic_tab_call, R.drawable.ic_tab_history, R.drawable.ic_tab_play_selected};
 
 	@Override
 	public void onCreate(Bundle savedInstanceState)
@@ -117,6 +117,7 @@
 			// Create a tab with text corresponding to the page title defined by the adapter.
 			// Also specify this Activity object, which implements the TabListener interface, as the
 			// listener for when this tab is selected.
+                        Log.i(TAG, "adding tab: " + i);
 			actionBar.addTab(actionBar.newTab().setIcon(icon_res_id[i]).setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this));
 		}
 
@@ -229,13 +230,16 @@
 			Fragment fragment;
 			
 			switch (i) {
-			case 0:
+                        case 0:
+                                fragment = new ContactListFragment();
+                                break;
+			case 1:
 				fragment = new CallElementList();
 				break;
-			case 1:
+			case 2:
 				fragment = new DummySectionFragment();
 				break;
-			case 2:
+			case 3:
 				fragment = new ButtonSectionFragment();
 				Log.i(TAG, "getItem: fragment is " + fragment);
 				break;
@@ -253,18 +257,20 @@
 		@Override
 		public int getCount()
 		{
-			return 3;
+			return 4;
 		}
 
 		@Override
 		public CharSequence getPageTitle(int position)
 		{
 			switch (position) {
-			case 0:
-				return getString(R.string.title_section1).toUpperCase();
+                        case 0:
+                                return getString(R.string.title_section0).toUpperCase();
 			case 1:
-				return getString(R.string.title_section2).toUpperCase();
+				return getString(R.string.title_section1).toUpperCase();
 			case 2:
+				return getString(R.string.title_section2).toUpperCase();
+			case 3:
 				return getString(R.string.title_section3).toUpperCase();
 			default:
 				Log.e(TAG, "getPageTitle: unknown tab position " + position);
