diff --git a/src/libs/utils/savedaction.cpp b/src/libs/utils/savedaction.cpp
index 9ab89dd81a6c2d65f73473e344945279525f372d..ebad52d24f8f3c6a97646ee96a4ebe4c8d513d11 100644
--- a/src/libs/utils/savedaction.cpp
+++ b/src/libs/utils/savedaction.cpp
@@ -313,7 +313,7 @@ void SavedAction::connectWidget(QWidget *widget, ApplyMode applyMode)
             this, SLOT(pathChooserEditingFinished()));
         connect(pathChooser, SIGNAL(browsingFinished()),
             this, SLOT(pathChooserEditingFinished()));
-    } else if (QGroupBox *groupBox= qobject_cast<QGroupBox *>(widget)) {
+    } else if (QGroupBox *groupBox = qobject_cast<QGroupBox *>(widget)) {
         if (!groupBox->isCheckable())
             qDebug() << "connectWidget to non-checkable group box" << widget << toString();
         groupBox->setChecked(m_value.toBool());
@@ -343,7 +343,7 @@ void SavedAction::apply(QSettings *s)
         setValue(spinBox->value());
     else if (PathChooser *pathChooser = qobject_cast<PathChooser *>(m_widget))
         setValue(pathChooser->path());
-    else if (const QGroupBox *groupBox= qobject_cast<QGroupBox *>(m_widget))
+    else if (const QGroupBox *groupBox = qobject_cast<QGroupBox *>(m_widget))
         setValue(groupBox->isChecked());
     if (s)
        writeSettings(s);
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 8ab999f68dfdfbce6386063e635350f05e2e5a62..cfcab86f66aadb744953311cd0530e8de965fa2a 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -513,6 +513,7 @@ void DebuggerManager::init()
     d->m_actions.reverseDirectionAction = new QAction(tr("Reverse Direction"), this);
     d->m_actions.reverseDirectionAction->setCheckable(true);
     d->m_actions.reverseDirectionAction->setChecked(false);
+    d->m_actions.reverseDirectionAction->setIcon(QIcon(":/debugger/images/location_16.png"));
 
     connect(d->m_actions.continueAction, SIGNAL(triggered()),
         this, SLOT(executeContinue()));
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index ce648eb6b80033e9b6e59f5f440d1687deb044bd..74d99f48c7bd37e4eed40e1c58204f781739e8b0 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -223,7 +223,8 @@ DebugMode::~DebugMode()
 //
 ///////////////////////////////////////////////////////////////////////
 
-class DebuggerListener : public Core::ICoreListener {
+class DebuggerListener : public Core::ICoreListener
+{
     Q_OBJECT
 public:
     explicit DebuggerListener(QObject *parent = 0);
@@ -377,10 +378,6 @@ QWidget *CommonOptionsPage::createPage(QWidget *parent)
     m_group.insert(theDebuggerAction(BreakOnThrow), 0);
     m_group.insert(theDebuggerAction(BreakOnCatch), 0);
 
-#ifdef USE_REVERSE_DEBUGGING
-    m_ui.checkBoxEnableReverseDebugging->hide();
-#endif
-
     if (m_searchKeywords.isEmpty()) {
         QTextStream(&m_searchKeywords) << ' ' << m_ui.checkBoxListSourceFiles->text()
                 << ' ' << m_ui.checkBoxUseMessageBoxForSignals->text()
@@ -706,7 +703,7 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
     const QList<Core::IOptionsPage *> engineOptionPages =
         manager->initializeEngines(m_cmdLineEnabledEngines);
 
-    // register factory of DebuggerRunControl
+    // Register factory of DebuggerRunControl.
     m_debuggerRunControlFactory = new DebuggerRunControlFactory(manager);
     addAutoReleasedObject(m_debuggerRunControlFactory);
 
@@ -716,10 +713,9 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
     context.append(uidm->uniqueIdentifier(Core::Constants::C_NAVIGATION_PANE));
     m_debugMode->setContext(context);
 
-    //Core::ActionContainer *mcppcontext =
-    //    am->actionContainer(CppEditor::Constants::M_CONTEXT);
+    m_reverseToolButton = 0;
 
-    // External apps
+    // Handling of external applications.
     m_startExternalAction = new QAction(this);
     m_startExternalAction->setText(tr("Start and Debug External Application..."));
     connect(m_startExternalAction, SIGNAL(triggered()),
@@ -744,13 +740,9 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
     connect(m_detachAction, SIGNAL(triggered()),
         manager, SLOT(detachDebugger()));
 
-   // Core::ActionContainer *mdebug =
-    //    am->actionContainer(ProjectExplorer::Constants::M_DEBUG);
-
     Core::Command *cmd = 0;
     const DebuggerManagerActions actions = manager->debuggerManagerActions();
 
-
     Core::ActionContainer *mstart =
         am->actionContainer(ProjectExplorer::Constants::M_DEBUG_STARTDEBUGGING);
 
@@ -831,12 +823,10 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
         Constants::RETURN_FROM_FUNCTION, debuggercontext);
     m_uiSwitcher->addMenuAction(cmd);
 
-#ifdef USE_REVERSE_DEBUGGING
     cmd = am->registerAction(actions.reverseDirectionAction,
         Constants::REVERSE, debuggercontext);
     cmd->setDefaultKeySequence(QKeySequence(Constants::REVERSE_KEY));
     m_uiSwitcher->addMenuAction(cmd);
-#endif
 
     sep = new QAction(this);
     sep->setSeparator(true);
@@ -944,16 +934,7 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
 
     handleStateChanged(DebuggerNotReady);
 
-    m_uiSwitcher->setToolbar(LANG_CPP, createToolbar());
-    connect(m_uiSwitcher, SIGNAL(dockArranged(QString)), manager,
-            SLOT(setSimpleDockWidgetArrangement(QString)));
-
-    return true;
-}
-
-QWidget *DebuggerPlugin::createToolbar() const
-{
-    Core::ActionManager *am = ICore::instance()->actionManager();
+    // Toolbar
     QWidget *toolbarContainer = new QWidget;
 
     QHBoxLayout *hbox = new QHBoxLayout(toolbarContainer);
@@ -965,10 +946,12 @@ QWidget *DebuggerPlugin::createToolbar() const
     hbox->addWidget(toolButton(am->command(Constants::STEP)->action()));
     hbox->addWidget(toolButton(am->command(Constants::STEPOUT)->action()));
     hbox->addWidget(toolButton(am->command(Constants::OPERATE_BY_INSTRUCTION)->action()));
-#ifdef USE_REVERSE_DEBUGGING
-    hbox->addWidget(new Utils::StyledSeparator);
-    hbox->addWidget(toolButton(am->command(Constants::REVERSE)->action()));
-#endif
+
+    //hbox->addWidget(new Utils::StyledSeparator);
+    m_reverseToolButton = toolButton(am->command(Constants::REVERSE)->action());
+    hbox->addWidget(m_reverseToolButton);
+    //m_reverseToolButton->hide();
+
     hbox->addWidget(new Utils::StyledSeparator);
     hbox->addWidget(new QLabel(tr("Threads:")));
 
@@ -980,7 +963,15 @@ QWidget *DebuggerPlugin::createToolbar() const
     hbox->addWidget(threadBox);
     hbox->addWidget(m_manager->statusLabel(), 10);
 
-    return toolbarContainer;
+
+    m_uiSwitcher->setToolbar(LANG_CPP, toolbarContainer);
+    connect(m_uiSwitcher, SIGNAL(dockArranged(QString)), manager,
+            SLOT(setSimpleDockWidgetArrangement(QString)));
+
+    connect(theDebuggerAction(EnableReverseDebugging), SIGNAL(valueChanged(QVariant)),
+        this, SLOT(enableReverseDebuggingTriggered(QVariant)));
+
+    return true;
 }
 
 void DebuggerPlugin::extensionsInitialized()
@@ -1377,6 +1368,14 @@ void DebuggerPlugin::startRemoteApplication()
             ->startRunControl(runControl, ProjectExplorer::Constants::DEBUGMODE);
 }
 
+void DebuggerPlugin::enableReverseDebuggingTriggered(const QVariant &value)
+{
+    QTC_ASSERT(m_reverseToolButton, return);
+    m_reverseToolButton->setVisible(value.toBool());
+    if (!value.toBool())
+        m_manager->debuggerManagerActions().reverseDirectionAction->setChecked(false);
+}
+
 #include "debuggerplugin.moc"
 
 Q_EXPORT_PLUGIN(DebuggerPlugin)
diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h
index 78122988be3600ca40e8437596aa0c8f03025706..348dff8a793107ea9542f915b31772f8c69b2208 100644
--- a/src/plugins/debugger/debuggerplugin.h
+++ b/src/plugins/debugger/debuggerplugin.h
@@ -37,10 +37,11 @@
 
 QT_BEGIN_NAMESPACE
 class QAction;
+class QComboBox;
 class QCursor;
 class QMenu;
 class QPoint;
-class QComboBox;
+class QToolButton;
 QT_END_NAMESPACE
 
 namespace Core {
@@ -119,17 +120,19 @@ private slots:
     void attachCore();
     void attachCmdLine();
 
+    void enableReverseDebuggingTriggered(const QVariant &value);
+
 private:
     void readSettings();
     void writeSettings() const;
     void attachExternalApplication(qint64 pid, const QString &crashParameter = QString());
     void attachCore(const QString &core, const QString &exeFileName);
-    QWidget *createToolbar() const;
 
     friend class Debugger::DebuggerManager;
     friend class GdbOptionPage;
     friend class DebuggingHelperOptionPage;
-    friend class Debugger::Internal::DebugMode; // FIXME: Just a hack now so that it can access the views
+    // FIXME: Just a hack now so that it can access the views.
+    friend class Debugger::Internal::DebugMode;
 
     DebuggerUISwitcher *m_uiSwitcher;
     DebuggerManager *m_manager;
@@ -148,6 +151,7 @@ private:
     QAction *m_attachCoreAction;
     QAction *m_detachAction;
     QComboBox *m_langBox;
+    QToolButton *m_reverseToolButton;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 882a6ea3803007126ca290fafc1e40dd86467fd7..60088b3ef2c17c867965f25108a0233b8e7d285f 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -217,7 +217,7 @@ QMainWindow *GdbEngine::mainWindow() const
 
 GdbEngine::~GdbEngine()
 {
-    // prevent sending error messages afterwards
+    // Prevent sending error messages afterwards.
     disconnect(&m_gdbProc, 0, this, 0);
     delete m_gdbAdapter;
     m_gdbAdapter = 0;
@@ -229,13 +229,10 @@ void GdbEngine::connectAdapter()
         this, SLOT(handleAdapterStarted()));
     connect(m_gdbAdapter, SIGNAL(adapterStartFailed(QString,QString)),
         this, SLOT(handleAdapterStartFailed(QString,QString)));
-
     connect(m_gdbAdapter, SIGNAL(inferiorPrepared()),
         this, SLOT(handleInferiorPrepared()));
-
     connect(m_gdbAdapter, SIGNAL(inferiorStartFailed(QString)),
         this, SLOT(handleInferiorStartFailed(QString)));
-
     connect(m_gdbAdapter, SIGNAL(adapterCrashed(QString)),
         this, SLOT(handleAdapterCrashed(QString)));
 }
@@ -1257,7 +1254,7 @@ void GdbEngine::handleStopResponse(const GdbMi &data)
     //    return;
     // }
 
-    // jump over well-known frames
+    // Jump over well-known frames.
     static int stepCounter = 0;
     if (theDebuggerBoolSetting(SkipKnownFrames)) {
         if (reason == "end-stepping-range" || reason == "function-finished") {
@@ -1537,7 +1534,7 @@ void GdbEngine::handleExecuteContinue(const GdbResponse &response)
             //executeStepOut();
         } else {
             showMessageBox(QMessageBox::Critical, tr("Execution Error"),
-                           tr("Cannot continue debugged process:\n") + QString::fromLocal8Bit(msg));
+               tr("Cannot continue debugged process:\n") + QString::fromLocal8Bit(msg));
             shutdown();
         }
     }
@@ -1781,7 +1778,7 @@ void GdbEngine::executeStep()
     if (m_gdbAdapter->isTrkAdapter() && stackHandler->stackSize() > 0)
         postCommand("sal step," + stackHandler->topAddress().toLatin1());
     if (manager()->isReverseDebugging())
-        postCommand("-reverse-step", RunRequest, CB(handleExecuteStep));
+        postCommand("reverse-step", RunRequest, CB(handleExecuteStep));
     else
         postCommand("-exec-step", RunRequest, CB(handleExecuteStep));
 }
