diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp
index d5a87c7c486353eb67859ab6f9c28f902c4ac7ea..07645ff281fd4fcacde6b6c9c968cdd5d81f5961 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp
@@ -52,6 +52,24 @@ QObject *QuickWindowNodeInstance::parent() const
     return 0;
 }
 
+QImage QuickWindowNodeInstance::renderImage() const
+{
+    /*
+     Since the content item transucient
+     we just fill an image with the window color
+     */
+
+    QRectF renderBoundingRect = boundingRect();
+
+    QImage renderImage(renderBoundingRect.size().toSize(), QImage::Format_ARGB32_Premultiplied);
+
+    QPalette palette;
+
+    renderImage.fill(palette.color(QPalette::Window).rgba());
+
+    return renderImage;
+}
+
 QuickWindowNodeInstance::Pointer QuickWindowNodeInstance::create(QObject *object)
 {
     QQuickWindow *quickWindow = qobject_cast<QQuickWindow*>(object);
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.h
index e9651f9e68fa588a4d42ed527b9c6562fc9d653f..c9c7773d3afc0c26d050d60de15a6bc91fc92ba0 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.h
@@ -62,7 +62,7 @@ public:
 
     bool isAnchoredBySibling() const Q_DECL_OVERRIDE;
 
-
+    QImage renderImage() const Q_DECL_OVERRIDE;
 
 protected:
     QuickWindowNodeInstance(QQuickWindow*);
diff --git a/share/qtcreator/templates/qml/qtquickcontrols/main.qml b/share/qtcreator/templates/qml/qtquickcontrols/main.qml
index 23c924f3ec1ca7cf9ed6919060dff21bc18da2f9..f886b99fb9da01e3995bd1b9d3cbdbc4a07ec942 100644
--- a/share/qtcreator/templates/qml/qtquickcontrols/main.qml
+++ b/share/qtcreator/templates/qml/qtquickcontrols/main.qml
@@ -3,6 +3,7 @@ import QtQuick.Controls 1.0
 import QtQuick.Window 2.0
 
 ApplicationWindow {
+    title: qsTr("Hello World")
     width: 640
     height: 480
 
diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h
index 95268e69536f2592bcad99805d74102fb3b7e913..157c51246e58f49a59b489a60d9755bf3d2cf559 100644
--- a/src/libs/cplusplus/ResolveExpression.h
+++ b/src/libs/cplusplus/ResolveExpression.h
@@ -123,7 +123,7 @@ protected:
 
 private:
     Scope *_scope;
-    LookupContext _context;
+    const LookupContext& _context;
     Bind bind;
     QList<LookupItem> _results;
     bool _reference;
diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp
index 63f6807ea645d869c0b397c0f951599d09c907f0..d3575c364e9118c8c7e1ed49669de3889233845a 100644
--- a/src/plugins/cpptools/cppcompletion_test.cpp
+++ b/src/plugins/cpptools/cppcompletion_test.cpp
@@ -2239,3 +2239,37 @@ void CppToolsPlugin::test_completion_instantiate_template_function()
     QVERIFY(completions.contains(QLatin1String("A")));
     QVERIFY(completions.contains(QLatin1String("a")));
 }
+
+void CppToolsPlugin::test_completion_crash_cloning_template_class_QTCREATORBUG9329()
+{
+    TestData data;
+    data.srcText =
+            "struct A {};\n"
+            "template <typename T>\n"
+            "struct Templ {};\n"
+            "struct B : A, Templ<A>\n"
+            "{\n"
+            "   int f()\n"
+            "   {\n"
+            "       @\n"
+            "       // padding so we get the scope right\n"
+            "   }\n"
+            "};\n"
+            ;
+    setup(&data);
+
+    Utils::ChangeSet change;
+    QString txt = QLatin1String("this->");
+    change.insert(data.pos, txt);
+    QTextCursor cursor(data.doc);
+    change.apply(&cursor);
+    data.pos += txt.length();
+
+    QStringList completions = getCompletions(data);
+
+    QCOMPARE(completions.size(), 4);
+    QVERIFY(completions.contains(QLatin1String("A")));
+    QVERIFY(completions.contains(QLatin1String("B")));
+    QVERIFY(completions.contains(QLatin1String("Templ")));
+    QVERIFY(completions.contains(QLatin1String("f")));
+}
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index 5e4d14385068056abb2394a054737a66b72a2e79..10f033c0434b424b0f86bfb31e153c237daa9b4a 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -137,6 +137,7 @@ private slots:
     void test_completion_type_and_using_declaration_data();
     void test_completion_instantiate_template_with_anonymous_class();
     void test_completion_instantiate_template_function();
+    void test_completion_crash_cloning_template_class_QTCREATORBUG9329();
 
     void test_format_pointerdeclaration_in_simpledeclarations();
     void test_format_pointerdeclaration_in_simpledeclarations_data();
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index a0dc481d1f1a0539b47018c7258cbc4425c43a0e..2b8e213d1ce823c1936e3013e37d9d0967e39ba5 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -3749,7 +3749,7 @@ void GdbEngine::handleThreadInfo(const GdbResponse &response)
                 selectThread(other);
         }
         updateViews(); // Adjust Threads combobox.
