diff --git a/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
index 3fd80fa..d50fbdd 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java
@@ -33,10 +33,10 @@
 
 import java.util.ArrayList;
 
+import android.animation.LayoutTransition;
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.LoaderManager;
-import android.content.Intent;
 import android.content.Loader;
 import android.net.Uri;
 import android.os.Bundle;
@@ -47,30 +47,28 @@
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
-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.view.ViewGroup.LayoutParams;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.AdapterView.OnItemLongClickListener;
 import android.widget.ImageButton;
+import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.RelativeLayout;
 import android.widget.SearchView;
+import android.widget.SearchView.OnCloseListener;
 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;
 
@@ -81,6 +79,8 @@
 
     String mCurFilter;
 
+    private RelativeLayout mHandle;
+
     public static final int CONTACT_LOADER = 555;
 
     @Override
@@ -135,7 +135,7 @@
 
         mCallbacks = (Callbacks) activity;
     }
-    
+
     @Override
     public void onDetach() {
         super.onDetach();
@@ -159,23 +159,14 @@
         public boolean onItemLongClick(AdapterView<?> av, View view, int pos, long id) {
             DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view.findViewById(R.id.photo));
             view.startDrag(null, shadowBuilder, view, 0);
-//            view.setVisibility(View.INVISIBLE);
+            // view.setVisibility(View.INVISIBLE);
             mCallbacks.onContactDragged();
+//            ((SearchView) mHandle.findViewById(R.id.contact_search_text)).setIconified(true);
             return true;
         }
 
     };
 
-//    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) {
         View inflatedView = inflater.inflate(R.layout.frag_contact_list, container, false);
@@ -187,7 +178,8 @@
             @Override
             public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
                 mCallbacks.onContactSelected(mListAdapter.getItem(pos));
-                
+//                ((SearchView) mHandle.findViewById(R.id.contact_search_text)).setIconified(true);
+
             }
         });
         list.setOnItemLongClickListener(mItemLongClickListener);
@@ -199,15 +191,15 @@
         list.setAdapter(mListAdapter);
         grid.setAdapter(mGridAdapter);
         grid.setExpanded(true);
-        
-        
+
         grid.setOnDragListener(dragListener);
         grid.setOnItemClickListener(new OnItemClickListener() {
 
             @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));
+//                ((SearchView) mHandle.findViewById(R.id.contact_search_text)).setIconified(true);
             }
         });
         grid.setOnItemLongClickListener(mItemLongClickListener);
@@ -226,10 +218,9 @@
             case DragEvent.ACTION_DRAG_ENTERED:
                 break;
             case DragEvent.ACTION_DRAG_EXITED:
-//                v.setBackgroundDrawable(null);
+                // v.setBackgroundDrawable(null);
                 break;
             case DragEvent.ACTION_DROP:
-                View view = (View) event.getLocalState();
                 break;
             case DragEvent.ACTION_DRAG_ENDED:
                 View view1 = (View) event.getLocalState();
@@ -241,22 +232,20 @@
         }
 
     };
