diff --git a/src/assistant/help/help.pro b/src/assistant/help/help.pro
index 800c4a38d..7556f451b 100644
--- a/src/assistant/help/help.pro
+++ b/src/assistant/help/help.pro
@@ -1,7 +1,6 @@
 TARGET = QtHelp
 
 QT = core-private gui widgets sql
-QT_PRIVATE = network
 
 DEFINES += QHELP_LIB
 
diff --git a/src/assistant/qhelpgenerator/helpgenerator.cpp b/src/assistant/qhelpgenerator/helpgenerator.cpp
index feab1e2d5..cbfb82507 100644
--- a/src/assistant/qhelpgenerator/helpgenerator.cpp
+++ b/src/assistant/qhelpgenerator/helpgenerator.cpp
@@ -445,7 +445,9 @@ bool HelpGeneratorPrivate::insertFiles(const QStringList &files, const QString &
     if (filterSetId < 0)
         return false;
     ++filterSetId;
-    for (int attId : qAsConst(filterAtts)) {
+    QList<int> attValues = filterAtts.values();
+    std::sort(attValues.begin(), attValues.end());
+    for (int attId : qAsConst(attValues)) {
         m_query->prepare(QLatin1String("INSERT INTO FileAttributeSetTable "
             "VALUES(?, ?)"));
         m_query->bindValue(0, filterSetId);
diff --git a/src/assistant/qhelpgenerator/qhelpgenerator.pro b/src/assistant/qhelpgenerator/qhelpgenerator.pro
index bb22000c8..415347a00 100644
--- a/src/assistant/qhelpgenerator/qhelpgenerator.pro
+++ b/src/assistant/qhelpgenerator/qhelpgenerator.pro
@@ -1,4 +1,4 @@
-QT += network help-private
+QT += help-private
 
 QTPLUGIN.platforms = qminimal
 QTPLUGIN.sqldrivers = qsqlite
diff --git a/src/linguist/Qt5LinguistToolsMacros.cmake b/src/linguist/Qt5LinguistToolsMacros.cmake
index 6a45e57be..0ccf59f3c 100644
--- a/src/linguist/Qt5LinguistToolsMacros.cmake
+++ b/src/linguist/Qt5LinguistToolsMacros.cmake
@@ -68,6 +68,7 @@ function(QT5_CREATE_TRANSLATION _qm_files)
     if(NOT EXISTS "${stamp_file_dir}")
         file(MAKE_DIRECTORY "${stamp_file_dir}")
     endif()
+    set(stamp_files "")
     foreach(_ts_file ${_my_tsfiles})
         get_filename_component(_ts_name ${_ts_file} NAME)
         if(_my_sources)
@@ -95,7 +96,14 @@ function(QT5_CREATE_TRANSLATION _qm_files)
 
           file(WRITE ${_ts_lst_file} "${_lst_file_srcs}")
         endif()
-        set(stamp_file "${stamp_file_dir}/${_ts_name}.stamp")
+        file(RELATIVE_PATH _ts_relative_path ${CMAKE_CURRENT_SOURCE_DIR} ${_ts_file})
+        string(REPLACE "../" "__/" _ts_relative_path "${_ts_relative_path}")
+        set(stamp_file "${stamp_file_dir}/${_ts_relative_path}.stamp")
+        list(APPEND stamp_files ${stamp_file})
+        get_filename_component(full_stamp_file_dir "${stamp_file}" DIRECTORY)
+        if(NOT EXISTS "${full_stamp_file_dir}")
+            file(MAKE_DIRECTORY "${full_stamp_file_dir}")
+        endif()
         add_custom_command(OUTPUT ${stamp_file}
             COMMAND ${Qt5_LUPDATE_EXECUTABLE}
             ARGS ${_lupdate_options} "@${_ts_lst_file}" -ts ${_ts_file}
@@ -103,7 +111,7 @@ function(QT5_CREATE_TRANSLATION _qm_files)
             DEPENDS ${_dependencies}
             VERBATIM)
     endforeach()
-    qt5_add_translation(${_qm_files} __QT_INTERNAL_DEPEND_ON_TIMESTAMP_FILE ${_my_tsfiles})
+    qt5_add_translation(${_qm_files} ${_my_tsfiles} __QT_INTERNAL_TIMESTAMP_FILES ${stamp_files})
     set(${_qm_files} ${${_qm_files}} PARENT_SCOPE)
 endfunction()
 
@@ -120,17 +128,17 @@ endif()
 
 
 function(QT5_ADD_TRANSLATION _qm_files)
-    set(options __QT_INTERNAL_DEPEND_ON_TIMESTAMP_FILE)
+    set(options)
     set(oneValueArgs)
-    set(multiValueArgs OPTIONS)
+    set(multiValueArgs OPTIONS __QT_INTERNAL_TIMESTAMP_FILES)
 
     cmake_parse_arguments(_LRELEASE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
     set(_lrelease_files ${_LRELEASE_UNPARSED_ARGUMENTS})
 
+    set(idx 0)
     foreach(_current_FILE ${_lrelease_files})
         get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE)
         get_filename_component(qm ${_abs_FILE} NAME)
-        set(ts_stamp_file "${CMAKE_CURRENT_BINARY_DIR}/.lupdate/${qm}.stamp")
         # everything before the last dot has to be considered the file name (including other dots)
         string(REGEX REPLACE "\\.[^.]*$" "" FILE_NAME ${qm})
         get_source_file_property(output_location ${_abs_FILE} OUTPUT_LOCATION)
@@ -141,7 +149,9 @@ function(QT5_ADD_TRANSLATION _qm_files)
             set(qm "${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}.qm")
         endif()
 
-        if(_LRELEASE___QT_INTERNAL_DEPEND_ON_TIMESTAMP_FILE)
+        if(_LRELEASE___QT_INTERNAL_TIMESTAMP_FILES)
+            list(GET _LRELEASE___QT_INTERNAL_TIMESTAMP_FILES ${idx} ts_stamp_file)
+            math(EXPR idx "${idx} + 1")
             set(qm_dep "${ts_stamp_file}")
         else()
             set(qm_dep "${_abs_FILE}")
diff --git a/src/qdoc/clangcodeparser.cpp b/src/qdoc/clangcodeparser.cpp
index 539a603da..a41b99cec 100644
--- a/src/qdoc/clangcodeparser.cpp
+++ b/src/qdoc/clangcodeparser.cpp
@@ -1395,8 +1395,7 @@ void ClangCodeParser::buildPCH()
             args_.push_back("-xc++");
             CXTranslationUnit tu;
             QString tmpHeader = pchFileDir_->path() + "/" + module;
-            QFile tmpHeaderFile(tmpHeader);
-            if (tmpHeaderFile.open(QIODevice::Text | QIODevice::WriteOnly)) {
+            { QFile tmpHeaderFile(tmpHeader); if (tmpHeaderFile.open(QIODevice::Text | QIODevice::WriteOnly)) {
                 QTextStream out(&tmpHeaderFile);
                 if (header.isEmpty()) {
                     for (auto it = allHeaders_.constKeyValueBegin();
@@ -1421,8 +1420,7 @@ void ClangCodeParser::buildPCH()
                             out << line << "\n";
                     }
                 }
-                tmpHeaderFile.close();
-            }
+            } }
             if (printParsingErrors_ == 0)
                 qCWarning(lcQdoc) << "clang not printing errors; include paths were guessed";
             CXErrorCode err =
Submodule qtwayland ec9fb19e..c8b37a1b:
