diff --git a/src/plugins/help/openpagesmanager.cpp b/src/plugins/help/openpagesmanager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0b7f0171b9cc6c27f8f29ed6ca64b1886f3d96a2
--- /dev/null
+++ b/src/plugins/help/openpagesmanager.cpp
@@ -0,0 +1,254 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "openpagesmanager.h"
+
+#include "centralwidget.h"
+#include "helpconstants.h"
+#include "helpmanager.h"
+#include "helpviewer.h"
+#include "openpagesmodel.h"
+#include "openpageswidget.h"
+
+#include <QtGui/QComboBox>
+#include <QtGui/QTreeView>
+
+#include <QtHelp/QHelpEngineCore>
+
+using namespace Help::Internal;
+
+OpenPagesManager *OpenPagesManager::m_instance = 0;
+
+// -- OpenPagesManager
+
+OpenPagesManager::OpenPagesManager(QObject *parent)
+    : QObject(parent)
+    , m_comboBox(0)
+    , m_model(0)
+    , m_openPagesWidget(0)
+{
+    Q_ASSERT(!m_instance);
+
+    m_instance = this;
+    m_model = new OpenPagesModel(this);
+
+    m_openPagesWidget = new OpenPagesWidget(m_model);
+    connect(m_openPagesWidget, SIGNAL(setCurrentPage(QModelIndex)), this,
+        SLOT(setCurrentPage(QModelIndex)));
+    connect(m_openPagesWidget, SIGNAL(closePage(QModelIndex)), this,
+        SLOT(closePage(QModelIndex)));
+    connect(m_openPagesWidget, SIGNAL(closePagesExcept(QModelIndex)), this,
+        SLOT(closePagesExcept(QModelIndex)));
+
+    m_comboBox = new QComboBox;
+    m_comboBox->setModel(m_model);
+    m_comboBox->setMinimumContentsLength(40);
+    connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this,
+        SLOT(setCurrentPage(int)));
+}
+
+OpenPagesManager &OpenPagesManager::instance()
+{
+    Q_ASSERT(m_instance);
+    return *m_instance;
+}
+
+QWidget* OpenPagesManager::openPagesWidget() const
+{
+    return m_openPagesWidget;
+}
+
+QComboBox* OpenPagesManager::openPagesComboBox() const
+{
+    if (!m_comboBox) {
+    }
+    return m_comboBox;
+}
+
+int OpenPagesManager::pageCount() const
+{
+    return m_model->rowCount();
+}
+
+QStringList splitString(const QVariant &value)
+{
+    using namespace Help::Constants;
+    return value.toString().split(ListSeparator, QString::SkipEmptyParts);
+}
+
+void OpenPagesManager::setupInitialPages()
+{
+    const QHelpEngineCore &engine = HelpManager::helpEngineCore();
+    const int option = engine.customValue(QLatin1String("StartOption"),
+        Help::Constants::ShowLastPages).toInt();
+    QString homePage = engine.customValue(QLatin1String("DefaultHomePage"),
+        Help::Constants::AboutBlank).toString();
+
+    int initialPage = 0;
+    switch (option) {
+        case Help::Constants::ShowHomePage: {
+            m_model->addPage(engine.customValue(QLatin1String("HomePage"),
+                homePage).toString());
+        }   break;
+
+        case Help::Constants::ShowBlankPage: {
+            m_model->addPage(QUrl(Help::Constants::AboutBlank));
+        }   break;
+
+        case Help::Constants::ShowLastPages: {
+            const QStringList &lastShownPageList = splitString(engine
+                .customValue(QLatin1String("LastShownPages")));
+            const int pageCount = lastShownPageList.count();
+
+            if (pageCount > 0) {
+                QStringList zoomFactors = splitString(engine
+                    .customValue(QLatin1String("LastShownPagesZoom")));
+                while (zoomFactors.count() < pageCount)
+                    zoomFactors.append(Help::Constants::DefaultZoomFactor);
+
+                initialPage = engine.customValue(QLatin1String("LastTabPage"), 0).toInt();
+                for (int curPage = 0; curPage < pageCount; ++curPage) {
+                    const QString &curFile = lastShownPageList.at(curPage);
+                    if (engine.findFile(curFile).isValid()
+                        || curFile == Help::Constants::AboutBlank) {
+                        m_model->addPage(curFile, zoomFactors.at(curPage).toFloat());
+                    } else if (curPage <= initialPage && initialPage > 0) {
+                        --initialPage;
+                    }
+                }
+            }
+        }   break;
+
+        default: break;
+    }
+
+    if (m_model->rowCount() == 0)
+        m_model->addPage(homePage);
+
+    for (int i = 0; i < m_model->rowCount(); ++i)
+        CentralWidget::instance()->addPage(m_model->pageAt(i));
+    setCurrentPage(initialPage);
+}
+
+// -- public slots
+
+HelpViewer *OpenPagesManager::createPage()
+{
+    return createPage(QUrl(Help::Constants::AboutBlank));
+}
+
+HelpViewer *OpenPagesManager::createPageFromSearch(const QUrl &url)
+{
+    return createPage(url, true);
+}
+
+HelpViewer *OpenPagesManager::createPage(const QUrl &url, bool fromSearch)
+{
+    if (HelpViewer::launchWithExternalApp(url))
+        return 0;
+
+    m_model->addPage(url);
+
+    const int index = m_model->rowCount() - 1;
+    HelpViewer * const page = m_model->pageAt(index);
+    CentralWidget::instance()->addPage(page, fromSearch);
+
+    emit pagesChanged();
+    setCurrentPage(index);
+
+    return page;
+}
+
+void OpenPagesManager::setCurrentPage(int index)
+{
+    m_comboBox->setCurrentIndex(index);
+    CentralWidget::instance()->setCurrentPage(m_model->pageAt(index));
+
+    selectCurrentPage();    // update the selction inside the tree view
+}
+
+void OpenPagesManager::setCurrentPage(const QModelIndex &index)
+{
+    if (index.isValid()) {
+        m_comboBox->setCurrentIndex(index.row());
+        CentralWidget::instance()->setCurrentPage(m_model->pageAt(index.row()));
+    }
+}
+
+void OpenPagesManager::closeCurrentPage()
+{
+    QModelIndexList indexes = m_openPagesWidget->selectionModel()->selectedRows();
+    if (indexes.isEmpty())
+        return;
+    Q_ASSERT(indexes.count() == 1);
+    removePage(indexes.first().row());
+}
+
+void OpenPagesManager::closePage(const QModelIndex &index)
+{
+    if (index.isValid())
+        removePage(index.row());
+}
+
+void OpenPagesManager::closePagesExcept(const QModelIndex &index)
+{
+    if (index.isValid()) {
+        int i = 0;
+        HelpViewer *viewer = m_model->pageAt(index.row());
+        while (m_model->rowCount() > 1) {
+            if (m_model->pageAt(i) != viewer) {
+                removePage(i);
+            } else {
+                i++;
+            }
+        }
+    }
+}
+
+// -- private
+
+void OpenPagesManager::selectCurrentPage()
+{
+    QItemSelectionModel * selModel = m_openPagesWidget->selectionModel();
+    selModel->clearSelection();
+    selModel->select(m_model->index(CentralWidget::instance()->currentIndex(), 0),
+        QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+    m_openPagesWidget->scrollTo(m_openPagesWidget->currentIndex());
+}
+
+void OpenPagesManager::removePage(int index)
+{
+    Q_ASSERT(m_model->rowCount() > 1);
+
+    m_model->removePage(index);
+    CentralWidget::instance()->removePage(index);
+
+    emit pagesChanged();
+    selectCurrentPage();    // update the selction inside the tree view
+}
diff --git a/src/plugins/help/openpagesmanager.h b/src/plugins/help/openpagesmanager.h
new file mode 100644
index 0000000000000000000000000000000000000000..a20332c860bec8b0358133d4b534b5847ae61f26
--- /dev/null
+++ b/src/plugins/help/openpagesmanager.h
@@ -0,0 +1,94 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef OPENPAGESMANAGER_H
+#define OPENPAGESMANAGER_H
+
+#include <QtCore/QObject>
+
+QT_FORWARD_DECLARE_CLASS(QComboBox)
+QT_FORWARD_DECLARE_CLASS(QListView)
+QT_FORWARD_DECLARE_CLASS(QModelIndex)
+QT_FORWARD_DECLARE_CLASS(QTreeView)
+QT_FORWARD_DECLARE_CLASS(QUrl)
+QT_FORWARD_DECLARE_CLASS(QWidget)
+
+class HelpViewer;
+
+namespace Help {
+    namespace Internal {
+
+class OpenPagesModel;
+
+class OpenPagesManager : public QObject
+{
+    Q_OBJECT
+
+public:
+    OpenPagesManager(QObject *parent = 0);
+
+    static OpenPagesManager &instance();
+
+    QWidget* openPagesWidget() const;
+    QComboBox* openPagesComboBox() const;
+
+    int pageCount() const;
+    void setupInitialPages();
+
+public slots:
+    HelpViewer *createPage();
+    HelpViewer *createPageFromSearch(const QUrl &url);
+    HelpViewer *createPage(const QUrl &url, bool fromSearch = false);
+
+    void setCurrentPage(int index);
+    void setCurrentPage(const QModelIndex &index);
+
+    void closeCurrentPage();
+    void closePage(const QModelIndex &index);
+    void closePagesExcept(const QModelIndex &index);
+
+signals:
+    void pagesChanged();
+
+private:
+    void selectCurrentPage();
+    void removePage(int index);
+
+private:
+    QComboBox *m_comboBox;
+    OpenPagesModel *m_model;
+    QTreeView *m_openPagesWidget;
+
+    static OpenPagesManager *m_instance;
+};
+
+    } // namespace Internal
+} // namespace Help
+
+#endif // OPENPAGESMANAGER_H
diff --git a/src/plugins/help/openpagesmodel.cpp b/src/plugins/help/openpagesmodel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c2eae41afceb79fb22a57334aff824a08e05db60
--- /dev/null
+++ b/src/plugins/help/openpagesmodel.cpp
@@ -0,0 +1,94 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "openpagesmodel.h"
+#include "helpviewer.h"
+
+#include <QtCore/QUrl>
+
+using namespace Help::Internal;
+
+OpenPagesModel::OpenPagesModel(QObject *parent)
+    : QAbstractTableModel(parent)
+{
+}
+
+int OpenPagesModel::columnCount(const QModelIndex &/*parent*/) const
+{
+    return 2;
+}
+
+int OpenPagesModel::rowCount(const QModelIndex &parent) const
+{
+    return  parent.isValid() ? 0 : m_pages.count();
+}
+
+QVariant OpenPagesModel::data(const QModelIndex &index, int role) const
+{
+    if (!index.isValid() || index.row() >= rowCount() || role != Qt::DisplayRole)
+        return QVariant();
+    QString title = m_pages.at(index.row())->title();
+    title.replace(QLatin1Char('&'), QLatin1String("&&"));
+    return title.isEmpty() ? tr("(Untitled)") : title;
+}
+
+void OpenPagesModel::addPage(const QUrl &url, qreal zoom)
+{
+    beginInsertRows(QModelIndex(), rowCount(), rowCount());
+    HelpViewer *page = new HelpViewer(zoom);
+    connect(page, SIGNAL(titleChanged()), this, SLOT(handleTitleChanged()));
+    m_pages << page;
+    endInsertRows();
+    page->setSource(url);
+}
+
+void OpenPagesModel::removePage(int index)
+{
+    Q_ASSERT(index >= 0 && index < rowCount());
+    beginRemoveRows(QModelIndex(), index, index);
+    HelpViewer *page = m_pages.at(index);
+    m_pages.removeAt(index);
+    endRemoveRows();
+    page->deleteLater();
+}
+
+HelpViewer *OpenPagesModel::pageAt(int index) const
+{
+    Q_ASSERT(index >= 0 && index < rowCount());
+    return m_pages.at(index);
+}
+
+void OpenPagesModel::handleTitleChanged()
+{
+    HelpViewer *page = static_cast<HelpViewer *>(sender());
+    const int row = m_pages.indexOf(page);
+    Q_ASSERT(row != -1 );
+    const QModelIndex &item = index(row, 0);
+    emit dataChanged(item, item);
+}
diff --git a/src/plugins/help/openpagesmodel.h b/src/plugins/help/openpagesmodel.h
new file mode 100644
index 0000000000000000000000000000000000000000..0fe32c017dd0954cc253255094bf74c297eb4cc8
--- /dev/null
+++ b/src/plugins/help/openpagesmodel.h
@@ -0,0 +1,67 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef OPENPAGESMODEL_H
+#define OPENPAGESMODEL_H
+
+#include <QtCore/QList>
+#include <QtCore/QAbstractTableModel>
+
+QT_FORWARD_DECLARE_CLASS(QUrl)
+class HelpViewer;
+
+namespace Help {
+    namespace Internal {
+
+class OpenPagesModel : public QAbstractTableModel
+{
+    Q_OBJECT
+
+public:
+    OpenPagesModel(QObject *parent);
+
+    int columnCount(const QModelIndex &parent) const;
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+
+    void addPage(const QUrl &url, qreal zoom = 0);
+    void removePage(int index);
+    HelpViewer *pageAt(int index) const;
+
+private slots:
+    void handleTitleChanged();
+
+private:
+    QList<HelpViewer *> m_pages;
+};
+
+    } // namespace Internal
+} // namespace Help
+
+#endif // OPENPAGESMODEL_H
diff --git a/src/plugins/help/openpageswidget.cpp b/src/plugins/help/openpageswidget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..25a0230f35f070543cf8e48db0a3b39bc150d040
--- /dev/null
+++ b/src/plugins/help/openpageswidget.cpp
@@ -0,0 +1,188 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "openpageswidget.h"
+#include "openpagesmodel.h"
+
+#include <QtGui/QApplication>
+#include <QtGui/QPainter>
+
+#include <QtGui/QHeaderView>
+#include <QtGui/QKeyEvent>
+#include <QtGui/QMouseEvent>
+#include <QtGui/QMenu>
+
+#ifdef Q_WS_MAC
+#include <qmacstyle_mac.h>
+#endif
+
+using namespace Help::Internal;
+
+// -- OpenPagesDelegate
+
+OpenPagesDelegate::OpenPagesDelegate(QObject *parent)
+    : QStyledItemDelegate(parent)
+{
+}
+
+void OpenPagesDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
+           const QModelIndex &index) const
+{
+    if (option.state & QStyle::State_MouseOver) {
+        if ((QApplication::mouseButtons() & Qt::LeftButton) == 0)
+            pressedIndex = QModelIndex();
+        QBrush brush = option.palette.alternateBase();
+        if (index == pressedIndex)
+            brush = option.palette.dark();
+        painter->fillRect(option.rect, brush);
+    }
+
+
+    QStyledItemDelegate::paint(painter, option, index);
+
+    if (index.column() == 1 && option.state & QStyle::State_MouseOver) {
+        QIcon icon((option.state & QStyle::State_Selected)
+            ? ":/core/images/closebutton.png" : ":/core/images/darkclosebutton.png");
+
+        const QRect iconRect(option.rect.right() - option.rect.height(),
+            option.rect.top(), option.rect.height(), option.rect.height());
+
+        icon.paint(painter, iconRect, Qt::AlignRight | Qt::AlignVCenter);
+    }
+
+}
+
+// -- OpenPagesWidget
+
+OpenPagesWidget::OpenPagesWidget(OpenPagesModel *model)
+{
+    setModel(model);
+    setIndentation(0);
+    setItemDelegate((m_delegate = new OpenPagesDelegate(this)));
+
+    setFrameStyle(QFrame::NoFrame);
+    setTextElideMode(Qt::ElideMiddle);
+    setAttribute(Qt::WA_MacShowFocusRect, false);
+
+    viewport()->setAttribute(Qt::WA_Hover);
+    setSelectionBehavior(QAbstractItemView::SelectRows);
+    setSelectionMode(QAbstractItemView::SingleSelection);
+
+    header()->hide();
+    header()->setStretchLastSection(false);
+    header()->setResizeMode(0, QHeaderView::Stretch);
+    header()->setResizeMode(1, QHeaderView::Fixed);
+    header()->resizeSection(1, 16);
+
+    installEventFilter(this);
+    setUniformRowHeights(true);
+    setContextMenuPolicy(Qt::CustomContextMenu);
+
+    connect(this, SIGNAL(clicked(QModelIndex)), this,
+        SLOT(handleClicked(QModelIndex)));
+    connect(this, SIGNAL(pressed(QModelIndex)), this,
+        SLOT(handlePressed(QModelIndex)));
+    connect(this, SIGNAL(customContextMenuRequested(QPoint)), this,
+        SLOT(contextMenuRequested(QPoint)));
+}
+
+OpenPagesWidget::~OpenPagesWidget()
+{
+}
+
+// -- private slots
+
+void OpenPagesWidget::contextMenuRequested(QPoint pos)
+{
+    const QModelIndex &index = indexAt(pos);
+    if (!index.isValid())
+        return;
+
+    QMenu contextMenu;
+    QAction *closeEditor = contextMenu.addAction(tr("Close %1").arg(index.data()
+        .toString()));
+    QAction *closeOtherEditors = contextMenu.addAction(tr("Close All Except %1")
+        .arg(index.data().toString()));
+
+    if (model()->rowCount() == 1) {
+        closeEditor->setEnabled(false);
+        closeOtherEditors->setEnabled(false);
+    }
+
+    QAction *action = contextMenu.exec(mapToGlobal(pos));
+    if (action == closeEditor)
+        emit closePage(index);
+    else if (action == closeOtherEditors)
+        emit closePagesExcept(index);
+}
+
+void OpenPagesWidget::handlePressed(const QModelIndex &index)
+{
+    if (index.column() == 0)
+        emit setCurrentPage(index);
+
+    if (index.column() == 1)
+        m_delegate->pressedIndex = index;
+}
+
+void OpenPagesWidget::handleClicked(const QModelIndex &index)
+{
+    // implemented here to handle the funky close button and to  work around a
+    // bug in item views where the delegate wouldn't get the QStyle::State_MouseOver
+    if (index.column() == 1) {
+        if (model()->rowCount() > 1)
+            emit closePage(index);
+
+        QWidget *vp = viewport();
+        const QPoint &cursorPos = QCursor::pos();
+        QMouseEvent e(QEvent::MouseMove, vp->mapFromGlobal(cursorPos), cursorPos,
+            Qt::NoButton, 0, 0);
+        QCoreApplication::sendEvent(vp, &e);
+    }
+}
+
+// -- private
+
+bool OpenPagesWidget::eventFilter(QObject *obj, QEvent *event)
+{
+    if (obj == this && event->type() == QEvent::KeyPress) {
+        if (currentIndex().isValid()) {
+            QKeyEvent *ke = static_cast<QKeyEvent*>(event);
+            const int key = ke->key();
+            if ((key == Qt::Key_Return || key == Qt::Key_Enter || key == Qt::Key_Space)
+                && ke->modifiers() == 0) {
+                emit setCurrentPage(currentIndex());
+            } else if ((key == Qt::Key_Delete || key == Qt::Key_Backspace)
+                && ke->modifiers() == 0 && model()->rowCount() > 1) {
+                emit closePage(currentIndex());
+            }
+        }
+    }
+    return QWidget::eventFilter(obj, event);
+}
diff --git a/src/plugins/help/openpageswidget.h b/src/plugins/help/openpageswidget.h
new file mode 100644
index 0000000000000000000000000000000000000000..ad7a5535464118feb44173313c65ed37e598981c
--- /dev/null
+++ b/src/plugins/help/openpageswidget.h
@@ -0,0 +1,83 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef OPENPAGESWIDGET_H
+#define OPENPAGESWIDGET_H
+
+#include <QtGui/QStyledItemDelegate>
+#include <QtGui/QTreeView>
+
+namespace Help {
+    namespace Internal {
+
+class OpenPagesModel;
+
+class OpenPagesDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+
+public:
+    explicit OpenPagesDelegate(QObject *parent = 0);
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option,
+        const QModelIndex &index) const;
+
+    mutable QModelIndex pressedIndex;
+};
+
+class OpenPagesWidget : public QTreeView
+{
+    Q_OBJECT
+
+public:
+    OpenPagesWidget(OpenPagesModel *model);
+    ~OpenPagesWidget();
+
+signals:
+    void setCurrentPage(const QModelIndex &index);
+
+    void closePage(const QModelIndex &index);
+    void closePagesExcept(const QModelIndex &index);
+
+private slots:
+    void contextMenuRequested(QPoint pos);
+    void handlePressed(const QModelIndex &index);
+    void handleClicked(const QModelIndex &index);
+
+private:
+    bool eventFilter(QObject *obj, QEvent *event);
+
+private:
+    OpenPagesDelegate *m_delegate;
+};
+
+    } // namespace Internal
+} // namespace Help
+
+#endif // OPENPAGESWIDGET_H