-    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
     public boolean onQueryTextChange(String newText) {
-        
-        Log.i(TAG,"onQueryTextChangeonQueryTextChangeonQueryTextChangeonQueryTextChangeonQueryTextChangeonQueryTextChangeonQueryTextChangeonQueryTextChangeonQueryTextChangeonQueryTextChangeonQueryTextChange");
+
         // Called when the action bar search text has changed. Update
         // the search filter, and restart the loader to do a new query
         // with this filter.
@@ -276,7 +265,6 @@
 
     @Override
     public boolean onQueryTextSubmit(String query) {
-        Log.i(TAG,"onQueryTextSubmitonQueryTextSubmitonQueryTextSubmitonQueryTextSubmitonQueryTextSubmitonQueryTextSubmitonQueryTextSubmit");
         // Return false to let the SearchView perform the default action
         return false;
     }
@@ -318,29 +306,34 @@
     public void setHandleView(RelativeLayout handle) {
         mHandle = handle;
         
-//        ((ImageButton) handle.findViewById(R.id.contact_search)).setTag(R.id.contact_search, false);
+
+
+        // ((ImageButton) handle.findViewById(R.id.contact_search)).setTag(R.id.contact_search, false);
+
         
-        ((SearchView)mHandle.findViewById(R.id.contact_search_text)).setOnQueryTextListener(this);
-        ((SearchView)mHandle.findViewById(R.id.contact_search_text)).setOnSearchClickListener(new OnClickListener() {
+        ((ImageButton)handle.findViewById(R.id.contact_search_button)).setOnClickListener(new OnClickListener() {
             
             @Override
             public void onClick(View v) {
+                SearchView search = new SearchView(getActivity());
+                //Get the ID for the search bar LinearLayout
+                int searchBarId = search.getContext().getResources().getIdentifier("android:id/search_bar", null, null);
+                //Get the search bar Linearlayout
+                LinearLayout searchBar = (LinearLayout) search.findViewById(searchBarId);
+                searchBar.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
+                //Give the Linearlayout a transition animation.
+                searchBar.setLayoutTransition(new LayoutTransition());
+                search.setOnQueryTextListener(ContactListFragment.this);
+                search.setIconified(false);
+                getActivity().getActionBar().setDisplayShowCustomEnabled(true);
+                getActivity().getActionBar().setCustomView(search);
                 mCallbacks.openDrawer();
                 
             }
         });
         
-//        ((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 853d0ff..8711384 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
@@ -75,8 +75,8 @@
     AccountSelectionAdapter mAdapter;
     private Callbacks mCallbacks = sDummyCallbacks;
     private Spinner spinnerAccounts;
-    
-    private static final int ACCOUNTS_LOADER = 555; 
+
+    private static final int ACCOUNTS_LOADER = 555;
 
     /**
      * A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity.
@@ -254,7 +254,8 @@
     }
 
     public void updateAllAccounts() {
-        getActivity().getLoaderManager().restartLoader(ACCOUNTS_LOADER, null, this);
+        if (getActivity() != null)
+            getActivity().getLoaderManager().restartLoader(ACCOUNTS_LOADER, null, this);
 
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/HomeFragment.java
similarity index 94%
rename from src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java
rename to src/com/savoirfairelinux/sflphone/fragments/HomeFragment.java
index 3d24cb4..a3dcdd7 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/HomeFragment.java
@@ -66,8 +66,8 @@
 /**
  * Main list of Call Elements. We don't manage contacts ourself so they are
  */
-public class CallElementListFragment extends ListFragment {
-    private static final String TAG = CallElementListFragment.class.getSimpleName();
+public class HomeFragment extends ListFragment {
+    private static final String TAG = HomeFragment.class.getSimpleName();
     private CallElementAdapter mAdapter;
 
 
@@ -254,20 +254,20 @@
 
     }
 
-    private static final int REQUEST_CODE_PREFERENCES = 1;
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        Log.i(TAG, "onOptionsItemSelected " + item.getItemId());
-        switch (item.getItemId()) {
-        case R.id.menu_settings:
-            Intent launchPreferencesIntent = new Intent().setClass(getActivity(), SFLPhonePreferenceActivity.class);
-            startActivityForResult(launchPreferencesIntent, SFLPhoneHomeActivity.REQUEST_CODE_PREFERENCES);
-            break;
-        }
-
-        return super.onOptionsItemSelected(item);
-    }
+//    private static final int REQUEST_CODE_PREFERENCES = 1;
+//
+//    @Override
+//    public boolean onOptionsItemSelected(MenuItem item) {
+//        Log.i(TAG, "onOptionsItemSelected " + item.getItemId());
+//        switch (item.getItemId()) {
+//        case R.id.menu_settings:
+//            Intent launchPreferencesIntent = new Intent().setClass(getActivity(), SFLPhonePreferenceActivity.class);
+//            startActivityForResult(launchPreferencesIntent, SFLPhoneHomeActivity.REQUEST_CODE_PREFERENCES);
+//            break;
+//        }
+//
+//        return super.onOptionsItemSelected(item);
+//    }
 
     public void updateCall(String iD, String newState) {
         if (mAdapter == null) {
diff --git a/src/com/savoirfairelinux/sflphone/fragments/MenuFragment.java b/src/com/savoirfairelinux/sflphone/fragments/MenuFragment.java
index 095b135..3cac94e 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/MenuFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/MenuFragment.java
@@ -1,14 +1,11 @@
 package com.savoirfairelinux.sflphone.fragments;
 
-import java.util.Random;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 import android.app.Activity;
 import android.app.Fragment;
-import android.app.LoaderManager.LoaderCallbacks;
 import android.content.Intent;
-import android.content.Loader;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
@@ -24,7 +21,6 @@
 import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.adapters.ContactPictureLoader;
 import com.savoirfairelinux.sflphone.adapters.MenuAdapter;
 import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
 import com.savoirfairelinux.sflphone.client.SFLPhonePreferenceActivity;
@@ -85,13 +81,17 @@
         });
 
         Cursor mProfileCursor = getActivity().getContentResolver().query(Profile.CONTENT_URI, mProjection, null, null, null);
-        mProfileCursor.moveToFirst();
 
-        ((ImageView) inflatedView.findViewById(R.id.user_photo)).setImageURI(Uri.parse(mProfileCursor.getString(mProfileCursor
-                .getColumnIndex(Profile.PHOTO_THUMBNAIL_URI))));
-        ((TextView) inflatedView.findViewById(R.id.user_name)).setText(mProfileCursor.getString(mProfileCursor
-                .getColumnIndex(Profile.DISPLAY_NAME_PRIMARY)));
-
+        if (mProfileCursor.getCount() > 0) {
+            mProfileCursor.moveToFirst();
+            String photo_uri = mProfileCursor.getString(mProfileCursor.getColumnIndex(Profile.PHOTO_THUMBNAIL_URI));
+            if (photo_uri != null) {
+                ((ImageView) inflatedView.findViewById(R.id.user_photo)).setImageURI(Uri.parse(photo_uri));
+            }
+            ((TextView) inflatedView.findViewById(R.id.user_name)).setText(mProfileCursor.getString(mProfileCursor
+                    .getColumnIndex(Profile.DISPLAY_NAME_PRIMARY)));
+            mProfileCursor.close();
+        }
         return inflatedView;
     }
 
