diff --git a/sflphone-client-kde/src/CMakeLists.txt b/sflphone-client-kde/src/CMakeLists.txt
index 4735bad48c72823e776fe79da1b45fbf93f7c5ca..f2a721f3a845d23e840112dafe6b286267eac3f6 100644
--- a/sflphone-client-kde/src/CMakeLists.txt
+++ b/sflphone-client-kde/src/CMakeLists.txt
@@ -27,6 +27,9 @@ SET(	sflphone_client_kde_SRCS
 	AccountList.cpp
 	Call.cpp
 	CallList.cpp
+	CallTreeView.cpp
+	CallTreeModel.cpp
+	CallTreeItem.cpp
 	configurationmanager_interface_singleton.cpp
 	callmanager_interface_singleton.cpp
 	instance_interface_singleton.cpp
diff --git a/sflphone-client-kde/src/CallList.cpp b/sflphone-client-kde/src/CallList.cpp
index 6894ae2f7cc734eb254ae31cce8f9f694338901c..72a7d2fd4e64ae64726278c57a55c9944ced713f 100644
--- a/sflphone-client-kde/src/CallList.cpp
+++ b/sflphone-client-kde/src/CallList.cpp
@@ -82,6 +82,8 @@ CallList::~CallList()
 	delete calls;
 }
 
+/*
+
 Call * CallList::operator[](const QListWidgetItem * item)
 {
 	for(int i = 0 ; i < size() ; i++)
@@ -116,7 +118,7 @@ Call * CallList::findCallByHistoryItem(const QListWidgetItem * item)
 		}
 	}
 	return NULL;
-}
+	}*/
 
 Call * CallList::findCallByCallId(const QString & callId)
 {
diff --git a/sflphone-client-kde/src/CallList.h b/sflphone-client-kde/src/CallList.h
index ffee7a9937b10708e837d35fdf7eee870cc60e6a..b411267bb8fb73864f690e091d8d76680b935e2d 100644
--- a/sflphone-client-kde/src/CallList.h
+++ b/sflphone-client-kde/src/CallList.h
@@ -25,7 +25,6 @@
 #include <QtCore/QVector>
 #include <QtCore/QString>
 
-#include "CallTreeItem.h"
 #include "Call.h"
 #include "dbus/metatypes.h"
 
@@ -44,10 +43,10 @@ public:
 	~CallList();
 
 	//Getters
-	Call * findCallByItem(const QListWidgetItem * item);
-	Call * findCallByHistoryItem(const QListWidgetItem * item);
+	//	Call * findCallByItem(const QListWidgetItem * item);
+	//	Call * findCallByHistoryItem(const QListWidgetItem * item);
 	Call * findCallByCallId(const QString & callId);
-	Call * operator[](const QListWidgetItem * item);
+	//	Call * operator[](const QListWidgetItem * item);
 	Call * operator[](const QString & callId);
 	Call * operator[](int ind);
 	int size();
diff --git a/sflphone-client-kde/src/CallTreeItem.cpp b/sflphone-client-kde/src/CallTreeItem.cpp
index 50facfe87b8f37732a0369eb82a1ac84def7f350..f14b619a4ca17dc0d1ae16d9507e5e93af156a1f 100644
--- a/sflphone-client-kde/src/CallTreeItem.cpp
+++ b/sflphone-client-kde/src/CallTreeItem.cpp
@@ -23,10 +23,15 @@
 
  #include "CallTreeItem.h"
 
+ CallTreeItem::CallTreeItem(CallTreeItem *parent)
+   : parentItem(parent)
+ {
+ }
+
  CallTreeItem::CallTreeItem(const Call &data, CallTreeItem *parent)
+   : parentItem(parent),
+     itemData(data)
  {
-     parentItem = parent;
-     itemData = data;
  }
 
  CallTreeItem::~CallTreeItem()
@@ -63,6 +68,11 @@
      return itemData.value(column);
  }
 
+ QVariant CallTreeItem::data() const
+ {
+   return data(0);
+ }
+
  bool CallTreeItem::insertChildren(int position, int count, int columns)
  {
      if (position < 0 || position > childItems.size())
diff --git a/sflphone-client-kde/src/CallTreeItem.h b/sflphone-client-kde/src/CallTreeItem.h
index cc0aea12324a43ffe9d6c1f82fe1406a08c2e69f..44e5e33f277eb0237c77e8499160449a9d636f3d 100644
--- a/sflphone-client-kde/src/CallTreeItem.h
+++ b/sflphone-client-kde/src/CallTreeItem.h
@@ -34,25 +34,27 @@ class Call;
 class CallTreeItem : public QTreeWidget
  {
  public:
-     CallTreeItem(const Call &data, CallTreeItem *parent = 0);
-     ~CallTreeItem();
-
-     CallTreeItem *child(int number);
-     int childCount() const;
-     int columnCount() const;
-     Call* data(int column) 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 Call &value);
+	 CallTreeItem(CallTreeItem *parent = 0);
+	 CallTreeItem(const Call &data, CallTreeItem *parent = 0);
+	 ~CallTreeItem();
+     
+	 CallTreeItem *child(int number);
+	 int childCount() const;
+	 int columnCount() const;
+	 Call* data(int column) const;
+	 Call* data() 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 Call &value);
 
  private:
