diff --git a/sflphone-client-kde/src/CMakeLists.txt b/sflphone-client-kde/src/CMakeLists.txt
old mode 100644
new mode 100755
index cb06b3bd53e8c09726f134a53334cc5374666542..a8e8bd4eb35310714edf5c32c372367fca34df95
--- a/sflphone-client-kde/src/CMakeLists.txt
+++ b/sflphone-client-kde/src/CMakeLists.txt
@@ -26,13 +26,13 @@ SET(	sflphone_client_kde_SRCS
 	Account.cpp
 	AccountList.cpp
 	Call.cpp
-	CallList.cpp
-	CallTreeView.cpp
-	CallTreeModel.cpp
+	#CallList.cpp
+	#CallTreeView.cpp
+	#CallTreeModel.cpp
 	CallTreeItem.cpp
 	configurationmanager_interface_singleton.cpp
 	callmanager_interface_singleton.cpp
-        calllist_interface_singleton.cpp
+        #calllist_interface_singleton.cpp
 	instance_interface_singleton.cpp
 	AccountWizard.cpp
 	AccountItemWidget.cpp
@@ -51,6 +51,8 @@ SET(	sflphone_client_kde_SRCS
 	Codec.cpp
 	Item.cpp
 	AccountListModel.cpp
+        CallModel.cpp
+        #CallTreeWidget.cpp
 )
  
 
diff --git a/sflphone-client-kde/src/Call.cpp b/sflphone-client-kde/src/Call.cpp
index 06a8777e61ef34b8c4a1519c74ff04790e0c9231..8942159b8ae21face7107cca4ef9a6ee9b7efb08 100644
--- a/sflphone-client-kde/src/Call.cpp
+++ b/sflphone-client-kde/src/Call.cpp
@@ -680,7 +680,11 @@ void Call::backspaceItemText()
 
 void Call::changeCurrentState(call_state newState)
 {
+   qDebug() << "Call state changed to: " << newState;
    currentState = newState;
 
    emit changed();
+   
+   if (currentState == CALL_STATE_OVER)
+      emit isOver(this);
 }
\ No newline at end of file
diff --git a/sflphone-client-kde/src/Call.h b/sflphone-client-kde/src/Call.h
index 0dea1e1f7fe218a76a2c98e6289d22d02745360a..2eb1b8798ad2204bf28f6956ac45e43ea6dae389 100644
--- a/sflphone-client-kde/src/Call.h
+++ b/sflphone-client-kde/src/Call.h
@@ -279,6 +279,7 @@ public:
 
 signals:
    void changed();
+   void isOver(Call*);
 };
 
 #endif
diff --git a/sflphone-client-kde/src/CallList.cpp b/sflphone-client-kde/src/CallList.cpp
index 2d8c0bc5b02d3e52d4dd490c9b2a9b78c3b5b972..60cc00770dbe79121393e7c49e501960b7f8977f 100644
--- a/sflphone-client-kde/src/CallList.cpp
+++ b/sflphone-client-kde/src/CallList.cpp
@@ -36,7 +36,8 @@ CallList::CallList(QObject * parent)
    for(int i = 0 ; i < callList.size() ; i++) {
       calls->append(Call::buildExistingCall(callList[i]));
    }
-        MapStringString historyMap = configurationManager.getHistory().value();
+   
+   MapStringString historyMap = configurationManager.getHistory().value();
    qDebug() << "Call History = " << historyMap;
    QMapIterator<QString, QString> i(historyMap);
    while (i.hasNext()) {
@@ -184,7 +185,7 @@ void CallList::clearHistory()
    }
 }
 