-        if (false && m_hasInferiorThreadList && debuggerCore()->boolSetting(ShowThreadNames)) {
+        if (m_hasInferiorThreadList && debuggerCore()->boolSetting(ShowThreadNames)) {
             postCommand("threadnames " +
                 debuggerCore()->action(MaximalStackDepth)->value().toByteArray(),
                 Discardable, CB(handleThreadNames));
diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
index 53cfd46ae4dc782cfd5c636b16ae2ef79a6619aa..0f3da1fdf65803edd15e53d773961fe366deea6a 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
@@ -116,7 +116,7 @@ void QbsBuildStep::run(QFutureInterface<bool> &fi)
 
     QbsProject *pro = static_cast<QbsProject *>(project());
     qbs::BuildOptions options(m_qbsBuildOptions);
-    options.changedFiles = m_changedFiles;
+    options.setChangedFiles(m_changedFiles);
 
     m_job = pro->build(options);
 
@@ -179,18 +179,18 @@ void QbsBuildStep::setQbsConfiguration(const QVariantMap &config)
 
 bool QbsBuildStep::dryRun() const
 {
-    return m_qbsBuildOptions.dryRun;
+    return m_qbsBuildOptions.dryRun();
 }
 
 bool QbsBuildStep::keepGoing() const
 {
-    return m_qbsBuildOptions.keepGoing;
+    return m_qbsBuildOptions.keepGoing();
 }
 
 int QbsBuildStep::maxJobs() const
 {
-    if (m_qbsBuildOptions.maxJobCount > 0)
-        return m_qbsBuildOptions.maxJobCount;
+    if (m_qbsBuildOptions.maxJobCount() > 0)
+        return m_qbsBuildOptions.maxJobCount();
     return qbs::BuildOptions::defaultMaxJobCount();
 }
 
@@ -200,9 +200,9 @@ bool QbsBuildStep::fromMap(const QVariantMap &map)
         return false;
 
     setQbsConfiguration(map.value(QLatin1String(QBS_CONFIG)).toMap());
-    m_qbsBuildOptions.dryRun = map.value(QLatin1String(QBS_DRY_RUN)).toBool();
-    m_qbsBuildOptions.keepGoing = map.value(QLatin1String(QBS_KEEP_GOING)).toBool();
-    m_qbsBuildOptions.maxJobCount = map.value(QLatin1String(QBS_MAXJOBCOUNT)).toInt();
+    m_qbsBuildOptions.setDryRun(map.value(QLatin1String(QBS_DRY_RUN)).toBool());
+    m_qbsBuildOptions.setKeepGoing(map.value(QLatin1String(QBS_KEEP_GOING)).toBool());
+    m_qbsBuildOptions.setMaxJobCount(map.value(QLatin1String(QBS_MAXJOBCOUNT)).toInt());
     return true;
 }
 
@@ -210,9 +210,9 @@ QVariantMap QbsBuildStep::toMap() const
 {
     QVariantMap map = ProjectExplorer::BuildStep::toMap();
     map.insert(QLatin1String(QBS_CONFIG), m_qbsConfiguration);
-    map.insert(QLatin1String(QBS_DRY_RUN), m_qbsBuildOptions.dryRun);
-    map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsBuildOptions.keepGoing);
-    map.insert(QLatin1String(QBS_MAXJOBCOUNT), m_qbsBuildOptions.maxJobCount);
+    map.insert(QLatin1String(QBS_DRY_RUN), m_qbsBuildOptions.dryRun());
+    map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsBuildOptions.keepGoing());
+    map.insert(QLatin1String(QBS_MAXJOBCOUNT), m_qbsBuildOptions.maxJobCount());
     return map;
 }
 
@@ -221,7 +221,7 @@ void QbsBuildStep::buildingDone(bool success)
     // Report errors:
     foreach (const qbs::ErrorData &data, m_job->error().entries())
         createTaskAndOutput(ProjectExplorer::Task::Error, data.description(),
-                            data.codeLocation().fileName, data.codeLocation().line);
+                            data.codeLocation().fileName(), data.codeLocation().line());
 
     QTC_ASSERT(m_fi, return);
     m_fi->reportResult(success);
@@ -251,7 +251,7 @@ void QbsBuildStep::handleWarningReport(const qbs::Error &error)
 {
     foreach (const qbs::ErrorData &data, error.entries()) {
         createTaskAndOutput(ProjectExplorer::Task::Warning, data.description(),
-                            data.codeLocation().fileName, data.codeLocation().line);
+                            data.codeLocation().fileName(), data.codeLocation().line());
     }
 }
 
