diff --git a/bin/syncqt.pl b/bin/syncqt.pl
index ff539f5fe028aac1c9d972ec8d44b3c24607ba61..83e8350f8193bd8fda3eef00eb0d2e0511173952 100755
--- a/bin/syncqt.pl
+++ b/bin/syncqt.pl
@@ -812,6 +812,7 @@ foreach my $lib (@modules_to_sync) {
     my $is_qt = !($module =~ s/^!//);
     my @dirs = split(/;/, $module);
     my $dir = $dirs[0];
+    shift @dirs if ($dir =~ s/^>//);
 
     my $pathtoheaders = "";
     $pathtoheaders = $moduleheaders{$lib} if ($moduleheaders{$lib});
diff --git a/mkspecs/features/qt_module_headers.prf b/mkspecs/features/qt_module_headers.prf
index 3f2383c120058ebf3e768a3855763be8bf3d78c1..78a1e38bb0e7d8be360c4e4a9f90ae2593cb2acb 100644
--- a/mkspecs/features/qt_module_headers.prf
+++ b/mkspecs/features/qt_module_headers.prf
@@ -38,6 +38,9 @@ git_build: \
 else: \
     INC_PATH = $$MODULE_BASE_INDIR
 include($$INC_PATH/include/$$MODULE_INCNAME/headers.pri, "", true)
+CONFIG += qt_install_headers
+
+alien_syncqt: return()
 
 for (injection, SYNCQT.INJECTIONS) {
     injects = $$split(injection, :)
@@ -82,8 +85,6 @@ SYNCQT.HEADER_FILES += $$MODULE_MASTER_DEPS_HEADER
     isEmpty(PRECOMPILED_HEADER): PRECOMPILED_HEADER = $$MODULE_MASTER_DEPS_HEADER
 }
 
-CONFIG += qt_install_headers
-
 headersclean:!internal_module {
     # Make sure that the header compiles with our strict options
     hcleanDEFS = -DQT_NO_CAST_TO_ASCII=1 \
diff --git a/src/corelib/qtzlib.pro b/src/corelib/qtzlib.pro
new file mode 100644
index 0000000000000000000000000000000000000000..744750fbbee46cee1fa0aaeb1b34171c2a155a7b
--- /dev/null
+++ b/src/corelib/qtzlib.pro
@@ -0,0 +1,7 @@
+TARGET = QtZlib
+MODULE = zlib
+MAKEFILE = Makefile.qtzlib
+CONFIG += internal_module header_module alien_syncqt
+QT =
+
+load(qt_module)
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index c43fd761d89a0390b83c60349617eff215ad83b5..ed07f70e870462e9cabf43f26223ac84357040c1 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -155,10 +155,6 @@ else:SOURCES += tools/qelapsedtimer_generic.cpp
 
 contains(QT_CONFIG, zlib) {
     include($$PWD/../../3rdparty/zlib.pri)
-    corelib_zlib_headers.files = $$PWD/../../3rdparty/zlib/zconf.h\
-                                 $$PWD/../../3rdparty/zlib/zlib.h
-    corelib_zlib_headers.path = $$[QT_INSTALL_HEADERS]/QtZlib
-    INSTALLS += corelib_zlib_headers
 } else {
     include($$PWD/../../3rdparty/zlib_dependency.pri)
 }
diff --git a/src/src.pro b/src/src.pro
index a970391382d5795f1f1bdcb1cb27459b6794a4ce..df5c85fa537a07498dbe28335df0ce4341fa4be6 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -2,6 +2,9 @@ TEMPLATE = subdirs
 
 load(qfeatures)
 
+src_qtzlib.file = $$PWD/corelib/qtzlib.pro
+src_qtzlib.target = sub-zlib
+
 src_tools_bootstrap.subdir = tools/bootstrap
 src_tools_bootstrap.target = sub-bootstrap
 src_tools_bootstrap.CONFIG = host_build
@@ -125,6 +128,7 @@ src_plugins.depends = src_sql src_xml src_network
 src_android.subdir = $$PWD/android
 
 # this order is important
+contains(QT_CONFIG, zlib)|cross_compile: SUBDIRS += src_qtzlib
 SUBDIRS += src_tools_bootstrap src_tools_moc src_tools_rcc
 !contains(QT_DISABLED_FEATURES, regularexpression):pcre {
     SUBDIRS += src_3rdparty_pcre
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro
index b6b16dcd3d33753e625ea1b9caf2cd380282fbc5..ca05f804a2b283754bed71899f3966ce5cd08c58 100644
--- a/src/tools/bootstrap/bootstrap.pro
+++ b/src/tools/bootstrap/bootstrap.pro
@@ -39,10 +39,7 @@ MODULE_PRIVATE_INCLUDES = \
 # We need the forwarding headers before their respective modules are built,
 # so do a minimal syncqt run.
 CONFIG += minimal_syncqt
-QMAKE_SYNCQT_OPTIONS = -module QtCore -module QtDBus -module QtXml
-contains(QT_CONFIG, zlib): \
-    QMAKE_SYNCQT_OPTIONS += -module QtZlib
-QMAKE_SYNCQT_OPTIONS += -version $$QT_VERSION
+QMAKE_SYNCQT_OPTIONS = -module QtCore -module QtDBus -module QtXml -version $$QT_VERSION
 
 load(qt_module)
 
diff --git a/sync.profile b/sync.profile
index 1700d94fff9e5beab7d0ecd08e2cb689dc44e38e..bba0ff2b2f7e715b566db6ff97c37c0d363a0660 100644
--- a/sync.profile
+++ b/sync.profile
@@ -16,7 +16,7 @@
     "QtANGLE/GLES2" => "!$basedir/src/3rdparty/angle/include/GLES2",
     "QtANGLE/GLES3" => "!$basedir/src/3rdparty/angle/include/GLES3",
     "QtANGLE/EGL" => "!$basedir/src/3rdparty/angle/include/EGL",
-    "QtZlib" => "!$basedir/src/3rdparty/zlib",
+    "QtZlib" => "!>$basedir/src/corelib;$basedir/src/3rdparty/zlib",
     "QtOpenGLExtensions" => "$basedir/src/openglextensions",
 );
 %moduleheaders = ( # restrict the module headers to those found in relative path