-     QList<CallTreeItem*> childItems;
-     Call *itemData;
-     CallTreeItem *parentItem;
+	 QList<CallTreeItem*> childItems;
+	 Call *itemData;
+	 CallTreeItem *parentItem;
  };
 
 #endif // CALLTREE_ITEM_H
diff --git a/sflphone-client-kde/src/CallTreeModel.cpp b/sflphone-client-kde/src/CallTreeModel.cpp
index d64088edf5b21f8cad9361b7251252faee8adbce..d5c854070f8761e839a046f4d97acbd7b8eda013 100644
--- a/sflphone-client-kde/src/CallTreeModel.cpp
+++ b/sflphone-client-kde/src/CallTreeModel.cpp
@@ -20,23 +20,21 @@
  ***************************************************************************/
 
 #include <QtGui>
+#include <klocale.h>
 
 #include "CallTreeModel.h"
 #include "CallTreeItem.h"
+#include "Call.h"
 
 CallTreeModel::CallTreeModel(QObject *parent)
 	: QAbstractItemModel(parent)
 {
-	QStringList headers  << i18n("Calls");
+	QStringList data = QString("Calls").split("\n");
 	QVector<QVariant> rootData;
+	rootData << i18n("Calls");
 
-	foreach (QString header, headers)
-	{
-		rootData << header;
-	}
-
-	rootItem = new TreeItem(rootData);
-	setupModelData(data.split(QString("\n")), rootItem);
+	rootItem = new CallTreeItem();
+	setupModelData(data, rootItem);
 }
 
 CallTreeModel::~CallTreeModel()