@@ -1789,7 +1786,7 @@ void GdbEngine::executeStep()
 void GdbEngine::handleExecuteStep(const GdbResponse &response)
 {
     if (response.resultClass == GdbResultRunning) {
-        // The "running" state is picked up in handleResponse()
+        // The "running" state is picked up in handleResponse().
         QTC_ASSERT(state() == InferiorRunning, /**/);
     } else {
         if (state() == InferiorRunningRequested_Kill) {
@@ -1806,7 +1803,8 @@ void GdbEngine::handleExecuteStep(const GdbResponse &response)
             executeStepI(); // Fall back to instruction-wise stepping.
         } else {
             showMessageBox(QMessageBox::Critical, tr("Execution Error"),
-                tr("Cannot continue debugged process:\n") + QString::fromLocal8Bit(msg));
+                tr("Cannot continue debugged process:\n")
+                    + QString::fromLocal8Bit(msg));
             shutdown();
         }
     }
@@ -1819,7 +1817,7 @@ void GdbEngine::executeStepI()
     setState(InferiorRunningRequested);
     showStatusMessage(tr("Step by instruction requested..."), 5000);
     if (manager()->isReverseDebugging())
-        postCommand("-reverse-stepi", RunRequest, CB(handleExecuteContinue));
+        postCommand("reverse-stepi", RunRequest, CB(handleExecuteContinue));
     else
         postCommand("-exec-step-instruction", RunRequest, CB(handleExecuteContinue));
 }
