diff --git a/src/app/main.cpp b/src/app/main.cpp
index ad61ab0c7505e59127400ca060a44929c1c2960a..eedc9e1365370a07d2e60933568a3e1dbb1aaadf 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -69,7 +69,7 @@ static const char *HELP_OPTION4 = "--help";
 static const char *VERSION_OPTION = "-version";
 static const char *CLIENT_OPTION = "-client";
 
-typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet;
+typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet;
 
 // Helpers for displaying messages. Note that there is no console on Windows.
 #ifdef Q_WS_WIN
diff --git a/src/libs/extensionsystem/optionsparser.cpp b/src/libs/extensionsystem/optionsparser.cpp
index 8884cb378ceb02b002f52b63c1f6aefbfef3f1f5..09dbaa59b7241648efc47e7cb8b30ae963b6ca93 100644
--- a/src/libs/extensionsystem/optionsparser.cpp
+++ b/src/libs/extensionsystem/optionsparser.cpp
@@ -129,7 +129,7 @@ bool OptionsParser::checkForNoLoadOption()
                                                              "The plugin '%1' does not exist.").arg(m_currentArg);
             m_hasError = true;
         } else {
-            m_pmPrivate->pluginSpecs.remove(spec);
+            m_pmPrivate->pluginSpecs.removeAll(spec);
             delete spec;
             m_isDependencyRefreshNeeded = true;
         }
diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp
index 3f7ba386e4e2d096d247cced281e457c26398d69..90e6e4bb0049c613ab92c30485939a093475bc90 100644
--- a/src/libs/extensionsystem/pluginmanager.cpp
+++ b/src/libs/extensionsystem/pluginmanager.cpp
@@ -48,7 +48,7 @@
 #include <QTest>
 #endif
 
-typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet;
+typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet;
 
 enum { debugLeaks = 0 };
 
@@ -162,6 +162,11 @@ enum { debugLeaks = 0 };
 using namespace ExtensionSystem;
 using namespace ExtensionSystem::Internal;
 
+static bool lessThanByPluginName(const PluginSpec *one, const PluginSpec *two)
+{
+    return one->name() < two->name();
+}
+
 PluginManager *PluginManager::m_instance = 0;
 
 /*!
@@ -306,7 +311,7 @@ QStringList PluginManager::arguments() const
 }
 
 /*!
-    \fn QSet<PluginSpec *> PluginManager::plugins() const
+    \fn QList<PluginSpec *> PluginManager::plugins() const
     List of all plugin specifications that have been found in the plugin search paths.
     This list is valid directly after the setPluginPaths() call.
     The plugin specifications contain the information from the plugins' xml description files
@@ -315,7 +320,7 @@ QStringList PluginManager::arguments() const
 
     \sa setPluginPaths()
 */
-QSet<PluginSpec *> PluginManager::plugins() const
+QList<PluginSpec *> PluginManager::plugins() const
 {
     return d->pluginSpecs;
 }
@@ -703,9 +708,11 @@ void PluginManagerPrivate::readPluginPaths()
     foreach (const QString &specFile, specFiles) {
         PluginSpec *spec = new PluginSpec;
         spec->d->read(specFile);
-        pluginSpecs.insert(spec);
+        pluginSpecs.append(spec);
     }
     resolveDependencies();
+    // ensure deterministic plugin load order by sorting
+    qSort(pluginSpecs.begin(), pluginSpecs.end(), lessThanByPluginName);
     emit q->pluginsChanged();
 }
 
diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h
index e46451901e925cd4881b088bd05cafa7671d791a..e621fbea17fe9927d61f96d03de9e0c60a9d973b 100644
--- a/src/libs/extensionsystem/pluginmanager.h
+++ b/src/libs/extensionsystem/pluginmanager.h
@@ -101,7 +101,7 @@ public:
     void loadPlugins();
     QStringList pluginPaths() const;
     void setPluginPaths(const QStringList &paths);
-    QSet<PluginSpec *> plugins() const;
+    QList<PluginSpec *> plugins() const;
     void setFileExtension(const QString &extension);
     QString fileExtension() const;
 
diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h
index 74cb84c8678d8cdad09d413b11b15ff943b59d85..b286fdf2b1d83432e91faef5a4e95f4dda04c4b7 100644
--- a/src/libs/extensionsystem/pluginmanager_p.h
+++ b/src/libs/extensionsystem/pluginmanager_p.h
@@ -66,7 +66,7 @@ public:
     void loadPlugin(PluginSpec *spec, PluginSpec::State destState);
     void resolveDependencies();
 
-    QSet<PluginSpec *> pluginSpecs;
+    QList<PluginSpec *> pluginSpecs;
     QList<PluginSpec *> testSpecs;
     QStringList pluginPaths;
     QString extension;
diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp
index 170cd72ba0b978894be1609e6f766d4b98ec6512..a8694e29677a433579b8f752a68a77cb3b96899f 100644
--- a/src/libs/extensionsystem/pluginspec.cpp
+++ b/src/libs/extensionsystem/pluginspec.cpp
@@ -693,10 +693,10 @@ int PluginSpecPrivate::versionCompare(const QString &version1, const QString &ve
 }
 
 /*!
-    \fn bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs)
+    \fn bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
     \internal
 */
-bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs)
+bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
 {
     if (hasError)
         return false;
diff --git a/src/libs/extensionsystem/pluginspec_p.h b/src/libs/extensionsystem/pluginspec_p.h
index 922fe36d05d65c03fdaf02bd8abaad8ed795d84f..b4fefc59b32a81092963ad49d4349a84e2c3a33d 100644
--- a/src/libs/extensionsystem/pluginspec_p.h
+++ b/src/libs/extensionsystem/pluginspec_p.h
@@ -56,7 +56,7 @@ public:
 
     bool read(const QString &fileName);
     bool provides(const QString &pluginName, const QString &version) const;
-    bool resolveDependencies(const QSet<PluginSpec *> &specs);
+    bool resolveDependencies(const QList<PluginSpec *> &specs);
     bool loadLibrary();
     bool initializePlugin();
     bool initializeExtensions();