@@ -263,21 +263,21 @@ void QbsBuildStep::handleCommandDescriptionReport(const QString &highlight, cons
 
 void QbsBuildStep::handleProcessResultReport(const qbs::ProcessResult &result)
 {
-    bool hasOutput = !result.stdOut.isEmpty() || !result.stdErr.isEmpty();
+    bool hasOutput = !result.stdOut().isEmpty() || !result.stdErr().isEmpty();
 
-    if (result.success && !hasOutput)
+    if (result.success() && !hasOutput)
         return;
 
-    m_parser->setWorkingDirectory(result.workingDirectory);
+    m_parser->setWorkingDirectory(result.workingDirectory());
 
-    QString commandline = result.binary + QLatin1Char(' ') + result.arguments.join(QLatin1String(" "));
+    QString commandline = result.executableFilePath() + QLatin1Char(' ') + result.arguments().join(QLatin1String(" "));
     addOutput(commandline, NormalOutput);
 
-    foreach (const QString &line, result.stdErr) {
+    foreach (const QString &line, result.stdErr()) {
         m_parser->stdError(line);
         addOutput(line, ErrorOutput);
     }
-    foreach (const QString &line, result.stdOut) {
+    foreach (const QString &line, result.stdOut()) {
         m_parser->stdOutput(line);
         addOutput(line, NormalOutput);
     }
@@ -312,25 +312,25 @@ QString QbsBuildStep::profile() const
 
 void QbsBuildStep::setDryRun(bool dr)
 {
-    if (m_qbsBuildOptions.dryRun == dr)
+    if (m_qbsBuildOptions.dryRun() == dr)
         return;
-    m_qbsBuildOptions.dryRun = dr;
+    m_qbsBuildOptions.setDryRun(dr);
     emit qbsBuildOptionsChanged();
 }
 
 void QbsBuildStep::setKeepGoing(bool kg)
 {
-    if (m_qbsBuildOptions.keepGoing == kg)
+    if (m_qbsBuildOptions.keepGoing() == kg)
         return;
-    m_qbsBuildOptions.keepGoing = kg;
+    m_qbsBuildOptions.setKeepGoing(kg);
     emit qbsBuildOptionsChanged();
 }
 
 void QbsBuildStep::setMaxJobs(int jobcount)
 {
-    if (m_qbsBuildOptions.maxJobCount == jobcount)
+    if (m_qbsBuildOptions.maxJobCount() == jobcount)
         return;
-    m_qbsBuildOptions.maxJobCount = jobcount;
+    m_qbsBuildOptions.setMaxJobCount(jobcount);
     emit qbsBuildOptionsChanged();
 }
 
diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.cpp b/src/plugins/qbsprojectmanager/qbscleanstep.cpp
index 338bd265e8550ef399dafe7e23e6dab45e3a94bf..6911144cb17c3ac343ed2b43fc5f27ad3cc934e5 100644
--- a/src/plugins/qbsprojectmanager/qbscleanstep.cpp
+++ b/src/plugins/qbsprojectmanager/qbscleanstep.cpp
@@ -134,12 +134,12 @@ void QbsCleanStep::cancel()
 
 bool QbsCleanStep::dryRun() const
 {
-    return m_qbsCleanOptions.dryRun;
+    return m_qbsCleanOptions.dryRun();
 }
 
 bool QbsCleanStep::keepGoing() const
 {
-    return m_qbsCleanOptions.keepGoing;
+    return m_qbsCleanOptions.keepGoing();
 }
 
 int QbsCleanStep::maxJobs() const
@@ -149,7 +149,7 @@ int QbsCleanStep::maxJobs() const
 
 bool QbsCleanStep::cleanAll() const
 {
-    return m_qbsCleanOptions.cleanType == qbs::CleanOptions::CleanupAll;
+    return m_qbsCleanOptions.cleanType() == qbs::CleanOptions::CleanupAll;
 }
 
 bool QbsCleanStep::fromMap(const QVariantMap &map)
@@ -157,10 +157,10 @@ bool QbsCleanStep::fromMap(const QVariantMap &map)
     if (!ProjectExplorer::BuildStep::fromMap(map))
         return false;
 
-    m_qbsCleanOptions.dryRun = map.value(QLatin1String(QBS_DRY_RUN)).toBool();
-    m_qbsCleanOptions.keepGoing = map.value(QLatin1String(QBS_KEEP_GOING)).toBool();
-    m_qbsCleanOptions.cleanType = map.value(QLatin1String(QBS_CLEAN_ALL)).toBool()
-            ? qbs::CleanOptions::CleanupAll : qbs::CleanOptions::CleanupTemporaries;
+    m_qbsCleanOptions.setDryRun(map.value(QLatin1String(QBS_DRY_RUN)).toBool());
+    m_qbsCleanOptions.setKeepGoing(map.value(QLatin1String(QBS_KEEP_GOING)).toBool());
+    m_qbsCleanOptions.setCleanType(map.value(QLatin1String(QBS_CLEAN_ALL)).toBool()
+            ? qbs::CleanOptions::CleanupAll : qbs::CleanOptions::CleanupTemporaries);
 
     return true;
 }
@@ -168,10 +168,10 @@ bool QbsCleanStep::fromMap(const QVariantMap &map)
 QVariantMap QbsCleanStep::toMap() const
 {
     QVariantMap map = ProjectExplorer::BuildStep::toMap();
-    map.insert(QLatin1String(QBS_DRY_RUN), m_qbsCleanOptions.dryRun);
-    map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsCleanOptions.keepGoing);
+    map.insert(QLatin1String(QBS_DRY_RUN), m_qbsCleanOptions.dryRun());
+    map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsCleanOptions.keepGoing());
     map.insert(QLatin1String(QBS_CLEAN_ALL),
-               m_qbsCleanOptions.cleanType == qbs::CleanOptions::CleanupAll);
+               m_qbsCleanOptions.cleanType() == qbs::CleanOptions::CleanupAll);
 
     return map;
 }
