* #38608: new utility classes for history
diff --git a/src/org/sflphone/fragments/HistoryFragment.java b/src/org/sflphone/fragments/HistoryFragment.java
index cd5f3e7..f2366e8 100644
--- a/src/org/sflphone/fragments/HistoryFragment.java
+++ b/src/org/sflphone/fragments/HistoryFragment.java
@@ -40,7 +40,7 @@
 import org.sflphone.client.DetailHistoryActivity;
 import org.sflphone.loaders.HistoryLoader;
 import org.sflphone.loaders.LoaderConstants;
-import org.sflphone.model.HistoryEntry;
+import org.sflphone.history.HistoryEntry;
 import org.sflphone.service.ISipService;
 
 import android.app.Activity;
@@ -117,12 +117,8 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.menu_clear_history:
-                try {
-                    mCallbacks.getService().clearHistory();
+                // TODO clean Database!
                     getLoaderManager().restartLoader(LoaderConstants.HISTORY_LOADER, null, this);
-                } catch (RemoteException e) {
-                    e.printStackTrace();
-                }
                 return true;
             default:
                 return super.onOptionsItemSelected(item);
@@ -167,8 +163,7 @@
     public void onStart() {
         super.onStart();
         Log.w(TAG, "onStart");
-        getActivity().supportInvalidateOptionsMenu();
-        getLoaderManager().restartLoader(LoaderConstants.HISTORY_LOADER, null, this);
+        //getLoaderManager().restartLoader(LoaderConstants.HISTORY_LOADER, null, this);
     }
 
     public void makeNewCall(int position) {
diff --git a/src/org/sflphone/history/DatabaseHelper.java b/src/org/sflphone/history/DatabaseHelper.java
new file mode 100644
index 0000000..3e52334
--- /dev/null
+++ b/src/org/sflphone/history/DatabaseHelper.java
@@ -0,0 +1,114 @@
+/*
+ *  Copyright (C) 2004-2014 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 org.sflphone.history;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.util.Log;
+import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
+import com.j256.ormlite.dao.Dao;
+import com.j256.ormlite.support.ConnectionSource;
+import com.j256.ormlite.table.TableUtils;
+
+import java.sql.SQLException;
+
+/**
+ * Database helper class used to manage the creation and upgrading of your database. This class also usually provides
+ * the DAOs used by the other classes.
+ */
+public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
+
+    // name of the database file for your application -- change to something appropriate for your app
+    private static final String DATABASE_NAME = "history.db";
+    // any time you make changes to your database objects, you may have to increase the database version
+    private static final int DATABASE_VERSION = 1;
+
+    // the DAO object we use to access the SimpleData table
+    private Dao<HistoryCall, Integer> historyDao = null;
+
+    public DatabaseHelper(Context context) {
+        super(context, DATABASE_NAME, null, DATABASE_VERSION);
+    }
+
+    /**
+     * This is called when the database is first created. Usually you should call createTable statements here to create
+     * the tables that will store your data.
+     */
+    @Override
+    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
+        try {
+            Log.i(DatabaseHelper.class.getName(), "onCreate");
+            TableUtils.createTable(connectionSource, HistoryCall.class);
+        } catch (SQLException e) {
+            Log.e(DatabaseHelper.class.getName(), "Can't create database", e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * This is called when your application is upgraded and it has a higher version number. This allows you to adjust
+     * the various data to match the new version number.
+     */
+    @Override
+    public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
+        try {
+            Log.i(DatabaseHelper.class.getName(), "onUpgrade");
+            TableUtils.dropTable(connectionSource, HistoryCall.class, true);
+            // after we drop the old databases, we create the new ones
+            onCreate(db, connectionSource);
+        } catch (SQLException e) {
+            Log.e(DatabaseHelper.class.getName(), "Can't drop databases", e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached
+     * value.
+     */
+    public Dao<HistoryCall, Integer> getHistoryDao() throws SQLException {
+        if (historyDao == null) {
+            historyDao = getDao(HistoryCall.class);
+        }
+        return historyDao;
+    }
+
+    /**
+     * Close the database connections and clear any cached DAOs.
+     */
+    @Override
+    public void close() {
+        super.close();
+        historyDao = null;
+    }
+}
diff --git a/src/org/sflphone/history/HistoryCall.java b/src/org/sflphone/history/HistoryCall.java
new file mode 100644
index 0000000..27b4716
--- /dev/null
+++ b/src/org/sflphone/history/HistoryCall.java
@@ -0,0 +1,7 @@
+package org.sflphone.history;
+
+/**
+ * Created by lisional on 14/01/14.
+ */
+public class HistoryCall {
+}
diff --git a/src/org/sflphone/model/HistoryEntry.java b/src/org/sflphone/history/HistoryEntry.java
similarity index 95%
rename from src/org/sflphone/model/HistoryEntry.java
rename to src/org/sflphone/history/HistoryEntry.java
index 0866c5a..3003750 100644
--- a/src/org/sflphone/model/HistoryEntry.java
+++ b/src/org/sflphone/history/HistoryEntry.java
@@ -29,7 +29,7 @@
  *  as that of the covered work.
  */
 
-package org.sflphone.model;
+package org.sflphone.history;
 
 import java.sql.Timestamp;
 import java.text.SimpleDateFormat;
@@ -41,8 +41,8 @@
 import java.util.TimeZone;
 import java.util.TreeMap;
 
+import org.sflphone.model.CallContact;
 import org.sflphone.service.ServiceConstants;
-import org.sflphone.utils.HistoryManager;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -195,9 +195,14 @@
         String timeFormatted;
         String displayName;
 
+        String accountID;
+
+        long contactID;
+
         public HistoryCall(HashMap<String, String> entry) {
             call_end = Long.parseLong(entry.get(ServiceConstants.history.TIMESTAMP_STOP_KEY));
             call_start = Long.parseLong(entry.get(ServiceConstants.history.TIMESTAMP_START_KEY));
+            accountID = entry.get(ServiceConstants.history.ACCOUNT_ID_KEY);
 
             direction = entry.get(ServiceConstants.history.DIRECTION_KEY);
             missed = entry.get(ServiceConstants.history.MISSED_KEY).contentEquals("true");
@@ -205,7 +210,7 @@
             displayName = entry.get(ServiceConstants.history.DISPLAY_NAME_KEY);
             recordPath = entry.get(ServiceConstants.history.RECORDING_PATH_KEY);
             number = entry.get(ServiceConstants.history.PEER_NUMBER_KEY);
-            timeFormatted = HistoryManager.timeToHistoryConst(call_start);
+            timeFormatted = HistoryTimeModel.timeToHistoryConst(call_start);
         }
 
         public String getDirection() {
@@ -265,12 +270,14 @@
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeLong(call_start);
             dest.writeLong(call_end);
+            dest.writeString(accountID);
             dest.writeString(number);
             dest.writeByte((byte) (missed ? 1 : 0));
             dest.writeString(direction);
             dest.writeString(recordPath);
             dest.writeString(timeFormatted);
             dest.writeString(displayName);
+            dest.writeLong(contactID);
         }
 
         public static final Parcelable.Creator<HistoryCall> CREATOR = new Parcelable.Creator<HistoryCall>() {
@@ -286,12 +293,14 @@
         private HistoryCall(Parcel in) {
             call_start = in.readLong();
             call_end = in.readLong();
+            accountID = in.readString();
             number = in.readString();
             missed = in.readByte() == 1 ? true : false;
             direction = in.readString();
             recordPath = in.readString();
             timeFormatted = in.readString();
             displayName = in.readString();
+            contactID = in.readLong();
         }
 
         public boolean hasRecord() {
diff --git a/src/org/sflphone/history/HistoryManager.java b/src/org/sflphone/history/HistoryManager.java
new file mode 100644
index 0000000..25aa853
--- /dev/null
+++ b/src/org/sflphone/history/HistoryManager.java
@@ -0,0 +1,68 @@
+/*
+ *  Copyright (C) 2004-2014 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 org.sflphone.history;
+
+import android.content.Context;
+import com.j256.ormlite.android.apptools.OpenHelperManager;
+import com.j256.ormlite.dao.Dao;
+
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Locale;
+
+public class HistoryManager {
+
+    private Context mContext;
+    private DatabaseHelper historyDBHelper = null;
+
+    public HistoryManager(Context context) {
+        getHelper();
+        mContext = context;
+    }
+
+    /**
+     * Retrieve helper for our DB
+     */
+    private DatabaseHelper getHelper() {
+        if (historyDBHelper == null) {
+            historyDBHelper = OpenHelperManager.getHelper(mContext, DatabaseHelper.class);
+        }
+        return historyDBHelper;
+    }
+
+    public List<HistoryCall> getAll() throws SQLException {
+        return getHelper().getHistoryDao().queryForAll();
+    }
+}
diff --git a/src/org/sflphone/history/HistoryTimeModel.java b/src/org/sflphone/history/HistoryTimeModel.java
new file mode 100644
index 0000000..4839059
--- /dev/null
+++ b/src/org/sflphone/history/HistoryTimeModel.java
@@ -0,0 +1,7 @@
+package org.sflphone.history;
+
+/**
+ * Created by lisional on 14/01/14.
+ */
+public class HistoryTimeModel {
+}
diff --git a/src/org/sflphone/loaders/HistoryLoader.java b/src/org/sflphone/loaders/HistoryLoader.java
index 0bdb7ba..a8acab9 100644
--- a/src/org/sflphone/loaders/HistoryLoader.java
+++ b/src/org/sflphone/loaders/HistoryLoader.java
@@ -31,36 +31,29 @@
 
 package org.sflphone.loaders;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.sflphone.model.CallContact;
-import org.sflphone.model.CallContact.ContactBuilder;
-import org.sflphone.model.HistoryEntry;
-import org.sflphone.model.HistoryEntry.HistoryCall;
-import org.sflphone.service.ISipService;
-import org.sflphone.service.ServiceConstants;
-
+import android.content.AsyncTaskLoader;
 import android.content.Context;
-import android.os.RemoteException;
-import android.provider.ContactsContract.Contacts;
-import android.support.v4.content.AsyncTaskLoader;
-import android.util.Log;
+import android.database.Cursor;
+import android.provider.ContactsContract;
+import org.sflphone.history.HistoryCall;
+import org.sflphone.history.HistoryEntry;
+import org.sflphone.history.HistoryManager;
+import org.sflphone.model.CallContact;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class HistoryLoader extends AsyncTaskLoader<ArrayList<HistoryEntry>> {
 
     private static final String TAG = HistoryLoader.class.getSimpleName();
-    private ISipService service;
-    HashMap<String, HistoryEntry> historyEntries;
 
-    static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY,
-            Contacts.STARRED };
+    ArrayList<HistoryEntry> historyEntries;
+    private HistoryManager historyManager = null;
 
-    public HistoryLoader(Context context, ISipService isip) {
+    public HistoryLoader(Context context) {
         super(context);
-        service = isip;
+        historyManager = new HistoryManager(context);
     }
 
     @SuppressWarnings("unchecked")
@@ -68,11 +61,41 @@
     @Override
     public ArrayList<HistoryEntry> loadInBackground() {
 
-        historyEntries = new HashMap<String, HistoryEntry>();
+        historyEntries = new ArrayList<HistoryEntry>();
 
-        if (service == null) {
-            return new ArrayList<HistoryEntry>();
+        try {
+            List<HistoryCall> list = historyManager.getAll();
+
+            HistoryEntry tmp;
+            CallContact.ContactBuilder builder = CallContact.ContactBuilder.getInstance();
+            for (HistoryCall call : list) {
+                CallContact contact;
+                if (call.getContactID() == 0) {
+                    contact = CallContact.ContactBuilder.buildUnknownContact(call.getNumber());
+                } else {
+                    Cursor result = getContext().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null,
+                            ContactsContract.Contacts._ID + " = ?",
+                            new String[]{String.valueOf(call.getContactID())}, null);
+                    int iID = result.getColumnIndex(ContactsContract.Contacts._ID);
+                    int iName = result.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
+                    int iPhoto = result.getColumnIndex(ContactsContract.Contacts.PHOTO_ID);
+                    int iStarred = result.getColumnIndex(ContactsContract.Contacts.STARRED);
+
+                    if (result.moveToFirst()) {
+                        builder.startNewContact(result.getLong(iID), result.getString(iName), result.getLong(iPhoto));
+                        contact = builder.build();
+                    } else {
+                        contact = CallContact.ContactBuilder.buildUnknownContact(call.getNumber());
+                    }
+                }
+                tmp = new HistoryEntry(call.getAccountID(), contact);
+                historyEntries.add(tmp);
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
         }
+
+/*
         try {
             ArrayList<HashMap<String, String>> history = (ArrayList<HashMap<String, String>>) service.getHistory();
 
@@ -117,7 +140,9 @@
 
         } catch (RemoteException e) {
             Log.i(TAG, e.toString());
-        }
-        return new ArrayList<HistoryEntry>(historyEntries.values());
+        }*/
+        return historyEntries;
     }
+
+
 }
diff --git a/src/org/sflphone/receivers/IncomingReceiver.java b/src/org/sflphone/receivers/IncomingReceiver.java
deleted file mode 100644
index 9bf0fd0..0000000
--- a/src/org/sflphone/receivers/IncomingReceiver.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- *  Copyright (C) 2004-2014 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 org.sflphone.receivers;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map.Entry;
-
-import org.sflphone.client.CallActivity;
-import org.sflphone.model.Account;
-import org.sflphone.model.CallContact;
-import org.sflphone.model.Conference;
-import org.sflphone.model.SipCall;
-import org.sflphone.model.SipMessage;
-import org.sflphone.service.CallManagerCallBack;
-import org.sflphone.service.ConfigurationManagerCallback;
-import org.sflphone.service.ISipService.Stub;
-import org.sflphone.service.ServiceConstants;
-import org.sflphone.service.SipService;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.util.Log;
-
-public class IncomingReceiver extends BroadcastReceiver {
-
-    static final String TAG = IncomingReceiver.class.getSimpleName();
-
-    SipService callback;
-    Stub mBinder;
-
-    public IncomingReceiver(SipService client, Stub bind) {
-        callback = client;
-        mBinder = bind;
-    }
-
-    @SuppressWarnings("unchecked")
-    // Hashmap runtime cast
-    @Override
-    public void onReceive(Context context, Intent intent) {
-
-        if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
-
-            Log.i(TAG, "Received" + intent.getAction());
-            callback.sendBroadcast(intent);
-
-        } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
-
-            Log.i(TAG, "Received" + intent.getAction());
-            callback.sendBroadcast(intent);
-
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
-
-            Bundle extra = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-            Log.i(TAG, "Received" + intent.getAction());
-            if (callback.getCurrent_calls().get(extra.getString("CallID")) != null) {
-                callback.getCurrent_calls().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
-            } else if (callback.getCurrent_confs().get(extra.getString("CallID")) != null) {
-                callback.getCurrent_confs().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
-            } else
-                return;
-
-            callback.sendBroadcast(intent);
-
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
-            Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
-
-            SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
-
-            Account acc;
-            try {
-                HashMap<String, String> details = (HashMap<String, String>) mBinder.getAccountDetails(b.getString("AccountID"));
-                ArrayList<HashMap<String, String>> credentials = (ArrayList<HashMap<String, String>>) mBinder
-                        .getCredentials(b.getString("AccountID"));
-                acc = new Account(b.getString("AccountID"), details, credentials);
-                callBuilder.startCallCreation(b.getString("CallID")).setAccount(acc).setCallState(SipCall.state.CALL_STATE_RINGING)
-                        .setCallType(SipCall.state.CALL_TYPE_INCOMING);
-                callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
-
-                Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
-                toSend.setClass(callback, CallActivity.class);
-                toSend.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
-                SipCall newCall = callBuilder.build();
-                toSend.putExtra("newcall", newCall);
-                HashMap<String, String> callDetails = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
-
-                newCall.setTimestamp_start(Long.parseLong(callDetails.get(ServiceConstants.call.TIMESTAMP_START)));
-                callback.getCurrent_calls().put(newCall.getCallId(), newCall);
-                // callback.sendBroadcast(toSend);
-                Bundle bundle = new Bundle();
-                Conference tmp = new Conference("-1");
-
-                tmp.getParticipants().add(newCall);
-
-                bundle.putParcelable("conference", tmp);
-                toSend.putExtra("resuming", false);
-                toSend.putExtras(bundle);
-                callback.startActivity(toSend);
-                callback.mediaManager.startRing("");
-                callback.mediaManager.obtainAudioFocus(true);
-            } catch (RemoteException e1) {
-                e1.printStackTrace();
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
-
-            Log.i(TAG, "Received " + intent.getAction());
-            Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
-            String newState = b.getString("State");
-
-            try {
-                if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
-                    callback.getCurrent_calls().remove(b.getString("CallID"));
-                }
-            } catch (RemoteException e1) {
-                e1.printStackTrace();
-            }
-
-            if (newState.equals("INCOMING")) {
-                callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
-            } else if (newState.equals("RINGING")) {
-                try {
-                    callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
-                } catch (NullPointerException e) {
-                    if (callback.getCurrent_calls() == null) {
-                        return;
-                    }
-                    if (callback.getCurrent_calls().get(b.getString("CallID")) == null) {
-                        Log.e(TAG, "get(b.getString(callID)) null");
-                        return;
-                    }
-                }
-
-            } else if (newState.equals("CURRENT")) {
-                if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
-                    callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
-                } else {
-                    // Check if call is in a conference
-                    Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
-                    while (it.hasNext()) {
-                        Conference tmp = it.next().getValue();
-                        for (SipCall c : tmp.getParticipants()) {
-                            if (c.getCallId().contentEquals(b.getString("CallID")))
-                                c.setCallState(SipCall.state.CALL_STATE_CURRENT);
-                        }
-                    }
-                }
-
-            } else if (newState.equals("HUNGUP")) {
-
-                if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
-
-                    if (callback.getCurrent_calls().get(b.getString("CallID")).isRinging()
-                            && callback.getCurrent_calls().get(b.getString("CallID")).isIncoming())
-                        callback.notificationManager.publishMissedCallNotification(callback.getCurrent_calls().get(b.getString("CallID")));
-                    callback.getCurrent_calls().remove(b.getString("CallID"));
-                } else {
-                    ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
-
-                    boolean found = false;
-                    int i = 0;
-                    while (!found && i < it.size()) {
-                        Conference tmp = it.get(i);
-
-                        for (int j = 0; j < tmp.getParticipants().size(); ++j) {
-                            if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
-                                callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
-                                found = true;
-                            }
-
-                        }
-                        ++i;
-
-                    }
-                }
-
-                callback.sendBroadcast(intent);
-
-            } else if (newState.equals("BUSY")) {
-                callback.getCurrent_calls().remove(b.getString("CallID"));
-            } else if (newState.equals("FAILURE")) {
-                callback.getCurrent_calls().remove(b.getString("CallID"));
-            } else if (newState.equals("HOLD")) {
-                if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
-                    callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
-                } else {
-                    // Check if call is in a conference
-                    Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
-                    while (it.hasNext()) {
-                        Conference tmp = it.next().getValue();
-                        for (SipCall c : tmp.getParticipants()) {
-                            if (c.getCallId().contentEquals(b.getString("CallID")))
-                                c.setCallState(SipCall.state.CALL_STATE_HOLD);
-                        }
-                    }
-                }
-            } else if (newState.equals("UNHOLD")) {
-
-                if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
-                    callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
-                } else {
-                    // Check if call is in a conference
-                    Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
-                    while (it.hasNext()) {
-                        Conference tmp = it.next().getValue();
-                        for (SipCall c : tmp.getParticipants()) {
-                            if (c.getCallId().contentEquals(b.getString("CallID")))
-                                c.setCallState(SipCall.state.CALL_STATE_CURRENT);
-                        }
-                    }
-                }
-            } else {
-                callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
-            }
-
-            callback.sendBroadcast(intent);
-
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
-
-            Log.i(TAG, "Received" + intent.getAction());
-
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
-
-            Log.i(TAG, "Received" + intent.getAction());
-            Conference created = new Conference(intent.getStringExtra("confID"));
-
-            try {
-                ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
-                for (String participant : all_participants) {
-                    created.getParticipants().add(callback.getCurrent_calls().get(participant));
-                    callback.getCurrent_calls().remove(participant);
-                }
-                Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
-                toSend.putExtra("newconf", created);
-                callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
-                callback.sendBroadcast(toSend);
-            } catch (RemoteException e1) {
-                e1.printStackTrace();
-            }
-            Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
-
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
-
-            Log.i(TAG, "Received" + intent.getAction());
-            Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
-            for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
-                callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
-            }
-            callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
-            callback.sendBroadcast(intent);
-
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
-
-            ArrayList<String> all_participants;
-            try {
-                all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
-                for (String participant : all_participants) {
-                    if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
-                            && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
-                        callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
-                                .add(callback.getCurrent_calls().get(participant));
-                        callback.getCurrent_calls().remove(participant);
-                        callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
-                        callback.sendBroadcast(intent);
-                        return;
-                    }
-                }
-            } catch (RemoteException e) {
-                e.printStackTrace();
-            }
-
-            Log.i(TAG, "Received" + intent.getAction());
-            if (callback.getCurrent_confs().get(intent.getStringExtra("confID")) != null) {
-
-                callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
-                callback.sendBroadcast(intent);
-            }
-
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
-
-            Log.i(TAG, "Received" + intent.getAction());
-
-            // try {
-            // if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
-            // callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-            // } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
-            // callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-            // } else {
-            // // A call in a conference has been put on hold
-            // Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
-            // while (it.hasNext()) {
-            // Conference c = it.next();
-            // if (c.getCall(intent.getStringExtra("id")) != null)
-            // c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-            // }
-            // }
-            // // Re sending the same intent to the app
-            // callback.sendBroadcast(intent);
-            // ;
-            // } catch (RemoteException e) {
-            // // TODO Auto-generated catch block
-            // e.printStackTrace();
-            // }
-
-        }
-
-    }
-}
diff --git a/src/org/sflphone/service/ISipService.aidl b/src/org/sflphone/service/ISipService.aidl
index 9d8a326..c4c5e18 100644
--- a/src/org/sflphone/service/ISipService.aidl
+++ b/src/org/sflphone/service/ISipService.aidl
@@ -34,16 +34,11 @@
     
     // FIXME
     void toggleSpeakerPhone(in boolean toggle);