@@ -1843,7 +1841,7 @@ void GdbEngine::executeNext()
     if (m_gdbAdapter->isTrkAdapter() && stackHandler->stackSize() > 0)
         postCommand("sal next," + stackHandler->topAddress().toLatin1());
     if (manager()->isReverseDebugging())
-        postCommand("-reverse-next", RunRequest, CB(handleExecuteNext));
+        postCommand("reverse-next", RunRequest, CB(handleExecuteNext));
     else
         postCommand("-exec-next", RunRequest, CB(handleExecuteNext));
 }
@@ -1868,7 +1866,7 @@ void GdbEngine::handleExecuteNext(const GdbResponse &response)
             executeNextI(); // Fall back to instruction-wise stepping.
         } else {
             showMessageBox(QMessageBox::Critical, tr("Execution Error"),
-                tr("Cannot continue debugged process:\n") + QString::fromLocal8Bit(msg));
+               tr("Cannot continue debugged process:\n") + QString::fromLocal8Bit(msg));
             shutdown();
         }
     }
@@ -1881,7 +1879,7 @@ void GdbEngine::executeNextI()
     setState(InferiorRunningRequested);
     showStatusMessage(tr("Step next instruction requested..."), 5000);
     if (manager()->isReverseDebugging())
-        postCommand("-reverse-nexti", RunRequest, CB(handleExecuteContinue));
+        postCommand("reverse-nexti", RunRequest, CB(handleExecuteContinue));
     else
         postCommand("-exec-next-instruction", RunRequest, CB(handleExecuteContinue));
 }