@@ -181,7 +181,7 @@ void QbsCleanStep::cleaningDone(bool success)
     // Report errors:
     foreach (const qbs::ErrorData &data, m_job->error().entries()) {
         createTaskAndOutput(ProjectExplorer::Task::Error, data.description(),
-                            data.codeLocation().fileName, data.codeLocation().line);
+                            data.codeLocation().fileName(), data.codeLocation().line());
     }
 
     QTC_ASSERT(m_fi, return);
@@ -217,17 +217,17 @@ void QbsCleanStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type, con
 
 void QbsCleanStep::setDryRun(bool dr)
 {
-    if (m_qbsCleanOptions.dryRun == dr)
+    if (m_qbsCleanOptions.dryRun() == dr)
         return;
-    m_qbsCleanOptions.dryRun = dr;
+    m_qbsCleanOptions.setDryRun(dr);
     emit changed();
 }
 
 void QbsCleanStep::setKeepGoing(bool kg)
 {
-    if (m_qbsCleanOptions.keepGoing == kg)
+    if (m_qbsCleanOptions.keepGoing() == kg)
         return;
-    m_qbsCleanOptions.keepGoing = kg;
+    m_qbsCleanOptions.setKeepGoing(kg);
     emit changed();
 }
 
@@ -241,9 +241,9 @@ void QbsCleanStep::setCleanAll(bool ca)
 {
     qbs::CleanOptions::CleanType newType = ca
             ? qbs::CleanOptions::CleanupAll : qbs::CleanOptions::CleanupTemporaries;
-    if (m_qbsCleanOptions.cleanType == newType)
+    if (m_qbsCleanOptions.cleanType() == newType)
         return;
-    m_qbsCleanOptions.cleanType = newType;
+    m_qbsCleanOptions.setCleanType(newType);
     emit changed();
 }
 
diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp
index c7cafcfca0c0a4af976b445b675c49942ead927d..bac939de882bcc12033c23d8ce7cde1a1c658d59 100644
--- a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp
+++ b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp
@@ -126,8 +126,8 @@ void QbsInstallStep::cancel()
 
 QString QbsInstallStep::installRoot() const
 {
-    if (!m_qbsInstallOptions.installRoot.isEmpty())
-        return m_qbsInstallOptions.installRoot;
+    if (!m_qbsInstallOptions.installRoot().isEmpty())
+        return m_qbsInstallOptions.installRoot();
 
     return qbs::InstallOptions::defaultInstallRoot();
 }
@@ -143,17 +143,17 @@ QString QbsInstallStep::absoluteInstallRoot() const
 
 bool QbsInstallStep::removeFirst() const
 {
-    return m_qbsInstallOptions.removeFirst;
+    return m_qbsInstallOptions.removeExistingInstallation();
 }
 
 bool QbsInstallStep::dryRun() const
 {
-    return m_qbsInstallOptions.dryRun;
+    return m_qbsInstallOptions.dryRun();
 }
 
 bool QbsInstallStep::keepGoing() const
 {
-    return m_qbsInstallOptions.keepGoing;
+    return m_qbsInstallOptions.keepGoing();
 }
 
 bool QbsInstallStep::fromMap(const QVariantMap &map)
@@ -162,9 +162,9 @@ bool QbsInstallStep::fromMap(const QVariantMap &map)
         return false;
 
     setInstallRoot(map.value(QLatin1String(QBS_INSTALL_ROOT)).toString());
-    m_qbsInstallOptions.removeFirst = map.value(QLatin1String(QBS_REMOVE_FIRST), false).toBool();
-    m_qbsInstallOptions.dryRun = map.value(QLatin1String(QBS_DRY_RUN), false).toBool();
-    m_qbsInstallOptions.keepGoing = map.value(QLatin1String(QBS_KEEP_GOING), false).toBool();
+    m_qbsInstallOptions.setRemoveExistingInstallation(map.value(QLatin1String(QBS_REMOVE_FIRST), false).toBool());
+    m_qbsInstallOptions.setDryRun(map.value(QLatin1String(QBS_DRY_RUN), false).toBool());
+    m_qbsInstallOptions.setKeepGoing(map.value(QLatin1String(QBS_KEEP_GOING), false).toBool());
 
     return true;
 }
