diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 4f164807dca7e79e18093ee32eafc179526af9ad..3f1c22357f5bcf29961ed46da53dad9da817e909 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -991,18 +991,23 @@ QString SessionManager::activeSession() const
 
 QStringList SessionManager::sessions() const
 {
-    QStringList result = m_core->settings()->value("Sessions").toStringList();
-
-    if (!result.contains("default"))
-        result.prepend("default");
-
-    return result;
+    if (m_sessions.isEmpty()) {
+        // We aren't yet initalized, so do that now
+        QDirIterator dirIter(QFileInfo(m_core->settings()->fileName()).path() + "/qtcreator/");
+        while (dirIter.hasNext()) {
+            dirIter.next();
+            const QFileInfo &fileInfo = dirIter.fileInfo();
+            if (fileInfo.suffix() == "qws" && fileInfo.completeBaseName() != "default")
+                m_sessions << fileInfo.completeBaseName();
+        }
+        m_sessions.prepend("default");
+    }
+    return m_sessions;
 }
 
 QString SessionManager::sessionNameToFileName(const QString &session)
 {
-    QString sn = session;
-    return QFileInfo(m_core->settings()->fileName()).path() + "/qtcreator/" + sn + ".qws";
+    return QFileInfo(m_core->settings()->fileName()).path() + "/qtcreator/" + session + ".qws";
 }
 
 void SessionManager::createAndLoadNewDefaultSession()
@@ -1015,19 +1020,15 @@ bool SessionManager::createSession(const QString &session)
 {
     if (sessions().contains(session))
         return false;
-    QStringList list = m_core->settings()->value("Sessions").toStringList();
-    list.append(session);
-    m_core->settings()->setValue("Sessions", list);
+    m_sessions.append(session);
     return true;
 }
 
 bool SessionManager::deleteSession(const QString &session)
 {
-    QStringList list = m_core->settings()->value("Sessions").toStringList();
-    if (!list.contains(session))
+    if (!m_sessions.contains(session))
         return false;
-    list.removeOne(session);
-    m_core->settings()->setValue("Sessions", list);
+    m_sessions.removeOne(session);
     QFile fi(sessionNameToFileName(session));
     if (fi.exists())
         return fi.remove();
@@ -1036,17 +1037,13 @@ bool SessionManager::deleteSession(const QString &session)
 
 bool SessionManager::cloneSession(const QString &original, const QString &clone)
 {
-    QStringList list = m_core->settings()->value("Sessions").toStringList();
-    list.append(clone);
-
-    if (!sessions().contains(original))
+    if (!m_sessions.contains(original))
         return false;
 
     QFile fi(sessionNameToFileName(original));
-
     // If the file does not exist, we can still clone
     if (!fi.exists() || fi.copy(sessionNameToFileName(clone))) {
-        m_core->settings()->setValue("Sessions", list);
+        m_sessions.append(clone);
         return true;
     }
     return false;
diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h
index b149400f59c22dec0114a5e8034aed87fb4ae6a0..3cbf09b1b84f7cc5a4bfb8c3c55fc4e97749b701 100644
--- a/src/plugins/projectexplorer/session.h
+++ b/src/plugins/projectexplorer/session.h
@@ -189,8 +189,9 @@ private:
     QString m_displayName;
     QString m_sessionName;
 
-    mutable
-    QHash<Project *, QStringList> m_projectFileCache;
+    mutable QStringList m_sessions;
+
+    mutable QHash<Project *, QStringList> m_projectFileCache;
 };
 
 } // namespace ProjectExplorer