@@ -3854,26 +3852,29 @@ void GdbEngine::handleFetchDisassemblerByCli(const GdbResponse &response)
         // "Dump of assembler code from 0xb7ff598f to 0xb7ff5a07:"
         GdbMi output = response.data.findChild("consolestreamoutput");
         QStringList res;
-        QString out = QString::fromLatin1(output.data()).trimmed();
-        foreach (const QString &line, out.split(_c('\n'))) {
-            if (line.startsWith(_("Current language:")))
+        foreach (QByteArray line, output.data().split('\n')) {
+            line = line.trimmed();
+            if (line.startsWith("=> "))
+                line = line.mid(3);
+            if (line.startsWith("Current language:"))
                 continue;
-            if (line.startsWith(_("The current source")))
+            if (line.startsWith("The current source"))
                 continue;
-            if (line.startsWith(_("0x"))) {
-                int pos1 = line.indexOf(_c('<'));
-                int pos2 = line.indexOf(_c('+'), pos1);
-                int pos3 = line.indexOf(_c('>'), pos2);
+            if (line.startsWith("0x")) {
+                int pos1 = line.indexOf('<');
+                int pos2 = line.indexOf('+', pos1);
+                int pos3 = line.indexOf('>', pos2);
                 if (pos3 >= 0) {
-                    QString ba = _("  <+") + line.mid(pos2 + 1, pos3 - pos2 - 1);
-                    res.append(line.left(pos1 - 1) + ba.rightJustified(4)
-                        + _(">:            ") + line.mid(pos3 + 2));
+                    QByteArray ba = "  <+" + line.mid(pos2 + 1, pos3 - pos2 - 1);
+                    ba = line.left(pos1 - 1) + ba.rightJustified(4)
+                        + ">:            " + line.mid(pos3 + 2);
+                    res.append(_(ba));
                 } else {
-                    res.append(line);
+                    res.append(_(line));
                 }
                 continue;
             }
-            res.append(someSpace + line);
+            res.append(someSpace + _(line));
         }
         // Drop "End of assembler dump." line.
         res.takeLast();
diff --git a/src/plugins/debugger/gdb/plaingdbadapter.cpp b/src/plugins/debugger/gdb/plaingdbadapter.cpp
index adf3cc93ea1a7a18820083300274db5b02b80c5d..fb0ce258883bd0e79e52ed508bb7a8185eb39905 100644
--- a/src/plugins/debugger/gdb/plaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/plaingdbadapter.cpp
@@ -32,6 +32,7 @@
 #include "gdbengine.h"
 #include "procinterrupt.h"
 #include "debuggerstringutils.h"
+#include "debuggeractions.h"
 
 #include <utils/qtcassert.h>
 
@@ -163,9 +164,12 @@ void PlainGdbAdapter::handleExecRun(const GdbResponse &response)
         QTC_ASSERT(state() == InferiorRunning, qDebug() << state());
         debugMessage(_("INFERIOR STARTED"));
         showStatusMessage(msgInferiorStarted());
+        // FIXME: That's the wrong place for it.
+        if (theDebuggerBoolSetting(EnableReverseDebugging))
+            m_engine->postCommand("target record");
     } else {
         QTC_ASSERT(state() == InferiorRunningRequested, qDebug() << state());
-        const QString &msg = QString::fromLocal8Bit(response.data.findChild("msg").data());
+        QString msg = QString::fromLocal8Bit(response.data.findChild("msg").data());
         //QTC_ASSERT(status() == InferiorRunning, /**/);
         //interruptInferior();
         emit inferiorStartFailed(msg);