diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
index eb8d207..eb43a96 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
@@ -42,9 +42,12 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
+import android.database.Cursor;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.support.v4.app.ActionBarDrawerToggle;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.view.ViewPager;
@@ -61,10 +64,10 @@
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.adapters.AccountSelectionAdapter;
 import com.savoirfairelinux.sflphone.adapters.SectionsPagerAdapter;
-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.HomeFragment;
 import com.savoirfairelinux.sflphone.fragments.MenuFragment;
 import com.savoirfairelinux.sflphone.interfaces.AccountsInterface;
 import com.savoirfairelinux.sflphone.interfaces.CallInterface;
@@ -79,7 +82,7 @@
 import com.savoirfairelinux.sflphone.views.CustomSlidingDrawer;
 
 public class SFLPhoneHomeActivity extends Activity implements DialingFragment.Callbacks, ContactListFragment.Callbacks,
-        CallElementListFragment.Callbacks, HistoryFragment.Callbacks, CallInterface, AccountsInterface {
+        HomeFragment.Callbacks, HistoryFragment.Callbacks, CallInterface, AccountsInterface {
 
     SectionsPagerAdapter mSectionsPagerAdapter = null;
     static final String TAG = "SFLPhoneHomeActivity";
@@ -198,7 +201,7 @@
 
         // Set up the ViewPager with the sections adapter.
         mViewPager = (ViewPager) findViewById(R.id.pager);
-        mViewPager.setPageTransformer(true, new ZoomOutPageTransformer());
+        mViewPager.setPageTransformer(true, new ZoomOutPageTransformer(0.7f));
         
 
         mTitle = mDrawerTitle = getTitle();
@@ -288,7 +291,7 @@
                 this.mTabHost,
                 this.mTabHost.newTabSpec("Tab2").setIndicator(mSectionsPagerAdapter.getPageTitle(1),
                         getResources().getDrawable(mSectionsPagerAdapter.getIconOf(1))), (tabInfo = new TabInfo("Tab2",
-                        CallElementListFragment.class, args)));
+                        HomeFragment.class, args)));
         this.mapTabInfo.put(tabInfo.tag, tabInfo);
         SFLPhoneHomeActivity
                 .AddTab(this,
@@ -343,10 +346,12 @@
     
     private boolean isClosing = false;
     private Timer t = new Timer();
+    
+    
     @Override
     public void onBackPressed() {
         if (mDrawer.isOpened()) {
-            mDrawer.close();
+            mDrawer.animateClose();
             return;
         }
         
@@ -373,6 +378,12 @@
         super.onPause();
         unregisterReceiver(callReceiver);
         unregisterReceiver(accountReceiver);
+        try {
+            service.createNotification();
+
+        } catch (RemoteException e) {
+            Log.e(TAG, e.toString());
+        }
 
     }
 
@@ -389,12 +400,7 @@
         /* stop the service, if no other bound user, no need to check if it is running */
         if (mBound) {
             Log.i(TAG, "onDestroy: Unbinding service...");
-            try {
-                service.createNotification();
-
-            } catch (RemoteException e) {
-                Log.e(TAG, e.toString());
-            }
+            
             unbindService(mConnection);
             mBound = false;
 
@@ -403,12 +409,12 @@
         super.onDestroy();
     }
 
-    public void launchCallActivity(SipCall infos, String action) {
+    public void launchCallActivity(SipCall infos) {
         Log.i(TAG, "Launch Call Activity");
         Bundle bundle = new Bundle();
-        bundle.putString("action", action);
         bundle.putParcelable("CallInfo", infos);
         Intent intent = new Intent().setClass(this, CallActivity.class);
+
         intent.putExtras(bundle);
         startActivityForResult(intent, REQUEST_CODE_CALL);
     }
@@ -474,7 +480,7 @@
 
     @Override
     public void onCallSelected(SipCall c) {
-        launchCallActivity(c, "display");
+        launchCallActivity(c);
 
     }
 
@@ -493,7 +499,7 @@
 
         // mCallElementList.addCall(infos);
 
-        launchCallActivity(infos, CallManagerCallBack.INCOMING_CALL);
+        launchCallActivity(infos);
 
     }
 
@@ -517,18 +523,46 @@
     }
 
     @Override
-    public void onContactSelected(CallContact c) {
+    public void onContactSelected(final CallContact c) {
 
-        SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
-        try {
-            callBuilder.startCallCreation().setAccountID(service.getAccountList().get(1).toString()).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
-            callBuilder.addContact(c);
-            launchCallActivity(callBuilder.build(), "call");
-        } catch (RemoteException e1) {
-            Log.e(TAG, e1.toString());
-        } catch (Exception e) {
-            Log.e(TAG, e.toString());
-        }
+        Thread launcher = new Thread(new Runnable() {
+            
+            final String[] CONTACTS_PHONES_PROJECTION = new String[] { Phone.NUMBER, Phone.TYPE };
+            final String[] CONTACTS_SIP_PROJECTION = new String[] { SipAddress.SIP_ADDRESS, SipAddress.TYPE };
+            
+            @Override
+            public void run() {
+                SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
+                try {
+                    callBuilder.startCallCreation().setAccountID(service.getAccountList().get(1).toString()).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
+                    Cursor cPhones = getContentResolver().query(Phone.CONTENT_URI, CONTACTS_PHONES_PROJECTION,
+                          Phone.CONTACT_ID + " =" + c.getId(), null, null);
+
+                  while (cPhones.moveToNext()) {
+                      c.addPhoneNumber(cPhones.getString(cPhones.getColumnIndex(Phone.NUMBER)), cPhones.getInt(cPhones.getColumnIndex(Phone.TYPE)));
+                  }
+                  cPhones.close();
+      
+                  Cursor cSip = getContentResolver().query(Phone.CONTENT_URI, CONTACTS_SIP_PROJECTION,
+                          Phone.CONTACT_ID + "=" + c.getId(), null, null);
+      
+                  while (cSip.moveToNext()) {
+                      c.addSipNumber(cSip.getString(cSip.getColumnIndex(SipAddress.SIP_ADDRESS)), cSip.getInt(cSip.getColumnIndex(SipAddress.TYPE)));
+                  }
+                  cSip.close();
+                    callBuilder.addContact(c);
+                    launchCallActivity(callBuilder.build());
+                } catch (RemoteException e1) {
+                    Log.e(TAG, e1.toString());
+                } catch (Exception e) {
+                    Log.e(TAG, e.toString());
+                }
+                
+            }
+        });
+        launcher.start();
+        mDrawer.close();
+        
 
     }
 
@@ -540,7 +574,7 @@
         callBuilder.addContact(CallContact.ContactBuilder.buildUnknownContact(to));
 
         try {
-            launchCallActivity(callBuilder.build(), "call");
+            launchCallActivity(callBuilder.build());
         } catch (Exception e) {
             Log.e(TAG, e.toString());
         }
@@ -593,14 +627,9 @@
      */
     private class TabInfo {
         private String tag;
-        private Class<?> clss;
-        private Bundle args;
-        private Fragment fragment;
 
         TabInfo(String tag, Class<?> clazz, Bundle args) {
             this.tag = tag;
-            this.clss = clazz;
-            this.args = args;
         }
 
     }
@@ -613,7 +642,7 @@
 
     @Override
     public void openDrawer() {
-        mDrawer.open();
+        mDrawer.animateOpen();
     }
 
     @Override
