diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp
index ddc77365e5b77da92543cb1e70e8884b2e7419db..f7b41b6774604647ea55ccd3f1a2bff547981ed2 100644
--- a/src/libs/extensionsystem/pluginmanager.cpp
+++ b/src/libs/extensionsystem/pluginmanager.cpp
@@ -585,6 +585,17 @@ void PluginManager::profilingReport(const char *what, const PluginSpec *spec)
     d->profilingReport(what, spec);
 }
 
+
+/*!
+    \fn void PluginManager::loadQueue()
+
+    Returns a list of plugins in load order.
+*/
+QList<PluginSpec *> PluginManager::loadQueue()
+{
+    return d->loadQueue();
+}
+
 //============PluginManagerPrivate===========
 
 /*!
@@ -786,13 +797,10 @@ bool PluginManagerPrivate::loadQueue(PluginSpec *spec, QList<PluginSpec *> &queu
     circularityCheckQueue.append(spec);
     // check if we have the dependencies
     if (spec->state() == PluginSpec::Invalid || spec->state() == PluginSpec::Read) {
-        if (!spec->isDisabledIndirectly() && spec->isEnabled()) {
-            spec->d->hasError = true;
-            spec->d->errorString += "\n";
-            spec->d->errorString += PluginManager::tr("Cannot load plugin because dependencies are not resolved");
-        }
+        queue.append(spec);
         return false;
     }
+
     // add dependencies
     foreach (PluginSpec *depSpec, spec->dependencySpecs()) {
         if (!loadQueue(depSpec, queue, circularityCheckQueue)) {
@@ -814,7 +822,11 @@ bool PluginManagerPrivate::loadQueue(PluginSpec *spec, QList<PluginSpec *> &queu
 */
 void PluginManagerPrivate::loadPlugin(PluginSpec *spec, PluginSpec::State destState)
 {
-    if (spec->hasError() || spec->isDisabledIndirectly())
+    if (spec->hasError() || spec->state() != destState-1)
+        return;
+
+    // don't load disabled plugins.
+    if ((spec->isDisabledIndirectly() || !spec->isEnabled()) && destState == PluginSpec::Loaded)
         return;
 
     switch (destState) {
@@ -927,6 +939,9 @@ void PluginManagerPrivate::resolveDependencies()
     foreach (PluginSpec *spec, pluginSpecs) {
         spec->d->resolveDependencies(pluginSpecs);
     }
+    foreach (PluginSpec *spec, loadQueue()) {
+        spec->d->disableIndirectlyIfDependencyDisabled();
+    }
 }
 
  // Look in argument descriptions of the specs for the option.
diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h
index 037308945e5801e2959df593a545405cb06bfe52..67b2e894093a75f08346ae0b97d6ed9df2ee3521 100644
--- a/src/libs/extensionsystem/pluginmanager.h
+++ b/src/libs/extensionsystem/pluginmanager.h
@@ -91,6 +91,7 @@ public:
     }
 
     // Plugin operations
+    QList<PluginSpec *> loadQueue();
     void loadPlugins();
     QStringList pluginPaths() const;
     void setPluginPaths(const QStringList &paths);
diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp
index 7af800d44466b09570e7a1171e230d40c39d73de..4bc231c4f3f5cfc899da6dc6884a599d06c8ed6d 100644
--- a/src/libs/extensionsystem/pluginspec.cpp
+++ b/src/libs/extensionsystem/pluginspec.cpp
@@ -500,6 +500,11 @@ void PluginSpec::setEnabled(bool value)
     d->enabled = value;
 }
 