-    
-    /* History */
-    List getHistory();
-    void clearHistory();
-    
+
     /* Notification */
     void createNotification();
     void destroyNotification();
-    
-    
+
     /* Recording */
     void setRecordPath(in String path);
     String getRecordPath();
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index 439a6ab..5de1bc1 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -604,43 +604,6 @@
             });
         }
 
-        @Override
-        public ArrayList<HashMap<String, String>> getHistory() throws RemoteException {
-            class History extends SipRunnableWithReturn {
-
-                @Override
-                protected VectMap doRun() throws SameThreadException {
-                    Log.i(TAG, "SipService.getHistory() thread running...");
-
-                    return configurationManagerJNI.getHistory();
-                }
-            }
-
-            History runInstance = new History();
-            getExecutor().execute(runInstance);
-            while (!runInstance.isDone()) {
-                // Log.w(TAG, "Waiting for getHistory");
-            }
-            Log.i(TAG, "SipService.getHistory() DONE");
-            VectMap swigmap = (VectMap) runInstance.getVal();
-
-            ArrayList<HashMap<String, String>> nativemap = SwigNativeConverter.convertHistoryToNative(swigmap);
-
-            return nativemap;
-        }
-
-        @Override
-        public void clearHistory() throws RemoteException {
-            getExecutor().execute(new SipRunnable() {
-                @Override
-                protected void doRun() throws SameThreadException {
-                    Log.i(TAG, "SipService.clearHistory() thread running...");
-                    configurationManagerJNI.clearHistory();
-                }
-            });
-
-        }
-
         /*************************
          * Transfer related API
          *************************/
