diff --git a/res/layout/frag_contact_list.xml b/res/layout/frag_contact_list.xml
index fbcbded..5c7ca1c 100644
--- a/res/layout/frag_contact_list.xml
+++ b/res/layout/frag_contact_list.xml
@@ -32,6 +32,7 @@
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:swipe="http://schemas.android.com/apk/res-auto"
     android:id="@+id/drag_view"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
@@ -101,4 +102,5 @@
         android:textColor="@color/white"
         android:textSize="30sp" />
 
+
 </LinearLayout>
\ No newline at end of file
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index a383f01..3b1bc11 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -40,6 +40,5 @@
 	
 	<dimen name="bubble_size">100dp</dimen>
 	
-	<dimen name="header_history_detail">400dp</dimen>
 
 </resources>
\ No newline at end of file
diff --git a/src/org/sflphone/client/HomeActivity.java b/src/org/sflphone/client/HomeActivity.java
index 4fc6e9c..f03f80b 100644
--- a/src/org/sflphone/client/HomeActivity.java
+++ b/src/org/sflphone/client/HomeActivity.java
@@ -86,6 +86,7 @@
 import android.view.Gravity;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.WindowManager;
 import android.widget.RelativeLayout;
 import android.widget.Toast;
 
@@ -637,6 +638,14 @@
     }
 
     @Override
+    public void toggleForSearchDrawer() {
+        if (mContactDrawer.isExpanded()) {
+            mContactDrawer.collapsePane();
+        } else
+            mContactDrawer.expandPane();
+    }
+
+    @Override
     public void confCreated(Intent intent) {
         // TODO Auto-generated method stub
 
diff --git a/src/org/sflphone/fragments/ContactListFragment.java b/src/org/sflphone/fragments/ContactListFragment.java
index f6f57a4..5cb5838 100644
--- a/src/org/sflphone/fragments/ContactListFragment.java
+++ b/src/org/sflphone/fragments/ContactListFragment.java
@@ -127,6 +127,10 @@
         public void setDragView(RelativeLayout relativeLayout) {
             
         }
+
+        @Override
+        public void toggleForSearchDrawer() {
+        }
     };
 
     public interface Callbacks {
@@ -144,6 +148,8 @@
 
         void setDragView(RelativeLayout relativeLayout);
 
+        void toggleForSearchDrawer();
+
     }
 
     @Override
@@ -185,7 +191,7 @@
                 mQuickReturnSearchView.setOnQueryTextListener(ContactListFragment.this);
                 mQuickReturnSearchView.setIconified(false);
                 mQuickReturnSearchView.setFocusable(true);
-                mCallbacks.toggleDrawer();
+                mCallbacks.toggleForSearchDrawer();
             }
         });
 
@@ -274,7 +280,7 @@
 
             @Override
             public void onItemClick(AdapterView<?> arg0, View view, int pos, long id) {
-
+                Log.i(TAG, "Opening Item");
                 mSwipeLvTouchListener.openItem(view, pos, id);
             }
         });
diff --git a/src/org/sflphone/fragments/DetailsHistoryEntryFragment.java b/src/org/sflphone/fragments/DetailsHistoryEntryFragment.java
index e697b7e..4affba3 100644
--- a/src/org/sflphone/fragments/DetailsHistoryEntryFragment.java
+++ b/src/org/sflphone/fragments/DetailsHistoryEntryFragment.java
@@ -66,7 +66,6 @@
     View mheaderView;
     DetailHistoryAdapter mAdapter;
     HistoryEntry toDisplay;
-    @SuppressWarnings("unused")
     private static final String TAG = DetailsHistoryEntryFragment.class.getSimpleName();
     ContactPictureTask tasker;
 
@@ -120,6 +119,11 @@
         super.onCreate(savedInstanceState);
 
         toDisplay = (HistoryEntry) getArguments().get("entry");
+
+        Log.i(TAG, "Ok, we got " + toDisplay.getIncoming_sum() + " incoming calls");
+        Log.i(TAG, "Ok, we got " + toDisplay.getMissed_sum() + " missed calls");
+        Log.i(TAG, "Ok, we got " + toDisplay.getOutgoing_sum() + " outgoing calls");
+
         mAdapter = new DetailHistoryAdapter(toDisplay.getCalls(), getActivity());
     }
 
diff --git a/src/org/sflphone/fragments/HistoryFragment.java b/src/org/sflphone/fragments/HistoryFragment.java
index 94bc3b9..f602020 100644
--- a/src/org/sflphone/fragments/HistoryFragment.java
+++ b/src/org/sflphone/fragments/HistoryFragment.java
@@ -220,7 +220,6 @@
 
             // SipCall call = (SipCall) mCallList.values().toArray()[position];
             entryView.displayName.setText(dataset.get(pos).getContact().getmDisplayName());