+void PluginSpec::setDisabledIndirectly(bool value)
+{
+    d->disabledIndirectly = value;
+}
+
 /*!
     \fn bool PluginSpecPrivate::reportError(const QString &err)
     \internal
@@ -799,11 +804,7 @@ bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
         foreach (PluginSpec *spec, specs) {
             if (spec->provides(dependency.name, dependency.version)) {
                 found = spec;
-                if (!spec->isEnabled() || spec->isDisabledIndirectly())
-                    disabledIndirectly = true;
-
                 spec->d->addProvidesForPlugin(q);
-
                 break;
             }
         }
@@ -822,12 +823,26 @@ bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
 
     dependencySpecs = resolvedDependencies;
 
-    if (enabled && !disabledIndirectly)
-        state = PluginSpec::Resolved;
+    state = PluginSpec::Resolved;
 
     return true;
 }
 
+void PluginSpecPrivate::disableIndirectlyIfDependencyDisabled()
+{
+    disabledIndirectly = false;
+
+    if (!enabled)
+        return;
+
+    foreach (PluginSpec *dependencySpec, dependencySpecs) {
+        if (dependencySpec->isDisabledIndirectly() || !dependencySpec->isEnabled()) {
+            disabledIndirectly = true;
+            break;
+        }
+    }
+}
+
 /*!
     \fn bool PluginSpecPrivate::loadLibrary()
     \internal
diff --git a/src/libs/extensionsystem/pluginspec.h b/src/libs/extensionsystem/pluginspec.h
index e79d94edaa5ab949cd147d02801b21dfd65c032f..b253d256b698c4879637b3b550af2323e7fa7dab 100644
--- a/src/libs/extensionsystem/pluginspec.h
+++ b/src/libs/extensionsystem/pluginspec.h
@@ -92,6 +92,7 @@ public:
     QString filePath() const;
 
     void setEnabled(bool value);
+    void setDisabledIndirectly(bool value);
 
     QStringList arguments() const;
     void setArguments(const QStringList &arguments);
diff --git a/src/libs/extensionsystem/pluginspec_p.h b/src/libs/extensionsystem/pluginspec_p.h
index f35770ff6a02e51cd42e3bbbb9d9d89264cc7f3b..e8c8c9443aa4c2e55160ff5d77c03c666259dfce 100644
--- a/src/libs/extensionsystem/pluginspec_p.h
+++ b/src/libs/extensionsystem/pluginspec_p.h
@@ -92,6 +92,8 @@ public:
     // add/remove from providesSpecs
     void addProvidesForPlugin(PluginSpec *dependent);
     void removeProvidesForPlugin(PluginSpec *dependent);
+    void disableIndirectlyIfDependencyDisabled();
+
 
 private:
     PluginSpec *q;
diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp
index 553f2a14df22592d3a06d056d644371a92f341a9..f60b2c32defcab32a7cac038f5da23045b0d59b7 100644
--- a/src/libs/extensionsystem/pluginview.cpp
+++ b/src/libs/extensionsystem/pluginview.cpp
@@ -177,8 +177,7 @@ void PluginView::updateList()
     defaultCollectionItem->setToolTip(C_LOAD, tr("Load on Startup"));
     defaultCollectionItem->setData(0, Qt::UserRole, qVariantFromValue(defaultCollection));
 
-    foreach (PluginSpec *spec, m_specToItem.keys())
-        toggleRelatedPlugins(spec, spec->isEnabled() && !spec->isDisabledIndirectly());
+    updatePluginDependencies();
 
     m_ui->categoryWidget->clear();
     if (!m_items.isEmpty()) {
@@ -301,7 +300,7 @@ void PluginView::updatePluginSettings(QTreeWidgetItem *item, int column)
         if (column == C_LOAD) {
 
             spec->setEnabled(loadOnStartup);
-            toggleRelatedPlugins(spec, loadOnStartup);
+            updatePluginDependencies();
 
             if (item->parent()) {
                 PluginCollection *collection = item->parent()->data(0, Qt::UserRole).value<PluginCollection *>();
@@ -332,33 +331,36 @@ void PluginView::updatePluginSettings(QTreeWidgetItem *item, int column)
                 spec->setEnabled(loadOnStartup);
                 Qt::CheckState state = (loadOnStartup ? Qt::Checked : Qt::Unchecked);
                 child->setData(C_LOAD, Qt::CheckStateRole, state);
-                toggleRelatedPlugins(spec, loadOnStartup);
             } else {
                 child->setData(C_LOAD, Qt::CheckStateRole, Qt::Checked);
                 child->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
             }
         }
+        updatePluginDependencies();
         emit pluginSettingsChanged(collection->plugins().first());
     }
 
     m_allowCheckStateUpdate = true;
 }
 
-void PluginView::toggleRelatedPlugins(PluginSpec *modifiedPlugin, bool isPluginEnabled)
+void PluginView::updatePluginDependencies()
 {
-
-    for(int i = 0; i < modifiedPlugin->providesForSpecs().length(); ++i) {
-        PluginSpec *spec = modifiedPlugin->providesForSpecs().at(i);
+    foreach (PluginSpec *spec, PluginManager::instance()->loadQueue()) {
+        bool disableIndirectly = false;
+        foreach(const PluginSpec *depSpec, spec->dependencySpecs()) {
+            if (!depSpec->isEnabled() || depSpec->isDisabledIndirectly()) {
+                disableIndirectly = true;
+                break;
+            }
+        }
         QTreeWidgetItem *childItem = m_specToItem.value(spec);
+        childItem->setDisabled(disableIndirectly);
 
-        if (childItem->isDisabled() != !isPluginEnabled) {
-            childItem->setDisabled(!isPluginEnabled);
-            if (childItem->parent() && !childItem->parent()->isExpanded())
-                childItem->parent()->setExpanded(true);
-
+        if (disableIndirectly == spec->isDisabledIndirectly())
+            continue;
+        spec->setDisabledIndirectly(disableIndirectly);
 
-            toggleRelatedPlugins(spec, isPluginEnabled);
-        }
+        if (childItem->parent() && !childItem->parent()->isExpanded())
+            childItem->parent()->setExpanded(true);
     }
 }
-
diff --git a/src/libs/extensionsystem/pluginview.h b/src/libs/extensionsystem/pluginview.h
index d9c8b470502c31ac11dc11f6e9e8e1b15a131a76..b1668b2304cb541d488a8d8b0fd4cd4d99c86fb8 100644
--- a/src/libs/extensionsystem/pluginview.h
+++ b/src/libs/extensionsystem/pluginview.h
@@ -77,7 +77,7 @@ private slots:
 private:
     enum ParsedState { ParsedNone = 1, ParsedPartial = 2, ParsedAll = 4, ParsedWithErrors = 8};
     QIcon iconForState(int state);
-    void toggleRelatedPlugins(PluginSpec *spec, bool isPluginEnabled = true);
+    void updatePluginDependencies();
     int parsePluginSpecs(QTreeWidgetItem *parentItem, Qt::CheckState &groupState, QList<PluginSpec*> plugins);
 
     Internal::Ui::PluginView *m_ui;