-Call * CallList::createConversationFromCall(Call* call1, Call* call2) {
+Call* CallList::createConversationFromCall(Call* call1, Call* call2) {
   qDebug() << "Need to join calls";
   CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
   //callManager.joinConference(call1->getCallId(),call2->getCallId());
diff --git a/sflphone-client-kde/src/CallList.h b/sflphone-client-kde/src/CallList.h
index 9aea1f74728128a6b8298e638618589beb5a581d..e55aa94913012d87a744d42efb680059d45bfbdf 100644
--- a/sflphone-client-kde/src/CallList.h
+++ b/sflphone-client-kde/src/CallList.h
@@ -34,7 +34,7 @@ Q_OBJECT
 
 private:
 
-   QVector<Call *> * calls;
+   QVector<Call*>* calls;
 
 public:
 
@@ -53,10 +53,10 @@ public:
    MapStringString getHistoryMap();
 
    //Setters
-   Call * addDialingCall(const QString & peerName = "", QString account = "");
-   Call * addIncomingCall(const QString & callId/*, const QString & from, const QString & account*/);
-   Call * addRingingCall(const QString & callId);
-        Call * createConversationFromCall(Call* call1, Call* call2);
+   Call* addDialingCall(const QString & peerName = "", QString account = "");
+   Call* addIncomingCall(const QString & callId/*, const QString & from, const QString & account*/);
+   Call* addRingingCall(const QString & callId);
+   Call* createConversationFromCall(Call* call1, Call* call2);
 
    //GSetter
    QString generateCallId();
diff --git a/sflphone-client-kde/src/CallModel.cpp b/sflphone-client-kde/src/CallModel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9d11984f50fb9a96a0c22302a824167da7669e69
--- /dev/null
+++ b/sflphone-client-kde/src/CallModel.cpp
@@ -0,0 +1,333 @@
+/***************************************************************************
+ *   Copyright (C) 2009-2010 by Savoir-Faire Linux                         *
+ *   Author : Emmanuel Lepage Valle <emmanuel.lepage@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.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/ 
+#include <CallModel.h>
+#include <QDebug>
+#include <unistd.h>
+
+#include "callmanager_interface_singleton.h"
+#include "configurationmanager_interface_singleton.h"
+
+CallModel::CallModel(ModelType type, QWidget* parent) : QTreeWidget(parent) {
+   CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+   ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
+   QStringList callList = callManager.getCallList();
+   qDebug() << "Call List = " << callList;
+   for(int i = 0 ; i < callList.size() ; i++) {
+      Call* tmpCall = Call::buildExistingCall(callList[i]);
+      activeCalls[tmpCall->getCallId()] = tmpCall;
+      if (type == ActiveCall)
+         addCall(tmpCall);
+   }
+   
+   //Add older calls
+   MapStringString historyMap = configurationManager.getHistory().value();
+   qDebug() << "Call History = " << historyMap;
+   QMapIterator<QString, QString> i(historyMap);
+   while (i.hasNext()) {
+      i.next();
+      uint startTimeStamp = i.key().toUInt();
+      QStringList param = i.value().split("|");
+      QString type = param[0];
+      QString number = param[1];
+      QString name = param[2];
+      uint stopTimeStamp = param[3].toUInt();
+      QString account = param[4];
+      historyCalls[QString::number(startTimeStamp)] = Call::buildHistoryCall(generateCallId(), startTimeStamp, stopTimeStamp, account, name, number, type);
+      //if (type == ActiveCall) //TODO undelete
+         //addCall(historyCalls[QString::number(startTimeStamp)]);
+   }
+   
+   //Widget part
+   setAcceptDrops(true);
+   setDragEnabled(true);
+   CallTreeItemDelegate *delegate = new CallTreeItemDelegate();
+   setItemDelegate(delegate); 
+}
+
+void CallModel::setTitle(QString title) {
+   headerItem()->setText(0,title);
+}
+
+Call* CallModel::addCall(Call* call, Call* parent) {
+   InternalCallModelStruct* aNewStruct = new InternalCallModelStruct;
+   aNewStruct->call_real = call;
+   
+   QTreeWidgetItem* callItem = new QTreeWidgetItem();
+   aNewStruct->currentItem = callItem;
+   
+   privateCallList_item[callItem] = aNewStruct;
+   privateCallList_call[call] = aNewStruct;
+   privateCallList_callId[call->getCallId()] = aNewStruct;
+   
+   aNewStruct->call = insertItem(callItem,parent);
+   privateCallList_widget[aNewStruct->call] = aNewStruct;
+   
+   setCurrentItem(callItem);
+   
+   connect(call, SIGNAL(isOver(Call*)), this, SLOT(destroyCall(Call*)));
+   return call;
+}
+
+MapStringString CallModel::getHistoryMap() {
+   MapStringString toReturn;
+   foreach(Call* call, historyCalls) {
+      toReturn[historyCalls.key(call)] = Call::getTypeFromHistoryState(call->getHistoryState()) + "|" + call->getPeerPhoneNumber() + "|" + call->getPeerName() + "|" + call->getStopTimeStamp() + "|" + call->getAccountId();
+   }
+}
+
+Call* CallModel::addDialingCall(const QString & peerName, QString account)
+{
+   Call* call = Call::buildDialingCall(generateCallId(), peerName, account);
+   activeCalls[call->getCallId()] = call;
+   addCall(call);
+   selectItem(call);
+   return call;
+}
+
+Call* CallModel::addIncomingCall(const QString & callId)
+{
+   Call* call = Call::buildIncomingCall(callId);
+   activeCalls[call->getCallId()] = call;
+   addCall(call);
+   selectItem(call);
+   return call;
+}
+
+Call* CallModel::addRingingCall(const QString & callId)
+{
+   Call* call = Call::buildRingingCall(callId);
+   activeCalls[call->getCallId()] = call;
+   addCall(call);
+   selectItem(call);
+   return call;
+}
+
+Call* CallModel::addConference(const QString & confID) {
+   qDebug() << "Notified of a new conference " << confID;
+   CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance();
+   sleep(2);
+   QStringList callList = callManager.getParticipantList(confID);
+   qDebug() << "Paticiapants are:" << callList;
+}
+
+Call* CallModel::createConferenceFromCall(Call* call1, Call* call2) {
+  qDebug() << "Need to join call: " << call1->getCallId() << " and " << call2->getCallId();
+  CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+  //callManager.joinConference(call1->getCallId(),call2->getCallId());
+  callManager.joinParticipant(call1->getCallId(),call2->getCallId());
+}
+
+Call* CallModel::addParticipant(Call* call2, Call* conference) {
+   
+}
+
+int CallModel::size() {
+   return activeCalls.size();
+}
+
+Call* CallModel::findCallByCallId(QString callId) {
+   return activeCalls[callId];
+}
+
+QList<Call*> CallModel::getCallList() {
+   QList<Call*> callList;
+   foreach(Call* call, activeCalls) {
+      callList.push_back(call);
+   }
+   return callList;
+}
+
+void CallModel::mergeCall(Call* call1, Call* call2) {
+   
+}
+
+uint CallModel::countChild(Call* call) {
+   
+}
+
+bool CallModel::isConference(Call* call) {
+   
+}
+
+QList<Call*> CallModel::children(Call* call) {
+   
+}
+
+bool CallModel::endCall(Call* call, Call* endConference) {
+   
+}
+
+InternalCallModelStruct CallModel::find(const CallTreeItem* call) {
+   
+}
+
+bool CallModel::selectItem(Call* item) {
+   if (privateCallList_call[item]->currentItem) {
+      setCurrentItem(privateCallList_call[item]->currentItem);
+      return true;
+   }
+   else
+      return false;
+}
+
+Call* CallModel::getCurrentItem() {
+   if (currentItem() && privateCallList_item[QTreeWidget::currentItem()])
+      return privateCallList_item[QTreeWidget::currentItem()]->call_real;
+   else
+      return false;
+}
+
+bool CallModel::removeItem(Call* item) {
+   if (indexOfTopLevelItem(privateCallList_call[item]->currentItem) != -1) //TODO To remove once safe
+     removeItemWidget(privateCallList_call[item]->currentItem,0);
+}
+
+QWidget* CallModel::getWidget() {
+   return this;
+}
+
+void CallModel::destroyCall(Call* toDestroy) {
+   if (privateCallList_call[toDestroy]->currentItem == currentItem())
+      setCurrentItem(0);
+   
+   if (indexOfTopLevelItem(privateCallList_call[toDestroy]->currentItem) != -1)
+      takeTopLevelItem(indexOfTopLevelItem(privateCallList_call[toDestroy]->currentItem));
+   else
+      privateCallList_call[toDestroy]->currentItem->parent()->removeChild(privateCallList_call[toDestroy]->currentItem);
+}
+
+QTreeWidgetItem* CallModel::extractItem(QString callId) {
+   QTreeWidgetItem* currentItem = privateCallList_callId[callId]->currentItem;
+   return extractItem(currentItem);
+}
+
+QTreeWidgetItem* CallModel::extractItem(QTreeWidgetItem* item) {
+   QTreeWidgetItem* parentItem = item->parent();
+   
+   if (parentItem) {
+      QTreeWidgetItem* toReturn = parentItem->takeChild(parentItem->indexOfChild(item));
+      if (parentItem->childCount() == 1) {
+         insertItem(extractItem(parentItem->child(0)));
+         takeTopLevelItem(indexOfTopLevelItem(parentItem));
+         delete parentItem;
+      }
+      return toReturn;
+   }
+   else
+      return takeTopLevelItem(indexOfTopLevelItem(item));
+}
+
+CallTreeItem* CallModel::insertItem(QTreeWidgetItem* item, Call* parent) {
+   return insertItem(item,(parent)?privateCallList_call[parent]->currentItem:0);
+}
+
+CallTreeItem* CallModel::insertItem(QTreeWidgetItem* item, QTreeWidgetItem* parent) {
+   if (!parent)
+      insertTopLevelItem(0,item);
+   else
+      parent->addChild(item);
+   
+   privateCallList_widget.remove(privateCallList_item[item]->call);
+   privateCallList_item[item]->call = new CallTreeItem();
+   privateCallList_item[item]->call->setCall(privateCallList_item[item]->call_real);
+   privateCallList_widget[privateCallList_item[item]->call] = privateCallList_item[item];
+   setItemWidget(item,0,privateCallList_item[item]->call);
+   
+   //TODO check to destroy 1 participant conferences
+   expandAll();
+   return privateCallList_item[item]->call;
+}
+
+void CallModel::clearArtefact(QTreeWidgetItem* item) {
+   item->setText(0,"");
+}
+
+bool CallModel::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action) {
+   QByteArray encodedData = data->data("text/sflphone.call.id");
+
+   clearArtefact(privateCallList_callId[encodedData]->currentItem);
+   
+   if (!parent) {
+      qDebug() << "Call dropped on empty space";
+      insertItem(extractItem(encodedData));
+      return true; //TODO this call may be (or not) in a conversation, if yes, split it
+   }
+      
+   if (privateCallList_item[parent]->call_real->getCallId() == QString(encodedData)) {
+      qDebug() << "Call dropped on itself";
+      return true; //Item dropped on itself
+   }
+      
+   if ((parent->parent()) || (parent->childCount())) {
+      qDebug() << "Call dropped on a conference";
+      if (privateCallList_callId[encodedData]->currentItem->parent())
+         if (privateCallList_callId[encodedData]->currentItem->parent() == parent->parent()) {
+            qDebug() << "Call dropped on it's own conversation";
+            return true;
+         }
+     
+      QTreeWidgetItem* call1 = extractItem(encodedData);
+      QTreeWidgetItem* call2 = (parent->parent())?parent->parent():parent;
+      insertItem(call1,call2);
+      createConferenceFromCall(privateCallList_item[call1]->call_real,privateCallList_item[call2]->call_real);
+         
+      return true; //TODO this is a conference call, need to check if the call is in the conversation, if not, add it
+   }
+   
+   //Create a conference
+   QTreeWidgetItem* newConference = new QTreeWidgetItem(this);
+   newConference->setText(0,"Conference");
+   qDebug() << "Call dropped on another call";
+   
+   QTreeWidgetItem* call1 = extractItem(encodedData);
+   insertItem(call1,newConference);
+   insertItem(extractItem(parent),newConference);
+   
+   createConferenceFromCall(privateCallList_item[call1]->call_real,privateCallList_item[parent]->call_real);
+   
+   return true;
+}
+
+
+QMimeData* CallModel::mimeData(const QList<QTreeWidgetItem *> items) const {   
+   QMimeData *mimeData = new QMimeData();
+   
+   //Call ID for internal call merging and spliting
+   mimeData->setData("text/sflphone.call.id", privateCallList_item[items[0]]->call_real->getCallId().toAscii());
+   
+   //Plain text for other applications
+   mimeData->setData("text/plain", QString(privateCallList_item[items[0]]->call_real->getPeerName()+"\n"+privateCallList_item[items[0]]->call_real->getPeerPhoneNumber()).toAscii());
+   
+   //BUG Comment this line if you don't want to see ugly artefact
+   items[0]->setText(0, privateCallList_item[items[0]]->call_real->getPeerName() + "\n" + privateCallList_item[items[0]]->call_real->getPeerPhoneNumber());
+   return mimeData;
+}
+
+QString CallModel::generateCallId()
+{
+   int id = qrand();
+   QString res = QString::number(id);
+   return res;
+}
+
+void CallModel::clearHistory()
+{
+   historyCalls.clear();
+}
\ No newline at end of file
diff --git a/sflphone-client-kde/src/CallModel.h b/sflphone-client-kde/src/CallModel.h
new file mode 100644
index 0000000000000000000000000000000000000000..4335a143e9ff851fb7a6ce8d118496d8aa95963d
--- /dev/null
+++ b/sflphone-client-kde/src/CallModel.h
@@ -0,0 +1,123 @@
+/***************************************************************************
+ *   Copyright (C) 2009-2010 by Savoir-Faire Linux                         *
+ *   Author : Emmanuel Lepage Valle <emmanuel.lepage@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.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/ 
+
+#ifndef CALL_MODEL
+#define CALL_MODEL
+
+#include <QObject>
+#include <QHash>
+#include <QTreeWidgetItem>
+#include <QVector>
+
+#include "CallTreeItem.h"
+#include "Call.h"
+#include "CallTreeWidget.h"
+#include "dbus/metatypes.h"
+
+/** Note from the author: It was previously done by a QAbstractModel + QTreeView, but the sip-call use case is incompatible 
+ *  with the MVC model. The MVC never got to a point were it was bug-free and the code was getting dirty. The QTreeWidget
+ *  solution may be less "clean" than MVC, but is 3 time smaller and easier to improve.
+ *  
+ *  This model is the view itself (private inheritance) so drag and drop can interact directly with the model without cross
+ *  layer hack. This call merge the content of 4 previous classes (CallTreeModel, CallTreeView, CallList and most of the 
+ *  previous CallTreeItem).
+ */
+
+struct InternalCallModelStruct {
+   InternalCallModelStruct* parent;
+   CallTreeItem* call;
+   Call* call_real;
+   QTreeWidgetItem* currentItem;
+   QList<InternalCallModelStruct*> children;
+};
+
+struct InternalCallModelStruct;
+
+
+class CallTreeItemDelegate : public QItemDelegate
+{
+   public:
+        CallTreeItemDelegate() { }
+        QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const { return QSize(0,60); }
+};
+
+
+
+class CallModel : private QTreeWidget {
+   Q_OBJECT
+      public:
+      enum ModelType {
+         ActiveCall,
+         History
+      };
+      
+      CallModel(ModelType type, QWidget* parent =0);
+      Call* addCall(Call* call, Call* parent =0);
+      int size();
+      Call* findCallByCallId(QString callId);
+      void mergeCall(Call* call1, Call* call2);
+      uint countChild(Call* call);
+      bool isConference(Call* call);
+      QList<Call*> children(Call* call);
+      QList<Call*> getCallList();
+      bool endCall(Call* call, Call* endConference = false);
+      bool selectItem(Call* item);
+      Call* getCurrentItem();
+      bool removeItem(Call* item);
+      QWidget* getWidget();
+      void setTitle(QString title);
+      bool dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action);
+      QMimeData *mimeData(const QList<QTreeWidgetItem *> items) const;
+      
+      Call* addDialingCall(const QString & peerName = "", QString account = "");
+      Call* addIncomingCall(const QString & callId/*, const QString & from, const QString & account*/);
+      Call* addRingingCall(const QString & callId);
+      Call* createConferenceFromCall(Call* call1, Call* call2);
+      Call* addConference(const QString &confID);
+      Call* addParticipant(Call* call2, Call* conference);
+      
+      MapStringString getHistoryMap();
+      
+   protected:
+      void dragEnterEvent(QDragEnterEvent *e) { e->accept(); }
+      void dragMoveEvent(QDragMoveEvent *e) { e->accept(); }
+      
+   private:
+      QHash<QString, Call*> activeCalls;
+      QHash<QString, Call*> historyCalls;
+      QHash<CallTreeItem* , InternalCallModelStruct*> privateCallList_widget;
+      QHash<QTreeWidgetItem* , InternalCallModelStruct*> privateCallList_item;
+      QHash<Call* , InternalCallModelStruct*> privateCallList_call;
+      QHash<QString , InternalCallModelStruct*> privateCallList_callId;
+      InternalCallModelStruct find(const CallTreeItem* call);
+      QTreeWidgetItem* extractItem(QString callId);
+      QTreeWidgetItem* extractItem(QTreeWidgetItem* item);
+      CallTreeItem* insertItem(QTreeWidgetItem* item, QTreeWidgetItem* parent=0);
+      CallTreeItem* insertItem(QTreeWidgetItem* item, Call* parent);
+      QString generateCallId();
+      void clearArtefact(QTreeWidgetItem* item);
+      
+   private slots:
+      void destroyCall(Call* toDestroy);
+      
+   public slots:
+      void clearHistory();
+};
+#endif
\ No newline at end of file
diff --git a/sflphone-client-kde/src/CallTreeItem.cpp b/sflphone-client-kde/src/CallTreeItem.cpp
index 202b178a761ceecd487f4362271d4bfbd17c7d00..2e195cbb986aa0801cd55ad3ec53e9bf12786a49 100644
--- a/sflphone-client-kde/src/CallTreeItem.cpp
+++ b/sflphone-client-kde/src/CallTreeItem.cpp
@@ -29,157 +29,33 @@
 #include "sflphone_const.h"
 #include "CallTreeItem.h"
 
-const char * CallTreeItem::callStateIcons[11] = {ICON_INCOMING, ICON_RINGING, ICON_CURRENT, ICON_DIALING, ICON_HOLD, ICON_FAILURE, ICON_BUSY, ICON_TRANSFER, ICON_TRANSF_HOLD, "", ""};
-
-CallTreeItem::CallTreeItem(const QVector<QVariant> &data, CallTreeItem *parent)
-   : parentItem(parent),
-     itemCall(0),
-     itemWidget(0),
-     itemData(data)
- {
-    
- }
- 
-CallTreeItem::CallTreeItem(const CallTreeItem *toCopy, CallTreeItem *parent)
-    : parentItem(parent),
-      itemCall(toCopy->itemCall),
-      itemWidget(toCopy->itemWidget),
-      itemData(toCopy->itemData)
+const char * CallTreeItem::callStateIcons[12] = {ICON_INCOMING, ICON_RINGING, ICON_CURRENT, ICON_DIALING, ICON_HOLD, ICON_FAILURE, ICON_BUSY, ICON_TRANSFER, ICON_TRANSF_HOLD, "", "", ICON_CONFERENCE};
+
+CallTreeItem::CallTreeItem(QWidget *parent)
+   : itemCall(0), QWidget(parent)
 {
-  
+   
 }
 
- CallTreeItem::~CallTreeItem()
- {
-     qDeleteAll(childItems);
- }
-
- CallTreeItem *CallTreeItem::child(int number)
- {
-     return childItems.value(number);
- }
-
- int CallTreeItem::childCount() const
- {
-     return childItems.count();
- }
-
- int CallTreeItem::childNumber() const
- {
-     if (parentItem)
-         return parentItem->childItems.indexOf(const_cast<CallTreeItem*>(this));
-     return 0;
- }
-
- int CallTreeItem::columnCount() const
- {
-     return itemData.count();
- }
-
- QVariant CallTreeItem::data(int column) const
- {
-     return itemData.value(column);
- }
-
-Call* CallTreeItem::call() const
+CallTreeItem::~CallTreeItem()
 {
-   return itemCall;
+   
 }
 
-QWidget* CallTreeItem::widget() const
+Call* CallTreeItem::call() const
 {
-   return itemWidget;
+   return itemCall;
 }
 
- bool CallTreeItem::insertChildren(int position, int count, int columns)
- {
-     if (position < 0 || position > childItems.size())
-         return false;
-
-     for (int row = 0; row < count; ++row) {
-         QVector<QVariant> data(columns);
-         CallTreeItem *item = new CallTreeItem(data, this);
-         childItems.insert(position, item);
-     }
-
-     return true;
- }
-
- bool CallTreeItem::insertColumns(int position, int columns)
- {
-     if (position < 0 || position > itemData.size())
-         return false;
-
-     for (int column = 0; column < columns; ++column) {
-         itemData.insert(position, QVariant());
-     }
-
-     foreach (CallTreeItem *child, childItems) {
-         child->insertColumns(position, columns);
-     }
-
-     return true;
- }
-
- CallTreeItem *CallTreeItem::parent()
- {
-     return parentItem;
- }
-
- bool CallTreeItem::removeChildren(int position, int count)
- {
-     if (position < 0 || position + count > childItems.size())
-         return false;
-
-     for (int row = 0; row < count; ++row) {
-         delete childItems.takeAt(position);
-     }
-
-     return true;
- }
-
- bool CallTreeItem::removeColumns(int position, int columns)
- {
-     if (position < 0 || position + columns > itemData.size())
-         return false;
-
-     for (int column = 0; column < columns; ++column) {
-         itemData.remove(position);
-     }
-
-     foreach (CallTreeItem *child, childItems) {
-         child->removeColumns(position, columns);
-     }
-
-     return true;
- }
-
- bool CallTreeItem::setData(int column, const QVariant &value)
- {
-    itemData.resize(10);
-    if (column < 0 || column >= itemData.size()) {
-      qDebug() << "Je suis ici!!!! " << itemData;
-        return false;
-    }
-
-    itemData[column] = value;
-    return true;
- }
-
-
 void CallTreeItem::setCall(Call *call)
 {
    itemCall = call;
 
-   itemWidget = new QWidget();
-
    labelIcon = new QLabel();
-   //labelCallNumber = new QLabel("123"/*itemCall->getPeerPhoneNumber()*/);
-        labelCallNumber2 = new QLabel(itemCall->getPeerPhoneNumber());
+   labelCallNumber2 = new QLabel(itemCall->getPeerPhoneNumber());
    labelTransferPrefix = new QLabel(i18n("Transfer to : "));
    labelTransferNumber = new QLabel();
-   QSpacerItem * horizontalSpacer = new QSpacerItem(16777215, 20, QSizePolicy::Preferred, QSizePolicy::Minimum);
-        QSpacerItem * verticalSpacer = new QSpacerItem(16777215, 20, QSizePolicy::Expanding, QSizePolicy::Expanding);
+   QSpacerItem * verticalSpacer = new QSpacerItem(16777215, 20, QSizePolicy::Expanding, QSizePolicy::Expanding);
    
    QHBoxLayout * mainLayout = new QHBoxLayout();
    mainLayout->setContentsMargins ( 3, 1, 2, 1);
@@ -202,24 +78,22 @@ void CallTreeItem::setCall(Call *call)
    transfer->addWidget(labelTransferPrefix);
    transfer->addWidget(labelTransferNumber);
    descr->addLayout(transfer);
-        descr->addItem(verticalSpacer);
+   descr->addItem(verticalSpacer);
    mainLayout->addLayout(descr);
-   //mainLayout->addItem(horizontalSpacer);
    
-   itemWidget->setLayout(mainLayout);
-   itemWidget->setMinimumSize(QSize(50, 30));
+   setLayout(mainLayout);
+   setMinimumSize(QSize(50, 30));
 
    connect(itemCall, SIGNAL(changed()),
-      this,     SLOT(updated()));
+           this,     SLOT(updated()));
 
-   updated();   
+   updated();
 }
 
 void CallTreeItem::updated()
 {
    call_state state = itemCall->getState();
    bool recording = itemCall->getRecording();
-
    if(state != CALL_STATE_OVER) {
       if(state == CALL_STATE_CURRENT && recording) {
          labelIcon->setPixmap(QPixmap(ICON_CURRENT_REC));
@@ -235,19 +109,23 @@ void CallTreeItem::updated()
       if(!transfer) {
          labelTransferNumber->setText("");
       }
-      //labelTransferNumber->setText(itemCall->getTransferNumber());
+      labelTransferNumber->setText(itemCall->getTransferNumber());
       labelCallNumber2->setText(itemCall->getPeerPhoneNumber());
                 
-                if(state == CALL_STATE_DIALING) {
-                  labelCallNumber2->setText(itemCall->getCallNumber());
-                }
+      if(state == CALL_STATE_DIALING) {
+         labelCallNumber2->setText(itemCall->getCallNumber());
+      }
    }
    else {
-                emit over(itemCall);
-                itemWidget->setVisible(false);
-       qDebug() << "Updating item of call of state OVER. Doing nothing.";
+      qDebug() << "Updating item of call of state OVER. Doing nothing.";
    }
+}
 
-   
+void CallTreeItem::setConference(bool value) {
+   conference = value;
 }
 
+bool CallTreeItem::isConference() {
+   return conference;
+}
+    
\ No newline at end of file
diff --git a/sflphone-client-kde/src/CallTreeItem.h b/sflphone-client-kde/src/CallTreeItem.h
index 128a14ab88c583f7ef3a1617e74e0ee9c0b7475d..57587b9a4f7d83694bc348809aba3aa63ed99a8e 100644
--- a/sflphone-client-kde/src/CallTreeItem.h
+++ b/sflphone-client-kde/src/CallTreeItem.h
@@ -37,55 +37,42 @@
 #include <QtGui/QSpacerItem>
 #include <QtGui/QHBoxLayout>
 #include <QtGui/QVBoxLayout>
+#include <KIcon>
 
 #include "Call.h"
 
-class CallTreeItem : public QObject
- {
+class CallTreeItem : public QWidget
+{
    Q_OBJECT
  public:
-    CallTreeItem(const QVector<QVariant> &data, CallTreeItem *parent);
-         CallTreeItem(const CallTreeItem *toCopy, CallTreeItem *parent);
+    CallTreeItem(QWidget* parent =0);
     ~CallTreeItem();
-     
-    CallTreeItem *child(int number);
-    int childCount() const;
-    int columnCount() const;
-    QVariant data(int column) const;
+    
     Call* call() const;
-    QWidget* widget() const;
-    bool insertChildren(int position, int count, int columns);
-    bool insertColumns(int position, int columns);
-    CallTreeItem *parent();
-    bool removeChildren(int position, int count);
-    bool removeColumns(int position, int columns);
-    int childNumber() const;
-    bool setData(int column, const QVariant &value);
     void setCall(Call *call);
-
-   static const char * callStateIcons[11];
+    static const char * callStateIcons[12];
+    void setConference(bool value);
+    bool isConference();
+    
  private:
-    QList<CallTreeItem*> childItems;
-    QVector<QVariant> itemData;
-    CallTreeItem *parentItem;
     Call *itemCall;
-    QWidget *itemWidget;
 
-    QLabel * labelIcon;
-    QLabel * labelPeerName;
-    QLabel * labelCallNumber2;
-    QLabel * labelTransferPrefix;
-    QLabel * labelTransferNumber;
+    QLabel* labelIcon;
+    QLabel* labelPeerName;
+    QLabel* labelCallNumber2;
+    QLabel* labelTransferPrefix;
+    QLabel* labelTransferNumber;
     
-    QWidget * historyItemWidget;
-    QLabel * labelHistoryIcon;
-    QLabel * labelHistoryPeerName;
-    QLabel * labelHistoryCallNumber;
-    QLabel * labelHistoryTime;
-         friend class CallTreeItem;
+    QWidget* historyItemWidget;
+    QLabel* labelHistoryIcon;
+    QLabel* labelHistoryPeerName;
+    QLabel* labelHistoryCallNumber;
+    QLabel* labelHistoryTime;
+    friend class CallTreeItem;
+    bool conference;
 
 public slots:
-    void updated();
+   void updated();
 signals:
    void over(Call*);  
  };
diff --git a/sflphone-client-kde/src/CallTreeModel.h b/sflphone-client-kde/src/CallTreeModel.h
index 57b06ba1fecd3e1a706e05702e8d516f7225ea7a..c04fdc36f68a2e646b4377c58e86c54810670950 100644
--- a/sflphone-client-kde/src/CallTreeModel.h
+++ b/sflphone-client-kde/src/CallTreeModel.h
@@ -64,10 +64,10 @@ public:
    bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex());
    bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
         
-        Qt::DropActions supportedDropActions();
-        virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
-        QStringList mimeTypes() const;
-        QMimeData* mimeData(const QModelIndexList &indexes) const;
+   Qt::DropActions supportedDropActions();
+   virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
+   QStringList mimeTypes() const;
+   QMimeData* mimeData(const QModelIndexList &indexes) const;
 
    CallTreeItem *getItem(const QModelIndex &index) const;
 
diff --git a/sflphone-client-kde/src/CallTreeView.cpp b/sflphone-client-kde/src/CallTreeView.cpp
index 0eb21530b71d1e2d041484d5a6d9fdb7b5b74fff..2f2a3f4903e9f7e7abb3e20128ad4c7779d3a59e 100644
--- a/sflphone-client-kde/src/CallTreeView.cpp
+++ b/sflphone-client-kde/src/CallTreeView.cpp
@@ -32,8 +32,8 @@ CallTreeView::CallTreeView(QWidget * parent)
 {    
    treeModel = new CallTreeModel(this);
    setModel(treeModel);
-        CallTreeItemDelegate *delegate = new CallTreeItemDelegate();
-        setItemDelegate(delegate); 
+//    CallTreeItemDelegate *delegate = new CallTreeItemDelegate();
+//    setItemDelegate(delegate); 
    setHeaderHidden(true);
    setRootIsDecorated(false);
    setSelectionMode(QAbstractItemView::SingleSelection);
@@ -41,17 +41,17 @@ CallTreeView::CallTreeView(QWidget * parent)
    setAcceptDrops(true);
    setUniformRowHeights(true);
    setDropIndicatorShown(true);
-        //setDragDropMode(QAbstractItemView::DragDrop);
-        setSelectionMode(QAbstractItemView::ExtendedSelection);
-        
-        setDragEnabled(TRUE);
-        setAcceptDrops(TRUE);
-        setDropIndicatorShown(TRUE);
-        
-        connect(this , SIGNAL(clicked(QModelIndex)), this, SLOT(itemClicked(QModelIndex)));
-        connect(treeModel, SIGNAL(joinCall(QString,QString)), this, SLOT(joinCall(QString, QString)));
-        connect(treeModel, SIGNAL(joinCall(QString,QString)), this, SLOT(expandAll()));
-        connect(treeModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex& ) ), this, SLOT(adaptColumns(const QModelIndex &, const QModelIndex&) ) );
+   //setDragDropMode(QAbstractItemView::DragDrop);
+   setSelectionMode(QAbstractItemView::ExtendedSelection);
+   
+   setDragEnabled(TRUE);
+   setAcceptDrops(TRUE);
+   setDropIndicatorShown(TRUE);
+   
+   connect(this , SIGNAL(clicked(QModelIndex)), this, SLOT(itemClicked(QModelIndex)));
+   connect(treeModel, SIGNAL(joinCall(QString,QString)), this, SLOT(joinCall(QString, QString)));
+   connect(treeModel, SIGNAL(joinCall(QString,QString)), this, SLOT(expandAll()));
+   connect(treeModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex& ) ), this, SLOT(adaptColumns(const QModelIndex &, const QModelIndex&) ) );
 }
 
 CallTreeView::~CallTreeView()