diff --git a/src/org/sflphone/utils/HistoryManager.java b/src/org/sflphone/utils/HistoryManager.java
deleted file mode 100644
index d3fc186..0000000
--- a/src/org/sflphone/utils/HistoryManager.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  Copyright (C) 2004-2014 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 org.sflphone.utils;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Locale;
-
-public class HistoryManager {
-
-    static ArrayList<String> timeCategories;
-
-    public interface HistoryTimeCategoryModel {
-        String TODAY = "Today"; // 0
-        String YESTERDAY = "Yesterday"; // 1
-        String TWO_DAYS = HistoryManager.getDate(2, "MM/dd");// 2
-        String THREE_DAYS = HistoryManager.getDate(3, "MM/dd");// 3
-        String FOUR_DAYS = HistoryManager.getDate(4, "MM/dd");// 4
-        String FIVE_DAYS = HistoryManager.getDate(5, "MM/dd");// 5
-        String SIX_DAYS = HistoryManager.getDate(6, "MM/dd");// 6
-        String LAST_WEEK = "Last week"; // 7
-        String TWO_WEEKS = "Two weeks ago"; // 8
-        String THREE_WEEKS = "Three weeks ago"; // 9
-        String LAST_MONTH = "Last month"; // 10
-        String TWO_MONTH = "Two months ago"; // 11
-        String THREE_MONTH = "Three months ago"; // 12
-        String FOUR_MONTH = "Four months ago"; // 13
-        String FIVE_MONTH = "Five months ago"; // 14
-        String SIX_MONTH = "Six months ago"; // 15
-        String SEVEN_MONTH = "Seven months ago"; // 16
-        String EIGHT_MONTH = "Eight months ago"; // 17
-        String NINE_MONTH = "Nine months ago"; // 18
-        String TEN_MONTH = "Ten months ago"; // 19
-        String ELEVEN_MONTH = "Eleven months ago"; // 20
-        String TWELVE_MONTH = "Twelve months ago"; // 21
-        String LAST_YEAR = "Last year"; // 22
-        String LONG_TIME_AGO = "Very long time ago"; // 23
-        String NEVER = "Never"; // 24
-    }
-
-    private static final String TAG = HistoryManager.class.getSimpleName();
-
-    static Calendar removeDays(int ago) {
-        Calendar cal = Calendar.getInstance(Locale.getDefault());
-        int currentDay = cal.get(Calendar.DAY_OF_MONTH);
-        // Set the date to 2 days ago
-        cal.set(Calendar.DAY_OF_MONTH, currentDay - ago);
-        return cal;
-    }
-
-    static String getDate(int ago, String format) {
-        Calendar cal = removeDays(ago);
-        SimpleDateFormat objFormatter = new SimpleDateFormat(format, Locale.CANADA);
-        objFormatter.setTimeZone(cal.getTimeZone());
-
-        String result = objFormatter.format(cal.getTime());
-        cal.clear();
-        return result;
-    }
-
-    public static String timeToHistoryConst(long time) {
-        
-        if(timeCategories == null){
-            initializeCategories();
-        }
-        
-        long time2 = time;
-        long currentTime = Calendar.getInstance(Locale.getDefault()).getTime().getTime() / 1000; // in seconds
-
-        if (time < 0)
-            return HistoryTimeCategoryModel.NEVER;
-
-        // Check if part if the current Nychthemeron
-        if (currentTime - time <= 3600 * 24) // The future case would be a bug, but it have to be handled anyway or it will appear in
-                                             // "very long time ago"
-            return HistoryTimeCategoryModel.TODAY;
-
-        time2 -= time % (3600 * 24); // Reset to midnight
-        currentTime -= currentTime % (3600 * 24); // Reset to midnight
-        // Check for last week
-        if (currentTime - (6) * 3600 * 24 < time2) {
-            for (int i = 1; i < 7; i++) {
-                if (currentTime - ((i) * 3600 * 24) == time2)
-                    return timeCategories.get(i); // Yesterday to Six_days_ago
-            }
-        }
-        // Check for last month
-        else if (currentTime - ((4) * 7 * 24 * 3600) < time2) {
-            for (int i = 1; i < 4; i++) {
-                if (currentTime - ((i + 1) * 7 * 24 * 3600) < time2)
-                    return timeCategories.get(i + timeCategories.indexOf(HistoryTimeCategoryModel.LAST_WEEK) - 1); // Last_week to Three_weeks_ago
-            }
-        }
-        // Check for last year
-        else if (currentTime - (12) * 30.4f * 24 * 3600 < time2) {
-            for (int i = 1; i < 12; i++) {
-                if (currentTime - (i + 1) * 30.4f * 24 * 3600 < time2) // Not exact, but faster
-                    return timeCategories.get(i + timeCategories.indexOf(HistoryTimeCategoryModel.LAST_MONTH) - 1);
-                ; // Last_month to Twelve_months ago
-            }
-        }
-        // if (QDate::currentDate().addYears(-1) >= date && QDate::currentDate().addYears(-2) < date)
-        else if (currentTime - 365 * 24 * 3600 < time2)
-            return HistoryTimeCategoryModel.LAST_YEAR;
-
-        // Every other senario
-        return HistoryTimeCategoryModel.LONG_TIME_AGO;
-    }
-
-    private static void initializeCategories() {
-        timeCategories = new ArrayList<String>();
-        timeCategories.add(HistoryTimeCategoryModel.TODAY);
-        timeCategories.add(HistoryTimeCategoryModel.YESTERDAY);
-        timeCategories.add(HistoryTimeCategoryModel.TWO_DAYS);
-        timeCategories.add(HistoryTimeCategoryModel.THREE_DAYS);
-        timeCategories.add(HistoryTimeCategoryModel.FOUR_DAYS);
-        timeCategories.add(HistoryTimeCategoryModel.FIVE_DAYS);
-        timeCategories.add(HistoryTimeCategoryModel.SIX_DAYS);
-        timeCategories.add(HistoryTimeCategoryModel.LAST_WEEK);
-        timeCategories.add(HistoryTimeCategoryModel.TWO_WEEKS);
-        timeCategories.add(HistoryTimeCategoryModel.THREE_WEEKS);
-        timeCategories.add(HistoryTimeCategoryModel.LAST_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.TWO_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.THREE_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.FOUR_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.FIVE_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.SIX_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.SEVEN_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.EIGHT_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.NINE_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.TEN_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.ELEVEN_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.TWELVE_MONTH);
-        timeCategories.add(HistoryTimeCategoryModel.LAST_YEAR);
-        timeCategories.add(HistoryTimeCategoryModel.LONG_TIME_AGO);
-        timeCategories.add(HistoryTimeCategoryModel.NEVER);
-    }
-
-}
diff --git a/src/org/sflphone/utils/SwigNativeConverter.java b/src/org/sflphone/utils/SwigNativeConverter.java
index 634c049..aa6fce5 100644
--- a/src/org/sflphone/utils/SwigNativeConverter.java
+++ b/src/org/sflphone/utils/SwigNativeConverter.java
@@ -80,36 +80,6 @@
         return toReturn;
     }
 
