diff --git a/src/app/main.cpp b/src/app/main.cpp
index 3d6cb0298dc419c0ea977eaf1dee7cd3648aeec4..af205c30fbdcf36979c4a9c4f35147d647f674e2 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -296,7 +296,7 @@ int main(int argc, char **argv)
         QStringList errors;
         foreach (ExtensionSystem::PluginSpec *p, pluginManager.plugins())
             // only show errors on startup if plugin is enabled.
-            if (p->hasError() && p->isEnabled() && !p->isDisabledByDependency())
+            if (p->hasError() && p->isEnabled() && !p->isDisabledIndirectly())
                 errors.append(p->name() + "\n" + p->errorString());
         if (!errors.isEmpty())
             QMessageBox::warning(0,
diff --git a/src/libs/extensionsystem/optionsparser.cpp b/src/libs/extensionsystem/optionsparser.cpp
index 538d37068f0f83bed599d3bef4ca88b3f3a98f57..551f926bd0f2f58e1f242f5ae531eea39bef3e5e 100644
--- a/src/libs/extensionsystem/optionsparser.cpp
+++ b/src/libs/extensionsystem/optionsparser.cpp
@@ -128,7 +128,7 @@ bool OptionsParser::checkForNoLoadOption()
                                                              "The plugin '%1' does not exist.").arg(m_currentArg);
             m_hasError = true;
         } else {
-            m_pmPrivate->removePluginSpec(spec);
+            m_pmPrivate->disablePluginIndirectly(spec);
             m_isDependencyRefreshNeeded = true;
         }
     }
diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp
index 93d4de0fd9cf70736782429c0c4a48f7c55fc5f2..0d16929749810d0472eca773d85e0f97c05625f6 100644
--- a/src/libs/extensionsystem/pluginmanager.cpp
+++ b/src/libs/extensionsystem/pluginmanager.cpp
@@ -767,7 +767,7 @@ 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->isDisabledByDependency() && spec->isEnabled()) {
+        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");
@@ -795,7 +795,7 @@ bool PluginManagerPrivate::loadQueue(PluginSpec *spec, QList<PluginSpec *> &queu
 */
 void PluginManagerPrivate::loadPlugin(PluginSpec *spec, PluginSpec::State destState)
 {
-    if (spec->hasError() || spec->isDisabledByDependency())
+    if (spec->hasError() || spec->isDisabledIndirectly())
         return;
 
     switch (destState) {
@@ -934,19 +934,9 @@ PluginSpec *PluginManagerPrivate::pluginForOption(const QString &option, bool *r
     return 0;
 }
 
-void PluginManagerPrivate::removePluginSpec(PluginSpec *spec)
+void PluginManagerPrivate::disablePluginIndirectly(PluginSpec *spec)
 {
-    pluginSpecs.removeAll(spec);
-
-    if (pluginCategories.contains(spec->category()))
-        pluginCategories.value(spec->category())->removePlugin(spec);
-
-    foreach(PluginSpec *dep, spec->dependencySpecs()) {
-        dep->removeDependentPlugin(spec);
-    }
-
-    delete spec;
-    spec = 0;
+    spec->d->disabledIndirectly = true;
 }
 
 PluginSpec *PluginManagerPrivate::pluginByName(const QString &name) const
diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h
index c9b61f5ca0f02a0439b9bec7c2ba44a34ea0f83b..a29ac6b5efa2888561fb8384655a725fd7934e51 100644
--- a/src/libs/extensionsystem/pluginmanager_p.h
+++ b/src/libs/extensionsystem/pluginmanager_p.h
@@ -71,7 +71,7 @@ public:
     void profilingReport(const char *what, const PluginSpec *spec = 0);
     void loadSettings();
     void writeSettings();
-    void removePluginSpec(PluginSpec *spec);
+    void disablePluginIndirectly(PluginSpec *spec);
 
     QHash<QString, PluginCollection *> pluginCategories;
     QList<PluginSpec *> pluginSpecs;
diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp
index e39c6df5c3dd895ae895d64ce4a4a75c9630cf83..7af800d44466b09570e7a1171e230d40c39d73de 100644
--- a/src/libs/extensionsystem/pluginspec.cpp
+++ b/src/libs/extensionsystem/pluginspec.cpp
@@ -254,9 +254,14 @@ bool PluginSpec::isEnabled() const
     return d->enabled;
 }
 
-bool PluginSpec::isDisabledByDependency() const
+/*!
+    \fn bool PluginSpec::isDisabledIndirectly() const
+    Returns true if loading was not done due to user unselecting this plugin or its dependencies,
+    or if command-line parameter -noload was used.
+*/
+bool PluginSpec::isDisabledIndirectly() const
 {
-    return d->disabledByDependency;
+    return d->disabledIndirectly;
 }
 
 /*!
@@ -397,27 +402,11 @@ QList<PluginSpec *> PluginSpec::dependencySpecs() const
 
     \sa PluginSpec::dependencySpecs()
 */
-QList<PluginSpec *> PluginSpec::providesSpecs() const
+QList<PluginSpec *> PluginSpec::providesForSpecs() const
 {
     return d->providesSpecs;
 }
 
-/*!
-    \fn void PluginSpec::addDependentPlugin(PluginSpec *dependent)
-    Adds a dependent the list of plugins that depend on this one.
-
-    \sa PluginSpec::providesSpecs()
-*/
-void PluginSpec::addDependentPlugin(PluginSpec *dependent)
-{
-    d->providesSpecs.append(dependent);
-}
-
-void PluginSpec::removeDependentPlugin(PluginSpec *dependent)
-{
-    d->providesSpecs.removeOne(dependent);
-}
-
 //==========PluginSpecPrivate==================
 
 namespace {
@@ -448,7 +437,7 @@ namespace {
 PluginSpecPrivate::PluginSpecPrivate(PluginSpec *spec)
     :
     enabled(true),
-    disabledByDependency(false),
+    disabledIndirectly(false),
     plugin(0),
     state(PluginSpec::Invalid),
     hasError(false),
@@ -810,10 +799,10 @@ bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
         foreach (PluginSpec *spec, specs) {
             if (spec->provides(dependency.name, dependency.version)) {
                 found = spec;
-                if (!spec->isEnabled() || spec->isDisabledByDependency())
-                    disabledByDependency = true;
+                if (!spec->isEnabled() || spec->isDisabledIndirectly())
+                    disabledIndirectly = true;
 
-                spec->addDependentPlugin(q);
+                spec->d->addProvidesForPlugin(q);
 
                 break;
             }
@@ -833,7 +822,7 @@ bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
 
     dependencySpecs = resolvedDependencies;
 
-    if (enabled && !disabledByDependency)
+    if (enabled && !disabledIndirectly)
         state = PluginSpec::Resolved;
 
     return true;
@@ -976,3 +965,18 @@ void PluginSpecPrivate::kill()
     state = PluginSpec::Deleted;
 }
 
+/*!
+    \fn void PluginSpec::addDependentPlugin(PluginSpec *dependent)
+    Adds a dependent the list of plugins that depend on this one.
+
+    \sa PluginSpec::providesSpecs()
+*/
+void PluginSpecPrivate::addProvidesForPlugin(PluginSpec *dependent)
+{
+    providesSpecs.append(dependent);
+}
+
+void PluginSpecPrivate::removeProvidesForPlugin(PluginSpec *dependent)
+{
+    providesSpecs.removeOne(dependent);
+}
diff --git a/src/libs/extensionsystem/pluginspec.h b/src/libs/extensionsystem/pluginspec.h
index 42feefad32e4d93c2e7f2b5589b696b546c3c48c..e79d94edaa5ab949cd147d02801b21dfd65c032f 100644
--- a/src/libs/extensionsystem/pluginspec.h
+++ b/src/libs/extensionsystem/pluginspec.h
@@ -81,8 +81,7 @@ public:
     QString category() const;
     bool isExperimental() const;
     bool isEnabled() const;
-    // true if loading was not done due to user unselecting this plugin or its dependencies
-    bool isDisabledByDependency() const;
+    bool isDisabledIndirectly() const;
     QList<PluginDependency> dependencies() const;
 
     typedef QList<PluginArgumentDescription> PluginArgumentDescriptions;
@@ -104,11 +103,7 @@ public:
     QList<PluginSpec *> dependencySpecs() const;
 
     // list of plugins that depend on this - e.g. this plugins provides for them
-    QList<PluginSpec *> providesSpecs() const;
-
-    // add/remove from providesSpecs
-    void addDependentPlugin(PluginSpec *dependent);
-    void removeDependentPlugin(PluginSpec *dependent);
+    QList<PluginSpec *> providesForSpecs() const;
 
     // linked plugin instance, valid after 'Loaded' state is reached
     IPlugin *plugin() const;
@@ -123,6 +118,7 @@ private:
 
     Internal::PluginSpecPrivate *d;
     friend class Internal::PluginManagerPrivate;
+    friend class Internal::PluginSpecPrivate;
 };
 
 } // namespace ExtensionSystem
diff --git a/src/libs/extensionsystem/pluginspec_p.h b/src/libs/extensionsystem/pluginspec_p.h
index 339a5d018c3cf99659162a1db0e7a9db95fbdefe..f35770ff6a02e51cd42e3bbbb9d9d89264cc7f3b 100644
--- a/src/libs/extensionsystem/pluginspec_p.h
+++ b/src/libs/extensionsystem/pluginspec_p.h
@@ -71,7 +71,7 @@ public:
     QString category;
     QList<PluginDependency> dependencies;
     bool enabled;
-    bool disabledByDependency;
+    bool disabledIndirectly;
 
     QString location;
     QString filePath;
@@ -89,6 +89,10 @@ public:
     static bool isValidVersion(const QString &version);
     static int versionCompare(const QString &version1, const QString &version2);
 
+    // add/remove from providesSpecs
+    void addProvidesForPlugin(PluginSpec *dependent);
+    void removeProvidesForPlugin(PluginSpec *dependent);
+
 private:
     PluginSpec *q;
 
diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp
index d8a1046dae3eb0b0b48026159761616bd83a0375..553f2a14df22592d3a06d056d644371a92f341a9 100644
--- a/src/libs/extensionsystem/pluginview.cpp
+++ b/src/libs/extensionsystem/pluginview.cpp
@@ -178,7 +178,7 @@ void PluginView::updateList()
     defaultCollectionItem->setData(0, Qt::UserRole, qVariantFromValue(defaultCollection));
 
     foreach (PluginSpec *spec, m_specToItem.keys())
-        toggleRelatedPlugins(spec, spec->isEnabled() && !spec->isDisabledByDependency());
+        toggleRelatedPlugins(spec, spec->isEnabled() && !spec->isDisabledIndirectly());
 
     m_ui->categoryWidget->clear();
     if (!m_items.isEmpty()) {
@@ -347,8 +347,8 @@ void PluginView::updatePluginSettings(QTreeWidgetItem *item, int column)
 void PluginView::toggleRelatedPlugins(PluginSpec *modifiedPlugin, bool isPluginEnabled)
 {
 
-    for(int i = 0; i < modifiedPlugin->providesSpecs().length(); ++i) {
-        PluginSpec *spec = modifiedPlugin->providesSpecs().at(i);
+    for(int i = 0; i < modifiedPlugin->providesForSpecs().length(); ++i) {
+        PluginSpec *spec = modifiedPlugin->providesForSpecs().at(i);
         QTreeWidgetItem *childItem = m_specToItem.value(spec);
 
         if (childItem->isDisabled() != !isPluginEnabled) {
diff --git a/src/plugins/coreplugin/plugindialog.cpp b/src/plugins/coreplugin/plugindialog.cpp
index 64e7a9902e14c0ac9a4f958e04890062169f1531..e35a21501de4d3fe18c93cae1a97a9e4bfed4f21 100644
--- a/src/plugins/coreplugin/plugindialog.cpp
+++ b/src/plugins/coreplugin/plugindialog.cpp
@@ -111,7 +111,7 @@ void PluginDialog::updateButtons()
     if (selectedSpec) {
         m_detailsButton->setEnabled(true);
         m_errorDetailsButton->setEnabled(selectedSpec->hasError()
-                                         || selectedSpec->isDisabledByDependency()
+                                         || selectedSpec->isDisabledIndirectly()
                                          || !selectedSpec->isEnabled());
     } else {
         m_detailsButton->setEnabled(false);