diff --git a/sflphone-client-kde/src/CallTreeView.h b/sflphone-client-kde/src/CallTreeView.h
index d2e9b8e6c51e3e6a90108b241eccfdc19aba6ee4..c72bba8cc1235f3bc56e533ad3f70a7352b88d29 100644
--- a/sflphone-client-kde/src/CallTreeView.h
+++ b/sflphone-client-kde/src/CallTreeView.h
@@ -36,12 +36,12 @@ class QModelIndex;
 class QTreeWidgetItem;
 class QMimeData;
 
-class CallTreeItemDelegate : public QItemDelegate
-{
-public:
-        CallTreeItemDelegate() { }
-        QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { return QSize(0,50); }
-};
+// class CallTreeItemDelegate : public QItemDelegate
+// {
+// public:
+//         CallTreeItemDelegate() { }
+//         QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { return QSize(0,50); }
+// };
 
 class CallTreeView : public QTreeView
 {
@@ -57,8 +57,8 @@ public:
    int count();
    QStringList mimeTypes() const;
    Qt::DropActions supportedDropActions () const;
-        CallTreeItem* insert(Call* call);
-        CallTreeItem* insert(CallTreeItem *item, Call* call);
+   CallTreeItem* insert(Call* call);
+   CallTreeItem* insert(CallTreeItem *item, Call* call);
         
 // protected:
 //         void dropEvent(QDropEvent* event);
diff --git a/sflphone-client-kde/src/SFLPhone.cpp b/sflphone-client-kde/src/SFLPhone.cpp
index aa2003eb739f26a189664d76ccaaafe9f398d4f7..df60ebc66bfcffbef5e620704786b3b467bfe6db 100644
--- a/sflphone-client-kde/src/SFLPhone.cpp
+++ b/sflphone-client-kde/src/SFLPhone.cpp
@@ -220,11 +220,11 @@ bool SFLPhone::queryClose()
 void SFLPhone::quitButton()
 {
    InstanceInterface & instance = InstanceInterfaceSingleton::getInstance();
-   qDebug() << "quitButton : " << view->callTree->count() << " calls open.";
+   //qDebug() << "quitButton : " << view->callTree->count() << " calls open.";
 
-   if(view->callTree->count() > 0 && instance.getRegistrationCount() <= 1) {
-      qDebug() << "Attempting to quit when still having some calls open.";
-   }
+   //if(view->callTree->count() > 0 && instance.getRegistrationCount() <= 1) {
+      //qDebug() << "Attempting to quit when still having some calls open.";
+   //}
    view->saveState();
    instance.Unregister(getpid());
    qApp->quit();
diff --git a/sflphone-client-kde/src/SFLPhoneView.cpp b/sflphone-client-kde/src/SFLPhoneView.cpp
index 74e03f322a75941fc382fe54b89f494fca6fe16d..8d0e503e9eb97ea61fc6764e77d8da8e4c259cde 100644
--- a/sflphone-client-kde/src/SFLPhoneView.cpp
+++ b/sflphone-client-kde/src/SFLPhoneView.cpp
@@ -60,7 +60,9 @@ AccountList * SFLPhoneView::accountList;
 QString SFLPhoneView::priorAccountId;
 
 SFLPhoneView::SFLPhoneView(QWidget *parent)
-   : QWidget(parent)
+   : QWidget(parent),
+     callTreeModel(CallModel::ActiveCall),
+     historyTreeModel(CallModel::History)
 {
    setupUi(this);
    
@@ -69,25 +71,29 @@ SFLPhoneView::SFLPhoneView(QWidget *parent)
    
    errorWindow = new QErrorMessage(this);
 
-   callList = & CallListInterfaceSingleton::getInstance(); //CallList(this);
+   //callList = & CallListInterfaceSingleton::getInstance(); //CallList(this);
 
-   callTree = new CallTreeView(page_callList);
-   historyTree = new CallTreeView(page_callHistory);
+   //callTree = new CallTreeView(page_callList);
+   //historyTree = new CallTreeWidget(page_callHistory);
+   //callTree = new CallTreeWidget(this);
+   //historyTree = new CallTreeWidget(this);
+   callTreeModel.setTitle("Calls");
+   historyTreeModel.setTitle("History");
 
-   page_callList->layout()->addWidget(callTree);
-   page_callHistory->layout()->addWidget(historyTree);
+   page_callList->layout()->addWidget(callTreeModel.getWidget());
+   page_callHistory->layout()->addWidget(historyTreeModel.getWidget());
 
    historyLoaded = false;
 
-   for(int i = 0 ; i < callList->size() ; i++) {
-      Call * call = (*callList)[i];
-      if(call->getState() == CALL_STATE_OVER) {
-         addCallToCallHistory(call);
-      }
-      else {
-         addCallToCallList(call);
-      }
-   }
+//    for(int i = 0 ; i < callTreeModel.size() ; i++) {
+//       Call * call = (*callList)[i];
+//       if(call->getState() == CALL_STATE_OVER) {
+//          addCallToCallHistory(call);
+//       }
+//       else {
+//          addCallToCallList(call);
+//       }
+//    }
    
    accountList = new AccountList(false);
    accountList->updateAccounts();
@@ -109,6 +115,8 @@ SFLPhoneView::SFLPhoneView(QWidget *parent)
            this,         SLOT(on1_callStateChanged(const QString &, const QString &)));
    connect(&callManager, SIGNAL(incomingCall(const QString &, const QString &, const QString &)),
            this,         SLOT(on1_incomingCall(const QString &, const QString &)));
+   connect(&callManager, SIGNAL(conferenceCreated(const QString &)),
+           this,         SLOT(on1_incommingConference(const QString &)));
    connect(&callManager, SIGNAL(incomingMessage(const QString &, const QString &)),
            this,         SLOT(on1_incomingMessage(const QString &, const QString &)));
    connect(&callManager, SIGNAL(voiceMailNotify(const QString &, int)),
@@ -122,8 +130,8 @@ SFLPhoneView::SFLPhoneView(QWidget *parent)
    connect(&configurationManager, SIGNAL(audioManagerChanged()),
       this,         SLOT(on1_audioManagerChanged()));
            
-   connect(configDialog, SIGNAL(clearCallHistoryAsked()),
-           callList,     SLOT(clearHistory()));
+//    connect(configDialog, SIGNAL(clearCallHistoryAsked()), //TODO restore
+//            &callTreeModel,     SLOT(clearHistory()));
            
    connect(configDialog, SIGNAL(changesApplied()),
            this,         SLOT(loadWindow()));
@@ -133,11 +141,11 @@ SFLPhoneView::SFLPhoneView(QWidget *parent)
    connect(accountList, SIGNAL(accountListUpdated()),
            this,        SLOT(updateWindowCallState()));
 
-   connect(callTree,    SIGNAL(itemChanged()), //currentItemChanged
+   connect(callTreeModel.getWidget(),    SIGNAL(itemChanged()), //currentItemChanged
       this,        SLOT(on_callTree_currentItemChanged()));
-   connect(callTree,    SIGNAL(itemChanged()), //ITem changed
+   connect(callTreeModel.getWidget(),    SIGNAL(itemChanged()), //ITem changed
       this,        SLOT(on_callTree_itemChanged()));
-   connect(callTree,    SIGNAL(doubleClicked(const QModelIndex &)),
+   connect(callTreeModel.getWidget(),    SIGNAL(doubleClicked(const QModelIndex &)),
       this,        SLOT(on_callTree_itemDoubleClicked(const QModelIndex&)));
                 
            
@@ -152,7 +160,7 @@ SFLPhoneView::~SFLPhoneView()
 void SFLPhoneView::saveState()
 {
    ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
-   configurationManager.setHistory(callList->getHistoryMap());
+   configurationManager.setHistory(callTreeModel.getHistoryMap());
 }
 
 void SFLPhoneView::loadWindow()
@@ -206,16 +214,18 @@ QErrorMessage * SFLPhoneView::getErrorWindow()
    return errorWindow;
 }
 
-CallTreeItem* SFLPhoneView::addCallToCallList(Call * call)
-{     
-   return callTree->insert(call);
-}
+// Call* SFLPhoneView::addCallToCallList(Call * call)
+// {     
+// //    return callTree->insert(call);
+//    return callTreeModel.addCall(call);
+// }
 
-CallTreeItem* SFLPhoneView::addCallToCallHistory(Call * call)
-{
-   return historyTree->insert(call);
-
-}
+// Call* SFLPhoneView::addCallToCallHistory(Call * call)
+// {
+//    //return historyTree->insert(call); //TODO restore
+//    return historyTree.addCall(call); 
+// 
+// }
 
 void SFLPhoneView::addContactToContactList(Contact * contact)
 {
@@ -233,39 +243,37 @@ void SFLPhoneView::typeString(QString str)
    CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    
    if(stackedWidget_screen->currentWidget() == page_callList) {
-      CallTreeItem * item = callTree->currentItem();
+      Call* call = callTreeModel.getCurrentItem();
       callManager.playDTMF(str);
       Call *currentCall = 0;
       Call *candidate = 0;
 
-      if(item) {
-         Call *call = item->call();
-
-         if (call) {
-            if(call->getState() == CALL_STATE_CURRENT) {
-               currentCall = call;
-            }
+      if(call) {
+         if(call->getState() == CALL_STATE_CURRENT) {
+            currentCall = call;
          }
       }
 
-      for(int i = callList->size() - 1 ; i >= 0 ; i--)
-      {
-         Call *call = (*callList)[i];
-
-         if(currentCall != call && call->getState() == CALL_STATE_CURRENT) {
-
-            action(call, CALL_ACTION_HOLD);
+//       for(int i = callTreeModel.size() - 1 ; i >= 0 ; i--)
+//       {
+//          Call *call2 = (*callList)[i];
+// 
+//          
+//       }
+      foreach (Call* call2, callTreeModel.getCallList()) {
+         if(currentCall != call2 && call2->getState() == CALL_STATE_CURRENT) {
+            action(call2, CALL_ACTION_HOLD);
          }
-         else if(call->getState() == CALL_STATE_DIALING) {
-            candidate = call;
+         else if(call2->getState() == CALL_STATE_DIALING) {
+            candidate = call2;
          }
       }
       
       if(!currentCall && !candidate) {
          qDebug() << "Typing when no item is selected. Opening an item.";
-         candidate = callList->addDialingCall();
-         addCallToCallList(candidate);
-         callTree->setCurrentRow(callTree->count() + 1);
+         candidate = callTreeModel.addDialingCall();
+         //callTree->setCurrentRow(callTree->count() + 1); //TODO
+         //callTreeModel.selectItem(addCallToCallList(candidate));
       }
 
       if(!currentCall && candidate) {
@@ -289,23 +297,18 @@ void SFLPhoneView::backspace()
    qDebug() << "backspace";
    if(stackedWidget_screen->currentWidget() == page_callList) {
       qDebug() << "In call list.";
-      CallTreeItem * item = callTree->currentItem();
-      if(!item) {
-         qDebug() << "Backspace when no item is selected. Doing nothing.";
+      Call* call = callTreeModel.getCurrentItem();
+      if(!call) {
+         qDebug() << "Error : Backspace on unexisting call.";
       }
       else {
-         Call * call = callTree->currentItem()->call();
-         if(!call) {
-            qDebug() << "Error : Backspace on unexisting call.";
-         }
-         else {
-            call->backspaceItemText();
-            if(call->getState() == CALL_STATE_OVER) {
-               callTree->removeCurrent();
+         call->backspaceItemText();
+         if(call->getState() == CALL_STATE_OVER) {
+            callTreeModel.removeItem(callTreeModel.getCurrentItem());
 
-               if(call->getHistoryState() != NONE) {
-                  historyTree->insert(call);
-               }
+            if(call->getHistoryState() != NONE) {
+               //historyTree->insert(call);
+               historyTreeModel.addCall(call);
             }
          }
       }
@@ -317,25 +320,16 @@ void SFLPhoneView::escape()
    qDebug() << "escape";
    if(stackedWidget_screen->currentWidget() == page_callList ) {
       qDebug() << "In call list.";
-      CallTreeItem * item = callTree->currentItem();
-      if(!item) {
+      Call* call = callTreeModel.getCurrentItem();
+      if(!call) {
          qDebug() << "Escape when no item is selected. Doing nothing.";
       }
       else {
-         Call * call = item->call();
-
-         if(!call) {
-            qDebug() << "Error : Escape on unexisting call.";
+         if(call->getState() == CALL_STATE_TRANSFER || call->getState() == CALL_STATE_TRANSF_HOLD) {
+            action(call, CALL_ACTION_TRANSFER);
          }
          else {
-            if(call->getState() == CALL_STATE_TRANSFER ||call->getState() == CALL_STATE_TRANSF_HOLD)
-            {
-               action(call, CALL_ACTION_TRANSFER);
-            }
-            else
-            {
-               action(call, CALL_ACTION_REFUSE);
-            }
+            action(call, CALL_ACTION_REFUSE);
          }
       }
    }
@@ -354,44 +348,35 @@ void SFLPhoneView::enter()
    qDebug() << "enter";
    if(stackedWidget_screen->currentWidget() == page_callList ) {
       qDebug() << "In call list.";
-      CallTreeItem * item = callTree->currentItem();
-      if(!item) {
-         qDebug() << "Enter when no item is selected. Doing nothing.";
+      Call* call = callTreeModel.getCurrentItem();
+      if(!call) {
+         qDebug() << "Error : Enter on unexisting call.";
       }
       else {
-         Call * call = item->call();
-         if(!call) {
-            qDebug() << "Error : Enter on unexisting call.";
+         int state = call->getState();
+         if(state == CALL_STATE_INCOMING || state == CALL_STATE_DIALING || state == CALL_STATE_TRANSFER || state == CALL_STATE_TRANSF_HOLD) {
+            action(call, CALL_ACTION_ACCEPT);
          }
          else {
-            int state = call->getState();
-            if(state == CALL_STATE_INCOMING || state == CALL_STATE_DIALING || state == CALL_STATE_TRANSFER || state == CALL_STATE_TRANSF_HOLD) {
-               action(call, CALL_ACTION_ACCEPT);
-            }
-            else {
-               qDebug() << "Enter when call selected not in appropriate state. Doing nothing.";
-            }
+            qDebug() << "Enter when call selected not in appropriate state. Doing nothing.";
          }
       }
    }
    if(stackedWidget_screen->currentWidget() == page_callHistory) {
       qDebug() << "In call history.";
-      CallTreeItem * item = historyTree->currentItem();
-      if(!item) {
-         qDebug() << "Enter when no item is selected. Doing nothing.";
+      
+      Call * pastCall = historyTreeModel.getCurrentItem();
+      if (!pastCall) {
+         qDebug() << "pastCall null";
       }
       else {
          changeScreen(SCREEN_MAIN);
-         
-         Call * pastCall = item->call();
-         if (!pastCall)
-         {
-            qDebug() << "pastCall null";
-         }
-         Call * call = callList->addDialingCall(pastCall->getPeerName(), pastCall->getAccountId());
+         Call * call = callTreeModel.addDialingCall(pastCall->getPeerName(), pastCall->getAccountId());
          call->appendText(pastCall->getPeerPhoneNumber());
-         addCallToCallList(call);
-         callTree->setCurrentRow(callTree->count() - 1);
+         //addCallToCallList(call);
+         //callTree->setCurrentRow(callTree->count() - 1);
+         //callTree->setCurrentItem(addCallToCallList(call));
+         //callTreeModel.selectItem(addCallToCallList(call));
          action(call, CALL_ACTION_ACCEPT);
       }
    }
@@ -404,10 +389,9 @@ void SFLPhoneView::enter()
       else {
          changeScreen(SCREEN_MAIN);
          ContactItemWidget * w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(item));
-         Call * call = callList->addDialingCall(w->getContactName());
+         Call * call = callTreeModel.addDialingCall(w->getContactName());
          call->appendText(w->getContactNumber());
-         addCallToCallList(call);
-         callTree->setCurrentRow(callTree->count() - 1);
+         //callTreeModel.selectItem(addCallToCallList(call));
          action(call, CALL_ACTION_ACCEPT);
       }
    }
@@ -444,7 +428,7 @@ void SFLPhoneView::updateWindowCallState()
    QString buttonIconFiles[6] = {ICON_CALL, ICON_HANGUP, ICON_HOLD, ICON_TRANSFER, ICON_REC_DEL_OFF, ICON_MAILBOX};
    QString actionTexts[6] = {ACTION_LABEL_CALL, ACTION_LABEL_HANG_UP, ACTION_LABEL_HOLD, ACTION_LABEL_TRANSFER, ACTION_LABEL_RECORD, ACTION_LABEL_MAILBOX};
    
-   CallTreeItem * item;
+   Call* call;
    
    bool transfer = false;
    bool recordActivated = false;    //tells whether the call is in recording position
@@ -453,8 +437,8 @@ void SFLPhoneView::updateWindowCallState()
 
 
    if(stackedWidget_screen->currentWidget() == page_callList) {
-      item = callTree->currentItem();
-      if (!item) {
+      call = callTreeModel.getCurrentItem();
+      if (!call) {
          qDebug() << "No item selected.";
          enabledActions[SFLPhone::Refuse] = false;
          enabledActions[SFLPhone::Hold] = false;
@@ -462,13 +446,10 @@ void SFLPhoneView::updateWindowCallState()
          enabledActions[SFLPhone::Record] = false;
       }
       else {
-         Call * call = item->call();   
+         call_state state = call->getState();
+         recordActivated = call->getRecording();
 
-         if (call) {
-            call_state state = call->getState();
-            recordActivated = call->getRecording();
-
-            switch (state) {
+         switch (state) {
             case CALL_STATE_INCOMING:
                qDebug() << "Reached CALL_STATE_INCOMING with call " << call->getCallId();
                buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT;
@@ -537,15 +518,14 @@ void SFLPhoneView::updateWindowCallState()
             default:
                qDebug() << "Error : Reached unexisting state for call " << call->getCallId() << "!";
                break;
-            }
          }
       }
    }
    if(stackedWidget_screen->currentWidget() == page_callHistory) {
-      item = historyTree->currentItem();
+      call = historyTreeModel.getCurrentItem();
       buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT;
       actionTexts[SFLPhone::Accept] = ACTION_LABEL_CALL_BACK;
-      if (!item) {
+      if (!call) {
          qDebug() << "No item selected.";
          enabledActions[SFLPhone::Accept] = false;
          enabledActions[SFLPhone::Refuse] = false;
@@ -561,22 +541,22 @@ void SFLPhoneView::updateWindowCallState()
       }
    }
    if(stackedWidget_screen->currentWidget() == page_addressBook) {
-      item = addressBookTree->currentItem();
-      buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT;
-      if (!item) {
-         qDebug() << "No item selected.";
-         enabledActions[SFLPhone::Accept] = false;
-         enabledActions[SFLPhone::Refuse] = false;
-         enabledActions[SFLPhone::Hold] = false;
-         enabledActions[SFLPhone::Transfer] = false;
-         enabledActions[SFLPhone::Record] = false;
-      }
-      else {
-         enabledActions[SFLPhone::Refuse] = false;
-         enabledActions[SFLPhone::Hold] = false;
-         enabledActions[SFLPhone::Transfer] = false;
-         enabledActions[SFLPhone::Record] = false;
-      }
+      //TODO uncomment item = addressBookTree->currentItem();
+//       buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT;
+//       if (!item) {
+//          qDebug() << "No item selected.";
+//          enabledActions[SFLPhone::Accept] = false;
+//          enabledActions[SFLPhone::Refuse] = false;
+//          enabledActions[SFLPhone::Hold] = false;
+//          enabledActions[SFLPhone::Transfer] = false;
+//          enabledActions[SFLPhone::Record] = false;
+//       }
+//       else {
+//          enabledActions[SFLPhone::Refuse] = false;
+//          enabledActions[SFLPhone::Hold] = false;
+//          enabledActions[SFLPhone::Transfer] = false;
+//          enabledActions[SFLPhone::Record] = false;
+//       }
    }
    
    qDebug() << "Updating Window.";
@@ -604,12 +584,12 @@ void SFLPhoneView::updateCallHistory()
       listWidget_callHistory->takeItem(0);
    }
    QString textSearched = lineEdit_searchHistory->text();
-   for(int i = callList->size() - 1 ; i >= 0 ; i--) {
-      Call * call = (*callList)[i];
+   foreach (Call* call, historyTreeModel.getCallList()) {
       qDebug() << "" << call->getCallId();
       if( call->getState() == CALL_STATE_OVER && call->getHistoryState() != NONE && (call->getPeerPhoneNumber().contains(textSearched) || call->getPeerName().contains(textSearched)) ) {
          qDebug() << "call->getPeerPhoneNumber()=" << call->getPeerPhoneNumber() << " contains textSearched=" << textSearched;
-         addCallToCallHistory(call);
+         //addCallToCallHistory(call);
+         historyTreeModel.addCall(call);
       }
    }
 //    alternateColors(listWidget_callHistory);
@@ -805,10 +785,10 @@ void SFLPhoneView::updateVolumeControls()
    ((SFLPhone*)parent())->action_displayVolumeControls->setChecked(display);
    //widget_recVol->setVisible(display);
    //widget_sndVol->setVisible(display);
-        toolButton_recVol->setVisible(display);
-        toolButton_sndVol->setVisible(display);
-        slider_recVol->setVisible(display);
-        slider_sndVol->setVisible(display);
+   toolButton_recVol->setVisible(display);
+   toolButton_sndVol->setVisible(display);
+   slider_recVol->setVisible(display);
+   slider_sndVol->setVisible(display);
 }
 
 void SFLPhoneView::updateDialpad()
@@ -971,34 +951,32 @@ void SFLPhoneView::on_callTree_itemChanged()
    stackedWidget_screen->setCurrentWidget(page_callList);
 }
 
-void SFLPhoneView::on_callTree_itemDoubleClicked(const QModelIndex &index)
+void SFLPhoneView::on_callTree_itemDoubleClicked(QTreeWidgetItem* call, int column)
 {
-   qDebug() << "on_callTree_itemDoubleClicked";
-   CallTreeItem *item = callTree->getItem(index);
-   Call * call = item->call();
-   call_state state = call->getCurrentState();
-   switch(state) {
-      case CALL_STATE_HOLD:
-         action(call, CALL_ACTION_HOLD);
-         break;
-      case CALL_STATE_DIALING:
-         action(call, CALL_ACTION_ACCEPT);
-         break;
-      default:
-         qDebug() << "Double clicked an item with no action on double click.";
-   }
+   //TODO port
+//    qDebug() << "on_callTree_itemDoubleClicked";
+//    call_state state = call->getCurrentState();
+//    switch(state) {
+//       case CALL_STATE_HOLD:
+//          action(call, CALL_ACTION_HOLD);
+//          break;
+//       case CALL_STATE_DIALING:
+//          action(call, CALL_ACTION_ACCEPT);
+//          break;
+//       default:
+//          qDebug() << "Double clicked an item with no action on double click.";
+//    }
 }
 
-void SFLPhoneView::on_listWidget_callHistory_itemDoubleClicked(CallTreeItem * item)
+void SFLPhoneView::on_listWidget_callHistory_itemDoubleClicked(Call* call)
 {
    qDebug() << "on_listWidget_callHistory_itemDoubleClicked";
    changeScreen(SCREEN_MAIN);
-   Call * pastCall = item->call();
-   Call * call = callList->addDialingCall(pastCall->getPeerName(), pastCall->getAccountId());
-   call->appendText(pastCall->getPeerPhoneNumber());
-   addCallToCallList(call);
-   callTree->setCurrentRow(callTree->count() - 1);
-   action(call, CALL_ACTION_ACCEPT);
+   Call* pastCall = call;
+   Call* call2 = callTreeModel.addDialingCall(pastCall->getPeerName(), pastCall->getAccountId());
+   call2->appendText(pastCall->getPeerPhoneNumber());
+   //callTreeModel.selectItem(addCallToCallList(call2));
+   action(call2, CALL_ACTION_ACCEPT);
 }
 
 
@@ -1088,20 +1066,17 @@ void SFLPhoneView::editBeforeCall()
    QString name;
    QString number;
    if(stackedWidget_screen->currentWidget() == page_callHistory) {
-      CallTreeItem * item = historyTree->currentItem();
-      if(item) {
-         Call * call = item->call();
-         if(call) {
-            name = call->getPeerName();
-            number = call->getPeerPhoneNumber();
-         }
+      Call* call = historyTreeModel.getCurrentItem();
+      if(call) {
+         name = call->getPeerName();
+         number = call->getPeerPhoneNumber();
       }
    }
    else if(stackedWidget_screen->currentWidget() == page_addressBook) {
-      QListWidgetItem * item = listWidget_addressBook->currentItem();
+      QListWidgetItem* item = listWidget_addressBook->currentItem();
                 
       if(item) {
-         ContactItemWidget * w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(listWidget_addressBook->currentItem()));
+         ContactItemWidget* w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(listWidget_addressBook->currentItem()));
          name = w->getContactName();
          number = w->getContactNumber();
       }
@@ -1113,10 +1088,9 @@ void SFLPhoneView::editBeforeCall()
    QString newNumber = QInputDialog::getText(this, i18n("Edit before call"), QString(), QLineEdit::Normal, number, &ok);
    if(ok) {
       changeScreen(SCREEN_MAIN);
-      Call * call = callList->addDialingCall(name);
+      Call* call = callTreeModel.addDialingCall(name);
       call->appendText(newNumber);
-      addCallToCallList(call);
-      callTree->setCurrentRow(callTree->count() - 1);
+      //callTreeModel.selectItem(addCallToCallList(call));
       action(call, CALL_ACTION_ACCEPT);
    }
 }
@@ -1161,51 +1135,41 @@ void SFLPhoneView::accountCreationWizard()
 void SFLPhoneView::accept()
 {
    if(stackedWidget_screen->currentWidget() == page_callList) {
-      CallTreeItem * item = callTree->currentItem();
-      if(!item) {
+      Call* call = callTreeModel.getCurrentItem();
+      if(!call) {
          qDebug() << "Calling when no item is selected. Opening an item.";
-         Call * call = callList->addDialingCall();
-         addCallToCallList(call);
-         callTree->setCurrentRow(callTree->count() - 1);
+         Call * newCall = callTreeModel.addDialingCall();
+         //callTreeModel.selectItem(addCallToCallList(newCall));
       }
       else {
-         Call * call = item->call();
-         if(!call) {
-            qDebug() << "Error : Accept triggered on unexisting call.";
+         int state = call->getState();
+         if(state == CALL_STATE_RINGING || state == CALL_STATE_CURRENT || state == CALL_STATE_HOLD || state == CALL_STATE_BUSY)
+         {
+            qDebug() << "Calling when item currently ringing, current, hold or busy. Opening an item.";
+            Call* newCall = callTreeModel.addDialingCall();
+            //callTreeModel.selectItem(addCallToCallList(newCall));
          }
          else {
-            int state = call->getState();
-            if(state == CALL_STATE_RINGING || state == CALL_STATE_CURRENT || state == CALL_STATE_HOLD || state == CALL_STATE_BUSY)
-            {
-               qDebug() << "Calling when item currently ringing, current, hold or busy. Opening an item.";
-               Call * call = callList->addDialingCall();
-               addCallToCallList(call);
-               callTree->setCurrentRow(callTree->count() - 1);
-            }
-            else {
-               action(call, CALL_ACTION_ACCEPT);
-            }
+            action(call, CALL_ACTION_ACCEPT);
          }
       }
    }
    
    if(stackedWidget_screen->currentWidget() == page_callHistory) {
       changeScreen(SCREEN_MAIN);
-      Call * pastCall = historyTree->currentItem()->call();
-      Call * call = callList->addDialingCall(pastCall->getPeerName());
+      Call* pastCall = historyTreeModel.getCurrentItem();
+      Call* call = callTreeModel.addDialingCall(pastCall->getPeerName());
       call->appendText(pastCall->getPeerPhoneNumber());
-      addCallToCallList(call);
-      callTree->setCurrentRow(callTree->count() - 1);
+      //callTreeModel.selectItem(addCallToCallList(call));
       action(call, CALL_ACTION_ACCEPT);
    }
    
    if(stackedWidget_screen->currentWidget() == page_addressBook) {
       changeScreen(SCREEN_MAIN);
       ContactItemWidget * w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(listWidget_addressBook->currentItem()));
-      Call * call = callList->addDialingCall(w->getContactName());
+      Call * call = callTreeModel.addDialingCall(w->getContactName());
       call->appendText(w->getContactNumber());
-      addCallToCallList(call);
-      callTree->setCurrentRow(callTree->count() - 1);
+      //callTreeModel.selectItem(addCallToCallList(call));
       action(call, CALL_ACTION_ACCEPT);
    }
 }
@@ -1213,12 +1177,12 @@ void SFLPhoneView::accept()
 void SFLPhoneView::refuse()
 {
    if(stackedWidget_screen->currentWidget() == page_callList) {
-      CallTreeItem * item = callTree->currentItem();
-      if(!item) {
+      Call* call = callTreeModel.getCurrentItem();
+      if(!call) {
          qDebug() << "Error : Hanging up when no item selected. Should not happen.";
       }
       else {
-         action(item->call(), CALL_ACTION_REFUSE);
+         action(call, CALL_ACTION_REFUSE);
       }
    }
    
@@ -1233,34 +1197,34 @@ void SFLPhoneView::refuse()
 
 void SFLPhoneView::hold()
 {
-   CallTreeItem * item = callTree->currentItem();
-   if(!item) {
+   Call* call = callTreeModel.getCurrentItem();
+   if(!call) {
       qDebug() << "Error : Holding when no item selected. Should not happen.";
    }
    else {
-      action(item->call(), CALL_ACTION_HOLD);
+      action(call, CALL_ACTION_HOLD);
    }
 }
 
 void SFLPhoneView::transfer()
 {
-   CallTreeItem * item = callTree->currentItem();
-   if(!item) {
+   Call* call = callTreeModel.getCurrentItem();
+   if(!call) {
       qDebug() << "Error : Transfering when no item selected. Should not happen.";
    }
    else {
-      action(item->call(), CALL_ACTION_TRANSFER);
+      action(call, CALL_ACTION_TRANSFER);
    }
 }
 
 void SFLPhoneView::record()
 {
-   CallTreeItem * item = callTree->currentItem();
-   if(!item) {
+   Call* call = callTreeModel.getCurrentItem();
+   if(!call) {
       qDebug() << "Error : Recording when no item selected. Should not happen.";
    }
    else {
-      action(item->call(), CALL_ACTION_RECORD);
+      action(call, CALL_ACTION_RECORD);
    }
 }
 
@@ -1268,21 +1232,20 @@ void SFLPhoneView::mailBox()
 {
    Account * account = accountInUse();
    QString mailBoxNumber = account->getAccountDetail(ACCOUNT_MAILBOX);
-   Call * call = callList->addDialingCall();
+   Call * call = callTreeModel.addDialingCall();
    call->appendText(mailBoxNumber);
-   addCallToCallList(call);
-   callTree->setCurrentRow(callTree->count() - 1);
+   //callTreeModel.selectItem(addCallToCallList(call));
    action(call, CALL_ACTION_ACCEPT);
 }
 
 void SFLPhoneView::on1_callStateChanged(const QString &callID, const QString &state)
 {
    qDebug() << "Signal : Call State Changed for call  " << callID << " . New state : " << state;
-   Call * call = callList->findCallByCallId(callID);
+   Call * call = callTreeModel.findCallByCallId(callID);
    if(!call) {
       if(state == CALL_STATE_CHANGE_RINGING) {
-         call = callList->addRingingCall(callID);
-         addCallToCallList(call);
+         call = callTreeModel.addRingingCall(callID);
+         //addCallToCallList(call);
       }
       else {
          qDebug() << "Call doesn't exist in this client. Might have been initialized by another client instance before this one started.";
@@ -1304,9 +1267,8 @@ void SFLPhoneView::on1_error(MapStringString details)
 void SFLPhoneView::on1_incomingCall(const QString & /*accountID*/, const QString & callID)
 {
    qDebug() << "Signal : Incoming Call ! ID = " << callID;
-   Call * call = callList->addIncomingCall(callID);
-   addCallToCallList(call);
-   callTree->setCurrentRow(callTree->count() - 1);
+   Call* call = callTreeModel.addIncomingCall(callID);
+   //callTreeModel.selectItem(addCallToCallList(call));
 
    changeScreen(SCREEN_MAIN);
 
@@ -1317,6 +1279,10 @@ void SFLPhoneView::on1_incomingCall(const QString & /*accountID*/, const QString
    emit incomingCall(call);
 }
 
+void SFLPhoneView::on1_incommingConference(const QString &confID) {
+   callTreeModel.addConference(confID);
+}
+
 void SFLPhoneView::on1_incomingMessage(const QString &accountID, const QString &message)
 {
    qDebug() << "Signal : Incoming Message for account " << accountID << " ! \nMessage : " << message;
diff --git a/sflphone-client-kde/src/SFLPhoneView.h b/sflphone-client-kde/src/SFLPhoneView.h
index a5143757d56158a9ee32b04ca8b3eb609c1728ff..54071266beb7c1b34b19db24b6a71e92fd8f3ac5 100644
--- a/sflphone-client-kde/src/SFLPhoneView.h
+++ b/sflphone-client-kde/src/SFLPhoneView.h
@@ -33,10 +33,13 @@
 #include "ui_SFLPhoneView_base.h"
 #include "conf/ConfigurationDialog.h"
 #include "CallList.h"
+#include "CallTreeItem.h"
 #include "CallTreeView.h"
+#include "CallTreeWidget.h"
 #include "AccountWizard.h"
 #include "Contact.h"
 #include "AccountList.h"
+#include "CallModel.h"
 
 class ConfigurationDialog;
 
@@ -136,9 +139,14 @@ public:
     */
    void saveState();
    
-   CallTreeView *callTree;
-   CallTreeView *historyTree;
-   CallTreeView *addressBookTree;
+   //CallTreeView *callTree;
+   //CallTreeView *historyTree;
+   //CallTreeView *addressBookTree;
+   //CallTreeWidget *callTree;
+   //CallTreeWidget *historyTree;
+   CallTreeWidget *addressBookTree;
+   CallModel callTreeModel;
+   CallModel historyTreeModel;
 
 private slots:
    /**
@@ -209,14 +217,14 @@ private slots:
     *   This function doesn't add anything to the callList object.
     * @param call the call to add to the call-list's listwidget
     */
-   CallTreeItem* addCallToCallList(Call * call);
+   //Call* addCallToCallList(Call * call);
 
    /**
     * Adds the call's history-item to the call-history's listwidget.
     * This function doesn't add anything to the callList object.
     * @param call the past call to add to the call-history's listwidget
     */
-   CallTreeItem* addCallToCallHistory(Call * call);
+   //Call* addCallToCallHistory(Call * call);
 
    /**
     * Adds the contact's item to the addressbook's listwidget.
@@ -325,10 +333,10 @@ public slots:
    
    void on_callTree_currentItemChanged();
    void on_callTree_itemChanged();
-   void on_callTree_itemDoubleClicked(const QModelIndex &index);
+   void on_callTree_itemDoubleClicked(QTreeWidgetItem* item, int column);
 
    void on_listWidget_callHistory_currentItemChanged();
-   void on_listWidget_callHistory_itemDoubleClicked(CallTreeItem * item);
+   void on_listWidget_callHistory_itemDoubleClicked(Call* item);
 
    void on_listWidget_addressBook_currentItemChanged();
    void on_listWidget_addressBook_itemDoubleClicked(CallTreeItem * item);
@@ -342,6 +350,7 @@ public slots:
    void on1_voiceMailNotify(const QString &accountID, int count);
    void on1_volumeChanged(const QString &device, double value);
    void on1_audioManagerChanged();
+   void on1_incommingConference(const QString &confID);
    void changeScreen(int screen);
    
 signals:
diff --git a/sflphone-client-kde/src/icons/user-group-properties.svgz b/sflphone-client-kde/src/icons/user-group-properties.svgz
new file mode 100644
index 0000000000000000000000000000000000000000..edc81b9a6ef2ecc393c402a5def7ebb6ae75e832
Binary files /dev/null and b/sflphone-client-kde/src/icons/user-group-properties.svgz differ
diff --git a/sflphone-client-kde/src/sflphone_const.h b/sflphone-client-kde/src/sflphone_const.h
index 90026ff145a27744ccce65e50376766911008f5d..04c11772c9bff1be61b5586d8d1e8d56f863a6d2 100644
--- a/sflphone-client-kde/src/sflphone_const.h
+++ b/sflphone-client-kde/src/sflphone_const.h
@@ -63,6 +63,7 @@
 #define ICON_BUSY                         ":/images/icons/busy.svg"
 #define ICON_TRANSFER                     ":/images/icons/transfert.svg"
 #define ICON_TRANSF_HOLD                  ":/images/icons/transfert.svg"
+#define ICON_CONFERENCE                   ":/images/icons/user-group-properties.svg"
 
 #define ICON_CALL                         ":/images/icons/call.svg"
 #define ICON_HANGUP                       ":/images/icons/hang_up.svg"