diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h
index 545b346a2fbf4a0d1948a6180711bc66ce0bb659..e0040eb09c0dfbc9d23a9c5dd5372ced8a97f430 100644
--- a/src/plugins/debugger/debuggeractions.h
+++ b/src/plugins/debugger/debuggeractions.h
@@ -180,6 +180,8 @@ struct DebuggerManagerActions
     QAction *breakAction;
     QAction *sepAction;
     QAction *reverseDirectionAction;
+    QAction *frameUpAction;
+    QAction *frameDownAction;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 76f522580c83f60442f68adc7662e0c5ca708e81..357de3495b67a5ac97fa0e27bab24e000c3fde92 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -569,6 +569,12 @@ void DebuggerManager::init()
     d->m_actions.reverseDirectionAction->setIcon(
         QIcon(":/debugger/images/debugger_reversemode_16.png"));
 
+    d->m_actions.frameDownAction =
+        new QAction(tr("Move to Called Frame"), this);
+    d->m_actions.frameUpAction =
+        new QAction(tr("Move to Calling Frame"), this);
+
+    d->m_actions.reverseDirectionAction->setCheckable(false);
     connect(d->m_actions.continueAction, SIGNAL(triggered()),
         this, SLOT(executeContinue()));
     connect(d->m_actions.stopAction, SIGNAL(triggered()),
@@ -599,6 +605,10 @@ void DebuggerManager::init()
         this, SLOT(addToWatchWindow()));
     connect(d->m_actions.snapshotAction, SIGNAL(triggered()),
         this, SLOT(makeSnapshot()));
+    connect(d->m_actions.frameDownAction, SIGNAL(triggered()),
+        this, SLOT(frameDown()));
+    connect(d->m_actions.frameUpAction, SIGNAL(triggered()),
+        this, SLOT(frameUp()));
 
     connect(d->m_statusTimer, SIGNAL(timeout()),
         this, SLOT(clearStatusMessage()));
@@ -877,6 +887,20 @@ void DebuggerManager::aboutToShutdown()
     d->m_engine = 0;
 }
 
+void DebuggerManager::frameUp()
+{
+    QTC_ASSERT(d->m_engine, return);
+    int currentIndex = stackHandler()->currentIndex();
+    activateFrame(qMin(currentIndex + 1, stackHandler()->stackSize() - 1));
+}
+
+void DebuggerManager::frameDown()
+{
+    QTC_ASSERT(d->m_engine, return);
+    int currentIndex = stackHandler()->currentIndex();
+    activateFrame(qMax(currentIndex - 1, 0));
+}
+
 void DebuggerManager::makeSnapshot()
 {
     QTC_ASSERT(d->m_engine, return);
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 2ce5c17c60e560bde9cfec66ed4e1150fefdcb72..0210b706c53237d050963f69628a7e70bfc5c69a 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -241,6 +241,8 @@ public slots:
     void executeReturn();
     void detachDebugger();
     void makeSnapshot();
+    void frameUp();
+    void frameDown();
 
     void addToWatchWindow();
     void updateWatchData(const Debugger::Internal::WatchData &data);
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 0ef2503bc3ad3de79edbd7a9bac16056932f9727..7a625b45bbaa14e0239a437aeee88603cc2e2695 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -139,6 +139,8 @@ const char * const BREAK_AT_MAIN        = "Debugger.BreakAtMain";
 const char * const ADD_TO_WATCH1        = "Debugger.AddToWatch1";
 const char * const ADD_TO_WATCH2        = "Debugger.AddToWatch2";
 const char * const OPERATE_BY_INSTRUCTION  = "Debugger.OperateByInstruction";
+const char * const FRAME_UP             = "Debugger.FrameUp";
+const char * const FRAME_DOWN           = "Debugger.FrameDown";
 
 #ifdef Q_WS_MAC
 const char * const INTERRUPT_KEY            = "Shift+F5";
@@ -894,6 +896,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
     cmd->setAttribute(Command::CA_Hide);
     m_uiSwitcher->addMenuAction(cmd, Constants::LANG_CPP);
 
+    cmd = am->registerAction(actions.frameDownAction,
+        Constants::FRAME_DOWN, cppDebuggercontext);
+    cmd = am->registerAction(actions.frameUpAction,
+        Constants::FRAME_UP, cppDebuggercontext);
+
 
     cmd = am->registerAction(theDebuggerAction(OperateByInstruction),
         Constants::OPERATE_BY_INSTRUCTION, cppDebuggercontext);