diff --git "a/C:\\Users\\PROGRA~1\\AppData\\Local\\Temp\\loaBD97.tmp\\loader-HEAD-left.cpp" "b/C:\\QtSDK\\qbs\\qbs\\src\\lib\\language\\loader.cpp"
index cdb1427..1d01d43 100644
--- "a/C:\\Users\\PROGRA~1\\AppData\\Local\\Temp\\loaBD97.tmp\\loader-HEAD-left.cpp"
+++ "b/C:\\QtSDK\\qbs\\qbs\\src\\lib\\language\\loader.cpp"
@@ -920,6 +920,9 @@ void Loader::setupInternalPrototype(LanguageObject *object, EvaluationObject *ev
         product += PropertyDeclaration("destination", PropertyDeclaration::String);
         product += PropertyDeclaration("consoleApplication", PropertyDeclaration::Boolean);
         product += PropertyDeclaration("files", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
+        product += PropertyDeclaration("dirs", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
+        product += PropertyDeclaration("dirMasks", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
+        product += PropertyDeclaration("dirExceptions", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
         product += PropertyDeclaration("module", PropertyDeclaration::Variant);
         product += PropertyDeclaration("modules", PropertyDeclaration::Variant);
         product += PropertyDeclaration(name_moduleSearchPaths, PropertyDeclaration::Variant);
@@ -933,6 +936,9 @@ void Loader::setupInternalPrototype(LanguageObject *object, EvaluationObject *ev
         QList<PropertyDeclaration> group;
         group += conditionProperty;
         group += PropertyDeclaration("files", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
+        group += PropertyDeclaration("dirs", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
+        group += PropertyDeclaration("dirMasks", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
+        group += PropertyDeclaration("dirExceptions", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
         group += PropertyDeclaration("fileTags", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
         group += PropertyDeclaration("prefix", PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig);
         builtinDeclarations.insert(name_Group, group);
@@ -1796,7 +1802,8 @@ ResolvedProject::Ptr Loader::resolveProject(const QString &buildDirectoryRoot,
         // handle the 'Product.files' property
         {
             QScriptValue files = data.product->scope->property("files");
-            if (files.isValid()) {
+            QScriptValue dirs  = data.product->scope->property("dirs");
+            if (files.isValid() || dirs.isValid()) {
                 resolveGroup(rproduct, data.product, data.product);
             }
         }
@@ -2118,6 +2125,31 @@ void Loader::resolveGroup(ResolvedProduct::Ptr rproduct, EvaluationObject *produ
         artifact->fileTags = fileTags;
         rproduct->sources.insert(artifact);
     }
+
+    QStringList dirs = group->scope->stringListValue("dirs");
+    QStringList masks = group->scope->stringListValue("dirMasks");
+    QStringList dirExceptions = group->scope->stringListValue("dirExceptions");
+
+    foreach (const QString &dirName, dirs) {
+        QString sourceDir = FileInfo::resolvePath(rproduct->sourceDirectory, dirName);
+        QDir dir(sourceDir);
+        dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+        if (!masks.isEmpty())
+            dir.setNameFilters(masks);
+
+        QFileInfoList list = dir.entryInfoList();
+        for (int i = 0; i < list.size(); ++i) {
+            QFileInfo fileInfo = list.at(i);
+            if (dirExceptions.indexOf(fileInfo.fileName()) != -1) continue;
+
+            SourceArtifact::Ptr artifact(new SourceArtifact);
+            artifact->configuration = configuration;
+            artifact->absoluteFilePath = fileInfo.canonicalFilePath();
+            artifact->fileTags = fileTags;
+            rproduct->sources.insert(artifact);
+        }
+
+    }
 }
 
 void Loader::resolveProductModule(ResolvedProduct::Ptr rproduct, EvaluationObject *productModule)
