diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp
index 730c63ef7f2346a49232e2a291bbe7a7dcce93fa..45c7dcf11137712d1eb452ecf01db9173bb67d4b 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.cpp
+++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp
@@ -232,8 +232,14 @@ static QList<ProjectExplorer::ProjectAction> supportedNodeActions(ProjectExplore
         return actions;
     if (managesFiles)
         actions << ProjectExplorer::AddNewFile << ProjectExplorer::AddExistingFile;
+
+    auto equalsNodeFilePath = [node](const QString &str)
+    {
+        return str == node->filePath().toString();
+    };
+
     if (node->nodeType() == ProjectExplorer::NodeType::File
-            && !project->qbsProject().buildSystemFiles().contains(node->filePath().toString())) {
+            && !Utils::contains(project->qbsProject().buildSystemFiles(), equalsNodeFilePath)) {
         actions << ProjectExplorer::RemoveFile << ProjectExplorer::Rename;
     }
     return actions;
diff --git a/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp b/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp
index 1f2d1dc445ba099150cfa2ee04fdb82640d9708d..46d68e707b643e715649bd8d192bcb2526edf5e1 100644
--- a/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp
+++ b/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp
@@ -169,9 +169,16 @@ QSet<QString> referencedBuildSystemFiles(const qbs::ProjectData &data)
 
 QStringList unreferencedBuildSystemFiles(const qbs::Project &p)
 {
-    return p.isValid()
-            ? p.buildSystemFiles().subtract(referencedBuildSystemFiles(p.projectData())).toList()
-            : QStringList();
+    QStringList result;
+    if (!p.isValid())
+        return result;
+
+    const std::set<QString> &available = p.buildSystemFiles();
+    const QSet<QString> &referenced = referencedBuildSystemFiles(p.projectData());
+    std::set_difference(available.begin(), available.end(), referenced.begin(), referenced.end(),
+                        std::back_inserter(result));
+
+    return result;
 }
 
 } // namespace
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 5e1abd4c3a1817d1e211990f5aabec84f80ebc3f..198a77ff01927f8f407778ab926150c64df185a6 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -411,12 +411,20 @@ bool QbsProject::checkCancelStatus()
     return true;
 }
 
+static QSet<QString> toQStringSet(const std::set<QString> &src)
+{
+    QSet<QString> result;
+    result.reserve(src.size());
+    std::copy(src.begin(), src.end(), Utils::inserter(result));
+    return result;
+}
+
 void QbsProject::updateAfterParse()
 {
     qCDebug(qbsPmLog) << "Updating data after parse";
     OpTimer opTimer("updateAfterParse");
     updateProjectNodes();
-    updateDocuments(m_qbsProject.buildSystemFiles());
+    updateDocuments(toQStringSet(m_qbsProject.buildSystemFiles()));
     updateBuildTargetData();
     updateCppCodeModel();
     updateQmlJsCodeModel();
diff --git a/src/shared/qbs b/src/shared/qbs
index 28f803d359c5f3102514d7817478cb4927114102..24000d556fefdb3dcd4103d3d1679429434e6f58 160000
--- a/src/shared/qbs
+++ b/src/shared/qbs
@@ -1 +1 @@
-Subproject commit 28f803d359c5f3102514d7817478cb4927114102
+Subproject commit 24000d556fefdb3dcd4103d3d1679429434e6f58