-
             infos_fetcher.execute(new ContactPictureTask(mContext, entryView.photo, dataset.get(pos).getContact()));
 
             entryView.incoming.setText(getString(R.string.hist_in_calls, dataset.get(pos).getIncoming_sum()));
diff --git a/src/org/sflphone/loaders/HistoryLoader.java b/src/org/sflphone/loaders/HistoryLoader.java
index 94c01e5..c454cc8 100644
--- a/src/org/sflphone/loaders/HistoryLoader.java
+++ b/src/org/sflphone/loaders/HistoryLoader.java
@@ -46,10 +46,15 @@
             ArrayList<HashMap<String, String>> history = (ArrayList<HashMap<String, String>>) service.getHistory();
             for (HashMap<String, String> entry : history) {
 
+                CallContact contact = null;
+                String contactName = entry.get(ServiceConstants.history.DISPLAY_NAME_KEY);
                 String number_called = entry.get(ServiceConstants.history.PEER_NUMBER_KEY);
+                if (contactName.isEmpty()) {
+                    contact = ContactBuilder.buildUnknownContact(number_called);
+                } else {
+                    contact = ContactBuilder.getInstance().buildSimpleContact(contactName, number_called);
+                }
 
-//                Log.w(TAG, "----------------------Number" + number_called);
-                CallContact c = null;
                 if (historyEntries.containsKey(number_called)) {
                     // It's a direct match
                     historyEntries.get(number_called).addHistoryCall(new HistoryCall(entry));
@@ -59,19 +64,17 @@
                     Matcher m = p.matcher(number_called);
                     if (m.find()) {
 
-//                        Log.i(TAG, "Pattern found:" + m.group(1));
                         if (historyEntries.containsKey(m.group(1) + "@" + m.group(2))) {
                             historyEntries.get(m.group(1) + "@" + m.group(2)).addHistoryCall(new HistoryCall(entry));
                         } else {
-                            c = ContactBuilder.buildUnknownContact(m.group(1) + "@" + m.group(2));
-                            HistoryEntry e = new HistoryEntry(entry.get(ServiceConstants.history.ACCOUNT_ID_KEY), c);
+                            HistoryEntry e = new HistoryEntry(entry.get(ServiceConstants.history.ACCOUNT_ID_KEY), contact);
                             e.addHistoryCall(new HistoryCall(entry));
                             historyEntries.put(m.group(1) + "@" + m.group(2), e);
                         }
 
                     } else {
-                        c = ContactBuilder.buildUnknownContact(number_called);
-                        HistoryEntry e = new HistoryEntry(entry.get(ServiceConstants.history.ACCOUNT_ID_KEY), c);
+
+                        HistoryEntry e = new HistoryEntry(entry.get(ServiceConstants.history.ACCOUNT_ID_KEY), contact);
                         e.addHistoryCall(new HistoryCall(entry));
                         historyEntries.put(number_called, e);
                     }
diff --git a/src/org/sflphone/model/CallContact.java b/src/org/sflphone/model/CallContact.java
index adb7474..fd70395 100644
--- a/src/org/sflphone/model/CallContact.java
+++ b/src/org/sflphone/model/CallContact.java
@@ -182,6 +182,13 @@
             return result;
         }
 
+        public CallContact buildSimpleContact(String name, String number_called) {
+            ArrayList<Phone> phones = new ArrayList<Phone>();
+            phones.add(new Phone(number_called, 0));
+
+            return new CallContact(-1, name, 0, phones, new ArrayList<CallContact.Phone>(), "", false);
+        }
+
     }
 
     @Override
diff --git a/src/org/sflphone/model/HistoryEntry.java b/src/org/sflphone/model/HistoryEntry.java
index 578a030..278277b 100644
--- a/src/org/sflphone/model/HistoryEntry.java
+++ b/src/org/sflphone/model/HistoryEntry.java
@@ -85,11 +85,13 @@
 
     public void addHistoryCall(HistoryCall historyCall) {
         calls.put(historyCall.call_start, historyCall);
-        if (historyCall.getDirection().contentEquals(ServiceConstants.history.OUTGOING_STRING)) {
-            ++outgoing_sum;
-        } else if (historyCall.isIncoming()) {
+        if (historyCall.isIncoming()) {
             ++incoming_sum;
+        } else {
+            ++outgoing_sum;
         }
+        if (historyCall.isMissed())
+            missed_sum++;
     }
 
     public String getNumber() {
@@ -134,7 +136,6 @@
         dest.writeList(new ArrayList<HistoryCall>(calls.values()));
         dest.writeList(new ArrayList<Long>(calls.keySet()));
 
-        dest.writeMap(calls);
         dest.writeString(accountID);
         dest.writeInt(missed_sum);
         dest.writeInt(outgoing_sum);
@@ -242,7 +243,7 @@
         }
 
         public String getDisplayName() {
-            return displayName;
+            return displayName.substring(0, displayName.indexOf('@'));
         }
 
         @Override
