diff --git a/src/libs/utils/treemodel.cpp b/src/libs/utils/treemodel.cpp
index d27729d750963574403c31a0ea7f77047f594294..cb85344acb017329723a5c8b0a7a48a4aba7d3c7 100644
--- a/src/libs/utils/treemodel.cpp
+++ b/src/libs/utils/treemodel.cpp
@@ -44,7 +44,13 @@ namespace Utils {
 // TreeItem
 //
 TreeItem::TreeItem()
-    : m_parent(0), m_lazy(false), m_populated(false),
+    : m_parent(0), m_displays(0), m_lazy(false), m_populated(false),
+      m_flags(Qt::ItemIsEnabled|Qt::ItemIsSelectable)
+{
+}
+
+TreeItem::TreeItem(const QStringList &displays)
+    : m_parent(0), m_displays(new QStringList(displays)), m_lazy(false), m_populated(false),
       m_flags(Qt::ItemIsEnabled|Qt::ItemIsSelectable)
 {
 }
@@ -52,6 +58,7 @@ TreeItem::TreeItem()
 TreeItem::~TreeItem()
 {
     clear();
+    delete m_displays;
 }
 
 TreeItem *TreeItem::child(int pos) const
@@ -69,7 +76,7 @@ bool TreeItem::isLazy() const
 
 int TreeItem::columnCount() const
 {
-    return 1;
+    return m_displays ? m_displays->size() : 1;
 }
 
 int TreeItem::rowCount() const
@@ -84,8 +91,8 @@ void TreeItem::populate()
 
 QVariant TreeItem::data(int column, int role) const
 {
-    Q_UNUSED(column);
-    Q_UNUSED(role);
+    if (role == Qt::DisplayRole && m_displays && column >= 0 && column < m_displays->size())
+        return m_displays->at(column);
     return QVariant();
 }
 
@@ -109,6 +116,19 @@ void TreeItem::appendChild(TreeItem *item)
     m_children.append(item);
 }
 
+TreeItem *TreeItem::lastChild() const
+{
+    return m_children.isEmpty() ? 0 : m_children.last();
+}
+
+int TreeItem::level() const
+{
+    int l = 0;
+    for (TreeItem *item = this->parent(); item; item = item->parent())
+        ++l;
+    return l;
+}
+
 void TreeItem::setLazy(bool on)
 {
     m_lazy = on;
@@ -251,6 +271,39 @@ QModelIndex TreeModel::indexFromItem(const TreeItem *item) const
     return indexFromItemHelper(item, m_root, QModelIndex());
 }
 
+void TreeModel::appendItem(TreeItem *parent, TreeItem *item)
+{
+    QTC_ASSERT(item, return);
+    QTC_ASSERT(parent, return);
+
+    QModelIndex idx = indexFromItem(parent);
+    const int n = parent->rowCount();
+    beginInsertRows(idx, n, n);
+    parent->appendChild(item);
+    endInsertRows();
+}
+
+void TreeModel::updateItem(TreeItem *item)
+{
+    QModelIndex idx = indexFromItem(item);
+    dataChanged(idx.sibling(idx.row(), 0), idx.sibling(idx.row(), item->columnCount() - 1));
+}
+
+void TreeModel::removeItem(TreeItem *item)
+{
+    QTC_ASSERT(item, return);
+    TreeItem *parent = item->parent();
+    QTC_ASSERT(parent, return);
+    int pos = parent->m_children.indexOf(item);
+    QTC_ASSERT(pos != -1, return);
+
+    QModelIndex idx = indexFromItem(parent);
+    beginRemoveRows(idx, pos, pos);
+    item->m_parent = 0;
+    parent->m_children.removeAt(pos);
+    endRemoveRows();
+}
+
 QModelIndex TreeModel::indexFromItemHelper(const TreeItem *needle,
     TreeItem *parentItem, const QModelIndex &parentIndex) const
 {
diff --git a/src/libs/utils/treemodel.h b/src/libs/utils/treemodel.h
index e02335b2df28a5b3f5a932c23ec655e6dfca7de8..716c06adbcfee660e53bcbf9836c038f0ebedc66 100644
--- a/src/libs/utils/treemodel.h
+++ b/src/libs/utils/treemodel.h
@@ -41,6 +41,7 @@ class QTCREATOR_UTILS_EXPORT TreeItem
 {
 public:
     TreeItem();
+    explicit TreeItem(const QStringList &displays);
     virtual ~TreeItem();
 
     virtual TreeItem *parent() const { return m_parent; }
@@ -55,6 +56,8 @@ public:
 
     void prependChild(TreeItem *item);
     void appendChild(TreeItem *item);
+    TreeItem *lastChild() const;
+    int level() const;
 
     void setLazy(bool on);
     void setPopulated(bool on);
@@ -69,9 +72,12 @@ private:
 
     TreeItem *m_parent; // Not owned.
     QVector<TreeItem *> m_children; // Owned.
+    QStringList *m_displays;
     bool m_lazy;
     mutable bool m_populated;
     Qt::ItemFlags m_flags;
+
+    friend class TreeModel;
 };
 
 class QTCREATOR_UTILS_EXPORT TreeModel : public QAbstractItemModel
@@ -94,6 +100,10 @@ public:
     TreeItem *itemFromIndex(const QModelIndex &) const;
     QModelIndex indexFromItem(const TreeItem *needle) const;
 
+    void appendItem(TreeItem *parent, TreeItem *item);
+    void removeItem(TreeItem *item); // item is not destroyed.
+    void updateItem(TreeItem *item); // call to trigger dataChanged
+
 private:
     QModelIndex indexFromItemHelper(const TreeItem *needle,
         TreeItem *parentItem, const QModelIndex &parentIndex) const;