@@ -172,20 +172,25 @@ bool QbsInstallStep::fromMap(const QVariantMap &map)
 QVariantMap QbsInstallStep::toMap() const
 {
     QVariantMap map = ProjectExplorer::BuildStep::toMap();
-    map.insert(QLatin1String(QBS_INSTALL_ROOT), m_qbsInstallOptions.installRoot);
-    map.insert(QLatin1String(QBS_REMOVE_FIRST), m_qbsInstallOptions.removeFirst);
-    map.insert(QLatin1String(QBS_DRY_RUN), m_qbsInstallOptions.dryRun);
-    map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsInstallOptions.keepGoing);
+    map.insert(QLatin1String(QBS_INSTALL_ROOT), m_qbsInstallOptions.installRoot());
+    map.insert(QLatin1String(QBS_REMOVE_FIRST), m_qbsInstallOptions.removeExistingInstallation());
+    map.insert(QLatin1String(QBS_DRY_RUN), m_qbsInstallOptions.dryRun());
+    map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsInstallOptions.keepGoing());
 
     return map;
 }
 
+qbs::InstallOptions QbsInstallStep::installOptions() const
+{
+    return m_qbsInstallOptions;
+}
+
 void QbsInstallStep::installDone(bool success)
 {
     // Report errors:
     foreach (const qbs::ErrorData &data, m_job->error().entries()) {
         createTaskAndOutput(ProjectExplorer::Task::Error, data.description(),
-                            data.codeLocation().fileName, data.codeLocation().line);
+                            data.codeLocation().fileName(), data.codeLocation().line());
     }
 
     QTC_ASSERT(m_fi, return);
@@ -222,33 +227,33 @@ void QbsInstallStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type,
 
 void QbsInstallStep::setInstallRoot(const QString &ir)
 {
-    if (m_qbsInstallOptions.installRoot == ir)
+    if (m_qbsInstallOptions.installRoot() == ir)
         return;
-    m_qbsInstallOptions.installRoot = ir;
+    m_qbsInstallOptions.installRoot() = ir;
     emit changed();
 }
 
 void QbsInstallStep::setRemoveFirst(bool rf)
 {
-    if (m_qbsInstallOptions.removeFirst == rf)
+    if (m_qbsInstallOptions.removeExistingInstallation() == rf)
         return;
-    m_qbsInstallOptions.removeFirst = rf;
+    m_qbsInstallOptions.setRemoveExistingInstallation(rf);
     emit changed();
 }
 
 void QbsInstallStep::setDryRun(bool dr)
 {
-    if (m_qbsInstallOptions.dryRun == dr)
+    if (m_qbsInstallOptions.dryRun() == dr)
         return;
-    m_qbsInstallOptions.dryRun = dr;
+    m_qbsInstallOptions.setDryRun(dr);
     emit changed();
 }
 
 void QbsInstallStep::setKeepGoing(bool kg)
 {
-    if (m_qbsInstallOptions.keepGoing == kg)
+    if (m_qbsInstallOptions.keepGoing() == kg)
         return;
-    m_qbsInstallOptions.keepGoing = kg;
+    m_qbsInstallOptions.setKeepGoing(kg);
     emit changed();
 }
 
diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.h b/src/plugins/qbsprojectmanager/qbsinstallstep.h
index f0122520f05f67c5fc97bc4e6634aedfe0fb5522..2857e3c8cc524551fa5ecd0b6b19f4d395df9bcd 100644
--- a/src/plugins/qbsprojectmanager/qbsinstallstep.h
+++ b/src/plugins/qbsprojectmanager/qbsinstallstep.h
@@ -63,6 +63,7 @@ public:
     bool fromMap(const QVariantMap &map);
     QVariantMap toMap() const;
 
