diff --git a/src/shared/help/topicchooser.cpp b/src/shared/help/topicchooser.cpp
index d311264cdfcc396e771bad31c34a2cec520edc0b..bc057d45387cc29c326ee9d8ad5b69208af62593 100644
--- a/src/shared/help/topicchooser.cpp
+++ b/src/shared/help/topicchooser.cpp
@@ -32,6 +32,7 @@
 #include <QtCore/QMap>
 #include <QtCore/QUrl>
 
+#include <QtGui/QKeyEvent>
 #include <QtGui/QStandardItemModel>
 #include <QtGui/QSortFilterProxyModel>
 
@@ -41,6 +42,10 @@ TopicChooser::TopicChooser(QWidget *parent, const QString &keyword,
     , m_filterModel(new QSortFilterProxyModel(this))
 {
     ui.setupUi(this);
+
+    setFocusProxy(ui.lineEdit);
+    ui.lineEdit->installEventFilter(this);
+    ui.lineEdit->setPlaceholderText(tr("Filter"));
     ui.label->setText(tr("Choose a topic for <b>%1</b>:").arg(keyword));
 
     QStandardItemModel *model = new QStandardItemModel(this);
@@ -59,14 +64,13 @@ TopicChooser::TopicChooser(QWidget *parent, const QString &keyword,
 
     if (m_filterModel->rowCount() != 0)
         ui.listWidget->setCurrentIndex(m_filterModel->index(0, 0));
-    ui.listWidget->setFocus();
 
-    connect(ui.buttonDisplay, SIGNAL(clicked()), this, SLOT(accept()));
+    connect(ui.buttonDisplay, SIGNAL(clicked()), this, SLOT(acceptDialog()));
     connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
     connect(ui.listWidget, SIGNAL(activated(QModelIndex)), this,
         SLOT(activated(QModelIndex)));
-    connect(ui.lineEdit, SIGNAL(filterChanged(QString)), m_filterModel,
-        SLOT(setFilterFixedString(QString)));
+    connect(ui.lineEdit, SIGNAL(filterChanged(QString)), this,
+        SLOT(setFilter(QString)));
 }
 
 QUrl TopicChooser::link() const
@@ -76,8 +80,50 @@ QUrl TopicChooser::link() const
     return QUrl();
 }
 
+void TopicChooser::acceptDialog()
+{
+    m_activedIndex = ui.listWidget->currentIndex();
+    accept();
+}
+
+void TopicChooser::setFilter(const QString &pattern)
+{
+    m_filterModel->setFilterFixedString(pattern);
+    if (m_filterModel->rowCount() != 0 && !ui.listWidget->currentIndex().isValid())
+        ui.listWidget->setCurrentIndex(m_filterModel->index(0, 0));
+}
+
 void TopicChooser::activated(const QModelIndex &index)
 {
     m_activedIndex = index;
     accept();
 }
+
+bool TopicChooser::eventFilter(QObject *object, QEvent *event)
+{
+    if (object == ui.lineEdit && event->type() == QEvent::KeyPress) {
+        QModelIndex idx = ui.listWidget->currentIndex();
+        switch ((static_cast<QKeyEvent*>(event)->key())) {
+            case Qt::Key_Up:
+                idx = m_filterModel->index(idx.row() - 1, idx.column(),
+                    idx.parent());
+                if (idx.isValid())
+                    ui.listWidget->setCurrentIndex(idx);
+                break;
+
+            case Qt::Key_Down:
+                idx = m_filterModel->index(idx.row() + 1, idx.column(),
+                    idx.parent());
+                if (idx.isValid())
+                    ui.listWidget->setCurrentIndex(idx);
+                break;
+
+            default: ;
+        }
+    } else if (ui.lineEdit && event->type() == QEvent::FocusIn
+        && static_cast<QFocusEvent *>(event)->reason() != Qt::MouseFocusReason) {
+        ui.lineEdit->selectAll();
+        ui.lineEdit->setFocus();
+    }
+    return QDialog::eventFilter(object, event);
+}
diff --git a/src/shared/help/topicchooser.h b/src/shared/help/topicchooser.h
index 666aae1917cc27aa88dd73f51c309f69b8cbe42c..f4ff17f842bf670ee58d59e9479eddee4d1e3407 100644
--- a/src/shared/help/topicchooser.h
+++ b/src/shared/help/topicchooser.h
@@ -52,8 +52,13 @@ public:
     QUrl link() const;
 
 private slots:
+    void acceptDialog();
+    void setFilter(const QString &pattern);
     void activated(const QModelIndex &index);
 
+private:
+    bool eventFilter(QObject *object, QEvent *event);
+
 private:
     Ui::TopicChooser ui;
     QList<QUrl> m_links;