diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
index 19408dbb091726348fec41b1343738d325b86efb..8abc6eac7d60d5dbabe390cd974ebc3cd5109550 100644
--- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
+++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
@@ -10,6 +10,7 @@ class QmlProjectItemPrivate : public QObject {
 public:
     QString sourceDirectory;
     QStringList importPaths;
+    QStringList absoluteImportPaths;
 
     QList<QmlFileFilterItem*> qmlFileFilters() const;
 
@@ -77,23 +78,34 @@ void QmlProjectItem::setSourceDirectory(const QString &directoryPath)
         }
     }
 
+    setImportPaths(d->importPaths);
+
     emit sourceDirectoryChanged();
 }
 
 QStringList QmlProjectItem::importPaths() const
 {
     Q_D(const QmlProjectItem);
-    return d->importPaths;
+    return d->absoluteImportPaths;
 }
 
 void QmlProjectItem::setImportPaths(const QStringList &importPaths)
 {
     Q_D(QmlProjectItem);
 
-    if (d->importPaths == importPaths)
+    if (d->importPaths != importPaths)
+        d->importPaths = importPaths;
+
+    // convert to absolute paths
+    QStringList absoluteImportPaths;
+    const QDir sourceDir(sourceDirectory());
+    foreach (const QString &importPath, importPaths)
+        absoluteImportPaths += QDir::cleanPath(sourceDir.absoluteFilePath(importPath));
+
+    if (d->absoluteImportPaths == absoluteImportPaths)
         return;
 
-    d->importPaths = importPaths;
+    d->absoluteImportPaths = absoluteImportPaths;
     emit importPathsChanged();
 }
 
diff --git a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp
index 4edc8857c27cf8fd5635f05dfa6bbd71e6ad1f88..eafbc0385ba642b6ddcb629480723e0b2f0160dc 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp
@@ -156,7 +156,7 @@ Core::GeneratedFiles QmlProjectApplicationWizard::generateFiles(const QWizard *w
             << "    }" << endl
             //: Comment added to generated .qmlproject file
             << "    /* " << tr("List of plugin directories passed to QML runtime", "qmlproject Template") << " */" << endl
-            << "    // importPaths: [ \" ../exampleplugin \" ]" << endl
+            << "    // importPaths: [ \"../exampleplugin\" ]" << endl
             << "}" << endl;
     }
     Core::GeneratedFile generatedCreatorFile(creatorFileName);
diff --git a/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp b/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp
index a8d1349ac7bac70de7f0144e899092fad774608f..39afe447062bca9cfd59728474a22611c2f2d6d7 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp
@@ -172,7 +172,7 @@ Core::GeneratedFiles QmlProjectImportWizard::generateFiles(const QWizard *w,
             << "    }" << endl
             //: Comment added to generated .qmlproject file
             << "    /* " << tr("List of plugin directories passed to QML runtime", "qmlproject Template") << " */" << endl
-            << "    // importPaths: [ \" ../exampleplugin \" ]" << endl
+            << "    // importPaths: [ \"../exampleplugin\" ]" << endl
             << "}" << endl;
     }
     Core::GeneratedFile generatedCreatorFile(creatorFileName);
diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index 769dddd60a4424fa987b3420a2e5925cb76dcec4..7d7c1efa7bb30a2d33a76c78de9fcb557a8665f5 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -1048,10 +1048,28 @@ void ProFileEvaluator::Private::visitProVariable(
                     m_filevaluemap[currentProFile()][varName] = varVal;
                 }
             } else {
-                // We are greedy for values.
                 zipEmpty(&varVal);
-                valuesRef(varName) += varVal;
-                m_filevaluemap[currentProFile()][varName] += varVal;
+                if (!varVal.isEmpty()) {
+                    // We are greedy for values. But avoid exponential growth.
+                    ProStringList &v = valuesRef(varName);
+                    if (v.isEmpty()) {
+                        v = varVal;
+                    } else {
+                        ProStringList old = v;
+                        v = varVal;
+                        QSet<ProString> has;
+                        has.reserve(v.size());
+                        foreach (const ProString &s, v)
+                            has.insert(s);
+                        v.reserve(v.size() + old.size());
+                        foreach (const ProString &s, old)
+                            if (!has.contains(s))
+                                v << s;
+                    }
+                    // These values will not be used for further processing inside
+                    // the evaluator. Duplicate elimination happens later.
+                    m_filevaluemap[currentProFile()][varName] += varVal;
+                }
             }
             break;
         case TokAppendUnique:    // *=
@@ -3140,7 +3158,7 @@ ProFileEvaluator::TemplateType ProFileEvaluator::templateType() const
 {
     const ProStringList &templ = d->values(statics.strTEMPLATE);
     if (templ.count() >= 1) {
-        const QString &t = templ.last().toQString();
+        const QString &t = templ.at(0).toQString();
         if (!t.compare(QLatin1String("app"), Qt::CaseInsensitive))
             return TT_Application;
         if (!t.compare(QLatin1String("lib"), Qt::CaseInsensitive))