-    /**
-     * Swig to Native
-     */
-    public static ArrayList<HashMap<String, String>> convertHistoryToNative(VectMap swigmap) {
-        ArrayList<HashMap<String, String>> nativemap = new ArrayList<HashMap<String, String>>();
-
-        for (int i = 0; i < swigmap.size(); ++i) {
-            HashMap<String, String> entry = new HashMap<String, String>();
-
-            entry.put(ServiceConstants.history.ACCOUNT_ID_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.ACCOUNT_ID_KEY));
-            entry.put(ServiceConstants.history.CALLID_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.CALLID_KEY));
-            entry.put(ServiceConstants.history.CONFID_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.CONFID_KEY));
-            entry.put(ServiceConstants.history.DISPLAY_NAME_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.DISPLAY_NAME_KEY));
-            entry.put(ServiceConstants.history.PEER_NUMBER_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.PEER_NUMBER_KEY));
-            entry.put(ServiceConstants.history.RECORDING_PATH_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.RECORDING_PATH_KEY));
-            entry.put(ServiceConstants.history.DIRECTION_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.DIRECTION_KEY));
-            entry.put(ServiceConstants.history.MISSED_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.MISSED_KEY));
-            entry.put(ServiceConstants.history.TIMESTAMP_START_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.TIMESTAMP_START_KEY));
-            entry.put(ServiceConstants.history.TIMESTAMP_STOP_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.TIMESTAMP_STOP_KEY));
-            entry.put(ServiceConstants.history.AUDIO_CODEC_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.AUDIO_CODEC_KEY));
-            
-            if(entry.get(ServiceConstants.history.DIRECTION_KEY).isEmpty())
-                continue;
-
-            nativemap.add(entry);
-        }
-
-        return nativemap;
-    }
-
     private static String tryToGet(StringMap smap, String key) {
         if (smap.has_key(key)) {
             return smap.get(key);