@@ -53,12 +51,12 @@ QVariant CallTreeModel::data(const QModelIndex &index, int role) const
 {
 	if (!index.isValid())
 	{
-		return QVariant();
+		return 0;
 	}
 
 	if (role != Qt::DisplayRole && role != Qt::EditRole)
 	{
-		return QVariant();
+		return 0;
 	}
 
 	CallTreeItem *item = getItem(index);
@@ -80,7 +78,7 @@ CallTreeItem *CallTreeModel::getItem(const QModelIndex &index) const
 {
 	if (index.isValid()) 
 	{
-		CallTreeItem *item = static_cast<TreeItem*>(index.internalPointer());
+		CallTreeItem *item = static_cast<CallTreeItem*>(index.internalPointer());
 		if (item)
 		{
 			return item;
@@ -194,6 +192,13 @@ int CallTreeModel::rowCount(const QModelIndex &parent) const
 	return parentItem->childCount();
 }
 
+bool CallTreeModel::setData(const QModelIndex &index, const Call *call, int role)
+{
+	QVariant value = QVariant(&*value);
+
+	return setData(index, value, role);
+}
+
 bool CallTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
 {
 	if (role != Qt::EditRole)
@@ -201,7 +206,7 @@ bool CallTreeModel::setData(const QModelIndex &index, const QVariant &value, int
 		return false;
 	}
 
-	TreeItem *item = getItem(index);
+	CallTreeItem *item = getItem(index);
 	bool result = item->setData(index.column(), value);
 
 	if (result)
diff --git a/sflphone-client-kde/src/CallTreeModel.h b/sflphone-client-kde/src/CallTreeModel.h
index e62ec4b99307e04b73b268a8a5ff9906bbce9c0c..be79cf7ad879e2db11f93bb46d41087745cd83a5 100644
--- a/sflphone-client-kde/src/CallTreeModel.h
+++ b/sflphone-client-kde/src/CallTreeModel.h
@@ -31,14 +31,14 @@
 #include <QtCore/QVariant>
 
 class CallTreeItem;
+class Call;
 
 class CallTreeModel : public QAbstractItemModel
 {
 	Q_OBJECT
 
 public:
-	CallTreeModel(const QStringList &headers, const QString &data,
-		      QObject *parent = 0);
+	CallTreeModel(QObject *parent = 0);
 	~CallTreeModel();
 
 	QVariant data(const QModelIndex &index, int role) const;
@@ -53,8 +53,8 @@ public:
 	int columnCount(const QModelIndex &parent = QModelIndex()) const;
 
 	Qt::ItemFlags flags(const QModelIndex &index) const;
-	bool setData(const QModelIndex &index, const QVariant &value,
-		     int role = Qt::EditRole);
+	bool setData(const QModelIndex &index, const Call *call, int role = Qt::EditRole);
+
 	bool setHeaderData(int section, Qt::Orientation orientation,
 			   const QVariant &value, int role = Qt::EditRole);
 
@@ -67,9 +67,11 @@ public:
 	bool removeRows(int position, int rows,
 			const QModelIndex &parent = QModelIndex());
 
+	CallTreeItem *getItem(const QModelIndex &index) const;
+
 private:
+	bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
 	void setupModelData(const QStringList &lines, CallTreeItem *parent);
-	CallTreeItem *getItem(const QModelIndex &index) const;
 	CallTreeItem *rootItem;
 };
 
diff --git a/sflphone-client-kde/src/CallTreeView.cpp b/sflphone-client-kde/src/CallTreeView.cpp
index f4c179fcc0a85573e57a51113e49c4121a314c72..5be278206783769d0e8b02cf9b9f6156d30d2c76 100644
--- a/sflphone-client-kde/src/CallTreeView.cpp
+++ b/sflphone-client-kde/src/CallTreeView.cpp
@@ -26,72 +26,110 @@
 
 CallTreeView::CallTreeView(QWidget * parent)
 	: QTreeView(parent)
-{
-	model = new TreeModel(this);
-
-	setModel(model)
+{	 
+	setModel(new CallTreeModel(this));
 }
 
 CallTreeView::~CallTreeView()
 {
-	delete modele;
+	//
 }
 
 CallTreeItem* CallTreeView::insert(Call *call)
 {
 	QModelIndex index = selectionModel()->currentIndex();
-	QAbstractItemModel *model = model();
 
-	if (!model->insertRow(index.row()+1, index.parent()))
+	if (!model()->insertRow(index.row()+1, index.parent()))
 	{
-		return;
+		return 0;
 	}
 
-	for (int column = 0; column < model->columnCount(index.parent()); ++column) 
+	for (int column = 0; column < model()->columnCount(index.parent()); ++column) 
 	{
-		QModelIndex child = model->index(index.row()+1, column, index.parent());
-		model->setData(child, call, Qt::EditRole);
+		QModelIndex child = model()->index(index.row()+1, column, index.parent());
+		// TODO
+		//AAAAAAAAAAARRGG//model()->setData(child, call, Qt::EditRole);
 	}
+
+	QModelIndex child = model()->index(index.row()+1, 0, index.parent());
+
+	// TODO
+	return ((CallTreeModel*)model())->getItem(child);
+//	return ((CallTreeModel*)model())->getItem(index.row()+1);
 }
 
 CallTreeItem* CallTreeView::insert(CallTreeItem *parent, Call *call)
 {
+	QModelIndex index = selectionModel()->currentIndex();
+	
+	if (model()->columnCount(index) == 0) 
+	{
+		if (!model()->insertColumn(0, index))
+		{
+			return 0; 
+		}
+			
+	}
+		
+	if (!model()->insertRow(0, index))
+	{
+		return 0;
+	}
+	
+	for (int column = 0; column < model()->columnCount(index); ++column) 
+	{
+		QModelIndex child = model()->index(0, column, index);
+		//arrgg
+		//TODO
+		//model()->setData(child, call, Qt::EditRole);
+		
+		if (!model()->headerData(column, Qt::Horizontal).isValid())
+		{
+			model()->setHeaderData(column, Qt::Horizontal, QVariant("[No header]"), Qt::EditRole);
+		}
+	}
+	
+	selectionModel()->setCurrentIndex(model()->index(0, 0, index), QItemSelectionModel::ClearAndSelect);
+}
 
-
-QModelIndex index = view->selectionModel()->currentIndex();
+void CallTreeView::remove(CallTreeItem *item)
 {
-     QAbstractItemModel *model = model();
-
-     if (model->columnCount(index) == 0) 
-     {
-         if (!model->insertColumn(0, index))
-	 {
-		 return;
-	 }
-
-     }
-
-     if (!model->insertRow(0, index))
-     {
-         return;
-     }
-
-     for (int column = 0; column < model->columnCount(index); ++column) 
-     {
-         QModelIndex child = model->index(0, column, index);
-         model->setData(child, QVariant("[No data]"), Qt::EditRole);
-         if (!model->headerData(column, Qt::Horizontal).isValid())
-             model->setHeaderData(column, Qt::Horizontal, QVariant("[No header]"),
-                                  Qt::EditRole);
-     }
-
-     view->selectionModel()->setCurrentIndex(model->index(0, 0, index),
-                                             QItemSelectionModel::ClearAndSelect);
+	return;
+	// to implement
 }
 
-void CallTreeView::remove(CallTreeItem *item)
+CallTreeItem* CallTreeView::getItem(Call *call)
 {
 	// to implement
+	return 0;
 }
 
 
+CallTreeItem* CallTreeView::currentItem()
+{
+	QModelIndex index = selectionModel()->currentIndex();	
+
+	CallTreeModel * treeModel = static_cast<CallTreeModel*>(model());
+
+	CallTreeItem *item = treeModel->getItem(index);
+
+	return item;
+}
+
+void CallTreeView::setCurrentRow(int row)
+{
+	CallTreeModel * treeModel = static_cast<CallTreeModel*>(model());
+
+	QModelIndex currentIndex = selectionModel()->currentIndex();
+	QModelIndex index = treeModel->index(row, 0, currentIndex);
+
+	// TODO: check
+
+	selectionModel()->setCurrentIndex(index,  QItemSelectionModel::Current);
+}
+
+
+int CallTreeView::count()
+{
+	return model()->rowCount();
+}
diff --git a/sflphone-client-kde/src/CallTreeView.h b/sflphone-client-kde/src/CallTreeView.h
index a55decc6d6d6fa8f4ccffe24aaa5e0e639abc046..a89353ad2736f85449274caa651ba855773998c8 100644
--- a/sflphone-client-kde/src/CallTreeView.h
+++ b/sflphone-client-kde/src/CallTreeView.h
@@ -35,14 +35,17 @@ class Call;
 class CallTreeView : public QTreeView
 {
 	Q_OBJECT
-private:
-	CallTreeModel *model;
 public:
 	CallTreeView(QWidget *parent);
 	~CallTreeView();
 
+	CallTreeItem* insert(CallTreeItem *item, Call* call);
 	CallTreeItem* insert(Call* call);
+	CallTreeItem* getItem(Call *call);
 	void remove(CallTreeItem* item);
+	CallTreeItem* currentItem();
+	void setCurrentRow(int row);
+	int count();
 	
 };
 
diff --git a/sflphone-client-kde/src/SFLPhone.cpp b/sflphone-client-kde/src/SFLPhone.cpp
index 68d2ddeff6611af1fdbb3ebb2a1bf15ba7a2d5b2..8c7d73c31edf42351058d1c0dcc7977fa12dc9c8 100644
--- a/sflphone-client-kde/src/SFLPhone.cpp
+++ b/sflphone-client-kde/src/SFLPhone.cpp
@@ -217,9 +217,9 @@ bool SFLPhone::queryClose()
 void SFLPhone::quitButton()
 {
 	InstanceInterface & instance = InstanceInterfaceSingleton::getInstance();
-	qDebug() << "quitButton : " << view->listWidget_callList->count() << " calls open.";
+	qDebug() << "quitButton : " << view->callTree->count() << " calls open.";
 
-	if(view->listWidget_callList->count() > 0 && instance.getRegistrationCount() <= 1)
+	if(view->callTree->count() > 0 && instance.getRegistrationCount() <= 1)
 	{
 		qDebug() << "Attempting to quit when still having some calls open.";
 	}
diff --git a/sflphone-client-kde/src/SFLPhoneView.cpp b/sflphone-client-kde/src/SFLPhoneView.cpp
index 8b60297c02aa44293a676f290fb4f4a1978daf00..324e262d5015ccfdb782d8ba9c7497d5f3ead6c5 100644
--- a/sflphone-client-kde/src/SFLPhoneView.cpp
+++ b/sflphone-client-kde/src/SFLPhoneView.cpp
@@ -48,6 +48,7 @@
 #include "typedefs.h"
 #include "Dialpad.h"
 #include "CallTreeView.h"
+#include "CallTreeItem.h"
 
 
 using namespace KABC;
@@ -200,26 +201,24 @@ QErrorMessage * SFLPhoneView::getErrorWindow()
 	return errorWindow;
 }
 
-void SFLPhoneView::addCallToCallList(Call * call)
-{
-	CallTreeItem * item = call->getItem();
-	QWidget * widget = call->getItemWidget();
-	if(item && widget)
-	{
-		callTree->insert(item);
-		callTree->setItemWidget(item, widget);
-	}
+CallTreeItem* SFLPhoneView::addCallToCallList(Call * call)
+{	  
+	return callTree->insert(call);
+
+//		QWidget * widget = call->getItemWidget();
+//		callTree->setItemWidget(item, widget);
+//	}
 }
 
-void SFLPhoneView::addCallToCallHistory(Call * call)
+CallTreeItem* SFLPhoneView::addCallToCallHistory(Call * call)
 {
-	QListWidgetItem * item = call->getHistoryItem();
-	QWidget * widget = call->getHistoryItemWidget();
-	if(item && widget)
-	{
-		listWidget_callHistory->insertItem(0, item);
-		listWidget_callHistory->setItemWidget(item, widget);
-	}
+	return historyTree->insert(call);
+
+//	if(item)
+//	{
+//		QWidget * widget = call->getHistoryItemWidget();
+//		historyTree->setItemWidget(item, widget);
+//	}
 }
 
 void SFLPhoneView::addContactToContactList(Contact * contact)
@@ -240,14 +239,14 @@ void SFLPhoneView::typeString(QString str)
 	
 	if(stackedWidget_screen->currentWidget() == page_callList)
 	{
-		QListWidgetItem * item = callTree->currentItem();
+		CallTreeItem * item = callTree->currentItem();
 		callManager.playDTMF(str);
 		Call *currentCall = 0;
 		Call *candidate = 0;
 
 		if(item)
 		{
-			Call *call = callList->findCallByItem(callTree->currentItem());
+			Call *call = callTree->currentItem()->data();
 
 			if(call->getState() == CALL_STATE_CURRENT)
 			{
@@ -280,7 +279,7 @@ void SFLPhoneView::typeString(QString str)
 
 		if(!currentCall && candidate)
 		{
-			callList->findCallByItem(callTree->currentItem())->appendItemText(str);
+			callTree->currentItem()->data(0)->appendItemText(str);
 		}
 	}
 	if(stackedWidget_screen->currentWidget() == page_callHistory)
@@ -303,14 +302,14 @@ void SFLPhoneView::backspace()
 	if(stackedWidget_screen->currentWidget() == page_callList)
 	{
 		qDebug() << "In call list.";
-		QListWidgetItem * item = callTree->currentItem();
+		CallTreeItem * item = callTree->currentItem();
 		if(!item)
 		{
 			qDebug() << "Backspace when no item is selected. Doing nothing.";
 		}
 		else
 		{
-			Call * call = callList->findCallByItem(callTree->currentItem());
+			Call * call = callTree->currentItem()->data(0);
 			if(!call)
 			{
 				qDebug() << "Error : Backspace on unexisting call.";
@@ -330,14 +329,15 @@ void SFLPhoneView::escape()
 	if(stackedWidget_screen->currentWidget() == page_callList )
 	{
 		qDebug() << "In call list.";
-		QListWidgetItem * item = callTree->currentItem();
+		CallTreeItem * item = callTree->currentItem();
 		if(!item)
 		{
 			qDebug() << "Escape when no item is selected. Doing nothing.";
 		}
 		else
 		{
-			Call * call = callList->findCallByItem(->currentItem());
+			Call * call = item->data(0);
+
 			if(!call)
 			{
 				qDebug() << "Error : Escape on unexisting call.";
@@ -374,14 +374,14 @@ void SFLPhoneView::enter()
 	if(stackedWidget_screen->currentWidget() == page_callList )
 	{
 		qDebug() << "In call list.";
-		QListWidgetItem * item = listWidget_callList->currentItem();
+		CallTreeItem * item = callTree->currentItem();
 		if(!item)
 		{
 			qDebug() << "Enter when no item is selected. Doing nothing.";
 		}
 		else
 		{
-			Call * call = callList->findCallByItem(listWidget_callList->currentItem());
+			Call * call = item->data(0);
 			if(!call)
 			{
 				qDebug() << "Error : Enter on unexisting call.";
@@ -403,7 +403,7 @@ void SFLPhoneView::enter()
 	if(stackedWidget_screen->currentWidget() == page_callHistory)
 	{
 		qDebug() << "In call history.";
-		QListWidgetItem * item = listWidget_callHistory->currentItem();
+		CallTreeItem * item = historyTree->currentItem();
 		if(!item)
 		{
 			qDebug() << "Enter when no item is selected. Doing nothing.";
@@ -412,7 +412,7 @@ void SFLPhoneView::enter()
 		{
 			changeScreen(SCREEN_MAIN);
 			
-			Call * pastCall = callList->findCallByHistoryItem(item);
+			Call * pastCall = item->data();
 			if (!pastCall)
 			{
 				qDebug() << "pastCall null";
@@ -420,7 +420,7 @@ void SFLPhoneView::enter()
 			Call * call = callList->addDialingCall(pastCall->getPeerName(), pastCall->getAccountId());
 			call->appendItemText(pastCall->getPeerPhoneNumber());
 			addCallToCallList(call);
-			listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+			callTree->setCurrentRow(callTree->count() - 1);
 			action(call, CALL_ACTION_ACCEPT);
 		}
 	}
@@ -439,7 +439,7 @@ void SFLPhoneView::enter()
 			Call * call = callList->addDialingCall(w->getContactName());
 			call->appendItemText(w->getContactNumber());
 			addCallToCallList(call);
-			listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+			callTree->setCurrentRow(callTree->count() - 1);
 			action(call, CALL_ACTION_ACCEPT);
 		}
 	}
@@ -477,12 +477,12 @@ void SFLPhoneView::updateCallItem(Call * call)
 	call_state state = call->getState();
 	if(state == CALL_STATE_OVER)
 	{
-		QListWidgetItem * item = call->getItem();
-		qDebug() << "Updating call with CALL_STATE_OVER. Deleting item " << (*callList)[item]->getCallId();
-		listWidget_callList->takeItem(listWidget_callList->row(item));
+		CallTreeItem * item = callTree->getItem(call);
+		qDebug() << "Updating call with CALL_STATE_OVER. Deleting item " << call->getCallId();
+		callTree->remove(item);
 		if(call->getHistoryState() != NONE)
 		{
-			addCallToCallHistory(call);
+			historyTree->insert(call);
 		}
 	}
 }
@@ -496,7 +496,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};
 	
-	QListWidgetItem * item;
+	CallTreeItem * item;
 	
 	bool transfer = false;
 	//tells whether the call is in recording position
@@ -504,7 +504,7 @@ void SFLPhoneView::updateWindowCallState()
 	enabledActions[SFLPhone::Mailbox] = accountInUse() && ! accountInUse()->getAccountDetail(ACCOUNT_MAILBOX).isEmpty();
 	if(stackedWidget_screen->currentWidget() == page_callList)
 	{
-		item = listWidget_callList->currentItem();
+		item = callTree->currentItem();
 		if (!item)
 		{
 			qDebug() << "No item selected.";
@@ -515,30 +515,30 @@ void SFLPhoneView::updateWindowCallState()
 		}
 		else
 		{
-			Call * call = (*callList)[item];
+			Call * call = item->data();
 			call_state state = call->getState();
 			recordActivated = call->getRecording();
 			switch (state)
 			{
 				case CALL_STATE_INCOMING:
-					qDebug() << "Reached CALL_STATE_INCOMING with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_INCOMING with call " << call->getCallId();
 					buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT;
 					buttonIconFiles[SFLPhone::Refuse] = ICON_REFUSE;
 					actionTexts[SFLPhone::Accept] = ACTION_LABEL_ACCEPT;
 					actionTexts[SFLPhone::Refuse] = ACTION_LABEL_REFUSE;
 					break;
 				case CALL_STATE_RINGING:
-					qDebug() << "Reached CALL_STATE_RINGING with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_RINGING with call " << call->getCallId();
 					enabledActions[SFLPhone::Hold] = false;
 					enabledActions[SFLPhone::Transfer] = false;
 					break;
 				case CALL_STATE_CURRENT:
 					qDebug() << "details = " << CallManagerInterfaceSingleton::getInstance().getCallDetails(call->getCallId()).value();
-					qDebug() << "Reached CALL_STATE_CURRENT with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_CURRENT with call " << call->getCallId();
 					buttonIconFiles[SFLPhone::Record] = ICON_REC_DEL_ON;
 					break;
 				case CALL_STATE_DIALING:
-					qDebug() << "Reached CALL_STATE_DIALING with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_DIALING with call " << call->getCallId();
 					enabledActions[SFLPhone::Hold] = false;
 					enabledActions[SFLPhone::Transfer] = false;
 					enabledActions[SFLPhone::Record] = false;
@@ -546,33 +546,33 @@ void SFLPhoneView::updateWindowCallState()
 					buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT;
 					break;
 				case CALL_STATE_HOLD:
-					qDebug() << "Reached CALL_STATE_HOLD with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_HOLD with call " << call->getCallId();
 					buttonIconFiles[SFLPhone::Hold] = ICON_UNHOLD;
 					actionTexts[SFLPhone::Hold] = ACTION_LABEL_UNHOLD;
 					break;		
 				case CALL_STATE_FAILURE:
-					qDebug() << "Reached CALL_STATE_FAILURE with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_FAILURE with call " << call->getCallId();
 					enabledActions[SFLPhone::Accept] = false;
 					enabledActions[SFLPhone::Hold] = false;
 					enabledActions[SFLPhone::Transfer] = false;
 					enabledActions[SFLPhone::Record] = false;
 					break;
 				case CALL_STATE_BUSY:
-					qDebug() << "Reached CALL_STATE_BUSY with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_BUSY with call " << call->getCallId();
 					enabledActions[SFLPhone::Accept] = false;
 					enabledActions[SFLPhone::Hold] = false;
 					enabledActions[SFLPhone::Transfer] = false;
 					enabledActions[SFLPhone::Record] = false;
 				break;
 				case CALL_STATE_TRANSFER:
-					qDebug() << "Reached CALL_STATE_TRANSFER with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_TRANSFER with call " << call->getCallId();
 					buttonIconFiles[SFLPhone::Accept] = ICON_EXEC_TRANSF;
 					actionTexts[SFLPhone::Transfer] = ACTION_LABEL_GIVE_UP_TRANSF;
 					transfer = true;
 					buttonIconFiles[SFLPhone::Record] = ICON_REC_DEL_ON;
 					break;
 				case CALL_STATE_TRANSF_HOLD:
-					qDebug() << "Reached CALL_STATE_TRANSF_HOLD with call " << (*callList)[item]->getCallId();
+					qDebug() << "Reached CALL_STATE_TRANSF_HOLD with call " << call->getCallId();
 					buttonIconFiles[SFLPhone::Accept] = ICON_EXEC_TRANSF;
 					buttonIconFiles[SFLPhone::Hold] = ICON_UNHOLD;
 					actionTexts[SFLPhone::Transfer] = ACTION_LABEL_GIVE_UP_TRANSF;
@@ -580,20 +580,20 @@ void SFLPhoneView::updateWindowCallState()
 					transfer = true;
 					break;
 				case CALL_STATE_OVER:
-					qDebug() << "Error : Reached CALL_STATE_OVER with call " << (*callList)[item]->getCallId() << "!";
+					qDebug() << "Error : Reached CALL_STATE_OVER with call " << call->getCallId() << "!";
 					break;
 				case CALL_STATE_ERROR:
-					qDebug() << "Error : Reached CALL_STATE_ERROR with call " << (*callList)[item]->getCallId() << "!";
+					qDebug() << "Error : Reached CALL_STATE_ERROR with call " << call->getCallId() << "!";
 					break;
 				default:
-					qDebug() << "Error : Reached unexisting state for call " << (*callList)[item]->getCallId() << "!";
+					qDebug() << "Error : Reached unexisting state for call " << call->getCallId() << "!";
 					break;
 			}
 		}
 	}
 	if(stackedWidget_screen->currentWidget() == page_callHistory)
 	{
-		item = listWidget_callHistory->currentItem();
+		item = historyTree->currentItem();
 		buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT;
 		actionTexts[SFLPhone::Accept] = ACTION_LABEL_CALL_BACK;
 		if (!item)
@@ -615,7 +615,7 @@ void SFLPhoneView::updateWindowCallState()
 	}
 	if(stackedWidget_screen->currentWidget() == page_addressBook)
 	{
-		item = listWidget_addressBook->currentItem();
+		item = addressBookTree->currentItem();
 		buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT;
 		if (!item)
 		{
@@ -1024,10 +1024,10 @@ void SFLPhoneView::on_listWidget_callList_itemChanged()
 	stackedWidget_screen->setCurrentWidget(page_callList);
 }
 
-void SFLPhoneView::on_listWidget_callList_itemDoubleClicked(QListWidgetItem * item)
+void SFLPhoneView::on_listWidget_callList_itemDoubleClicked(CallTreeItem * item)
 {
 	qDebug() << "on_listWidget_callList_itemDoubleClicked";
-	Call * call = callList->findCallByItem(item);
+	Call * call = item->data();
 	call_state state = call->getCurrentState();
 	switch(state)
 	{
@@ -1042,29 +1042,30 @@ void SFLPhoneView::on_listWidget_callList_itemDoubleClicked(QListWidgetItem * it
 	}
 }
 
-void SFLPhoneView::on_listWidget_callHistory_itemDoubleClicked(QListWidgetItem * item)
+void SFLPhoneView::on_listWidget_callHistory_itemDoubleClicked(CallTreeItem * item)
 {
 	qDebug() << "on_listWidget_callHistory_itemDoubleClicked";
 	changeScreen(SCREEN_MAIN);
-	Call * pastCall = callList->findCallByHistoryItem(item);
+	Call * pastCall = item->data();
 	Call * call = callList->addDialingCall(pastCall->getPeerName(), pastCall->getAccountId());
 	call->appendItemText(pastCall->getPeerPhoneNumber());
 	addCallToCallList(call);
-	listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+	callTree->setCurrentRow(callTree->count() - 1);
 	action(call, CALL_ACTION_ACCEPT);
 }
 
 
-void SFLPhoneView::on_listWidget_addressBook_itemDoubleClicked(QListWidgetItem * item)
+void SFLPhoneView::on_listWidget_addressBook_itemDoubleClicked(CallTreeItem * item)
 {
 	qDebug() << "on_listWidget_addressBook_itemDoubleClicked";
 	changeScreen(SCREEN_MAIN);
-	ContactItemWidget * w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(item));
-	Call * call = callList->addDialingCall(w->getContactName());
-	call->appendItemText(w->getContactNumber());
-	addCallToCallList(call);
-	listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
-	action(call, CALL_ACTION_ACCEPT);
+// TOFIX
+//	ContactItemWidget * w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(item));
+//	Call * call = callList->addDialingCall(w->getContactName());
+//	call->appendItemText(w->getContactNumber());
+//	addCallToCallList(call);
+//	callTree->setCurrentRow(callTree->count() - 1);
+//	action(call, CALL_ACTION_ACCEPT);
 }
 
 void SFLPhoneView::on_stackedWidget_screen_currentChanged(int index)
@@ -1144,10 +1145,10 @@ void SFLPhoneView::editBeforeCall()
 	QString number;
 	if(stackedWidget_screen->currentWidget() == page_callHistory)
 	{
-		QListWidgetItem * item = listWidget_callHistory->currentItem();
+		CallTreeItem * item = historyTree->currentItem();
 		if(item)
 		{
-			Call * call = callList->findCallByHistoryItem(item);
+			Call * call = item->data();
 			if(call)
 			{
 				name = call->getPeerName();
@@ -1175,7 +1176,7 @@ void SFLPhoneView::editBeforeCall()
 		Call * call = callList->addDialingCall(name);
 		call->appendItemText(newNumber);
 		addCallToCallList(call);
-		listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+		callTree->setCurrentRow(callTree->count() - 1);
 		action(call, CALL_ACTION_ACCEPT);
 	}
 }
@@ -1223,17 +1224,17 @@ void SFLPhoneView::accept()
 {
 	if(stackedWidget_screen->currentWidget() == page_callList)
 	{
-		QListWidgetItem * item = listWidget_callList->currentItem();
+		CallTreeItem * item = callTree->currentItem();
 		if(!item)
 		{
 			qDebug() << "Calling when no item is selected. Opening an item.";
 			Call * call = callList->addDialingCall();
 			addCallToCallList(call);
-			listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+			callTree->setCurrentRow(callTree->count() - 1);
 		}
 		else
 		{
-			Call * call = callList->findCallByItem(item);
+			Call * call = item->data();
 			if(!call)
 			{
 				qDebug() << "Error : Accept triggered on unexisting call.";
@@ -1246,7 +1247,7 @@ void SFLPhoneView::accept()
 					qDebug() << "Calling when item currently ringing, current, hold or busy. Opening an item.";
 					Call * call = callList->addDialingCall();
 					addCallToCallList(call);
-					listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+					callTree->setCurrentRow(callTree->count() - 1);
 				}
 				else
 				{
@@ -1258,11 +1259,11 @@ void SFLPhoneView::accept()
 	if(stackedWidget_screen->currentWidget() == page_callHistory)
 	{
 		changeScreen(SCREEN_MAIN);
-		Call * pastCall = callList->findCallByHistoryItem(listWidget_callHistory->currentItem());
+		Call * pastCall = historyTree->currentItem()->data();
 		Call * call = callList->addDialingCall(pastCall->getPeerName());
 		call->appendItemText(pastCall->getPeerPhoneNumber());
 		addCallToCallList(call);
-		listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+		callTree->setCurrentRow(callTree->count() - 1);
 		action(call, CALL_ACTION_ACCEPT);
 	}
 	if(stackedWidget_screen->currentWidget() == page_addressBook)
@@ -1272,7 +1273,7 @@ void SFLPhoneView::accept()
 		Call * call = callList->addDialingCall(w->getContactName());
 		call->appendItemText(w->getContactNumber());
 		addCallToCallList(call);
-		listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+		callTree->setCurrentRow(callTree->count() - 1);
 		action(call, CALL_ACTION_ACCEPT);
 	}
 }
@@ -1281,14 +1282,14 @@ void SFLPhoneView::refuse()
 {
 	if(stackedWidget_screen->currentWidget() == page_callList)
 	{
-		QListWidgetItem * item = listWidget_callList->currentItem();
+		CallTreeItem * item = callTree->currentItem();
 		if(!item)
 		{
 			qDebug() << "Error : Hanging up when no item selected. Should not happen.";
 		}
 		else
 		{
-			action(callList->findCallByItem(item), CALL_ACTION_REFUSE);
+			action(item->data(), CALL_ACTION_REFUSE);
 		}
 	}
 	if(stackedWidget_screen->currentWidget() == page_callHistory)
@@ -1303,40 +1304,40 @@ void SFLPhoneView::refuse()
 
 void SFLPhoneView::hold()
 {
-	QListWidgetItem * item = listWidget_callList->currentItem();
+	CallTreeItem * item = callTree->currentItem();
 	if(!item)
 	{
 		qDebug() << "Error : Holding when no item selected. Should not happen.";
 	}
 	else
 	{
-		action(callList->findCallByItem(item), CALL_ACTION_HOLD);
+		action(item->data(), CALL_ACTION_HOLD);
 	}
 }
 
 void SFLPhoneView::transfer()
 {
-	QListWidgetItem * item = listWidget_callList->currentItem();
+	CallTreeItem * item = callTree->currentItem();
 	if(!item)
 	{
 		qDebug() << "Error : Transfering when no item selected. Should not happen.";
 	}
 	else
 	{
-		action(callList->findCallByItem(item), CALL_ACTION_TRANSFER);
+		action(item->data(), CALL_ACTION_TRANSFER);
 	}
 }
 
 void SFLPhoneView::record()
 {
-	QListWidgetItem * item = listWidget_callList->currentItem();
+	CallTreeItem * item = callTree->currentItem();
 	if(!item)
 	{
 		qDebug() << "Error : Recording when no item selected. Should not happen.";
 	}
 	else
 	{
-		action(callList->findCallByItem(item), CALL_ACTION_RECORD);
+		action(item->data(), CALL_ACTION_RECORD);
 	}
 }
 
@@ -1347,7 +1348,7 @@ void SFLPhoneView::mailBox()
 	Call * call = callList->addDialingCall();
 	call->appendItemText(mailBoxNumber);
 	addCallToCallList(call);
-	listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+	callTree->setCurrentRow(callTree->count() - 1);
 	action(call, CALL_ACTION_ACCEPT);
 }
 
@@ -1386,7 +1387,7 @@ void SFLPhoneView::on1_incomingCall(const QString & /*accountID*/, const QString
 	qDebug() << "Signal : Incoming Call ! ID = " << callID;
 	Call * call = callList->addIncomingCall(callID);
 	addCallToCallList(call);
-	listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+	callTree->setCurrentRow(callTree->count() - 1);
 
 	changeScreen(SCREEN_MAIN);
 
diff --git a/sflphone-client-kde/src/SFLPhoneView.h b/sflphone-client-kde/src/SFLPhoneView.h
index 738eb400df2e0402fa78e8999c8b55510f1e3764..0ba19f793e0d08174eeb9e726d4c91062cd99b08 100644
--- a/sflphone-client-kde/src/SFLPhoneView.h
+++ b/sflphone-client-kde/src/SFLPhoneView.h
@@ -26,7 +26,6 @@
 #include <QtCore/QString>
 #include <QtCore/QVector>
 #include <QtCore/QList>
-#include <QtGui/QListWidgetItem>
 #include <QtGui/QKeyEvent>
 #include <QErrorMessage>
 #include <KXmlGuiWindow>
@@ -66,7 +65,6 @@ private:
 	//List of calls in the window, and past ones.
 	//Handles both current calls (dialing, ringing...) and history.
 	CallList * callList;
-	CallTreeView *callTree;
 	QErrorMessage * errorWindow;
 	//Account used prioritary if defined and registered. If not, the first registered account in accountList is used.
 	static QString priorAccountId;
@@ -138,6 +136,10 @@ public:
 	 */
 	void saveState();
 	
+	CallTreeView *callTree;
+	CallTreeView *historyTree;
+	CallTreeView *addressBookTree;
+
 private slots:
 	/**
 	 *   Performs the action action on the call call, then updates window.
@@ -203,13 +205,13 @@ private slots:
 	 *   This function doesn't add anything to the callList object.
 	 * @param call the call to add to the call-list's listwidget
 	 */
-	void addCallToCallList(Call * call);
+	CallTreeItem* 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
 	 */
-	void addCallToCallHistory(Call * call);
+	CallTreeItem* addCallToCallHistory(Call * call);
 	/**
 	 * Adds the contact's item to the addressbook's listwidget.
 	 * @param contact the contact to add to the addressbook's listwidget
@@ -242,7 +244,7 @@ private slots:
 	void updateVolumeBar();
 	void updateVolumeControls();
 	void updateDialpad();
-	
+
 public slots:
 	/**
 	 * Updates all the display
@@ -319,11 +321,11 @@ public slots:
 	
 	void on_listWidget_callList_currentItemChanged();
 	void on_listWidget_callList_itemChanged();
-	void on_listWidget_callList_itemDoubleClicked(QListWidgetItem * item);
+	void on_listWidget_callList_itemDoubleClicked(CallTreeItem * item);
 	void on_listWidget_callHistory_currentItemChanged();
-	void on_listWidget_callHistory_itemDoubleClicked(QListWidgetItem * item);
+	void on_listWidget_callHistory_itemDoubleClicked(CallTreeItem * item);
 	void on_listWidget_addressBook_currentItemChanged();
-	void on_listWidget_addressBook_itemDoubleClicked(QListWidgetItem * item);
+	void on_listWidget_addressBook_itemDoubleClicked(CallTreeItem * item);
 	
 	void on_stackedWidget_screen_currentChanged(int index);