+    qbs::InstallOptions installOptions() const;
     QString installRoot() const;
     QString absoluteInstallRoot() const;
     bool removeFirst() const;
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp
index 677585ba2eb6054ab408d58b774f5560f5c9e11b..819ed968266ee28d3c2227d86921c03b099661c3 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.cpp
+++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp
@@ -313,9 +313,9 @@ QbsGroupNode::QbsGroupNode(const qbs::GroupData *grp, const QString &productPath
 {
     setIcon(m_groupIcon);
 
-    QbsFileNode *idx = new QbsFileNode(grp->location().fileName,
+    QbsFileNode *idx = new QbsFileNode(grp->location().fileName(),
                                        ProjectExplorer::ProjectFileType, false,
-                                       grp->location().line);
+                                       grp->location().line());
     addFileNodes(QList<ProjectExplorer::FileNode *>() << idx, this);
 
     updateQbsGroupData(grp, productPath);
@@ -334,7 +334,7 @@ void QbsGroupNode::updateQbsGroupData(const qbs::GroupData *grp, const QString &
     m_productPath = productPath;
     m_qbsGroupData = grp;
 
-    setPath(grp->location().fileName);
+    setPath(grp->location().fileName());
     setDisplayName(grp->name());
 
     QbsFileNode *idx = 0;
@@ -346,8 +346,8 @@ void QbsGroupNode::updateQbsGroupData(const qbs::GroupData *grp, const QString &
 
     // idx not found, which should never happen!
     Q_ASSERT(idx);
-    idx->setPath(grp->location().fileName);
-    idx->setLine(grp->location().line);
+    idx->setPath(grp->location().fileName());
+    idx->setLine(grp->location().line());
 
     setupFiles(this, grp->allFilePaths(), m_productPath);
     emitNodeUpdated();
@@ -433,7 +433,7 @@ void QbsGroupNode::setupFolder(ProjectExplorer::FolderNode *root,
 // --------------------------------------------------------------------
 
 QbsProductNode::QbsProductNode(const qbs::ProductData *prd) :
-    QbsBaseProjectNode(prd->location().fileName),
+    QbsBaseProjectNode(prd->location().fileName()),
     m_qbsProductData(0)
 {
     setIcon(m_productIcon);
@@ -451,24 +451,24 @@ void QbsProductNode::setQbsProductData(const qbs::ProductData *prd)
         return;
 
     setDisplayName(prd->name());
-    setPath(prd->location().fileName);
-    const QString &productPath = QFileInfo(prd->location().fileName).absolutePath();
+    setPath(prd->location().fileName());
+    const QString &productPath = QFileInfo(prd->location().fileName()).absolutePath();
 
     // Set Product file node used to jump to the product
     QList<ProjectExplorer::FileNode *> files = fileNodes();
     QbsFileNode *idx = 0;
     if (files.isEmpty()) {
-        idx = new QbsFileNode(prd->location().fileName,
+        idx = new QbsFileNode(prd->location().fileName(),
                               ProjectExplorer::ProjectFileType, false,
-                              prd->location().line);
+                              prd->location().line());
         addFileNodes(QList<ProjectExplorer::FileNode *>() << idx, this);
     } else {
         // Find the QbsFileNode we added earlier:
         foreach (ProjectExplorer::FileNode *fn, files) {
             idx = qobject_cast<QbsFileNode *>(fn);
             if (idx) {
-                idx->setPath(prd->location().fileName);
-                idx->setLine(prd->location().line);
+                idx->setPath(prd->location().fileName());
+                idx->setLine(prd->location().line());
                 break;
             }
         }
@@ -505,8 +505,10 @@ QList<ProjectExplorer::RunConfiguration *> QbsProductNode::runConfigurationsFor(
     Q_UNUSED(node);
     QList<ProjectExplorer::RunConfiguration *> result;
     QbsProjectNode *pn = qobject_cast<QbsProjectNode *>(projectNode());
-    if (!isEnabled() || !pn || pn->qbsProject()->targetExecutable(*m_qbsProductData).isEmpty())
+    if (!isEnabled() || !pn || pn->qbsProject()->targetExecutable(*m_qbsProductData,
+                                                                  qbs::InstallOptions()).isEmpty()) {
         return result;
+    }
 
     foreach (ProjectExplorer::RunConfiguration *rc, pn->project()->activeTarget()->runConfigurations()) {
         QbsRunConfiguration *qbsRc = qobject_cast<QbsRunConfiguration *>(rc);
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index e44729a5062c94c0cca9b13f6ba96eedaf674c39..217467f338cc3b8b518df7b83b1be1680b04f316 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -163,11 +163,11 @@ QStringList QbsProject::files(ProjectExplorer::Project::FilesMode fileMode) cons
             foreach (const qbs::GroupData &grp, prd.groups()) {
                 foreach (const QString &file, grp.allFilePaths())
                     result.insert(file);
-                result.insert(grp.location().fileName);
+                result.insert(grp.location().fileName());
             }
-            result.insert(prd.location().fileName);
+            result.insert(prd.location().fileName());
         }
-        result.insert(m_rootProjectNode->qbsProjectData()->location().fileName);
+        result.insert(m_rootProjectNode->qbsProjectData()->location().fileName());
     }
     return result.toList();
 }
@@ -356,8 +356,8 @@ void QbsProject::generateErrors(const qbs::Error &e)
     foreach (const qbs::ErrorData &data, e.entries())
         taskHub()->addTask(ProjectExplorer::Task(ProjectExplorer::Task::Error,
                                                  data.description(),
-                                                 Utils::FileName::fromString(data.codeLocation().fileName),
-                                                 data.codeLocation().line,
+                                                 Utils::FileName::fromString(data.codeLocation().fileName()),
+                                                 data.codeLocation().line(),
                                                  ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
 }
 
@@ -370,14 +370,14 @@ void QbsProject::parse(const QVariantMap &config, const QString &dir)
 
     QTC_ASSERT(!m_qbsSetupProjectJob, return);
     qbs::SetupProjectParameters params;
-    params.buildConfiguration = m_qbsBuildConfig;
-    params.buildRoot = m_qbsBuildRoot;
-    params.projectFilePath = m_fileName;
-    params.ignoreDifferentProjectFilePath = false;
+    params.setBuildConfiguration(m_qbsBuildConfig);
+    params.setBuildRoot(m_qbsBuildRoot);
+    params.setProjectFilePath(m_fileName);
+    params.setIgnoreDifferentProjectFilePath(false);
     qbs::Preferences *prefs = QbsManager::preferences();
     const QString buildDir = qbsBuildDir();
-    params.searchPaths = prefs->searchPaths(buildDir);
-    params.pluginPaths = prefs->pluginPaths(buildDir);
+    params.setSearchPaths(prefs->searchPaths(buildDir));
+    params.setPluginPaths(prefs->pluginPaths(buildDir));
 
     m_qbsSetupProjectJob
             = qbs::Project::setupProject(params, m_manager->settings(), m_manager->logSink(), 0);
@@ -417,9 +417,9 @@ void QbsProject::updateDocuments(const qbs::ProjectData *prj)
     newFiles.insert(m_fileName); // make sure we always have the project file...
 
     if (prj) {
-        newFiles.insert(prj->location().fileName);
+        newFiles.insert(prj->location().fileName());
         foreach (const qbs::ProductData &prd, prj->products())
-            newFiles.insert(prd.location().fileName);
+            newFiles.insert(prd.location().fileName());
     }
     QSet<QString> oldFiles;
     foreach (Core::IDocument *doc, m_qbsDocuments)
diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp
index cdeed8b434b150bb202a3ac14216f011f0286160..669229ba80964f9bbb2bec5dc9c578903935212b 100644
--- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp
+++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp
@@ -202,7 +202,7 @@ QString QbsRunConfiguration::executable() const
     if (!product)
         return QString();
 
-    return pro->qbsProject()->targetExecutable(*product, installRoot());
+    return pro->qbsProject()->targetExecutable(*product, installOptions());
 }
 
 ProjectExplorer::LocalApplicationRunConfiguration::RunMode QbsRunConfiguration::runMode() const
@@ -306,6 +306,13 @@ QString QbsRunConfiguration::defaultDisplayName()
     return defaultName;
 }
 
+qbs::InstallOptions QbsRunConfiguration::installOptions() const
+{
+    if (m_currentInstallStep)
+        return m_currentInstallStep->installOptions();
+    return qbs::InstallOptions();
+}
+
 QString QbsRunConfiguration::installRoot() const
 {
     if (m_currentInstallStep)
@@ -558,7 +565,7 @@ QList<Core::Id> QbsRunConfigurationFactory::availableCreationIds(ProjectExplorer
         return result;
 
     foreach (const qbs::ProductData &product, project->qbsProjectData()->products()) {
-        if (!project->qbsProject()->targetExecutable(product, QString()).isEmpty())
+        if (!project->qbsProject()->targetExecutable(product, qbs::InstallOptions()).isEmpty())
             result << Core::Id::fromString(QString::fromLatin1(QBS_RC_PREFIX) + product.name());
     }
     return result;
diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h
index 30cc33205adbba05b51e3451e88140b7a003bfb7..cb697bef96737299c69a497d0ca6de4501d9698d 100644
--- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h
+++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h
@@ -43,6 +43,10 @@ class QRadioButton;
 class QComboBox;
 QT_END_NAMESPACE
 
+namespace qbs {
+class InstallOptions;
+}
+
 namespace Utils {
 class PathChooser;
 class DetailsWidget;
@@ -112,6 +116,7 @@ private:
     void setCommandLineArguments(const QString &argumentsString);
     QString rawCommandLineArguments() const;
     QString defaultDisplayName();
+    qbs::InstallOptions installOptions() const;
     QString installRoot() const;
 
     void ctor();
diff --git a/src/plugins/qbsprojectmanager/qbsstep.cpp b/src/plugins/qbsprojectmanager/qbsstep.cpp
index 4fe25df5f966d72394b66ec19456e15aa7278925..cd736678ad3e62f7d31c77038d7e2394f23a78f8 100644
--- a/src/plugins/qbsprojectmanager/qbsstep.cpp
+++ b/src/plugins/qbsprojectmanager/qbsstep.cpp
@@ -65,7 +65,7 @@ QbsStep::QbsStep(ProjectExplorer::BuildStepList *bsl, Core::Id id) :
     ProjectExplorer::BuildStep(bsl, id),
     m_job(0)
 {
-    m_qbsBuildOptions.maxJobCount = QbsManager::preferences()->jobs();
+    m_qbsBuildOptions.setMaxJobCount(QbsManager::preferences()->jobs());
 }
 
 QbsStep::QbsStep(ProjectExplorer::BuildStepList *bsl, const QbsStep *other) :
@@ -137,17 +137,17 @@ void QbsStep::cancel()
 
 bool QbsStep::dryRun() const
 {
-    return m_qbsBuildOptions.dryRun;
+    return m_qbsBuildOptions.dryRun();
 }
 
 bool QbsStep::keepGoing() const
 {
-    return m_qbsBuildOptions.keepGoing;
+    return m_qbsBuildOptions.keepGoing();
 }
 
 int QbsStep::maxJobs() const
 {
-    return m_qbsBuildOptions.maxJobCount;
+    return m_qbsBuildOptions.maxJobCount();
 }
 
 bool QbsStep::fromMap(const QVariantMap &map)
@@ -155,12 +155,12 @@ bool QbsStep::fromMap(const QVariantMap &map)
     if (!ProjectExplorer::BuildStep::fromMap(map))
         return false;
 
-    m_qbsBuildOptions.dryRun = map.value(QLatin1String(QBS_DRY_RUN)).toBool();
-    m_qbsBuildOptions.keepGoing = map.value(QLatin1String(QBS_KEEP_GOING)).toBool();
-    m_qbsBuildOptions.maxJobCount = map.value(QLatin1String(QBS_MAXJOBCOUNT)).toInt();
+    m_qbsBuildOptions.setDryRun(map.value(QLatin1String(QBS_DRY_RUN)).toBool());
+    m_qbsBuildOptions.setKeepGoing(map.value(QLatin1String(QBS_KEEP_GOING)).toBool());
+    m_qbsBuildOptions.setMaxJobCount(map.value(QLatin1String(QBS_MAXJOBCOUNT)).toInt());
 
-    if (m_qbsBuildOptions.maxJobCount <= 0)
-        m_qbsBuildOptions.maxJobCount = QbsManager::preferences()->jobs();
+    if (m_qbsBuildOptions.maxJobCount() <= 0)
+        m_qbsBuildOptions.setMaxJobCount(QbsManager::preferences()->jobs());
 
     return true;
 }
@@ -168,9 +168,9 @@ bool QbsStep::fromMap(const QVariantMap &map)
 QVariantMap QbsStep::toMap() const
 {
     QVariantMap map = ProjectExplorer::BuildStep::toMap();
-    map.insert(QLatin1String(QBS_DRY_RUN), m_qbsBuildOptions.dryRun);
-    map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsBuildOptions.keepGoing);
-    map.insert(QLatin1String(QBS_MAXJOBCOUNT), m_qbsBuildOptions.maxJobCount);
+    map.insert(QLatin1String(QBS_DRY_RUN), m_qbsBuildOptions.dryRun());
+    map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsBuildOptions.keepGoing());
+    map.insert(QLatin1String(QBS_MAXJOBCOUNT), m_qbsBuildOptions.maxJobCount());
     return map;
 }
 
@@ -180,7 +180,7 @@ void QbsStep::jobDone(bool success)
     if (m_job) {
         foreach (const qbs::ErrorData &data, m_job->error().entries())
             createTaskAndOutput(ProjectExplorer::Task::Error, data.description(),
-                                data.codeLocation().fileName, data.codeLocation().line);
+                                data.codeLocation().fileName(), data.codeLocation().line());
         m_job->deleteLater();
         m_job = 0;
     }
@@ -218,25 +218,25 @@ void QbsStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type, const QS
 
 void QbsStep::setDryRun(bool dr)
 {
-    if (m_qbsBuildOptions.dryRun == dr)
+    if (m_qbsBuildOptions.dryRun() == dr)
         return;
-    m_qbsBuildOptions.dryRun = dr;
+    m_qbsBuildOptions.setDryRun(dr);
     emit qbsBuildOptionsChanged();
 }
 
 void QbsStep::setKeepGoing(bool kg)
 {
-    if (m_qbsBuildOptions.keepGoing == kg)
+    if (m_qbsBuildOptions.keepGoing() == kg)
         return;
-    m_qbsBuildOptions.keepGoing = kg;
+    m_qbsBuildOptions.setKeepGoing(kg);
     emit qbsBuildOptionsChanged();
 }
 
 void QbsStep::setMaxJobs(int jobcount)
 {
-    if (m_qbsBuildOptions.maxJobCount == jobcount)
+    if (m_qbsBuildOptions.maxJobCount() == jobcount)
         return;
-    m_qbsBuildOptions.maxJobCount = jobcount;
+    m_qbsBuildOptions.setMaxJobCount(jobcount);
     emit qbsBuildOptionsChanged();
 }
 
diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
index 2e71543baa7364816937c43530a551077d1d86ab..3a6ba896345380b1e41d71cfef9ed934643b84e4 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
@@ -275,9 +275,9 @@ QList<PropertyInfo> getQmlTypes(const CppComponentValue *objectValue, const Cont
         const CppComponentValue * qmlObjectValue = value_cast<CppComponentValue>(prototype);
 
         if (qmlObjectValue)
-            propertyList.append(getQmlTypes(qmlObjectValue, context, false, rec + 1));
+            propertyList.append(getQmlTypes(qmlObjectValue, context, false, rec));
         else
-            propertyList.append(getObjectTypes(prototype, context, false, rec + 1));
+            propertyList.append(getObjectTypes(prototype, context, false, rec));
     }
 
     return propertyList;
@@ -349,9 +349,9 @@ QList<PropertyInfo> getObjectTypes(const ObjectValue *objectValue, const Context
         const CppComponentValue * qmlObjectValue = value_cast<CppComponentValue>(prototype);
 
         if (qmlObjectValue)
-            propertyList.append(getQmlTypes(qmlObjectValue, context, local, rec + 1));
+            propertyList.append(getQmlTypes(qmlObjectValue, context, local, rec));
         else
-            propertyList.append(getObjectTypes(prototype, context, local, rec + 1));
+            propertyList.append(getObjectTypes(prototype, context, local, rec));
     }
 
     return propertyList;
diff --git a/src/shared/qbs b/src/shared/qbs
index 40c966d00bb2d33b7fc66fe1a68df2fc541efd1e..32ae53690c01e5269ac2a9ad0dadf549ce04ee3f 160000
--- a/src/shared/qbs
+++ b/src/shared/qbs
@@ -1 +1 @@
-Subproject commit 40c966d00bb2d33b7fc66fe1a68df2fc541efd1e
+Subproject commit 32ae53690c01e5269ac2a9ad0dadf549ce04ee3f