diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp
index 31e68bd70dbb82c17a2cd3aeeded805e6883b0cc..ea1bfd818e34487aed46f7341dcd317bf1d8c9e3 100644
--- a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp
+++ b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp
@@ -245,6 +245,7 @@ void ActionContainerPrivate::addAction(Command *command, const QString &groupId)
     m_groups[groupIt-m_groups.constBegin()].items.append(command);
 
     connect(command, SIGNAL(activeStateChanged()), this, SLOT(scheduleUpdate()));
+    connect(command, SIGNAL(destroyed()), this, SLOT(itemDestroyed()));
     insertAction(beforeAction, command->action());
     scheduleUpdate();
 }
@@ -271,6 +272,17 @@ void ActionContainerPrivate::addMenu(ActionContainer *menu, const QString &group
     scheduleUpdate();
 }
 
+void ActionContainerPrivate::itemDestroyed()
+{
+    QObject *obj = sender();
+    QMutableListIterator<Group> it(m_groups);
+    while (it.hasNext()) {
+        Group &group = it.next();
+        if (group.items.removeAll(obj) > 0)
+            break;
+    }
+}
+
 int ActionContainerPrivate::id() const
 {
     return m_id;
diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h
index 8d313dc98eebb749e3fbdd5984a34938b931e696..6aff0a8d08df2bba11e0c7861f4a31c920600e07 100644
--- a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h
+++ b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h
@@ -85,6 +85,7 @@ protected:
 private slots:
     void scheduleUpdate();
     void update();
+    void itemDestroyed();
 
 private:
     QList<Group>::const_iterator findGroup(const QString &groupId) const;
diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp
index e28f44abbf3c87cdacda5c97e146304d661e5bcf..0d7921ac4fd54c28bea8622ac5d6c0f89d4869a5 100644
--- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp
+++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp
@@ -247,8 +247,9 @@ ActionManagerPrivate::ActionManagerPrivate(MainWindow *mainWnd)
 
 ActionManagerPrivate::~ActionManagerPrivate()
 {
-    qDeleteAll(m_idCmdMap.values());
+    // first delete containers to avoid them reacting to command deletion
     qDeleteAll(m_idContainerMap.values());
+    qDeleteAll(m_idCmdMap.values());
 }
 
 ActionManagerPrivate *ActionManagerPrivate::instance()
@@ -382,6 +383,7 @@ void ActionManagerPrivate::unregisterAction(QAction *action, const Id &id)
     a->removeOverrideAction(action);
     if (a->isEmpty()) {
         // clean up
+        // ActionContainers listen to the commands' destroyed signals
         m_mainWnd->removeAction(a->action());
         delete a->action();
         m_idCmdMap.remove(uid);