diff --git a/configure b/configure
index 81bf48363481d052a3972caf5634b5bd9719a06a..789ba4cc74187758c4b3d9881e1982acbac9fc3e 100755
--- a/configure
+++ b/configure
@@ -753,21 +753,6 @@ while [ "$#" -gt 0 ]; do
     opensource)
         COMMERCIAL_USER="no"
         ;;
-    feature-*)
-        FEATURE=`echo $VAR | sed 's,^[^-]*-\([^-]*\),\1,' | tr 'abcdefghijklmnopqrstuvwxyz-' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
-        if grep "^Feature: *${FEATURE} *\$" "$relpath"/src/corelib/global/qfeatures.txt >/dev/null 2>&1; then
-            F=`echo $VAR | sed 's,^[^-]*-\([^-]*\),\1,'`
-            if [ "$VAL" = "no" ]; then
-                F="no-$F"
-            elif [ "$VAL" != "yes" ] && [ "$VAL" != "unknown" ]; then
-                UNKNOWN_OPT=yes
-            fi
-            CFG_FEATURES="$CFG_FEATURES $F"
-        else
-            echo "ERROR: Unknown feature $FEATURE"
-            UNKNOWN_OPT=yes
-        fi
-        ;;
     confirm-license)
         if [ "$VAL" = "yes" ]; then
             OPT_CONFIRM_LICENSE="$VAL"
@@ -1894,7 +1879,6 @@ fi
 
 cat > "$outpath/config.tests/configure.cfg" <<EOF
 # Feature defaults set by configure command line
-config.input.extra_features = $CFG_FEATURES
 config.input.qt_edition = $Edition
 config.input.qt_licheck = $Licheck
 config.input.qt_release_date = $ReleaseDate
diff --git a/configure.json b/configure.json
index f26187f63315bbcde0c7d5b65e4ae23196158afd..85ef23a186cb758128e069854a96f4d1b71a4594 100644
--- a/configure.json
+++ b/configure.json
@@ -11,6 +11,7 @@
         "src/network",
         "src/sql",
         "src/gui",
+        "src/xml",
         "src/widgets",
         "src/printsupport"
     ],
@@ -933,6 +934,8 @@
         },
         "concurrent": {
             "label": "Qt Concurrent",
+            "purpose": "Provides a high-level multi-threading API.",
+            "section": "Kernel",
             "output": [ "publicFeature", "feature" ]
         },
         "dbus": {
@@ -1032,10 +1035,6 @@
             "autoDetect": false,
             "condition": "tests.wmf",
             "output": [ "publicQtConfig" ]
-        },
-        "extra_features": {
-            "comment": "### remove, once qfeatures.txt is ported to the new system",
-            "output": [ "extraFeatures" ]
         }
     },
 
diff --git a/configure.pri b/configure.pri
index e20ccd8bf46b03705aef3e2501a94794cc0a9cf9..7ec845375e5890f29fc0e424d48c77b82f80fa08 100644
--- a/configure.pri
+++ b/configure.pri
@@ -379,43 +379,6 @@ defineTest(qtConfOutput_compilerVersion) {
     export($${currentConfig}.output.publicPro)
 }
 
-# should go away when qfeatures.txt is ported
-defineTest(qtConfOutput_extraFeatures) {
-    isEmpty(config.input.extra_features): return()
-
-    # write to qconfig.pri
-    $${currentConfig}.output.publicPro += "$${LITERAL_HASH}ifndef QT_BOOTSTRAPPED"
-    for (f, config.input.extra_features) {
-        feature = $$replace(f, "^no-", "")
-        FEATURE = $$upper($$replace(feature, -, _))
-        contains(f, "^no-.*") {
-            $${currentConfig}.output.publicPro += \
-                "$${LITERAL_HASH}ifndef QT_NO_$$FEATURE" \
-                "$${LITERAL_HASH}define QT_NO_$$FEATURE" \
-                "$${LITERAL_HASH}endif"
-        } else {
-            $${currentConfig}.output.publicPro += \
-                "$${LITERAL_HASH}if defined(QT_$$FEATURE) && defined(QT_NO_$$FEATURE)" \
-                "$${LITERAL_HASH}undef QT_$$FEATURE" \
-                "$${LITERAL_HASH}elif !defined(QT_$$FEATURE) && !defined(QT_NO_$$FEATURE)" \
-                "$${LITERAL_HASH}define QT_$$FEATURE" \
-                "$${LITERAL_HASH}endif"
-        }
-    }
-    $${currentConfig}.output.publicPro += "$${LITERAL_HASH}endif"
-    export($${currentConfig}.output.publicPro)
-
-    # write to qmodule.pri
-    disabled_features =
-    for (f, config.input.extra_features) {
-        feature = $$replace(f, "^no-", "")
-        FEATURE = $$upper($$replace(feature, -, _))
-        contains(f, "^no-.*"): disabled_features += $$FEATURE
-    }
-    !isEmpty(disabled_features): qtConfOutputVar(assign, "privatePro", QT_NO_DEFINES, $$disabled_features)
-}
-
-
 defineTest(qtConfOutput_compilerFlags) {
     # this output also exports the variables locally, so that subsequent compiler tests can use them
 
diff --git a/examples/network/network.pro b/examples/network/network.pro
index 759f730af37ad393eb07b9238ac564c55427f2aa..5ad5f1939f3e5985d99acf74f28fe06795a6629e 100644
--- a/examples/network/network.pro
+++ b/examples/network/network.pro
@@ -19,8 +19,7 @@ qtHaveModule(widgets) {
                 multicastreceiver \
                 multicastsender
 
-    load(qfeatures)
-    !contains(QT_DISABLED_FEATURES, bearermanagement) {
+    qtConfig(bearermanagement) {
         # no QProcess
         !vxworks:!qnx:!winrt:!integrity:!uikit: SUBDIRS += network-chat
 
diff --git a/examples/widgets/tools/tools.pro b/examples/widgets/tools/tools.pro
index f3cbd73d9836b685d0d273d2da061c7c884042d5..dd8401567bd7a5bfd0e7ca238782e0ce21f85339 100644
--- a/examples/widgets/tools/tools.pro
+++ b/examples/widgets/tools/tools.pro
@@ -16,8 +16,7 @@ SUBDIRS       = \
 
 contains(DEFINES, QT_NO_TRANSLATION): SUBDIRS -= i18n
 
-load(qfeatures)
-contains(QT_DISABLED_FEATURES, library) {
+!qtConfig(library) {
     SUBDIRS -= \
         echoplugin \
         plugandpaint
diff --git a/mkspecs/common/linux-android.conf b/mkspecs/common/linux-android.conf
index fec008cb45f74592054383a02a43c420e0e31f3f..b8e052d1eca38af78b6fdd1d2d7f7f0d227bb187 100644
--- a/mkspecs/common/linux-android.conf
+++ b/mkspecs/common/linux-android.conf
@@ -6,7 +6,6 @@ QMAKE_PLATFORM         += android
 include(linux.conf)
 include(gcc-base-unix.conf)
 
-DEFINES                += QT_NO_PRINTER QT_NO_PRINTDIALOG
 QT_QPA_DEFAULT_PLATFORM = minimal
 
 NDK_ROOT = $$(ANDROID_NDK_ROOT)
diff --git a/mkspecs/common/uikit.conf b/mkspecs/common/uikit.conf
index edc0eddf004adab78cdd8af6c0e52da2e27937c0..bfbab36db6431afe50ad55ff10aa5895d6f58836 100644
--- a/mkspecs/common/uikit.conf
+++ b/mkspecs/common/uikit.conf
@@ -6,6 +6,6 @@ QMAKE_PLATFORM         += uikit
 CONFIG                 += bitcode reduce_exports
 
 INCLUDEPATH            += $$PWD/uikit
-DEFINES                += DARWIN_NO_CARBON QT_NO_PRINTER QT_NO_PRINTDIALOG
+DEFINES                += DARWIN_NO_CARBON
 
 include(mac.conf)
diff --git a/mkspecs/common/winrt_winphone/qmake.conf b/mkspecs/common/winrt_winphone/qmake.conf
index b5e0c7cc71c787be1c582fb106492e7d23fec53a..05c9bd39a5dac3ef00992b024366c106df77b7f5 100644
--- a/mkspecs/common/winrt_winphone/qmake.conf
+++ b/mkspecs/common/winrt_winphone/qmake.conf
@@ -10,8 +10,7 @@ MAKEFILE_GENERATOR      = MSBUILD
 QMAKE_COMPILER          = msvc
 QMAKE_PLATFORM          = winrt win32
 CONFIG                  = package_manifest $$CONFIG incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target rtti
-DEFINES                += UNICODE WIN32 QT_LARGEFILE_SUPPORT Q_BYTE_ORDER=Q_LITTLE_ENDIAN \
-                          QT_NO_PRINTER QT_NO_PRINTDIALOG # TODO: Remove when printing is re-enabled
+DEFINES                += UNICODE WIN32 QT_LARGEFILE_SUPPORT Q_BYTE_ORDER=Q_LITTLE_ENDIAN
 
 DEPLOYMENT_PLUGIN      += qwinrt
 
diff --git a/mkspecs/features/qfeatures.prf b/mkspecs/features/qfeatures.prf
deleted file mode 100644
index 15ef5c5be00ee1c42732e2d2f37cec31898e3e3d..0000000000000000000000000000000000000000
--- a/mkspecs/features/qfeatures.prf
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file needs to be loaded explicitly, as the evaluation is relatively
-# expensive, and not many projects will actually need it.
-QMAKE_QT_FEATURES = $$[QT_HOST_DATA/get]/mkspecs/qfeatures.pri
-include($$QMAKE_QT_FEATURES) | error("Failed to load $$QMAKE_QT_FEATURES")
diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf
index af8a0e259d927de99fd219e09318e20036e65f9a..e34d7ad194c2165be4eeef5d6c03dca886d74ff7 100644
--- a/mkspecs/features/qt_configure.prf
+++ b/mkspecs/features/qt_configure.prf
@@ -285,8 +285,20 @@ defineTest(qtConfParseCommandLine) {
         }
         # handle builtin [-no]-feature-xxx
         isEmpty(type):contains(opt, "feature-(.*)") {
-            # simply skip for now
-            next()
+            opt ~= s,^feature-,,
+            found = false
+            for (cc, allConfigs) {
+                contains($${cc}.features._KEYS_, $$opt) {
+                    found = true
+                    break()
+                }
+            }
+            !$$found {
+                qtConfAddError("Enabling/Disabling unknown feature '$$opt'.")
+                return()
+            }
+            # this is a boolean enabling/disabling the corresponding feature
+            type = boolean
         }
 
         isEmpty(type) {
diff --git a/mkspecs/integrity-armv7-imx6/qmake.conf b/mkspecs/integrity-armv7-imx6/qmake.conf
index 7a1ee461f2677094472e11cbc130fcb979cb0d4e..3bf2abd844f5ea67dd3ae647b30852569d493a0f 100644
--- a/mkspecs/integrity-armv7-imx6/qmake.conf
+++ b/mkspecs/integrity-armv7-imx6/qmake.conf
@@ -4,7 +4,6 @@
 
 include(../common/ghs-integrity-armv7.conf)
 
-DEFINES += QT_NO_CLIPBOARD
 DEFINES += QT_STATICPLUGIN
 
 QTPLUGIN.platforms += qeglfs qeglfs-viv-integration
diff --git a/mkspecs/integrity-armv7/qmake.conf b/mkspecs/integrity-armv7/qmake.conf
index 0cac2ebdc0c572f7b514e980945b36e8b2d2fc05..7a2ffaba14d6d8f8a60716b30cb343d643c57e05 100644
--- a/mkspecs/integrity-armv7/qmake.conf
+++ b/mkspecs/integrity-armv7/qmake.conf
@@ -4,7 +4,6 @@
 
 include(../common/ghs-integrity-armv7.conf)
 
-DEFINES += QT_NO_CLIPBOARD
 DEFINES += QT_STATICPLUGIN
 
 QTPLUGIN.platforms += integrityfb
diff --git a/mkspecs/integrity-x86/qmake.conf b/mkspecs/integrity-x86/qmake.conf
index 4a5cfcc49d129c4a16eedc1caba8265e346c135a..13d4a6c08233ae3082a8adbe90c7d373e15ce8bc 100644
--- a/mkspecs/integrity-x86/qmake.conf
+++ b/mkspecs/integrity-x86/qmake.conf
@@ -5,7 +5,6 @@
 include(../common/ghs-integrity-x86.conf)
 
 QMAKE_CFLAGS += -cpu=Corei
-DEFINES += QT_NO_CLIPBOARD
 DEFINES += QT_STATICPLUGIN
 
 QTPLUGIN.platforms += integrityfb
diff --git a/mkspecs/qnx-aarch64le-qcc/qmake.conf b/mkspecs/qnx-aarch64le-qcc/qmake.conf
index 6d72bd459ed3fa968440ef0a9cbb57d1f84feab2..5e3123bece729378acef80d343b3ba238262e96c 100644
--- a/mkspecs/qnx-aarch64le-qcc/qmake.conf
+++ b/mkspecs/qnx-aarch64le-qcc/qmake.conf
@@ -2,7 +2,7 @@
 # qmake configuration for qnx aarch64le systems
 #
 
-DEFINES += QT_NO_CLIPBOARD _FORTIFY_SOURCE=2
+DEFINES += _FORTIFY_SOURCE=2
 
 QMAKE_LFLAGS_SHLIB += -Wl,-z,relro -Wl,-z,now
 
diff --git a/mkspecs/qnx-armle-v7-qcc/qmake.conf b/mkspecs/qnx-armle-v7-qcc/qmake.conf
index b77455044cc5d696d67699f7499fb1d9d55bb723..a21e5bcad3913c6fb199ca4cb46f0b73ce5ab0b7 100644
--- a/mkspecs/qnx-armle-v7-qcc/qmake.conf
+++ b/mkspecs/qnx-armle-v7-qcc/qmake.conf
@@ -3,5 +3,3 @@
 #
 
 include(../common/qcc-base-qnx-armle-v7.conf)
-
-DEFINES += QT_NO_CLIPBOARD
diff --git a/mkspecs/qnx-x86-64-qcc/qmake.conf b/mkspecs/qnx-x86-64-qcc/qmake.conf
index ebedeceb460ec8531662bb3975ced2ca1aed1426..2a01ed14054e8e3e6d62c34507541fb33cb0ce27 100644
--- a/mkspecs/qnx-x86-64-qcc/qmake.conf
+++ b/mkspecs/qnx-x86-64-qcc/qmake.conf
@@ -2,8 +2,6 @@
 # qmake configuration for qnx x86-64 systems
 #
 
-DEFINES += QT_NO_CLIPBOARD
-
 QMAKE_LFLAGS_SHLIB += -Wl,-z,relro -Wl,-z,now
 
 include(../common/qcc-base-qnx-x86-64.conf)
diff --git a/mkspecs/qnx-x86-qcc/qmake.conf b/mkspecs/qnx-x86-qcc/qmake.conf
index 36a3ba2ff3e5bedc53cd45b79aad1db3672ca898..3daadf4f02ba9ce84c82480cb7c40976996beb07 100644
--- a/mkspecs/qnx-x86-qcc/qmake.conf
+++ b/mkspecs/qnx-x86-qcc/qmake.conf
@@ -3,5 +3,3 @@
 #
 
 include(../common/qcc-base-qnx-x86.conf)
-
-DEFINES += QT_NO_CLIPBOARD
diff --git a/qtbase.pro b/qtbase.pro
index fce2c9fa6c64532bce30ceaec42dfde43d3d5e0f..d2d308870d8eb116be5707df6745c8ec3a365e6e 100644
--- a/qtbase.pro
+++ b/qtbase.pro
@@ -75,90 +75,10 @@ prefix_build|!equals(PWD, $$OUT_PWD) {
 
 }
 
-# Generate qfeatures.h
-features =
-lines = $$cat("src/corelib/global/qfeatures.txt", lines)
-for (line, lines) {
-    t = $$replace(line, "^Feature: (\\S+)\\s*$", "\\1")
-    !isEqual(t, $$line) {
-        feature = $$t
-        features += $$t
-    } else {
-        t = $$replace(line, "^Requires: (.*)$", "\\1")
-        !isEqual(t, $$line) {
-            features.$${feature}.depends = $$replace(t, \\s+$, )
-        } else {
-            t = $$replace(line, "^Name: (.*)$", "\\1")
-            !isEqual(t, $$line) {
-                features.$${feature}.name = $$replace(t, \\s+$, )
-            }
-        }
-    }
-}
-features = $$sort_depends(features, features.)
-features = $$reverse(features)
-FEATURES_H = \
-    "/*" \
-    " * All feature dependencies." \
-    " *" \
-    " * This list is generated by qmake from <qtbase>/src/corelib/global/qfeatures.txt" \
-    " */"
-FEATURES_PRI =
-for (ft, features) {
-    !isEmpty(features.$${ft}.depends) {
-        FEATURES_H += \
-            "$${LITERAL_HASH}if !defined(QT_NO_$$ft) && ($$join($$list($$split(features.$${ft}.depends)), ") || defined(QT_NO_", "defined(QT_NO_", ")"))" \
-            "$${LITERAL_HASH}  define QT_NO_$$ft" \
-            "$${LITERAL_HASH}endif"
-        FEATURES_PRI += \
-            "contains(QT_DISABLED_FEATURES, "$$lower($$join($$list($$replace(features.$${ft}.depends, _, -)), "|"))"): \\" \
-            "    QT_DISABLED_FEATURES += $$lower($$replace(ft, _, -))"
-    }
-}
-write_file($$OUT_PWD/src/corelib/global/qfeatures.h, FEATURES_H)|error()
-# Create forwarding header
-FWD_FEATURES_H = \
-    '$${LITERAL_HASH}include "../../src/corelib/global/qfeatures.h"'
-write_file($$OUT_PWD/include/QtCore/qfeatures.h, FWD_FEATURES_H)|error()
-
-no_features =
-lines = $$cat($$OUT_PWD/src/corelib/global/qconfig.h, lines)
-for (line, lines) {
-    # We ignore all defines that don't follow the #ifndef + indent pattern.
-    # This makes it possible to have unchecked defines which are no features.
-    t = $$replace(line, "^$${LITERAL_HASH}  define QT_NO_(\\S+)\\s*$", "\\1")
-    !isEqual(t, $$line) {
-        isEmpty(features.$${t}.name): \
-            error("qconfig.h disables unknown feature $$t")
-        no_features += $$t
-    }
-}
-for (def, QT_NO_DEFINES) {
-    !isEmpty(features.$${def}.name): \
-        no_features += $$def
-}
-no_features = $$unique(no_features)
-
-# Don't simply add these to QT_CONFIG, as then one might expect them to be there without load(qfeatures).
-# And we don't want to do that automatically, as the dynamic dependency resolution is somewhat expensive.
-FEATURES_PRI = \
-    "$${LITERAL_HASH} Features disabled by configure:" \
-    "QT_DISABLED_FEATURES =$$lower($$join($$list($$replace(no_features, _, -)), " ", " "))" \
-    "$$escape_expand(\\n)$${LITERAL_HASH} Dependencies derived from <qtbase>/src/corelib/global/qfeatures.txt:" \
-    $$FEATURES_PRI \
-    "QT_DISABLED_FEATURES = \$\$unique(QT_DISABLED_FEATURES)"
-write_file($$OUT_PWD/mkspecs/qfeatures.pri, FEATURES_PRI)|error()
-
-# Files created by us
-QMAKE_DISTCLEAN += \
-    src/corelib/global/qfeatures.h \
-    include/QtCore/qfeatures.h \
-    mkspecs/qfeatures.pri
-
 #mkspecs
 mkspecs.path = $$[QT_HOST_DATA]/mkspecs
 mkspecs.files = \
-    $$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri $$OUT_PWD/mkspecs/qfeatures.pri \
+    $$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri \
     $$OUT_PWD/mkspecs/qdevice.pri $$OUT_PWD/mkspecs/qhost.pri \
     $$files($$PWD/mkspecs/*)
 mkspecs.files -= $$PWD/mkspecs/modules $$PWD/mkspecs/modules-inst
diff --git a/src/corelib/configure.json b/src/corelib/configure.json
index 887e1ea5bf8bde75cd3e0a19474a8139cc43fac3..b0c78f512284d3295df3a654ce40d0419cd05d69 100644
--- a/src/corelib/configure.json
+++ b/src/corelib/configure.json
@@ -244,6 +244,8 @@
         },
         "iconv": {
             "label": "iconv",
+            "purpose": "Provides internationalization on Unix.",
+            "section": "Internationalization",
             "condition": "features.posix-libiconv || features.sun-libiconv || features.gnu-libiconv",
             "output": [ "privateFeature", "feature" ]
         },
@@ -302,6 +304,8 @@
         },
         "mimetype": {
             "label": "Mimetype handling",
+            "purpose": "Provides MIME type handling.",
+            "section": "Utilities",
             "output": [ "publicFeature", "feature" ]
         },
         "system-pcre": {
@@ -380,6 +384,179 @@
                 "publicQtConfig",
                 { "type": "define", "name": "QT_THREADSAFE_CLOEXEC", "value": 1 }
             ]
+        },
+        "properties": {
+            "label": "Properties",
+            "purpose": "Supports scripting Qt-based applications.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "regularexpression": {
+            "label": "QRegularExpression",
+            "purpose": "Provides an API to Perl-compatible regular expressions.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "sharedmemory": {
+            "label": "QSharedMemory",
+            "purpose": "Provides access to a shared memory segment.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "systemsemaphore": {
+            "label": "QSystemSemaphore",
+            "purpose": "Provides a general counting system semaphore.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "xmlstream": {
+            "label": "XML Streaming APIs",
+            "purpose": "Provides a simple streaming API for XML.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "xmlstreamreader": {
+            "label": "QXmlStreamReader",
+            "purpose": "Provides a well-formed XML parser with a simple streaming API.",
+            "section": "Kernel",
+            "condition": "features.xmlstream",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "xmlstreamwriter": {
+            "label": "QXmlStreamWriter",
+            "purpose": "Provides a XML writer with a simple streaming API.",
+            "section": "Kernel",
+            "condition": "features.xmlstream",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "textdate": {
+            "label": "Text Date",
+            "purpose": "Supports month and day names in dates.",
+            "section": "Data structures",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "datestring": {
+            "label": "QDate/QTime/QDateTime",
+            "purpose": "Provides convertion between dates and strings.",
+            "section": "Data structures",
+            "condition": "features.textdate",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "process": {
+            "label": "QProcess",
+            "purpose": "Supports external process invocation.",
+            "section": "File I/O",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "temporaryfile": {
+            "label": "QTemporaryFile",
+            "purpose": "Provides an I/O device that operates on temporary files.",
+            "section": "File I/O",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "library": {
+            "label": "QLibrary",
+            "purpose": "Provides a wrapper for dynamically loaded libraries.",
+            "section": "File I/O",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "settings": {
+            "label": "QSettings",
+            "purpose": "Provides persistent application settings.",
+            "section": "File I/O",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "filesystemwatcher": {
+            "label": "QFileSystemWatcher",
+            "purpose": "Provides an interface for monitoring files and directories for modifications.",
+            "section": "File I/O",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "filesystemiterator": {
+            "label": "QFileSystemIterator",
+            "purpose": "Provides fast file system iteration.",
+            "section": "File I/O",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "itemmodel": {
+            "label": "Qt Item Model",
+            "purpose": "Provides the item model for item views",
+            "section": "ItemViews",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "proxymodel": {
+            "label": "QAbstractProxyModel",
+            "purpose": "Supports processing of data passed between another model and a view.",
+            "section": "ItemViews",
+            "condition": "features.itemmodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "sortfilterproxymodel": {
+            "label": "QSortFilterProxyModel",
+            "purpose": "Supports sorting and filtering of data passed between another model and a view.",
+            "section": "ItemViews",
+            "condition": "features.proxymodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "identityproxymodel": {
+            "label": "QIdentityProxyModel",
+            "purpose": "Supports proxying a source model unmodified.",
+            "section": "ItemViews",
+            "condition": "features.proxymodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "stringlistmodel": {
+            "label": "QStringListModel",
+            "purpose": "Provides a model that supplies strings to views.",
+            "section": "ItemViews",
+            "condition": "features.itemmodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "translation": {
+            "label": "Translation",
+            "purpose": "Supports translations using QObject::tr().",
+            "section": "Internationalization",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "textcodec": {
+            "label": "QTextCodec",
+            "purpose": "Supports conversions between text encodings.",
+            "section": "Internationalization",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "codecs": {
+            "label": "Codecs",
+            "purpose": "Supports non-unicode text conversions.",
+            "section": "Internationalization",
+            "condition": "features.textcodec",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "big_codecs": {
+            "label": "Big Codecs",
+            "purpose": "Supports big codecs, e.g. CJK.",
+            "section": "Internationalization",
+            "condition": "features.textcodec",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "animation": {
+            "label": "Animation",
+            "purpose": "Provides a framework for animations.",
+            "section": "Utilities",
+            "condition": "features.properties",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "statemachine": {
+            "label": "State machine",
+            "purpose": "Provides hierarchical finite state machines.",
+            "section": "Utilities",
+            "condition": "features.properties",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "gestures": {
+            "label": "Gesture",
+            "purpose": "Provides a framework for gestures.",
+            "section": "Utilities",
+            "output": [ "publicFeature", "feature" ]
         }
     },
 
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index 1db814180b3eb418783a156b2d56e5a7063d4af3..616a9641a124de9990abc1bc124af9c8a7e84bee 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -31,8 +31,6 @@ ANDROID_PERMISSIONS = \
 # OpenBSD 6.0 will include environ in libc.
 freebsd|openbsd: QMAKE_LFLAGS_NOUNDEF =
 
-load(qfeatures)
-
 include(animation/animation.pri)
 include(arch/arch.pri)
 include(global/global.pri)
@@ -100,6 +98,7 @@ cmake_umbrella_config_version_file.output = $$DESTDIR/cmake/Qt5/Qt5ConfigVersion
 
 load(cmake_functions)
 
+##### This requires fixing, so that the feature system works with cmake as well
 CMAKE_DISABLED_FEATURES = $$join(QT_DISABLED_FEATURES, "$$escape_expand(\\n)    ")
 
 CMAKE_HOST_DATA_DIR = $$cmakeRelativePath($$[QT_HOST_DATA/src], $$[QT_INSTALL_PREFIX])
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 7ebd9cf7108ca199b82c25e8099126738459c326..e3d89651e4d8f266fb37e30799364baaad02b4c4 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -168,7 +168,7 @@ qtConfig(icu) {
     SOURCES += tools/qcollator_posix.cpp
 }
 
-!contains(QT_DISABLED_FEATURES, regularexpression) {
+qtConfig(regularexpression) {
     include($$PWD/../../3rdparty/pcre_dependency.pri)
 
     HEADERS += tools/qregularexpression.h
diff --git a/src/gui/configure.json b/src/gui/configure.json
index 8513bff5d017b0a37ec25c16260c0e765519232e..46014188e5666f73f14c2b43074562946620cf72 100644
--- a/src/gui/configure.json
+++ b/src/gui/configure.json
@@ -668,7 +668,9 @@
         },
         "sessionmanager": {
             "label": "Session Management",
-            "output": [ "feature" ]
+            "purpose": "Provides an interface to the windowing system's session management.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
         },
         "tslib": {
             "label": "tslib",
@@ -756,6 +758,194 @@
             "label": "Xrender",
             "condition": "libs.xrender",
             "output": [ "privateFeature", "feature" ]
+        },
+        "texthtmlparser": {
+            "label": "HtmlParser",
+            "purpose": "Provides a parser for HTML.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "textodfwriter": {
+            "label": "OdfWriter",
+            "purpose": "Provides an ODF writer.",
+            "section": "Kernel",
+            "condition": "features.xmlstreamwriter",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "cssparser": {
+            "label": "CssParser",
+            "purpose": "Provides a parser for Cascading Style Sheets.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "draganddrop": {
+            "label": "Drag and Drop",
+            "purpose": "Supports the drag and drop mechansim.",
+            "section": "Kernel",
+            "condition": "features.imageformat_xpm",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "shortcut": {
+            "label": "QShortcut",
+            "purpose": "Provides keyboard accelerators and shortcuts.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "action": {
+            "label": "QAction",
+            "purpose": "Provides widget actions.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "cursor": {
+            "label": "QCursor",
+            "purpose": "Provides mouse cursors.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "clipboard": {
+            "label": "QClipboard",
+            "purpose": "Provides cut and paste operations.",
+            "section": "Kernel",
+            "condition": "!config.integrity && !config.qnx",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "wheelevent": {
+            "label": "QWheelEvent",
+            "purpose": "Supports wheel events.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "tabletevent": {
+            "label": "QTabletEvent",
+            "purpose": "Supports tablet events.",
+            "section": "Kernel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "im": {
+            "label": "QInputContext",
+            "purpose": "Provides complex input methods.",
+            "section": "Kernel",
+            "condition": "features.library",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "validator": {
+            "label": "QValidator",
+            "purpose": "Supports validation of input text.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "standarditemmodel": {
+            "label": "QStandardItemModel",
+            "purpose": "Provides a generic model for storing custom data.",
+            "section": "ItemViews",
+            "condition": "features.itemmodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "imageformatplugin": {
+            "label": "QImageIOPlugin",
+            "purpose": "Provides a base for writing a image format plugins.",
+            "section": "Images",
+            "condition": "features.library",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "movie": {
+            "label": "QMovie",
+            "purpose": "Supports animated images.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "imageformat_bmp": {
+            "label": "BMP Image Format",
+            "purpose": "Supports Microsoft's Bitmap image file format.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "imageformat_ppm": {
+            "label": "PPM Image Format",
+            "purpose": "Supports the Portable Pixmap image file format.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "imageformat_xbm": {
+            "label": "XBM Image Format",
+            "purpose": "Supports the X11 Bitmap image file format.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "imageformat_xpm": {
+            "label": "XPM Image Format",
+            "purpose": "Supports the X11 Pixmap image file format.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "imageformat_png": {
+            "label": "PNG Image Format",
+            "purpose": "Supports the Portable Network Graphics image file format.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "imageformat_jpeg": {
+            "label": "JPEG Image Format",
+            "purpose": "Supports the Joint Photographic Experts Group image file format.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "image_heuristic_mask": {
+            "label": "QImage::createHeuristicMask()",
+            "purpose": "Supports creating a 1-bpp heuristic mask for images.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "image_text": {
+            "label": "Image Text",
+            "purpose": "Supports image file text strings.",
+            "section": "Images",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "picture": {
+            "label": "QPicture",
+            "purpose": "Supports recording and replaying QPainter commands.",
+            "section": "Painting",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "colornames": {
+            "label": "Color Names",
+            "purpose": "Supports color names such as \"red\", used by QColor and by some HTML documents.",
+            "section": "Painting",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "pdf": {
+            "label": "QPdf",
+            "purpose": "Provides a PDF backend for QPainter.",
+            "section": "Painting",
+            "condition": "features.temporaryfile",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "freetype": {
+            "label": "Freetype Font Engine",
+            "purpose": "Supports the FreeType 2 font engine (and its supported font formats).",
+            "section": "Fonts",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "desktopservices": {
+            "label": "QDesktopServices",
+            "purpose": "Provides methods for accessing common desktop services.",
+            "section": "Utilities",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "systemtrayicon": {
+            "label": "QSystemTrayIcon",
+            "purpose": "Provides an icon for an application in the system tray.",
+            "section": "Utilities",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "accessibility": {
+            "label": "Accessibility",
+            "purpose": "Provides accessibility support.",
+            "section": "Utilities",
+            "condition": "features.properties",
+            "output": [ "publicFeature", "feature" ]
         }
     },
 
diff --git a/src/network/configure.json b/src/network/configure.json
index 3372d177c37a85b8e9ea549b7bc61b9e3ce27a64..97bf92167dd906f1a098828678cd7ba41cc34ce6 100644
--- a/src/network/configure.json
+++ b/src/network/configure.json
@@ -176,6 +176,64 @@
         "system-proxies": {
             "label": "Use system proxies",
             "output": [ "privateFeature" ]
+        },
+        "ftp": {
+            "label": "FTP",
+            "purpose": "Provides support for the File Transfer Protocol in QNetworkAccessManager.",
+            "section": "Networking",
+            "condition": "features.textdate",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "http": {
+            "label": "HTTP",
+            "purpose": "Provides support for the Hypertext Transfer Protocol in QNetworkAccessManager.",
+            "section": "Networking",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "udpsocket": {
+            "label": "QUdpSocket",
+            "purpose": "Provides access to UDP sockets.",
+            "section": "Networking",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "networkproxy": {
+            "label": "QNetworkProxy",
+            "purpose": "Provides network proxy support.",
+            "section": "Networking",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "socks5": {
+            "label": "SOCKS5",
+            "purpose": "Provides SOCKS5 support in QNetworkProxy.",
+            "section": "Networking",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "networkinterface": {
+            "label": "QNetworkInterface",
+            "purpose": "Supports enumerating a host's IP addresses and network interfaces.",
+            "section": "Networking",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "networkdiskcache": {
+            "label": "QNetworkDiskCache",
+            "purpose": "Provides a disk cache for network resources.",
+            "section": "Networking",
+            "condition": "features.temporaryfile",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "bearermanagement": {
+            "label": "Bearer management",
+            "purpose": "Provides bearer management for the network stack.",
+            "section": "Networking",
+            "condition": "features.library && features.networkinterface && features.properties",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "localserver": {
+            "label": "QLocalServer",
+            "purpose": "Provides a local socket based server.",
+            "section": "Networking",
+            "condition": "features.temporaryfile",
+            "output": [ "publicFeature", "feature" ]
         }
     },
 
diff --git a/src/plugins/generic/generic.pro b/src/plugins/generic/generic.pro
index 69e832906b854951a6add0cd7b1dd3b174383ce7..996e57d015f9e2fdeeb4d91697ef03a36bf03738 100644
--- a/src/plugins/generic/generic.pro
+++ b/src/plugins/generic/generic.pro
@@ -1,7 +1,5 @@
 TEMPLATE = subdirs
-QT_FOR_CONFIG += gui-private
-
-load(qfeatures)
+QT_FOR_CONFIG += gui-private network-private
 
 qtConfig(evdev) {
     SUBDIRS += evdevmouse evdevtouch evdevkeyboard evdevtablet
@@ -11,7 +9,7 @@ qtConfig(tslib) {
     SUBDIRS += tslib
 }
 
-!contains(QT_DISABLED_FEATURES, udpsocket) {
+qtConfig(udpsocket) {
     SUBDIRS += tuiotouch
 }
 
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 0f4207c6366a6bc65e8733e6f73a9e7a4b502610..941c25361ff5fe5d24662d30c650cd9f723fb7c9 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -1,14 +1,13 @@
 TEMPLATE = subdirs
+QT_FOR_CONFIG += network
 
-load(qfeatures)
 SUBDIRS *= sqldrivers
-qtHaveModule(network):!contains(QT_DISABLED_FEATURES, bearermanagement): SUBDIRS += bearer
+qtHaveModule(network):qtConfig(bearermanagement): SUBDIRS += bearer
 qtHaveModule(gui) {
     SUBDIRS *= platforms platforminputcontexts platformthemes
-    !contains(QT_DISABLED_FEATURES, imageformatplugin): SUBDIRS *= imageformats
-    !android:!contains(QT_DISABLED_FEATURES, library): SUBDIRS *= generic
+    qtConfig(imageformatplugin): SUBDIRS *= imageformats
+    !android:qtConfig(library): SUBDIRS *= generic
 }
 
-!winrt:!wince*:qtHaveModule(widgets):!contains(QT_DISABLED_FEATURES, printer) {
+!winrt:!wince:qtHaveModule(printsupport): \
     SUBDIRS += printsupport
-}
diff --git a/src/printsupport/configure.json b/src/printsupport/configure.json
index 6bf4208e9ce5828f618d3c72c25842f0416e348f..439f2dbdd83f9274a52252bd363544a25b4ad519 100644
--- a/src/printsupport/configure.json
+++ b/src/printsupport/configure.json
@@ -26,8 +26,38 @@
     "features": {
         "cups": {
             "label": "CUPS",
+            "purpose": "Provides support for the Common Unix Printing System.",
+            "section": "Painting",
             "condition": "libs.cups",
             "output": [ "privateFeature", "feature" ]
+        },
+        "printer": {
+            "label": "QPrinter",
+            "purpose": "Provides a printer backend of QPainter.",
+            "section": "Painting",
+            "condition": "!config.android && !config.uikit && !config.winrt && features.picture && features.temporaryfile && features.pdf",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "printpreviewwidget": {
+            "label": "QPrintPreviewWidget",
+            "purpose": "Provides a widget for previewing page layouts for printer output.",
+            "section": "Widgets",
+            "condition": "features.graphicsview && features.printer && features.mainwindow",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "printdialog": {
+            "label": "QPrintDialog",
+            "purpose": "Provides a dialog widget for specifying printer configuration.",
+            "section": "Dialogs",
+            "condition": "features.printer && features.combobox && features.buttongroup && features.spinbox && features.treeview && features.tabwidget",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "printpreviewdialog": {
+            "label": "QPrintPreviewDialog",
+            "purpose": "Provides a dialog for previewing and configuring page layouts for printer output.",
+            "section": "Dialogs",
+            "condition": "features.printpreviewwidget && features.printdialog && features.toolbar",
+            "output": [ "publicFeature", "feature" ]
         }
     },
 
diff --git a/src/src.pro b/src/src.pro
index 60d6a57e2a581a54f22a632137178f5b3890deb1..541053eba58993915f5254daeb8d33792405ed25 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -134,7 +134,7 @@ src_android.subdir = $$PWD/android
     }
 }
 SUBDIRS += src_tools_bootstrap src_tools_moc src_tools_rcc
-!contains(QT_DISABLED_FEATURES, regularexpression):pcre {
+qtConfig(regularexpression):pcre {
     SUBDIRS += src_3rdparty_pcre
     src_corelib.depends += src_3rdparty_pcre
 }
diff --git a/src/widgets/configure.json b/src/widgets/configure.json
index 2c1f8b1e6c7bf3e1d2893bd5ecaf812d7dab9398..ee7e1dd8e0c77f28983a8d7b752fb7b37be5fed6 100644
--- a/src/widgets/configure.json
+++ b/src/widgets/configure.json
@@ -71,10 +71,480 @@
             "autoDetect": "config.android",
             "output": [ "styles" ]
         },
+        "style-stylesheet": {
+            "label": "QStyleSheetStyle",
+            "purpose": "Provides a widget style which is configurable via CSS.",
+            "section": "Styles",
+            "condition": "features.style-windows && features.properties && features.cssparser",
+            "output": [ "publicFeature", "feature" ]
+        },
         "android-style-assets": {
             "label": "Android Style Assets",
             "condition": "features.style-android",
             "output": [ "privateConfig" ]
+        },
+        "effects": {
+            "label": "Effects",
+            "purpose": "Provides special widget effects (e.g. fading and scrolling).",
+            "section": "Kernel"
+        },
+        "filesystemmodel": {
+            "label": "QFileSystemModel",
+            "purpose": "Provides a data model for the local filesystem.",
+            "section": "File I/O",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "itemviews": {
+            "label": "The Model/View Framework",
+            "purpose": "Provides the model/view architecture managing the relationship between data and the way it is presented to the user.",
+            "section": "ItemViews",
+            "condition": "features.itemmodel && features.rubberband && features.scrollarea",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "treewidget": {
+            "label": "QTreeWidget",
+            "purpose": "Provides views using tree models.",
+            "section": "Widgets",
+            "condition": "features.treeview",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "listwidget": {
+            "label": "QListWidget",
+            "purpose": "Provides item-based list widgets.",
+            "section": "Widgets",
+            "condition": "features.listview",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "tablewidget": {
+            "label": "QTableWidget",
+            "purpose": "Provides item-based table views.",
+            "section": "Widgets",
+            "condition": "features.tableview",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "datetimeedit": {
+            "label": "QDateTimeEdit",
+            "purpose": "Supports editing dates and times.",
+            "section": "Widgets",
+            "condition": "features.calendarwidget && features.datestring",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "stackedwidget": {
+            "label": "QStackedWidget",
+            "purpose": "Provides stacked widgets.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "textbrowser": {
+            "label": "QTextBrowser",
+            "purpose": "Supports HTML document browsing.",
+            "section": "Widgets",
+            "condition": "features.textedit",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "splashscreen": {
+            "label": "QSplashScreen",
+            "purpose": "Supports splash screens that can be shown during application startup.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "splitter": {
+            "label": "QSplitter",
+            "purpose": "Provides user controlled splitter widgets.",
+            "section": "Widgets",
+            "condition": "features.rubberband",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "lcdnumber": {
+            "label": "QLCDNumber",
+            "purpose": "Provides LCD-like digits.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "menu": {
+            "label": "QMenu",
+            "purpose": "Provides popup-menus.",
+            "section": "Widgets",
+            "condition": "features.action",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "lineedit": {
+            "label": "QLineEdit",
+            "purpose": "Provides single-line edits.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "spinbox": {
+            "label": "QSpinBox",
+            "purpose": "Provides spin boxes handling integers and discrete sets of values.",
+            "section": "Widgets",
+            "condition": "features.spinwidget && features.lineedit && features.validator",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "tabbar": {
+            "label": "QTabBar",
+            "purpose": "Provides tab bars, e.g., for use in tabbed dialogs.",
+            "section": "Widgets",
+            "condition": "features.toolbutton",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "tabwidget": {
+            "label": "QTabWidget",
+            "purpose": "Supports stacking tabbed widgets.",
+            "section": "Widgets",
+            "condition": "features.tabbar && features.stackedwidget",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "combobox": {
+            "label": "QComboBox",
+            "purpose": "Provides drop-down boxes presenting a list of options to the user.",
+            "section": "Widgets",
+            "condition": "features.lineedit && features.standarditemmodel && features.listview",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "fontcombobox": {
+            "label": "QFontComboBox",
+            "purpose": "Provides a combobox that lets the user select a font family.",
+            "section": "Widgets",
+            "condition": "features.combobox && features.stringlistmodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "toolbutton": {
+            "label": "QToolButton",
+            "purpose": "Provides quick-access buttons to commands and options.",
+            "section": "Widgets",
+            "condition": "features.action",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "toolbar": {
+            "label": "QToolBar",
+            "purpose": "Provides movable panels containing a set of controls.",
+            "section": "Widgets",
+            "condition": "features.mainwindow",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "toolbox": {
+            "label": "QToolBox",
+            "purpose": "Provides columns of tabbed widget items.",
+            "section": "Widgets",
+            "condition": "features.toolbutton && features.scrollarea",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "groupbox": {
+            "label": "QGroupBox",
+            "purpose": "Provides widget grouping boxes with frames.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "buttongroup": {
+            "label": "QButtonGroup",
+            "purpose": "Supports organizing groups of button widgets.",
+            "section": "Widgets",
+            "condition": "features.groupbox",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "mainwindow": {
+            "label": "QMainWindow",
+            "purpose": "Provides main application windows.",
+            "section": "Widgets",
+            "condition": "features.menu && features.resizehandler && features.toolbutton",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "dockwidget": {
+            "label": "QDockwidget",
+            "purpose": "Supports docking widgets inside a QMainWindow or floated as a top-level window on the desktop.",
+            "section": "Widgets",
+            "condition": "features.rubberband && features.mainwindow",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "mdiarea": {
+            "label": "QMdiArea",
+            "purpose": "Provides an area in which MDI windows are displayed.",
+            "section": "Widgets",
+            "condition": "features.scrollarea",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "resizehandler": {
+            "label": "QWidgetResizeHandler",
+            "purpose": "Provides an internal resize handler for dock widgets.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "statusbar": {
+            "label": "QStatusBar",
+            "purpose": "Supports presentation of status information.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "menubar": {
+            "label": "QMenuBar",
+            "purpose": "Provides pull-down menu items.",
+            "section": "Widgets",
+            "condition": "features.menu && features.toolbutton",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "contextmenu": {
+            "label": "Context menus",
+            "purpose": "Adds pop-up menus on right mouse click to numerous widgets.",
+            "section": "Widgets",
+            "condition": "features.menu",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "progressbar": {
+            "label": "QProgressBar",
+            "purpose": "Supports presentation of operation progress.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "slider": {
+            "label": "QSlider",
+            "purpose": "Provides sliders controlling a bounded value.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "scrollbar": {
+            "label": "QScrollBar",
+            "purpose": "Provides scrollbars allowing the user access parts of a document that is larger than the widget used to display it.",
+            "section": "Widgets",
+            "condition": "features.slider",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "dial": {
+            "label": "QDial",
+            "purpose": "Provides a rounded range control, e.g., like a speedometer.",
+            "section": "Widgets",
+            "condition": "features.slider",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "scrollarea": {
+            "label": "QScrollArea",
+            "purpose": "Supports scrolling views onto widgets.",
+            "section": "Widgets",
+            "condition": "features.scrollbar",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "graphicsview": {
+            "label": "QGraphicsView",
+            "purpose": "Provides a canvas/sprite framework.",
+            "section": "Widgets",
+            "condition": "features.scrollarea",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "graphicseffect": {
+            "label": "QGraphicsEffect",
+            "purpose": "Provides various graphics effects.",
+            "section": "Widgets",
+            "condition": "features.graphicsview",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "spinbox": {
+            "label": "QSpinBox",
+            "purpose": "Provides spinbox control widgets.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "textedit": {
+            "label": "QTextEdit",
+            "purpose": "Supports rich text editing.",
+            "section": "Widgets",
+            "condition": "features.scrollarea && features.properties",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "syntaxhighlighter": {
+            "label": "QSyntaxHighlighter",
+            "purpose": "Supports custom syntax highlighting.",
+            "section": "Widgets",
+            "condition": "features.textedit",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "rubberband": {
+            "label": "QRubberBand",
+            "purpose": "Supports using rubberbands to indicate selections and boundaries.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "tooltip": {
+            "label": "QToolTip",
+            "purpose": "Supports presentation of tooltips.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "statustip": {
+            "label": "Status Tip",
+            "purpose": "Supports status tip functionality and events.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "whatsthis": {
+            "label": "QWhatsThis",
+            "purpose": "Supports displaying \"What's this\" help.",
+            "section": "Widgets",
+            "condition": "features.toolbutton",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "sizegrip": {
+            "label": "QSizeGrip",
+            "purpose": "Provides corner-grips for resizing top-level windows.",
+            "section": "Widgets",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "calendarwidget": {
+            "label": "QCalendarWidget",
+            "purpose": "Provides a monthly based calendar widget allowing the user to select a date.",
+            "section": "Widgets",
+            "condition": "features.tableview && features.menu && features.textdate && features.spinbox && features.toolbutton",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "keysequenceedit": {
+            "label": "QKeySequenceEdit",
+            "purpose": "Provides a widget for editing QKeySequences.",
+            "section": "Widgets",
+            "condition": "features.lineedit && features.shortcut",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "messagebox": {
+            "label": "QMessageBox",
+            "purpose": "Provides message boxes displaying informative messages and simple questions.",
+            "section": "Dialogs",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "colordialog": {
+            "label": "QColorDialog",
+            "purpose": "Provides a dialog widget for specifying colors.",
+            "section": "Dialogs",
+            "condition": "features.spinbox",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "filedialog": {
+            "label": "QFileDialog",
+            "purpose": "Provides a dialog widget for selecting files or directories.",
+            "section": "Dialogs",
+            "condition": "features.dirmodel && features.treeview && features.combobox && features.toolbutton && features.buttongroup && features.tooltip && features.splitter && features.stackedwidget && features.proxymodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "fontdialog": {
+            "label": "QFontDialog",
+            "purpose": "Provides a dialog widget for selecting fonts.",
+            "section": "Dialogs",
+            "condition": "features.stringlistmodel && features.combobox && features.validator && features.groupbox",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "progressdialog": {
+            "label": "QProgressDialog",
+            "purpose": "Provides feedback on the progress of a slow operation.",
+            "section": "Dialogs",
+            "condition": "features.progressbar",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "inputdialog": {
+            "label": "QInputDialog",
+            "purpose": "Provides a simple convenience dialog to get a single value from the user.",
+            "section": "Dialogs",
+            "condition": "features.combobox && features.spinbox && features.stackedwidget",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "errormessage": {
+            "label": "QErrorMessage",
+            "purpose": "Provides an error message display dialog.",
+            "section": "Dialogs",
+            "condition": "features.textedit",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "wizard": {
+            "label": "QWizard",
+            "purpose": "Provides a framework for multi-page click-through dialogs.",
+            "section": "Dialogs",
+            "condition": "features.properties",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "dirmodel": {
+            "label": "QDirModel",
+            "purpose": "Provides a data model for the local filesystem.",
+            "section": "ItemViews",
+            "condition": "features.itemviews && features.filesystemmodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "listview": {
+            "label": "QListView",
+            "purpose": "Provides a list or icon view onto a model.",
+            "section": "ItemViews",
+            "condition": "features.itemviews",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "tableview": {
+            "label": "QTableView",
+            "purpose": "Provides a default model/view implementation of a table view.",
+            "section": "ItemViews",
+            "condition": "features.itemviews",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "treeview": {
+            "label": "QTreeView",
+            "purpose": "Provides a default model/view implementation of a tree view.",
+            "section": "ItemViews",
+            "condition": "features.itemviews",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "datawidgetmapper": {
+            "label": "QDataWidgetMapper",
+            "purpose": "Provides mapping between a section of a data model to widgets.",
+            "section": "ItemViews",
+            "condition": "features.itemviews && features.properties",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "columnview": {
+            "label": "QColumnView",
+            "purpose": "Provides a model/view implementation of a column view.",
+            "section": "ItemViews",
+            "condition": "features.listview",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "paint_debug": {
+            "label": "Painting Debug Utilities",
+            "purpose": "Enabled debugging painting with the environment variables QT_FLUSH_UPDATE and QT_FLUSH_PAINT.",
+            "section": "Painting",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "completer": {
+            "label": "QCompleter",
+            "purpose": "Provides completions based on an item model.",
+            "section": "Utilities",
+            "condition": "features.proxymodel",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "fscompleter": {
+            "label": "QFSCompleter",
+            "purpose": "Provides file name completion in QFileDialog.",
+            "section": "Utilities",
+            "condition": "features.filesystemmodel && features.completer",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "undocommand": {
+            "label": "QUndoCommand",
+            "purpose": "Applies (redo or) undo of a single change in a document.",
+            "section": "Utilities",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "undostack": {
+            "label": "QUndoStack",
+            "purpose": "Provides the ability to (redo or) undo a list of changes in a document.",
+            "section": "Utilities",
+            "condition": "features.undocommand",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "undogroup": {
+            "label": "QUndoGroup",
+            "purpose": "Provides the ability to cluster QUndoCommands.",
+            "section": "Utilities",
+            "condition": "features.undostack",
+            "output": [ "publicFeature", "feature" ]
+        },
+        "undoview": {
+            "label": "QUndoView",
+            "purpose": "Provides a widget which shows the contents of an undo stack.",
+            "section": "Utilities",
+            "condition": "features.undostack && features.listview",
+            "output": [ "publicFeature", "feature" ]
         }
     },
 
diff --git a/src/xml/configure.json b/src/xml/configure.json
new file mode 100644
index 0000000000000000000000000000000000000000..345eb8544bac93e990f6496217050976252ca98f
--- /dev/null
+++ b/src/xml/configure.json
@@ -0,0 +1,16 @@
+{
+    "module": "xml",
+    "depends": [
+        "core"
+    ],
+    "testDir": "../../config.tests",
+
+    "features": {
+        "dom": {
+            "label": "DOM",
+            "purpose": "Supports the Document Object Model.",
+            "section": "File I/O",
+            "output": [ "publicFeature", "feature" ]
+        }
+    }
+}
diff --git a/src/xml/qtxmlglobal.h b/src/xml/qtxmlglobal.h
index de5a8ab39db7a3d0eebc60169ff7895d57b2370b..ed5de8db87c00a811cd818e89388ff72d6e52b50 100644
--- a/src/xml/qtxmlglobal.h
+++ b/src/xml/qtxmlglobal.h
@@ -41,6 +41,9 @@
 #define QTXMLGLOBAL_H
 
 #include <QtCore/qglobal.h>
+#ifndef QT_BOOTSTRAPPED
+#  include <QtXml/qtxml-config.h>
+#endif
 
 QT_BEGIN_NAMESPACE
 
diff --git a/sync.profile b/sync.profile
index 0860c7692a7b7af8b4d0e3c9a432be32749e480b..4da349966713941594f526f5f8fe1d304034ee2c 100644
--- a/sync.profile
+++ b/sync.profile
@@ -65,7 +65,7 @@ my @zlib_headers = ( "zconf.h", "zlib.h" );
 @ignore_headers = ( @internal_zlib_headers );
 @ignore_for_include_check = ( "qsystemdetection.h", "qcompilerdetection.h", "qprocessordetection.h", @zlib_headers, @angle_headers);
 @ignore_for_qt_begin_namespace_check = ( "qt_windows.h", @zlib_headers, @angle_headers);
-%inject_headers = ( "$basedir/src/corelib/global" => [ "qconfig.h", "qconfig_p.h", "qfeatures.h" ] );
+%inject_headers = ( "$basedir/src/corelib/global" => [ "qconfig.h", "qconfig_p.h" ] );
 # Module dependencies.
 # Every module that is required to build this module should have one entry.
 # Each of the module version specifiers can take one of the following values:
diff --git a/tests/auto/corelib/plugin/plugin.pro b/tests/auto/corelib/plugin/plugin.pro
index 777e9209952a8acbd9a73a1b95a8981c60a7877d..774edc655a1b353c9fe8caa5b48bc6db7709be30 100644
--- a/tests/auto/corelib/plugin/plugin.pro
+++ b/tests/auto/corelib/plugin/plugin.pro
@@ -3,8 +3,7 @@ SUBDIRS=\
     qfactoryloader \
     quuid
 
-load(qfeatures)
-!contains(QT_DISABLED_FEATURES, library): SUBDIRS += \
+qtConfig(library): SUBDIRS += \
     qpluginloader \
     qplugin \
     qlibrary
diff --git a/tests/auto/corelib/plugin/qfactoryloader/test/test.pro b/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
index f1e76c31bf352f4701735351ed1f7344df98a79c..334565173087c2edd8d2e276d3d37e4a67a41fb6 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
@@ -19,7 +19,6 @@ win32 {
 
 mac: CONFIG -= app_bundle
 
-load(qfeatures)
-contains(QT_DISABLED_FEATURES, library) {
+!qtConfig(library) {
     LIBS += -L ../bin/ -lplugin1 -lplugin2
 }