diff --git a/doc/global/externalsites/qtcreator.qdoc b/doc/global/externalsites/qtcreator.qdoc
index 46609de160656519443636f8d846f1b95da1e695..a98fbd0a56c78ff7e225b0b97de2155da972cbfa 100644
--- a/doc/global/externalsites/qtcreator.qdoc
+++ b/doc/global/externalsites/qtcreator.qdoc
@@ -483,3 +483,15 @@
     \externalpage http://qt-project.org/doc/qtcreator/creator-developing-winrt.html
     \title Qt Creator: Connecting Windows Runtime Devices
 */
+/*!
+    \externalpage http://qt-project.org/doc/qtcreator/creator-clang-codemodel.html
+    \title Qt Creator: Parsing C++ Files
+*/
+/*!
+    \externalpage http://qt-project.org/doc/qtcreator/creator-quick-ui-forms.html
+    \title Qt Creator: Qt Quick UI Forms
+*/
+/*!
+    \externalpage http://qt-project.org/doc/qtcreator/creator-clang-static-analyzer.html
+    \title Qt Creator: Using Clang Static Analyzer
+*/
diff --git a/doc/global/template/images/Qt-logo.png b/doc/global/template/images/Qt-logo.png
index 64c1c4aaa34d5dfcba8c12a7dcb3352140fec4c5..01256ab08dcf24aa990dc786723439f8dca192cc 100644
Binary files a/doc/global/template/images/Qt-logo.png and b/doc/global/template/images/Qt-logo.png differ
diff --git a/doc/global/template/images/logo.png b/doc/global/template/images/logo.png
index 1e7ed4cf21300f6695a894db7a6c2376dd65c288..698dde9215ca0c91d27745031000fdf83dc48ed0 100644
Binary files a/doc/global/template/images/logo.png and b/doc/global/template/images/logo.png differ
diff --git a/doc/global/template/images/sprites-combined.png b/doc/global/template/images/sprites-combined.png
index 3a48b21f6b85270d2282a74173354220e3a09efe..c4f01c4bb956e8d627e411b08886ddf4f5db3435 100644
Binary files a/doc/global/template/images/sprites-combined.png and b/doc/global/template/images/sprites-combined.png differ
diff --git a/doc/global/template/style/offline.css b/doc/global/template/style/offline.css
index 5957e3840d0947c91ce2f74420d7d60a86c17ea7..126df9d806ff72b2878f7a2e10d64f78a12a68ad 100644
--- a/doc/global/template/style/offline.css
+++ b/doc/global/template/style/offline.css
@@ -2,7 +2,6 @@ body {
     font: normal 400 14px/1.2 Arial;
     margin-top: 85px;
     font-family: Arial, Helvetica;
-    color: #313131;
     text-align: left;
     margin-left: 5px;
     margin-right: 5px;
diff --git a/examples/opengl/legacy/framebufferobject2/cubelogo.png b/examples/opengl/legacy/framebufferobject2/cubelogo.png
index 3ae0f9ba3f83b0fbef4500ae3e419c8d03362f17..2ccbede77482d3799dc9d693ffd33a2bdead7239 100644
Binary files a/examples/opengl/legacy/framebufferobject2/cubelogo.png and b/examples/opengl/legacy/framebufferobject2/cubelogo.png differ
diff --git a/examples/opengl/legacy/pbuffers/cubelogo.png b/examples/opengl/legacy/pbuffers/cubelogo.png
index 3ae0f9ba3f83b0fbef4500ae3e419c8d03362f17..2ccbede77482d3799dc9d693ffd33a2bdead7239 100644
Binary files a/examples/opengl/legacy/pbuffers/cubelogo.png and b/examples/opengl/legacy/pbuffers/cubelogo.png differ
diff --git a/examples/sql/doc/images/drilldown-example.png b/examples/sql/doc/images/drilldown-example.png
index fd315a437e0050cda892ede01dbd10493e572ab6..fed51d36292ca77941ef4dba9c53329a9db89990 100644
Binary files a/examples/sql/doc/images/drilldown-example.png and b/examples/sql/doc/images/drilldown-example.png differ
diff --git a/examples/sql/drilldown/images/qt-creator.png b/examples/sql/drilldown/images/qt-creator.png
index fa0f6ed7cef5f69db1c781fe79eb05a992902607..0602bdcad1d643ad4b4b43600b28df5ec681543f 100644
Binary files a/examples/sql/drilldown/images/qt-creator.png and b/examples/sql/drilldown/images/qt-creator.png differ
diff --git a/examples/sql/drilldown/images/qt-logo.png b/examples/sql/drilldown/images/qt-logo.png
index 53bc39c38c11e10d7dbb567a2dcc59da7fbb2f36..7603fa0c903907396e2220d9a8b04788c9d202a0 100644
Binary files a/examples/sql/drilldown/images/qt-logo.png and b/examples/sql/drilldown/images/qt-logo.png differ
diff --git a/examples/sql/drilldown/images/qt-project.png b/examples/sql/drilldown/images/qt-project.png
index c34d3f099dd2a2f95e1dbfd7a33fc98c8b183f44..e066fbe3f98480c65f646dc28d9897e07f8f2c24 100644
Binary files a/examples/sql/drilldown/images/qt-project.png and b/examples/sql/drilldown/images/qt-project.png differ
diff --git a/examples/sql/drilldown/images/qt-quick.png b/examples/sql/drilldown/images/qt-quick.png
index f66127e8e7402ffe17225bc66b6b4408bb367e24..90d9fd075d87b43d12fcdf68d59024d3989ce9ae 100644
Binary files a/examples/sql/drilldown/images/qt-quick.png and b/examples/sql/drilldown/images/qt-quick.png differ
diff --git a/examples/widgets/animation/animatedtiles/images/kinetic.png b/examples/widgets/animation/animatedtiles/images/kinetic.png
index 55cfa5515f57f22c9bef448b8257336b24295511..d5fc0af0f2451cb832b438b69c58d7d3ec737c37 100644
Binary files a/examples/widgets/animation/animatedtiles/images/kinetic.png and b/examples/widgets/animation/animatedtiles/images/kinetic.png differ
diff --git a/examples/widgets/animation/easing/images/qt-logo.png b/examples/widgets/animation/easing/images/qt-logo.png
index 14ddf2a0289e64c686b34712b8754bc4baac2726..6b72d5fb72c2cdb1f4e101eb244e1aada05277f6 100644
Binary files a/examples/widgets/animation/easing/images/qt-logo.png and b/examples/widgets/animation/easing/images/qt-logo.png differ
diff --git a/examples/widgets/doc/images/dropsite-example.png b/examples/widgets/doc/images/dropsite-example.png
index 2c42c7be69ba33fc1a4c9a3488d6a326bde109e5..c555dd3609ec974543ee85d70db8ea4986affa8a 100644
Binary files a/examples/widgets/doc/images/dropsite-example.png and b/examples/widgets/doc/images/dropsite-example.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_16x16.png b/examples/widgets/doc/images/icons_qt_extended_16x16.png
index 92743690e30d05fc47da7663b3db16c61d8a6196..8bae9499e4523137225eab0e9f125536f58ce95d 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_16x16.png and b/examples/widgets/doc/images/icons_qt_extended_16x16.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_17x17.png b/examples/widgets/doc/images/icons_qt_extended_17x17.png
index e9bb24a282d4ef025a91832b5fce271bb534d686..7ef4222f93628ff6d2730ee02975a0b21b54ab56 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_17x17.png and b/examples/widgets/doc/images/icons_qt_extended_17x17.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_32x32.png b/examples/widgets/doc/images/icons_qt_extended_32x32.png
index cd3d0f325510c53d0e1a76bb1ac8249b781bfa7c..7b0c54bac3ae1c2b4e5edb0cd9be6557b3303ea6 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_32x32.png and b/examples/widgets/doc/images/icons_qt_extended_32x32.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_33x33.png b/examples/widgets/doc/images/icons_qt_extended_33x33.png
index a67565cc2bfe6ececef0fb3df89ad485b3f6b661..1a38f6e44b0653dd3f2f7403f5b39d74010df2c4 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_33x33.png and b/examples/widgets/doc/images/icons_qt_extended_33x33.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_48x48.png b/examples/widgets/doc/images/icons_qt_extended_48x48.png
index 5aa2d73f71a3ef6427ec2c3177beca338af62159..85dcb5f26c6ac71c5e01c01a0b50c5b188b5769c 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_48x48.png and b/examples/widgets/doc/images/icons_qt_extended_48x48.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_64x64.png b/examples/widgets/doc/images/icons_qt_extended_64x64.png
index 5aa2d73f71a3ef6427ec2c3177beca338af62159..d0bfd97f10b47284d9ecb6999ccad8079220b274 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_64x64.png and b/examples/widgets/doc/images/icons_qt_extended_64x64.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_8x8.png b/examples/widgets/doc/images/icons_qt_extended_8x8.png
index 8de7fce038a3df61b43bc204fb774680cc31271f..dcbb5811c6b6548de08f4d561e80167fadb65812 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_8x8.png and b/examples/widgets/doc/images/icons_qt_extended_8x8.png differ
diff --git a/examples/widgets/draganddrop/puzzle/example.jpg b/examples/widgets/draganddrop/puzzle/example.jpg
index e09fb7075700b457d90e845fef814158bc2641d1..023203c57aa838e7a5df22a27bde37b909667c1e 100644
Binary files a/examples/widgets/draganddrop/puzzle/example.jpg and b/examples/widgets/draganddrop/puzzle/example.jpg differ
diff --git a/examples/widgets/graphicsview/boxes/qt-logo.jpg b/examples/widgets/graphicsview/boxes/qt-logo.jpg
index 4014b4659c1100c4a07cb562a3647fcfbb5f1cdd..8d7fab052a0b32c0adfcc18d8086faf9f8021598 100644
Binary files a/examples/widgets/graphicsview/boxes/qt-logo.jpg and b/examples/widgets/graphicsview/boxes/qt-logo.jpg differ
diff --git a/examples/widgets/graphicsview/boxes/qt-logo.png b/examples/widgets/graphicsview/boxes/qt-logo.png
index 7d3e97eb36e9df80d7d7a4086c8fb8cae68dda68..0b0b15480cd6837d5f9566c2bd0717a4d2f526f5 100644
Binary files a/examples/widgets/graphicsview/boxes/qt-logo.png and b/examples/widgets/graphicsview/boxes/qt-logo.png differ
diff --git a/examples/widgets/itemviews/puzzle/example.jpg b/examples/widgets/itemviews/puzzle/example.jpg
index e09fb7075700b457d90e845fef814158bc2641d1..023203c57aa838e7a5df22a27bde37b909667c1e 100644
Binary files a/examples/widgets/itemviews/puzzle/example.jpg and b/examples/widgets/itemviews/puzzle/example.jpg differ
diff --git a/examples/widgets/painting/basicdrawing/images/qt-logo.png b/examples/widgets/painting/basicdrawing/images/qt-logo.png
index a8b452e07a5b7d55cc71121132a23c16e58725b6..abfc8caadbbcd3d1c57ad4e15db32216b23f7e1d 100644
Binary files a/examples/widgets/painting/basicdrawing/images/qt-logo.png and b/examples/widgets/painting/basicdrawing/images/qt-logo.png differ
diff --git a/examples/widgets/widgets/icons/images/qt_extended_16x16.png b/examples/widgets/widgets/icons/images/qt_extended_16x16.png
index 95d3bae8389cac335dd7863ff4af271eea0e4c59..bee4e7d6cd2786384e887c399d2dbf72fda9986b 100644
Binary files a/examples/widgets/widgets/icons/images/qt_extended_16x16.png and b/examples/widgets/widgets/icons/images/qt_extended_16x16.png differ
diff --git a/examples/widgets/widgets/icons/images/qt_extended_32x32.png b/examples/widgets/widgets/icons/images/qt_extended_32x32.png
index 7b7a790c122392b551904fc21fd31c2e7f331acd..6e7d000c0470e0f45ae714827ba72f69cc25270a 100644
Binary files a/examples/widgets/widgets/icons/images/qt_extended_32x32.png and b/examples/widgets/widgets/icons/images/qt_extended_32x32.png differ
diff --git a/examples/widgets/widgets/icons/images/qt_extended_48x48.png b/examples/widgets/widgets/icons/images/qt_extended_48x48.png
index 8434dc26dbda5bdec1b557c1c1495eec736a24e5..7a93d889001d657658347eab922cdfa2dcbe27d9 100644
Binary files a/examples/widgets/widgets/icons/images/qt_extended_48x48.png and b/examples/widgets/widgets/icons/images/qt_extended_48x48.png differ
diff --git a/mkspecs/common/qcc-base.conf b/mkspecs/common/qcc-base.conf
index 122f940ec3ee74fa248417477b28abb1a486da37..f529d7fc7ba2c6a098db0e59e220e3f53d48d051 100644
--- a/mkspecs/common/qcc-base.conf
+++ b/mkspecs/common/qcc-base.conf
@@ -11,11 +11,15 @@
 
 QMAKE_COMPILER          = rim_qcc gcc   # qcc is mostly gcc in disguise
 
+QMAKE_CFLAGS_OPTIMIZE      = -O2
+QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
+
 QMAKE_CFLAGS           += -Wno-psabi
 QMAKE_CFLAGS_DEPS      += -M
 QMAKE_CFLAGS_WARN_ON   += -Wall -W
 QMAKE_CFLAGS_WARN_OFF  += -w
-QMAKE_CFLAGS_RELEASE   += -O2
+QMAKE_CFLAGS_RELEASE   += $$QMAKE_CFLAGS_OPTIMIZE
+QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -g
 QMAKE_CFLAGS_DEBUG     += -g
 QMAKE_CFLAGS_SHLIB     += -fPIC -shared
 QMAKE_CFLAGS_STATIC_LIB += -fPIC
@@ -36,6 +40,7 @@ QMAKE_CXXFLAGS_DEPS    += $$QMAKE_CFLAGS_DEPS
 QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON
 QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF
 QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
+QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
 QMAKE_CXXFLAGS_DEBUG   += $$QMAKE_CFLAGS_DEBUG
 QMAKE_CXXFLAGS_SHLIB   += $$QMAKE_CFLAGS_SHLIB
 QMAKE_CXXFLAGS_STATIC_LIB += $$QMAKE_CFLAGS_STATIC_LIB
diff --git a/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in b/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in
index 97d340740372d34019d9e69cb80b4826d5a0e413..a6fc9697f41d53cf53d1f2c6a304c9891b84893e 100644
--- a/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in
+++ b/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in
@@ -34,7 +34,7 @@
             <m2:ShowOn Tile=\"square150x150Logo\" />
           </m2:ShowNameOnTiles>
         </m2:DefaultTile>
-        <m2:SplashScreen Image=\"$${WINRT_MANIFEST.logo_splash}\" />
+        <m2:SplashScreen Image=\"$${WINRT_MANIFEST.logo_splash}\" />$${WINRT_MANIFEST.rotation_preference}
       </m2:VisualElements>
     </Application>
   </Applications>$${WINRT_MANIFEST.capabilities}$${WINRT_MANIFEST.dependencies}
diff --git a/mkspecs/common/winrt_winphone/manifests/8.1_wp/AppxManifest.xml.in b/mkspecs/common/winrt_winphone/manifests/8.1_wp/AppxManifest.xml.in
index cf18a4dc790a478d2189cb914a14cc8509aa159e..b75570ad4e3a25f35e0521efea39db914b9984a6 100644
--- a/mkspecs/common/winrt_winphone/manifests/8.1_wp/AppxManifest.xml.in
+++ b/mkspecs/common/winrt_winphone/manifests/8.1_wp/AppxManifest.xml.in
@@ -37,7 +37,7 @@
             <m3:ShowOn Tile=\"square150x150Logo\" />
           </m3:ShowNameOnTiles>
         </m3:DefaultTile>
-        <m3:SplashScreen Image=\"$${WINRT_MANIFEST.logo_480x800}\" />
+        <m3:SplashScreen Image=\"$${WINRT_MANIFEST.logo_480x800}\" />$${WINRT_MANIFEST.rotation_preference}
       </m3:VisualElements>
     </Application>
   </Applications>$${WINRT_MANIFEST.capabilities}$${WINRT_MANIFEST.dependencies}
diff --git a/mkspecs/features/winrt/package_manifest.prf b/mkspecs/features/winrt/package_manifest.prf
index b4242bfdaa52991659aa0d138c0ab6059f502b62..2ccb5db9633f6e50877f93476b62ddfa0e1bdfd1 100644
--- a/mkspecs/features/winrt/package_manifest.prf
+++ b/mkspecs/features/winrt/package_manifest.prf
@@ -24,6 +24,7 @@
 # WINRT_MANIFEST.logo_medium: Medium logo image file. Default provided by the mkspec.
 # WINRT_MANIFEST.logo_large: Large logo image file. Default provided by the mkspec.
 # WINRT_MANIFEST.splash_screen: Splash screen image file. Default provided by the mkspec.
+# WINRT_MANIFEST.rotation_preference: Orientation specification. Default is empty. (portrait, landscape, landscapeFlipped)
 # WINRT_MANIFEST.iconic_tile_icon: Image file for the "iconic" tile template icon. Default provided by the mkspec.
 # WINRT_MANIFEST.iconic_tile_small: Image file for the small "iconic" tile template logo. Default provided by the mkspec.
 # WINRT_MANIFEST.default_language: Specifies the default language of the application
@@ -87,6 +88,20 @@
     isEmpty(WINRT_MANIFEST.foreground): WINRT_MANIFEST.foreground = light
     isEmpty(WINRT_MANIFEST.default_language): WINRT_MANIFEST.default_language = en
 
+    INDENT = "$$escape_expand(\\r\\n)        "
+
+    VS_XML_NAMESPACE = "m2"
+    winphone: VS_XML_NAMESPACE = "m3"
+    WINRT_MANIFEST.rotation_preference = $$unique(WINRT_MANIFEST.rotation_preference)
+    !isEmpty(WINRT_MANIFEST.rotation_preference) {
+        MANIFEST_ROTATION += "<$${VS_XML_NAMESPACE}:InitialRotationPreference>"
+        for(ROTATION, WINRT_MANIFEST.rotation_preference): \
+            MANIFEST_ROTATION += "  <$${VS_XML_NAMESPACE}:Rotation Preference=\"$$ROTATION\" />"
+        MANIFEST_ROTATION += "</$${VS_XML_NAMESPACE}:InitialRotationPreference>"
+
+        WINRT_MANIFEST.rotation_preference = $$join(MANIFEST_ROTATION, $$INDENT, $$INDENT)
+    }
+
     INDENT = "$$escape_expand(\\r\\n)  "
 
     # Capabilities are given as a string list and may change with the configuration (network, sensors, etc.)
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index 949617fa7c093555fad62ab7571c7a7bff7fe683..4c84daae136c36fedd9f4c535c90653eb4259e1b 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -78,7 +78,7 @@
 #  define Q_NO_USING_KEYWORD
 
 #elif defined(_MSC_VER)
-#  define Q_CC_MSVC
+#  define Q_CC_MSVC (_MSC_VER)
 #  define Q_CC_MSVC_NET
 #  define Q_OUTOFLINE_TEMPLATE inline
 #  if _MSC_VER < 1600
@@ -137,14 +137,14 @@
 #  endif
 
 #elif defined(__GNUC__)
-#  define Q_CC_GNU
+#  define Q_CC_GNU          (__GNUC__ * 100 + __GNUC_MINOR__)
 #  define Q_C_CALLBACKS
 #  if defined(__MINGW32__)
 #    define Q_CC_MINGW
 #  endif
 #  if defined(__INTEL_COMPILER)
 /* Intel C++ also masquerades as GCC */
-#    define Q_CC_INTEL
+#    define Q_CC_INTEL      (__INTEL_COMPILER)
 #    define Q_ASSUME_IMPL(expr)  __assume(expr)
 #    define Q_UNREACHABLE_IMPL() __builtin_unreachable()
 #    if __INTEL_COMPILER >= 1300 && !defined(__APPLE__)
@@ -152,7 +152,26 @@
 #    endif
 #  elif defined(__clang__)
 /* Clang also masquerades as GCC */
-#    define Q_CC_CLANG
+#    if defined(__apple_build_version__)
+#      /* http://en.wikipedia.org/wiki/Xcode#Toolchain_Versions */
+#      if __apple_build_version__ >= 600051
+#        define Q_CC_CLANG 305
+#      elif __apple_build_version__ >= 503038
+#        define Q_CC_CLANG 304
+#      elif __apple_build_version__ >= 500275
+#        define Q_CC_CLANG 303
+#      elif __apple_build_version__ >= 425024
+#        define Q_CC_CLANG 302
+#      elif __apple_build_version__ >= 318045
+#        define Q_CC_CLANG 301
+#      elif __apple_build_version__ >= 211101
+#        define Q_CC_CLANG 300
+#      else
+#        error "Unknown Apple Clang version"
+#      endif
+#    else
+#      define Q_CC_CLANG ((__clang_major__ * 100) + __clang_minor__)
+#    endif
 #    define Q_ASSUME_IMPL(expr)  if (expr){} else __builtin_unreachable()
 #    define Q_UNREACHABLE_IMPL() __builtin_unreachable()
 #    if !defined(__has_extension)
@@ -168,7 +187,7 @@
 #    endif
 #  else
 /* Plain GCC */
-#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
+#    if Q_CC_GNU >= 405
 #      define Q_ASSUME_IMPL(expr)  if (expr){} else __builtin_unreachable()
 #      define Q_UNREACHABLE_IMPL() __builtin_unreachable()
 #      define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text)))
@@ -202,7 +221,7 @@
 #      define QT_NO_ARM_EABI
 #    endif
 #  endif
-#  if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 && !defined(Q_CC_CLANG)
+#  if Q_CC_GNU >= 403 && !defined(Q_CC_CLANG)
 #      define Q_ALLOC_SIZE(x) __attribute__((alloc_size(x)))
 #  endif
 
@@ -308,7 +327,7 @@
 
 /* Using the `using' keyword avoids Intel C++ for Linux warnings */
 #  elif defined(__INTEL_COMPILER)
-#    define Q_CC_INTEL
+#    define Q_CC_INTEL      (__INTEL_COMPILER)
 
 /* Uses CFront, make sure to read the manual how to tweak templates. */
 #  elif defined(__ghs)
@@ -566,7 +585,7 @@
 #  endif
 
 // Variadic macros are supported for gnu++98, c++11, c99 ... since 2.9
-#  if ((__clang_major__ * 100) + __clang_minor__) >= 209
+#  if Q_CC_CLANG >= 209
 #    if !defined(__STRICT_ANSI__) || defined(__GXX_EXPERIMENTAL_CXX0X__) \
       || (defined(__cplusplus) && (__cplusplus >= 201103L)) \
       || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))
@@ -668,7 +687,7 @@
 #      define Q_COMPILER_VARIADIC_TEMPLATES
 #    endif
     /* Features that have no __has_feature() check */
-#    if ((__clang_major__ * 100) + __clang_minor__) >= 209 /* since clang 2.9 */
+#    if Q_CC_CLANG >= 209 /* since clang 2.9 */
 #      define Q_COMPILER_EXTERN_TEMPLATES
 #    endif
 #  endif
@@ -709,7 +728,7 @@
 #if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG)
 #  define Q_COMPILER_RESTRICTED_VLA
 #  define Q_COMPILER_THREADSAFE_STATICS
-#  if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
+#  if Q_CC_GNU >= 403
 //   GCC supports binary literals in C, C++98 and C++11 modes
 #    define Q_COMPILER_BINARY_LITERALS
 #  endif
@@ -720,13 +739,13 @@
 #    define Q_COMPILER_VARIADIC_MACROS
 #  endif
 #  if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
-#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
+#    if Q_CC_GNU >= 403
        /* C++11 features supported in GCC 4.3: */
 #      define Q_COMPILER_DECLTYPE
 #      define Q_COMPILER_RVALUE_REFS
 #      define Q_COMPILER_STATIC_ASSERT
 #    endif
-#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404
+#    if Q_CC_GNU >= 404
        /* C++11 features supported in GCC 4.4: */
 #      define Q_COMPILER_AUTO_FUNCTION
 #      define Q_COMPILER_AUTO_TYPE
@@ -735,7 +754,7 @@
 #      define Q_COMPILER_UNICODE_STRINGS
 #      define Q_COMPILER_VARIADIC_TEMPLATES
 #    endif
-#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
+#    if Q_CC_GNU >= 405
        /* C++11 features supported in GCC 4.5: */
 #      define Q_COMPILER_EXPLICIT_CONVERSIONS
        /* GCC 4.4 implements initializer_list but does not define typedefs required
@@ -745,7 +764,7 @@
 #      define Q_COMPILER_RAW_STRINGS
 #      define Q_COMPILER_CLASS_ENUM
 #    endif
-#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
+#    if Q_CC_GNU >= 406
        /* Pre-4.6 compilers implement a non-final snapshot of N2346, hence default and delete
         * functions are supported only if they are public. Starting from 4.6, GCC handles
         * final version - the access modifier is not relevant. */
@@ -757,7 +776,7 @@
 #      define Q_COMPILER_UNRESTRICTED_UNIONS
 #      define Q_COMPILER_RANGE_FOR
 #    endif
-#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407
+#    if Q_CC_GNU >= 407
        /* GCC 4.4 implemented <atomic> and std::atomic using its old intrinsics.
         * However, the implementation is incomplete for most platforms until GCC 4.7:
         * instead, std::atomic would use an external lock. Since we need an std::atomic
@@ -773,20 +792,20 @@
 #      define Q_COMPILER_TEMPLATE_ALIAS
 #      define Q_COMPILER_UDL
 #    endif
-#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408
+#    if Q_CC_GNU >= 408
 #      define Q_COMPILER_ATTRIBUTES
 #      define Q_COMPILER_ALIGNAS
 #      define Q_COMPILER_ALIGNOF
 #      define Q_COMPILER_INHERITING_CONSTRUCTORS
 #      define Q_COMPILER_THREAD_LOCAL
-#      if (__GNUC__ * 100 + __GNUC_MINOR__) > 408 || __GNUC_PATCHLEVEL__ >= 1
+#      if Q_CC_GNU > 408 || __GNUC_PATCHLEVEL__ >= 1
 #         define Q_COMPILER_REF_QUALIFIERS
 #      endif
 #    endif
      /* C++11 features are complete as of GCC 4.8.1 */
 #  endif
 #  if __cplusplus > 201103L
-#    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409
+#    if Q_CC_GNU >= 409
      /* C++1y features in GCC 4.9 - deprecated, do not update this list */
 //#    define Q_COMPILER_BINARY_LITERALS   // already supported since GCC 4.3 as an extension
 #      define Q_COMPILER_LAMBDA_CAPTURES
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 8bc489e5095126dbcc06d69d23325bafce78c8b6..f17ff3dea08f59ef8f28ab59875c8a625288565f 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -877,7 +877,7 @@ public:
 // (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#382).
 // GCC 4.3 and 4.4 have support for decltype, but are affected by DR 382.
 #  if defined(Q_COMPILER_DECLTYPE) && \
-    (defined(Q_CC_CLANG) || defined(Q_CC_INTEL) || !defined(Q_CC_GNU) || (__GNUC__ * 100 + __GNUC_MINOR__) >= 405)
+    (defined(Q_CC_CLANG) || defined(Q_CC_INTEL) || !defined(Q_CC_GNU) || Q_CC_GNU >= 405)
 #    define QT_FOREACH_DECLTYPE(x) typename QtPrivate::remove_reference<decltype(x)>::type
 #  else
 #    define QT_FOREACH_DECLTYPE(x) __typeof__((x))
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index c3ec2bc7f672e378b54fd574d2456a7b116326ca..7ca0aa7f0bfed9134dfb0bd646d814879f6ccdf8 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -84,14 +84,7 @@ class QLibraryInfoPrivate
 {
 public:
     static QSettings *findConfiguration();
-#ifndef QT_BOOTSTRAPPED
-    static void cleanup()
-    {
-        QLibrarySettings *ls = qt_library_settings();
-        if (ls)
-            ls->settings.reset(0);
-    }
-#else
+#ifdef QT_BOOTSTRAPPED
     static bool haveGroup(QLibraryInfo::PathGroup group)
     {
         QLibrarySettings *ls = qt_library_settings();
@@ -114,7 +107,6 @@ QLibrarySettings::QLibrarySettings()
     : settings(QLibraryInfoPrivate::findConfiguration())
 {
 #ifndef QT_BOOTSTRAPPED
-    qAddPostRoutine(QLibraryInfoPrivate::cleanup);
     bool haveEffectivePaths;
     bool havePaths;
 #endif
diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h
index 26ac56396b7864ea760976006cec7e07364fdbf9..55cb31c62b997881a94e43f493329385b878e678 100644
--- a/src/corelib/global/qprocessordetection.h
+++ b/src/corelib/global/qprocessordetection.h
@@ -87,9 +87,9 @@
     ARM is bi-endian, detect using __ARMEL__ or __ARMEB__, falling back to
     auto-detection implemented below.
 */
-#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(__arm64__)
+#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(__aarch64__)
 #  define Q_PROCESSOR_ARM
-#  if defined(__arm64__)
+#  if defined(__aarch64__)
 #    define Q_PROCESSOR_ARM_64
 #  else
 #    define Q_PROCESSOR_ARM_32
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp
index 452e3464d651f0ddf3354f47786d8c18781711a5..b179323fdc00550ce527940ab7dc778098dcf74e 100644
--- a/src/corelib/kernel/qjni.cpp
+++ b/src/corelib/kernel/qjni.cpp
@@ -311,7 +311,7 @@ QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, ...
     }
 }
 
-QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, va_list args)
+QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, const QVaListPrivate &args)
     : d(new QJNIObjectData())
 {
     QJNIEnvironmentPrivate env;
@@ -369,7 +369,7 @@ QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, ...)
     }
 }
 
-QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, va_list args)
+QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, const QVaListPrivate &args)
     : d(new QJNIObjectData())
 {
     QJNIEnvironmentPrivate env;
@@ -402,7 +402,7 @@ QJNIObjectPrivate::QJNIObjectPrivate(jobject obj)
 }
 
 template <>
-void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig, va_list args) const
+void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jmethodID id = getCachedMethodID(env, d->m_jclass, methodName, sig);
@@ -416,12 +416,12 @@ void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig
 {
     va_list args;
     va_start(args, sig);
-    callMethod<void>(methodName, sig, args);
+    callMethodV<void>(methodName, sig, args);
     va_end(args);
 }
 
 template <>
-jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const char *sig, va_list args) const
+jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jboolean res = 0;
@@ -437,13 +437,13 @@ jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const c
 {
     va_list args;
     va_start(args, sig);
-    jboolean res = callMethod<jboolean>(methodName, sig, args);
+    jboolean res = callMethodV<jboolean>(methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *sig, va_list args) const
+jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jbyte res = 0;
@@ -459,13 +459,13 @@ jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *s
 {
     va_list args;
     va_start(args, sig);
-    jbyte res = callMethod<jbyte>(methodName, sig, args);
+    jbyte res = callMethodV<jbyte>(methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *sig, va_list args) const
+jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jchar res = 0;
@@ -481,13 +481,13 @@ jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *s
 {
     va_list args;
     va_start(args, sig);
-    jchar res = callMethod<jchar>(methodName, sig, args);
+    jchar res = callMethodV<jchar>(methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char *sig, va_list args) const
+jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jshort res = 0;
@@ -503,13 +503,13 @@ jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char
 {
     va_list args;
     va_start(args, sig);
-    jshort res = callMethod<jshort>(methodName, sig, args);
+    jshort res = callMethodV<jshort>(methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig, va_list args) const
+jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jint res = 0;
@@ -525,13 +525,13 @@ jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig
 {
     va_list args;
     va_start(args, sig);
-    jint res = callMethod<jint>(methodName, sig, args);
+    jint res = callMethodV<jint>(methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *sig, va_list args) const
+jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jlong res = 0;
@@ -547,13 +547,13 @@ jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *s
 {
     va_list args;
     va_start(args, sig);
-    jlong res = callMethod<jlong>(methodName, sig, args);
+    jlong res = callMethodV<jlong>(methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char *sig, va_list args) const
+jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jfloat res = 0.f;
@@ -569,13 +569,13 @@ jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char
 {
     va_list args;
     va_start(args, sig);
-    jfloat res = callMethod<jfloat>(methodName, sig, args);
+    jfloat res = callMethodV<jfloat>(methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const char *sig, va_list args) const
+jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const char *sig, va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jdouble res = 0.;
@@ -591,7 +591,7 @@ jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const cha
 {
     va_list args;
     va_start(args, sig);
-    jdouble res = callMethod<jdouble>(methodName, sig, args);
+    jdouble res = callMethodV<jdouble>(methodName, sig, args);
     va_end(args);
     return res;
 }
@@ -651,10 +651,10 @@ jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName) const
 }
 
 template <>
-void QJNIObjectPrivate::callStaticMethod<void>(const char *className,
-                                               const char *methodName,
-                                               const char *sig,
-                                               va_list args)
+void QJNIObjectPrivate::callStaticMethodV<void>(const char *className,
+                                                const char *methodName,
+                                                const char *sig,
+                                                va_list args)
 {
     QJNIEnvironmentPrivate env;
     jclass clazz = loadClass(className, env);
@@ -674,15 +674,15 @@ void QJNIObjectPrivate::callStaticMethod<void>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    callStaticMethod<void>(className, methodName, sig, args);
+    callStaticMethodV<void>(className, methodName, sig, args);
     va_end(args);
 }
 
 template <>
-void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz,
-                                               const char *methodName,
-                                               const char *sig,
-                                               va_list args)
+void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz,
+                                                const char *methodName,
+                                                const char *sig,
+                                                va_list args)
 {
     QJNIEnvironmentPrivate env;
     jmethodID id = getCachedMethodID(env, clazz, methodName, sig, true);
@@ -699,15 +699,15 @@ void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    callStaticMethod<void>(clazz, methodName, sig, args);
+    callStaticMethodV<void>(clazz, methodName, sig, args);
     va_end(args);
 }
 
 template <>
-jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className,
-                                                       const char *methodName,
-                                                       const char *sig,
-                                                       va_list args)
+jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className,
+                                                        const char *methodName,
+                                                        const char *sig,
+                                                        va_list args)
 {
     QJNIEnvironmentPrivate env;
     jboolean res = 0;
@@ -730,16 +730,16 @@ jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    jboolean res = callStaticMethod<jboolean>(className, methodName, sig, args);
+    jboolean res = callStaticMethodV<jboolean>(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz,
-                                                       const char *methodName,
-                                                       const char *sig,
-                                                       va_list args)
+jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz,
+                                                        const char *methodName,
+                                                        const char *sig,
+                                                        va_list args)
 {
     QJNIEnvironmentPrivate env;
     jboolean res = 0;
@@ -759,16 +759,16 @@ jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    jboolean res = callStaticMethod<jboolean>(clazz, methodName, sig, args);
+    jboolean res = callStaticMethodV<jboolean>(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className,
-                                                 const char *methodName,
-                                                 const char *sig,
-                                                 va_list args)
+jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className,
+                                                  const char *methodName,
+                                                  const char *sig,
+                                                  va_list args)
 {
     QJNIEnvironmentPrivate env;
     jbyte res = 0;
@@ -791,16 +791,16 @@ jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    jbyte res = callStaticMethod<jbyte>(className, methodName, sig, args);
+    jbyte res = callStaticMethodV<jbyte>(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz,
-                                                 const char *methodName,
-                                                 const char *sig,
-                                                 va_list args)
+jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz,
+                                                  const char *methodName,
+                                                  const char *sig,
+                                                  va_list args)
 {
     QJNIEnvironmentPrivate env;
     jbyte res = 0;
@@ -820,16 +820,16 @@ jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    jbyte res = callStaticMethod<jbyte>(clazz, methodName, sig, args);
+    jbyte res = callStaticMethodV<jbyte>(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className,
-                                                 const char *methodName,
-                                                 const char *sig,
-                                                 va_list args)
+jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className,
+                                                  const char *methodName,
+                                                  const char *sig,
+                                                  va_list args)
 {
     QJNIEnvironmentPrivate env;
     jchar res = 0;
@@ -852,16 +852,16 @@ jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    jchar res = callStaticMethod<jchar>(className, methodName, sig, args);
+    jchar res = callStaticMethodV<jchar>(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz,
-                                                 const char *methodName,
-                                                 const char *sig,
-                                                 va_list args)
+jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz,
+                                                  const char *methodName,
+                                                  const char *sig,
+                                                  va_list args)
 {
     QJNIEnvironmentPrivate env;
     jchar res = 0;
@@ -881,16 +881,16 @@ jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    jchar res = callStaticMethod<jchar>(clazz, methodName, sig, args);
+    jchar res = callStaticMethodV<jchar>(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className,
-                                                   const char *methodName,
-                                                   const char *sig,
-                                                   va_list args)
+jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className,
+                                                    const char *methodName,
+                                                    const char *sig,
+                                                    va_list args)
 {
     QJNIEnvironmentPrivate env;
     jshort res = 0;
@@ -913,16 +913,16 @@ jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    jshort res = callStaticMethod<jshort>(className, methodName, sig, args);
+    jshort res = callStaticMethodV<jshort>(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz,
-                                                   const char *methodName,
-                                                   const char *sig,
-                                                   va_list args)
+jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz,
+                                                    const char *methodName,
+                                                    const char *sig,
+                                                    va_list args)
 {
     QJNIEnvironmentPrivate env;
     jshort res = 0;
@@ -942,16 +942,16 @@ jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    jshort res = callStaticMethod<jshort>(clazz, methodName, sig, args);
+    jshort res = callStaticMethodV<jshort>(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className,
-                                               const char *methodName,
-                                               const char *sig,
-                                               va_list args)
+jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className,
+                                                const char *methodName,
+                                                const char *sig,
+                                                va_list args)
 {
     QJNIEnvironmentPrivate env;
     jint res = 0;
@@ -974,16 +974,16 @@ jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    jint res = callStaticMethod<jint>(className, methodName, sig, args);
+    jint res = callStaticMethodV<jint>(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz,
-                                               const char *methodName,
-                                               const char *sig,
-                                               va_list args)
+jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz,
+                                                const char *methodName,
+                                                const char *sig,
+                                                va_list args)
 {
     QJNIEnvironmentPrivate env;
     jint res = 0;
@@ -1003,16 +1003,16 @@ jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    jint res = callStaticMethod<jint>(clazz, methodName, sig, args);
+    jint res = callStaticMethodV<jint>(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className,
-                                                 const char *methodName,
-                                                 const char *sig,
-                                                 va_list args)
+jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className,
+                                                  const char *methodName,
+                                                  const char *sig,
+                                                  va_list args)
 {
     QJNIEnvironmentPrivate env;
     jlong res = 0;
@@ -1035,16 +1035,16 @@ jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    jlong res = callStaticMethod<jlong>(className, methodName, sig, args);
+    jlong res = callStaticMethodV<jlong>(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz,
-                                                 const char *methodName,
-                                                 const char *sig,
-                                                 va_list args)
+jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz,
+                                                  const char *methodName,
+                                                  const char *sig,
+                                                  va_list args)
 {
     QJNIEnvironmentPrivate env;
     jlong res = 0;
@@ -1064,16 +1064,16 @@ jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    jlong res = callStaticMethod<jlong>(clazz, methodName, sig, args);
+    jlong res = callStaticMethodV<jlong>(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className,
-                                                   const char *methodName,
-                                                   const char *sig,
-                                                   va_list args)
+jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className,
+                                                    const char *methodName,
+                                                    const char *sig,
+                                                    va_list args)
 {
     QJNIEnvironmentPrivate env;
     jfloat res = 0.f;
@@ -1096,16 +1096,16 @@ jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    jfloat res = callStaticMethod<jfloat>(className, methodName, sig, args);
+    jfloat res = callStaticMethodV<jfloat>(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz,
-                                                   const char *methodName,
-                                                   const char *sig,
-                                                   va_list args)
+jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz,
+                                                    const char *methodName,
+                                                    const char *sig,
+                                                    va_list args)
 {
     QJNIEnvironmentPrivate env;
     jfloat res = 0.f;
@@ -1125,16 +1125,16 @@ jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    jfloat res = callStaticMethod<jfloat>(clazz, methodName, sig, args);
+    jfloat res = callStaticMethodV<jfloat>(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className,
-                                                     const char *methodName,
-                                                     const char *sig,
-                                                     va_list args)
+jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className,
+                                                      const char *methodName,
+                                                      const char *sig,
+                                                      va_list args)
 {
     QJNIEnvironmentPrivate env;
     jdouble res = 0.;
@@ -1157,16 +1157,16 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className,
 {
     va_list args;
     va_start(args, sig);
-    jdouble res = callStaticMethod<jdouble>(className, methodName, sig, args);
+    jdouble res = callStaticMethodV<jdouble>(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
 template <>
-jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz,
-                                                     const char *methodName,
-                                                     const char *sig,
-                                                     va_list args)
+jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz,
+                                                      const char *methodName,
+                                                      const char *sig,
+                                                      va_list args)
 {
     QJNIEnvironmentPrivate env;
     jdouble res = 0.;
@@ -1186,7 +1186,7 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    jdouble res = callStaticMethod<jdouble>(clazz, methodName, sig, args);
+    jdouble res = callStaticMethodV<jdouble>(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
@@ -1299,9 +1299,9 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, const char *m
     return callStaticMethod<jdouble>(clazz, methodName, "()D");
 }
 
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod(const char *methodName,
-                                                      const char *sig,
-                                                      va_list args) const
+QJNIObjectPrivate QJNIObjectPrivate::callObjectMethodV(const char *methodName,
+                                                       const char *sig,
+                                                       va_list args) const
 {
     QJNIEnvironmentPrivate env;
     jobject res = 0;
@@ -1323,7 +1323,7 @@ QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod(const char *methodName,
 {
     va_list args;
     va_start(args, sig);
-    QJNIObjectPrivate res = callObjectMethod(methodName, sig, args);
+    QJNIObjectPrivate res = callObjectMethodV(methodName, sig, args);
     va_end(args);
     return res;
 }
@@ -1376,10 +1376,10 @@ QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jdoubleArray>(const char *
     return callObjectMethod(methodName, "()[D");
 }
 
-QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(const char *className,
-                                                            const char *methodName,
-                                                            const char *sig,
-                                                            va_list args)
+QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethodV(const char *className,
+                                                             const char *methodName,
+                                                             const char *sig,
+                                                             va_list args)
 {
     QJNIEnvironmentPrivate env;
     jobject res = 0;
@@ -1405,15 +1405,15 @@ QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(const char *classNam
 {
     va_list args;
     va_start(args, sig);
-    QJNIObjectPrivate res = callStaticObjectMethod(className, methodName, sig, args);
+    QJNIObjectPrivate res = callStaticObjectMethodV(className, methodName, sig, args);
     va_end(args);
     return res;
 }
 
-QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(jclass clazz,
-                                                            const char *methodName,
-                                                            const char *sig,
-                                                            va_list args)
+QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethodV(jclass clazz,
+                                                             const char *methodName,
+                                                             const char *sig,
+                                                             va_list args)
 {
     QJNIEnvironmentPrivate env;
     jobject res = 0;
@@ -1436,7 +1436,7 @@ QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(jclass clazz,
 {
     va_list args;
     va_start(args, sig);
-    QJNIObjectPrivate res = callStaticObjectMethod(clazz, methodName, sig, args);
+    QJNIObjectPrivate res = callStaticObjectMethodV(clazz, methodName, sig, args);
     va_end(args);
     return res;
 }
diff --git a/src/corelib/kernel/qjni_p.h b/src/corelib/kernel/qjni_p.h
index 19f2cf760123cab2d77907dfd1cffb688c0bd3ba..5f573624c68cb159eca94d8b7dae98fcb812342c 100644
--- a/src/corelib/kernel/qjni_p.h
+++ b/src/corelib/kernel/qjni_p.h
@@ -186,31 +186,37 @@ public:
 private:
     friend class QAndroidJniObject;
 
-    QJNIObjectPrivate(const char *className, const char *sig, va_list args);
-    QJNIObjectPrivate(jclass clazz, const char *sig, va_list args);
+    struct QVaListPrivate { operator va_list &() const { return m_args; } va_list &m_args; };
+
+    QJNIObjectPrivate(const char *className, const char *sig, const QVaListPrivate &args);
+    QJNIObjectPrivate(jclass clazz, const char *sig, const QVaListPrivate &args);
 
     template <typename T>
-    T callMethod(const char *methodName,
-                 const char *sig,
-                 va_list args) const;
-    QJNIObjectPrivate callObjectMethod(const char *methodName,
-                                       const char *sig,
-                                       va_list args) const;
+    T callMethodV(const char *methodName,
+                   const char *sig,
+                   va_list args) const;
+    QJNIObjectPrivate callObjectMethodV(const char *methodName,
+                                        const char *sig,
+                                        va_list args) const;
     template <typename T>
-    static T callStaticMethod(const char *className,
-                              const char *methodName,
-                              const char *sig, va_list args);
+    static T callStaticMethodV(const char *className,
+                               const char *methodName,
+                               const char *sig,
+                               va_list args);
     template <typename T>
-    static T callStaticMethod(jclass clazz,
-                              const char *methodName,
-                              const char *sig, va_list args);
-    static QJNIObjectPrivate callStaticObjectMethod(const char *className,
-                                                    const char *methodName,
-                                                    const char *sig, va_list args);
-
-    static QJNIObjectPrivate callStaticObjectMethod(jclass clazz,
-                                                    const char *methodName,
-                                                    const char *sig, va_list args);
+    static T callStaticMethodV(jclass clazz,
+                               const char *methodName,
+                               const char *sig,
+                               va_list args);
+    static QJNIObjectPrivate callStaticObjectMethodV(const char *className,
+                                                     const char *methodName,
+                                                     const char *sig,
+                                                     va_list args);
+
+    static QJNIObjectPrivate callStaticObjectMethodV(jclass clazz,
+                                                     const char *methodName,
+                                                     const char *sig,
+                                                     va_list args);
 
     bool isSameObject(jobject obj) const;
     bool isSameObject(const QJNIObjectPrivate &other) const;
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 33827926c69dc996a6ab3fbdebfadf5ff5981ffb..dc56ad88a11ea6bf9481461d1ba0dcb949b0b6c8 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -426,9 +426,8 @@ QTranslator::~QTranslator()
     directory. Returns \c true if the translation is successfully loaded;
     otherwise returns \c false.
 
-    If \a directory is not specified, the directory of the
-    application's executable is used (i.e., as
-    \l{QCoreApplication::}{applicationDirPath()}).
+    If \a directory is not specified, the current directory is used
+    (i.e., as \l{QDir::}{currentPath()}).
 
     The previous contents of this translator object are discarded.
 
diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h
index 4e9a60504a5b70b8e2af4ee52975dcdf3606cc76..c424344c3a2d2d25d6e255097ef2c6e1efad21ec 100644
--- a/src/corelib/plugin/qplugin.h
+++ b/src/corelib/plugin/qplugin.h
@@ -71,7 +71,7 @@ Q_DECLARE_TYPEINFO(QStaticPlugin, Q_PRIMITIVE_TYPE);
 
 void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
 
-#if defined (Q_OF_ELF) && (defined (Q_CC_GNU) || defined(Q_CC_CLANG))
+#if (defined(Q_OF_ELF) || defined(Q_OS_WIN)) && (defined (Q_CC_GNU) || defined(Q_CC_CLANG))
 #  define QT_PLUGIN_METADATA_SECTION \
     __attribute__ ((section (".qtmetadata"))) __attribute__((used))
 #elif defined(Q_OS_MAC)
diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h
index 09500e92d763df1dd0854e61fa0d83730d5b3124..be293f58e343cd7dec7d0a1a299b5a908ed09449 100644
--- a/src/corelib/thread/qbasicatomic.h
+++ b/src/corelib/thread/qbasicatomic.h
@@ -84,13 +84,9 @@ QT_END_NAMESPACE
 // New atomics
 
 #if defined(Q_COMPILER_CONSTEXPR) && defined(Q_COMPILER_DEFAULT_MEMBERS) && defined(Q_COMPILER_DELETE_MEMBERS)
-# if defined(Q_CC_CLANG) && ((((__clang_major__ * 100) + __clang_minor__) < 303) \
-                             || defined(__apple_build_version__) \
-                            )
-   /* Do not define QT_BASIC_ATOMIC_HAS_CONSTRUCTORS for "stock" clang before version 3.3.
-      Apple's version has different (higher!) version numbers, so disable it for all of them for now.
-      (The only way to distinguish between them seems to be a check for __apple_build_version__ .)
-
+# if defined(Q_CC_CLANG) && Q_CC_CLANG < 303
+   /*
+      Do not define QT_BASIC_ATOMIC_HAS_CONSTRUCTORS for Clang before version 3.3.
       For details about the bug: see http://llvm.org/bugs/show_bug.cgi?id=12670
     */
 # else
diff --git a/src/corelib/tools/qelapsedtimer_unix.cpp b/src/corelib/tools/qelapsedtimer_unix.cpp
index 5b26d551a72bd8531f5d40dfba38241d2cb60dc5..9dd5df0266910da547e234505da35c6e2e4bf774 100644
--- a/src/corelib/tools/qelapsedtimer_unix.cpp
+++ b/src/corelib/tools/qelapsedtimer_unix.cpp
@@ -35,8 +35,12 @@
 #define _POSIX_C_SOURCE 200809L
 
 #include "qelapsedtimer.h"
-#ifdef Q_OS_VXWORKS
+#if defined(Q_OS_VXWORKS)
 #include "qfunctions_vxworks.h"
+#elif defined(Q_OS_QNX)
+#include <sys/neutrino.h>
+#include <sys/syspage.h>
+#include <inttypes.h>
 #else
 #include <sys/time.h>
 #include <time.h>
@@ -84,7 +88,18 @@ QT_BEGIN_NAMESPACE
  *  see http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html
  */
 
-#ifndef CLOCK_REALTIME
+#if defined(Q_OS_QNX)
+static inline void qt_clock_gettime(clockid_t clock, struct timespec *ts)
+{
+    // The standard POSIX clock calls only have 1ms accuracy on QNX.  To get
+    // higher accuracy, this platform-specific function must be used instead
+    quint64 cycles_per_sec = SYSPAGE_ENTRY(qtime)->cycles_per_sec;
+    quint64 cycles = ClockCycles();
+    ts->tv_sec = cycles / cycles_per_sec;
+    quint64 mod = cycles % cycles_per_sec;
+    ts->tv_nsec = mod * Q_INT64_C(1000000000) / cycles_per_sec;
+}
+#elif !defined(CLOCK_REALTIME)
 #  define CLOCK_REALTIME 0
 static inline void qt_clock_gettime(int, struct timespec *ts)
 {
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index 0b3bbc0ad0d5d1328a6af865b895a12d7d3e186d..5281723c5da379cbe7b4ab5d5a46d3edb17678cc 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -519,7 +519,7 @@ QBasicAtomicInt qt_cpu_features = Q_BASIC_ATOMIC_INITIALIZER(0);
 void qDetectCpuFeatures()
 {
 #if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
-# if (__GNUC__ * 100 + __GNUC_MINOR__) < 403
+# if Q_CC_GNU < 403
     // GCC 4.2 (at least the one that comes with Apple's XCode, on Mac) is
     // known to be broken beyond repair in dealing with the inline assembly
     // above. It will generate bad code that could corrupt important registers
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
index 434819aa61d7a724a7a75df2f3099d37a950ca96..891a3ff05348a4c04b1ee783e7d5db092754daa9 100644
--- a/src/corelib/tools/qsimd_p.h
+++ b/src/corelib/tools/qsimd_p.h
@@ -218,8 +218,8 @@
 #endif
 
 // other x86 intrinsics
-#if defined(Q_PROCESSOR_X86) && ((defined(Q_CC_GNU) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)) \
-    || (defined(Q_CC_CLANG) && (__clang_major__ * 100 + __clang_minor__ >= 208)) \
+#if defined(Q_PROCESSOR_X86) && ((defined(Q_CC_GNU) && (Q_CC_GNU >= 404)) \
+    || (defined(Q_CC_CLANG) && (Q_CC_CLANG >= 208)) \
     || defined(Q_CC_INTEL))
 #  define QT_COMPILER_SUPPORTS_X86INTRIN
 #  ifdef Q_CC_INTEL
@@ -332,7 +332,7 @@ static __forceinline unsigned long _bit_scan_forward(uint val)
     _BitScanForward(&result, val);
     return result;
 }
-#  elif (defined(Q_CC_CLANG) || (defined(Q_CC_GNU) && __GNUC__ * 100 + __GNUC_MINOR__ < 405)) \
+#  elif (defined(Q_CC_CLANG) || (defined(Q_CC_GNU) && Q_CC_GNU < 405)) \
     && !defined(Q_CC_INTEL)
 // Clang is missing the intrinsic for _bit_scan_reverse
 // GCC only added it in version 4.5
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 71ca4239d058016895e2f820a27bb9437f52a1b9..ef12c1b8e307ab57bb0fe38b211b5074915fe5d4 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -6336,8 +6336,7 @@ ushort QString::toUShort(bool *ok, int base) const
 
     \snippet qstring/main.cpp 66
 
-    Various string formats for floating point numbers can be converted
-    to double values:
+    \warning The QString content may only contain valid numerical characters which includes the plus/minus sign, the characters g and e used in scientific notation, and the decimal point. Including the unit or additional characters leads to a conversion error.
 
     \snippet qstring/main.cpp 67
 
@@ -6346,7 +6345,7 @@ ushort QString::toUShort(bool *ok, int base) const
 
     \snippet qstring/main.cpp 68
 
-    For historic reasons, this function does not handle
+    For historical reasons, this function does not handle
     thousands group separators. If you need to convert such numbers,
     use QLocale::toDouble().
 
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index b0fbbc157015972ccb48908411d9f0f361c78945..99bf469f871c90275528a25793d1d86b22760fc0 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -1122,6 +1122,10 @@ Qt::WindowState QWindow::windowState() const
     This is a hint to the window manager that this window is a dialog or pop-up
     on behalf of the given window.
 
+    In order to cause the window to be centered above its transient parent by
+    default, depending on the window manager, it may also be necessary to call
+    setFlags() with a suitable \l Qt::WindowType (such as \c Qt::Dialog).
+
     \sa transientParent(), parent()
 */
 void QWindow::setTransientParent(QWindow *parent)
diff --git a/src/gui/opengl/qopengltextureglyphcache.cpp b/src/gui/opengl/qopengltextureglyphcache.cpp
index 0f70a01014a11716732f9dd159b4e046ee26ea6e..cd268cd685f7d092f4f21257a9224dfe43f7cb78 100644
--- a/src/gui/opengl/qopengltextureglyphcache.cpp
+++ b/src/gui/opengl/qopengltextureglyphcache.cpp
@@ -82,10 +82,12 @@ QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache()
     clear();
 }
 
+#if !defined(QT_OPENGL_ES_2)
 static inline bool isCoreProfile()
 {
     return QOpenGLContext::currentContext()->format().profile() == QSurfaceFormat::CoreProfile;
 }
+#endif
 
 void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
 {
diff --git a/src/gui/text/qtextimagehandler.cpp b/src/gui/text/qtextimagehandler.cpp
index f6525448def3d59d99f2800a846b143521d6241f..37c18e3624c5db67e7ab8880ceb2798952f333ea 100644
--- a/src/gui/text/qtextimagehandler.cpp
+++ b/src/gui/text/qtextimagehandler.cpp
@@ -44,31 +44,49 @@
 
 QT_BEGIN_NAMESPACE
 
-static QString resolve2xFile(const QString &fileName, qreal targetDevicePixelRatio)
+static QString resolveFileName(QString fileName, QUrl *url, qreal targetDevicePixelRatio)
 {
+    // We might use the fileName for loading if url loading fails
+    // try to make sure it is a valid file path.
+    // Also, QFile{Info}::exists works only on filepaths (not urls)
+
+    if (url->isValid()) {
+      if (url->scheme() == QLatin1Literal("qrc")) {
+        fileName = fileName.right(fileName.length() - 3);
+      }
+      else if (url->scheme() == QLatin1Literal("file")) {
+        fileName = url->toLocalFile();
+      }
+    }
+
     if (targetDevicePixelRatio <= 1.0)
         return fileName;
 
-    int dotIndex = fileName.lastIndexOf(QLatin1Char('.'));
+    // try to find a 2x version
+
+    const int dotIndex = fileName.lastIndexOf(QLatin1Char('.'));
     if (dotIndex != -1) {
         QString at2xfileName = fileName;
         at2xfileName.insert(dotIndex, QStringLiteral("@2x"));
-        if (QFile::exists(at2xfileName))
-            return at2xfileName;
+        if (QFile::exists(at2xfileName))  {
+            fileName = at2xfileName;
+            *url = QUrl(fileName);
+        }
     }
+
     return fileName;
 }
 
-static QPixmap getPixmap(QTextDocument *doc, const QTextImageFormat &format)
+
+static QPixmap getPixmap(QTextDocument *doc, const QTextImageFormat &format, const qreal devicePixelRatio = 1.0)
 {
     QPixmap pm;
 
     QString name = format.name();
-    if (name.startsWith(QLatin1String(":/"))) // auto-detect resources
+    if (name.startsWith(QLatin1String(":/"))) // auto-detect resources and convert them to url
         name.prepend(QLatin1String("qrc"));
-    QPaintDevice *pdev = doc->documentLayout()->paintDevice();
-    name = resolve2xFile(name, pdev ? pdev->devicePixelRatio() : qApp->devicePixelRatio());
     QUrl url = QUrl(name);
+    name = resolveFileName(name, &url, devicePixelRatio);
     const QVariant data = doc->resource(QTextDocument::ImageResource, url);
     if (data.type() == QVariant::Pixmap || data.type() == QVariant::Image) {
         pm = qvariant_cast<QPixmap>(data);
@@ -77,19 +95,18 @@ static QPixmap getPixmap(QTextDocument *doc, const QTextImageFormat &format)
     }
 
     if (pm.isNull()) {
-        QString context;
 #if 0
+        QString context;
         // ### Qt5
         QTextBrowser *browser = qobject_cast<QTextBrowser *>(doc->parent());
         if (browser)
             context = browser->source().toString();
 #endif
+        // try direct loading
         QImage img;
-        if (img.isNull()) { // try direct loading
-            name = format.name(); // remove qrc:/ prefix again
-            if (name.isEmpty() || !img.load(name))
-                return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
-        }
+        if (name.isEmpty() || !img.load(name))
+            return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
+
         pm = QPixmap::fromImage(img);
         doc->addResource(QTextDocument::ImageResource, url, pm);
     }
@@ -142,16 +159,15 @@ static QSize getPixmapSize(QTextDocument *doc, const QTextImageFormat &format)
     return size;
 }
 
-static QImage getImage(QTextDocument *doc, const QTextImageFormat &format)
+static QImage getImage(QTextDocument *doc, const QTextImageFormat &format, const qreal devicePixelRatio = 1.0)
 {
     QImage image;
 
     QString name = format.name();
     if (name.startsWith(QLatin1String(":/"))) // auto-detect resources
         name.prepend(QLatin1String("qrc"));
-    QPaintDevice *pdev = doc->documentLayout()->paintDevice();
-    name = resolve2xFile(name, pdev ? pdev->devicePixelRatio() : qApp->devicePixelRatio());
     QUrl url = QUrl(name);
+    name = resolveFileName(name, &url, devicePixelRatio);
     const QVariant data = doc->resource(QTextDocument::ImageResource, url);
     if (data.type() == QVariant::Image) {
         image = qvariant_cast<QImage>(data);
@@ -160,19 +176,18 @@ static QImage getImage(QTextDocument *doc, const QTextImageFormat &format)
     }
 
     if (image.isNull()) {
-        QString context;
-
 #if 0
+        QString context;
         // ### Qt5
         QTextBrowser *browser = qobject_cast<QTextBrowser *>(doc->parent());
         if (browser)
             context = browser->source().toString();
 #endif
-        if (image.isNull()) { // try direct loading
-            name = format.name(); // remove qrc:/ prefix again
-            if (name.isEmpty() || !image.load(name))
-                return QImage(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
-        }
+        // try direct loading
+
+        if (name.isEmpty() || !image.load(name))
+            return QImage(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
+
         doc->addResource(QTextDocument::ImageResource, url, image);
     }
 
@@ -241,10 +256,10 @@ void QTextImageHandler::drawObject(QPainter *p, const QRectF &rect, QTextDocumen
         const QTextImageFormat imageFormat = format.toImageFormat();
 
     if (QCoreApplication::instance()->thread() != QThread::currentThread()) {
-        const QImage image = getImage(doc, imageFormat);
+        const QImage image = getImage(doc, imageFormat, p->device()->devicePixelRatio());
         p->drawImage(rect, image, image.rect());
     } else {
-        const QPixmap pixmap = getPixmap(doc, imageFormat);
+        const QPixmap pixmap = getPixmap(doc, imageFormat, p->device()->devicePixelRatio());
         p->drawPixmap(rect, pixmap, pixmap.rect());
     }
 }
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index f00b58a8ce76456c036e1dc68fdd1b42e3478730..52d56fb07161a89fd124481d210a5f9834884ad8 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -1135,7 +1135,12 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
     if (!d->networkSessionStrongRef && (d->initializeSession || !d->networkConfiguration.identifier().isEmpty())) {
         QNetworkConfigurationManager manager;
         if (!d->networkConfiguration.identifier().isEmpty()) {
-            d->createSession(d->networkConfiguration);
+            if ((d->networkConfiguration.state() & QNetworkConfiguration::Defined)
+                    && d->networkConfiguration != manager.defaultConfiguration())
+                d->createSession(manager.defaultConfiguration());
+            else
+                d->createSession(d->networkConfiguration);
+
         } else {
             if (manager.capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)
                 d->createSession(manager.defaultConfiguration());
@@ -1590,6 +1595,11 @@ void QNetworkAccessManagerPrivate::_q_onlineStateChanged(bool isOnline)
     if (customNetworkConfiguration) {
         online = (networkConfiguration.state() & QNetworkConfiguration::Active);
     } else {
+        if (isOnline && online != isOnline) {
+            networkSessionStrongRef.clear();
+            networkSessionWeakRef.clear();
+        }
+
         online = isOnline;
     }
 }
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 27b085ddbd9bc5d7de91eb67b4b02974b53a7c18..8887f478dd1af732b0c1d37c6646eb044d3e69fb 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -1908,18 +1908,14 @@ qint64 QSslSocket::readData(char *data, qint64 maxlen)
 
     if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
         readBytes = d->plainSocket->read(data, maxlen);
-    } else {
-        int bytesToRead = qMin<int>(maxlen, d->buffer.size());
-        readBytes = d->buffer.read(data, bytesToRead);
-    }
-
 #ifdef QSSLSOCKET_DEBUG
-    qDebug() << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") ==" << readBytes;
+        qDebug() << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") =="
+                 << readBytes;
 #endif
-
-    // possibly trigger another transmit() to decrypt more data from the socket
-    if (d->buffer.isEmpty() && d->plainSocket->bytesAvailable()) {
-        QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection);
+    } else {
+        // possibly trigger another transmit() to decrypt more data from the socket
+        if (d->plainSocket->bytesAvailable())
+            QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection);
     }
 
     return readBytes;
diff --git a/src/plugins/bearer/connman/connman.pro b/src/plugins/bearer/connman/connman.pro
index bc4efe8b62106a817eb1747a9c6e73dffb0d737a..efa13a6ebdc40a71e0cdd047cb4a9bc24493310b 100644
--- a/src/plugins/bearer/connman/connman.pro
+++ b/src/plugins/bearer/connman/connman.pro
@@ -8,14 +8,14 @@ QT = core network-private dbus
 CONFIG += link_pkgconfig
 
 HEADERS += qconnmanservice_linux_p.h \
-           qofonoservice_linux_p.h \
+           ../linux_common/qofonoservice_linux_p.h \
            qconnmanengine.h \
            ../qnetworksession_impl.h \
            ../qbearerengine_impl.h
 
 SOURCES += main.cpp \
            qconnmanservice_linux.cpp \
-           qofonoservice_linux.cpp \
+           ../linux_common/qofonoservice_linux.cpp \
            qconnmanengine.cpp \
            ../qnetworksession_impl.cpp
 
diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h
index 52e8b384a047c248ecd5cfa7ddfac3ad40278b79..a995d8ed25dabe44288b518acb87a183436b8fa8 100644
--- a/src/plugins/bearer/connman/qconnmanengine.h
+++ b/src/plugins/bearer/connman/qconnmanengine.h
@@ -48,7 +48,7 @@
 #include "../qbearerengine_impl.h"
 
 #include "qconnmanservice_linux_p.h"
-#include "qofonoservice_linux_p.h"
+#include "../linux_common/qofonoservice_linux_p.h"
 
 #include <QMap>
 #include <QVariant>
diff --git a/src/plugins/bearer/connman/qofonoservice_linux.cpp b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
similarity index 74%
rename from src/plugins/bearer/connman/qofonoservice_linux.cpp
rename to src/plugins/bearer/linux_common/qofonoservice_linux.cpp
index 2ce2bd40e453aeebc33f943f97f8414eaf89b81f..b2e2131a92d482cb0437f84a2a2492b77ae86cfc 100644
--- a/src/plugins/bearer/connman/qofonoservice_linux.cpp
+++ b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
@@ -95,14 +95,12 @@ QStringList QOfonoManagerInterface::getModems()
 {
     if (modemList.isEmpty()) {
         QList<QVariant> argumentList;
-        QDBusPendingReply<PathPropertiesList> reply = asyncCallWithArgumentList(QLatin1String("GetModems"), argumentList);
+        QDBusPendingReply<PathPropertiesList> reply = callWithArgumentList(QDBus::Block, QLatin1String("GetModems"), argumentList);
         reply.waitForFinished();
         if (!reply.isError()) {
             foreach (ObjectPathProperties modem, reply.value()) {
                 modemList << modem.path.path();
             }
-        } else {
-            qDebug() << reply.error().message();
         }
     }
 
@@ -114,7 +112,8 @@ QString QOfonoManagerInterface::currentModem()
     QStringList modems = getModems();
     foreach (const QString &modem, modems) {
         QOfonoModemInterface device(modem);
-        if (device.isPowered() && device.isOnline())
+        if (device.isPowered() && device.isOnline()
+                && device.interfaces().contains(QStringLiteral("org.ofono.NetworkRegistration")))
         return modem;
     }
     return QString();
@@ -171,11 +170,17 @@ bool QOfonoModemInterface::isOnline()
     return qdbus_cast<bool>(var);
 }
 
+QStringList QOfonoModemInterface::interfaces()
+{
+    const QVariant var = getProperty(QStringLiteral("Interfaces"));
+    return var.toStringList();
+}
+
 QVariantMap QOfonoModemInterface::getProperties()
 {
     if (propertiesMap.isEmpty()) {
         QList<QVariant> argumentList;
-        QDBusPendingReply<QVariantMap> reply = asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList);
+        QDBusPendingReply<QVariantMap> reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList);
         if (!reply.isError()) {
             propertiesMap = reply.value();
         }
@@ -187,7 +192,8 @@ QVariant QOfonoModemInterface::getProperty(const QString &property)
 {
     QVariant var;
     QVariantMap map = getProperties();
-    var = map.value(property);
+    if (map.contains(property))
+        var = map.value(property);
     return var;
 }
 
@@ -214,7 +220,8 @@ QVariant QOfonoNetworkRegistrationInterface::getProperty(const QString &property
 {
     QVariant var;
     QVariantMap map = getProperties();
-    var = map.value(property);
+    if (map.contains(property))
+        var = map.value(property);
     return var;
 }
 
@@ -222,12 +229,10 @@ QVariantMap QOfonoNetworkRegistrationInterface::getProperties()
 {
     if (propertiesMap.isEmpty()) {
         QList<QVariant> argumentList;
-        QDBusPendingReply<QVariantMap> reply = asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList);
+        QDBusPendingReply<QVariantMap> reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList);
         reply.waitForFinished();
         if (!reply.isError()) {
             propertiesMap = reply.value();
-        } else {
-            qDebug() << reply.error().message();
         }
     }
     return propertiesMap;
@@ -270,11 +275,18 @@ bool QOfonoDataConnectionManagerInterface::roamingAllowed()
     return qdbus_cast<bool>(var);
 }
 
+QString QOfonoDataConnectionManagerInterface::bearer()
+{
+    QVariant var = getProperty(QStringLiteral("Bearer"));
+    return qdbus_cast<QString>(var);
+}
+
 QVariant QOfonoDataConnectionManagerInterface::getProperty(const QString &property)
 {
     QVariant var;
     QVariantMap map = getProperties();
-    var = map.value(property);
+    if (map.contains(property))
+        var = map.value(property);
     return var;
 }
 
@@ -282,7 +294,7 @@ QVariantMap QOfonoDataConnectionManagerInterface::getProperties()
 {
     if (propertiesMap.isEmpty()) {
         QList<QVariant> argumentList;
-        QDBusPendingReply<QVariantMap> reply = asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList);
+        QDBusPendingReply<QVariantMap> reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList);
         if (!reply.isError()) {
             propertiesMap = reply.value();
         }
@@ -297,6 +309,68 @@ void QOfonoDataConnectionManagerInterface::propertyChanged(const QString &name,
         Q_EMIT roamingAllowedChanged(value.variant().toBool());
 }
 
+
+QOfonoConnectionContextInterface::QOfonoConnectionContextInterface(const QString &dbusPathName, QObject *parent)
+    : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+                             dbusPathName,
+                             OFONO_CONNECTION_CONTEXT_INTERFACE,
+                             QDBusConnection::systemBus(), parent)
+{
+    QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+                                         path(),
+                                         QLatin1String(OFONO_MODEM_INTERFACE),
+                                         QLatin1String("PropertyChanged"),
+                                         this,SLOT(propertyChanged(QString,QDBusVariant)));
+}
+
+QOfonoConnectionContextInterface::~QOfonoConnectionContextInterface()
+{
+}
+
+QVariantMap QOfonoConnectionContextInterface::getProperties()
+{
+    if (propertiesMap.isEmpty()) {
+        QList<QVariant> argumentList;
+        QDBusPendingReply<QVariantMap> reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList);
+        if (!reply.isError()) {
+            propertiesMap = reply.value();
+        }
+    }
+    return propertiesMap;
+}
+
+void QOfonoConnectionContextInterface::propertyChanged(const QString &name, const QDBusVariant &value)
+{
+    propertiesMap[name] = value.variant();
+}
+
+QVariant QOfonoConnectionContextInterface::getProperty(const QString &property)
+{
+    QVariant var;
+    QVariantMap map = getProperties();
+    if (map.contains(property))
+        var = map.value(property);
+    return var;
+}
+
+bool QOfonoConnectionContextInterface::active()
+{
+    QVariant var = getProperty(QStringLiteral("Active"));
+    return qdbus_cast<bool>(var);
+}
+
+QString QOfonoConnectionContextInterface::accessPointName()
+{
+    QVariant var = getProperty(QStringLiteral("AccessPointName"));
+    return qdbus_cast<QString>(var);
+}
+
+QString QOfonoConnectionContextInterface::name()
+{
+    QVariant var = getProperty(QStringLiteral("Name"));
+    return qdbus_cast<QString>(var);
+}
+
 QT_END_NAMESPACE
 
 #endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/connman/qofonoservice_linux_p.h b/src/plugins/bearer/linux_common/qofonoservice_linux_p.h
similarity index 88%
rename from src/plugins/bearer/connman/qofonoservice_linux_p.h
rename to src/plugins/bearer/linux_common/qofonoservice_linux_p.h
index 8a6a932e0d6d5461e27d3713005078e2d12f0db2..0ed00d94ff4a011e41afbf7b9431c4b5b2e05702 100644
--- a/src/plugins/bearer/connman/qofonoservice_linux_p.h
+++ b/src/plugins/bearer/linux_common/qofonoservice_linux_p.h
@@ -67,6 +67,7 @@
 #define OFONO_MODEM_INTERFACE                    "org.ofono.Modem"
 #define OFONO_NETWORK_REGISTRATION_INTERFACE     "org.ofono.NetworkRegistration"
 #define OFONO_DATA_CONNECTION_MANAGER_INTERFACE  "org.ofono.ConnectionManager"
+#define OFONO_CONNECTION_CONTEXT_INTERFACE       "org.ofono.ConnectionContext"
 
 QT_BEGIN_NAMESPACE
 
@@ -114,6 +115,7 @@ public:
 
     bool isPowered();
     bool isOnline();
+    QStringList interfaces();
 private:
     QVariantMap getProperties();
     QVariantMap propertiesMap;
@@ -152,17 +154,39 @@ public:
 
     QStringList contexts();
     bool roamingAllowed();
+    QVariant getProperty(const QString &);
+    QString bearer();
 Q_SIGNALS:
     void roamingAllowedChanged(bool);
 private:
     QVariantMap getProperties();
     QVariantMap propertiesMap;
-    QVariant getProperty(const QString &);
     QStringList contextList;
 private slots:
     void propertyChanged(const QString &, const QDBusVariant &value);
 };
 
+class QOfonoConnectionContextInterface : public QDBusAbstractInterface
+{
+    Q_OBJECT
+
+public:
+
+    explicit QOfonoConnectionContextInterface(const QString &dbusPathName, QObject *parent = 0);
+    ~QOfonoConnectionContextInterface();
+
+    QVariant getProperty(const QString &);
+    bool active();
+    QString accessPointName();
+    QString name();
+
+Q_SIGNALS:
+private:
+    QVariantMap getProperties();
+    QVariantMap propertiesMap;
+private slots:
+    void propertyChanged(const QString &, const QDBusVariant &value);
+};
 
 QT_END_NAMESPACE
 
diff --git a/src/plugins/bearer/networkmanager/networkmanager.pro b/src/plugins/bearer/networkmanager/networkmanager.pro
index 1ed9bfaa1b4a4f9cfdc07d425604f9cf67b52bee..b3a270615ccce0bf498ff2a0d3c5bfb0bd061b68 100644
--- a/src/plugins/bearer/networkmanager/networkmanager.pro
+++ b/src/plugins/bearer/networkmanager/networkmanager.pro
@@ -6,16 +6,16 @@ load(qt_plugin)
 
 QT = core network-private dbus
 
-HEADERS += qnmdbushelper.h \
-           qnetworkmanagerservice.h \
+HEADERS += qnetworkmanagerservice.h \
            qnetworkmanagerengine.h \
+           ../linux_common/qofonoservice_linux_p.h \
            ../qnetworksession_impl.h \
            ../qbearerengine_impl.h
 
 SOURCES += main.cpp \
-           qnmdbushelper.cpp \
            qnetworkmanagerservice.cpp \
            qnetworkmanagerengine.cpp \
+           ../linux_common/qofonoservice_linux.cpp \
            ../qnetworksession_impl.cpp
 
 OTHER_FILES += networkmanager.json
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
index 5f49ea0b6defc246186240b49b2961022109c797..a8244f05cf547e6a6edc2327a4e285415fab3f0f 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
@@ -47,6 +47,7 @@
 #include <QDBusInterface>
 #include <QDBusMessage>
 #include <QDBusReply>
+#include "../linux_common/qofonoservice_linux_p.h"
 
 #ifndef QT_NO_BEARERMANAGEMENT
 #ifndef QT_NO_DBUS
@@ -57,45 +58,80 @@ QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
 :   QBearerEngineImpl(parent),
     managerInterface(new QNetworkManagerInterface(this)),
     systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this)),
-    userSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this))
+    ofonoManager(new QOfonoManagerInterface(this))
 {
+
     if (!managerInterface->isValid())
         return;
 
-    managerInterface->setConnections();
+    qDBusRegisterMetaType<QNmSettingsMap>();
+
     connect(managerInterface, SIGNAL(deviceAdded(QDBusObjectPath)),
             this, SLOT(deviceAdded(QDBusObjectPath)));
     connect(managerInterface, SIGNAL(deviceRemoved(QDBusObjectPath)),
             this, SLOT(deviceRemoved(QDBusObjectPath)));
     connect(managerInterface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)),
             this, SLOT(activationFinished(QDBusPendingCallWatcher*)));
-    connect(managerInterface, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
-            this, SLOT(interfacePropertiesChanged(QString,QMap<QString,QVariant>)));
-
-    qDBusRegisterMetaType<QNmSettingsMap>();
+    connect(managerInterface, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
+            this, SLOT(interfacePropertiesChanged(QMap<QString,QVariant>)));
+    managerInterface->setConnections();
 
-    systemSettings->setConnections();
     connect(systemSettings, SIGNAL(newConnection(QDBusObjectPath)),
             this, SLOT(newConnection(QDBusObjectPath)));
-
-    userSettings->setConnections();
-    connect(userSettings, SIGNAL(newConnection(QDBusObjectPath)),
-            this, SLOT(newConnection(QDBusObjectPath)));
+    systemSettings->setConnections();
 }
 
 QNetworkManagerEngine::~QNetworkManagerEngine()
 {
     qDeleteAll(connections);
+    connections.clear();
     qDeleteAll(accessPoints);
+    accessPoints.clear();
     qDeleteAll(wirelessDevices);
-    qDeleteAll(activeConnections);
+    wirelessDevices.clear();
+    qDeleteAll(activeConnectionsList);
+    activeConnectionsList.clear();
+    qDeleteAll(interfaceDevices);
+    interfaceDevices.clear();
+
+    connectionInterfaces.clear();
+
+    qDeleteAll(ofonoContextManagers);
+    ofonoContextManagers.clear();
+
+    qDeleteAll(wiredDevices);
+    wiredDevices.clear();
 }
 
 void QNetworkManagerEngine::initialize()
 {
     QMutexLocker locker(&mutex);
 
-    // Get current list of access points.
+    if (ofonoManager->isValid()) {
+        Q_FOREACH (const QString &modem, ofonoManager->getModems()) {
+            QOfonoDataConnectionManagerInterface *ofonoContextManager
+                    = new QOfonoDataConnectionManagerInterface(modem,this);
+            ofonoContextManagers.insert(modem, ofonoContextManager);
+        }
+    }
+    // Get active connections.
+    foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
+
+        QNetworkManagerConnectionActive *activeConnection =
+                new QNetworkManagerConnectionActive(acPath.path(),this);
+        activeConnectionsList.insert(acPath.path(), activeConnection);
+        connect(activeConnection, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
+                this, SLOT(activeConnectionPropertiesChanged(QMap<QString,QVariant>)));
+        activeConnection->setConnections();
+
+        QStringList devices = activeConnection->devices();
+        if (!devices.isEmpty()) {
+            QNetworkManagerInterfaceDevice device(devices.at(0),this);
+            connectionInterfaces.insert(activeConnection->connection().path(),device.networkInterface());
+        }
+    }
+
+        // Get current list of access points.
     foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
         locker.unlock();
         deviceAdded(devicePath); //add all accesspoints
@@ -103,7 +139,6 @@ void QNetworkManagerEngine::initialize()
     }
 
     // Get connections.
-
     foreach (const QDBusObjectPath &settingsPath, systemSettings->listConnections()) {
         locker.unlock();
         if (!hasIdentifier(settingsPath.path()))
@@ -111,57 +146,19 @@ void QNetworkManagerEngine::initialize()
         locker.relock();
     }
 
-    foreach (const QDBusObjectPath &settingsPath, userSettings->listConnections()) {
-        locker.unlock();
-        if (!hasIdentifier(settingsPath.path()))
-            newConnection(settingsPath, userSettings);
-        locker.relock();
-    }
-
-    // Get active connections.
-    foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
-        QNetworkManagerConnectionActive *activeConnection =
-            new QNetworkManagerConnectionActive(acPath.path(),this);
-        activeConnections.insert(acPath.path(), activeConnection);
-
-        activeConnection->setConnections();
-        connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
-                this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>)));
-    }
     Q_EMIT updateCompleted();
 }
 
 bool QNetworkManagerEngine::networkManagerAvailable() const
 {
-    QMutexLocker locker(&mutex);
-
     return managerInterface->isValid();
 }
 
-QString QNetworkManagerEngine::getInterfaceFromId(const QString &id)
+QString QNetworkManagerEngine::getInterfaceFromId(const QString &settingsPath)
 {
-    QMutexLocker locker(&mutex);
-
-    foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
-        QNetworkManagerConnectionActive activeConnection(acPath.path());
-
-        const QString identifier = activeConnection.connection().path();
-
-        if (id == identifier) {
-            QList<QDBusObjectPath> devices = activeConnection.devices();
-
-            if (devices.isEmpty())
-                continue;
-
-            QNetworkManagerInterfaceDevice device(devices.at(0).path());
-            return device.networkInterface();
-        }
-    }
-
-    return QString();
+    return connectionInterfaces.value(settingsPath);
 }
 
-
 bool QNetworkManagerEngine::hasIdentifier(const QString &id)
 {
     QMutexLocker locker(&mutex);
@@ -177,35 +174,34 @@ void QNetworkManagerEngine::connectToId(const QString &id)
     if (!connection)
         return;
 
-    QNmSettingsMap map = connection->getSettings();
-    const QString connectionType = map.value("connection").value("type").toString();
+    NMDeviceType connectionType = connection->getType();
 
     QString dbusDevicePath;
-    foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
-        QNetworkManagerInterfaceDevice device(devicePath.path());
-        if (device.deviceType() == DEVICE_TYPE_ETHERNET &&
-            connectionType == QLatin1String("802-3-ethernet")) {
-            dbusDevicePath = devicePath.path();
+    const QString settingsPath = connection->connectionInterface()->path();
+    QString specificPath = configuredAccessPoints.key(settingsPath);
+
+    QHashIterator<QString, QNetworkManagerInterfaceDevice*> i(interfaceDevices);
+    while (i.hasNext()) {
+        i.next();
+        if (i.value()->deviceType() == DEVICE_TYPE_ETHERNET &&
+            connectionType == DEVICE_TYPE_ETHERNET) {
+            dbusDevicePath = i.key();
             break;
-        } else if (device.deviceType() == DEVICE_TYPE_WIFI &&
-                   connectionType == QLatin1String("802-11-wireless")) {
-            dbusDevicePath = devicePath.path();
+        } else if (i.value()->deviceType() == DEVICE_TYPE_WIFI &&
+                   connectionType == DEVICE_TYPE_WIFI) {
+            dbusDevicePath = i.key();
             break;
-        } else if (device.deviceType() == DEVICE_TYPE_MODEM &&
-                connectionType == QLatin1String("gsm")) {
-            dbusDevicePath = devicePath.path();
+        } else if (i.value()->deviceType() == DEVICE_TYPE_MODEM &&
+                connectionType == DEVICE_TYPE_MODEM) {
+            dbusDevicePath = i.key();
             break;
         }
     }
 
-    const QString service = connection->connectionInterface()->service();
-    const QString settingsPath = connection->connectionInterface()->path();
-    QString specificPath = configuredAccessPoints.key(settingsPath);
-
     if (specificPath.isEmpty())
         specificPath = "/";
 
-    managerInterface->activateConnection(service, QDBusObjectPath(settingsPath),
+    managerInterface->activateConnection(QDBusObjectPath(settingsPath),
                                   QDBusObjectPath(dbusDevicePath), QDBusObjectPath(specificPath));
 }
 
@@ -221,13 +217,11 @@ void QNetworkManagerEngine::disconnectFromId(const QString &id)
         return;
     }
 
-    foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
-        QNetworkManagerConnectionActive activeConnection(acPath.path());
-
-        const QString identifier = activeConnection.connection().path();
-
-        if (id == identifier && accessPointConfigurations.contains(id)) {
-            managerInterface->deactivateConnection(acPath);
+    QHashIterator<QString, QNetworkManagerConnectionActive*> i(activeConnectionsList);
+    while (i.hasNext()) {
+        i.next();
+        if (id == i.value()->connection().path() && accessPointConfigurations.contains(id)) {
+            managerInterface->deactivateConnection(QDBusObjectPath(i.key()));
             break;
         }
     }
@@ -250,12 +244,9 @@ void QNetworkManagerEngine::scanFinished()
     QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection);
 }
 
-void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
-                                                       const QMap<QString, QVariant> &properties)
+void QNetworkManagerEngine::interfacePropertiesChanged(const QMap<QString, QVariant> &properties)
 {
-    Q_UNUSED(path)
     QMutexLocker locker(&mutex);
-
     QMapIterator<QString, QVariant> i(properties);
     while (i.hasNext()) {
         i.next();
@@ -267,22 +258,20 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
                 qdbus_cast<QList<QDBusObjectPath> >(i.value().value<QDBusArgument>());
 
             QStringList identifiers = accessPointConfigurations.keys();
-            foreach (const QString &id, identifiers)
-                QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
-            QStringList priorActiveConnections = this->activeConnections.keys();
+            QStringList priorActiveConnections = activeConnectionsList.keys();
 
             foreach (const QDBusObjectPath &acPath, activeConnections) {
                 priorActiveConnections.removeOne(acPath.path());
                 QNetworkManagerConnectionActive *activeConnection =
-                    this->activeConnections.value(acPath.path());
+                    activeConnectionsList.value(acPath.path());
+
                 if (!activeConnection) {
                     activeConnection = new QNetworkManagerConnectionActive(acPath.path(),this);
-                    this->activeConnections.insert(acPath.path(), activeConnection);
+                    activeConnectionsList.insert(acPath.path(), activeConnection);
 
+                    connect(activeConnection, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
+                            this, SLOT(activeConnectionPropertiesChanged(QMap<QString,QVariant>)));
                     activeConnection->setConnections();
-                    connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
-                            this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>)));
                 }
 
                 const QString id = activeConnection->connection().path();
@@ -295,6 +284,11 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
                     if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
                         ptr->state != QNetworkConfiguration::Active) {
                         ptr->state = QNetworkConfiguration::Active;
+
+                        if (activeConnectionsList.value(id) && activeConnectionsList.value(id)->defaultRoute()
+                                && managerInterface->state() < QNetworkManagerInterface::NM_STATE_CONNECTED_GLOBAL) {
+                            ptr->purpose = QNetworkConfiguration::PrivatePurpose;
+                        }
                         ptr->mutex.unlock();
 
                         locker.unlock();
@@ -307,7 +301,7 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
             }
 
             while (!priorActiveConnections.isEmpty())
-                delete this->activeConnections.take(priorActiveConnections.takeFirst());
+                delete activeConnectionsList.take(priorActiveConnections.takeFirst());
 
             while (!identifiers.isEmpty()) {
                 QNetworkConfigurationPrivatePointer ptr =
@@ -330,14 +324,13 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
     }
 }
 
-void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &path,
-                                                              const QMap<QString, QVariant> &properties)
+void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QMap<QString, QVariant> &properties)
 {
     QMutexLocker locker(&mutex);
 
     Q_UNUSED(properties)
 
-    QNetworkManagerConnectionActive *activeConnection = activeConnections.value(path);
+    QNetworkManagerConnectionActive *activeConnection = qobject_cast<QNetworkManagerConnectionActive *>(sender());
 
     if (!activeConnection)
         return;
@@ -347,8 +340,13 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &pat
     QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
     if (ptr) {
         ptr->mutex.lock();
-        if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
-            ptr->state != QNetworkConfiguration::Active) {
+        if (properties.value("State").toUInt() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
+            QStringList devices = activeConnection->devices();
+            if (!devices.isEmpty()) {
+                QNetworkManagerInterfaceDevice device(devices.at(0),this);
+                connectionInterfaces.insert(id,device.networkInterface());
+            }
+
             ptr->state |= QNetworkConfiguration::Active;
             ptr->mutex.unlock();
 
@@ -356,22 +354,17 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &pat
             emit configurationChanged(ptr);
             locker.relock();
         } else {
+            connectionInterfaces.remove(id);
             ptr->mutex.unlock();
         }
     }
 }
 
-void QNetworkManagerEngine::devicePropertiesChanged(const QString &/*path*/,quint32 /*state*/)
-{
-//    Q_UNUSED(path);
-//    Q_UNUSED(state)
-}
-
-void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &activeConnectionsList)
+void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &connectionsList)
 {
     QMutexLocker locker(&mutex);
     for (int i = 0; i < connections.count(); ++i) {
-        if (activeConnectionsList.contains(connections.at(i)->connectionInterface()->path()))
+        if (connectionsList.contains(connections.at(i)->connectionInterface()->path()))
             continue;
 
         const QString settingsPath = connections.at(i)->connectionInterface()->path();
@@ -392,33 +385,36 @@ void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &activeCo
 
 void QNetworkManagerEngine::deviceAdded(const QDBusObjectPath &path)
 {
-    QMutexLocker locker(&mutex);
     QNetworkManagerInterfaceDevice *iDevice;
     iDevice = new QNetworkManagerInterfaceDevice(path.path(),this);
     connect(iDevice,SIGNAL(connectionsChanged(QStringList)),
             this,SLOT(deviceConnectionsChanged(QStringList)));
 
-    connect(iDevice,SIGNAL(stateChanged(QString,quint32)),
-            this,SLOT(devicePropertiesChanged(QString,quint32)));
     iDevice->setConnections();
     interfaceDevices.insert(path.path(),iDevice);
-
     if (iDevice->deviceType() == DEVICE_TYPE_WIFI) {
         QNetworkManagerInterfaceDeviceWireless *wirelessDevice =
             new QNetworkManagerInterfaceDeviceWireless(iDevice->connectionInterface()->path(),this);
 
-        wirelessDevice->setConnections();
         connect(wirelessDevice, SIGNAL(accessPointAdded(QString)),
                 this, SLOT(newAccessPoint(QString)));
         connect(wirelessDevice, SIGNAL(accessPointRemoved(QString)),
                 this, SLOT(removeAccessPoint(QString)));
         connect(wirelessDevice,SIGNAL(scanDone()),this,SLOT(scanFinished()));
+        wirelessDevice->setConnections();
 
         foreach (const QDBusObjectPath &apPath, wirelessDevice->getAccessPoints())
             newAccessPoint(apPath.path());
 
         wirelessDevices.insert(path.path(), wirelessDevice);
     }
+
+    if (iDevice->deviceType() == DEVICE_TYPE_ETHERNET) {
+        QNetworkManagerInterfaceDeviceWired *wiredDevice =
+                new QNetworkManagerInterfaceDeviceWired(iDevice->connectionInterface()->path(),this);
+        connect(wiredDevice,SIGNAL(carrierChanged(bool)),this,SLOT(wiredCarrierChanged(bool)));
+        wiredDevices.insert(iDevice->connectionInterface()->path(), wiredDevice);
+    }
 }
 
 void QNetworkManagerEngine::deviceRemoved(const QDBusObjectPath &path)
@@ -435,6 +431,41 @@ void QNetworkManagerEngine::deviceRemoved(const QDBusObjectPath &path)
         delete wirelessDevices.take(path.path());
         locker.relock();
     }
+    if (wiredDevices.contains(path.path())) {
+        locker.unlock();
+        delete wiredDevices.take(path.path());
+        locker.relock();
+    }
+}
+
+void QNetworkManagerEngine::wiredCarrierChanged(bool carrier)
+{
+    QNetworkManagerInterfaceDeviceWired *deviceWired = qobject_cast<QNetworkManagerInterfaceDeviceWired *>(sender());
+    if (!deviceWired)
+        return;
+    QMutexLocker locker(&mutex);
+    foreach (const QDBusObjectPath &settingsPath, systemSettings->listConnections()) {
+        for (int i = 0; i < connections.count(); ++i) {
+            QNetworkManagerSettingsConnection *connection = connections.at(i);
+            if (connection->getType() == DEVICE_TYPE_ETHERNET
+                    && settingsPath.path() == connection->connectionInterface()->path()) {
+                QNetworkConfigurationPrivatePointer ptr =
+                        accessPointConfigurations.value(settingsPath.path());
+
+                if (ptr) {
+                    ptr->mutex.lock();
+                    if (carrier)
+                        ptr->state |= QNetworkConfiguration::Discovered;
+                    else
+                        ptr->state = QNetworkConfiguration::Defined;
+                    ptr->mutex.unlock();
+                    locker.unlock();
+                    emit configurationChanged(ptr);
+                    return;
+                }
+            }
+        }
+    }
 }
 
 void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
@@ -444,57 +475,72 @@ void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
     if (!settings)
         settings = qobject_cast<QNetworkManagerSettings *>(sender());
 
-    if (!settings)
+    if (!settings) {
         return;
+    }
 
-    settings->deleteLater();
     QNetworkManagerSettingsConnection *connection =
         new QNetworkManagerSettingsConnection(settings->connectionInterface()->service(),
                                               path.path(),this);
-    QString apPath;
-    for (int i = 0; i < accessPoints.count(); ++i) {
-        if (connection->getSsid() == accessPoints.at(i)->ssid()) {
-            // remove the corresponding accesspoint from configurations
-            apPath = accessPoints.at(i)->connectionInterface()->path();
-
-            QNetworkConfigurationPrivatePointer ptr
-                    = accessPointConfigurations.take(apPath);
-            if (ptr) {
-                locker.unlock();
-                emit configurationRemoved(ptr);
-                locker.relock();
-            }
-        }
+    const QString settingsPath = connection->connectionInterface()->path();
+    if (accessPointConfigurations.contains(settingsPath)) {
+        return;
     }
+
     connections.append(connection);
 
     connect(connection,SIGNAL(removed(QString)),this,SLOT(removeConnection(QString)));
     connect(connection,SIGNAL(updated()),this,SLOT(updateConnection()));
     connection->setConnections();
 
-    const QString settingsPath = connection->connectionInterface()->path();
+    NMDeviceType deviceType = connection->getType();
 
-    if (connection->getType() == DEVICE_TYPE_WIFI
-            && !configuredAccessPoints.contains(settingsPath))
-        configuredAccessPoints.insert(apPath,settingsPath);
+    if (deviceType == DEVICE_TYPE_WIFI) {
+        QString apPath;
+        for (int i = 0; i < accessPoints.count(); ++i) {
+            if (connection->getSsid() == accessPoints.at(i)->ssid()) {
+                // remove the corresponding accesspoint from configurations
+                apPath = accessPoints.at(i)->connectionInterface()->path();
+                QNetworkConfigurationPrivatePointer ptr
+                        = accessPointConfigurations.take(apPath);
+                if (ptr) {
+                    locker.unlock();
+                    emit configurationRemoved(ptr);
+                    locker.relock();
+                }
+            }
+        }
+        if (!configuredAccessPoints.contains(settingsPath))
+            configuredAccessPoints.insert(apPath,settingsPath);
+    }
 
     QNetworkConfigurationPrivate *cpPriv =
         parseConnection(settingsPath, connection->getSettings());
 
     // Check if connection is active.
-    foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
-        QNetworkManagerConnectionActive activeConnection(acPath.path());
-
-        if (activeConnection.defaultRoute() &&
-            activeConnection.connection().path() == settingsPath &&
-            activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
+    QHashIterator<QString, QNetworkManagerConnectionActive*> i(activeConnectionsList);
+    while (i.hasNext()) {
+        i.next();
+        if (i.value()->connection().path() == settingsPath) {
             cpPriv->state |= QNetworkConfiguration::Active;
             break;
         }
     }
+    if (deviceType == DEVICE_TYPE_ETHERNET) {
+        QHashIterator<QString, QNetworkManagerInterfaceDevice*> i(interfaceDevices);
+        while (i.hasNext()) {
+             i.next();
+             if (i.value()->deviceType() == deviceType) {
+                QNetworkManagerInterfaceDeviceWired *wiredDevice
+                        = wiredDevices.value(i.value()->connectionInterface()->path());
+                 if (wiredDevice->carrier()) {
+                     cpPriv->state |= QNetworkConfiguration::Discovered;
+                 }
+             }
+         }
+     }
     QNetworkConfigurationPrivatePointer ptr(cpPriv);
     accessPointConfigurations.insert(ptr->id, ptr);
-
     locker.unlock();
     emit configurationAdded(ptr);
 }
@@ -505,6 +551,7 @@ void QNetworkManagerEngine::removeConnection(const QString &path)
 
     QNetworkManagerSettingsConnection *connection =
         qobject_cast<QNetworkManagerSettingsConnection *>(sender());
+
     if (!connection)
         return;
 
@@ -525,6 +572,7 @@ void QNetworkManagerEngine::removeConnection(const QString &path)
     while (i.hasNext()) {
         i.next();
         if (i.value() == path) {
+            configuredAccessPoints.remove(i.key());
             newAccessPoint(i.key());
         }
     }
@@ -538,8 +586,6 @@ void QNetworkManagerEngine::updateConnection()
         qobject_cast<QNetworkManagerSettingsConnection *>(sender());
     if (!connection)
         return;
-
-    connection->deleteLater();
     const QString settingsPath = connection->connectionInterface()->path();
 
     QNetworkConfigurationPrivate *cpPriv = parseConnection(settingsPath, connection->getSettings());
@@ -575,10 +621,9 @@ void QNetworkManagerEngine::updateConnection()
 void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher)
 {
     QMutexLocker locker(&mutex);
-
+    QDBusPendingReply<QDBusObjectPath> reply(*watcher);
     watcher->deleteLater();
 
-    QDBusPendingReply<QDBusObjectPath> reply(*watcher);
     if (!reply.isError()) {
         QDBusObjectPath result = reply.value();
 
@@ -620,15 +665,14 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path)
     if (okToAdd) {
         accessPoints.append(accessPoint);
         accessPoint->setConnections();
-        connect(accessPoint, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
-                this, SLOT(updateAccessPoint(QMap<QString,QVariant>)));
     }
-
     // Check if configuration exists for connection.
     if (!accessPoint->ssid().isEmpty()) {
+
         for (int i = 0; i < connections.count(); ++i) {
             QNetworkManagerSettingsConnection *connection = connections.at(i);
             const QString settingsPath = connection->connectionInterface()->path();
+
             if (accessPoint->ssid() == connection->getSsid()) {
                 if (!configuredAccessPoints.contains(path)) {
                     configuredAccessPoints.insert(path,settingsPath);
@@ -655,11 +699,7 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path)
     ptr->isValid = true;
     ptr->id = path;
     ptr->type = QNetworkConfiguration::InternetAccessPoint;
-    if (accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) {
-        ptr->purpose = QNetworkConfiguration::PrivatePurpose;
-    } else {
-        ptr->purpose = QNetworkConfiguration::PublicPurpose;
-    }
+    ptr->purpose = QNetworkConfiguration::PublicPurpose;
     ptr->state = QNetworkConfiguration::Undefined;
     ptr->bearerType = QNetworkConfiguration::BearerWLAN;
 
@@ -674,13 +714,13 @@ void QNetworkManagerEngine::removeAccessPoint(const QString &path)
     QMutexLocker locker(&mutex);
     for (int i = 0; i < accessPoints.count(); ++i) {
         QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i);
-
         if (accessPoint->connectionInterface()->path() == path) {
             accessPoints.removeOne(accessPoint);
 
             if (configuredAccessPoints.contains(accessPoint->connectionInterface()->path())) {
                 // find connection and change state to Defined
                 configuredAccessPoints.remove(accessPoint->connectionInterface()->path());
+
                 for (int i = 0; i < connections.count(); ++i) {
                     QNetworkManagerSettingsConnection *connection = connections.at(i);
 
@@ -705,8 +745,6 @@ void QNetworkManagerEngine::removeAccessPoint(const QString &path)
                     accessPointConfigurations.take(path);
 
                 if (ptr) {
-                    locker.unlock();
-
                     locker.unlock();
                     emit configurationRemoved(ptr);
                     locker.relock();
@@ -718,42 +756,9 @@ void QNetworkManagerEngine::removeAccessPoint(const QString &path)
     }
 }
 
-void QNetworkManagerEngine::updateAccessPoint(const QMap<QString, QVariant> &map)
-{
-    QMutexLocker locker(&mutex);
-
-    Q_UNUSED(map)
-
-    QNetworkManagerInterfaceAccessPoint *accessPoint =
-        qobject_cast<QNetworkManagerInterfaceAccessPoint *>(sender());
-    if (!accessPoint)
-        return;
-    accessPoint->deleteLater();
-    for (int i = 0; i < connections.count(); ++i) {
-        QNetworkManagerSettingsConnection *connection = connections.at(i);
-
-        if (accessPoint->ssid() == connection->getSsid()) {
-            const QString settingsPath = connection->connectionInterface()->path();
-            const QString connectionId = settingsPath;
-
-            QNetworkConfigurationPrivatePointer ptr =
-                accessPointConfigurations.value(connectionId);
-            ptr->mutex.lock();
-            QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
-            ptr->state = (flag | QNetworkConfiguration::Discovered);
-            ptr->mutex.unlock();
-
-            locker.unlock();
-            emit configurationChanged(ptr);
-            return;
-        }
-    }
-}
-
 QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QString &settingsPath,
                                                                      const QNmSettingsMap &map)
 {
-   // Q_UNUSED(service);
     QMutexLocker locker(&mutex);
     QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
     cpPriv->name = map.value("connection").value("id").toString();
@@ -765,18 +770,16 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
     cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
 
     cpPriv->state = QNetworkConfiguration::Defined;
-
     const QString connectionType = map.value("connection").value("type").toString();
 
     if (connectionType == QLatin1String("802-3-ethernet")) {
         cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
-        cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
 
         foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
-            QNetworkManagerInterfaceDevice device(devicePath.path());
+            QNetworkManagerInterfaceDevice device(devicePath.path(),this);
             if (device.deviceType() == DEVICE_TYPE_ETHERNET) {
-                QNetworkManagerInterfaceDeviceWired wiredDevice(device.connectionInterface()->path());
-                if (wiredDevice.carrier()) {
+                QNetworkManagerInterfaceDeviceWired *wiredDevice = wiredDevices.value(device.connectionInterface()->path());
+                if (wiredDevice->carrier()) {
                     cpPriv->state |= QNetworkConfiguration::Discovered;
                     break;
                 }
@@ -786,12 +789,6 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
         cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
 
         const QString connectionSsid = map.value("802-11-wireless").value("ssid").toString();
-        const QString connectionSecurity = map.value("802-11-wireless").value("security").toString();
-        if (!connectionSecurity.isEmpty()) {
-            cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
-        } else {
-            cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
-        }
         for (int i = 0; i < accessPoints.count(); ++i) {
             if (connectionSsid == accessPoints.at(i)->ssid()
                     && map.value("802-11-wireless").value("seen-bssids").toStringList().contains(accessPoints.at(i)->hwAddress())) {
@@ -814,30 +811,13 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
         }
     } else if (connectionType == QLatin1String("gsm")) {
 
-        foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
-            QNetworkManagerInterfaceDevice device(devicePath.path());
+        const QString contextPath = map.value("connection").value("id").toString();
+        cpPriv->name = contextName(contextPath);
+        cpPriv->bearerType = currentBearerType(contextPath);
 
-            if (device.deviceType() == DEVICE_TYPE_MODEM) {
-                QNetworkManagerInterfaceDeviceModem deviceModem(device.connectionInterface()->path(),this);
-                switch (deviceModem.currentCapabilities()) {
-                case 2:
-                    cpPriv->bearerType = QNetworkConfiguration::Bearer2G;
-                    break;
-                case 4:
-                    cpPriv->bearerType = QNetworkConfiguration::Bearer3G;
-                    break;
-                case 8:
-                    cpPriv->bearerType = QNetworkConfiguration::Bearer4G;
-                    break;
-                default:
-                    cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
-                    break;
-                };
-            }
+        if (map.value("connection").contains("timestamp")) {
+            cpPriv->state |= QNetworkConfiguration::Discovered;
         }
-
-        cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
-        cpPriv->state |= QNetworkConfiguration::Discovered;
     }
 
     return cpPriv;
@@ -857,7 +837,6 @@ QNetworkManagerSettingsConnection *QNetworkManagerEngine::connectionFromId(const
 QNetworkSession::State QNetworkManagerEngine::sessionStateForId(const QString &id)
 {
     QMutexLocker locker(&mutex);
-
     QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
 
     if (!ptr)
@@ -866,8 +845,8 @@ QNetworkSession::State QNetworkManagerEngine::sessionStateForId(const QString &i
     if (!ptr->isValid)
         return QNetworkSession::Invalid;
 
-    foreach (const QString &acPath, activeConnections.keys()) {
-        QNetworkManagerConnectionActive *activeConnection = activeConnections.value(acPath);
+    foreach (const QString &acPath, activeConnectionsList.keys()) {
+        QNetworkManagerConnectionActive *activeConnection = activeConnectionsList.value(acPath);
 
         const QString identifier = activeConnection->connection().path();
 
@@ -899,7 +878,7 @@ quint64 QNetworkManagerEngine::bytesWritten(const QString &id)
 
     QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
     if (ptr && (ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
-        const QString networkInterface = getInterfaceFromId(id);
+        const QString networkInterface = connectionInterfaces.value(id);
         if (!networkInterface.isEmpty()) {
             const QString devFile = QLatin1String("/sys/class/net/") +
                                     networkInterface +
@@ -927,7 +906,7 @@ quint64 QNetworkManagerEngine::bytesReceived(const QString &id)
 
     QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
     if (ptr && (ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
-        const QString networkInterface = getInterfaceFromId(id);
+        const QString networkInterface = connectionInterfaces.value(id);
         if (!networkInterface.isEmpty()) {
             const QString devFile = QLatin1String("/sys/class/net/") +
                                     networkInterface +
@@ -974,9 +953,67 @@ QNetworkSessionPrivate *QNetworkManagerEngine::createSessionBackend()
 
 QNetworkConfigurationPrivatePointer QNetworkManagerEngine::defaultConfiguration()
 {
+    QHashIterator<QString, QNetworkManagerConnectionActive*> i(activeConnectionsList);
+    while (i.hasNext()) {
+        i.next();
+        QNetworkManagerConnectionActive *activeConnection = i.value();
+        if ((activeConnection->defaultRoute() || activeConnection->default6Route())) {
+            return accessPointConfigurations.value(activeConnection->connection().path());
+        }
+    }
+
     return QNetworkConfigurationPrivatePointer();
 }
 
+QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType(const QString &id)
+{
+    if (ofonoManager->isValid()) {
+        QString contextPart = id.section('/', -1);
+
+        QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
+        while (i.hasNext()) {
+            i.next();
+            QString contextPath = i.key() +"/"+contextPart;
+            if (i.value()->contexts().contains(contextPath)) {
+
+                QString bearer = i.value()->bearer();
+                if (bearer == QStringLiteral("gsm")) {
+                    return QNetworkConfiguration::Bearer2G;
+                } else if (bearer == QStringLiteral("edge")) {
+                    return QNetworkConfiguration::Bearer2G;
+                } else if (bearer == QStringLiteral("umts")) {
+                    return QNetworkConfiguration::BearerWCDMA;
+                } else if (bearer == QStringLiteral("hspa")
+                           || bearer == QStringLiteral("hsdpa")
+                           || bearer == QStringLiteral("hsupa")) {
+                    return QNetworkConfiguration::BearerHSPA;
+                } else if (bearer == QStringLiteral("lte")) {
+                    return QNetworkConfiguration::BearerLTE;
+                }
+            }
+        }
+    }
+    return QNetworkConfiguration::BearerUnknown;
+}
+
+QString QNetworkManagerEngine::contextName(const QString &path)
+{
+    if (ofonoManager->isValid()) {
+        QString contextPart = path.section('/', -1);
+        QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
+        while (i.hasNext()) {
+            i.next();
+            Q_FOREACH (const QString &oContext, i.value()->contexts()) {
+                if (oContext.contains(contextPart)) {
+                    QOfonoConnectionContextInterface contextInterface(oContext,this);
+                    return contextInterface.name();
+                }
+            }
+        }
+    }
+    return path;
+}
+
 QT_END_NAMESPACE
 
 #endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
index ab1cfea71ef9402380fce02dc9560d55dfc22e32..671ed80dab07f6cca3b020090015480e402d2e43 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
@@ -49,6 +49,8 @@
 
 #include "qnetworkmanagerservice.h"
 
+#include "../linux_common/qofonoservice_linux_p.h"
+
 #include <QMap>
 #include <QVariant>
 
@@ -89,11 +91,8 @@ public:
     QNetworkConfigurationPrivatePointer defaultConfiguration();
 
 private Q_SLOTS:
-    void interfacePropertiesChanged(const QString &path,
-                                    const QMap<QString, QVariant> &properties);
-    void activeConnectionPropertiesChanged(const QString &path,
-                                           const QMap<QString, QVariant> &properties);
-    void devicePropertiesChanged(const QString &path, quint32);
+    void interfacePropertiesChanged(const QMap<QString, QVariant> &properties);
+    void activeConnectionPropertiesChanged(const QMap<QString, QVariant> &properties);
 
     void deviceAdded(const QDBusObjectPath &path);
     void deviceRemoved(const QDBusObjectPath &path);
@@ -106,9 +105,10 @@ private Q_SLOTS:
 
     void newAccessPoint(const QString &path);
     void removeAccessPoint(const QString &path);
-    void updateAccessPoint(const QMap<QString, QVariant> &map);
     void scanFinished();
 
+    void wiredCarrierChanged(bool);
+
 private:
     QNetworkConfigurationPrivate *parseConnection(const QString &settingsPath,
                                                   const QNmSettingsMap &map);
@@ -116,14 +116,22 @@ private:
 
     QNetworkManagerInterface *managerInterface;
     QNetworkManagerSettings *systemSettings;
-    QNetworkManagerSettings *userSettings;
+    QHash<QString, QNetworkManagerInterfaceDeviceWired *> wiredDevices;
     QHash<QString, QNetworkManagerInterfaceDeviceWireless *> wirelessDevices;
-    QHash<QString, QNetworkManagerConnectionActive *> activeConnections;
+
+    QHash<QString, QNetworkManagerConnectionActive *> activeConnectionsList;
     QList<QNetworkManagerSettingsConnection *> connections;
     QList<QNetworkManagerInterfaceAccessPoint *> accessPoints;
     QHash<QString, QNetworkManagerInterfaceDevice *> interfaceDevices;
 
     QMap<QString,QString> configuredAccessPoints; //ap, settings path
+    QHash<QString,QString> connectionInterfaces; // ac, interface
+
+    QOfonoManagerInterface *ofonoManager;
+    QHash <QString, QOfonoDataConnectionManagerInterface *> ofonoContextManagers;
+    QNetworkConfiguration::BearerType currentBearerType(const QString &id);
+    QString contextName(const QString &path);
+
 };
 
 QT_END_NAMESPACE
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
index f249ac6100cb6deabef7f5ad91c5f280cc864b1c..dc3b71ec8eb9089a48cd5d8aff292be78c4f404a 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
@@ -44,7 +44,6 @@
 #include <QtDBus/QDBusPendingCall>
 
 #include "qnetworkmanagerservice.h"
-#include "qnmdbushelper.h"
 
 #ifndef QT_NO_DBUS
 
@@ -64,18 +63,38 @@ QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent)
     d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
                                                 QLatin1String(NM_DBUS_PATH),
                                                 QLatin1String(NM_DBUS_INTERFACE),
-                                                QDBusConnection::systemBus());
+                                                QDBusConnection::systemBus(),parent);
     if (!d->connectionInterface->isValid()) {
         d->valid = false;
         return;
     }
     d->valid = true;
-    nmDBusHelper = new QNmDBusHelper(this);
-    connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
-                    this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-    connect(nmDBusHelper,SIGNAL(pathForStateChanged(QString,quint32)),
-            this, SIGNAL(stateChanged(QString,quint32)));
 
+    QDBusInterface managerPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+                                                  QLatin1String(NM_DBUS_PATH),
+                                                  QLatin1String("org.freedesktop.DBus.Properties"),
+                                                  QDBusConnection::systemBus());
+    QList<QVariant> argumentList;
+    argumentList << QLatin1String(NM_DBUS_INTERFACE);
+    QDBusPendingReply<QVariantMap> propsReply
+            = managerPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+                                                                       argumentList);
+    if (!propsReply.isError()) {
+        propertyMap = propsReply.value();
+    }
+
+    QDBusPendingReply<QList <QDBusObjectPath> > nmReply
+            = d->connectionInterface->call(QLatin1String("GetDevices"));
+    nmReply.waitForFinished();
+    if (!nmReply.isError()) {
+        devicesPathList = nmReply.value();
+    }
+
+    QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+                                  QLatin1String(NM_DBUS_PATH),
+                                  QLatin1String(NM_DBUS_INTERFACE),
+                                  QLatin1String("PropertiesChanged"),
+                                  this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
 }
 
 QNetworkManagerInterface::~QNetworkManagerInterface()
@@ -91,27 +110,24 @@ bool QNetworkManagerInterface::isValid()
 
 bool QNetworkManagerInterface::setConnections()
 {
-    if(!isValid() )
+    if (!isValid())
         return false;
 
-    QDBusConnection dbusConnection = QDBusConnection::systemBus();
-
-    bool allOk = false;
-    if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+    QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
                                   QLatin1String(NM_DBUS_PATH),
                                   QLatin1String(NM_DBUS_INTERFACE),
                                   QLatin1String("PropertiesChanged"),
-                                nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) {
-        allOk = true;
-    }
-    if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+                                  this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
+
+    bool allOk = false;
+    if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
                                   QLatin1String(NM_DBUS_PATH),
                                   QLatin1String(NM_DBUS_INTERFACE),
                                   QLatin1String("DeviceAdded"),
                                 this,SIGNAL(deviceAdded(QDBusObjectPath)))) {
         allOk = true;
     }
-    if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+    if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
                                   QLatin1String(NM_DBUS_PATH),
                                   QLatin1String(NM_DBUS_INTERFACE),
                                   QLatin1String("DeviceRemoved"),
@@ -127,14 +143,17 @@ QDBusInterface *QNetworkManagerInterface::connectionInterface()  const
     return d->connectionInterface;
 }
 
-QList <QDBusObjectPath> QNetworkManagerInterface::getDevices() const
+QList <QDBusObjectPath> QNetworkManagerInterface::getDevices()
 {
-    QDBusReply<QList<QDBusObjectPath> > reply =  d->connectionInterface->call(QLatin1String("GetDevices"));
-    return reply.value();
+    if (devicesPathList.isEmpty()) {
+        qWarning() << "using blocking call!";
+        QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("GetDevices"));
+        devicesPathList = reply.value();
+    }
+    return devicesPathList;
 }
 
-void QNetworkManagerInterface::activateConnection( const QString &,
-                                                  QDBusObjectPath connectionPath,
+void QNetworkManagerInterface::activateConnection(QDBusObjectPath connectionPath,
                                                   QDBusObjectPath devicePath,
                                                   QDBusObjectPath specificObject)
 {
@@ -150,28 +169,80 @@ void QNetworkManagerInterface::activateConnection( const QString &,
 
 void QNetworkManagerInterface::deactivateConnection(QDBusObjectPath connectionPath)  const
 {
-    d->connectionInterface->call(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
+    d->connectionInterface->asyncCall(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
 }
 
 bool QNetworkManagerInterface::wirelessEnabled()  const
 {
-    return d->connectionInterface->property("WirelessEnabled").toBool();
+    if (propertyMap.contains("WirelessEnabled"))
+        return propertyMap.value("WirelessEnabled").toBool();
+    return false;
 }
 
 bool QNetworkManagerInterface::wirelessHardwareEnabled()  const
 {
-    return d->connectionInterface->property("WirelessHardwareEnabled").toBool();
+    if (propertyMap.contains("WirelessHardwareEnabled"))
+        return propertyMap.value("WirelessHardwareEnabled").toBool();
+    return false;
 }
 
 QList <QDBusObjectPath> QNetworkManagerInterface::activeConnections() const
 {
-    QVariant prop = d->connectionInterface->property("ActiveConnections");
-    return prop.value<QList<QDBusObjectPath> >();
+    if (propertyMap.contains("ActiveConnections")) {
+
+        const QDBusArgument &dbusArgs = propertyMap.value("ActiveConnections").value<QDBusArgument>();
+        QDBusObjectPath path;
+        QList <QDBusObjectPath> list;
+
+        dbusArgs.beginArray();
+        while (!dbusArgs.atEnd()) {
+            dbusArgs >> path;
+            list.append(path);
+        }
+        dbusArgs.endArray();
+
+        return list;
+    }
+
+    QList <QDBusObjectPath> list;
+    list << QDBusObjectPath();
+    return list;
+}
+
+QNetworkManagerInterface::NMState QNetworkManagerInterface::state()
+{
+    if (propertyMap.contains("State"))
+        return static_cast<QNetworkManagerInterface::NMState>(propertyMap.value("State").toUInt());
+    return QNetworkManagerInterface::NM_STATE_UNKNOWN;
+}
+
+QString QNetworkManagerInterface::version() const
+{
+    if (propertyMap.contains("Version"))
+        return propertyMap.value("Version").toString();
+    return QString();
 }
 
-quint32 QNetworkManagerInterface::state()
+void QNetworkManagerInterface::propertiesSwap(QMap<QString,QVariant> map)
 {
-    return d->connectionInterface->property("State").toUInt();
+    QMapIterator<QString, QVariant> i(map);
+    while (i.hasNext()) {
+        i.next();
+        propertyMap.insert(i.key(),i.value());
+
+        if (i.key() == QStringLiteral("State")) {
+            quint32 state = i.value().toUInt();
+            if (state == NM_DEVICE_STATE_ACTIVATED
+                || state == NM_DEVICE_STATE_DISCONNECTED
+                || state == NM_DEVICE_STATE_UNAVAILABLE
+                || state == NM_DEVICE_STATE_FAILED) {
+                Q_EMIT propertiesChanged(map);
+                Q_EMIT stateChanged(state);
+            }
+        } else if (i.key() == QStringLiteral("ActiveConnections")) {
+            Q_EMIT propertiesChanged(map);
+        }
+    }
 }
 
 class QNetworkManagerInterfaceAccessPointPrivate
@@ -183,18 +254,38 @@ public:
 };
 
 QNetworkManagerInterfaceAccessPoint::QNetworkManagerInterfaceAccessPoint(const QString &dbusPathName, QObject *parent)
-        : QObject(parent), nmDBusHelper(0)
+        : QObject(parent)
 {
     d = new QNetworkManagerInterfaceAccessPointPrivate();
     d->path = dbusPathName;
     d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
                                                 d->path,
                                                 QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
-                                                QDBusConnection::systemBus());
+                                                QDBusConnection::systemBus(),parent);
     if (!d->connectionInterface->isValid()) {
         d->valid = false;
         return;
     }
+    QDBusInterface accessPointPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+                                                  d->path,
+                                                  QLatin1String("org.freedesktop.DBus.Properties"),
+                                                  QDBusConnection::systemBus());
+
+    QList<QVariant> argumentList;
+    argumentList << QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT);
+    QDBusPendingReply<QVariantMap> propsReply
+            = accessPointPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+                                                                       argumentList);
+    if (!propsReply.isError()) {
+        propertyMap = propsReply.value();
+    }
+
+    QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+                                  d->path,
+                                  QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
+                                  QLatin1String("PropertiesChanged"),
+                                  this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
+
     d->valid = true;
 
 }
@@ -212,24 +303,10 @@ bool QNetworkManagerInterfaceAccessPoint::isValid()
 
 bool QNetworkManagerInterfaceAccessPoint::setConnections()
 {
-    if(!isValid() )
+    if (!isValid())
         return false;
 
-    bool allOk = false;
-    delete nmDBusHelper;
-    nmDBusHelper = new QNmDBusHelper(this);
-    connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
-            this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-
-    if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
-                              d->path,
-                              QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
-                              QLatin1String("PropertiesChanged"),
-                              nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
-        allOk = true;
-
-    }
-    return allOk;
+    return true;
 }
 
 QDBusInterface *QNetworkManagerInterfaceAccessPoint::connectionInterface() const
@@ -239,47 +316,74 @@ QDBusInterface *QNetworkManagerInterfaceAccessPoint::connectionInterface() const
 
 quint32 QNetworkManagerInterfaceAccessPoint::flags() const
 {
-    return d->connectionInterface->property("Flags").toUInt();
+    if (propertyMap.contains("Flags"))
+        return propertyMap.value("Flags").toUInt();
+    return 0;
 }
 
 quint32 QNetworkManagerInterfaceAccessPoint::wpaFlags() const
 {
-    return d->connectionInterface->property("WpaFlags").toUInt();
+    if (propertyMap.contains("WpaFlags"))
+        return propertyMap.value("WpaFlags").toUInt();
+    return 0;
 }
 
 quint32 QNetworkManagerInterfaceAccessPoint::rsnFlags() const
 {
-    return d->connectionInterface->property("RsnFlags").toUInt();
+    if (propertyMap.contains("RsnFlags"))
+        return propertyMap.value("RsnFlags").toUInt();
+    return 0;
 }
 
 QString QNetworkManagerInterfaceAccessPoint::ssid() const
 {
-    return d->connectionInterface->property("Ssid").toString();
+    if (propertyMap.contains("Ssid"))
+        return propertyMap.value("Ssid").toString();
+    return QString();
 }
 
 quint32 QNetworkManagerInterfaceAccessPoint::frequency() const
 {
-    return d->connectionInterface->property("Frequency").toUInt();
+    if (propertyMap.contains("Frequency"))
+        return propertyMap.value("Frequency").toUInt();
+    return 0;
 }
 
 QString QNetworkManagerInterfaceAccessPoint::hwAddress() const
 {
-    return d->connectionInterface->property("HwAddress").toString();
+    if (propertyMap.contains("HwAddress"))
+        return propertyMap.value("HwAddress").toString();
+    return QString();
 }
 
 quint32 QNetworkManagerInterfaceAccessPoint::mode() const
 {
-    return d->connectionInterface->property("Mode").toUInt();
+    if (propertyMap.contains("Mode"))
+        return propertyMap.value("Mode").toUInt();
+    return 0;
 }
 
 quint32 QNetworkManagerInterfaceAccessPoint::maxBitrate() const
 {
-    return d->connectionInterface->property("MaxBitrate").toUInt();
+    if (propertyMap.contains("MaxBitrate"))
+        return propertyMap.value("MaxBitrate").toUInt();
+    return 0;
 }
 
 quint32 QNetworkManagerInterfaceAccessPoint::strength() const
 {
-    return d->connectionInterface->property("Strength").toUInt();
+    if (propertyMap.contains("Strength"))
+        return propertyMap.value("Strength").toUInt();
+    return 0;
+}
+
+void QNetworkManagerInterfaceAccessPoint::propertiesSwap(QMap<QString,QVariant> map)
+{
+    QMapIterator<QString, QVariant> i(map);
+    while (i.hasNext()) {
+        i.next();
+        propertyMap.insert(i.key(),i.value());
+    }
 }
 
 class QNetworkManagerInterfaceDevicePrivate
@@ -291,18 +395,39 @@ public:
 };
 
 QNetworkManagerInterfaceDevice::QNetworkManagerInterfaceDevice(const QString &deviceObjectPath, QObject *parent)
-        : QObject(parent), nmDBusHelper(0)
+        : QObject(parent)
 {
+
     d = new QNetworkManagerInterfaceDevicePrivate();
     d->path = deviceObjectPath;
     d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
                                                 d->path,
                                                 QLatin1String(NM_DBUS_INTERFACE_DEVICE),
-                                                QDBusConnection::systemBus());
+                                                QDBusConnection::systemBus(),parent);
     if (!d->connectionInterface->isValid()) {
         d->valid = false;
         return;
     }
+    QDBusInterface devicePropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+                                                  d->path,
+                                                  QLatin1String("org.freedesktop.DBus.Properties"),
+                                                  QDBusConnection::systemBus(),parent);
+
+    QList<QVariant> argumentList;
+    argumentList << QLatin1String(NM_DBUS_INTERFACE_DEVICE);
+    QDBusPendingReply<QVariantMap> propsReply
+            = devicePropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+                                                                       argumentList);
+
+    if (!propsReply.isError()) {
+        propertyMap = propsReply.value();
+    }
+
+    QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+                                  d->path,
+                                  QLatin1String(NM_DBUS_INTERFACE_DEVICE),
+                                  QLatin1String("PropertiesChanged"),
+                                  this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
     d->valid = true;
 }
 
@@ -319,35 +444,10 @@ bool QNetworkManagerInterfaceDevice::isValid()
 
 bool QNetworkManagerInterfaceDevice::setConnections()
 {
-    if(!isValid() )
+    if (!isValid())
         return false;
 
-    bool allOk = true;
-    delete nmDBusHelper;
-    nmDBusHelper = new QNmDBusHelper(this);
-    connect(nmDBusHelper,SIGNAL(pathForStateChanged(QString,quint32)),
-            this, SIGNAL(stateChanged(QString,quint32)));
-
-    if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
-                              d->path,
-                              QLatin1String(NM_DBUS_INTERFACE_DEVICE),
-                              QLatin1String("StateChanged"),
-                              nmDBusHelper,SLOT(deviceStateChanged(quint32)))) {
-        allOk = false;
-    }
-
-    connect(nmDBusHelper, SIGNAL(pathForConnectionsChanged(QStringList)),
-            this,SIGNAL(connectionsChanged(QStringList)));
-
-    if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
-                                             d->path,
-                                             QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
-                                             QLatin1String("PropertiesChanged"),
-                                             nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
-        allOk = false;
-    }
-
-    return allOk;
+    return true;
 }
 
 QDBusInterface *QNetworkManagerInterfaceDevice::connectionInterface() const
@@ -357,33 +457,66 @@ QDBusInterface *QNetworkManagerInterfaceDevice::connectionInterface() const
 
 QString QNetworkManagerInterfaceDevice::udi() const
 {
-    return d->connectionInterface->property("Udi").toString();
+    if (propertyMap.contains("Udi"))
+        return propertyMap.value("Udi").toString();
+    return QString();
 }
 
 QString QNetworkManagerInterfaceDevice::networkInterface() const
 {
-    return d->connectionInterface->property("Interface").toString();
+    if (propertyMap.contains("Interface"))
+        return propertyMap.value("Interface").toString();
+    return QString();
 }
 
 quint32 QNetworkManagerInterfaceDevice::ip4Address() const
 {
-    return d->connectionInterface->property("Ip4Address").toUInt();
+    if (propertyMap.contains("Ip4Address"))
+        return propertyMap.value("Ip4Address").toUInt();
+    return 0;
 }
 
 quint32 QNetworkManagerInterfaceDevice::state() const
 {
-    return d->connectionInterface->property("State").toUInt();
+    if (propertyMap.contains("State"))
+        return propertyMap.value("State").toUInt();
+    return 0;
 }
 
 quint32 QNetworkManagerInterfaceDevice::deviceType() const
 {
-    return d->connectionInterface->property("DeviceType").toUInt();
+    if (propertyMap.contains("DeviceType"))
+        return propertyMap.value("DeviceType").toUInt();
+    return 0;
 }
 
 QDBusObjectPath QNetworkManagerInterfaceDevice::ip4config() const
 {
-    QVariant prop = d->connectionInterface->property("Ip4Config");
-    return prop.value<QDBusObjectPath>();
+    if (propertyMap.contains("Ip4Config"))
+        return propertyMap.value("Ip4Config").value<QDBusObjectPath>();
+    return QDBusObjectPath();
+}
+
+void QNetworkManagerInterfaceDevice::propertiesSwap(QMap<QString,QVariant> map)
+{
+    QMapIterator<QString, QVariant> i(map);
+    while (i.hasNext()) {
+        i.next();
+        if (i.key() == QStringLiteral("AvailableConnections")) { //Device
+            const QDBusArgument &dbusArgs = i.value().value<QDBusArgument>();
+            QDBusObjectPath path;
+            QStringList paths;
+            dbusArgs.beginArray();
+            while (!dbusArgs.atEnd()) {
+                dbusArgs >> path;
+                paths << path.path();
+            }
+            dbusArgs.endArray();
+            Q_EMIT connectionsChanged(paths);
+        }
+        propertyMap.insert(i.key(),i.value());
+    }
+    Q_EMIT propertiesChanged(map);
 }
 
 class QNetworkManagerInterfaceDeviceWiredPrivate
@@ -395,7 +528,7 @@ public:
 };
 
 QNetworkManagerInterfaceDeviceWired::QNetworkManagerInterfaceDeviceWired(const QString &ifaceDevicePath, QObject *parent)
-    : QObject(parent), nmDBusHelper(0)
+    : QObject(parent)
 {
     d = new QNetworkManagerInterfaceDeviceWiredPrivate();
     d->path = ifaceDevicePath;
@@ -407,6 +540,27 @@ QNetworkManagerInterfaceDeviceWired::QNetworkManagerInterfaceDeviceWired(const Q
         d->valid = false;
         return;
     }
+    QDBusInterface deviceWiredPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+                                                  d->path,
+                                                  QLatin1String("org.freedesktop.DBus.Properties"),
+                                                  QDBusConnection::systemBus(),parent);
+
+    QList<QVariant> argumentList;
+    argumentList << QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED);
+    QDBusPendingReply<QVariantMap> propsReply
+            = deviceWiredPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+                                                                       argumentList);
+
+    if (!propsReply.isError()) {
+        propertyMap = propsReply.value();
+    }
+
+    QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+                                  d->path,
+                                  QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
+                                  QLatin1String("PropertiesChanged"),
+                                  this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
+
     d->valid = true;
 }
 
@@ -424,23 +578,9 @@ bool QNetworkManagerInterfaceDeviceWired::isValid()
 
 bool QNetworkManagerInterfaceDeviceWired::setConnections()
 {
-    if(!isValid() )
+    if (!isValid())
         return false;
-
-    bool allOk = true;
-
-    delete nmDBusHelper;
-    nmDBusHelper = new QNmDBusHelper(this);
-    connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
-            this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-    if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
-                              d->path,
-                              QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
-                              QLatin1String("PropertiesChanged"),
-                              nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) )  {
-        allOk = false;
-    }
-    return allOk;
+    return true;
 }
 
 QDBusInterface *QNetworkManagerInterfaceDeviceWired::connectionInterface() const
@@ -450,17 +590,53 @@ QDBusInterface *QNetworkManagerInterfaceDeviceWired::connectionInterface() const
 
 QString QNetworkManagerInterfaceDeviceWired::hwAddress() const
 {
-    return d->connectionInterface->property("HwAddress").toString();
+    if (propertyMap.contains("HwAddress"))
+        return propertyMap.value("HwAddress").toString();
+    return QString();
 }
 
 quint32 QNetworkManagerInterfaceDeviceWired::speed() const
 {
-    return d->connectionInterface->property("Speed").toUInt();
+    if (propertyMap.contains("Speed"))
+        return propertyMap.value("Speed").toUInt();
+    return 0;
 }
 
 bool QNetworkManagerInterfaceDeviceWired::carrier() const
 {
-    return d->connectionInterface->property("Carrier").toBool();
+    if (propertyMap.contains("Carrier"))
+        return propertyMap.value("Carrier").toBool();
+    return false;
+}
+
+QStringList QNetworkManagerInterfaceDeviceWired::availableConnections()
+{
+    QStringList list;
+    if (propertyMap.contains("AvailableConnections")) {
+        const QDBusArgument &dbusArgs = propertyMap.value("Carrier").value<QDBusArgument>();
+        QDBusObjectPath path;
+        dbusArgs.beginArray();
+        while (!dbusArgs.atEnd()) {
+            dbusArgs >> path;
+            list << path.path();
+        }
+        dbusArgs.endArray();
+    }
+
+    return list;
+}
+
+void QNetworkManagerInterfaceDeviceWired::propertiesSwap(QMap<QString,QVariant> map)
+{
+    QMapIterator<QString, QVariant> i(map);
+    while (i.hasNext()) {
+        i.next();
+        propertyMap.insert(i.key(),i.value());
+        if (i.key() == QStringLiteral("Carrier")) {
+            Q_EMIT carrierChanged(i.value().toBool());
+        }
+    }
+    Q_EMIT propertiesChanged(map);
 }
 
 class QNetworkManagerInterfaceDeviceWirelessPrivate
@@ -472,7 +648,7 @@ public:
 };
 
 QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(const QString &ifaceDevicePath, QObject *parent)
-    : QObject(parent), nmDBusHelper(0)
+    : QObject(parent)
 {
     d = new QNetworkManagerInterfaceDeviceWirelessPrivate();
     d->path = ifaceDevicePath;
@@ -484,6 +660,34 @@ QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(c
         d->valid = false;
         return;
     }
+
+
+    QDBusPendingReply<QList <QDBusObjectPath> > nmReply
+            = d->connectionInterface->call(QLatin1String("GetAccessPoints"));
+
+    if (!nmReply.isError()) {
+        accessPointsList = nmReply.value();
+    }
+
+    QDBusInterface deviceWirelessPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+                                                  d->path,
+                                                  QLatin1String("org.freedesktop.DBus.Properties"),
+                                                  QDBusConnection::systemBus(),parent);
+
+    QList<QVariant> argumentList;
+    argumentList << QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS);
+    QDBusPendingReply<QVariantMap> propsReply
+            = deviceWirelessPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+                                                                       argumentList);
+    if (!propsReply.isError()) {
+        propertyMap = propsReply.value();
+    }
+
+    QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+                                  d->path,
+                                  QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
+                                  QLatin1String("PropertiesChanged"),
+                                  this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
     d->valid = true;
 }
 
@@ -498,29 +702,31 @@ bool QNetworkManagerInterfaceDeviceWireless::isValid()
     return d->valid;
 }
 
+void QNetworkManagerInterfaceDeviceWireless::slotAccessPointAdded(QDBusObjectPath path)
+{
+    if (path.path().length() > 2)
+        Q_EMIT accessPointAdded(path.path());
+}
+
+void QNetworkManagerInterfaceDeviceWireless::slotAccessPointRemoved(QDBusObjectPath path)
+{
+    if (path.path().length() > 2)
+        Q_EMIT accessPointRemoved(path.path());
+}
+
 bool QNetworkManagerInterfaceDeviceWireless::setConnections()
 {
-    if(!isValid() )
+    if (!isValid())
         return false;
 
     QDBusConnection dbusConnection = QDBusConnection::systemBus();
     bool allOk = true;
-    delete nmDBusHelper;
-    nmDBusHelper = new QNmDBusHelper(this);
-    connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
-            this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-
-    connect(nmDBusHelper, SIGNAL(pathForAccessPointAdded(QString)),
-            this,SIGNAL(accessPointAdded(QString)));
-
-    connect(nmDBusHelper, SIGNAL(pathForAccessPointRemoved(QString)),
-            this,SIGNAL(accessPointRemoved(QString)));
 
     if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
-                              d->path,
+                                d->path,
                               QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
                               QLatin1String("AccessPointAdded"),
-                              nmDBusHelper, SLOT(slotAccessPointAdded(QDBusObjectPath)))) {
+                              this, SLOT(slotAccessPointAdded(QDBusObjectPath)))) {
         allOk = false;
     }
 
@@ -529,18 +735,10 @@ bool QNetworkManagerInterfaceDeviceWireless::setConnections()
                               d->path,
                               QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
                               QLatin1String("AccessPointRemoved"),
-                              nmDBusHelper, SLOT(slotAccessPointRemoved(QDBusObjectPath)))) {
+                              this, SLOT(slotAccessPointRemoved(QDBusObjectPath)))) {
         allOk = false;
     }
 
-
-    if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
-                              d->path,
-                              QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
-                              QLatin1String("PropertiesChanged"),
-                              nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) {
-        allOk = false;
-    }
     if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
                                d->path,
                                QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
@@ -558,33 +756,48 @@ QDBusInterface *QNetworkManagerInterfaceDeviceWireless::connectionInterface() co
 
 QList <QDBusObjectPath> QNetworkManagerInterfaceDeviceWireless::getAccessPoints()
 {
-    QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("GetAccessPoints"));
-    return reply.value();
+    if (accessPointsList.isEmpty()) {
+        qWarning() << "Using blocking call!";
+        QDBusReply<QList<QDBusObjectPath> > reply
+                = d->connectionInterface->call(QLatin1String("GetAccessPoints"));
+        accessPointsList = reply.value();
+    }
+    return accessPointsList;
 }
 
 QString QNetworkManagerInterfaceDeviceWireless::hwAddress() const
 {
-    return d->connectionInterface->property("HwAddress").toString();
+    if (propertyMap.contains("HwAddress"))
+        return propertyMap.value("HwAddress").toString();
+    return QString();
 }
 
 quint32 QNetworkManagerInterfaceDeviceWireless::mode() const
 {
-    return d->connectionInterface->property("Mode").toUInt();
+    if (propertyMap.contains("Mode"))
+        return propertyMap.value("Mode").toUInt();
+    return 0;
 }
 
 quint32 QNetworkManagerInterfaceDeviceWireless::bitrate() const
 {
-    return d->connectionInterface->property("Bitrate").toUInt();
+    if (propertyMap.contains("Bitrate"))
+        return propertyMap.value("Bitrate").toUInt();
+    return 0;
 }
 
 QDBusObjectPath QNetworkManagerInterfaceDeviceWireless::activeAccessPoint() const
 {
-    return d->connectionInterface->property("ActiveAccessPoint").value<QDBusObjectPath>();
+    if (propertyMap.contains("ActiveAccessPoint"))
+        return propertyMap.value("ActiveAccessPoint").value<QDBusObjectPath>();
+    return QDBusObjectPath();
 }
 
 quint32 QNetworkManagerInterfaceDeviceWireless::wirelessCapabilities() const
 {
-    return d->connectionInterface->property("WirelelessCapabilities").toUInt();
+    if (propertyMap.contains("WirelelessCapabilities"))
+        return propertyMap.value("WirelelessCapabilities").toUInt();
+    return 0;
 }
 
 void QNetworkManagerInterfaceDeviceWireless::scanIsDone()
@@ -597,6 +810,17 @@ void QNetworkManagerInterfaceDeviceWireless::requestScan()
     d->connectionInterface->asyncCall(QLatin1String("RequestScan"));
 }
 
+void QNetworkManagerInterfaceDeviceWireless::propertiesSwap(QMap<QString,QVariant> map)
+{
+    QMapIterator<QString, QVariant> i(map);
+    while (i.hasNext()) {
+        i.next();
+        propertyMap.insert(i.key(),i.value());
+        if (i.key() == QStringLiteral("ActiveAccessPoint")) { //DeviceWireless
+            Q_EMIT propertiesChanged(map);
+        }
+    }
+}
 
 class QNetworkManagerInterfaceDeviceModemPrivate
 {
@@ -607,7 +831,7 @@ public:
 };
 
 QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, QObject *parent)
-    : QObject(parent), nmDBusHelper(0)
+    : QObject(parent)
 {
     d = new QNetworkManagerInterfaceDeviceModemPrivate();
     d->path = ifaceDevicePath;
@@ -619,6 +843,25 @@ QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const Q
         d->valid = false;
         return;
     }
+    QDBusInterface deviceModemPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+                                                  d->path,
+                                                  QLatin1String("org.freedesktop.DBus.Properties"),
+                                                  QDBusConnection::systemBus(),parent);
+
+    QList<QVariant> argumentList;
+    argumentList << QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM);
+    QDBusPendingReply<QVariantMap> propsReply
+            = deviceModemPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+                                                                       argumentList);
+    if (!propsReply.isError()) {
+        propertyMap = propsReply.value();
+    }
+
+    QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+                                  d->path,
+                                  QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM),
+                                  QLatin1String("PropertiesChanged"),
+                                  this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
     d->valid = true;
 }
 
@@ -639,20 +882,7 @@ bool QNetworkManagerInterfaceDeviceModem::setConnections()
     if (!isValid() )
         return false;
 
-    bool allOk = true;
-
-    delete nmDBusHelper;
-    nmDBusHelper = new QNmDBusHelper(this);
-    connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
-            this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-    if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
-                              d->path,
-                              QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM),
-                              QLatin1String("PropertiesChanged"),
-                              nmDBusHelper,SLOT(slotDevicePropertiesChanged(QMap<QString,QVariant>))) )  {
-        allOk = false;
-    }
-    return allOk;
+    return true;
 }
 
 QDBusInterface *QNetworkManagerInterfaceDeviceModem::connectionInterface() const
@@ -660,14 +890,28 @@ QDBusInterface *QNetworkManagerInterfaceDeviceModem::connectionInterface() const
     return d->connectionInterface;
 }
 
-quint32 QNetworkManagerInterfaceDeviceModem::modemCapabilities() const
+QNetworkManagerInterfaceDeviceModem::ModemCapabilities QNetworkManagerInterfaceDeviceModem::modemCapabilities() const
+{
+    if (propertyMap.contains("ModemCapabilities"))
+        return static_cast<QNetworkManagerInterfaceDeviceModem::ModemCapabilities>(propertyMap.value("ModemCapabilities").toUInt());
+    return QNetworkManagerInterfaceDeviceModem::None;
+}
+
+QNetworkManagerInterfaceDeviceModem::ModemCapabilities QNetworkManagerInterfaceDeviceModem::currentCapabilities() const
 {
-    return d->connectionInterface->property("ModemCapabilities").toUInt();
+    if (propertyMap.contains("CurrentCapabilities"))
+        return static_cast<QNetworkManagerInterfaceDeviceModem::ModemCapabilities>(propertyMap.value("CurrentCapabilities").toUInt());
+    return QNetworkManagerInterfaceDeviceModem::None;
 }
 
-quint32 QNetworkManagerInterfaceDeviceModem::currentCapabilities() const
+void QNetworkManagerInterfaceDeviceModem::propertiesSwap(QMap<QString,QVariant> map)
 {
-    return d->connectionInterface->property("CurrentCapabilities").toUInt();
+    QMapIterator<QString, QVariant> i(map);
+    while (i.hasNext()) {
+        i.next();
+        propertyMap.insert(i.key(),i.value());
+    }
+    Q_EMIT propertiesChanged(map);
 }
 
 class QNetworkManagerSettingsPrivate
@@ -691,6 +935,14 @@ QNetworkManagerSettings::QNetworkManagerSettings(const QString &settingsService,
         d->valid = false;
         return;
     }
+
+    QDBusPendingReply<QList <QDBusObjectPath> > nmReply
+            = d->connectionInterface->call(QLatin1String("ListConnections"));
+
+    if (!nmReply.isError()) {
+        connectionsList = nmReply.value();
+    }
+
     d->valid = true;
 }
 
@@ -722,10 +974,16 @@ bool QNetworkManagerSettings::setConnections()
 
 QList <QDBusObjectPath> QNetworkManagerSettings::listConnections()
 {
-    QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("ListConnections"));
-    return  reply.value();
+    if (connectionsList.isEmpty()) {
+        qWarning() << "Using blocking call!";
+        QDBusReply<QList<QDBusObjectPath> > reply
+                = d->connectionInterface->call(QLatin1String("ListConnections"));
+        connectionsList = reply.value();
+    }
+    return connectionsList;
 }
 
+
 QString QNetworkManagerSettings::getConnectionByUuid(const QString &uuid)
 {
     QList<QVariant> argumentList;
@@ -751,7 +1009,7 @@ public:
 };
 
 QNetworkManagerSettingsConnection::QNetworkManagerSettingsConnection(const QString &settingsService, const QString &connectionObjectPath, QObject *parent)
-    : QObject(parent), nmDBusHelper(0)
+    : QObject(parent)
 {
     qDBusRegisterMetaType<QNmSettingsMap>();
     d = new QNetworkManagerSettingsConnectionPrivate();
@@ -766,8 +1024,12 @@ QNetworkManagerSettingsConnection::QNetworkManagerSettingsConnection(const QStri
         return;
     }
     d->valid = true;
-    QDBusReply< QNmSettingsMap > rep = d->connectionInterface->call(QLatin1String("GetSettings"));
-    d->settingsMap = rep.value();
+
+    QDBusPendingReply<QNmSettingsMap> nmReply
+            = d->connectionInterface->call(QLatin1String("GetSettings"));
+    if (!nmReply.isError()) {
+        d->settingsMap = nmReply.value();
+    }
 }
 
 QNetworkManagerSettingsConnection::~QNetworkManagerSettingsConnection()
@@ -783,7 +1045,7 @@ bool QNetworkManagerSettingsConnection::isValid()
 
 bool QNetworkManagerSettingsConnection::setConnections()
 {
-    if(!isValid() )
+    if (!isValid())
         return false;
 
     QDBusConnection dbusConnection = QDBusConnection::systemBus();
@@ -796,21 +1058,21 @@ bool QNetworkManagerSettingsConnection::setConnections()
         allOk = false;
     }
 
-    delete nmDBusHelper;
-    nmDBusHelper = new QNmDBusHelper(this);
-    connect(nmDBusHelper, SIGNAL(pathForSettingsRemoved(QString)),
-            this,SIGNAL(removed(QString)));
-
     if (!dbusConnection.connect(d->service,
                                d->path,
                                QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
                                QLatin1String("Removed"),
-                               nmDBusHelper, SIGNAL(slotSettingsRemoved()))) {
+                               this, SIGNAL(slotSettingsRemoved()))) {
         allOk = false;
     }
     return allOk;
 }
 
+void QNetworkManagerSettingsConnection::slotSettingsRemoved()
+{
+    Q_EMIT removed(d->path);
+}
+
 QDBusInterface *QNetworkManagerSettingsConnection::connectionInterface() const
 {
     return d->connectionInterface;
@@ -818,8 +1080,11 @@ QDBusInterface *QNetworkManagerSettingsConnection::connectionInterface() const
 
 QNmSettingsMap QNetworkManagerSettingsConnection::getSettings()
 {
-    QDBusReply< QNmSettingsMap > rep = d->connectionInterface->call(QLatin1String("GetSettings"));
-    d->settingsMap = rep.value();
+    if (d->settingsMap.isEmpty()) {
+        qWarning() << "Using blocking call!";
+        QDBusReply<QNmSettingsMap> reply = d->connectionInterface->call(QLatin1String("GetSettings"));
+        d->settingsMap = reply.value();
+    }
     return d->settingsMap;
 }
 
@@ -832,6 +1097,8 @@ NMDeviceType QNetworkManagerSettingsConnection::getType()
         return DEVICE_TYPE_ETHERNET;
     else if (devType == QLatin1String("802-11-wireless"))
         return DEVICE_TYPE_WIFI;
+    else if (devType == QLatin1String("gsm"))
+        return DEVICE_TYPE_MODEM;
     else
         return DEVICE_TYPE_UNKNOWN;
 }
@@ -908,7 +1175,7 @@ public:
 };
 
 QNetworkManagerConnectionActive::QNetworkManagerConnectionActive(const QString &activeConnectionObjectPath, QObject *parent)
-    : QObject(parent), nmDBusHelper(0)
+    : QObject(parent)
 {
     d = new QNetworkManagerConnectionActivePrivate();
     d->path = activeConnectionObjectPath;
@@ -920,6 +1187,29 @@ QNetworkManagerConnectionActive::QNetworkManagerConnectionActive(const QString &
         d->valid = false;
         return;
     }
+    QDBusInterface connectionActivePropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+                                                  d->path,
+                                                  QLatin1String("org.freedesktop.DBus.Properties"),
+                                                  QDBusConnection::systemBus());
+
+
+    QList<QVariant> argumentList;
+    argumentList << QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION);
+    QDBusPendingReply<QVariantMap> propsReply
+            = connectionActivePropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+                                                                       argumentList);
+
+    if (!propsReply.isError()) {
+        propertyMap = propsReply.value();
+    } else {
+        qWarning() << propsReply.error().message();
+    }
+
+    QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+                                  d->path,
+                                  QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
+                                  QLatin1String("PropertiesChanged"),
+                                  this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
     d->valid = true;
 }
 
@@ -936,24 +1226,10 @@ bool QNetworkManagerConnectionActive::isValid()
 
 bool QNetworkManagerConnectionActive::setConnections()
 {
-    if(!isValid() )
+    if (!isValid())
         return false;
 
-    bool allOk = true;
-    delete nmDBusHelper;
-    nmDBusHelper = new QNmDBusHelper(this);
-    connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
-            this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
-
-    if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
-                              d->path,
-                              QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
-                              QLatin1String("PropertiesChanged"),
-                              nmDBusHelper,SLOT(activeConnectionPropertiesChanged(QMap<QString,QVariant>))) )  {
-        allOk = false;
-    }
-
-    return allOk;
+    return true;
 }
 
 QDBusInterface *QNetworkManagerConnectionActive::connectionInterface() const
@@ -963,30 +1239,70 @@ QDBusInterface *QNetworkManagerConnectionActive::connectionInterface() const
 
 QDBusObjectPath QNetworkManagerConnectionActive::connection() const
 {
-    QVariant prop = d->connectionInterface->property("Connection");
-    return prop.value<QDBusObjectPath>();
+    if (propertyMap.contains("Connection"))
+        return propertyMap.value("Connection").value<QDBusObjectPath>();
+    return QDBusObjectPath();
 }
 
 QDBusObjectPath QNetworkManagerConnectionActive::specificObject() const
 {
-    QVariant prop = d->connectionInterface->property("SpecificObject");
-    return prop.value<QDBusObjectPath>();
+    if (propertyMap.contains("SpecificObject"))
+        return propertyMap.value("SpecificObject").value<QDBusObjectPath>();
+    return QDBusObjectPath();
 }
 
-QList<QDBusObjectPath> QNetworkManagerConnectionActive::devices() const
+QStringList QNetworkManagerConnectionActive::devices() const
 {
-    QVariant prop = d->connectionInterface->property("Devices");
-    return prop.value<QList<QDBusObjectPath> >();
+    QStringList list;
+    if (propertyMap.contains("Devices")) {
+        const QDBusArgument &dbusArgs = propertyMap.value("Devices").value<QDBusArgument>();
+        QDBusObjectPath path;
+
+        dbusArgs.beginArray();
+        while (!dbusArgs.atEnd()) {
+            dbusArgs >> path;
+            list.append(path.path());
+        }
+        dbusArgs.endArray();
+    }
+    return list;
 }
 
 quint32 QNetworkManagerConnectionActive::state() const
 {
-    return d->connectionInterface->property("State").toUInt();
+    if (propertyMap.contains("State"))
+        return propertyMap.value("State").toUInt();
+    return 0;
 }
 
 bool QNetworkManagerConnectionActive::defaultRoute() const
 {
-    return d->connectionInterface->property("Default").toBool();
+    if (propertyMap.contains("Default"))
+        return propertyMap.value("Default").toBool();
+    return false;
+}
+
+bool QNetworkManagerConnectionActive::default6Route() const
+{
+    if (propertyMap.contains("Default6"))
+        return propertyMap.value("Default6").toBool();
+    return false;
+}
+
+void QNetworkManagerConnectionActive::propertiesSwap(QMap<QString,QVariant> map)
+{
+    QMapIterator<QString, QVariant> i(map);
+    while (i.hasNext()) {
+        i.next();
+        propertyMap.insert(i.key(),i.value());
+        if (i.key() == QStringLiteral("State")) {
+            quint32 state = i.value().toUInt();
+            if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED
+                || state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
+                Q_EMIT propertiesChanged(map);
+            }
+        }
+    }
 }
 
 class QNetworkManagerIp4ConfigPrivate
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
index 11ddaf708822274e861742aa643ea97e9c558760..da909c443ac6fb1de8f24b5c7a71abf354cd4edd 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
@@ -56,7 +56,6 @@
 #include <QtDBus/QDBusObjectPath>
 #include <QtDBus/QDBusContext>
 #include <QMap>
-#include "qnmdbushelper.h"
 
 #ifndef QT_NO_DBUS
 
@@ -89,7 +88,7 @@ typedef enum
     NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0,
     NM_ACTIVE_CONNECTION_STATE_ACTIVATING,
     NM_ACTIVE_CONNECTION_STATE_ACTIVATED,
-    NM_ACTIVE_CONNECTION_STATE_DEACTIVATED
+    NM_ACTIVE_CONNECTION_STATE_DEACTIVATED = 4
 } NMActiveConnectionState;
 
 #define NM_DBUS_SERVICE                     "org.freedesktop.NetworkManager"
@@ -135,12 +134,23 @@ class QNetworkManagerInterface : public QObject
     Q_OBJECT
 
 public:
+    typedef enum
+    {
+        NM_STATE_UNKNOWN = 0,
+        NM_STATE_ASLEEP = 10,
+        NM_STATE_DISCONNECTED = 20,
+        NM_STATE_DISCONNECTING = 30,
+        NM_STATE_CONNECTING = 40,
+        NM_STATE_CONNECTED_LOCAL = 50,
+        NM_STATE_CONNECTED_SITE = 60,
+        NM_STATE_CONNECTED_GLOBAL = 70
+    } NMState;
 
     QNetworkManagerInterface(QObject *parent = 0);
     ~QNetworkManagerInterface();
 
-    QList <QDBusObjectPath> getDevices() const;
-    void activateConnection(const QString &serviceName, QDBusObjectPath connection, QDBusObjectPath device, QDBusObjectPath specificObject);
+    QList <QDBusObjectPath> getDevices();
+    void activateConnection(QDBusObjectPath connection,QDBusObjectPath device, QDBusObjectPath specificObject);
     void deactivateConnection(QDBusObjectPath connectionPath) const;
 
     QDBusObjectPath path() const;
@@ -149,21 +159,28 @@ public:
     bool wirelessEnabled() const;
     bool wirelessHardwareEnabled() const;
     QList <QDBusObjectPath> activeConnections() const;
-    quint32 state();
+    NMState state();
+    QString version() const;
     bool setConnections();
     bool isValid();
 
 Q_SIGNALS:
     void deviceAdded(QDBusObjectPath);
     void deviceRemoved(QDBusObjectPath);
-    void propertiesChanged( const QString &, QMap<QString,QVariant>);
-    void stateChanged(const QString&, quint32);
+    void propertiesChanged(QMap<QString,QVariant>);
+    void stateChanged(quint32);
     void activationFinished(QDBusPendingCallWatcher*);
+    void propertiesReady();
+    void devicesListReady();
 
 private Q_SLOTS:
+    void propertiesSwap(QMap<QString,QVariant>);
+
 private:
     QNetworkManagerInterfacePrivate *d;
-    QNmDBusHelper *nmDBusHelper;
+    QVariantMap propertyMap;
+    QList<QDBusObjectPath> devicesPathList;
+
 };
 
 class QNetworkManagerInterfaceAccessPointPrivate;
@@ -228,11 +245,14 @@ public:
 
 Q_SIGNALS:
     void propertiesChanged(QMap <QString,QVariant>);
-    void propertiesChanged( const QString &, QMap<QString,QVariant>);
+    void propertiesReady();
+
+private Q_SLOTS:
+    void propertiesSwap(QMap<QString,QVariant>);
+
 private:
     QNetworkManagerInterfaceAccessPointPrivate *d;
-    QNmDBusHelper *nmDBusHelper;
-
+    QVariantMap propertyMap;
 };
 
 class QNetworkManagerInterfaceDevicePrivate;
@@ -258,11 +278,14 @@ public:
 
 Q_SIGNALS:
     void stateChanged(const QString &, quint32);
-    void propertiesChanged(const QString &, QMap<QString,QVariant>);
+    void propertiesChanged(QMap<QString,QVariant>);
     void connectionsChanged(QStringList);
+    void propertiesReady();
+private Q_SLOTS:
+    void propertiesSwap(QMap<QString,QVariant>);
 private:
     QNetworkManagerInterfaceDevicePrivate *d;
-    QNmDBusHelper *nmDBusHelper;
+    QVariantMap propertyMap;
 };
 
 class QNetworkManagerInterfaceDeviceWiredPrivate;
@@ -282,12 +305,19 @@ public:
     bool carrier() const;
     bool setConnections();
     bool isValid();
+    QStringList availableConnections();
 
 Q_SIGNALS:
-    void propertiesChanged( const QString &, QMap<QString,QVariant>);
+    void propertiesChanged(QMap<QString,QVariant>);
+    void propertiesReady();
+    void carrierChanged(bool);
+
+private Q_SLOTS:
+    void propertiesSwap(QMap<QString,QVariant>);
+
 private:
     QNetworkManagerInterfaceDeviceWiredPrivate *d;
-    QNmDBusHelper *nmDBusHelper;
+    QVariantMap propertyMap;
 };
 
 class QNetworkManagerInterfaceDeviceWirelessPrivate;
@@ -325,15 +355,24 @@ public:
 
     void requestScan();
 Q_SIGNALS:
-    void propertiesChanged( const QString &, QMap<QString,QVariant>);
+    void propertiesChanged(QMap<QString,QVariant>);
     void accessPointAdded(const QString &);
     void accessPointRemoved(const QString &);
     void scanDone();
+    void propertiesReady();
+    void accessPointsReady();
+
 private Q_SLOTS:
     void scanIsDone();
+    void propertiesSwap(QMap<QString,QVariant>);
+
+    void slotAccessPointAdded(QDBusObjectPath);
+    void slotAccessPointRemoved(QDBusObjectPath);
+
 private:
     QNetworkManagerInterfaceDeviceWirelessPrivate *d;
-    QNmDBusHelper *nmDBusHelper;
+    QVariantMap propertyMap;
+    QList <QDBusObjectPath> accessPointsList;
 };
 
 class QNetworkManagerInterfaceDeviceModemPrivate;
@@ -350,6 +389,7 @@ public:
         Gsm_Umts = 0x4,
         Lte = 0x08
        };
+    Q_DECLARE_FLAGS(ModemCapabilities, ModemCapability)
 
     explicit QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath,
                                                     QObject *parent = 0);
@@ -361,16 +401,22 @@ public:
     bool setConnections();
     bool isValid();
 
-    quint32 modemCapabilities() const;
-    quint32 currentCapabilities() const;
+    ModemCapabilities modemCapabilities() const;
+    ModemCapabilities currentCapabilities() const;
 
 Q_SIGNALS:
-    void propertiesChanged( const QString &, QMap<QString,QVariant>);
+    void propertiesChanged(QMap<QString,QVariant>);
+    void propertiesReady();
+
+private Q_SLOTS:
+    void propertiesSwap(QMap<QString,QVariant>);
+
 private:
     QNetworkManagerInterfaceDeviceModemPrivate *d;
-    QNmDBusHelper *nmDBusHelper;
+    QVariantMap propertyMap;
 };
 
+Q_DECLARE_OPERATORS_FOR_FLAGS(QNetworkManagerInterfaceDeviceModem::ModemCapabilities)
 
 class QNetworkManagerSettingsPrivate;
 class QNetworkManagerSettings : public QObject
@@ -390,8 +436,10 @@ public:
 
 Q_SIGNALS:
     void newConnection(QDBusObjectPath);
+    void connectionsListReady();
 private:
     QNetworkManagerSettingsPrivate *d;
+    QList <QDBusObjectPath> connectionsList;
 };
 
 class QNetworkManagerSettingsConnectionPrivate;
@@ -418,12 +466,14 @@ public:
     bool isValid();
 
 Q_SIGNALS:
-
     void updated();
     void removed(const QString &path);
+    void settingsReady();
+
+private Q_SLOTS:
+    void slotSettingsRemoved();
 
 private:
-    QNmDBusHelper *nmDBusHelper;
     QNetworkManagerSettingsConnectionPrivate *d;
 };
 
@@ -444,22 +494,26 @@ public:
     ~ QNetworkManagerConnectionActive();
 
     QDBusInterface  *connectionInterface() const;
-    QString serviceName() const;
     QDBusObjectPath connection() const;
     QDBusObjectPath specificObject() const;
-    QList<QDBusObjectPath> devices() const;
+    QStringList devices() const;
     quint32 state() const;
     bool defaultRoute() const;
+    bool default6Route() const;
     bool setConnections();
     bool isValid();
 
 
 Q_SIGNALS:
-    void propertiesChanged(QList<QDBusObjectPath>);
-    void propertiesChanged( const QString &, QMap<QString,QVariant>);
+    void propertiesChanged(QMap<QString,QVariant>);
+    void propertiesReady();
+
+private Q_SLOTS:
+    void propertiesSwap(QMap<QString,QVariant>);
+
 private:
     QNetworkManagerConnectionActivePrivate *d;
-    QNmDBusHelper *nmDBusHelper;
+    QVariantMap propertyMap;
 };
 
 class QNetworkManagerIp4ConfigPrivate;
diff --git a/src/plugins/bearer/networkmanager/qnmdbushelper.cpp b/src/plugins/bearer/networkmanager/qnmdbushelper.cpp
deleted file mode 100644
index 0decfd78b9e22c112c3140c205c9d8f29e61e456..0000000000000000000000000000000000000000
--- a/src/plugins/bearer/networkmanager/qnmdbushelper.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// this class is for helping qdbus get stuff
-
-#include "qnmdbushelper.h"
-
-#include "qnetworkmanagerservice.h"
-
-#include <QDBusError>
-#include <QDBusInterface>
-#include <QDBusMessage>
-#include <QDBusReply>
-
-#include <QDebug>
-
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-QNmDBusHelper::QNmDBusHelper(QObject * parent)
-        : QObject(parent)
-{
-}
-
-QNmDBusHelper::~QNmDBusHelper()
-{
-}
-
-void QNmDBusHelper::deviceStateChanged(quint32 state)
- {
-    QDBusMessage msg = this->message();
-    if (state == NM_DEVICE_STATE_ACTIVATED
-       || state == NM_DEVICE_STATE_DISCONNECTED
-       || state == NM_DEVICE_STATE_UNAVAILABLE
-       || state == NM_DEVICE_STATE_FAILED) {
-        emit pathForStateChanged(msg.path(), state);
-    }
- }
-
-void QNmDBusHelper::slotAccessPointAdded(QDBusObjectPath path)
-{
-    if (path.path().length() > 2)
-        emit pathForAccessPointAdded(path.path());
-}
-
-void QNmDBusHelper::slotAccessPointRemoved(QDBusObjectPath path)
-{
-    if (path.path().length() > 2)
-        emit pathForAccessPointRemoved(path.path());
-}
-
-void QNmDBusHelper::slotPropertiesChanged(QMap<QString,QVariant> map)
-{
-    QDBusMessage msg = this->message();
-    QMapIterator<QString, QVariant> i(map);
-    while (i.hasNext()) {
-        i.next();
-        if (i.key() == QStringLiteral("State")) {
-            quint32 state = i.value().toUInt();
-            if (state == NM_DEVICE_STATE_ACTIVATED
-                || state == NM_DEVICE_STATE_DISCONNECTED
-                || state == NM_DEVICE_STATE_UNAVAILABLE
-                || state == NM_DEVICE_STATE_FAILED) {
-                emit pathForPropertiesChanged(msg.path(), map);
-            }
-        } else if (i.key() == QStringLiteral("ActiveAccessPoint")) {
-            emit pathForPropertiesChanged(msg.path(), map);
-        } else if (i.key() == QStringLiteral("ActiveConnections")) {
-            emit pathForPropertiesChanged(msg.path(), map);
-        } else if (i.key() == QStringLiteral("AvailableConnections")) {
-            const QDBusArgument &dbusArgs = i.value().value<QDBusArgument>();
-            QDBusObjectPath path;
-            QStringList paths;
-            dbusArgs.beginArray();
-            while (!dbusArgs.atEnd()) {
-                dbusArgs >> path;
-                paths << path.path();
-            }
-            dbusArgs.endArray();
-            emit pathForConnectionsChanged(paths);
-        }
-    }
-}
-
-void QNmDBusHelper::slotSettingsRemoved()
-{
-    QDBusMessage msg = this->message();
-    emit pathForSettingsRemoved(msg.path());
-}
-
-void QNmDBusHelper::activeConnectionPropertiesChanged(QMap<QString,QVariant> map)
-{
-    QDBusMessage msg = this->message();
-    QMapIterator<QString, QVariant> i(map);
-    while (i.hasNext()) {
-        i.next();
-        if (i.key() == QStringLiteral("State")) {
-            quint32 state = i.value().toUInt();
-            if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED
-                || state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
-                emit pathForPropertiesChanged(msg.path(), map);
-            }
-        }
-    }
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/networkmanager/qnmdbushelper.h b/src/plugins/bearer/networkmanager/qnmdbushelper.h
deleted file mode 100644
index e224af87f1d304ae92390af5fac3438e6ee7b221..0000000000000000000000000000000000000000
--- a/src/plugins/bearer/networkmanager/qnmdbushelper.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNMDBUSHELPERPRIVATE_H
-#define QNMDBUSHELPERPRIVATE_H
-
-#include <QDBusObjectPath>
-#include <QDBusContext>
-#include <QMap>
-
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-class QNmDBusHelper: public QObject, protected QDBusContext
- {
-     Q_OBJECT
- public:
-    QNmDBusHelper(QObject *parent = 0);
-    ~QNmDBusHelper();
-
- public slots:
-    void deviceStateChanged(quint32);
-    void slotAccessPointAdded(QDBusObjectPath);
-    void slotAccessPointRemoved(QDBusObjectPath);
-    void slotPropertiesChanged(QMap<QString,QVariant>);
-    void slotSettingsRemoved();
-    void activeConnectionPropertiesChanged(QMap<QString,QVariant>);
-
-Q_SIGNALS:
-    void pathForStateChanged(const QString &, quint32);
-    void pathForAccessPointAdded(const QString &);
-    void pathForAccessPointRemoved(const QString &);
-    void pathForPropertiesChanged(const QString &, QMap<QString,QVariant>);
-    void pathForSettingsRemoved(const QString &);
-    void pathForConnectionsChanged(const QStringList &pathsList);
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
-
-#endif// QNMDBUSHELPERPRIVATE_H
diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp
index 1db59fec94ab7ebcaa93edbb0e0bc0fc00db2d5c..c5adc98af7bc70f73b88fef1bb0195274be45dad 100644
--- a/src/plugins/bearer/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/qnetworksession_impl.cpp
@@ -366,7 +366,8 @@ void QNetworkSessionPrivateImpl::networkConfigurationsChanged()
     else
         updateStateFromActiveConfig();
 
-    startTime = engine->startTime(activeConfig.identifier());
+    if (engine)
+        startTime = engine->startTime(activeConfig.identifier());
 }
 
 void QNetworkSessionPrivateImpl::configurationChanged(QNetworkConfigurationPrivatePointer config)
diff --git a/src/plugins/platforminputcontexts/ibus/qibustypes.cpp b/src/plugins/platforminputcontexts/ibus/qibustypes.cpp
index 9bc53ed5c001455426a4493c2fd29f1a846c202e..ec8c746b2d4bb68a7e732f2ad8425c221ab889da 100644
--- a/src/plugins/platforminputcontexts/ibus/qibustypes.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibustypes.cpp
@@ -32,7 +32,6 @@
 ****************************************************************************/
 
 #include "qibustypes.h"
-#include <qtextformat.h>
 #include <QtDBus>
 #include <QHash>
 
@@ -134,7 +133,7 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusAttribute &a
     return argument;
 }
 
-QTextFormat QIBusAttribute::format() const
+QTextCharFormat QIBusAttribute::format() const
 {
     QTextCharFormat fmt;
     switch (type) {
@@ -225,11 +224,32 @@ const QDBusArgument &operator>>(const QDBusArgument &arg, QIBusAttributeList &at
 
 QList<QInputMethodEvent::Attribute> QIBusAttributeList::imAttributes() const
 {
+    QHash<QPair<int, int>, QTextCharFormat> rangeAttrs;
+
+    // Merge text fomats for identical ranges into a single QTextFormat.
+    for (int i = 0; i < attributes.size(); ++i) {
+        const QIBusAttribute &attr = attributes.at(i);
+        const QTextCharFormat &format = attr.format();
+
+        if (format.isValid()) {
+            const QPair<int, int> range(attr.start, attr.end);
+            rangeAttrs[range].merge(format);
+        }
+    }
+
+    // Assemble list in original attribute order.
     QList<QInputMethodEvent::Attribute> imAttrs;
+
     for (int i = 0; i < attributes.size(); ++i) {
         const QIBusAttribute &attr = attributes.at(i);
-        imAttrs += QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, attr.start, attr.end - attr.start, attr.format());
+        const QTextFormat &format = attr.format();
+
+        imAttrs += QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat,
+            attr.start,
+            attr.end - attr.start,
+            format.isValid() ? rangeAttrs[QPair<int, int>(attr.start, attr.end)] : format);
     }
+
     return imAttrs;
 }
 
diff --git a/src/plugins/platforminputcontexts/ibus/qibustypes.h b/src/plugins/platforminputcontexts/ibus/qibustypes.h
index 2ec3b019ff2430b6c56379d70cf6fc55fa2fe4b5..96791b17a18244a7ace74d10f1edd579c3a70236 100644
--- a/src/plugins/platforminputcontexts/ibus/qibustypes.h
+++ b/src/plugins/platforminputcontexts/ibus/qibustypes.h
@@ -36,6 +36,7 @@
 #include <qvector.h>
 #include <qevent.h>
 #include <QDBusArgument>
+#include <QTextCharFormat>
 
 QT_BEGIN_NAMESPACE
 
@@ -70,7 +71,7 @@ public:
     QIBusAttribute();
     ~QIBusAttribute();
 
-    QTextFormat format() const;
+    QTextCharFormat format() const;
 
     Type type;
     quint32 value;
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index a43cf73d3484675f7633c0aa9c3956134a8c4269..b232c7a4d340f0e6fdba5eb042e3e51bfbb28049 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -268,6 +268,7 @@ public: // for QNSView
 
     bool m_inConstructor;
     bool m_inSetVisible;
+    bool m_inSetGeometry;
 #ifndef QT_NO_OPENGL
     QCocoaGLContext *m_glContext;
 #endif
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index f536e20b39a157ec513a31d74ddcd65004afd6d0..6656212457c7224fdd257da0f99225c399344176 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -381,6 +381,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
     , m_windowUnderMouse(false)
     , m_inConstructor(true)
     , m_inSetVisible(false)
+    , m_inSetGeometry(false)
 #ifndef QT_NO_OPENGL
     , m_glContext(0)
 #endif
@@ -470,6 +471,8 @@ QSurfaceFormat QCocoaWindow::format() const
 
 void QCocoaWindow::setGeometry(const QRect &rectIn)
 {
+    QBoolBlocker inSetGeometry(m_inSetGeometry, true);
+
     QRect rect = rectIn;
     // This means it is a call from QWindow::setFramePosition() and
     // the coordinates include the frame (size is still the contents rectangle).
@@ -1754,6 +1757,11 @@ void QCocoaWindow::updateExposedGeometry()
     if (!m_geometryUpdateExposeAllowed)
         return;
 
+    // Do not send incorrect exposes in case the window is not even visible yet.
+    // We might get here as a result of a resize() from QWidget's show(), for instance.
+    if (!window()->isVisible())
+        return;
+
     if (!isWindowExposable())
         return;
 
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index fa85a2bf54ab43213b77c153865261af7f53aba8..699340795debd1b951f39780b14efcde5f17f267 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -361,12 +361,11 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
     // Send a geometry change event to Qt, if it's ready to handle events
     if (!m_platformWindow->m_inConstructor) {
         QWindowSystemInterface::handleGeometryChange(m_window, geometry);
-        // Do not send incorrect exposes in case the window is not even visible yet.
-        // We might get here as a result of a resize() from QWidget's show(), for instance.
-        if (m_platformWindow->window()->isVisible()) {
-            m_platformWindow->updateExposedGeometry();
+        m_platformWindow->updateExposedGeometry();
+        // Guard against processing window system events during QWindow::setGeometry
+        // calles, which Qt and Qt applications do not excpect.
+        if (!m_platformWindow->m_inSetGeometry)
             QWindowSystemInterface::flushWindowSystemEvents();
-        }
     }
 }
 
@@ -603,7 +602,8 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
 {
     if (m_window->flags() & Qt::WindowTransparentForInput)
         return NO;
-    QWindowSystemInterface::handleWindowActivated([self topLevelWindow]);
+    if (!m_platformWindow->windowIsPopupType())
+        QWindowSystemInterface::handleWindowActivated([self topLevelWindow]);
     return YES;
 }
 
@@ -662,6 +662,19 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
     m_frameStrutButtons = Qt::NoButton;
 }
 
+- (NSPoint) screenMousePoint:(NSEvent *)theEvent
+{
+    NSPoint screenPoint;
+    if (theEvent) {
+        NSPoint windowPoint = [theEvent locationInWindow];
+        NSRect screenRect = [[theEvent window] convertRectToScreen:NSMakeRect(windowPoint.x, windowPoint.y, 1, 1)];
+        screenPoint = screenRect.origin;
+    } else {
+        screenPoint = [NSEvent mouseLocation];
+    }
+    return screenPoint;
+}
+
 - (void)handleMouseEvent:(NSEvent *)theEvent
 {
     [self handleTabletEvent: theEvent];
@@ -676,23 +689,7 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
             m_platformWindow->m_forwardWindow = 0;
     }
 
-    NSPoint globalPos = [NSEvent mouseLocation];
-
-    if ([self.window parentWindow]
-        && (theEvent.type == NSLeftMouseDragged || theEvent.type == NSLeftMouseUp)) {
-        // QToolBar can be implemented as a child window on top of its main window
-        // (with a borderless NSWindow). If an option "unified toolbar" set on the main window,
-        // it's possible to drag such a window using this toolbar.
-        // While handling mouse drag events, QToolBar moves the window (QWidget::move).
-        // In such a combination [NSEvent mouseLocation] is very different from the
-        // real event location and as a result a window will move chaotically.
-        NSPoint winPoint = [theEvent locationInWindow];
-        NSRect tmpRect = NSMakeRect(winPoint.x, winPoint.y, 1., 1.);
-        tmpRect = [[theEvent window] convertRectToScreen:tmpRect];
-        globalPos = tmpRect.origin;
-    }
-
-    [targetView convertFromScreen:globalPos toWindowPoint:&qtWindowPoint andScreenPoint:&qtScreenPoint];
+    [targetView convertFromScreen:[self screenMousePoint:theEvent] toWindowPoint:&qtWindowPoint andScreenPoint:&qtScreenPoint];
     ulong timestamp = [theEvent timestamp] * 1000;
 
     QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
@@ -865,7 +862,7 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
 
     QPointF windowPoint;
     QPointF screenPoint;
-    [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint];
+    [self convertFromScreen:[self screenMousePoint:theEvent] toWindowPoint:&windowPoint andScreenPoint:&screenPoint];
     QWindow *childWindow = m_platformWindow->childWindowAt(windowPoint.toPoint());
 
     // Top-level windows generate enter-leave events for sub-windows.
diff --git a/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp b/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp
index b6b1be9244255dea7090d0068afe61870bde4a28..26d77a2abb3c026fef0c9e4ea31bed8b5f689fc4 100644
--- a/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp
+++ b/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp
@@ -63,11 +63,13 @@ QByteArray QEglFSHooks::fbDeviceName() const
 int QEglFSHooks::framebufferIndex() const
 {
     int fbIndex = 0;
+#ifndef QT_NO_REGULAREXPRESSION
     QRegularExpression fbIndexRx(QLatin1String("fb(\\d+)"));
     QRegularExpressionMatch match = fbIndexRx.match(fbDeviceName());
     if (match.hasMatch())
         fbIndex = match.captured(1).toInt();
 
+#endif
     return fbIndex;
 }
 
diff --git a/src/plugins/platforms/ios/qioseventdispatcher.mm b/src/plugins/platforms/ios/qioseventdispatcher.mm
index 66fd9cd1e5209e7d1c6bae9389de5b0db2114831..ffffc4cbc446d8040627e76d1cdba1dab2796fc5 100644
--- a/src/plugins/platforms/ios/qioseventdispatcher.mm
+++ b/src/plugins/platforms/ios/qioseventdispatcher.mm
@@ -317,11 +317,16 @@ static bool rootLevelRunLoopIntegration()
 }
 
 #if defined(Q_PROCESSOR_X86)
-#  define SET_STACK_POINTER "mov %0, %%esp"
 #  define FUNCTION_CALL_ALIGNMENT 16
+#  if defined(Q_PROCESSOR_X86_32)
+#    define SET_STACK_POINTER "mov %0, %%esp"
+#  elif defined(Q_PROCESSOR_X86_64)
+#    define SET_STACK_POINTER "movq %0, %%rsp"
+#  endif
 #elif defined(Q_PROCESSOR_ARM)
-#  define SET_STACK_POINTER "mov sp, %0"
+#  // Valid for both 32 and 64-bit ARM
 #  define FUNCTION_CALL_ALIGNMENT 4
+#  define SET_STACK_POINTER "mov sp, %0"
 #else
 #  error "Unknown processor family"
 #endif
diff --git a/src/plugins/platforms/ios/qiosglobal.h b/src/plugins/platforms/ios/qiosglobal.h
index dbedba7e85a2c4dc8ae1f72404e6ddb388d6ee40..f7b9cd7015712df89a9c39a81245249c274f16e1 100644
--- a/src/plugins/platforms/ios/qiosglobal.h
+++ b/src/plugins/platforms/ios/qiosglobal.h
@@ -62,7 +62,7 @@ QPointF fromCGPoint(const CGPoint &point);
 
 Qt::ScreenOrientation toQtScreenOrientation(UIDeviceOrientation uiDeviceOrientation);
 UIDeviceOrientation fromQtScreenOrientation(Qt::ScreenOrientation qtOrientation);
-QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen);
+
 int infoPlistValue(NSString* key, int defaultValue);
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm
index 71d5a5808859deaf02e3a6807c4cd20f5c1611d7..9f10c3e2876deab3834f3e8de86d6cb6c04b272f 100644
--- a/src/plugins/platforms/ios/qiosglobal.mm
+++ b/src/plugins/platforms/ios/qiosglobal.mm
@@ -127,15 +127,6 @@ UIDeviceOrientation fromQtScreenOrientation(Qt::ScreenOrientation qtOrientation)
     return uiOrientation;
 }
 
-QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen)
-{
-    // UIScreen is always in portrait. Use this function to convert CGRects
-    // aligned with UIScreen into whatever is the current orientation of QScreen.
-    QRect geometry = screen->geometry();
-    return geometry.width() < geometry.height() ? rect
-        : QRect(rect.y(), geometry.height() - rect.width() - rect.x(), rect.height(), rect.width());
-}
-
 int infoPlistValue(NSString* key, int defaultValue)
 {
     static NSBundle *bundle = [NSBundle mainBundle];
diff --git a/src/plugins/platforms/ios/qiosinputcontext.h b/src/plugins/platforms/ios/qiosinputcontext.h
index 5791367d84ae21a70897e76750c7f92e770f7527..1f1130f932d123948ca9d258898c856888f117b1 100644
--- a/src/plugins/platforms/ios/qiosinputcontext.h
+++ b/src/plugins/platforms/ios/qiosinputcontext.h
@@ -51,9 +51,10 @@ QT_BEGIN_NAMESPACE
 
 struct ImeState
 {
-    ImeState() : currentState(0) {}
+    ImeState() : currentState(0), focusObject(0) {}
     Qt::InputMethodQueries update(Qt::InputMethodQueries properties);
     QInputMethodQueryEvent currentState;
+    QObject *focusObject;
 };
 
 class QIOSInputContext : public QPlatformInputContext
@@ -82,6 +83,7 @@ public:
     void commit();
 
     const ImeState &imeState() { return m_imeState; };
+    bool inputMethodAccepted() const;
 
     bool isReloadingInputViewsFromUpdate() const { return m_isReloadingInputViewsFromUpdate; }
 
diff --git a/src/plugins/platforms/ios/qiosinputcontext.mm b/src/plugins/platforms/ios/qiosinputcontext.mm
index c038628fd9c907a2d23be058d8980c495c9e88aa..072a49c7c57cf741726380fb105828ecc1f25fcc 100644
--- a/src/plugins/platforms/ios/qiosinputcontext.mm
+++ b/src/plugins/platforms/ios/qiosinputcontext.mm
@@ -46,25 +46,28 @@
 #include "qiosglobal.h"
 #include "qiosintegration.h"
 #include "qiostextresponder.h"
+#include "qiosviewcontroller.h"
 #include "qioswindow.h"
 #include "quiview.h"
 
 #include <QGuiApplication>
 #include <QtGui/private/qwindow_p.h>
 
+// -------------------------------------------------------------------------
+
 static QUIView *focusView()
 {
     return qApp->focusWindow() ?
         reinterpret_cast<QUIView *>(qApp->focusWindow()->winId()) : 0;
 }
 
-@interface QIOSKeyboardListener : UIGestureRecognizer {
+// -------------------------------------------------------------------------
+
+@interface QIOSKeyboardListener : UIGestureRecognizer <UIGestureRecognizerDelegate> {
 @public
     QIOSInputContext *m_context;
     BOOL m_keyboardVisible;
     BOOL m_keyboardVisibleAndDocked;
-    BOOL m_touchPressWhileKeyboardVisible;
-    BOOL m_keyboardHiddenByGesture;
     QRectF m_keyboardRect;
     CGRect m_keyboardEndRect;
     NSTimeInterval m_duration;
@@ -77,13 +80,11 @@ static QUIView *focusView()
 
 - (id)initWithQIOSInputContext:(QIOSInputContext *)context
 {
-    self = [super initWithTarget:self action:@selector(gestureTriggered)];
+    self = [super initWithTarget:self action:@selector(gestureStateChanged:)];
     if (self) {
         m_context = context;
         m_keyboardVisible = NO;
         m_keyboardVisibleAndDocked = NO;
-        m_touchPressWhileKeyboardVisible = NO;
-        m_keyboardHiddenByGesture = NO;
         m_duration = 0;
         m_curve = UIViewAnimationCurveEaseOut;
         m_viewController = 0;
@@ -99,10 +100,9 @@ static QUIView *focusView()
             Q_ASSERT(m_viewController);
 
             // Attach 'hide keyboard' gesture to the window, but keep it disabled when the
-            // keyboard is not visible. Note that we never trigger the gesture the way it is intended
-            // since we don't want to cancel touch events and interrupt flicking etc. Instead we use
-            // the gesture framework more as an event filter and hide the keyboard silently.
+            // keyboard is not visible.
             self.enabled = NO;
+            self.cancelsTouchesInView = NO;
             self.delaysTouchesEnded = NO;
             [m_viewController.view.window addGestureRecognizer:self];
         }
@@ -156,11 +156,19 @@ static QUIView *focusView()
     // Note that UIKeyboardWillShowNotification is only sendt when the keyboard is docked.
     m_keyboardVisibleAndDocked = YES;
     m_keyboardEndRect = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
-    self.enabled = YES;
+
     if (!m_duration) {
         m_duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
         m_curve = UIViewAnimationCurve([[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]);
     }
+
+    UIResponder *firstResponder = [UIResponder currentFirstResponder];
+    if (![firstResponder isKindOfClass:[QIOSTextInputResponder class]])
+        return;
+
+    // Enable hide-keyboard gesture
+    self.enabled = YES;
+
     m_context->scrollToCursor();
 }
 
@@ -169,7 +177,7 @@ static QUIView *focusView()
     // Note that UIKeyboardWillHideNotification is also sendt when the keyboard is undocked.
     m_keyboardVisibleAndDocked = NO;
     m_keyboardEndRect = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
-    if (!m_keyboardHiddenByGesture) {
+    if (self.state != UIGestureRecognizerStateBegan) {
         // Only disable the gesture if the hiding of the keyboard was not caused by it.
         // Otherwise we need to await the final touchEnd callback for doing some clean-up.
         self.enabled = NO;
@@ -202,54 +210,81 @@ static QUIView *focusView()
     }
 }
 
-- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
+// -------------------------------------------------------------------------
+
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
-    CGPoint p = [[touches anyObject] locationInView:m_viewController.view.window];
-    if (CGRectContainsPoint(m_keyboardEndRect, p)) {
-        m_keyboardHiddenByGesture = YES;
+    [super touchesBegan:touches withEvent:event];
 
-        UIResponder *firstResponder = [UIResponder currentFirstResponder];
-        Q_ASSERT([firstResponder isKindOfClass:[QIOSTextInputResponder class]]);
-        [firstResponder resignFirstResponder];
-    }
+    Q_ASSERT(m_keyboardVisibleAndDocked);
 
-    [super touchesMoved:touches withEvent:event];
+    if ([touches count] != 1)
+        self.state = UIGestureRecognizerStateFailed;
 }
 
-- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
 {
-    Q_ASSERT(m_keyboardVisibleAndDocked);
-    m_touchPressWhileKeyboardVisible = YES;
-    [super touchesBegan:touches withEvent:event];
+    [super touchesMoved:touches withEvent:event];
+
+    if (self.state != UIGestureRecognizerStatePossible)
+        return;
+
+    CGPoint touchPoint = [[touches anyObject] locationInView:m_viewController.view.window];
+    if (CGRectContainsPoint(m_keyboardEndRect, touchPoint))
+        self.state = UIGestureRecognizerStateBegan;
 }
 
 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
 {
-    m_touchPressWhileKeyboardVisible = NO;
-    [self performSelectorOnMainThread:@selector(touchesEndedPostDelivery) withObject:nil waitUntilDone:NO];
     [super touchesEnded:touches withEvent:event];
+
+    [self touchesEndedOrCancelled];
 }
 
 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
 {
-    m_touchPressWhileKeyboardVisible = NO;
-    [self performSelectorOnMainThread:@selector(touchesEndedPostDelivery) withObject:nil waitUntilDone:NO];
     [super touchesCancelled:touches withEvent:event];
+
+    [self touchesEndedOrCancelled];
+}
+
+- (void)touchesEndedOrCancelled
+{
+    // Defer final state change until next runloop iteration, so that Qt
+    // has a chance to process the final touch events first, before we eg.
+    // scroll the view.
+    dispatch_async(dispatch_get_main_queue (), ^{
+        // iOS will transition from began to changed by itself
+        Q_ASSERT(self.state != UIGestureRecognizerStateBegan);
+
+        if (self.state == UIGestureRecognizerStateChanged)
+            self.state = UIGestureRecognizerStateEnded;
+        else
+            self.state = UIGestureRecognizerStateFailed;
+    });
 }
 
-- (void)touchesEndedPostDelivery
+- (void)gestureStateChanged:(id)sender
 {
-    // Do some clean-up _after_ touchEnd has been delivered to QUIView
-    m_keyboardHiddenByGesture = NO;
+    Q_UNUSED(sender);
+
+    if (self.state == UIGestureRecognizerStateBegan) {
+        qImDebug() << "hide keyboard gesture was triggered";
+        UIResponder *firstResponder = [UIResponder currentFirstResponder];
+        Q_ASSERT([firstResponder isKindOfClass:[QIOSTextInputResponder class]]);
+        [firstResponder resignFirstResponder];
+    }
+}
+
+- (void)reset
+{
+    [super reset];
+
     if (!m_keyboardVisibleAndDocked) {
+        qImDebug() << "keyboard was hidden, disabling hide-keyboard gesture";
         self.enabled = NO;
-        if (qApp->focusObject()) {
-            // UI Controls are told to gain focus on touch release. So when the 'hide keyboard' gesture
-            // finishes, the final touch end can trigger a control to gain focus. This is in conflict with
-            // the gesture, so we clear focus once more as a work-around.
-            static_cast<QWindowPrivate *>(QObjectPrivate::get(qApp->focusWindow()))->clearFocusObject();
-        }
     } else {
+        qImDebug() << "gesture completed without triggering, scrolling view to cursor";
         m_context->scrollToCursor();
     }
 }
@@ -265,8 +300,11 @@ Qt::InputMethodQueries ImeState::update(Qt::InputMethodQueries properties)
 
     QInputMethodQueryEvent newState(properties);
 
-    if (qApp && qApp->focusObject())
-        QCoreApplication::sendEvent(qApp->focusObject(), &newState);
+    // Update the focus object that the new state is based on
+    focusObject = qApp ? qApp->focusObject() : 0;
+
+    if (focusObject)
+        QCoreApplication::sendEvent(focusObject, &newState);
 
     Qt::InputMethodQueries updatedProperties;
     for (uint i = 0; i < (sizeof(Qt::ImQueryAll) * CHAR_BIT); ++i) {
@@ -313,11 +351,23 @@ QRectF QIOSInputContext::keyboardRect() const
 void QIOSInputContext::showInputPanel()
 {
     // No-op, keyboard controlled fully by platform based on focus
+    qImDebug() << "can't show virtual keyboard without a focus object, ignoring";
 }
 
 void QIOSInputContext::hideInputPanel()
 {
-    // No-op, keyboard controlled fully by platform based on focus
+    if (![m_textResponder isFirstResponder]) {
+        qImDebug() << "QIOSTextInputResponder is not first responder, ignoring";
+        return;
+    }
+
+    if (qGuiApp->focusObject() != m_imeState.focusObject) {
+        qImDebug() << "current focus object does not match IM state, likely hiding from focusOut event, so ignoring";
+        return;
+    }
+
+    qImDebug() << "hiding VKB as requested by QInputMethod::hide()";
+    [m_textResponder resignFirstResponder];
 }
 
 void QIOSInputContext::clearCurrentFocusObject()
@@ -353,10 +403,10 @@ void QIOSInputContext::scrollToCursor()
     if (!isQtApplication())
         return;
 
-    if (m_keyboardListener->m_touchPressWhileKeyboardVisible) {
-        // Don't scroll to the cursor if the user is touching the screen. This
-        // interferes with selection and the 'hide keyboard' gesture. Instead
-        // we update scrolling upon touchEnd.
+    if (m_keyboardListener.state == UIGestureRecognizerStatePossible && m_keyboardListener.numberOfTouches == 1) {
+        // Don't scroll to the cursor if the user is touching the screen and possibly
+        // trying to trigger the hide-keyboard gesture.
+        qImDebug() << "preventing scrolling to cursor as we're still waiting for a possible gesture";
         return;
     }
 
@@ -426,6 +476,18 @@ void QIOSInputContext::setFocusObject(QObject *focusObject)
 {
     Q_UNUSED(focusObject);
 
+    qImDebug() << "new focus object =" << focusObject;
+
+    if (m_keyboardListener.state == UIGestureRecognizerStateChanged) {
+        // A new focus object may be set as part of delivering touch events to
+        // application during the hide-keyboard gesture, but we don't want that
+        // to result in a new object getting focus and bringing the keyboard up
+        // again.
+        qImDebug() << "clearing focus object" << focusObject << "as hide-keyboard gesture is active";
+        clearCurrentFocusObject();
+        return;
+    }
+
     reset();
 
     if (m_keyboardListener->m_keyboardVisibleAndDocked)
@@ -436,6 +498,8 @@ void QIOSInputContext::focusWindowChanged(QWindow *focusWindow)
 {
     Q_UNUSED(focusWindow);
 
+    qImDebug() << "new focus window =" << focusWindow;
+
     reset();
 
     [m_keyboardListener handleKeyboardRectChanged];
@@ -486,6 +550,26 @@ void QIOSInputContext::update(Qt::InputMethodQueries updatedProperties)
     }
 }
 
+bool QIOSInputContext::inputMethodAccepted() const
+{
+    // The IM enablement state is based on the last call to update()
+    bool lastKnownImEnablementState = m_imeState.currentState.value(Qt::ImEnabled).toBool();
+
+#if !defined(QT_NO_DEBUG)
+    // QPlatformInputContext keeps a cached value of the current IM enablement state that is
+    // updated by QGuiApplication when the current focus object changes, or by QInputMethod's
+    // update() function. If the focus object changes, but the change is not propagated as
+    // a signal to QGuiApplication due to bugs in the widget/graphicsview/qml stack, we'll
+    // end up with a stale value for QPlatformInputContext::inputMethodAccepted(). To be on
+    // the safe side we always use our own cached value to decide if IM is enabled, and try
+    // to detect the case where the two values are out of sync.
+    if (lastKnownImEnablementState != QPlatformInputContext::inputMethodAccepted())
+        qWarning("QPlatformInputContext::inputMethodAccepted() does not match actual focus object IM enablement!");
+#endif
+
+    return lastKnownImEnablementState;
+}
+
 /*!
     Called by the input item to reset the input method state.
 */
diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
index 4cbead44c5132e85fdc1f080e8c7d864ef0a4536..f1f472b3e26cf1ee29aa907bbf15abdd368389ba 100644
--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
+++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
@@ -1224,16 +1224,21 @@ void QWindowsNativeFileDialogBase::setNameFilters(const QStringList &filters)
     QScopedArrayPointer<WCHAR> buffer(new WCHAR[totalStringLength + 2 * size]);
     QScopedArrayPointer<COMDLG_FILTERSPEC> comFilterSpec(new COMDLG_FILTERSPEC[size]);
 
-    const QString matchesAll = QStringLiteral(" (*)");
     WCHAR *ptr = buffer.data();
     // Split filter specification as 'Texts (*.txt[;] *.doc)'
     // into description and filters specification as '*.txt;*.doc'
 
     for (int i = 0; i < size; ++i) {
-        // Display glitch (CLSID only): 'All files (*)' shows up as 'All files (*) (*)'
+        // Display glitch (CLSID only): Any filter not filtering on suffix (such as
+        // '*', 'a.*') will be duplicated in combo: 'All files (*) (*)',
+        // 'AAA files (a.*) (a.*)'
         QString description = specs[i].description;
-        if (!m_hideFiltersDetails && description.endsWith(matchesAll))
-            description.truncate(description.size() - matchesAll.size());
+        const QString &filter = specs[i].filter;
+        if (!m_hideFiltersDetails && !filter.startsWith(QLatin1String("*."))) {
+            const int pos = description.lastIndexOf(QLatin1Char('('));
+            if (pos > 0)
+                description.truncate(pos);
+        }
         // Add to buffer.
         comFilterSpec[i].pszName = ptr;
         ptr += description.toWCharArray(ptr);
diff --git a/src/plugins/printsupport/cups/qppdprintdevice.cpp b/src/plugins/printsupport/cups/qppdprintdevice.cpp
index 7a6acf8b78c170fcc4170690ebf3b8d385ff5e11..d20fbb558b814d716fabcb31eb7a1589dfd737d8 100644
--- a/src/plugins/printsupport/cups/qppdprintdevice.cpp
+++ b/src/plugins/printsupport/cups/qppdprintdevice.cpp
@@ -470,9 +470,10 @@ void QPpdPrintDevice::loadPrinter()
     m_cupsDest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, m_cupsName, m_cupsInstance);
     if (m_cupsDest) {
         const char *ppdFile = cupsGetPPD(m_cupsName);
-        if (ppdFile)
+        if (ppdFile) {
             m_ppd = ppdOpenFile(ppdFile);
-        unlink(ppdFile);
+            unlink(ppdFile);
+        }
         if (m_ppd) {
             ppdMarkDefaults(m_ppd);
         } else {
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index dd032e46f692189b9eee93ba34d50b74e7f2dfbd..6c5e772e8c5d9495f16c7c7512cddff903637ff5 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -493,7 +493,7 @@ void Generator::generateCode()
         for (int i = 0; i < extraList.count(); ++i) {
             fprintf(out, "    &%s::staticMetaObject,\n", extraList.at(i).constData());
         }
-        fprintf(out, "    0\n};\n\n");
+        fprintf(out, "    Q_NULLPTR\n};\n\n");
     }
 
 //
@@ -505,24 +505,24 @@ void Generator::generateCode()
         fprintf(out, "const QMetaObject %s::staticMetaObject = {\n", cdef->qualified.constData());
 
     if (isQObject)
-        fprintf(out, "    { 0, ");
+        fprintf(out, "    { Q_NULLPTR, ");
     else if (cdef->superclassList.size())
         fprintf(out, "    { &%s::staticMetaObject, ", purestSuperClass.constData());
     else
-        fprintf(out, "    { 0, ");
+        fprintf(out, "    { Q_NULLPTR, ");
     fprintf(out, "qt_meta_stringdata_%s.data,\n"
             "      qt_meta_data_%s, ", qualifiedClassNameIdentifier.constData(),
             qualifiedClassNameIdentifier.constData());
     if (cdef->hasQObject && !isQt)
         fprintf(out, " qt_static_metacall, ");
     else
-        fprintf(out, " 0, ");
+        fprintf(out, " Q_NULLPTR, ");
 
     if (extraList.isEmpty())
-        fprintf(out, "0, ");
+        fprintf(out, "Q_NULLPTR, ");
     else
         fprintf(out, "qt_meta_extradata_%s, ", qualifiedClassNameIdentifier.constData());
-    fprintf(out, "0}\n};\n\n");
+    fprintf(out, "Q_NULLPTR}\n};\n\n");
 
     if(isQt)
         return;
@@ -537,7 +537,7 @@ void Generator::generateCode()
 // Generate smart cast function
 //
     fprintf(out, "\nvoid *%s::qt_metacast(const char *_clname)\n{\n", cdef->qualified.constData());
-    fprintf(out, "    if (!_clname) return 0;\n");
+    fprintf(out, "    if (!_clname) return Q_NULLPTR;\n");
     fprintf(out, "    if (!strcmp(_clname, qt_meta_stringdata_%s.stringdata))\n"
                   "        return static_cast<void*>(const_cast< %s*>(this));\n",
             qualifiedClassNameIdentifier.constData(), cdef->classname.constData());
@@ -562,7 +562,7 @@ void Generator::generateCode()
         QByteArray superClass = purestSuperClass;
         fprintf(out, "    return %s::qt_metacast(_clname);\n", superClass.constData());
     } else {
-        fprintf(out, "    return 0;\n");
+        fprintf(out, "    return Q_NULLPTR;\n");
     }
     fprintf(out, "}\n");
 
@@ -1416,7 +1416,7 @@ void Generator::generateSignal(FunctionDef *def,int index)
             fprintf(out, "QPrivateSignal");
 
         fprintf(out, ")%s\n{\n"
-                "    QMetaObject::activate(%s, &staticMetaObject, %d, 0);\n"
+                "    QMetaObject::activate(%s, &staticMetaObject, %d, Q_NULLPTR);\n"
                 "}\n", constQualifier, thisPtr.constData(), index);
         return;
     }
@@ -1446,7 +1446,7 @@ void Generator::generateSignal(FunctionDef *def,int index)
 
     fprintf(out, "    void *_a[] = { ");
     if (def->normalizedType == "void") {
-        fprintf(out, "0");
+        fprintf(out, "Q_NULLPTR");
     } else {
         if (def->returnTypeIsVolatile)
              fprintf(out, "const_cast<void*>(reinterpret_cast<const volatile void*>(&_t0))");
diff --git a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp
index ea24c35a071557796c6fb24d96a49f6c455f76d0..dc735df29783bd151422037e7b355058828cc4fc 100644
--- a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp
+++ b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp
@@ -243,6 +243,8 @@ static QString generateInterfaceXml(const ClassDef *mo)
         foreach (const FunctionDef &mm, mo->signalList) {
             if (mm.wasCloned)
                 continue;
+            if (!mm.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSignals))
+                continue;
 
             retval += addFunction(mm, true);
         }
@@ -250,10 +252,14 @@ static QString generateInterfaceXml(const ClassDef *mo)
 
     if (flags & (QDBusConnection::ExportScriptableSlots | QDBusConnection::ExportNonScriptableSlots)) {
         foreach (const FunctionDef &slot, mo->slotList) {
+            if (!slot.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSlots))
+                continue;
             if (slot.access == FunctionDef::Public)
               retval += addFunction(slot);
         }
         foreach (const FunctionDef &method, mo->methodList) {
+            if (!method.isScriptable && !(flags & QDBusConnection::ExportNonScriptableSlots))
+                continue;
             if (method.access == FunctionDef::Public)
               retval += addFunction(method);
         }
diff --git a/src/tools/qdoc/doc/images/qt-logo.png b/src/tools/qdoc/doc/images/qt-logo.png
index 14ddf2a0289e64c686b34712b8754bc4baac2726..6b72d5fb72c2cdb1f4e101eb244e1aada05277f6 100644
Binary files a/src/tools/qdoc/doc/images/qt-logo.png and b/src/tools/qdoc/doc/images/qt-logo.png differ
diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp
index 32399f11c762f4fff6b46815b63a903551e2860b..5b8ccd9902d729f318d3e1c15b640edc4b588c8f 100644
--- a/src/tools/qdoc/htmlgenerator.cpp
+++ b/src/tools/qdoc/htmlgenerator.cpp
@@ -4301,8 +4301,6 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
         return;
     QString fileName = manifest +"-manifest.xml";
     QFile file(outputDir() + QLatin1Char('/') + fileName);
-    if (!file.open(QFile::WriteOnly | QFile::Text))
-        return ;
     bool demos = false;
     if (manifest == "demos")
         demos = true;
@@ -4323,7 +4321,7 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
         }
         ++i;
     }
-    if (!proceed)
+    if (!proceed || !file.open(QFile::WriteOnly | QFile::Text))
         return;
 
     QXmlStreamWriter writer(&file);
diff --git a/src/tools/qdoc/qmlparser/qqmljs.g b/src/tools/qdoc/qmlparser/qqmljs.g
index de4fec4d56865c3e0e565be01989dfeadf641f65..616e3b3166b25689fa74ff5ad1feb1afb5b9837e 100644
--- a/src/tools/qdoc/qmlparser/qqmljs.g
+++ b/src/tools/qdoc/qmlparser/qqmljs.g
@@ -1,21 +1,31 @@
 ----------------------------------------------------------------------------
 --
--- Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+-- Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
 -- Contact: http://www.qt-project.org/legal
 --
 -- This file is part of the QtQml module of the Qt Toolkit.
 --
--- $QT_BEGIN_LICENSE:LGPL-ONLY$
+-- $QT_BEGIN_LICENSE:LGPL21$
+-- Commercial License Usage
+-- Licensees holding valid commercial Qt licenses may use this file in
+-- accordance with the commercial license agreement provided with the
+-- Software or, alternatively, in accordance with the terms contained in
+-- a written agreement between you and Digia. For licensing terms and
+-- conditions see http://qt.digia.com/licensing. For further information
+-- use the contact form at http://qt.digia.com/contact-us.
+--
 -- GNU Lesser General Public License Usage
--- This file may be used under the terms of the GNU Lesser
--- General Public License version 2.1 as published by the Free Software
--- Foundation and appearing in the file LICENSE.LGPL included in the
--- packaging of this file.  Please review the following information to
--- ensure the GNU Lesser General Public License version 2.1 requirements
--- will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+-- Alternatively, this file may be used under the terms of the GNU Lesser
+-- General Public License version 2.1 or version 3 as published by the Free
+-- Software Foundation and appearing in the file LICENSE.LGPLv21 and
+-- LICENSE.LGPLv3 included in the packaging of this file. Please review the
+-- following information to ensure the GNU Lesser General Public License
+-- requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+-- http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 --
--- If you have questions regarding the use of this file, please contact
--- us via http://www.qt-project.org/.
+-- In addition, as a special exception, Digia gives you certain additional
+-- rights. These rights are described in the Digia Qt LGPL Exception
+-- version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 --
 -- $QT_END_LICENSE$
 --
@@ -89,41 +99,33 @@
 
 /./****************************************************************************
 **
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
 ** Contact: http://www.qt-project.org/legal
 **
 ** This file is part of the QtQml module of the Qt Toolkit.
 **
-** $QT_BEGIN_LICENSE:LGPL$
+** $QT_BEGIN_LICENSE:LGPL21$
 ** Commercial License Usage
 ** Licensees holding valid commercial Qt licenses may use this file in
 ** accordance with the commercial license agreement provided with the
 ** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.  For licensing terms and
-** conditions see http://qt.digia.com/licensing.  For further information
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
 ** use the contact form at http://qt.digia.com/contact-us.
 **
 ** GNU Lesser General Public License Usage
 ** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
 ** In addition, as a special exception, Digia gives you certain additional
-** rights.  These rights are described in the Digia Qt LGPL Exception
+** rights. These rights are described in the Digia Qt LGPL Exception
 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 **
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
@@ -142,41 +144,33 @@
 
 /:/****************************************************************************
 **
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
 ** Contact: http://www.qt-project.org/legal
 **
 ** This file is part of the QtQml module of the Qt Toolkit.
 **
-** $QT_BEGIN_LICENSE:LGPL$
+** $QT_BEGIN_LICENSE:LGPL21$
 ** Commercial License Usage
 ** Licensees holding valid commercial Qt licenses may use this file in
 ** accordance with the commercial license agreement provided with the
 ** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.  For licensing terms and
-** conditions see http://qt.digia.com/licensing.  For further information
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
 ** use the contact form at http://qt.digia.com/contact-us.
 **
 ** GNU Lesser General Public License Usage
 ** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
 ** In addition, as a special exception, Digia gives you certain additional
-** rights.  These rights are described in the Digia Qt LGPL Exception
+** rights. These rights are described in the Digia Qt LGPL Exception
 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 **
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
@@ -1090,6 +1084,31 @@ case $rule_number: {
 }   break;
 ./
 
+UiObjectMember: T_READONLY T_PROPERTY UiPropertyType JsIdentifier T_COLON UiQualifiedId UiObjectInitializer ;
+/.
+case $rule_number: {
+    AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4));
+    node->isReadonlyMember = true;
+    node->readonlyToken = loc(1);
+    node->propertyToken = loc(2);
+    node->typeToken = loc(3);
+    node->identifierToken = loc(4);
+    node->semicolonToken = loc(5); // insert a fake ';' before ':'
+
+    AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(4));
+    propertyName->identifierToken = loc(4);
+    propertyName->next = 0;
+
+    AST::UiObjectBinding *binding = new (pool) AST::UiObjectBinding(
+      propertyName, sym(6).UiQualifiedId, sym(7).UiObjectInitializer);
+    binding->colonToken = loc(5);
+
+    node->binding = binding;
+
+    sym(1).Node = node;
+}   break;
+./
+
 UiObjectMember: FunctionDeclaration ;
 /.
 case $rule_number: {
diff --git a/src/tools/qdoc/qmlparser/qqmljsgrammar.cpp b/src/tools/qdoc/qmlparser/qqmljsgrammar.cpp
index d3fb3f8d1f8793d2bbb759a55f1c416363c4c7b8..2600a5e14c8e8cd392b276049cf58b43e8a3b784 100644
--- a/src/tools/qdoc/qmlparser/qqmljsgrammar.cpp
+++ b/src/tools/qdoc/qmlparser/qqmljsgrammar.cpp
@@ -57,35 +57,35 @@ const short QQmlJSGrammar::lhs [] = {
   130, 130, 130, 130, 130, 130, 130, 111, 138, 138, 
   138, 139, 139, 140, 140, 111, 111, 111, 111, 111, 
   111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 
-  111, 111, 124, 124, 124, 124, 124, 124, 124, 143, 
+  111, 111, 111, 124, 124, 124, 124, 124, 124, 124, 
   143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 
-  143, 143, 143, 143, 143, 143, 143, 129, 145, 145, 
-  145, 145, 144, 144, 149, 149, 149, 147, 147, 150, 
-  150, 150, 150, 153, 153, 153, 153, 153, 153, 153, 
+  143, 143, 143, 143, 143, 143, 143, 143, 129, 145, 
+  145, 145, 145, 144, 144, 149, 149, 149, 147, 147, 
+  150, 150, 150, 150, 153, 153, 153, 153, 153, 153, 
   153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 
   153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 
-  153, 153, 153, 153, 154, 154, 120, 120, 120, 120, 
-  120, 157, 157, 158, 158, 158, 158, 156, 156, 159, 
-  159, 160, 160, 161, 161, 161, 162, 162, 162, 162, 
-  162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 
-  164, 164, 164, 165, 165, 165, 165, 166, 166, 166, 
-  166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 
-  168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 
-  170, 170, 171, 171, 172, 172, 173, 173, 174, 174, 
-  175, 175, 176, 176, 177, 177, 178, 178, 179, 179, 
-  180, 180, 181, 181, 148, 148, 182, 182, 183, 183, 
+  153, 153, 153, 153, 153, 154, 154, 120, 120, 120, 
+  120, 120, 157, 157, 158, 158, 158, 158, 156, 156, 
+  159, 159, 160, 160, 161, 161, 161, 162, 162, 162, 
+  162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 
+  163, 164, 164, 164, 165, 165, 165, 165, 166, 166, 
+  166, 166, 166, 166, 166, 167, 167, 167, 167, 167, 
+  167, 168, 168, 168, 168, 168, 169, 169, 169, 169, 
+  169, 170, 170, 171, 171, 172, 172, 173, 173, 174, 
+  174, 175, 175, 176, 176, 177, 177, 178, 178, 179, 
+  179, 180, 180, 181, 181, 148, 148, 182, 182, 183, 
   183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 
-  109, 109, 184, 184, 185, 185, 186, 186, 108, 108, 
+  183, 109, 109, 184, 184, 185, 185, 186, 186, 108, 
   108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 
-  108, 108, 108, 131, 195, 195, 194, 194, 142, 142, 
-  196, 196, 197, 197, 199, 199, 198, 200, 203, 201, 
-  201, 204, 202, 202, 132, 133, 133, 134, 134, 187, 
-  187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 
-  188, 189, 189, 189, 189, 190, 190, 135, 136, 205, 
-  205, 208, 208, 206, 206, 209, 207, 191, 192, 192, 
-  137, 137, 137, 210, 211, 193, 193, 212, 141, 155, 
-  155, 213, 213, 152, 152, 151, 151, 214, 112, 112, 
-  215, 215, 110, 110, 146, 146, 216};
+  108, 108, 108, 108, 131, 195, 195, 194, 194, 142, 
+  142, 196, 196, 197, 197, 199, 199, 198, 200, 203, 
+  201, 201, 204, 202, 202, 132, 133, 133, 134, 134, 
+  187, 187, 187, 187, 187, 187, 187, 187, 188, 188, 
+  188, 188, 189, 189, 189, 189, 190, 190, 135, 136, 
+  205, 205, 208, 208, 206, 206, 209, 207, 191, 192, 
+  192, 137, 137, 137, 210, 211, 193, 193, 212, 141, 
+  155, 155, 213, 213, 152, 152, 151, 151, 214, 112, 
+  112, 215, 215, 110, 110, 146, 146, 216};
 
 const short QQmlJSGrammar::rhs [] = {
   2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 
@@ -95,110 +95,110 @@ const short QQmlJSGrammar::rhs [] = {
   1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 
   1, 0, 1, 2, 4, 6, 6, 3, 3, 7, 
   7, 4, 4, 5, 5, 5, 6, 6, 10, 6, 
+  7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 
-  3, 3, 4, 5, 3, 4, 3, 1, 1, 2, 
-  3, 4, 1, 2, 3, 7, 8, 1, 3, 1, 
+  2, 3, 3, 4, 5, 3, 4, 3, 1, 1, 
+  2, 3, 4, 1, 2, 3, 7, 8, 1, 3, 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-  1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 
-  5, 1, 2, 4, 4, 4, 3, 0, 1, 1, 
-  3, 1, 1, 1, 2, 2, 1, 2, 2, 2, 
-  2, 2, 2, 2, 2, 2, 1, 3, 3, 3, 
-  1, 3, 3, 1, 3, 3, 3, 1, 3, 3, 
-  3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 
-  1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 
-  1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 
-  1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 
-  1, 5, 1, 5, 1, 3, 1, 3, 1, 1, 
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 
+  3, 5, 1, 2, 4, 4, 4, 3, 0, 1, 
+  1, 3, 1, 1, 1, 2, 2, 1, 2, 2, 
+  2, 2, 2, 2, 2, 2, 2, 1, 3, 3, 
+  3, 1, 3, 3, 1, 3, 3, 3, 1, 3, 
+  3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 
+  3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 
+  3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 
+  3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 
+  3, 1, 5, 1, 5, 1, 3, 1, 3, 1, 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-  1, 3, 0, 1, 1, 3, 0, 1, 1, 1, 
+  1, 1, 3, 0, 1, 1, 3, 0, 1, 1, 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-  1, 1, 1, 3, 1, 2, 0, 1, 3, 3, 
-  1, 1, 1, 3, 1, 3, 2, 2, 2, 0, 
-  1, 2, 0, 1, 1, 2, 2, 7, 5, 7, 
-  7, 7, 5, 9, 10, 7, 8, 2, 2, 3, 
-  3, 2, 2, 3, 3, 3, 3, 5, 5, 3, 
-  5, 1, 2, 0, 1, 4, 3, 3, 3, 3, 
-  3, 3, 4, 5, 2, 2, 2, 1, 8, 8, 
-  7, 1, 3, 0, 1, 0, 1, 1, 1, 1, 
-  1, 2, 1, 1, 0, 1, 2};
+  1, 1, 1, 1, 3, 1, 2, 0, 1, 3, 
+  3, 1, 1, 1, 3, 1, 3, 2, 2, 2, 
+  0, 1, 2, 0, 1, 1, 2, 2, 7, 5, 
+  7, 7, 7, 5, 9, 10, 7, 8, 2, 2, 
+  3, 3, 2, 2, 3, 3, 3, 3, 5, 5, 
+  3, 5, 1, 2, 0, 1, 4, 3, 3, 3, 
+  3, 3, 3, 4, 5, 2, 2, 2, 1, 8, 
+  8, 7, 1, 3, 0, 1, 0, 1, 1, 1, 
+  1, 1, 2, 1, 1, 0, 1, 2};
 
 const short QQmlJSGrammar::action_default [] = {
-  0, 0, 28, 0, 0, 0, 28, 0, 184, 251, 
-  215, 223, 219, 163, 235, 211, 3, 148, 81, 164, 
-  227, 231, 152, 181, 162, 167, 147, 201, 188, 0, 
-  88, 89, 84, 0, 78, 73, 355, 0, 0, 0, 
-  0, 86, 0, 0, 82, 85, 77, 0, 0, 74, 
-  76, 79, 75, 87, 80, 0, 83, 0, 0, 177, 
-  0, 0, 164, 183, 166, 165, 0, 0, 0, 179, 
-  180, 178, 182, 0, 212, 0, 0, 0, 0, 202, 
-  0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 
-  186, 187, 185, 190, 194, 193, 191, 189, 204, 203, 
-  205, 0, 220, 0, 216, 0, 0, 158, 145, 157, 
-  146, 114, 115, 116, 141, 117, 142, 118, 119, 120, 
-  121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 
-  143, 131, 132, 133, 134, 135, 136, 137, 138, 139, 
-  140, 144, 0, 0, 156, 252, 159, 0, 160, 0, 
-  161, 155, 0, 248, 241, 239, 246, 247, 245, 244, 
-  250, 243, 242, 240, 249, 236, 0, 224, 0, 0, 
-  228, 0, 0, 232, 0, 0, 158, 150, 0, 149, 
-  0, 154, 168, 0, 344, 344, 345, 0, 342, 0, 
-  343, 0, 346, 259, 266, 265, 273, 261, 0, 262, 
-  0, 347, 0, 354, 263, 264, 81, 269, 267, 351, 
-  348, 353, 270, 0, 281, 0, 0, 0, 0, 338, 
-  0, 355, 253, 295, 0, 0, 0, 282, 0, 0, 
-  271, 272, 0, 260, 268, 296, 297, 0, 344, 0, 
-  0, 346, 0, 339, 340, 0, 328, 352, 0, 312, 
-  313, 314, 315, 0, 308, 309, 310, 311, 336, 337, 
-  0, 0, 0, 0, 0, 300, 301, 302, 257, 255, 
-  217, 225, 221, 237, 213, 258, 0, 164, 229, 233, 
-  206, 195, 0, 0, 214, 0, 0, 0, 0, 207, 
-  0, 0, 0, 0, 0, 199, 197, 200, 198, 196, 
-  209, 208, 210, 0, 222, 0, 218, 0, 256, 164, 
-  0, 238, 253, 254, 0, 253, 0, 0, 304, 0, 
-  0, 0, 306, 0, 226, 0, 0, 230, 0, 0, 
-  234, 293, 0, 285, 294, 288, 0, 292, 0, 253, 
-  286, 0, 253, 0, 0, 305, 0, 0, 0, 307, 
-  0, 0, 0, 299, 0, 298, 81, 108, 356, 0, 
-  0, 113, 275, 278, 0, 114, 281, 117, 142, 119, 
-  120, 84, 124, 125, 78, 126, 129, 82, 85, 253, 
-  79, 87, 132, 80, 134, 83, 136, 137, 282, 139, 
-  140, 144, 0, 110, 109, 112, 96, 111, 95, 0, 
-  105, 276, 274, 0, 0, 0, 346, 0, 106, 152, 
-  153, 158, 0, 151, 0, 316, 317, 0, 344, 0, 
-  0, 346, 0, 107, 0, 0, 0, 319, 324, 322, 
-  325, 0, 0, 323, 324, 0, 320, 0, 321, 277, 
-  327, 0, 277, 326, 0, 329, 330, 0, 277, 331, 
-  332, 0, 0, 333, 0, 0, 0, 334, 335, 170, 
-  169, 0, 0, 0, 303, 0, 0, 0, 318, 290, 
-  283, 0, 291, 287, 0, 289, 279, 0, 280, 284, 
-  0, 0, 346, 0, 341, 99, 0, 0, 103, 90, 
-  0, 92, 101, 0, 93, 102, 104, 94, 100, 91, 
-  0, 97, 174, 172, 176, 173, 171, 175, 349, 6, 
-  350, 4, 2, 71, 98, 0, 0, 74, 76, 75, 
-  37, 5, 0, 72, 0, 51, 50, 49, 0, 0, 
+  0, 0, 28, 0, 0, 0, 28, 0, 185, 252, 
+  216, 224, 220, 164, 236, 212, 3, 149, 82, 165, 
+  228, 232, 153, 182, 163, 168, 148, 202, 189, 0, 
+  89, 90, 85, 0, 79, 74, 356, 0, 0, 0, 
+  0, 87, 0, 0, 83, 86, 78, 0, 0, 75, 
+  77, 80, 76, 88, 81, 0, 84, 0, 0, 178, 
+  0, 0, 165, 184, 167, 166, 0, 0, 0, 180, 
+  181, 179, 183, 0, 213, 0, 0, 0, 0, 203, 
+  0, 0, 0, 0, 0, 0, 193, 0, 0, 0, 
+  187, 188, 186, 191, 195, 194, 192, 190, 205, 204, 
+  206, 0, 221, 0, 217, 0, 0, 159, 146, 158, 
+  147, 115, 116, 117, 142, 118, 143, 119, 120, 121, 
+  122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 
+  144, 132, 133, 134, 135, 136, 137, 138, 139, 140, 
+  141, 145, 0, 0, 157, 253, 160, 0, 161, 0, 
+  162, 156, 0, 249, 242, 240, 247, 248, 246, 245, 
+  251, 244, 243, 241, 250, 237, 0, 225, 0, 0, 
+  229, 0, 0, 233, 0, 0, 159, 151, 0, 150, 
+  0, 155, 169, 0, 345, 345, 346, 0, 343, 0, 
+  344, 0, 347, 260, 267, 266, 274, 262, 0, 263, 
+  0, 348, 0, 355, 264, 265, 82, 270, 268, 352, 
+  349, 354, 271, 0, 282, 0, 0, 0, 0, 339, 
+  0, 356, 254, 296, 0, 0, 0, 283, 0, 0, 
+  272, 273, 0, 261, 269, 297, 298, 0, 345, 0, 
+  0, 347, 0, 340, 341, 0, 329, 353, 0, 313, 
+  314, 315, 316, 0, 309, 310, 311, 312, 337, 338, 
+  0, 0, 0, 0, 0, 301, 302, 303, 258, 256, 
+  218, 226, 222, 238, 214, 259, 0, 165, 230, 234, 
+  207, 196, 0, 0, 215, 0, 0, 0, 0, 208, 
+  0, 0, 0, 0, 0, 200, 198, 201, 199, 197, 
+  210, 209, 211, 0, 223, 0, 219, 0, 257, 165, 
+  0, 239, 254, 255, 0, 254, 0, 0, 305, 0, 
+  0, 0, 307, 0, 227, 0, 0, 231, 0, 0, 
+  235, 294, 0, 286, 295, 289, 0, 293, 0, 254, 
+  287, 0, 254, 0, 0, 306, 0, 0, 0, 308, 
+  0, 0, 0, 300, 0, 299, 82, 109, 357, 0, 
+  0, 114, 276, 279, 0, 115, 282, 118, 143, 120, 
+  121, 85, 125, 126, 79, 127, 130, 83, 86, 254, 
+  80, 88, 133, 81, 135, 84, 137, 138, 283, 140, 
+  141, 145, 0, 111, 110, 113, 97, 112, 96, 0, 
+  106, 277, 275, 0, 0, 0, 347, 0, 107, 153, 
+  154, 159, 0, 152, 0, 317, 318, 0, 345, 0, 
+  0, 347, 0, 108, 0, 0, 0, 320, 325, 323, 
+  326, 0, 0, 324, 325, 0, 321, 0, 322, 278, 
+  328, 0, 278, 327, 0, 330, 331, 0, 278, 332, 
+  333, 0, 0, 334, 0, 0, 0, 335, 336, 171, 
+  170, 0, 0, 0, 304, 0, 0, 0, 319, 291, 
+  284, 0, 292, 288, 0, 290, 280, 0, 281, 285, 
+  0, 0, 347, 0, 342, 100, 0, 0, 104, 91, 
+  0, 93, 102, 0, 94, 103, 105, 95, 101, 92, 
+  0, 98, 175, 173, 177, 174, 172, 176, 350, 6, 
+  351, 4, 2, 72, 99, 0, 0, 75, 77, 76, 
+  37, 5, 0, 73, 0, 51, 50, 49, 0, 0, 
   64, 0, 65, 41, 42, 43, 44, 46, 47, 68, 
   45, 0, 51, 0, 0, 0, 0, 0, 60, 0, 
   61, 0, 0, 32, 0, 0, 69, 33, 0, 36, 
-  34, 30, 0, 35, 31, 0, 62, 0, 63, 152, 
-  0, 66, 70, 0, 0, 0, 0, 67, 0, 58, 
+  34, 30, 0, 35, 31, 0, 62, 0, 63, 153, 
+  0, 66, 70, 0, 0, 0, 0, 153, 278, 0, 
+  67, 82, 115, 282, 118, 143, 120, 121, 85, 125, 
+  126, 127, 130, 83, 86, 254, 88, 133, 81, 135, 
+  84, 137, 138, 283, 140, 141, 145, 71, 0, 58, 
   52, 59, 53, 0, 0, 0, 0, 55, 0, 56, 
-  57, 54, 0, 0, 152, 277, 0, 0, 48, 81, 
-  114, 281, 117, 142, 119, 120, 84, 124, 125, 126, 
-  129, 82, 85, 253, 87, 132, 80, 134, 83, 136, 
-  137, 282, 139, 140, 144, 0, 38, 39, 0, 40, 
-  8, 0, 0, 9, 0, 11, 0, 10, 0, 1, 
-  27, 15, 14, 26, 13, 12, 29, 7, 0, 18, 
-  0, 19, 0, 24, 25, 0, 20, 21, 0, 22, 
-  23, 16, 17, 357};
+  57, 54, 0, 0, 0, 0, 48, 0, 38, 39, 
+  0, 40, 8, 0, 0, 9, 0, 11, 0, 10, 
+  0, 1, 27, 15, 14, 26, 13, 12, 29, 7, 
+  0, 18, 0, 19, 0, 24, 25, 0, 20, 21, 
+  0, 22, 23, 16, 17, 358};
 
 const short QQmlJSGrammar::goto_default [] = {
-  7, 639, 211, 198, 209, 521, 509, 634, 647, 508, 
-  633, 637, 635, 643, 22, 640, 638, 636, 18, 520, 
+  7, 641, 211, 198, 209, 521, 509, 636, 649, 508, 
+  635, 639, 637, 645, 22, 642, 640, 638, 18, 520, 
   562, 552, 559, 554, 539, 193, 197, 199, 204, 234, 
-  212, 231, 543, 583, 582, 203, 233, 26, 487, 486, 
+  212, 231, 543, 613, 612, 203, 233, 26, 487, 486, 
   359, 358, 9, 357, 360, 202, 480, 361, 109, 17, 
   147, 24, 13, 146, 19, 25, 59, 23, 8, 28, 
   27, 280, 15, 274, 10, 270, 12, 272, 11, 271, 
@@ -209,295 +209,267 @@ const short QQmlJSGrammar::goto_default [] = {
   0};
 
 const short QQmlJSGrammar::action_index [] = {
-  239, 1406, 2692, 2692, 2794, 1119, 115, 29, 168, -106, 
-  26, -23, -60, 225, -106, 306, 33, -106, -106, 732, 
-  -2, 145, 243, 223, -106, -106, -106, 379, 227, 1406, 
-  -106, -106, -106, 539, -106, -106, 2488, 1698, 1406, 1406, 
-  1406, -106, 1023, 1406, -106, -106, -106, 1406, 1406, -106, 
-  -106, -106, -106, -106, -106, 1406, -106, 1406, 1406, -106, 
-  1406, 1406, 114, 206, -106, -106, 1406, 1406, 1406, -106, 
-  -106, -106, 211, 1406, 302, 1406, 1406, 1406, 1406, 369, 
-  1406, 1406, 1406, 1406, 1406, 1406, 226, 1406, 1406, 1406, 
-  135, 151, 110, 257, 279, 276, 256, 222, 475, 475, 
-  475, 1406, 7, 1406, 57, 2284, 1406, 1406, -106, -106, 
+  264, 1225, 2708, 2708, 2606, 938, 94, 104, 119, -106, 
+  92, 79, 81, 262, -106, 263, 78, -106, -106, 654, 
+  89, 125, 259, 229, -106, -106, -106, 322, 314, 1225, 
+  -106, -106, -106, 412, -106, -106, 2300, 1713, 1225, 1225, 
+  1225, -106, 842, 1225, -106, -106, -106, 1225, 1225, -106, 
+  -106, -106, -106, -106, -106, 1225, -106, 1225, 1225, -106, 
+  1225, 1225, 141, 216, -106, -106, 1225, 1225, 1225, -106, 
+  -106, -106, 209, 1225, 281, 1225, 1225, 1225, 1225, 367, 
+  1225, 1225, 1225, 1225, 1225, 1225, 219, 1225, 1225, 1225, 
+  101, 102, 115, 314, 314, 314, 314, 314, 357, 347, 
+  337, 1225, 71, 1225, 70, 2198, 1225, 1225, -106, -106, 
   -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, 
   -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, 
   -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, 
-  -106, -106, 136, 1406, -106, -106, 30, -24, -106, 1406, 
-  -106, -106, 1406, -106, -106, -106, -106, -106, -106, -106, 
-  -106, -106, -106, -106, -106, -106, 1406, 2, 1406, 1406, 
-  10, 97, 1406, -106, 2284, 1406, 1406, -106, 141, -106, 
-  -45, -106, -106, 4, 457, 386, 89, 79, -106, 448, 
-  -106, 74, 2692, -106, -106, -106, -106, -106, 164, -106, 
-  460, -106, 85, -106, -106, -106, 96, -106, -106, -106, 
-  2692, -106, -106, 547, -106, 629, 143, 2794, 62, 54, 
-  43, 2998, 1406, -106, 51, 1406, 52, -106, 47, 45, 
-  -106, -106, 454, -106, -106, -106, -106, 64, 352, 31, 
-  61, 2692, 27, -106, -106, 2794, -106, -106, 139, -106, 
-  -106, -106, -106, 126, -106, -106, -106, -106, -106, -106, 
-  -6, 25, 1406, 130, 159, -106, -106, -106, 1600, -106, 
-  68, 65, 5, -106, 308, 60, 3, 835, 99, 105, 
-  337, 207, 408, 1406, 317, 1406, 1406, 1406, 1406, 353, 
-  1406, 1406, 1406, 1406, 1406, 186, 203, 204, 212, 219, 
-  333, 343, 359, 1406, 20, 1406, 202, 1406, -106, 732, 
-  1406, -106, 1406, 81, 72, 1406, 77, 2794, -106, 1406, 
-  149, 2794, -106, 1406, 80, 1406, 1406, 94, 88, 1406, 
-  -106, -8, 128, -25, -106, -106, 1406, -106, 471, 1406, 
-  -106, -53, 1406, -56, 2794, -106, 1406, 134, 2794, -106, 
-  1406, 138, 2794, -5, 2794, -106, -4, -106, 9, -9, 
-  37, -106, -106, 2794, -12, 555, 32, 629, 123, 1406, 
-  2794, 41, 18, 504, 2386, 21, 1023, 49, 46, 1505, 
-  2386, 42, 16, 44, 1406, 24, -10, 1406, 17, 1406, 
-  -15, -18, 2590, -106, -106, -106, -106, -106, -106, 1406, 
-  -106, -106, -106, -1, -26, -3, 2692, -27, -106, 277, 
-  -106, 1406, -28, -106, 90, -106, -106, 1, 552, -40, 
-  -11, 2692, -29, -106, 1406, 117, 14, -106, 50, -106, 
-  40, 119, 1406, -106, 11, 35, -106, -54, -106, 2794, 
-  -106, 116, 2794, -106, 267, -106, -106, 121, 2794, -7, 
-  -106, -31, -19, -106, 376, 6, 78, -106, -106, -106, 
-  -106, 1406, 98, 2794, -106, 1406, 106, 2794, -106, 76, 
-  -106, 254, -106, -106, 1406, -106, -106, 552, -106, -106, 
-  71, 75, 2692, 67, -106, -106, 122, 1992, -106, -106, 
-  1796, -106, -106, 1894, -106, -106, -106, -106, -106, -106, 
-  113, -106, -106, -106, -106, -106, -106, -106, -106, -106, 
-  2692, -106, -106, -106, 111, 22, 929, 152, 39, 48, 
-  -106, -106, 301, -106, 147, -106, -106, -106, 468, 155, 
-  -106, 2182, -106, -106, -106, -106, -106, -106, -106, -106, 
-  -106, 178, -30, 463, 181, -14, 400, 229, -106, -32, 
-  -106, 929, 104, -106, 0, 929, -106, -106, 1311, -106, 
-  -106, -106, 1215, -106, -106, 248, -106, 2182, -106, 392, 
-  59, -106, -106, 244, 552, 73, 2182, -106, 236, -106, 
-  237, -106, 70, 15, 368, 214, 355, -106, 103, -106, 
-  -106, -106, 2087, 721, 392, 2896, 1698, 34, -106, 56, 
-  598, 55, 629, 107, 1406, 2794, 53, 23, 544, 36, 
-  1023, 58, 66, 1505, 69, 38, 63, 1406, 95, 84, 
-  1406, 102, 1406, 83, 82, 124, -106, -106, 87, -106, 
-  -106, 929, 813, 91, 929, -106, 271, -106, 86, -106, 
-  -106, 100, 101, -106, -106, -106, -106, -106, 552, -106, 
-  209, -106, 109, -106, -106, 552, -106, -106, 92, -106, 
-  -106, -106, -106, -106, 
+  -106, -106, 98, 1225, -106, -106, 66, 65, -106, 1225, 
+  -106, -106, 1225, -106, -106, -106, -106, -106, -106, -106, 
+  -106, -106, -106, -106, -106, -106, 1225, 44, 1225, 1225, 
+  64, 57, 1225, -106, 2198, 1225, 1225, -106, 137, -106, 
+  49, -106, -106, 93, 344, 474, 95, 86, -106, 390, 
+  -106, 85, 2708, -106, -106, -106, -106, -106, 189, -106, 
+  474, -106, 80, -106, -106, -106, 83, -106, -106, -106, 
+  2708, -106, -106, 490, -106, 551, 130, 2606, 46, 51, 
+  52, 2912, 1225, -106, 63, 1225, 56, -106, 58, 60, 
+  -106, -106, 474, -106, -106, -106, -106, 61, 474, 62, 
+  67, 2708, 68, -106, -106, 2606, -106, -106, 87, -106, 
+  -106, -106, -106, 110, -106, -106, -106, -106, -106, -106, 
+  -24, 69, 1225, 122, 143, -106, -106, -106, 1419, -106, 
+  74, 76, 77, -106, 269, 73, 72, 611, 75, 114, 
+  397, 314, 474, 1225, 287, 1225, 1225, 1225, 1225, 397, 
+  1225, 1225, 1225, 1225, 1225, 218, 215, 198, 192, 182, 
+  397, 397, 312, 1225, 55, 1225, 59, 1225, -106, 654, 
+  1225, -106, 1225, 54, 53, 1225, 50, 2606, -106, 1225, 
+  124, 2606, -106, 1225, 90, 1225, 1225, 105, 88, 1225, 
+  -106, 84, 157, -27, -106, -106, 1225, -106, 474, 1225, 
+  -106, 82, 1225, 91, 2606, -106, 1225, 120, 2606, -106, 
+  1225, 103, 2606, -9, 2606, -106, -2, -106, 11, -30, 
+  17, -106, -106, 2606, -37, 469, 15, 551, 138, 1225, 
+  2606, 14, -16, 433, 2402, -20, 842, 6, 5, 1324, 
+  2402, 4, -36, 2, 1225, 7, -18, 1225, 10, 1225, 
+  -26, -13, 2504, -106, -106, -106, -106, -106, -106, 1225, 
+  -106, -106, -106, -33, -59, -25, 2708, 23, -106, 197, 
+  -106, 1225, -12, -106, 140, -106, -106, 22, 474, -4, 
+  26, 2708, 12, -106, 1225, 113, 30, -106, 142, -106, 
+  142, 121, 1225, -106, -3, 45, -106, -5, -106, 2606, 
+  -106, 108, 2606, -106, 207, -106, -106, 106, 2606, 37, 
+  -106, 25, 36, -106, 474, 38, 40, -106, -106, -106, 
+  -106, 1225, 136, 2606, -106, 1225, 166, 2606, -106, 13, 
+  -106, 200, -106, -106, 1225, -106, -106, 474, -106, -106, 
+  -17, 16, 2708, -11, -106, -106, 131, 1811, -106, -106, 
+  1615, -106, -106, 1517, -106, -106, -106, -106, -106, -106, 
+  109, -106, -106, -106, -106, -106, -106, -106, -106, -106, 
+  2708, -106, -106, -106, 233, -19, 748, 152, -60, 41, 
+  -106, -106, 191, -106, 177, -106, -106, -106, 387, 203, 
+  -106, 1906, -106, -106, -106, -106, -106, -106, -106, -106, 
+  -106, 180, 43, 376, 174, 48, 474, 240, -106, 8, 
+  -106, 748, 111, -106, -1, 748, -106, -106, 1130, -106, 
+  -106, -106, 1034, -106, -106, 228, -106, 1906, -106, 295, 
+  21, -106, -106, 184, 379, 39, 2001, 288, 2810, 18, 
+  -106, 34, 482, 33, 551, 138, 1225, 2606, 31, 9, 
+  399, 3, 643, 19, 29, 1324, 28, 1, 27, 1225, 
+  24, 0, 1225, 20, 1225, -7, -8, -106, 193, -106, 
+  205, -106, 47, 42, 329, 208, 319, -106, 128, -106, 
+  -106, -106, 2096, 748, 1713, 35, -106, 132, -106, -106, 
+  32, -106, -106, 748, 748, 94, 748, -106, 250, -106, 
+  116, -106, -106, 233, 233, -106, -106, -106, -106, -106, 
+  393, -106, 214, -106, 100, -106, -106, 474, -106, -106, 
+  96, -106, -106, -106, -106, -106, 
 
-  -111, 43, 59, 70, 71, 369, 40, -111, -111, -111, 
-  -111, -111, -111, -111, -111, -111, -111, -111, -111, 21, 
-  -111, -111, -111, -111, -111, -111, -111, -111, -111, 79, 
-  -111, -111, -111, -16, -111, -111, 5, -26, 23, 73, 
-  91, -111, 83, 61, -111, -111, -111, 88, 87, -111, 
-  -111, -111, -111, -111, -111, 29, -111, 66, 39, -111, 
-  97, 193, -111, -111, -111, -111, 160, 180, 183, -111, 
-  -111, -111, -111, 176, -111, 167, 151, 155, 152, -111, 
-  148, 187, 195, 197, 199, 201, -111, 186, 92, 194, 
+  -111, 15, 71, 87, 80, 305, -6, -111, -111, -111, 
+  -111, -111, -111, -111, -111, -111, -111, -111, -111, -42, 
+  -111, -111, -111, -111, -111, -111, -111, -111, -111, 95, 
+  -111, -111, -111, 3, -111, -111, -5, -11, 9, 109, 
+  91, -111, 62, 45, -111, -111, -111, 50, 63, -111, 
+  -111, -111, -111, -111, -111, 32, -111, 203, 197, -111, 
+  189, 178, -111, -111, -111, -111, 182, 185, 188, -111, 
+  -111, -111, -111, 193, -111, 198, 168, 113, 114, -111, 
+  133, 116, 123, 129, 130, 132, -111, 136, 139, 142, 
   -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
-  -111, 103, -111, 108, -111, 181, -2, -42, -111, -111, 
+  -111, 148, -111, 151, -111, 186, 6, -37, -111, -111, 
   -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
   -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
   -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
-  -111, -111, -111, 34, -111, -111, -111, -111, -111, 3, 
-  -111, -111, 10, -111, -111, -111, -111, -111, -111, -111, 
-  -111, -111, -111, -111, -111, -111, 127, -111, 109, 15, 
-  -111, -111, 16, -111, 225, 44, 128, -111, -111, -111, 
-  -111, -111, -111, -111, 25, 157, -111, -111, -111, 26, 
-  -111, -111, 24, -111, -111, -111, -111, -111, -111, -111, 
-  22, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
-  179, -111, -111, 45, -111, 46, -111, 107, -111, 48, 
-  -111, 106, 62, -111, -111, 163, -3, -111, -111, -111, 
-  -111, -111, -14, -111, -111, -111, -111, -111, 57, -111, 
-  -111, 224, -111, -111, -111, 227, -111, -111, -111, -111, 
+  -111, -111, -111, 42, -111, -111, -111, -111, -111, 22, 
+  -111, -111, 2, -111, -111, -111, -111, -111, -111, -111, 
+  -111, -111, -111, -111, -111, -111, 96, -111, 66, 21, 
+  -111, -111, 0, -111, 274, 35, 88, -111, -111, -111, 
+  -111, -111, -111, -111, 41, 75, -111, -111, -111, 49, 
+  -111, -111, 48, -111, -111, -111, -111, -111, -111, -111, 
+  57, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
+  77, -111, -111, 54, -111, 27, -111, 243, -111, 25, 
+  -111, 160, 36, -111, -111, 169, 40, -111, -111, -111, 
+  -111, -111, 56, -111, -111, -111, -111, -111, 180, -111, 
+  -111, 163, -111, -111, -111, 246, -111, -111, -111, -111, 
   -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
-  -111, -111, 35, -111, -111, -111, -111, -111, 72, -111, 
+  -111, -111, 8, -111, -111, -111, -111, -111, 69, -111, 
   -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
-  -111, -111, 12, 264, -111, 258, 246, 254, 209, -111, 
-  60, 51, 52, 27, 53, -111, -111, -111, -111, -111, 
-  -111, -111, -111, 244, -111, 255, -111, 203, -111, -111, 
-  207, -111, 217, -111, -111, 198, -111, 208, -111, 8, 
-  -111, 215, -111, 232, -111, 233, 234, -111, -111, 223, 
-  -111, -111, -111, -111, -111, -111, 230, -111, 95, 113, 
-  -111, -111, 153, -111, 156, -111, 2, -111, 147, -111, 
-  58, -111, 137, -111, 100, -111, -111, -111, -111, -111, 
-  -111, -111, -111, 135, -111, 41, -111, 54, -111, 117, 
-  162, -111, -111, 50, 169, -111, 174, -111, -111, 32, 
-  178, -111, -111, -111, 31, -111, 7, 144, -111, 130, 
-  -111, -111, 142, -111, -111, -111, -111, -111, -111, 11, 
-  -111, -111, -111, -111, -111, -111, 214, -111, -111, -111, 
-  -111, 140, -111, -111, -111, -111, -111, -111, 158, -111, 
-  -111, 149, -111, -111, 47, -111, -111, -111, -111, -111, 
-  -55, -111, 38, -111, -67, -111, -111, -111, -111, 263, 
-  -111, -111, 262, -111, -111, -111, -111, -111, 190, -76, 
-  -111, -111, 30, -111, 19, -111, 14, -111, -111, -111, 
-  -111, 33, -111, 272, -111, 64, -111, 175, -111, -111, 
-  -111, -111, -111, -111, 18, -111, -111, 69, -111, -111, 
-  -111, -111, 114, -111, -111, -111, -111, 20, -111, -111, 
-  110, -111, -111, 28, -111, -111, -111, -111, -111, -111, 
+  -111, -111, 61, 211, -111, 272, 257, 256, 236, -111, 
+  81, 83, 85, 68, 94, -111, -111, -111, -111, -111, 
+  -111, -111, -111, 235, -111, 218, -111, 209, -111, -111, 
+  244, -111, 227, -111, -111, 228, -111, 238, -111, 33, 
+  -111, 167, -111, 245, -111, 253, 254, -111, -111, 225, 
+  -111, -111, -111, -111, -111, -111, 217, -111, 194, 213, 
+  -111, -111, 208, -111, 207, -111, 52, -111, 205, -111, 
+  55, -111, 201, -111, 199, -111, -111, -111, -111, -111, 
+  -111, -111, -111, 278, -111, 39, -111, 34, -111, 173, 
+  219, -111, -111, 53, 231, -111, 73, -111, -111, 44, 
+  59, -111, -111, -111, 47, -111, 24, 102, -111, 101, 
+  -111, -111, 111, -111, -111, -111, -111, -111, -111, 26, 
+  -111, -111, -111, -111, -111, -111, 65, -111, -111, -111, 
+  -111, 76, -111, -111, -111, -111, -111, -111, 79, -111, 
+  -111, 89, -111, -111, 51, -111, -111, -111, -111, -111, 
+  -62, -111, 37, -111, -63, -111, -111, -111, -111, 387, 
+  -111, -111, 264, -111, -111, -111, -111, -111, 158, -54, 
+  -111, -111, 28, -111, 38, -111, 23, -111, -111, -111, 
+  -111, 43, -111, 78, -111, 58, -111, 67, -111, -111, 
+  -111, -111, -111, -111, 18, -111, -111, 195, -111, -111, 
+  -111, -111, 161, -111, -111, -111, -111, 20, -111, -111, 
+  157, -111, -111, 31, -111, -111, -111, -111, -111, -111, 
   -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
-  86, -111, -111, -111, -111, -111, 55, -111, -111, -111, 
-  -111, -111, -111, -111, -7, -111, -111, -111, 1, -111, 
-  -111, 329, -111, -111, -111, -111, -111, -111, -111, -111, 
-  -111, -111, -111, 0, -11, -111, -10, -111, -111, -111, 
-  -111, 204, -111, -111, -111, 205, -111, -111, 317, -111, 
-  -111, -111, 311, -111, -111, -111, -111, 370, -111, -111, 
-  -9, -111, -111, -4, -12, -111, 337, -111, -111, -111, 
-  -18, -111, -111, -111, -1, -17, -6, -111, -111, -111, 
-  -111, -111, 466, 78, -111, 82, 307, -13, -111, -111, 
-  -8, -111, 6, -111, 74, 76, -111, -111, 9, -111, 
-  85, -111, -111, 17, -111, -111, -111, 4, -111, -22, 
-  84, -111, 67, -111, -111, -111, -111, -111, 49, -111, 
-  -111, 37, 42, 68, 77, -111, -111, -111, -111, -111, 
-  -111, -111, -111, -111, -111, -111, -111, -111, 13, -111, 
-  -111, -111, -111, -111, -111, 36, -111, -111, -111, -111, 
-  -111, -111, -111, -111};
+  206, -111, -111, -111, -111, -111, -7, -111, -111, -111, 
+  -111, -111, -111, -111, -24, -111, -111, -111, -12, -111, 
+  -111, 342, -111, -111, -111, -111, -111, -111, -111, -111, 
+  -111, -111, -111, -16, -32, -111, 5, -111, -111, -111, 
+  -111, 152, -111, -111, -111, 248, -111, -111, 330, -111, 
+  -111, -111, 324, -111, -111, -111, -111, 385, -111, -111, 
+  -21, -111, -111, 1, 14, -111, 367, -111, 232, 12, 
+  -111, -111, 11, -111, 10, -111, 164, 141, -111, -111, 
+  7, -111, 64, -111, -111, 19, -111, -111, -111, 17, 
+  -111, -1, 60, -111, 46, -111, -111, -111, -111, -111, 
+  -15, -111, -111, -111, -2, -17, -4, -111, -111, -111, 
+  -111, -111, 484, 138, 313, -3, -111, -111, -111, -111, 
+  4, -111, -111, 13, 16, 97, 127, -111, -111, -111, 
+  -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 
+  -14, -111, -111, -111, -111, -111, -111, -8, -111, -111, 
+  -111, -111, -111, -111, -111, -111};
 
 const short QQmlJSGrammar::action_info [] = {
-  166, 438, 551, 245, 344, 454, 346, 544, 342, 336, 
-  546, 354, 166, 452, 448, 181, 432, 392, 465, 103, 
-  420, 461, 421, 448, -138, 101, 423, 73, 408, 663, 
-  406, -135, 413, 558, 405, 404, 151, 418, 149, -141, 
-  185, 143, 439, 402, 399, 432, 398, 428, -122, -111, 
-  101, -133, 424, -112, 268, 432, -130, 350, 73, 268, 
-  -122, 262, -141, 245, 312, -130, 456, 558, 307, 283, 
-  -133, 261, 350, -112, 424, 588, -111, 578, 585, 350, 
-  576, 465, 243, 461, 305, 448, 103, 424, 524, 143, 
-  184, 240, 558, 474, 241, 329, 323, 189, 268, 305, 
-  238, 323, -135, 245, 172, 573, 143, 192, 482, -138, 
-  0, 448, 555, 303, 143, 174, 174, 448, 465, 461, 
-  558, 143, 484, 442, 143, 143, 174, 451, 303, 435, 
-  490, 481, 555, 315, 175, 175, 338, 317, 143, 191, 
-  244, 452, 143, 0, 143, 175, 143, 662, 661, 143, 
-  60, 416, 415, 660, 659, 325, 64, 143, 463, 326, 
-  556, 61, 531, 0, 590, 589, 467, 65, 259, 258, 
-  654, 653, 143, 501, 436, 60, 525, 426, 491, 0, 
-  626, 542, 631, 632, 259, 258, 61, 257, 256, 339, 
-  264, 60, 144, 174, 348, 168, 0, 179, 352, 169, 
-  252, 251, 61, 283, 259, 258, 631, 632, 60, 321, 
-  525, 87, 175, 88, 411, 0, 532, 530, 66, 61, 
-  267, 265, 527, 66, 89, 236, 235, 527, 87, 87, 
-  88, 88, 87, 526, 88, 66, 549, 87, 526, 88, 
-  105, 89, 89, 525, 87, 89, 88, 87, 266, 88, 
-  89, 87, 87, 88, 88, 567, 527, 89, 174, 106, 
-  89, 107, 477, 67, 89, 89, 525, 526, 67, 68, 
-  657, 656, 580, 525, 68, 143, 0, 175, 0, 176, 
-  67, 87, 87, 88, 88, 0, 68, 0, 0, 527, 
-  550, 548, 174, 0, 89, 89, 0, 581, 579, 0, 
-  526, 87, 655, 88, 87, 0, 88, 0, 592, 568, 
-  566, 175, 527, 411, 89, 478, 476, 89, 650, 527, 
-  75, 76, 0, 526, 75, 76, 285, 286, 446, 445, 
-  526, 0, 651, 649, 558, 285, 286, 6, 5, 4, 
-  1, 3, 2, 0, 0, 0, 0, 77, 78, 0, 
-  0, 77, 78, 287, 288, 0, 290, 291, 0, 0, 
-  290, 291, 287, 288, 648, 292, 290, 291, 293, 292, 
-  294, 0, 293, 0, 294, 292, 290, 291, 293, 0, 
-  294, 35, 290, 291, 35, 292, 0, 0, 293, 0, 
-  294, 292, 80, 81, 293, 593, 294, 35, 0, 0, 
-  82, 83, 80, 81, 84, 35, 85, 174, 0, 0, 
-  82, 83, 0, 0, 84, 35, 85, 0, 49, 52, 
-  50, 49, 52, 50, 0, -98, 175, 0, 176, 35, 
-  0, 0, 0, 0, 49, 52, 50, 35, 0, 0, 
-  0, 0, 49, 52, 50, 0, 46, 34, 51, 46, 
-  34, 51, 49, 52, 50, 0, 0, 0, 0, 0, 
-  0, 0, 46, 34, 51, 0, 49, 52, 50, 0, 
-  46, 34, 51, 0, 49, 52, 50, 35, 0, 0, 
-  46, 34, 51, 35, 0, 0, 35, 0, 0, 35, 
-  0, 0, 35, 0, 46, 34, 51, 35, 80, 81, 
-  35, 0, 46, 34, 51, 0, 82, 83, 0, 0, 
-  84, 0, 85, 0, 49, 52, 50, 0, 0, 0, 
-  49, 52, 50, 49, 52, 50, 49, 52, 50, 49, 
-  52, 50, 0, 35, 49, 52, 50, 49, 52, 50, 
-  184, 0, 46, 34, 51, 0, 0, 0, 46, 34, 
-  51, 46, 34, 51, 46, 34, 51, 46, 34, 51, 
-  0, 0, 46, 34, 51, 46, 34, 51, 35, 0, 
-  49, 52, 50, 35, 0, 184, 35, 0, 0, 0, 
-  184, 35, 0, 0, 35, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 46, 34, 
-  51, 0, 0, 0, 0, 49, 52, 50, 250, 249, 
-  49, 52, 50, 49, 52, 50, 250, 249, 49, 52, 
-  50, 49, 52, 50, 0, 0, 0, 35, 0, 0, 
+  424, 405, 432, 404, 346, 245, 573, 354, 406, -134, 
+  461, -112, -113, -131, -136, 448, 350, -139, 402, 392, 
+  268, -123, -142, 465, 399, 398, -131, -139, 465, 461, 
+  474, -136, 558, 448, -134, -112, -113, 424, -123, 350, 
+  -142, 245, 551, 481, 484, 268, 576, 524, 413, 482, 
+  438, 558, 439, 261, 558, 615, 420, 452, 418, 421, 
+  283, 454, 143, 428, 172, 558, 166, 423, 558, 448, 
+  608, 73, 546, 448, 149, 283, 0, 323, 408, 0, 
+  544, 307, 268, 0, 0, 0, 143, 184, 350, 448, 
+  245, 166, 101, 73, 461, 329, 465, 238, 456, 424, 
+  241, 336, 618, 189, 665, 262, 143, 323, 0, 181, 
+  317, 143, 451, 0, 315, 442, 143, 143, 192, 555, 
+  0, 143, 240, 243, 303, 151, 452, 101, 143, 185, 
+  143, 435, 143, 312, 305, 244, 0, 0, 303, 490, 
+  555, 60, 60, 342, 143, 143, 191, 432, 252, 251, 
+  103, 344, 61, 61, 144, 60, 305, 662, 661, 60, 
+  103, 656, 655, 352, 325, 338, 61, 556, 326, 501, 
+  61, 257, 256, 426, 143, 168, 436, 664, 663, 169, 
+  348, 542, 264, 64, 321, 633, 634, 491, 628, 620, 
+  619, 259, 258, 179, 65, 174, 463, 143, 622, 259, 
+  258, 416, 415, 525, 267, 265, 525, 87, 477, 88, 
+  531, 0, 174, 525, 175, 143, 411, 87, 339, 88, 
+  89, 66, 0, 87, 558, 88, 467, 527, 66, 610, 
+  89, 175, 266, 411, 525, 567, 89, 525, 526, 0, 
+  87, 66, 88, 87, 87, 88, 88, 549, 174, 527, 
+  236, 235, 527, 89, 611, 609, 89, 89, 0, 527, 
+  526, 478, 476, 526, 532, 530, 67, 175, 446, 445, 
+  526, 0, 68, 67, 174, 659, 658, 105, 0, 68, 
+  527, 75, 76, 527, 0, 623, 67, 285, 286, 568, 
+  566, 526, 68, 175, 526, 176, 106, 652, 107, 75, 
+  76, 550, 548, 174, 0, 285, 286, 657, 77, 78, 
+  174, 653, 651, 0, 287, 288, 0, 0, 0, 0, 
+  0, -99, 175, 0, 176, 0, 77, 78, -99, 175, 
+  0, 176, 287, 288, 0, 290, 291, 0, 0, 87, 
+  0, 88, 0, 650, 292, 80, 81, 293, 35, 294, 
+  0, 0, 89, 82, 83, 0, 0, 84, 35, 85, 
+  80, 81, 6, 5, 4, 1, 3, 2, 82, 83, 
+  80, 81, 84, 35, 85, 0, 0, 0, 82, 83, 
+  80, 81, 84, 0, 85, 49, 52, 50, 82, 83, 
+  80, 81, 84, 0, 85, 49, 52, 50, 82, 83, 
+  0, 0, 84, 0, 85, 35, 0, 0, 35, 0, 
+  49, 52, 50, 46, 34, 51, 35, 0, 0, 35, 
+  290, 291, 35, 46, 34, 51, 0, 0, 35, 292, 
+  0, 0, 293, 0, 294, 184, 0, 0, 46, 34, 
+  51, 35, 49, 52, 50, 49, 52, 50, 184, 0, 
+  0, 0, 0, 49, 52, 50, 49, 52, 50, 49, 
+  52, 50, 35, 0, 0, 49, 52, 50, 0, 184, 
+  46, 34, 51, 46, 34, 51, 0, 0, 49, 52, 
+  50, 46, 34, 51, 46, 34, 51, 46, 34, 51, 
+  0, 0, 0, 46, 34, 51, 0, 0, 35, 49, 
+  52, 50, 0, 35, 0, 0, 46, 34, 51, 0, 
+  0, 35, 0, 0, 0, 0, 0, 0, 0, 35, 
+  0, 0, 0, 0, 0, 0, 0, 46, 34, 51, 
+  250, 249, 0, 0, 0, 49, 52, 50, 0, 0, 
+  49, 52, 50, 250, 249, 0, 0, 0, 49, 52, 
+  50, 250, 249, 0, 0, 0, 49, 52, 50, 0, 
   0, 0, 0, 46, 34, 51, 0, 0, 46, 34, 
-  51, 46, 34, 51, 0, 0, 46, 34, 51, 46, 
-  34, 51, 0, 0, 0, 0, 0, 0, 35, 250, 
-  249, 0, 0, 0, 49, 52, 50, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  255, 254, 46, 34, 51, 49, 52, 50, 0, 0, 
+  51, 0, 0, 0, 0, 0, 46, 34, 51, 0, 
+  35, 0, 0, 0, 46, 34, 51, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 46, 34, 51, 0, 0, 0, 0, 
-  0, 0, 0, 30, 31, 153, 0, 0, 0, 0, 
-  0, 0, 0, 33, 0, 154, 0, 0, 0, 155, 
-  35, 0, 0, 0, 36, 37, 0, 38, 156, 0, 
-  157, 0, 0, 0, 516, 0, 0, 0, 45, 0, 
-  0, 158, 0, 159, 64, 0, 0, 0, 0, 0, 
-  0, 160, 0, 0, 161, 65, 53, 49, 52, 50, 
-  162, 54, 0, 0, 0, 0, 163, 0, 0, 0, 
-  0, 0, 44, 56, 32, 0, 0, 0, 41, 0, 
-  0, 0, 164, 0, 0, 46, 34, 51, 0, 0, 
-  0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 
-  0, 0, 0, 0, 0, 33, 0, 0, 153, 0, 
-  0, 0, 35, 0, 0, 0, 36, 37, 154, 38, 
-  0, 0, 155, 0, 0, 0, 516, 0, 0, 0, 
-  45, 156, 0, 157, 0, 0, 319, 0, 0, 0, 
-  0, 0, 0, 0, 158, 0, 159, 64, 53, 49, 
-  52, 50, 0, 54, 160, 0, 0, 161, 65, 0, 
-  0, 0, 0, 162, 44, 56, 32, 0, 0, 163, 
-  41, 0, 0, 0, 0, 0, 0, 46, 34, 51, 
-  0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 255, 254, 153, 0, 0, 49, 52, 50, 
+  0, 0, 0, 0, 154, 0, 0, 0, 155, 0, 
+  0, 0, 0, 0, 0, 0, 0, 156, 0, 157, 
+  0, 0, 319, 0, 0, 46, 34, 51, 0, 0, 
+  158, 0, 159, 64, 0, 30, 31, 153, 0, 0, 
+  160, 0, 0, 161, 65, 33, 0, 154, 0, 162, 
+  0, 155, 35, 0, 0, 163, 36, 37, 0, 38, 
+  156, 0, 157, 0, 0, 0, 42, 0, 0, 0, 
+  45, 164, 0, 158, 0, 159, 64, 0, 0, 0, 
+  0, 0, 0, 160, 0, 0, 161, 65, 53, 49, 
+  52, 50, 162, 54, 0, 0, 0, 0, 163, 0, 
+  0, 0, 0, 0, 44, 56, 32, 0, 0, 0, 
+  41, 0, 0, 0, 164, 0, 0, 46, 34, 51, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 
-  0, 33, 0, 0, 0, 0, 0, 0, 35, 0, 
-  0, 0, 36, 37, 0, 38, 0, 0, 0, 0, 
-  0, 0, 516, 0, 0, 0, 45, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 53, 49, 52, 50, 0, 54, 
+  30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 
+  33, 0, 0, 0, 0, 0, 0, 35, 0, 0, 
+  0, 36, 37, 0, 38, 0, 0, 0, 0, 0, 
+  0, 516, 0, 0, 0, 45, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  44, 56, 32, 0, 0, 0, 41, 0, 0, 0, 
-  0, 0, 0, 46, 34, 51, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 
-  0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 
-  0, 0, 35, 0, 0, 0, 36, 37, 0, 38, 
-  0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 
-  45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 53, 49, 
-  52, 50, 0, 54, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 44, 56, 32, 0, 0, 0, 
-  41, 0, 0, 0, 0, 0, 0, 46, 34, 51, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 515, 
-  0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 
-  0, 219, 0, 0, 0, 0, 0, 0, 35, 0, 
-  0, 0, 36, 37, 0, 38, 0, 0, 0, 0, 
-  0, 0, 516, 0, 0, 0, 45, 0, 0, 0, 
+  0, 0, 0, 53, 49, 52, 50, 0, 54, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 
+  56, 32, 0, 0, 0, 41, 0, 0, 0, 0, 
+  0, 0, 46, 34, 51, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 
+  0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 
+  0, 35, 0, 0, 0, 36, 37, 0, 38, 0, 
+  0, 0, 0, 0, 0, 42, 0, 0, 0, 45, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 53, 517, 519, 518, 0, 54, 
-  0, 0, 0, 0, 227, 0, 0, 0, 0, 0, 
-  44, 56, 32, 214, 0, 0, 41, 0, 0, 0, 
-  0, 0, 0, 46, 34, 51, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 515, 0, 30, 31, 0, 
-  0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 
-  0, 0, 0, 0, 35, 0, 0, 0, 36, 37, 
-  0, 38, 0, 0, 0, 0, 0, 0, 516, 0, 
-  0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 
-  563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  53, 517, 519, 518, 0, 54, 0, 0, 0, 0, 
-  227, 0, 0, 0, 0, 0, 44, 56, 32, 214, 
-  0, 0, 41, 0, 0, 0, 0, 0, 0, 46, 
-  34, 51, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 515, 0, 30, 31, 0, 0, 0, 0, 0, 
-  0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 
-  35, 0, 0, 0, 36, 37, 0, 38, 0, 0, 
-  0, 0, 0, 0, 516, 0, 0, 0, 45, 0, 
-  0, 0, 0, 0, 0, 0, 560, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 53, 517, 519, 518, 
-  0, 54, 0, 0, 0, 0, 227, 0, 0, 0, 
-  0, 0, 44, 56, 32, 214, 0, 0, 41, 0, 
-  0, 0, 0, 0, 0, 46, 34, 51, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 29, 30, 31, 
-  0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 
-  0, 0, 0, 0, 0, 35, 0, 0, 0, 36, 
-  37, 0, 38, 0, 0, 0, 39, 0, 40, 42, 
-  43, 0, 0, 45, 0, 0, 0, 47, 0, 48, 
+  0, 0, 0, 0, 0, 0, 0, 53, 49, 52, 
+  50, 0, 54, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 44, 56, 32, 0, 0, 0, 41, 
+  0, 0, 0, 0, 0, 0, 46, 34, 51, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 515, 0, 
+  30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 
+  219, 0, 0, 0, 0, 0, 0, 35, 0, 0, 
+  0, 36, 37, 0, 38, 0, 0, 0, 0, 0, 
+  0, 516, 0, 0, 0, 45, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 53, 49, 52, 50, 0, 54, 0, 55, 0, 
-  57, 0, 58, 0, 0, 0, 0, 44, 56, 32, 
-  0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 
-  46, 34, 51, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, -131, 0, 0, 0, 29, 30, 31, 0, 
+  0, 0, 0, 53, 517, 519, 518, 0, 54, 0, 
+  0, 0, 0, 227, 0, 0, 0, 0, 0, 44, 
+  56, 32, 214, 0, 0, 41, 0, 0, 0, 0, 
+  0, 0, 46, 34, 51, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 515, 0, 30, 31, 0, 0, 
+  0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 
+  0, 0, 0, 35, 0, 0, 0, 36, 37, 0, 
+  38, 0, 0, 0, 0, 0, 0, 516, 0, 0, 
+  0, 45, 0, 0, 0, 0, 0, 0, 0, 563, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 
+  517, 519, 518, 0, 54, 0, 0, 0, 0, 227, 
+  0, 0, 0, 0, 0, 44, 56, 32, 214, 0, 
+  0, 41, 0, 0, 0, 0, 0, 0, 46, 34, 
+  51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  515, 0, 30, 31, 0, 0, 0, 0, 0, 0, 
+  0, 0, 219, 0, 0, 0, 0, 0, 0, 35, 
+  0, 0, 0, 36, 37, 0, 38, 0, 0, 0, 
+  0, 0, 0, 516, 0, 0, 0, 45, 0, 0, 
+  0, 0, 0, 0, 0, 560, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 53, 517, 519, 518, 0, 
+  54, 0, 0, 0, 0, 227, 0, 0, 0, 0, 
+  0, 44, 56, 32, 214, 0, 0, 41, 0, 0, 
+  0, 0, 0, 0, 46, 34, 51, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 29, 30, 31, 0, 
   0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 
   0, 0, 0, 0, 35, 0, 0, 0, 36, 37, 
   0, 38, 0, 0, 0, 39, 0, 40, 42, 43, 
@@ -507,369 +479,362 @@ const short QQmlJSGrammar::action_info [] = {
   0, 58, 0, 0, 0, 0, 44, 56, 32, 0, 
   0, 0, 41, 0, 0, 0, 0, 0, 0, 46, 
   34, 51, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 29, 30, 31, 0, 0, 0, 0, 0, 0, 
-  0, 0, 33, 0, 0, 0, 0, 0, 0, 35, 
-  0, 0, 0, 36, 37, 0, 38, 0, 0, 0, 
-  39, 0, 40, 42, 43, 0, 0, 45, 0, 0, 
-  0, 47, 0, 48, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 53, 49, 52, 50, 0, 
-  54, 0, 55, 0, 57, 282, 58, 0, 0, 0, 
-  0, 44, 56, 32, 0, 0, 0, 41, 0, 0, 
-  0, 0, 0, 0, 46, 34, 51, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 488, 0, 0, 29, 
-  30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 
-  33, 0, 0, 0, 0, 0, 0, 35, 0, 0, 
-  0, 36, 37, 0, 38, 0, 0, 0, 39, 0, 
-  40, 42, 43, 0, 0, 45, 0, 0, 0, 47, 
-  0, 48, 0, 0, 489, 0, 0, 0, 0, 0, 
-  0, 0, 0, 53, 49, 52, 50, 0, 54, 0, 
-  55, 0, 57, 0, 58, 0, 0, 0, 0, 44, 
-  56, 32, 0, 0, 0, 41, 0, 0, 0, 0, 
-  0, 0, 46, 34, 51, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 488, 0, 0, 29, 30, 31, 
-  0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 
-  0, 0, 0, 0, 0, 35, 0, 0, 0, 36, 
-  37, 0, 38, 0, 0, 0, 39, 0, 40, 42, 
-  43, 0, 0, 45, 0, 0, 0, 47, 0, 48, 
-  0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 
-  0, 53, 49, 52, 50, 0, 54, 0, 55, 0, 
-  57, 0, 58, 0, 0, 0, 0, 44, 56, 32, 
-  0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 
-  46, 34, 51, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 496, 0, 0, 29, 30, 31, 0, 0, 
+  0, -132, 0, 0, 0, 29, 30, 31, 0, 0, 
   0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 
   0, 0, 0, 35, 0, 0, 0, 36, 37, 0, 
   38, 0, 0, 0, 39, 0, 40, 42, 43, 0, 
   0, 45, 0, 0, 0, 47, 0, 48, 0, 0, 
-  497, 0, 0, 0, 0, 0, 0, 0, 0, 53, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 
   49, 52, 50, 0, 54, 0, 55, 0, 57, 0, 
   58, 0, 0, 0, 0, 44, 56, 32, 0, 0, 
   0, 41, 0, 0, 0, 0, 0, 0, 46, 34, 
   51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  496, 0, 0, 29, 30, 31, 0, 0, 0, 0, 
-  0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 
-  0, 35, 0, 0, 0, 36, 37, 0, 38, 0, 
-  0, 0, 39, 0, 40, 42, 43, 0, 0, 45, 
-  0, 0, 0, 47, 0, 48, 0, 0, 499, 0, 
-  0, 0, 0, 0, 0, 0, 0, 53, 49, 52, 
-  50, 0, 54, 0, 55, 0, 57, 0, 58, 0, 
-  0, 0, 0, 44, 56, 32, 0, 0, 0, 41, 
-  0, 0, 0, 0, 0, 0, 46, 34, 51, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 
+  29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 
+  0, 33, 0, 0, 0, 0, 0, 0, 35, 0, 
+  0, 0, 36, 37, 0, 38, 0, 0, 0, 39, 
+  0, 40, 42, 43, 0, 0, 45, 0, 0, 0, 
+  47, 0, 48, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 53, 49, 52, 50, 0, 54, 
+  0, 55, 0, 57, 282, 58, 0, 0, 0, 0, 
+  44, 56, 32, 0, 0, 0, 41, 0, 0, 0, 
+  0, 0, 0, 46, 34, 51, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 496, 0, 0, 29, 30, 
   31, 0, 0, 0, 0, 0, 0, 0, 0, 33, 
-  0, 0, 0, 0, 0, 0, 35, 220, 0, 0, 
-  595, 596, 0, 38, 0, 0, 0, 39, 0, 40, 
+  0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 
+  36, 37, 0, 38, 0, 0, 0, 39, 0, 40, 
   42, 43, 0, 0, 45, 0, 0, 0, 47, 0, 
-  48, 0, 0, 0, 0, 0, 0, 0, 223, 0, 
-  0, 0, 53, 49, 52, 50, 224, 54, 0, 55, 
-  226, 57, 0, 58, 0, 229, 0, 0, 44, 56, 
+  48, 0, 0, 497, 0, 0, 0, 0, 0, 0, 
+  0, 0, 53, 49, 52, 50, 0, 54, 0, 55, 
+  0, 57, 0, 58, 0, 0, 0, 0, 44, 56, 
   32, 0, 0, 0, 41, 0, 0, 0, 0, 0, 
   0, 46, 34, 51, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 29, 30, 31, 0, 0, 0, 0, 
-  0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 
-  0, 35, 220, 0, 0, 221, 37, 0, 38, 0, 
-  0, 0, 39, 0, 40, 42, 43, 0, 0, 45, 
-  0, 0, 0, 47, 0, 48, 0, 0, 0, 0, 
-  0, 0, 0, 223, 0, 0, 0, 53, 49, 52, 
-  50, 224, 54, 0, 55, 226, 57, 0, 58, 0, 
-  229, 0, 0, 44, 56, 32, 0, 0, 0, 41, 
-  0, 0, 0, 0, 0, 0, 46, 34, 51, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 111, 112, 
-  113, 0, 0, 115, 117, 118, 0, 0, 119, 0, 
-  120, 0, 0, 0, 122, 123, 124, 0, 0, 0, 
-  0, 0, 0, 35, 125, 126, 127, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 
-  49, 52, 50, 132, 133, 134, 0, 136, 137, 138, 
-  139, 140, 141, 0, 0, 129, 135, 121, 114, 116, 
-  130, 0, 0, 0, 0, 0, 0, 0, 46, 34, 
-  51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  111, 112, 113, 0, 0, 115, 117, 118, 0, 0, 
-  119, 0, 120, 0, 0, 0, 122, 123, 124, 0, 
-  0, 0, 0, 0, 0, 35, 125, 126, 127, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 
-  0, 0, 0, 395, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 
-  0, 397, 49, 52, 50, 132, 133, 134, 0, 136, 
-  137, 138, 139, 140, 141, 0, 0, 129, 135, 121, 
-  114, 116, 130, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 488, 0, 0, 29, 30, 31, 0, 
+  0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 
+  0, 0, 0, 0, 35, 0, 0, 0, 36, 37, 
+  0, 38, 0, 0, 0, 39, 0, 40, 42, 43, 
+  0, 0, 45, 0, 0, 0, 47, 0, 48, 0, 
+  0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 
+  53, 49, 52, 50, 0, 54, 0, 55, 0, 57, 
+  0, 58, 0, 0, 0, 0, 44, 56, 32, 0, 
+  0, 0, 41, 0, 0, 0, 0, 0, 0, 46, 
+  34, 51, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 488, 0, 0, 29, 30, 31, 0, 0, 0, 
+  0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 
+  0, 0, 35, 0, 0, 0, 36, 37, 0, 38, 
+  0, 0, 0, 39, 0, 40, 42, 43, 0, 0, 
+  45, 0, 0, 0, 47, 0, 48, 0, 0, 489, 
+  0, 0, 0, 0, 0, 0, 0, 0, 53, 49, 
+  52, 50, 0, 54, 0, 55, 0, 57, 0, 58, 
+  0, 0, 0, 0, 44, 56, 32, 0, 0, 0, 
+  41, 0, 0, 0, 0, 0, 0, 46, 34, 51, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 496, 
+  0, 0, 29, 30, 31, 0, 0, 0, 0, 0, 
+  0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 
+  35, 0, 0, 0, 36, 37, 0, 38, 0, 0, 
+  0, 39, 0, 40, 42, 43, 0, 0, 45, 0, 
+  0, 0, 47, 0, 48, 0, 0, 499, 0, 0, 
+  0, 0, 0, 0, 0, 0, 53, 49, 52, 50, 
+  0, 54, 0, 55, 0, 57, 0, 58, 0, 0, 
+  0, 0, 44, 56, 32, 0, 0, 0, 41, 0, 
+  0, 0, 0, 0, 0, 46, 34, 51, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 29, 30, 31, 
+  0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 
+  0, 0, 0, 0, 0, 35, 220, 0, 0, 221, 
+  37, 0, 38, 0, 0, 0, 39, 0, 40, 42, 
+  43, 0, 0, 45, 0, 0, 0, 47, 0, 48, 
+  0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 
+  0, 53, 49, 52, 50, 224, 54, 0, 55, 226, 
+  57, 0, 58, 0, 229, 0, 0, 44, 56, 32, 
+  0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 
+  46, 34, 51, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 29, 30, 31, 0, 0, 0, 0, 0, 
+  0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 
+  35, 220, 0, 0, 578, 37, 0, 38, 0, 0, 
+  0, 39, 0, 40, 42, 43, 0, 0, 45, 0, 
+  0, 0, 47, 0, 48, 0, 0, 0, 0, 0, 
+  0, 0, 223, 0, 0, 0, 53, 49, 52, 50, 
+  224, 54, 0, 55, 226, 57, 0, 58, 0, 229, 
+  0, 0, 44, 56, 32, 0, 0, 0, 41, 0, 
+  0, 0, 0, 0, 0, 46, 34, 51, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 29, 30, 31, 
+  0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 
+  0, 0, 0, 0, 0, 35, 220, 0, 0, 578, 
+  624, 0, 38, 0, 0, 0, 39, 0, 40, 42, 
+  43, 0, 0, 45, 0, 0, 0, 47, 0, 48, 
+  0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 
+  0, 53, 49, 52, 50, 224, 54, 0, 55, 226, 
+  57, 0, 58, 0, 229, 0, 0, 44, 56, 32, 
+  0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 
   46, 34, 51, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 111, 112, 113, 0, 0, 115, 117, 118, 
   0, 0, 119, 0, 120, 0, 0, 0, 122, 123, 
   124, 0, 0, 0, 0, 0, 0, 35, 125, 126, 
   127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 128, 0, 0, 0, 395, 0, 0, 0, 0, 
+  0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 
-  0, 0, 0, 397, 49, 52, 50, 132, 133, 134, 
+  0, 0, 0, 0, 49, 52, 50, 132, 133, 134, 
   0, 136, 137, 138, 139, 140, 141, 0, 0, 129, 
   135, 121, 114, 116, 130, 0, 0, 0, 0, 0, 
-  0, 0, 46, 374, 380, 0, 0, 0, 0, 0, 
+  0, 0, 46, 34, 51, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 111, 112, 113, 0, 0, 115, 
   117, 118, 0, 0, 119, 0, 120, 0, 0, 0, 
   122, 123, 124, 0, 0, 0, 0, 0, 0, 35, 
   125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 128, 0, 0, 0, 395, 0, 0, 
-  0, 0, 0, 0, 0, 396, 0, 0, 0, 131, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 
   0, 0, 0, 0, 0, 397, 49, 52, 50, 132, 
   133, 134, 0, 136, 137, 138, 139, 140, 141, 0, 
   0, 129, 135, 121, 114, 116, 130, 0, 0, 0, 
   0, 0, 0, 0, 46, 374, 380, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 
-  0, 215, 0, 29, 30, 31, 217, 0, 0, 0, 
-  0, 0, 0, 218, 219, 0, 0, 0, 0, 0, 
-  0, 35, 220, 0, 0, 221, 37, 0, 38, 0, 
-  0, 0, 39, 0, 40, 42, 43, 0, 0, 45, 
-  0, 0, 0, 47, 0, 48, 0, 0, 0, 0, 
-  0, 222, 0, 223, 0, 0, 0, 53, 49, 52, 
-  50, 224, 54, 225, 55, 226, 57, 227, 58, 228, 
-  229, 0, 0, 44, 56, 32, 214, 216, 0, 41, 
+  0, 0, 0, 0, 0, 0, 111, 112, 113, 0, 
+  0, 115, 117, 118, 0, 0, 119, 0, 120, 0, 
+  0, 0, 122, 123, 124, 0, 0, 0, 0, 0, 
+  0, 35, 125, 126, 127, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 128, 0, 0, 0, 395, 
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 131, 0, 0, 0, 0, 0, 397, 49, 52, 
+  50, 132, 133, 134, 0, 136, 137, 138, 139, 140, 
+  141, 0, 0, 129, 135, 121, 114, 116, 130, 0, 
   0, 0, 0, 0, 0, 0, 46, 34, 51, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 
-  0, 0, 0, 215, 0, 29, 30, 31, 217, 0, 
-  0, 0, 0, 0, 0, 218, 33, 0, 0, 0, 
-  0, 0, 0, 35, 220, 0, 0, 221, 37, 0, 
-  38, 0, 0, 0, 39, 0, 40, 42, 43, 0, 
-  0, 45, 0, 0, 0, 47, 0, 48, 0, 0, 
-  0, 0, 0, 222, 0, 223, 0, 0, 0, 53, 
-  49, 52, 50, 224, 54, 225, 55, 226, 57, 227, 
-  58, 228, 229, 0, 0, 44, 56, 32, 214, 216, 
-  0, 41, 0, 0, 0, 0, 0, 0, 46, 34, 
-  51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  600, 112, 113, 0, 0, 602, 117, 604, 30, 31, 
-  605, 0, 120, 0, 0, 0, 122, 607, 608, 0, 
-  0, 0, 0, 0, 0, 35, 609, 126, 127, 221, 
-  37, 0, 38, 0, 0, 0, 39, 0, 40, 610, 
-  43, 0, 0, 612, 0, 0, 0, 47, 0, 48, 
-  0, 0, 0, 0, 0, 613, 0, 223, 0, 0, 
-  0, 614, 49, 52, 50, 615, 616, 617, 55, 619, 
-  620, 621, 622, 623, 624, 0, 0, 611, 618, 606, 
-  601, 603, 130, 41, 0, 0, 0, 0, 0, 0, 
-  46, 374, 380, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 365, 112, 113, 0, 0, 367, 117, 369, 
-  30, 31, 370, 0, 120, 0, 0, 0, 122, 372, 
-  373, 0, 0, 0, 0, 0, 0, 35, 375, 126, 
-  127, 221, 37, 0, 38, 0, 0, 0, 39, 0, 
-  40, 376, 43, 0, 0, 378, 0, 0, 0, 47, 
-  0, 48, 0, -277, 0, 0, 0, 379, 0, 223, 
-  0, 0, 0, 381, 49, 52, 50, 382, 383, 384, 
-  55, 386, 387, 388, 389, 390, 391, 0, 0, 377, 
-  385, 371, 366, 368, 130, 41, 0, 0, 0, 0, 
-  0, 0, 46, 374, 380, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 111, 112, 
+  113, 0, 0, 115, 117, 118, 0, 0, 119, 0, 
+  120, 0, 0, 0, 122, 123, 124, 0, 0, 0, 
+  0, 0, 0, 35, 125, 126, 127, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 
+  0, 395, 0, 0, 0, 0, 0, 0, 0, 396, 
+  0, 0, 0, 131, 0, 0, 0, 0, 0, 397, 
+  49, 52, 50, 132, 133, 134, 0, 136, 137, 138, 
+  139, 140, 141, 0, 0, 129, 135, 121, 114, 116, 
+  130, 0, 0, 0, 0, 0, 0, 0, 46, 374, 
+  380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  213, 0, 0, 0, 0, 215, 0, 29, 30, 31, 
+  217, 0, 0, 0, 0, 0, 0, 218, 33, 0, 
+  0, 0, 0, 0, 0, 35, 220, 0, 0, 221, 
+  37, 0, 38, 0, 0, 0, 39, 0, 40, 42, 
+  43, 0, 0, 45, 0, 0, 0, 47, 0, 48, 
+  0, 0, 0, 0, 0, 222, 0, 223, 0, 0, 
+  0, 53, 49, 52, 50, 224, 54, 225, 55, 226, 
+  57, 227, 58, 228, 229, 0, 0, 44, 56, 32, 
+  214, 216, 0, 41, 0, 0, 0, 0, 0, 0, 
+  46, 34, 51, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 213, 0, 0, 0, 0, 215, 0, 29, 
+  30, 31, 217, 0, 0, 0, 0, 0, 0, 218, 
+  219, 0, 0, 0, 0, 0, 0, 35, 220, 0, 
+  0, 221, 37, 0, 38, 0, 0, 0, 39, 0, 
+  40, 42, 43, 0, 0, 45, 0, 0, 0, 47, 
+  0, 48, 0, 0, 0, 0, 0, 222, 0, 223, 
+  0, 0, 0, 53, 49, 52, 50, 224, 54, 225, 
+  55, 226, 57, 227, 58, 228, 229, 0, 0, 44, 
+  56, 32, 214, 216, 0, 41, 0, 0, 0, 0, 
+  0, 0, 46, 34, 51, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 582, 112, 113, 0, 0, 584, 
+  117, 586, 30, 31, 587, 0, 120, 0, 0, 0, 
+  122, 589, 590, 0, 0, 0, 0, 0, 0, 35, 
+  591, 126, 127, 221, 37, 0, 38, 0, 0, 0, 
+  39, 0, 40, 592, 43, 0, 0, 594, 0, 0, 
+  0, 47, 0, 48, 0, 0, 0, 0, 0, 595, 
+  0, 223, 0, 0, 0, 596, 49, 52, 50, 597, 
+  598, 599, 55, 601, 602, 603, 604, 605, 606, 0, 
+  0, 593, 600, 588, 583, 585, 130, 41, 0, 0, 
+  0, 0, 0, 0, 46, 374, 380, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 365, 112, 113, 0, 
+  0, 367, 117, 369, 30, 31, 370, 0, 120, 0, 
+  0, 0, 122, 372, 373, 0, 0, 0, 0, 0, 
+  0, 35, 375, 126, 127, 221, 37, 0, 38, 0, 
+  0, 0, 39, 0, 40, 376, 43, 0, 0, 378, 
+  0, 0, 0, 47, 0, 48, 0, -278, 0, 0, 
+  0, 379, 0, 223, 0, 0, 0, 381, 49, 52, 
+  50, 382, 383, 384, 55, 386, 387, 388, 389, 390, 
+  391, 0, 0, 377, 385, 371, 366, 368, 130, 41, 
+  0, 0, 0, 0, 0, 0, 46, 374, 380, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
 
-  148, 142, 183, 447, 469, 347, 575, 444, 547, 627, 
-  248, 320, 587, 572, 584, 586, 485, 591, 565, 529, 
-  313, 545, 447, 393, 253, 528, 500, 183, 574, 453, 
-  331, 652, 447, 437, 444, 313, 462, 455, 263, 457, 
-  237, 441, 206, 188, 190, 150, 16, 178, 433, 630, 
-  425, 641, 165, 400, 658, 458, 642, 171, 173, 248, 
-  475, 351, 498, 248, 253, 313, 183, 466, 183, 541, 
-  495, 629, 253, 512, 511, 188, 145, 206, 260, 645, 
-  644, 62, 0, 62, 362, 507, 298, 469, 206, 206, 
-  247, 514, 514, 62, 206, 460, 646, 409, 152, 409, 
-  599, 628, 355, 239, 206, 62, 62, 62, 362, 260, 
-  296, 297, 299, 331, 62, 62, 313, 504, 206, 295, 
-  62, 62, 459, 460, 356, 206, 277, 62, 62, 502, 
-  182, 281, 206, 62, 410, 182, 410, 401, 62, 353, 
-  459, 62, 62, 506, 505, 62, 62, 503, 493, 349, 
-  91, 62, 492, 206, 63, 206, 313, 62, 345, 483, 
-  393, 479, 62, 62, 260, 206, 444, 206, 510, 102, 
-  148, 62, 104, 182, 206, 188, 188, 468, 180, 170, 
-  206, 62, 148, 247, 62, 394, 460, 393, 409, 340, 
-  412, 341, 362, 206, 422, 167, 393, 206, 62, 108, 
-  459, 313, 62, 187, 419, 62, 62, 86, 206, 62, 
-  318, 98, 100, 403, 62, 99, 69, 322, 514, 514, 
-  313, 62, 417, 553, 557, 410, 206, 79, 110, 246, 
-  62, 343, 206, 206, 62, 0, 70, 62, 74, 71, 
-  62, 62, 206, 108, 90, 206, 93, 62, 62, 62, 
-  72, 62, 92, 62, 94, 62, 95, 309, 96, 407, 
-  97, 309, 281, 62, 362, 362, 281, 0, 281, 242, 
-  302, 0, 110, 177, 464, 0, 316, 309, 0, 308, 
-  206, 206, 281, 311, 309, 0, 62, 62, 309, 281, 
-  206, 281, 281, 281, 0, 314, 0, 0, 62, 330, 
-  62, 324, 0, 281, 327, 281, 337, 300, 62, 62, 
-  328, 304, 62, 281, 281, 301, 564, 281, 62, 289, 
-  306, 569, 561, 281, 0, 514, 553, 284, 625, 0, 
-  0, 514, 0, 0, 522, 0, 0, 0, 0, 0, 
-  522, 0, 0, 0, 0, 0, 513, 523, 0, 485, 
-  443, 440, 513, 523, 533, 534, 535, 536, 540, 537, 
-  538, 577, 533, 534, 535, 536, 540, 537, 538, 0, 
+  545, 572, 565, 632, 654, 148, 529, 541, 528, 142, 
+  660, 263, 500, 393, 617, 616, 621, 614, 16, 629, 
+  444, 183, 313, 547, 447, 183, 631, 643, 253, 248, 
+  644, 485, 575, 574, 607, 152, 320, 437, 178, 313, 
+  441, 433, 173, 183, 165, 253, 462, 313, 457, 447, 
+  444, 453, 253, 458, 425, 347, 455, 248, 351, 188, 
+  475, 466, 498, 171, 150, 447, 206, 190, 400, 468, 
+  0, 183, 248, 495, 469, 237, 409, 393, 409, 331, 
+  464, 247, 512, 206, 145, 206, 62, 409, 507, 206, 
+  0, 511, 0, 188, 0, 206, 206, 188, 206, 62, 
+  62, 504, 460, 417, 62, 206, 505, 206, 647, 646, 
+  407, 0, 0, 410, 62, 410, 459, 62, 148, 506, 
+  62, 187, 62, 277, 410, 419, 412, 298, 281, 393, 
+  148, 0, 0, 0, 422, 62, 170, 62, 180, 62, 
+  295, 514, 296, 260, 297, 62, 648, 503, 62, 62, 
+  62, 182, 514, 299, 394, 62, 62, 460, 459, 206, 
+  362, 630, 362, 62, 167, 502, 514, 62, 62, 322, 
+  62, 553, 444, 99, 100, 93, 206, 62, 356, 206, 
+  510, 206, 94, 62, 62, 206, 62, 62, 95, 96, 
+  62, 97, 86, 62, 90, 493, 62, 91, 188, 492, 
+  92, 355, 62, 353, 108, 62, 483, 349, 242, 345, 
+  247, 313, 331, 469, 102, 104, 313, 206, 62, 206, 
+  182, 260, 62, 206, 206, 206, 239, 62, 98, 182, 
+  313, 313, 62, 110, 362, 72, 62, 206, 69, 62, 
+  318, 70, 62, 62, 71, 260, 63, 62, 246, 393, 
+  581, 62, 62, 460, 0, 74, 206, 62, 79, 459, 
+  0, 206, 514, 309, 206, 62, 362, 557, 281, 0, 
+  281, 309, 62, 0, 284, 403, 281, 281, 0, 309, 
+  401, 0, 206, 306, 281, 308, 343, 479, 340, 62, 
+  62, 341, 108, 337, 281, 281, 206, 302, 309, 62, 
+  0, 330, 304, 281, 281, 314, 316, 62, 309, 0, 
+  62, 62, 281, 281, 324, 281, 281, 301, 300, 514, 
+  311, 110, 177, 0, 327, 0, 62, 569, 522, 564, 
+  328, 281, 553, 289, 627, 561, 0, 0, 514, 0, 
+  513, 523, 0, 0, 514, 0, 0, 522, 0, 0, 
+  0, 0, 443, 522, 0, 485, 0, 0, 0, 513, 
+  523, 0, 0, 0, 0, 513, 523, 533, 534, 535, 
+  536, 540, 537, 538, 0, 0, 0, 0, 0, 0, 
+  0, 577, 0, 0, 0, 0, 0, 0, 0, 362, 
+  579, 580, 533, 534, 535, 536, 540, 537, 538, 569, 
+  0, 0, 0, 0, 0, 206, 0, 0, 570, 571, 
+  533, 534, 535, 536, 540, 537, 538, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 514, 569, 0, 0, 0, 0, 0, 
-  0, 0, 522, 570, 571, 533, 534, 535, 536, 540, 
-  537, 538, 0, 0, 513, 523, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 577, 0, 
+  0, 0, 0, 0, 0, 0, 0, 625, 626, 533, 
+  534, 535, 536, 540, 537, 538, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  594, 0, 0, 0, 0, 0, 0, 0, 0, 597, 
-  598, 533, 534, 535, 536, 540, 537, 538, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0};
+  0, 0, 0, 0, 0};
 
 const short QQmlJSGrammar::action_check [] = {
-  2, 55, 34, 7, 60, 36, 31, 37, 61, 17, 
-  24, 16, 2, 20, 33, 60, 5, 8, 36, 79, 
-  60, 36, 33, 33, 7, 48, 55, 1, 55, 0, 
-  33, 7, 60, 33, 60, 36, 60, 36, 8, 7, 
-  36, 8, 7, 55, 7, 5, 55, 33, 7, 7, 
-  48, 7, 36, 7, 36, 5, 7, 36, 1, 36, 
-  7, 36, 7, 7, 61, 7, 60, 33, 8, 1, 
-  7, 77, 36, 7, 36, 60, 7, 29, 8, 36, 
-  7, 36, 55, 36, 79, 33, 79, 36, 66, 8, 
-  36, 60, 33, 17, 33, 7, 2, 8, 36, 79, 
-  36, 2, 7, 7, 7, 66, 8, 33, 33, 7, 
-  -1, 33, 8, 48, 8, 15, 15, 33, 36, 36, 
-  33, 8, 55, 7, 8, 8, 15, 6, 48, 10, 
-  8, 60, 8, 61, 34, 34, 8, 60, 8, 60, 
-  55, 20, 8, -1, 8, 34, 8, 61, 62, 8, 
-  40, 61, 62, 61, 62, 50, 42, 8, 60, 54, 
-  56, 51, 7, -1, 61, 62, 60, 53, 61, 62, 
-  61, 62, 8, 60, 55, 40, 29, 60, 56, -1, 
-  56, 29, 91, 92, 61, 62, 51, 61, 62, 61, 
-  60, 40, 56, 15, 60, 50, -1, 56, 60, 54, 
-  61, 62, 51, 1, 61, 62, 91, 92, 40, 60, 
-  29, 25, 34, 27, 36, -1, 61, 62, 12, 51, 
-  61, 62, 75, 12, 38, 61, 62, 75, 25, 25, 
-  27, 27, 25, 86, 27, 12, 7, 25, 86, 27, 
-  15, 38, 38, 29, 25, 38, 27, 25, 89, 27, 
-  38, 25, 25, 27, 27, 7, 75, 38, 15, 34, 
-  38, 36, 8, 57, 38, 38, 29, 86, 57, 63, 
-  61, 62, 36, 29, 63, 8, -1, 34, -1, 36, 
-  57, 25, 25, 27, 27, -1, 63, -1, -1, 75, 
-  61, 62, 15, -1, 38, 38, -1, 61, 62, -1, 
-  86, 25, 93, 27, 25, -1, 27, -1, 7, 61, 
-  62, 34, 75, 36, 38, 61, 62, 38, 47, 75, 
-  18, 19, -1, 86, 18, 19, 18, 19, 61, 62, 
-  86, -1, 61, 62, 33, 18, 19, 98, 99, 100, 
-  101, 102, 103, -1, -1, -1, -1, 45, 46, -1, 
-  -1, 45, 46, 45, 46, -1, 23, 24, -1, -1, 
-  23, 24, 45, 46, 93, 32, 23, 24, 35, 32, 
-  37, -1, 35, -1, 37, 32, 23, 24, 35, -1, 
-  37, 29, 23, 24, 29, 32, -1, -1, 35, -1, 
-  37, 32, 23, 24, 35, 94, 37, 29, -1, -1, 
-  31, 32, 23, 24, 35, 29, 37, 15, -1, -1, 
-  31, 32, -1, -1, 35, 29, 37, -1, 66, 67, 
-  68, 66, 67, 68, -1, 33, 34, -1, 36, 29, 
-  -1, -1, -1, -1, 66, 67, 68, 29, -1, -1, 
-  -1, -1, 66, 67, 68, -1, 94, 95, 96, 94, 
-  95, 96, 66, 67, 68, -1, -1, -1, -1, -1, 
-  -1, -1, 94, 95, 96, -1, 66, 67, 68, -1, 
-  94, 95, 96, -1, 66, 67, 68, 29, -1, -1, 
-  94, 95, 96, 29, -1, -1, 29, -1, -1, 29, 
-  -1, -1, 29, -1, 94, 95, 96, 29, 23, 24, 
-  29, -1, 94, 95, 96, -1, 31, 32, -1, -1, 
-  35, -1, 37, -1, 66, 67, 68, -1, -1, -1, 
-  66, 67, 68, 66, 67, 68, 66, 67, 68, 66, 
-  67, 68, -1, 29, 66, 67, 68, 66, 67, 68, 
-  36, -1, 94, 95, 96, -1, -1, -1, 94, 95, 
-  96, 94, 95, 96, 94, 95, 96, 94, 95, 96, 
-  -1, -1, 94, 95, 96, 94, 95, 96, 29, -1, 
-  66, 67, 68, 29, -1, 36, 29, -1, -1, -1, 
-  36, 29, -1, -1, 29, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 94, 95, 
-  96, -1, -1, -1, -1, 66, 67, 68, 61, 62, 
-  66, 67, 68, 66, 67, 68, 61, 62, 66, 67, 
-  68, 66, 67, 68, -1, -1, -1, 29, -1, -1, 
+  36, 60, 5, 36, 31, 7, 66, 16, 33, 7, 
+  36, 7, 7, 7, 7, 33, 36, 7, 55, 8, 
+  36, 7, 7, 36, 7, 55, 7, 7, 36, 36, 
+  17, 7, 33, 33, 7, 7, 7, 36, 7, 36, 
+  7, 7, 34, 60, 55, 36, 7, 66, 60, 33, 
+  55, 33, 7, 77, 33, 8, 60, 20, 36, 33, 
+  1, 36, 8, 33, 7, 33, 2, 55, 33, 33, 
+  29, 1, 24, 33, 8, 1, -1, 2, 55, -1, 
+  37, 8, 36, -1, -1, -1, 8, 36, 36, 33, 
+  7, 2, 48, 1, 36, 7, 36, 36, 60, 36, 
+  33, 17, 60, 8, 0, 36, 8, 2, -1, 60, 
+  60, 8, 6, -1, 61, 7, 8, 8, 33, 8, 
+  -1, 8, 60, 55, 48, 60, 20, 48, 8, 36, 
+  8, 10, 8, 61, 79, 55, -1, -1, 48, 8, 
+  8, 40, 40, 61, 8, 8, 60, 5, 61, 62, 
+  79, 60, 51, 51, 56, 40, 79, 61, 62, 40, 
+  79, 61, 62, 60, 50, 8, 51, 56, 54, 60, 
+  51, 61, 62, 60, 8, 50, 55, 61, 62, 54, 
+  60, 29, 60, 42, 60, 91, 92, 56, 56, 61, 
+  62, 61, 62, 56, 53, 15, 60, 8, 7, 61, 
+  62, 61, 62, 29, 61, 62, 29, 25, 8, 27, 
+  7, -1, 15, 29, 34, 8, 36, 25, 61, 27, 
+  38, 12, -1, 25, 33, 27, 60, 75, 12, 36, 
+  38, 34, 89, 36, 29, 7, 38, 29, 86, -1, 
+  25, 12, 27, 25, 25, 27, 27, 7, 15, 75, 
+  61, 62, 75, 38, 61, 62, 38, 38, -1, 75, 
+  86, 61, 62, 86, 61, 62, 57, 34, 61, 62, 
+  86, -1, 63, 57, 15, 61, 62, 15, -1, 63, 
+  75, 18, 19, 75, -1, 94, 57, 18, 19, 61, 
+  62, 86, 63, 34, 86, 36, 34, 47, 36, 18, 
+  19, 61, 62, 15, -1, 18, 19, 93, 45, 46, 
+  15, 61, 62, -1, 45, 46, -1, -1, -1, -1, 
+  -1, 33, 34, -1, 36, -1, 45, 46, 33, 34, 
+  -1, 36, 45, 46, -1, 23, 24, -1, -1, 25, 
+  -1, 27, -1, 93, 32, 23, 24, 35, 29, 37, 
+  -1, -1, 38, 31, 32, -1, -1, 35, 29, 37, 
+  23, 24, 98, 99, 100, 101, 102, 103, 31, 32, 
+  23, 24, 35, 29, 37, -1, -1, -1, 31, 32, 
+  23, 24, 35, -1, 37, 66, 67, 68, 31, 32, 
+  23, 24, 35, -1, 37, 66, 67, 68, 31, 32, 
+  -1, -1, 35, -1, 37, 29, -1, -1, 29, -1, 
+  66, 67, 68, 94, 95, 96, 29, -1, -1, 29, 
+  23, 24, 29, 94, 95, 96, -1, -1, 29, 32, 
+  -1, -1, 35, -1, 37, 36, -1, -1, 94, 95, 
+  96, 29, 66, 67, 68, 66, 67, 68, 36, -1, 
+  -1, -1, -1, 66, 67, 68, 66, 67, 68, 66, 
+  67, 68, 29, -1, -1, 66, 67, 68, -1, 36, 
+  94, 95, 96, 94, 95, 96, -1, -1, 66, 67, 
+  68, 94, 95, 96, 94, 95, 96, 94, 95, 96, 
+  -1, -1, -1, 94, 95, 96, -1, -1, 29, 66, 
+  67, 68, -1, 29, -1, -1, 94, 95, 96, -1, 
+  -1, 29, -1, -1, -1, -1, -1, -1, -1, 29, 
+  -1, -1, -1, -1, -1, -1, -1, 94, 95, 96, 
+  61, 62, -1, -1, -1, 66, 67, 68, -1, -1, 
+  66, 67, 68, 61, 62, -1, -1, -1, 66, 67, 
+  68, 61, 62, -1, -1, -1, 66, 67, 68, -1, 
   -1, -1, -1, 94, 95, 96, -1, -1, 94, 95, 
-  96, 94, 95, 96, -1, -1, 94, 95, 96, 94, 
-  95, 96, -1, -1, -1, -1, -1, -1, 29, 61, 
-  62, -1, -1, -1, 66, 67, 68, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  96, -1, -1, -1, -1, -1, 94, 95, 96, -1, 
+  29, -1, -1, -1, 94, 95, 96, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  61, 62, 94, 95, 96, 66, 67, 68, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 94, 95, 96, -1, -1, -1, -1, 
-  -1, -1, -1, 12, 13, 3, -1, -1, -1, -1, 
-  -1, -1, -1, 22, -1, 13, -1, -1, -1, 17, 
-  29, -1, -1, -1, 33, 34, -1, 36, 26, -1, 
-  28, -1, -1, -1, 43, -1, -1, -1, 47, -1, 
-  -1, 39, -1, 41, 42, -1, -1, -1, -1, -1, 
-  -1, 49, -1, -1, 52, 53, 65, 66, 67, 68, 
-  58, 70, -1, -1, -1, -1, 64, -1, -1, -1, 
-  -1, -1, 81, 82, 83, -1, -1, -1, 87, -1, 
-  -1, -1, 80, -1, -1, 94, 95, 96, -1, -1, 
-  -1, -1, -1, -1, -1, 12, 13, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 22, -1, -1, 3, -1, 
-  -1, -1, 29, -1, -1, -1, 33, 34, 13, 36, 
-  -1, -1, 17, -1, -1, -1, 43, -1, -1, -1, 
-  47, 26, -1, 28, -1, -1, 31, -1, -1, -1, 
-  -1, -1, -1, -1, 39, -1, 41, 42, 65, 66, 
-  67, 68, -1, 70, 49, -1, -1, 52, 53, -1, 
-  -1, -1, -1, 58, 81, 82, 83, -1, -1, 64, 
-  87, -1, -1, -1, -1, -1, -1, 94, 95, 96, 
-  -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, 61, 62, 3, -1, -1, 66, 67, 68, 
+  -1, -1, -1, -1, 13, -1, -1, -1, 17, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 26, -1, 28, 
+  -1, -1, 31, -1, -1, 94, 95, 96, -1, -1, 
+  39, -1, 41, 42, -1, 12, 13, 3, -1, -1, 
+  49, -1, -1, 52, 53, 22, -1, 13, -1, 58, 
+  -1, 17, 29, -1, -1, 64, 33, 34, -1, 36, 
+  26, -1, 28, -1, -1, -1, 43, -1, -1, -1, 
+  47, 80, -1, 39, -1, 41, 42, -1, -1, -1, 
+  -1, -1, -1, 49, -1, -1, 52, 53, 65, 66, 
+  67, 68, 58, 70, -1, -1, -1, -1, 64, -1, 
+  -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, 
+  87, -1, -1, -1, 80, -1, -1, 94, 95, 96, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 22, -1, -1, -1, -1, -1, -1, 29, -1, 
-  -1, -1, 33, 34, -1, 36, -1, -1, -1, -1, 
-  -1, -1, 43, -1, -1, -1, 47, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 65, 66, 67, 68, -1, 70, 
+  12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 
+  22, -1, -1, -1, -1, -1, -1, 29, -1, -1, 
+  -1, 33, 34, -1, 36, -1, -1, -1, -1, -1, 
+  -1, 43, -1, -1, -1, 47, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  81, 82, 83, -1, -1, -1, 87, -1, -1, -1, 
-  -1, -1, -1, 94, 95, 96, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12, 13, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, 
-  -1, -1, 29, -1, -1, -1, 33, 34, -1, 36, 
-  -1, -1, -1, -1, -1, -1, 43, -1, -1, -1, 
-  47, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 65, 66, 
-  67, 68, -1, 70, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, 
-  87, -1, -1, -1, -1, -1, -1, 94, 95, 96, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 
-  -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 22, -1, -1, -1, -1, -1, -1, 29, -1, 
-  -1, -1, 33, 34, -1, 36, -1, -1, -1, -1, 
-  -1, -1, 43, -1, -1, -1, 47, -1, -1, -1, 
+  -1, -1, -1, 65, 66, 67, 68, -1, 70, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 
+  82, 83, -1, -1, -1, 87, -1, -1, -1, -1, 
+  -1, -1, 94, 95, 96, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, 12, 13, -1, -1, -1, -1, 
+  -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 
+  -1, 29, -1, -1, -1, 33, 34, -1, 36, -1, 
+  -1, -1, -1, -1, -1, 43, -1, -1, -1, 47, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 65, 66, 67, 68, -1, 70, 
-  -1, -1, -1, -1, 75, -1, -1, -1, -1, -1, 
-  81, 82, 83, 84, -1, -1, 87, -1, -1, -1, 
-  -1, -1, -1, 94, 95, 96, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 10, -1, 12, 13, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 
-  -1, -1, -1, -1, 29, -1, -1, -1, 33, 34, 
-  -1, 36, -1, -1, -1, -1, -1, -1, 43, -1, 
-  -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, 
-  55, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  65, 66, 67, 68, -1, 70, -1, -1, -1, -1, 
-  75, -1, -1, -1, -1, -1, 81, 82, 83, 84, 
-  -1, -1, 87, -1, -1, -1, -1, -1, -1, 94, 
-  95, 96, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 10, -1, 12, 13, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, 
-  29, -1, -1, -1, 33, 34, -1, 36, -1, -1, 
-  -1, -1, -1, -1, 43, -1, -1, -1, 47, -1, 
-  -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 65, 66, 67, 68, 
-  -1, 70, -1, -1, -1, -1, 75, -1, -1, -1, 
-  -1, -1, 81, 82, 83, 84, -1, -1, 87, -1, 
-  -1, -1, -1, -1, -1, 94, 95, 96, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 11, 12, 13, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 
-  -1, -1, -1, -1, -1, 29, -1, -1, -1, 33, 
-  34, -1, 36, -1, -1, -1, 40, -1, 42, 43, 
-  44, -1, -1, 47, -1, -1, -1, 51, -1, 53, 
+  -1, -1, -1, -1, -1, -1, -1, 65, 66, 67, 
+  68, -1, 70, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, 81, 82, 83, -1, -1, -1, 87, 
+  -1, -1, -1, -1, -1, -1, 94, 95, 96, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 10, -1, 
+  12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 
+  22, -1, -1, -1, -1, -1, -1, 29, -1, -1, 
+  -1, 33, 34, -1, 36, -1, -1, -1, -1, -1, 
+  -1, 43, -1, -1, -1, 47, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 65, 66, 67, 68, -1, 70, -1, 72, -1, 
-  74, -1, 76, -1, -1, -1, -1, 81, 82, 83, 
-  -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, 
-  94, 95, 96, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7, -1, -1, -1, 11, 12, 13, -1, 
+  -1, -1, -1, 65, 66, 67, 68, -1, 70, -1, 
+  -1, -1, -1, 75, -1, -1, -1, -1, -1, 81, 
+  82, 83, 84, -1, -1, 87, -1, -1, -1, -1, 
+  -1, -1, 94, 95, 96, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, 10, -1, 12, 13, -1, -1, 
+  -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, 
+  -1, -1, -1, 29, -1, -1, -1, 33, 34, -1, 
+  36, -1, -1, -1, -1, -1, -1, 43, -1, -1, 
+  -1, 47, -1, -1, -1, -1, -1, -1, -1, 55, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 
+  66, 67, 68, -1, 70, -1, -1, -1, -1, 75, 
+  -1, -1, -1, -1, -1, 81, 82, 83, 84, -1, 
+  -1, 87, -1, -1, -1, -1, -1, -1, 94, 95, 
+  96, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  10, -1, 12, 13, -1, -1, -1, -1, -1, -1, 
+  -1, -1, 22, -1, -1, -1, -1, -1, -1, 29, 
+  -1, -1, -1, 33, 34, -1, 36, -1, -1, -1, 
+  -1, -1, -1, 43, -1, -1, -1, 47, -1, -1, 
+  -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 65, 66, 67, 68, -1, 
+  70, -1, -1, -1, -1, 75, -1, -1, -1, -1, 
+  -1, 81, 82, 83, 84, -1, -1, 87, -1, -1, 
+  -1, -1, -1, -1, 94, 95, 96, -1, -1, -1, 
+  -1, -1, -1, -1, -1, -1, 11, 12, 13, -1, 
   -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 
   -1, -1, -1, -1, 29, -1, -1, -1, 33, 34, 
   -1, 36, -1, -1, -1, 40, -1, 42, 43, 44, 
@@ -879,101 +844,100 @@ const short QQmlJSGrammar::action_check [] = {
   -1, 76, -1, -1, -1, -1, 81, 82, 83, -1, 
   -1, -1, 87, -1, -1, -1, -1, -1, -1, 94, 
   95, 96, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 22, -1, -1, -1, -1, -1, -1, 29, 
-  -1, -1, -1, 33, 34, -1, 36, -1, -1, -1, 
-  40, -1, 42, 43, 44, -1, -1, 47, -1, -1, 
-  -1, 51, -1, 53, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 65, 66, 67, 68, -1, 
-  70, -1, 72, -1, 74, 75, 76, -1, -1, -1, 
-  -1, 81, 82, 83, -1, -1, -1, 87, -1, -1, 
-  -1, -1, -1, -1, 94, 95, 96, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 8, -1, -1, 11, 
-  12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 
-  22, -1, -1, -1, -1, -1, -1, 29, -1, -1, 
-  -1, 33, 34, -1, 36, -1, -1, -1, 40, -1, 
-  42, 43, 44, -1, -1, 47, -1, -1, -1, 51, 
-  -1, 53, -1, -1, 56, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 65, 66, 67, 68, -1, 70, -1, 
-  72, -1, 74, -1, 76, -1, -1, -1, -1, 81, 
-  82, 83, -1, -1, -1, 87, -1, -1, -1, -1, 
-  -1, -1, 94, 95, 96, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8, -1, -1, 11, 12, 13, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 
-  -1, -1, -1, -1, -1, 29, -1, -1, -1, 33, 
-  34, -1, 36, -1, -1, -1, 40, -1, 42, 43, 
-  44, -1, -1, 47, -1, -1, -1, 51, -1, 53, 
-  -1, -1, 56, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 65, 66, 67, 68, -1, 70, -1, 72, -1, 
-  74, -1, 76, -1, -1, -1, -1, 81, 82, 83, 
-  -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, 
-  94, 95, 96, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 8, -1, -1, 11, 12, 13, -1, -1, 
+  -1, 7, -1, -1, -1, 11, 12, 13, -1, -1, 
   -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, 
   -1, -1, -1, 29, -1, -1, -1, 33, 34, -1, 
   36, -1, -1, -1, 40, -1, 42, 43, 44, -1, 
   -1, 47, -1, -1, -1, 51, -1, 53, -1, -1, 
-  56, -1, -1, -1, -1, -1, -1, -1, -1, 65, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 
   66, 67, 68, -1, 70, -1, 72, -1, 74, -1, 
   76, -1, -1, -1, -1, 81, 82, 83, -1, -1, 
   -1, 87, -1, -1, -1, -1, -1, -1, 94, 95, 
   96, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  8, -1, -1, 11, 12, 13, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 
-  -1, 29, -1, -1, -1, 33, 34, -1, 36, -1, 
-  -1, -1, 40, -1, 42, 43, 44, -1, -1, 47, 
-  -1, -1, -1, 51, -1, 53, -1, -1, 56, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 65, 66, 67, 
-  68, -1, 70, -1, 72, -1, 74, -1, 76, -1, 
-  -1, -1, -1, 81, 82, 83, -1, -1, -1, 87, 
-  -1, -1, -1, -1, -1, -1, 94, 95, 96, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 11, 12, 
+  11, 12, 13, -1, -1, -1, -1, -1, -1, -1, 
+  -1, 22, -1, -1, -1, -1, -1, -1, 29, -1, 
+  -1, -1, 33, 34, -1, 36, -1, -1, -1, 40, 
+  -1, 42, 43, 44, -1, -1, 47, -1, -1, -1, 
+  51, -1, 53, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, 65, 66, 67, 68, -1, 70, 
+  -1, 72, -1, 74, 75, 76, -1, -1, -1, -1, 
+  81, 82, 83, -1, -1, -1, 87, -1, -1, -1, 
+  -1, -1, -1, 94, 95, 96, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 8, -1, -1, 11, 12, 
   13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 
-  -1, -1, -1, -1, -1, -1, 29, 30, -1, -1, 
+  -1, -1, -1, -1, -1, -1, 29, -1, -1, -1, 
   33, 34, -1, 36, -1, -1, -1, 40, -1, 42, 
   43, 44, -1, -1, 47, -1, -1, -1, 51, -1, 
-  53, -1, -1, -1, -1, -1, -1, -1, 61, -1, 
-  -1, -1, 65, 66, 67, 68, 69, 70, -1, 72, 
-  73, 74, -1, 76, -1, 78, -1, -1, 81, 82, 
+  53, -1, -1, 56, -1, -1, -1, -1, -1, -1, 
+  -1, -1, 65, 66, 67, 68, -1, 70, -1, 72, 
+  -1, 74, -1, 76, -1, -1, -1, -1, 81, 82, 
   83, -1, -1, -1, 87, -1, -1, -1, -1, -1, 
   -1, 94, 95, 96, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 11, 12, 13, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 
-  -1, 29, 30, -1, -1, 33, 34, -1, 36, -1, 
-  -1, -1, 40, -1, 42, 43, 44, -1, -1, 47, 
-  -1, -1, -1, 51, -1, 53, -1, -1, -1, -1, 
-  -1, -1, -1, 61, -1, -1, -1, 65, 66, 67, 
-  68, 69, 70, -1, 72, 73, 74, -1, 76, -1, 
-  78, -1, -1, 81, 82, 83, -1, -1, -1, 87, 
-  -1, -1, -1, -1, -1, -1, 94, 95, 96, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 4, 5, 
-  6, -1, -1, 9, 10, 11, -1, -1, 14, -1, 
-  16, -1, -1, -1, 20, 21, 22, -1, -1, -1, 
-  -1, -1, -1, 29, 30, 31, 32, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 43, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, 
-  66, 67, 68, 69, 70, 71, -1, 73, 74, 75, 
-  76, 77, 78, -1, -1, 81, 82, 83, 84, 85, 
-  86, -1, -1, -1, -1, -1, -1, -1, 94, 95, 
-  96, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  4, 5, 6, -1, -1, 9, 10, 11, -1, -1, 
-  14, -1, 16, -1, -1, -1, 20, 21, 22, -1, 
-  -1, -1, -1, -1, -1, 29, 30, 31, 32, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, 
-  -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, 
-  -1, 65, 66, 67, 68, 69, 70, 71, -1, 73, 
-  74, 75, 76, 77, 78, -1, -1, 81, 82, 83, 
-  84, 85, 86, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, 8, -1, -1, 11, 12, 13, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 
+  -1, -1, -1, -1, 29, -1, -1, -1, 33, 34, 
+  -1, 36, -1, -1, -1, 40, -1, 42, 43, 44, 
+  -1, -1, 47, -1, -1, -1, 51, -1, 53, -1, 
+  -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, 
+  65, 66, 67, 68, -1, 70, -1, 72, -1, 74, 
+  -1, 76, -1, -1, -1, -1, 81, 82, 83, -1, 
+  -1, -1, 87, -1, -1, -1, -1, -1, -1, 94, 
+  95, 96, -1, -1, -1, -1, -1, -1, -1, -1, 
+  -1, 8, -1, -1, 11, 12, 13, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, 
+  -1, -1, 29, -1, -1, -1, 33, 34, -1, 36, 
+  -1, -1, -1, 40, -1, 42, 43, 44, -1, -1, 
+  47, -1, -1, -1, 51, -1, 53, -1, -1, 56, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 65, 66, 
+  67, 68, -1, 70, -1, 72, -1, 74, -1, 76, 
+  -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, 
+  87, -1, -1, -1, -1, -1, -1, 94, 95, 96, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 
+  -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, 
+  -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, 
+  29, -1, -1, -1, 33, 34, -1, 36, -1, -1, 
+  -1, 40, -1, 42, 43, 44, -1, -1, 47, -1, 
+  -1, -1, 51, -1, 53, -1, -1, 56, -1, -1, 
+  -1, -1, -1, -1, -1, -1, 65, 66, 67, 68, 
+  -1, 70, -1, 72, -1, 74, -1, 76, -1, -1, 
+  -1, -1, 81, 82, 83, -1, -1, -1, 87, -1, 
+  -1, -1, -1, -1, -1, 94, 95, 96, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 11, 12, 13, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 
+  -1, -1, -1, -1, -1, 29, 30, -1, -1, 33, 
+  34, -1, 36, -1, -1, -1, 40, -1, 42, 43, 
+  44, -1, -1, 47, -1, -1, -1, 51, -1, 53, 
+  -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, 
+  -1, 65, 66, 67, 68, 69, 70, -1, 72, 73, 
+  74, -1, 76, -1, 78, -1, -1, 81, 82, 83, 
+  -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, 
+  94, 95, 96, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, 
+  -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, 
+  29, 30, -1, -1, 33, 34, -1, 36, -1, -1, 
+  -1, 40, -1, 42, 43, 44, -1, -1, 47, -1, 
+  -1, -1, 51, -1, 53, -1, -1, -1, -1, -1, 
+  -1, -1, 61, -1, -1, -1, 65, 66, 67, 68, 
+  69, 70, -1, 72, 73, 74, -1, 76, -1, 78, 
+  -1, -1, 81, 82, 83, -1, -1, -1, 87, -1, 
+  -1, -1, -1, -1, -1, 94, 95, 96, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 11, 12, 13, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 
+  -1, -1, -1, -1, -1, 29, 30, -1, -1, 33, 
+  34, -1, 36, -1, -1, -1, 40, -1, 42, 43, 
+  44, -1, -1, 47, -1, -1, -1, 51, -1, 53, 
+  -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, 
+  -1, 65, 66, 67, 68, 69, 70, -1, 72, 73, 
+  74, -1, 76, -1, 78, -1, -1, 81, 82, 83, 
+  -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, 
   94, 95, 96, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, 
   -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, 
   22, -1, -1, -1, -1, -1, -1, 29, 30, 31, 
   32, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 43, -1, -1, -1, 47, -1, -1, -1, -1, 
+  -1, 43, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, 
-  -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, 
+  -1, -1, -1, -1, 66, 67, 68, 69, 70, 71, 
   -1, 73, 74, 75, 76, 77, 78, -1, -1, 81, 
   82, 83, 84, 85, 86, -1, -1, -1, -1, -1, 
   -1, -1, 94, 95, 96, -1, -1, -1, -1, -1, 
@@ -982,104 +946,126 @@ const short QQmlJSGrammar::action_check [] = {
   20, 21, 22, -1, -1, -1, -1, -1, -1, 29, 
   30, 31, 32, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, 43, -1, -1, -1, 47, -1, -1, 
-  -1, -1, -1, -1, -1, 55, -1, -1, -1, 59, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, 
   -1, -1, -1, -1, -1, 65, 66, 67, 68, 69, 
   70, 71, -1, 73, 74, 75, 76, 77, 78, -1, 
   -1, 81, 82, 83, 84, 85, 86, -1, -1, -1, 
   -1, -1, -1, -1, 94, 95, 96, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, 
-  -1, 9, -1, 11, 12, 13, 14, -1, -1, -1, 
-  -1, -1, -1, 21, 22, -1, -1, -1, -1, -1, 
-  -1, 29, 30, -1, -1, 33, 34, -1, 36, -1, 
-  -1, -1, 40, -1, 42, 43, 44, -1, -1, 47, 
-  -1, -1, -1, 51, -1, 53, -1, -1, -1, -1, 
-  -1, 59, -1, 61, -1, -1, -1, 65, 66, 67, 
-  68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 
-  78, -1, -1, 81, 82, 83, 84, 85, -1, 87, 
+  -1, -1, -1, -1, -1, -1, 4, 5, 6, -1, 
+  -1, 9, 10, 11, -1, -1, 14, -1, 16, -1, 
+  -1, -1, 20, 21, 22, -1, -1, -1, -1, -1, 
+  -1, 29, 30, 31, 32, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 43, -1, -1, -1, 47, 
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  -1, 59, -1, -1, -1, -1, -1, 65, 66, 67, 
+  68, 69, 70, 71, -1, 73, 74, 75, 76, 77, 
+  78, -1, -1, 81, 82, 83, 84, 85, 86, -1, 
   -1, -1, -1, -1, -1, -1, 94, 95, 96, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, 
-  -1, -1, -1, 9, -1, 11, 12, 13, 14, -1, 
-  -1, -1, -1, -1, -1, 21, 22, -1, -1, -1, 
-  -1, -1, -1, 29, 30, -1, -1, 33, 34, -1, 
-  36, -1, -1, -1, 40, -1, 42, 43, 44, -1, 
-  -1, 47, -1, -1, -1, 51, -1, 53, -1, -1, 
-  -1, -1, -1, 59, -1, 61, -1, -1, -1, 65, 
-  66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 4, 5, 
+  6, -1, -1, 9, 10, 11, -1, -1, 14, -1, 
+  16, -1, -1, -1, 20, 21, 22, -1, -1, -1, 
+  -1, -1, -1, 29, 30, 31, 32, -1, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 43, -1, -1, 
+  -1, 47, -1, -1, -1, -1, -1, -1, -1, 55, 
+  -1, -1, -1, 59, -1, -1, -1, -1, -1, 65, 
+  66, 67, 68, 69, 70, 71, -1, 73, 74, 75, 
   76, 77, 78, -1, -1, 81, 82, 83, 84, 85, 
-  -1, 87, -1, -1, -1, -1, -1, -1, 94, 95, 
+  86, -1, -1, -1, -1, -1, -1, -1, 94, 95, 
   96, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  4, 5, 6, -1, -1, 9, 10, 11, 12, 13, 
-  14, -1, 16, -1, -1, -1, 20, 21, 22, -1, 
-  -1, -1, -1, -1, -1, 29, 30, 31, 32, 33, 
+  4, -1, -1, -1, -1, 9, -1, 11, 12, 13, 
+  14, -1, -1, -1, -1, -1, -1, 21, 22, -1, 
+  -1, -1, -1, -1, -1, 29, 30, -1, -1, 33, 
   34, -1, 36, -1, -1, -1, 40, -1, 42, 43, 
   44, -1, -1, 47, -1, -1, -1, 51, -1, 53, 
   -1, -1, -1, -1, -1, 59, -1, 61, -1, -1, 
   -1, 65, 66, 67, 68, 69, 70, 71, 72, 73, 
   74, 75, 76, 77, 78, -1, -1, 81, 82, 83, 
-  84, 85, 86, 87, -1, -1, -1, -1, -1, -1, 
+  84, 85, -1, 87, -1, -1, -1, -1, -1, -1, 
   94, 95, 96, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, 
-  12, 13, 14, -1, 16, -1, -1, -1, 20, 21, 
-  22, -1, -1, -1, -1, -1, -1, 29, 30, 31, 
-  32, 33, 34, -1, 36, -1, -1, -1, 40, -1, 
+  -1, -1, 4, -1, -1, -1, -1, 9, -1, 11, 
+  12, 13, 14, -1, -1, -1, -1, -1, -1, 21, 
+  22, -1, -1, -1, -1, -1, -1, 29, 30, -1, 
+  -1, 33, 34, -1, 36, -1, -1, -1, 40, -1, 
   42, 43, 44, -1, -1, 47, -1, -1, -1, 51, 
-  -1, 53, -1, 55, -1, -1, -1, 59, -1, 61, 
+  -1, 53, -1, -1, -1, -1, -1, 59, -1, 61, 
   -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, 
   72, 73, 74, 75, 76, 77, 78, -1, -1, 81, 
-  82, 83, 84, 85, 86, 87, -1, -1, -1, -1, 
+  82, 83, 84, 85, -1, 87, -1, -1, -1, -1, 
   -1, -1, 94, 95, 96, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 
+  -1, -1, -1, -1, 4, 5, 6, -1, -1, 9, 
+  10, 11, 12, 13, 14, -1, 16, -1, -1, -1, 
+  20, 21, 22, -1, -1, -1, -1, -1, -1, 29, 
+  30, 31, 32, 33, 34, -1, 36, -1, -1, -1, 
+  40, -1, 42, 43, 44, -1, -1, 47, -1, -1, 
+  -1, 51, -1, 53, -1, -1, -1, -1, -1, 59, 
+  -1, 61, -1, -1, -1, 65, 66, 67, 68, 69, 
+  70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 
+  -1, 81, 82, 83, 84, 85, 86, 87, -1, -1, 
+  -1, -1, -1, -1, 94, 95, 96, -1, -1, -1, 
+  -1, -1, -1, -1, -1, -1, 4, 5, 6, -1, 
+  -1, 9, 10, 11, 12, 13, 14, -1, 16, -1, 
+  -1, -1, 20, 21, 22, -1, -1, -1, -1, -1, 
+  -1, 29, 30, 31, 32, 33, 34, -1, 36, -1, 
+  -1, -1, 40, -1, 42, 43, 44, -1, -1, 47, 
+  -1, -1, -1, 51, -1, 53, -1, 55, -1, -1, 
+  -1, 59, -1, 61, -1, -1, -1, 65, 66, 67, 
+  68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 
+  78, -1, -1, 81, 82, 83, 84, 85, 86, 87, 
+  -1, -1, -1, -1, -1, -1, 94, 95, 96, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 
 
-  42, 3, 18, 25, 18, 3, 18, 3, 18, 22, 
-  18, 3, 18, 22, 32, 32, 42, 18, 18, 18, 
-  3, 32, 25, 18, 18, 32, 3, 18, 32, 105, 
-  18, 18, 25, 100, 3, 3, 3, 18, 3, 25, 
-  18, 3, 18, 18, 18, 42, 3, 3, 103, 9, 
-  3, 14, 42, 42, 18, 25, 14, 42, 42, 18, 
-  42, 3, 42, 18, 18, 3, 18, 3, 18, 14, 
-  42, 22, 18, 2, 4, 18, 42, 18, 2, 11, 
-  12, 54, -1, 54, 2, 56, 59, 18, 18, 18, 
-  4, 14, 14, 54, 18, 56, 19, 14, 77, 14, 
-  18, 23, 2, 46, 18, 54, 54, 54, 2, 2, 
-  59, 59, 59, 18, 54, 54, 3, 56, 18, 59, 
-  54, 54, 56, 56, 18, 18, 54, 54, 54, 56, 
-  56, 59, 18, 54, 51, 56, 51, 2, 54, 2, 
-  56, 54, 54, 56, 56, 54, 54, 56, 38, 2, 
-  58, 54, 42, 18, 57, 18, 3, 54, 2, 45, 
-  18, 92, 54, 54, 2, 18, 3, 18, 109, 66, 
-  42, 54, 64, 56, 18, 18, 18, 2, 50, 70, 
-  18, 54, 42, 4, 54, 43, 56, 18, 14, 94, 
-  50, 78, 2, 18, 45, 68, 18, 18, 54, 18, 
-  56, 3, 54, 46, 46, 54, 54, 59, 18, 54, 
-  2, 60, 60, 44, 54, 60, 56, 2, 14, 14, 
-  3, 54, 44, 19, 19, 51, 18, 60, 47, 2, 
-  54, 78, 18, 18, 54, -1, 56, 54, 62, 56, 
-  54, 54, 18, 18, 58, 18, 59, 54, 54, 54, 
-  57, 54, 58, 54, 59, 54, 59, 54, 59, 45, 
-  59, 54, 59, 54, 2, 2, 59, -1, 59, 45, 
-  61, -1, 47, 48, 2, -1, 78, 54, -1, 76, 
-  18, 18, 59, 76, 54, -1, 54, 54, 54, 59, 
-  18, 59, 59, 59, -1, 78, -1, -1, 54, 76, 
-  54, 69, -1, 59, 71, 59, 76, 61, 54, 54, 
-  76, 67, 54, 59, 59, 61, 5, 59, 54, 61, 
-  65, 14, 5, 59, -1, 14, 19, 63, 21, -1, 
-  -1, 14, -1, -1, 23, -1, -1, -1, -1, -1, 
-  23, -1, -1, -1, -1, -1, 35, 36, -1, 42, 
-  88, 88, 35, 36, 25, 26, 27, 28, 29, 30, 
-  31, 24, 25, 26, 27, 28, 29, 30, 31, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 14, 14, -1, -1, -1, -1, -1, 
-  -1, -1, 23, 23, 24, 25, 26, 27, 28, 29, 
-  30, 31, -1, -1, 35, 36, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  32, 22, 18, 9, 18, 42, 18, 14, 32, 3, 
+  18, 3, 3, 18, 18, 32, 18, 32, 3, 22, 
+  3, 18, 3, 18, 25, 18, 22, 14, 18, 18, 
+  14, 42, 18, 32, 22, 77, 3, 100, 3, 3, 
+  3, 103, 42, 18, 42, 18, 3, 3, 25, 25, 
+  3, 105, 18, 25, 3, 3, 18, 18, 3, 18, 
+  42, 3, 42, 42, 42, 25, 18, 18, 42, 2, 
+  -1, 18, 18, 42, 18, 18, 14, 18, 14, 18, 
+  2, 4, 2, 18, 42, 18, 54, 14, 56, 18, 
+  -1, 4, -1, 18, -1, 18, 18, 18, 18, 54, 
+  54, 56, 56, 44, 54, 18, 56, 18, 11, 12, 
+  45, -1, -1, 51, 54, 51, 56, 54, 42, 56, 
+  54, 46, 54, 54, 51, 46, 50, 59, 59, 18, 
+  42, -1, -1, -1, 45, 54, 70, 54, 50, 54, 
+  59, 14, 59, 2, 59, 54, 19, 56, 54, 54, 
+  54, 56, 14, 59, 43, 54, 54, 56, 56, 18, 
+  2, 23, 2, 54, 68, 56, 14, 54, 54, 2, 
+  54, 19, 3, 60, 60, 59, 18, 54, 18, 18, 
+  109, 18, 59, 54, 54, 18, 54, 54, 59, 59, 
+  54, 59, 59, 54, 58, 38, 54, 58, 18, 42, 
+  58, 2, 54, 2, 18, 54, 45, 2, 45, 2, 
+  4, 3, 18, 18, 66, 64, 3, 18, 54, 18, 
+  56, 2, 54, 18, 18, 18, 46, 54, 60, 56, 
+  3, 3, 54, 47, 2, 57, 54, 18, 56, 54, 
+  2, 56, 54, 54, 56, 2, 57, 54, 2, 18, 
+  18, 54, 54, 56, -1, 62, 18, 54, 60, 56, 
+  -1, 18, 14, 54, 18, 54, 2, 19, 59, -1, 
+  59, 54, 54, -1, 63, 44, 59, 59, -1, 54, 
+  2, -1, 18, 65, 59, 76, 78, 92, 94, 54, 
+  54, 78, 18, 76, 59, 59, 18, 61, 54, 54, 
+  -1, 76, 67, 59, 59, 78, 78, 54, 54, -1, 
+  54, 54, 59, 59, 69, 59, 59, 61, 61, 14, 
+  76, 47, 48, -1, 71, -1, 54, 14, 23, 5, 
+  76, 59, 19, 61, 21, 5, -1, -1, 14, -1, 
+  35, 36, -1, -1, 14, -1, -1, 23, -1, -1, 
+  -1, -1, 88, 23, -1, 42, -1, -1, -1, 35, 
+  36, -1, -1, -1, -1, 35, 36, 25, 26, 27, 
+  28, 29, 30, 31, -1, -1, -1, -1, -1, -1, 
+  -1, 14, -1, -1, -1, -1, -1, -1, -1, 2, 
+  23, 24, 25, 26, 27, 28, 29, 30, 31, 14, 
+  -1, -1, -1, -1, -1, 18, -1, -1, 23, 24, 
+  25, 26, 27, 28, 29, 30, 31, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+  -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  14, -1, -1, -1, -1, -1, -1, -1, -1, 23, 
-  24, 25, 26, 27, 28, 29, 30, 31, -1, -1, 
+  -1, -1, -1, -1, -1, -1, -1, -1, 14, -1, 
+  -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 
+  26, 27, 28, 29, 30, 31, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
@@ -1087,6 +1073,6 @@ const short QQmlJSGrammar::action_check [] = {
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1};
+  -1, -1, -1, -1, -1};
 
 QT_END_NAMESPACE
diff --git a/src/tools/qdoc/qmlparser/qqmljsgrammar_p.h b/src/tools/qdoc/qmlparser/qqmljsgrammar_p.h
index 6b3d1c8013506aad537df4edf7a2ca614c9100e1..7a369be194e256b204a5c52c78f84da92f3f84ee 100644
--- a/src/tools/qdoc/qmlparser/qqmljsgrammar_p.h
+++ b/src/tools/qdoc/qmlparser/qqmljsgrammar_p.h
@@ -161,15 +161,15 @@ public:
     T_XOR = 79,
     T_XOR_EQ = 80,
 
-    ACCEPT_STATE = 663,
-    RULE_COUNT = 357,
-    STATE_COUNT = 664,
+    ACCEPT_STATE = 665,
+    RULE_COUNT = 358,
+    STATE_COUNT = 666,
     TERMINAL_COUNT = 106,
     NON_TERMINAL_COUNT = 111,
 
-    GOTO_INDEX_OFFSET = 664,
-    GOTO_INFO_OFFSET = 3104,
-    GOTO_CHECK_OFFSET = 3104
+    GOTO_INDEX_OFFSET = 666,
+    GOTO_INFO_OFFSET = 3018,
+    GOTO_CHECK_OFFSET = 3018
   };
 
   static const char  *const    spell [];
diff --git a/src/tools/qdoc/qmlparser/qqmljsparser.cpp b/src/tools/qdoc/qmlparser/qqmljsparser.cpp
index 262043b3b802370aa4dfc1642f668215fe7013a6..762e60c827648f9d1b3e5ca21ac3d79fad2bbd67 100644
--- a/src/tools/qdoc/qmlparser/qqmljsparser.cpp
+++ b/src/tools/qdoc/qmlparser/qqmljsparser.cpp
@@ -567,56 +567,78 @@ case 69: {
 }   break;
 
 case 70: {
-    sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
+    AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4));
+    node->isReadonlyMember = true;
+    node->readonlyToken = loc(1);
+    node->propertyToken = loc(2);
+    node->typeToken = loc(3);
+    node->identifierToken = loc(4);
+    node->semicolonToken = loc(5); // insert a fake ';' before ':'
+
+    AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(4));
+    propertyName->identifierToken = loc(4);
+    propertyName->next = 0;
+
+    AST::UiObjectBinding *binding = new (pool) AST::UiObjectBinding(
+      propertyName, sym(6).UiQualifiedId, sym(7).UiObjectInitializer);
+    binding->colonToken = loc(5);
+
+    node->binding = binding;
+
+    sym(1).Node = node;
 }   break;
 
 case 71: {
     sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
 }   break;
 
-case 79: {
+case 72: {
+    sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
+}   break;
+
+case 80: {
   AST::ThisExpression *node = new (pool) AST::ThisExpression();
   node->thisToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 80: {
+case 81: {
   AST::IdentifierExpression *node = new (pool) AST::IdentifierExpression(stringRef(1));
   node->identifierToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 81: {
+case 82: {
   AST::NullExpression *node = new (pool) AST::NullExpression();
   node->nullToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 82: {
+case 83: {
   AST::TrueLiteral *node = new (pool) AST::TrueLiteral();
   node->trueToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 83: {
+case 84: {
   AST::FalseLiteral *node = new (pool) AST::FalseLiteral();
   node->falseToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 84: {
+case 85: {
   AST::NumericLiteral *node = new (pool) AST::NumericLiteral(sym(1).dval);
   node->literalToken = loc(1);
   sym(1).Node = node;
 } break;
-case 85:
-case 86: {
+case 86:
+case 87: {
   AST::StringLiteral *node = new (pool) AST::StringLiteral(stringRef(1));
   node->literalToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 87: {
+case 88: {
   bool rx = lexer->scanRegExp(Lexer::NoPrefix);
   if (!rx) {
     diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
@@ -632,7 +654,7 @@ case 87: {
   sym(1).Node = node;
 } break;
 
-case 88: {
+case 89: {
   bool rx = lexer->scanRegExp(Lexer::EqualPrefix);
   if (!rx) {
     diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
@@ -648,28 +670,28 @@ case 88: {
   sym(1).Node = node;
 } break;
 
-case 89: {
+case 90: {
   AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral((AST::Elision *) 0);
   node->lbracketToken = loc(1);
   node->rbracketToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 90: {
+case 91: {
   AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).Elision->finish());
   node->lbracketToken = loc(1);
   node->rbracketToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 91: {
+case 92: {
   AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish ());
   node->lbracketToken = loc(1);
   node->rbracketToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 92: {
+case 93: {
   AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
     (AST::Elision *) 0);
   node->lbracketToken = loc(1);
@@ -678,7 +700,7 @@ case 92: {
   sym(1).Node = node;
 } break;
 
-case 93: {
+case 94: {
   AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
     sym(4).Elision->finish());
   node->lbracketToken = loc(1);
@@ -687,7 +709,7 @@ case 93: {
   sym(1).Node = node;
 } break;
 
-case 94: {
+case 95: {
   AST::ObjectLiteral *node = 0;
   if (sym(2).Node)
     node = new (pool) AST::ObjectLiteral(
@@ -699,7 +721,7 @@ case 94: {
   sym(1).Node = node;
 } break;
 
-case 95: {
+case 96: {
   AST::ObjectLiteral *node = new (pool) AST::ObjectLiteral(
     sym(2).PropertyAssignmentList->finish ());
   node->lbraceToken = loc(1);
@@ -707,14 +729,14 @@ case 95: {
   sym(1).Node = node;
 } break;
 
-case 96: {
+case 97: {
   AST::NestedExpression *node = new (pool) AST::NestedExpression(sym(2).Expression);
   node->lparenToken = loc(1);
   node->rparenToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 97: {
+case 98: {
   if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) {
     diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, mem->lbracketToken,
       QLatin1String("Ignored annotation")));
@@ -734,48 +756,48 @@ case 97: {
   }
 } break;
 
-case 98: {
+case 99: {
   sym(1).Node = new (pool) AST::ElementList((AST::Elision *) 0, sym(1).Expression);
 } break;
 
-case 99: {
+case 100: {
   sym(1).Node = new (pool) AST::ElementList(sym(1).Elision->finish(), sym(2).Expression);
 } break;
 
-case 100: {
+case 101: {
   AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList,
     (AST::Elision *) 0, sym(3).Expression);
   node->commaToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 101: {
+case 102: {
   AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList, sym(3).Elision->finish(),
     sym(4).Expression);
   node->commaToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 102: {
+case 103: {
   AST::Elision *node = new (pool) AST::Elision();
   node->commaToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 103: {
+case 104: {
   AST::Elision *node = new (pool) AST::Elision(sym(1).Elision);
   node->commaToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 104: {
+case 105: {
   AST::PropertyNameAndValue *node = new (pool) AST::PropertyNameAndValue(
       sym(1).PropertyName, sym(3).Expression);
   node->colonToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 105: {
+case 106: {
   AST::PropertyGetterSetter *node = new (pool) AST::PropertyGetterSetter(
       sym(2).PropertyName, sym(6).FunctionBody);
   node->getSetToken = loc(1);
@@ -786,7 +808,7 @@ case 105: {
   sym(1).Node = node;
 } break;
 
-case 106: {
+case 107: {
   AST::PropertyGetterSetter *node = new (pool) AST::PropertyGetterSetter(
       sym(2).PropertyName, sym(4).FormalParameterList, sym(7).FunctionBody);
   node->getSetToken = loc(1);
@@ -797,56 +819,56 @@ case 106: {
   sym(1).Node = node;
 } break;
 
-case 107: {
+case 108: {
   sym(1).Node = new (pool) AST::PropertyAssignmentList(sym(1).PropertyAssignment);
 } break;
 
-case 108: {
+case 109: {
   AST::PropertyAssignmentList *node = new (pool) AST::PropertyAssignmentList(
     sym(1).PropertyAssignmentList, sym(3).PropertyAssignment);
   node->commaToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 109: {
+case 110: {
   AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
   node->propertyNameToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 110: {
+case 111: {
   AST::StringLiteralPropertyName *node = new (pool) AST::StringLiteralPropertyName(stringRef(1));
   node->propertyNameToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 111: {
+case 112: {
   AST::NumericLiteralPropertyName *node = new (pool) AST::NumericLiteralPropertyName(sym(1).dval);
   node->propertyNameToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 112: {
+case 113: {
   AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
   node->propertyNameToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 148: {
+case 149: {
   AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
   node->lbracketToken = loc(2);
   node->rbracketToken = loc(4);
   sym(1).Node = node;
 } break;
 
-case 149: {
+case 150: {
   AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
   node->dotToken = loc(2);
   node->identifierToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 150: {
+case 151: {
   AST::NewMemberExpression *node = new (pool) AST::NewMemberExpression(sym(2).Expression, sym(4).ArgumentList);
   node->newToken = loc(1);
   node->lparenToken = loc(3);
@@ -854,384 +876,384 @@ case 150: {
   sym(1).Node = node;
 } break;
 
-case 152: {
+case 153: {
   AST::NewExpression *node = new (pool) AST::NewExpression(sym(2).Expression);
   node->newToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 153: {
+case 154: {
   AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
   node->lparenToken = loc(2);
   node->rparenToken = loc(4);
   sym(1).Node = node;
 } break;
 
-case 154: {
+case 155: {
   AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
   node->lparenToken = loc(2);
   node->rparenToken = loc(4);
   sym(1).Node = node;
 } break;
 
-case 155: {
+case 156: {
   AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
   node->lbracketToken = loc(2);
   node->rbracketToken = loc(4);
   sym(1).Node = node;
 } break;
 
-case 156: {
+case 157: {
   AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
   node->dotToken = loc(2);
   node->identifierToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 157: {
+case 158: {
   sym(1).Node = 0;
 } break;
 
-case 158: {
+case 159: {
   sym(1).Node = sym(1).ArgumentList->finish();
 } break;
 
-case 159: {
+case 160: {
   sym(1).Node = new (pool) AST::ArgumentList(sym(1).Expression);
 } break;
 
-case 160: {
+case 161: {
   AST::ArgumentList *node = new (pool) AST::ArgumentList(sym(1).ArgumentList, sym(3).Expression);
   node->commaToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 164: {
+case 165: {
   AST::PostIncrementExpression *node = new (pool) AST::PostIncrementExpression(sym(1).Expression);
   node->incrementToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 165: {
+case 166: {
   AST::PostDecrementExpression *node = new (pool) AST::PostDecrementExpression(sym(1).Expression);
   node->decrementToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 167: {
+case 168: {
   AST::DeleteExpression *node = new (pool) AST::DeleteExpression(sym(2).Expression);
   node->deleteToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 168: {
+case 169: {
   AST::VoidExpression *node = new (pool) AST::VoidExpression(sym(2).Expression);
   node->voidToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 169: {
+case 170: {
   AST::TypeOfExpression *node = new (pool) AST::TypeOfExpression(sym(2).Expression);
   node->typeofToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 170: {
+case 171: {
   AST::PreIncrementExpression *node = new (pool) AST::PreIncrementExpression(sym(2).Expression);
   node->incrementToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 171: {
+case 172: {
   AST::PreDecrementExpression *node = new (pool) AST::PreDecrementExpression(sym(2).Expression);
   node->decrementToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 172: {
+case 173: {
   AST::UnaryPlusExpression *node = new (pool) AST::UnaryPlusExpression(sym(2).Expression);
   node->plusToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 173: {
+case 174: {
   AST::UnaryMinusExpression *node = new (pool) AST::UnaryMinusExpression(sym(2).Expression);
   node->minusToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 174: {
+case 175: {
   AST::TildeExpression *node = new (pool) AST::TildeExpression(sym(2).Expression);
   node->tildeToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 175: {
+case 176: {
   AST::NotExpression *node = new (pool) AST::NotExpression(sym(2).Expression);
   node->notToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 177: {
+case 178: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Mul, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 178: {
+case 179: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Div, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 179: {
+case 180: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Mod, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 181: {
+case 182: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Add, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 182: {
+case 183: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Sub, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 184: {
+case 185: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::LShift, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 185: {
+case 186: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::RShift, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 186: {
+case 187: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::URShift, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 188: {
+case 189: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Lt, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 189: {
+case 190: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Gt, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 190: {
+case 191: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Le, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 191: {
+case 192: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Ge, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 192: {
+case 193: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::InstanceOf, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 193: {
+case 194: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::In, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 195: {
+case 196: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Lt, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 196: {
+case 197: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Gt, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 197: {
+case 198: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Le, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 198: {
+case 199: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
    QSOperator::Ge, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 199: {
+case 200: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::InstanceOf, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 201: {
+case 202: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Equal, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 202: {
+case 203: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::NotEqual, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 203: {
+case 204: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::StrictEqual, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 204: {
+case 205: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::StrictNotEqual, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 206: {
+case 207: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Equal, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 207: {
+case 208: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::NotEqual, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 208: {
+case 209: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::StrictEqual, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 209: {
+case 210: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::StrictNotEqual, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 211: {
+case 212: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::BitAnd, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 213: {
+case 214: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::BitAnd, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 215: {
+case 216: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::BitXor, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 217: {
+case 218: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::BitXor, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 219: {
+case 220: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::BitOr, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 221: {
+case 222: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::BitOr, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 223: {
+case 224: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::And, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 225: {
+case 226: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::And, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 227: {
+case 228: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Or, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 229: {
+case 230: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     QSOperator::Or, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 231: {
+case 232: {
   AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
     sym(3).Expression, sym(5).Expression);
   node->questionToken = loc(2);
@@ -1239,7 +1261,7 @@ case 231: {
   sym(1).Node = node;
 } break;
 
-case 233: {
+case 234: {
   AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
     sym(3).Expression, sym(5).Expression);
   node->questionToken = loc(2);
@@ -1247,112 +1269,112 @@ case 233: {
   sym(1).Node = node;
 } break;
 
-case 235: {
+case 236: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     sym(2).ival, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 237: {
+case 238: {
   AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
     sym(2).ival, sym(3).Expression);
   node->operatorToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 238: {
+case 239: {
   sym(1).ival = QSOperator::Assign;
 } break;
 
-case 239: {
+case 240: {
   sym(1).ival = QSOperator::InplaceMul;
 } break;
 
-case 240: {
+case 241: {
   sym(1).ival = QSOperator::InplaceDiv;
 } break;
 
-case 241: {
+case 242: {
   sym(1).ival = QSOperator::InplaceMod;
 } break;
 
-case 242: {
+case 243: {
   sym(1).ival = QSOperator::InplaceAdd;
 } break;
 
-case 243: {
+case 244: {
   sym(1).ival = QSOperator::InplaceSub;
 } break;
 
-case 244: {
+case 245: {
   sym(1).ival = QSOperator::InplaceLeftShift;
 } break;
 
-case 245: {
+case 246: {
   sym(1).ival = QSOperator::InplaceRightShift;
 } break;
 
-case 246: {
+case 247: {
   sym(1).ival = QSOperator::InplaceURightShift;
 } break;
 
-case 247: {
+case 248: {
   sym(1).ival = QSOperator::InplaceAnd;
 } break;
 
-case 248: {
+case 249: {
   sym(1).ival = QSOperator::InplaceXor;
 } break;
 
-case 249: {
+case 250: {
   sym(1).ival = QSOperator::InplaceOr;
 } break;
 
-case 251: {
+case 252: {
   AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
   node->commaToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 252: {
+case 253: {
   sym(1).Node = 0;
 } break;
 
-case 255: {
+case 256: {
   AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
   node->commaToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 256: {
+case 257: {
   sym(1).Node = 0;
 } break;
 
-case 273: {
+case 274: {
   AST::Block *node = new (pool) AST::Block(sym(2).StatementList);
   node->lbraceToken = loc(1);
   node->rbraceToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 274: {
+case 275: {
   sym(1).Node = new (pool) AST::StatementList(sym(1).Statement);
 } break;
 
-case 275: {
+case 276: {
   sym(1).Node = new (pool) AST::StatementList(sym(1).StatementList, sym(2).Statement);
 } break;
 
-case 276: {
+case 277: {
   sym(1).Node = 0;
 } break;
 
-case 277: {
+case 278: {
   sym(1).Node = sym(1).StatementList->finish ();
 } break;
 
-case 279: {
+case 280: {
   AST::VariableStatement *node = new (pool) AST::VariableStatement(
      sym(2).VariableDeclarationList->finish (/*readOnly=*/sym(1).ival == T_CONST));
   node->declarationKindToken = loc(1);
@@ -1360,76 +1382,76 @@ case 279: {
   sym(1).Node = node;
 } break;
 
-case 280: {
+case 281: {
   sym(1).ival = T_CONST;
 } break;
 
-case 281: {
+case 282: {
   sym(1).ival = T_VAR;
 } break;
 
-case 282: {
+case 283: {
   sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
 } break;
 
-case 283: {
+case 284: {
   AST::VariableDeclarationList *node = new (pool) AST::VariableDeclarationList(
     sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
   node->commaToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 284: {
+case 285: {
   sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
 } break;
 
-case 285: {
+case 286: {
   sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
 } break;
 
-case 286: {
+case 287: {
   AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
   node->identifierToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 287: {
+case 288: {
   AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
   node->identifierToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 288: {
+case 289: {
   // ### TODO: AST for initializer
   sym(1) = sym(2);
 } break;
 
-case 289: {
+case 290: {
   sym(1).Node = 0;
 } break;
 
-case 291: {
+case 292: {
   // ### TODO: AST for initializer
   sym(1) = sym(2);
 } break;
 
-case 292: {
+case 293: {
   sym(1).Node = 0;
 } break;
 
-case 294: {
+case 295: {
   AST::EmptyStatement *node = new (pool) AST::EmptyStatement();
   node->semicolonToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 296: {
+case 297: {
   AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(sym(1).Expression);
   node->semicolonToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 297: {
+case 298: {
   AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement, sym(7).Statement);
   node->ifToken = loc(1);
   node->lparenToken = loc(2);
@@ -1438,7 +1460,7 @@ case 297: {
   sym(1).Node = node;
 } break;
 
-case 298: {
+case 299: {
   AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement);
   node->ifToken = loc(1);
   node->lparenToken = loc(2);
@@ -1446,7 +1468,7 @@ case 298: {
   sym(1).Node = node;
 } break;
 
-case 301: {
+case 302: {
   AST::DoWhileStatement *node = new (pool) AST::DoWhileStatement(sym(2).Statement, sym(5).Expression);
   node->doToken = loc(1);
   node->whileToken = loc(3);
@@ -1456,7 +1478,7 @@ case 301: {
   sym(1).Node = node;
 } break;
 
-case 302: {
+case 303: {
   AST::WhileStatement *node = new (pool) AST::WhileStatement(sym(3).Expression, sym(5).Statement);
   node->whileToken = loc(1);
   node->lparenToken = loc(2);
@@ -1464,7 +1486,7 @@ case 302: {
   sym(1).Node = node;
 } break;
 
-case 303: {
+case 304: {
   AST::ForStatement *node = new (pool) AST::ForStatement(sym(3).Expression,
     sym(5).Expression, sym(7).Expression, sym(9).Statement);
   node->forToken = loc(1);
@@ -1475,7 +1497,7 @@ case 303: {
   sym(1).Node = node;
 } break;
 
-case 304: {
+case 305: {
   AST::LocalForStatement *node = new (pool) AST::LocalForStatement(
      sym(4).VariableDeclarationList->finish (/*readOnly=*/false), sym(6).Expression,
      sym(8).Expression, sym(10).Statement);
@@ -1488,7 +1510,7 @@ case 304: {
   sym(1).Node = node;
 } break;
 
-case 305: {
+case 306: {
   AST:: ForEachStatement *node = new (pool) AST::ForEachStatement(sym(3).Expression,
     sym(5).Expression, sym(7).Statement);
   node->forToken = loc(1);
@@ -1498,7 +1520,7 @@ case 305: {
   sym(1).Node = node;
 } break;
 
-case 306: {
+case 307: {
   AST::LocalForEachStatement *node = new (pool) AST::LocalForEachStatement(
     sym(4).VariableDeclaration, sym(6).Expression, sym(8).Statement);
   node->forToken = loc(1);
@@ -1509,14 +1531,14 @@ case 306: {
   sym(1).Node = node;
 } break;
 
-case 308: {
+case 309: {
   AST::ContinueStatement *node = new (pool) AST::ContinueStatement();
   node->continueToken = loc(1);
   node->semicolonToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 310: {
+case 311: {
   AST::ContinueStatement *node = new (pool) AST::ContinueStatement(stringRef(2));
   node->continueToken = loc(1);
   node->identifierToken = loc(2);
@@ -1524,14 +1546,14 @@ case 310: {
   sym(1).Node = node;
 } break;
 
-case 312: {
+case 313: {
   AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringRef());
   node->breakToken = loc(1);
   node->semicolonToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 314: {
+case 315: {
   AST::BreakStatement *node = new (pool) AST::BreakStatement(stringRef(2));
   node->breakToken = loc(1);
   node->identifierToken = loc(2);
@@ -1539,14 +1561,14 @@ case 314: {
   sym(1).Node = node;
 } break;
 
-case 316: {
+case 317: {
   AST::ReturnStatement *node = new (pool) AST::ReturnStatement(sym(2).Expression);
   node->returnToken = loc(1);
   node->semicolonToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 317: {
+case 318: {
   AST::WithStatement *node = new (pool) AST::WithStatement(sym(3).Expression, sym(5).Statement);
   node->withToken = loc(1);
   node->lparenToken = loc(2);
@@ -1554,7 +1576,7 @@ case 317: {
   sym(1).Node = node;
 } break;
 
-case 318: {
+case 319: {
   AST::SwitchStatement *node = new (pool) AST::SwitchStatement(sym(3).Expression, sym(5).CaseBlock);
   node->switchToken = loc(1);
   node->lparenToken = loc(2);
@@ -1562,83 +1584,83 @@ case 318: {
   sym(1).Node = node;
 } break;
 
-case 319: {
+case 320: {
   AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses);
   node->lbraceToken = loc(1);
   node->rbraceToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 320: {
+case 321: {
   AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses);
   node->lbraceToken = loc(1);
   node->rbraceToken = loc(5);
   sym(1).Node = node;
 } break;
 
-case 321: {
+case 322: {
   sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClause);
 } break;
 
-case 322: {
+case 323: {
   sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClauses, sym(2).CaseClause);
 } break;
 
-case 323: {
+case 324: {
   sym(1).Node = 0;
 } break;
 
-case 324: {
+case 325: {
   sym(1).Node = sym(1).CaseClauses->finish ();
 } break;
 
-case 325: {
+case 326: {
   AST::CaseClause *node = new (pool) AST::CaseClause(sym(2).Expression, sym(4).StatementList);
   node->caseToken = loc(1);
   node->colonToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 326: {
+case 327: {
   AST::DefaultClause *node = new (pool) AST::DefaultClause(sym(3).StatementList);
   node->defaultToken = loc(1);
   node->colonToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 327: {
+case 328: {
   AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
   node->identifierToken = loc(1);
   node->colonToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 329: {
+case 330: {
   AST::ThrowStatement *node = new (pool) AST::ThrowStatement(sym(2).Expression);
   node->throwToken = loc(1);
   node->semicolonToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 330: {
+case 331: {
   AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch);
   node->tryToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 331: {
+case 332: {
   AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Finally);
   node->tryToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 332: {
+case 333: {
   AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch, sym(4).Finally);
   node->tryToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 333: {
+case 334: {
   AST::Catch *node = new (pool) AST::Catch(stringRef(3), sym(5).Block);
   node->catchToken = loc(1);
   node->lparenToken = loc(2);
@@ -1647,20 +1669,20 @@ case 333: {
   sym(1).Node = node;
 } break;
 
-case 334: {
+case 335: {
   AST::Finally *node = new (pool) AST::Finally(sym(2).Block);
   node->finallyToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 336: {
+case 337: {
   AST::DebuggerStatement *node = new (pool) AST::DebuggerStatement();
   node->debuggerToken = loc(1);
   node->semicolonToken = loc(2);
   sym(1).Node = node;
 } break;
 
-case 338: {
+case 339: {
   AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
   node->functionToken = loc(1);
   node->identifierToken = loc(2);
@@ -1671,7 +1693,7 @@ case 338: {
   sym(1).Node = node;
 } break;
 
-case 339: {
+case 340: {
   AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
   node->functionToken = loc(1);
   if (! stringRef(2).isNull())
@@ -1683,7 +1705,7 @@ case 339: {
   sym(1).Node = node;
 } break;
 
-case 340: {
+case 341: {
   AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringRef(), sym(3).FormalParameterList, sym(6).FunctionBody);
   node->functionToken = loc(1);
   node->lparenToken = loc(2);
@@ -1693,56 +1715,56 @@ case 340: {
   sym(1).Node = node;
 } break;
 
-case 341: {
+case 342: {
   AST::FormalParameterList *node = new (pool) AST::FormalParameterList(stringRef(1));
   node->identifierToken = loc(1);
   sym(1).Node = node;
 } break;
 
-case 342: {
+case 343: {
   AST::FormalParameterList *node = new (pool) AST::FormalParameterList(sym(1).FormalParameterList, stringRef(3));
   node->commaToken = loc(2);
   node->identifierToken = loc(3);
   sym(1).Node = node;
 } break;
 
-case 343: {
+case 344: {
   sym(1).Node = 0;
 } break;
 
-case 344: {
+case 345: {
   sym(1).Node = sym(1).FormalParameterList->finish ();
 } break;
 
-case 345: {
+case 346: {
   sym(1).Node = 0;
 } break;
 
-case 347: {
+case 348: {
   sym(1).Node = new (pool) AST::FunctionBody(sym(1).SourceElements->finish ());
 } break;
 
-case 349: {
+case 350: {
   sym(1).Node = new (pool) AST::Program(sym(1).SourceElements->finish ());
 } break;
 
-case 350: {
+case 351: {
   sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElement);
 } break;
 
-case 351: {
+case 352: {
   sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElements, sym(2).SourceElement);
 } break;
 
-case 352: {
+case 353: {
   sym(1).Node = new (pool) AST::StatementSourceElement(sym(1).Statement);
 } break;
 
-case 353: {
+case 354: {
   sym(1).Node = new (pool) AST::FunctionSourceElement(sym(1).FunctionDeclaration);
 } break;
 
-case 354: {
+case 355: {
   sym(1).Node = 0;
 } break;
 
diff --git a/src/tools/qdoc/qmlparser/qqmljsparser_p.h b/src/tools/qdoc/qmlparser/qqmljsparser_p.h
index b0abf06b25126db0987a5619f1cb9c357e4428f2..cf9f641fbc551a85495654b451165498b51c01c6 100644
--- a/src/tools/qdoc/qmlparser/qqmljsparser_p.h
+++ b/src/tools/qdoc/qmlparser/qqmljsparser_p.h
@@ -240,9 +240,9 @@ protected:
 
 
 
-#define J_SCRIPT_REGEXPLITERAL_RULE1 87
+#define J_SCRIPT_REGEXPLITERAL_RULE1 88
 
-#define J_SCRIPT_REGEXPLITERAL_RULE2 88
+#define J_SCRIPT_REGEXPLITERAL_RULE2 89
 
 QT_QML_END_NAMESPACE
 
diff --git a/src/tools/qlalr/doc/src/images/qt-logo.png b/src/tools/qlalr/doc/src/images/qt-logo.png
index 2dc67161c1b8a27686b4bfa9666c6752bb6f6c36..6e7d000c0470e0f45ae714827ba72f69cc25270a 100644
Binary files a/src/tools/qlalr/doc/src/images/qt-logo.png and b/src/tools/qlalr/doc/src/images/qt-logo.png differ
diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp
index d7f8e472135e2a6d2b64a2ce1accb96d83c1178a..5769ed552c679138228c932f5707f1617317a890 100644
--- a/src/tools/rcc/rcc.cpp
+++ b/src/tools/rcc/rcc.cpp
@@ -893,6 +893,8 @@ bool RCCResourceLibrary::writeDataBlobs()
     if (m_format == C_Code)
         writeString("\n};\n\n");
     else if (m_format == Pass1) {
+        if (offset < 8)
+            offset = 8;
         writeString("\nstatic const unsigned char qt_resource_data[");
         writeByteArray(QByteArray::number(offset));
         writeString("] = { 'Q', 'R', 'C', '_', 'D', 'A', 'T', 'A' };\n\n");
diff --git a/src/widgets/dialogs/images/qtlogo-64.png b/src/widgets/dialogs/images/qtlogo-64.png
index 4f68e162de4295f123c6979c0f6f422031bc5603..af87e98cf5036136d4b15507fe7dd998198b0f5c 100644
Binary files a/src/widgets/dialogs/images/qtlogo-64.png and b/src/widgets/dialogs/images/qtlogo-64.png differ
diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp
index 1f7b18e824793c862a9055ec6e9991405cc9b0ac..a378daa3d33e9d8f0a39f36ab4f83a3934b91b33 100644
--- a/src/widgets/dialogs/qwizard.cpp
+++ b/src/widgets/dialogs/qwizard.cpp
@@ -2571,6 +2571,14 @@ void QWizard::setWizardStyle(WizardStyle style)
         d->disableUpdates();
         d->wizStyle = style;
         d->updateButtonTexts();
+#if !defined(QT_NO_STYLE_WINDOWSVISTA)
+        if (aeroStyleChange) {
+            //Send a resizeevent since the antiflicker widget probably needs a new size
+            //because of the backbutton in the window title
+            QResizeEvent ev(geometry().size(), geometry().size());
+            QApplication::sendEvent(this, &ev);
+        }
+#endif
         d->updateLayout();
         updateGeometry();
         d->enableUpdates();
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp
index 76a75dfc350137a3e1ce67ed0f7111aa78386058..300e2f492b85650e483df9b00df360e3a5e57cbf 100644
--- a/src/widgets/graphicsview/qgraphicsitem.cpp
+++ b/src/widgets/graphicsview/qgraphicsitem.cpp
@@ -1968,8 +1968,10 @@ QGraphicsItem::CacheMode QGraphicsItem::cacheMode() const
     Caching can speed up rendering if your item spends a significant time
     redrawing itself. In some cases the cache can also slow down rendering, in
     particular when the item spends less time redrawing than QGraphicsItem
-    spends redrawing from the cache. When enabled, the item's paint() function
-    will be called only once for each call to update(); for any subsequent
+    spends redrawing from the cache.
+
+    When caching is enabled, an item's paint() function will generally draw into an
+    offscreen pixmap cache; for any subsequent
     repaint requests, the Graphics View framework will redraw from the
     cache. This approach works particularly well with QGLWidget, which stores
     all the cache as OpenGL textures.
@@ -1980,6 +1982,12 @@ QGraphicsItem::CacheMode QGraphicsItem::cacheMode() const
     You can read more about the different cache modes in the CacheMode
     documentation.
 
+    \note Enabling caching does not imply that the item's paint() function will be
+    called only in response to an explicit update() call. For instance, under
+    memory pressure, Qt may decide to drop some of the cache information;
+    in such cases an item's paint() function will be called even if there
+    was no update() call (that is, exactly as if there were no caching enabled).
+
     \sa CacheMode, QPixmapCache::setCacheLimit()
 */
 void QGraphicsItem::setCacheMode(CacheMode mode, const QSize &logicalCacheSize)
@@ -5337,6 +5345,16 @@ void QGraphicsItem::setBoundingRegionGranularity(qreal granularity)
 
     All painting is done in local coordinates.
 
+    \note It is mandatory that an item will always redraw itself in the exact
+    same way, unless update() was called; otherwise visual artifacts may
+    occur. In other words, two subsequent calls to paint() must always produce
+    the same output, unless update() was called between them.
+
+    \note Enabling caching for an item does not guarantee that paint()
+    will be invoked only once by the Graphics View framework,
+    even without any explicit call to update(). See the documentation of
+    setCacheMode() for more details.
+
     \sa setCacheMode(), QPen::width(), {Item Coordinates}, ItemUsesExtendedStyleOption
 */
 
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index cc262fa3e2c21d70e761d26f40cb1b0af2f6e978..315d615d8977e521ef152fa0ac73327bf8a689ef 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -7155,10 +7155,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove)
             }
         }
 
-        // generate a move event for QWidgets without window handles. QWidgets with native
-        // window handles already receive a move event from
-        // QGuiApplicationPrivate::processGeometryChangeEvent.
-        if (isMove && (!q->windowHandle() || q->testAttribute(Qt::WA_DontShowOnScreen))) {
+        if (isMove) {
             QMoveEvent e(q->pos(), oldPos);
             QApplication::sendEvent(q, &e);
         }
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index 1cd042f99d243325462053322d9e82cda6983d53..e455b772fbda49b47799c891f3a146eefc54f84c 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -543,14 +543,36 @@ void QWidgetWindow::handleKeyEvent(QKeyEvent *event)
     QGuiApplication::sendSpontaneousEvent(receiver, event);
 }
 
-void QWidgetWindow::updateGeometry()
+bool QWidgetWindow::updateSize()
 {
+    bool changed = false;
     if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
-        return;
+        return changed;
+    if (m_widget->data->crect.size() != geometry().size()) {
+        changed = true;
+        m_widget->data->crect.setSize(geometry().size());
+    }
 
-    const QMargins margins = frameMargins();
+    updateMargins();
+    return changed;
+}
+
+bool QWidgetWindow::updatePos()
+{
+    bool changed = false;
+    if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
+        return changed;
+    if (m_widget->data->crect.topLeft() != geometry().topLeft()) {
+        changed = true;
+        m_widget->data->crect.moveTopLeft(geometry().topLeft());
+    }
+    updateMargins();
+    return changed;
+}
 
-    m_widget->data->crect = geometry();
+void QWidgetWindow::updateMargins()
+{
+    const QMargins margins = frameMargins();
     QTLWExtra *te = m_widget->d_func()->topData();
     te->posIncludesFrame= false;
     te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom());
@@ -609,24 +631,25 @@ void QWidgetWindow::updateNormalGeometry()
 
 void QWidgetWindow::handleMoveEvent(QMoveEvent *event)
 {
-    updateGeometry();
-    QGuiApplication::sendSpontaneousEvent(m_widget, event);
+    if (updatePos())
+        QGuiApplication::sendSpontaneousEvent(m_widget, event);
 }
 
 void QWidgetWindow::handleResizeEvent(QResizeEvent *event)
 {
     QSize oldSize = m_widget->data->crect.size();
 
-    updateGeometry();
-    QGuiApplication::sendSpontaneousEvent(m_widget, event);
+    if (updateSize()) {
+        QGuiApplication::sendSpontaneousEvent(m_widget, event);
 
-    if (m_widget->d_func()->paintOnScreen()) {
-        QRegion updateRegion(geometry());
-        if (m_widget->testAttribute(Qt::WA_StaticContents))
-            updateRegion -= QRect(0, 0, oldSize.width(), oldSize.height());
-        m_widget->d_func()->syncBackingStore(updateRegion);
-    } else {
-        m_widget->d_func()->syncBackingStore();
+        if (m_widget->d_func()->paintOnScreen()) {
+            QRegion updateRegion(geometry());
+            if (m_widget->testAttribute(Qt::WA_StaticContents))
+                updateRegion -= QRect(0, 0, oldSize.width(), oldSize.height());
+            m_widget->d_func()->syncBackingStore(updateRegion);
+        } else {
+            m_widget->d_func()->syncBackingStore();
+        }
     }
 }
 
diff --git a/src/widgets/kernel/qwidgetwindow_p.h b/src/widgets/kernel/qwidgetwindow_p.h
index 7f12ae8e20639c78423543156902458302b7475d..0632a5c364796a40ad70d4346003327b16e84bfc 100644
--- a/src/widgets/kernel/qwidgetwindow_p.h
+++ b/src/widgets/kernel/qwidgetwindow_p.h
@@ -108,7 +108,9 @@ private slots:
 
 private:
     void repaintWindow();
-    void updateGeometry();
+    bool updateSize();
+    bool updatePos();
+    void updateMargins();
     void updateNormalGeometry();
 
     enum FocusWidgets {
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index 85793088209ed541805a08eac0de688c589f1e4c..1c5dcf5f0aa7c0f4e3b6dd89db98b34e94a822e5 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -1114,7 +1114,7 @@ void QCommonStylePrivate::tabLayout(const QStyleOptionTabV3 *opt, const QWidget
                         (opt->state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled,
                         (opt->state & QStyle::State_Selected) ? QIcon::On : QIcon::Off  );
         // High-dpi icons do not need adjustmet; make sure tabIconSize is not larger than iconSize
-        tabIconSize = QSize(qMin(tabIconSize.width(), iconSize.width()), qMin(tabIconSize.height(), iconSize.width()));
+        tabIconSize = QSize(qMin(tabIconSize.width(), iconSize.width()), qMin(tabIconSize.height(), iconSize.height()));
 
         *iconRect = QRect(tr.left(), tr.center().y() - tabIconSize.height() / 2,
                     tabIconSize.width(), tabIconSize .height());
diff --git a/src/widgets/styles/qwindowsvistastyle.cpp b/src/widgets/styles/qwindowsvistastyle.cpp
index 007952192ae9ea5601d2a7730df8d0935a54e7ac..463b120e043d9b357bb078de21d0ea5545b0b0e5 100644
--- a/src/widgets/styles/qwindowsvistastyle.cpp
+++ b/src/widgets/styles/qwindowsvistastyle.cpp
@@ -1473,7 +1473,11 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption
             break;
         }
 #endif // QT_NO_ITEMVIEWS
-
+#ifndef QT_NO_COMBOBOX
+    case CE_ComboBoxLabel:
+        QCommonStyle::drawControl(element, option, painter, widget);
+        break;
+#endif // QT_NO_COMBOBOX
     default:
         QWindowsXPStyle::drawControl(element, option, painter, widget);
         break;
diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp
index 1cc7f201baa92299684ba138063e3798ce083edc..8f8642a72a2e2985be1d2b57c356f3abd8df9556 100644
--- a/src/widgets/widgets/qmainwindowlayout.cpp
+++ b/src/widgets/widgets/qmainwindowlayout.cpp
@@ -68,7 +68,7 @@
 
 QT_BEGIN_NAMESPACE
 
-#ifndef QT_NO_DOCKWIDGET
+#ifdef QT_NO_DOCKWIDGET
 extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window);
 #endif
 
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp
index 0fd645a4d383cb7d25523fbc4cc9fa17a21f7e1b..acfccc8e192958ef978fadce72bd31de7632a223 100644
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -3055,8 +3055,10 @@ void QMenu::actionEvent(QActionEvent *e)
             delete menuItem;
         } else if (e->type() == QEvent::ActionChanged) {
             QPlatformMenuItem *menuItem = d->platformMenu->menuItemForTag(reinterpret_cast<quintptr>(e->action()));
-            copyActionToPlatformItem(e->action(), menuItem);
-            d->platformMenu->syncMenuItem(menuItem);
+            if (menuItem) {
+                copyActionToPlatformItem(e->action(), menuItem);
+                d->platformMenu->syncMenuItem(menuItem);
+            }
         }
 
         d->platformMenu->syncSeparatorsCollapsible(d->collapsibleSeparators);
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index 13e786cd20453a47153bd2ff665252ba8a5899e6..edb6488eaa2f31731c6c260be790a8e6474fd838 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -1564,7 +1564,7 @@ public slots:
 
     void doAnotherThing(bool a = (1 < 3), bool b = (1 > 4)) { Q_UNUSED(a); Q_UNUSED(b); }
 
-#if defined(Q_MOC_RUN) || (defined(Q_COMPILER_AUTO_TYPE) && !(defined(Q_CC_CLANG) && (__clang_major__ * 100) + __clang_minor__) < 304)
+#if defined(Q_MOC_RUN) || (defined(Q_COMPILER_AUTO_TYPE) && !(defined(Q_CC_CLANG) && Q_CC_CLANG < 304))
     // There is no Q_COMPILER_>>  but if compiler support auto, it should also support >>
     void performSomething(QVector<QList<QString>> e = QVector<QList<QString>>(8 < 1),
                           QHash<int, QVector<QString>> h = QHash<int, QVector<QString>>())
diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
index c6c746419410e6e0eca9d0709a6923368d7ae7b2..36791293ab9c096866928c7b7cedc70d0105bec9 100644
--- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
+++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
@@ -95,6 +95,8 @@ private slots:
     void tst_updateWinId_QTBUG40681();
     void tst_recreateWindow_QTBUG40817();
 
+    void tst_resize_count();
+    void tst_move_count();
 };
 
 void tst_QWidget_window::initTestCase()
@@ -660,6 +662,105 @@ void tst_QWidget_window::tst_recreateWindow_QTBUG40817()
     tab.setCurrentIndex(1);
 }
 
+class ResizeWidget : public QWidget
+{
+Q_OBJECT
+public:
+    ResizeWidget(QWidget *parent = 0)
+        : QWidget(parent)
+        , resizeCount(0)
+    { }
+
+    int resizeCount;
+
+protected:
+    void resizeEvent(QResizeEvent *) Q_DECL_OVERRIDE
+    {
+        resizeCount++;
+    }
+};
+
+void tst_QWidget_window::tst_resize_count()
+{
+    {
+        ResizeWidget resize;
+        resize.show();
+        QVERIFY(QTest::qWaitForWindowExposed(&resize));
+        QCOMPARE(resize.resizeCount, 1);
+        resize.resizeCount = 0;
+        QSize size = resize.size();
+        size.rwidth() += 10;
+        resize.resize(size);
+        QGuiApplication::sync();
+        QTRY_COMPARE(resize.resizeCount, 1);
+
+        resize.resizeCount = 0;
+
+        ResizeWidget child(&resize);
+        child.resize(200,200);
+        child.winId();
+        child.show();
+        QVERIFY(QTest::qWaitForWindowExposed(&child));
+        QGuiApplication::sync();
+        QTRY_COMPARE(child.resizeCount, 1);
+        child.resizeCount = 0;
+        size = child.size();
+        size.rwidth() += 10;
+        child.resize(size);
+        QGuiApplication::sync();
+        QCOMPARE(resize.resizeCount, 0);
+        QCOMPARE(child.resizeCount, 1);
+    }
+    {
+        ResizeWidget parent;
+        ResizeWidget child(&parent);
+        child.resize(200,200);
+        child.winId();
+        parent.show();
+        QVERIFY(QTest::qWaitForWindowExposed(&parent));
+        parent.resizeCount = 0;
+        QGuiApplication::sync();
+        QTRY_COMPARE(child.resizeCount, 1);
+        child.resizeCount = 0;
+        QSize size = child.size();
+        size.rwidth() += 10;
+        child.resize(size);
+        QGuiApplication::sync();
+        QCOMPARE(parent.resizeCount, 0);
+        QCOMPARE(child.resizeCount, 1);
+    }
+
+}
+
+class MoveWidget : public QWidget
+{
+Q_OBJECT
+public:
+    MoveWidget(QWidget *parent = 0)
+        : QWidget(parent)
+        , moveCount(0)
+    { }
+
+    void moveEvent(QMoveEvent *) Q_DECL_OVERRIDE
+    {
+        moveCount++;
+    }
+
+    int moveCount;
+};
+
+void tst_QWidget_window::tst_move_count()
+{
+    MoveWidget move;
+    move.move(500,500);
+    move.show();
+    QVERIFY(QTest::qWaitForWindowExposed(&move));
+    QTRY_VERIFY(move.moveCount >= 1);
+    move.moveCount = 0;
+
+    move.move(220,250);
+    QTRY_VERIFY(move.moveCount >= 1);
+}
 
 QTEST_MAIN(tst_QWidget_window)
 #include "tst_qwidget_window.moc"