diff --git a/src/qml/debugger/qqmlprofilerservice.cpp b/src/qml/debugger/qqmlprofilerservice.cpp
index 2d958fb1ce1b0aaa1c1b7b1e3123eea53208e597..91d27f9b11c9bc0fb3ebbc371572c601e330688d 100644
--- a/src/qml/debugger/qqmlprofilerservice.cpp
+++ b/src/qml/debugger/qqmlprofilerservice.cpp
@@ -60,67 +60,74 @@ bool QQmlProfilerService::enabled = false;
 void QQmlProfilerData::toByteArrays(QList<QByteArray> &messages) const
 {
     QByteArray data;
-    //### using QDataStream is relatively expensive
-    for (int i = 0; i < QQmlProfilerService::MaximumMessage; ++i) {
-        if ((messageType & (1 << i)) == 0)
+    Q_ASSERT_X(((messageType | detailType) & (1 << 31)) == 0, Q_FUNC_INFO, "You can use at most 31 message types and 31 detail types.");
+    for (uint decodedMessageType = 0; (messageType >> decodedMessageType) != 0; ++decodedMessageType) {
+        if ((messageType & (1 << decodedMessageType)) == 0)
             continue;
 
-        QQmlDebugStream ds(&data, QIODevice::WriteOnly);
-        ds << time << i << detailType;
-        switch (i) {
-        case QQmlProfilerService::Event:
-            if (detailType == (int)QQmlProfilerService::AnimationFrame)
-                ds << framerate << count;
-            break;
-        case QQmlProfilerService::RangeStart:
-            if (detailType == (int)QQmlProfilerService::Binding)
-                ds << bindingType;
-            break;
-        case QQmlProfilerService::RangeData:
-            ds << detailString;
-            break;
-        case QQmlProfilerService::RangeLocation:
-            ds << (detailUrl.isEmpty() ? detailString : detailUrl.toString()) << x << y;
-            break;
-        case QQmlProfilerService::RangeEnd: break;
-        case QQmlProfilerService::PixmapCacheEvent:
-            ds << detailUrl.toString();
-            switch (detailType) {
-                case QQmlProfilerService::PixmapSizeKnown: ds << x << y; break;
-                case QQmlProfilerService::PixmapReferenceCountChanged: ds << count; break;
-                case QQmlProfilerService::PixmapCacheCountChanged: ds << count; break;
-                default: break;
+        for (uint decodedDetailType = 0; (detailType >> decodedDetailType) != 0; ++decodedDetailType) {
+            if ((detailType & (1 << decodedDetailType)) == 0)
+                continue;
+
+            //### using QDataStream is relatively expensive
+            QQmlDebugStream ds(&data, QIODevice::WriteOnly);
+            ds << time << decodedMessageType << decodedDetailType;
+
+            switch (decodedMessageType) {
+            case QQmlProfilerService::Event:
+                if (decodedDetailType == (int)QQmlProfilerService::AnimationFrame)
+                    ds << framerate << count;
+                break;
+            case QQmlProfilerService::RangeStart:
+                if (decodedDetailType == (int)QQmlProfilerService::Binding)
+                    ds << bindingType;
+                break;
+            case QQmlProfilerService::RangeData:
+                ds << detailString;
+                break;
+            case QQmlProfilerService::RangeLocation:
+                ds << (detailUrl.isEmpty() ? detailString : detailUrl.toString()) << x << y;
+                break;
+            case QQmlProfilerService::RangeEnd: break;
+            case QQmlProfilerService::PixmapCacheEvent:
+                ds << detailUrl.toString();
+                switch (decodedDetailType) {
+                    case QQmlProfilerService::PixmapSizeKnown: ds << x << y; break;
+                    case QQmlProfilerService::PixmapReferenceCountChanged: ds << count; break;
+                    case QQmlProfilerService::PixmapCacheCountChanged: ds << count; break;
+                    default: break;
+                }
+                break;
+            case QQmlProfilerService::SceneGraphFrame:
+                switch (decodedDetailType) {
+                    // RendererFrame: preprocessTime, updateTime, bindingTime, renderTime
+                    case QQmlProfilerService::SceneGraphRendererFrame: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4; break;
+                    // AdaptationLayerFrame: glyphCount (which is an integer), glyphRenderTime, glyphStoreTime
+                    case QQmlProfilerService::SceneGraphAdaptationLayerFrame: ds << (int)subtime_1 << subtime_2 << subtime_3; break;
+                    // ContextFrame: compiling material time
+                    case QQmlProfilerService::SceneGraphContextFrame: ds << subtime_1; break;
+                    // RenderLoop: syncTime, renderTime, swapTime
+                    case QQmlProfilerService::SceneGraphRenderLoopFrame: ds << subtime_1 << subtime_2 << subtime_3; break;
+                    // TexturePrepare: bind, convert, swizzle, upload, mipmap
+                    case QQmlProfilerService::SceneGraphTexturePrepare: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4 << subtime_5; break;
+                    // TextureDeletion: deletionTime
+                    case QQmlProfilerService::SceneGraphTextureDeletion: ds << subtime_1; break;
+                    // PolishAndSync: polishTime, waitTime, syncTime, animationsTime,
+                    case QQmlProfilerService::SceneGraphPolishAndSync: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4; break;
+                    // WindowsRenderLoop: GL time, make current time, SceneGraph time
+                    case QQmlProfilerService::SceneGraphWindowsRenderShow: ds << subtime_1 << subtime_2 << subtime_3; break;
+                    // WindowsAnimations: update time
+                    case QQmlProfilerService::SceneGraphWindowsAnimations: ds << subtime_1; break;
+                    // WindowsRenderWindow: polish time; always comes packed after a RenderLoop
+                    case QQmlProfilerService::SceneGraphWindowsPolishFrame: ds << subtime_4; break;
+                    default:break;
+                }
+                break;
+            case QQmlProfilerService::Complete: break;
             }
-            break;
-        case QQmlProfilerService::SceneGraphFrame:
-            switch (detailType) {
-                // RendererFrame: preprocessTime, updateTime, bindingTime, renderTime
-                case QQmlProfilerService::SceneGraphRendererFrame: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4; break;
-                // AdaptationLayerFrame: glyphCount (which is an integer), glyphRenderTime, glyphStoreTime
-                case QQmlProfilerService::SceneGraphAdaptationLayerFrame: ds << (int)subtime_1 << subtime_2 << subtime_3; break;
-                // ContextFrame: compiling material time
-                case QQmlProfilerService::SceneGraphContextFrame: ds << subtime_1; break;
-                // RenderLoop: syncTime, renderTime, swapTime
-                case QQmlProfilerService::SceneGraphRenderLoopFrame: ds << subtime_1 << subtime_2 << subtime_3; break;
-                // TexturePrepare: bind, convert, swizzle, upload, mipmap
-                case QQmlProfilerService::SceneGraphTexturePrepare: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4 << subtime_5; break;
-                // TextureDeletion: deletionTime
-                case QQmlProfilerService::SceneGraphTextureDeletion: ds << subtime_1; break;
-                // PolishAndSync: polishTime, waitTime, syncTime, animationsTime,
-                case QQmlProfilerService::SceneGraphPolishAndSync: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4; break;
-                // WindowsRenderLoop: GL time, make current time, SceneGraph time
-                case QQmlProfilerService::SceneGraphWindowsRenderShow: ds << subtime_1 << subtime_2 << subtime_3; break;
-                // WindowsAnimations: update time
-                case QQmlProfilerService::SceneGraphWindowsAnimations: ds << subtime_1; break;
-                // WindowsRenderWindow: polish time
-                case QQmlProfilerService::SceneGraphWindowsPolishFrame: ds << subtime_1; break;
-                default:break;
-            }
-            break;
-        case QQmlProfilerService::Complete: break;
+            messages << data;
+            data.clear();
         }
-        messages << data;
-        data.clear();
     }
 }
 
@@ -176,7 +183,7 @@ bool QQmlProfilerService::startProfilingImpl()
     if (QQmlDebugService::isDebuggingEnabled() && !enabled) {
         enabled = true;
         QList<QByteArray> messages;
-        QQmlProfilerData(m_timer.nsecsElapsed(), 1 << Event, StartTrace).toByteArrays(messages);
+        QQmlProfilerData(m_timer.nsecsElapsed(), 1 << Event, 1 << StartTrace).toByteArrays(messages);
         QQmlDebugService::sendMessages(messages);
         return true;
     } else {
@@ -190,7 +197,7 @@ bool QQmlProfilerService::stopProfilingImpl()
         enabled = false;
         // We cannot use instance here as this is called from the debugger thread.
         // It may be called before the QML engine (and the profiler) is ready.
-        processMessage(QQmlProfilerData(m_timer.nsecsElapsed(), 1 << Event, EndTrace));
+        processMessage(QQmlProfilerData(m_timer.nsecsElapsed(), 1 << Event, 1 << EndTrace));
         return true;
     } else {
         return false;
diff --git a/src/qml/debugger/qqmlprofilerservice_p.h b/src/qml/debugger/qqmlprofilerservice_p.h
index 20c023eb24d769e5fa289f385d8b2e8d7c7fcdb9..6d7c0dcb514221fc6ee1e1eff51265c845c82e2f 100644
--- a/src/qml/debugger/qqmlprofilerservice_p.h
+++ b/src/qml/debugger/qqmlprofilerservice_p.h
@@ -65,12 +65,20 @@
 #include <QtCore/qstringbuilder.h>
 #include <QtCore/qwaitcondition.h>
 
-#define Q_QML_PROFILE(Method)\
+#define Q_QML_PROFILE_IF_ENABLED(Code)\
     if (QQmlProfilerService::enabled) {\
-        QQmlProfilerService::Method;\
+        Code;\
     } else\
         (void)0
 
+#define Q_QML_PROFILE(Method)\
+    Q_QML_PROFILE_IF_ENABLED(QQmlProfilerService::Method)
+
+#define Q_QML_SG_PROFILE2(Type1, Type2, Params)\
+    Q_QML_PROFILE_IF_ENABLED((QQmlProfilerService::sceneGraphFrame<Type1, Type2> Params))
+
+#define Q_QML_SG_PROFILE1(Type, Params) Q_QML_SG_PROFILE2(Type, Type, Params)
+
 QT_BEGIN_NAMESPACE
 
 // This struct is somewhat dangerous to use:
@@ -230,9 +238,11 @@ public:
     static bool startProfiling();
     static bool stopProfiling();
 
-    static void addEvent(EventType event)
+    template<EventType DetailType>
+    static void addEvent()
     {
-        instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << Event, event));
+        instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << Event,
+                                                  1 << DetailType));
     }
 
     static void animationFrame(qint64 delta)
@@ -241,38 +251,40 @@ public:
 
         if (animCount > 0 && delta > 0) {
             instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << Event,
-                                                      AnimationFrame, QString(), 0, 0,
+                                                      1 << AnimationFrame, QString(), 0, 0,
                                                       1000 / (int)delta /* trim fps to integer */,
                                                       animCount));
         }
     }
 
-    static void sceneGraphFrame(SceneGraphFrameType frameType, qint64 value1, qint64 value2 = -1,
-                                qint64 value3 = -1, qint64 value4 = -1, qint64 value5 = -1)
+    template<SceneGraphFrameType FrameType1, SceneGraphFrameType FrameType2>
+    static void sceneGraphFrame(qint64 value1, qint64 value2 = -1, qint64 value3 = -1,
+                                qint64 value4 = -1, qint64 value5 = -1)
     {
         instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << SceneGraphFrame,
-                                                  frameType, value1, value2, value3, value4,
-                                                  value5));
+                                                  1 << FrameType1 | 1 << FrameType2,
+                                                  value1, value2, value3, value4, value5));
     }
 
-    static void pixmapEvent(PixmapEventType eventType, const QUrl &url)
+    template<PixmapEventType PixmapState>
+    static void pixmapStateChanged(const QUrl &url)
     {
         instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << PixmapCacheEvent,
-                                                  eventType, url));
+                                                  1 << PixmapState, url));
     }
 
-    static void pixmapEvent(PixmapEventType eventType, const QUrl &url, int count)
+    static void pixmapLoadingFinished(const QUrl &url, const QSize &size)
     {
         instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << PixmapCacheEvent,
-                                                  eventType, url, 0, 0, 0, count));
+                (1 << PixmapLoadingFinished) | ((size.width() > 0 && size.height() > 0) ? (1 << PixmapSizeKnown) : 0),
+                url, size.width(), size.height()));
     }
 
-    static void pixmapEvent(PixmapEventType eventType, const QUrl &url, const QSize &size)
+    template<PixmapEventType CountType>
+    static void pixmapCountChanged(const QUrl &url, int count)
     {
-        if (size.width() > 0 && size.height() > 0) {
-            instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << PixmapCacheEvent,
-                                                      eventType, url, size.width(), size.height()));
-        }
+        instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << PixmapCacheEvent,
+                                                  1 << CountType, url, 0, 0, 0, count));
     }
 
     qint64 timestamp() {return m_timer.nsecsElapsed();}
@@ -290,57 +302,57 @@ private:
     bool startProfilingImpl();
     bool stopProfilingImpl();
 
-    static void startRange(RangeType range, const QString &fileName, int line, int column,
-                           BindingType bindingType = QmlBinding)
+    static void startBinding(const QString &fileName, int line, int column, BindingType bindingType)
     {
         instance->processMessage(QQmlProfilerData(instance->timestamp(),
-                                                  (1 << RangeStart | 1 << RangeLocation), range,
-                                                  fileName, line, column, 0, 0, bindingType));
+                                                  (1 << RangeStart | 1 << RangeLocation),
+                                                  1 << Binding, fileName, line, column, 0, 0,
+                                                  bindingType));
     }
 
     // Have toByteArrays() construct another RangeData event from the same QString later.
     // This is somewhat pointless but important for backwards compatibility.
-    static void startRangeWithData(RangeType range, const QString &name, int line, int column,
-                                   BindingType bindingType = QmlBinding)
+    static void startCompiling(const QString &name)
     {
-        instance->processMessage(QQmlProfilerData(instance->timestamp(), (1 << RangeStart | 1 << RangeLocation | 1 << RangeData),
-                                                  range, name, line, column, 0, 0, bindingType));
+        instance->processMessage(QQmlProfilerData(instance->timestamp(),
+                       (1 << RangeStart | 1 << RangeLocation | 1 << RangeData), 1 << Compiling,
+                       name, 1, 1, 0, 0, QmlBinding));
     }
 
-    static void startRange(RangeType range, const QUrl &fileName, int line, int column,
-                           BindingType bindingType = QmlBinding)
+    static void startHandlingSignal(const QString &fileName, int line, int column)
     {
         instance->processMessage(QQmlProfilerData(instance->timestamp(),
                                                   (1 << RangeStart | 1 << RangeLocation),
-                                                  range, fileName, line, column, 0, 0,
-                                                  bindingType));
+                                                  1 << HandlingSignal, fileName, line, column, 0, 0,
+                                                  QmlBinding));
     }
 
-    static void startRange(RangeType range, const QString &rData, const QUrl &fileName, int line,
-                           int column, BindingType bindingType = QmlBinding)
+    static void startCreating(const QString &typeName, const QUrl &fileName, int line, int column)
     {
-        instance->processMessage(QQmlProfilerData(instance->timestamp(), (1 << RangeStart | 1 << RangeLocation | 1 << RangeData),
-                                                  range, rData, fileName, line, column, 0, 0,
-                                                  bindingType));
+        instance->processMessage(QQmlProfilerData(instance->timestamp(),
+                                                  (1 << RangeStart | 1 << RangeLocation | 1 << RangeData),
+                                                  1 << Creating, typeName, fileName, line, column,
+                                                  0, 0, QmlBinding));
     }
 
-    static void startRange(RangeType range, const QString &rData,
-                           BindingType bindingType = QmlBinding)
+    static void startCreating(const QString &typeName)
     {
         instance->processMessage(QQmlProfilerData(instance->timestamp(),
-                                                  (1 << RangeStart | 1 << RangeData), range,
-                                                  rData, 0, 0, 0, 0, bindingType));
+                                                  (1 << RangeStart | 1 << RangeData), 1 << Creating,
+                                                  typeName, 0, 0, 0, 0, QmlBinding));
     }
 
-    static void rangeLocation(RangeType range, const QUrl &fileName, int line, int column)
+    static void creatingLocation(const QUrl &fileName, int line, int column)
     {
-        instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << RangeLocation, range,
-                                        fileName, line, column));
+        instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << RangeLocation,
+                                                  1 << Creating, fileName, line, column));
     }
 
-    static void endRange(RangeType range)
+    template<RangeType Range>
+    static void endRange()
     {
-        instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << RangeEnd, range));
+        instance->processMessage(QQmlProfilerData(instance->timestamp(), 1 << RangeEnd,
+                                                  1 << Range));
     }
 
     void sendMessages();
@@ -377,45 +389,41 @@ private:
 struct QQmlBindingProfiler {
     QQmlBindingProfiler(const QString &url, int line, int column, QQmlProfilerService::BindingType bindingType)
     {
-        Q_QML_PROFILE(startRange(QQmlProfilerService::Binding, url, line, column, bindingType));
+        Q_QML_PROFILE(startBinding(url, line, column, bindingType));
     }
 
     ~QQmlBindingProfiler()
     {
-        Q_QML_PROFILE(endRange(QQmlProfilerService::Binding));
+        Q_QML_PROFILE(endRange<QQmlProfilerService::Binding>());
     }
 };
 
 struct QQmlHandlingSignalProfiler {
     QQmlHandlingSignalProfiler(QQmlBoundSignalExpression *expression)
     {
-        Q_QML_PROFILE(startRange(QQmlProfilerService::HandlingSignal,
-                expression->sourceFile(), expression->lineNumber(), expression->columnNumber()));
+        Q_QML_PROFILE(startHandlingSignal(expression->sourceFile(), expression->lineNumber(),
+                                          expression->columnNumber()));
     }
 
     ~QQmlHandlingSignalProfiler()
     {
-        Q_QML_PROFILE(endRange(QQmlProfilerService::HandlingSignal));
+        Q_QML_PROFILE(endRange<QQmlProfilerService::HandlingSignal>());
     }
 };
 
 struct QQmlCompilingProfiler {
     QQmlCompilingProfiler(const QString &name)
     {
-        Q_QML_PROFILE(startRangeWithData(QQmlProfilerService::Compiling, name, 1, 1));
+        Q_QML_PROFILE(startCompiling(name));
     }
 
     ~QQmlCompilingProfiler()
     {
-        Q_QML_PROFILE(endRange(QQmlProfilerService::Compiling));
+        Q_QML_PROFILE(endRange<QQmlProfilerService::Compiling>());
     }
 };
 
-#define Q_QML_VME_PROFILE(Method)\
-    if (QQmlProfilerService::enabled)\
-        Method;\
-    else\
-        (void)0
+#define Q_QML_VME_PROFILE(Method) Q_QML_PROFILE_IF_ENABLED(Method)
 
 struct QQmlVmeProfiler {
 public:
@@ -434,9 +442,9 @@ public:
     {
         ranges.clear();
         if (running)
-            QQmlProfilerService::instance->endRange(QQmlProfilerService::Creating);
+            QQmlProfilerService::instance->endRange<QQmlProfilerService::Creating>();
         for (int i = 0; i < backgroundRanges.count(); ++i) {
-            QQmlProfilerService::instance->endRange(QQmlProfilerService::Creating);
+            QQmlProfilerService::instance->endRange<QQmlProfilerService::Creating>();
         }
         backgroundRanges.clear();
         running = false;
@@ -445,10 +453,10 @@ public:
     void startBackground(const QString &typeName)
     {
         if (running) {
-            QQmlProfilerService::instance->endRange(QQmlProfilerService::Creating);
+            QQmlProfilerService::instance->endRange<QQmlProfilerService::Creating>();
             running = false;
         }
-        QQmlProfilerService::instance->startRange(QQmlProfilerService::Creating, typeName);
+        QQmlProfilerService::instance->startCreating(typeName);
         backgroundRanges.push(typeName);
     }
 
@@ -456,14 +464,13 @@ public:
     {
         switchRange();
         setCurrentRange(typeName, url, line, column);
-        QQmlProfilerService::instance->startRange(QQmlProfilerService::Creating, typeName, url,
-                                                  line, column);
+        QQmlProfilerService::instance->startCreating(typeName, url, line, column);
     }
 
     void stop()
     {
         if (running) {
-            QQmlProfilerService::instance->endRange(QQmlProfilerService::Creating);
+            QQmlProfilerService::instance->endRange<QQmlProfilerService::Creating>();
             running = false;
         }
     }
@@ -473,9 +480,8 @@ public:
         if (ranges.count() > 0) {
             switchRange();
             currentRange = ranges.pop();
-            QQmlProfilerService::instance->startRange(QQmlProfilerService::Creating,
-                                                      currentRange.typeName, currentRange.url,
-                                                      currentRange.line, currentRange.column);
+            QQmlProfilerService::instance->startCreating(currentRange.typeName, currentRange.url,
+                                                         currentRange.line, currentRange.column);
         }
     }
 
@@ -490,8 +496,7 @@ public:
         if (backgroundRanges.count() > 0) {
             switchRange();
             setCurrentRange(backgroundRanges.pop(), url, line, column);
-            QQmlProfilerService::instance->rangeLocation(
-                    QQmlProfilerService::Creating, url, line, column);
+            QQmlProfilerService::instance->creatingLocation(url, line, column);
         }
     }
 
@@ -500,7 +505,7 @@ private:
     void switchRange()
     {
         if (running)
-            QQmlProfilerService::instance->endRange(QQmlProfilerService::Creating);
+            QQmlProfilerService::instance->endRange<QQmlProfilerService::Creating>();
         else
             running = true;
     }
diff --git a/src/quick/items/qquickview.cpp b/src/quick/items/qquickview.cpp
index f78ba3520ca2b6caa1629e4fe0b3d11fbf7ab7fe..1a3d2259952b5e3173f72fa16c4e0e401278f5d7 100644
--- a/src/quick/items/qquickview.cpp
+++ b/src/quick/items/qquickview.cpp
@@ -603,7 +603,7 @@ void QQuickView::resizeEvent(QResizeEvent *e)
 /*! \reimp */
 void QQuickView::keyPressEvent(QKeyEvent *e)
 {
-    Q_QML_PROFILE(addEvent(QQmlProfilerService::Key));
+    Q_QML_PROFILE(addEvent<QQmlProfilerService::Key>());
 
     QQuickWindow::keyPressEvent(e);
 }
@@ -611,7 +611,7 @@ void QQuickView::keyPressEvent(QKeyEvent *e)
 /*! \reimp */
 void QQuickView::keyReleaseEvent(QKeyEvent *e)
 {
-    Q_QML_PROFILE(addEvent(QQmlProfilerService::Key));
+    Q_QML_PROFILE(addEvent<QQmlProfilerService::Key>());
 
     QQuickWindow::keyReleaseEvent(e);
 }
@@ -619,7 +619,7 @@ void QQuickView::keyReleaseEvent(QKeyEvent *e)
 /*! \reimp */
 void QQuickView::mouseMoveEvent(QMouseEvent *e)
 {
-    Q_QML_PROFILE(addEvent(QQmlProfilerService::Mouse));
+    Q_QML_PROFILE(addEvent<QQmlProfilerService::Mouse>());
 
     QQuickWindow::mouseMoveEvent(e);
 }
@@ -627,7 +627,7 @@ void QQuickView::mouseMoveEvent(QMouseEvent *e)
 /*! \reimp */
 void QQuickView::mousePressEvent(QMouseEvent *e)
 {
-    Q_QML_PROFILE(addEvent(QQmlProfilerService::Mouse));
+    Q_QML_PROFILE(addEvent<QQmlProfilerService::Mouse>());
 
     QQuickWindow::mousePressEvent(e);
 }
@@ -635,7 +635,7 @@ void QQuickView::mousePressEvent(QMouseEvent *e)
 /*! \reimp */
 void QQuickView::mouseReleaseEvent(QMouseEvent *e)
 {
-    Q_QML_PROFILE(addEvent(QQmlProfilerService::Mouse));
+    Q_QML_PROFILE(addEvent<QQmlProfilerService::Mouse>());
 
     QQuickWindow::mouseReleaseEvent(e);
 }
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index 297bea6e6ae75bf9f122bb95d1c244efaeb04b6b..700ec051ff3c3a967349138bc67a53bc663fb8be 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -171,8 +171,7 @@ ShaderManager::Shader *ShaderManager::prepareMaterial(QSGMaterial *material)
     if (qsg_render_timing)
         qDebug("   - compiling material: %dms", (int) qsg_renderer_timer.elapsed());
 
-    Q_QML_PROFILE(sceneGraphFrame(
-            QQmlProfilerService::SceneGraphContextFrame,
+    Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphContextFrame, (
             qsg_renderer_timer.nsecsElapsed()));
 #endif
 
@@ -208,8 +207,7 @@ ShaderManager::Shader *ShaderManager::prepareMaterialNoRewrite(QSGMaterial *mate
     if (qsg_render_timing)
         qDebug("   - compiling material: %dms", (int) qsg_renderer_timer.elapsed());
 
-    Q_QML_PROFILE(sceneGraphFrame(
-            QQmlProfilerService::SceneGraphContextFrame,
+    Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphContextFrame, (
             qsg_renderer_timer.nsecsElapsed()));
 #endif
 
diff --git a/src/quick/scenegraph/coreapi/qsgrenderer.cpp b/src/quick/scenegraph/coreapi/qsgrenderer.cpp
index 44b80df15d6fe43dddaddc5fe5a7c9df2cf584f1..047891e17c507aa43d50b5003396b980f0b28ace 100644
--- a/src/quick/scenegraph/coreapi/qsgrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgrenderer.cpp
@@ -287,8 +287,7 @@ void QSGRenderer::renderScene(const QSGBindable &bindable)
                int(renderTime / 1000000));
     }
 
-    Q_QML_PROFILE(sceneGraphFrame(
-            QQmlProfilerService::SceneGraphRendererFrame,
+    Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphRendererFrame, (
             preprocessTime,
             updatePassTime - preprocessTime,
             bindTime - updatePassTime,
diff --git a/src/quick/scenegraph/qsgadaptationlayer.cpp b/src/quick/scenegraph/qsgadaptationlayer.cpp
index 8798208ea3b56bf2e6738fcf8381054d9e5bf1da..aa678b34a6d69038bcb46deeda78e9f1cbb12626 100644
--- a/src/quick/scenegraph/qsgadaptationlayer.cpp
+++ b/src/quick/scenegraph/qsgadaptationlayer.cpp
@@ -196,8 +196,7 @@ void QSGDistanceFieldGlyphCache::update()
                (int) qsg_render_timer.elapsed());
 
     }
-    Q_QML_PROFILE(sceneGraphFrame(
-            QQmlProfilerService::SceneGraphAdaptationLayerFrame,
+    Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphAdaptationLayerFrame, (
             count,
             renderTime,
             qsg_render_timer.nsecsElapsed() - renderTime));
diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp
index facb11d2754de5da28d91b14a892c8cab51d6683..5559745621735a3fb27b4ac58304ba0d83ae6d32 100644
--- a/src/quick/scenegraph/qsgrenderloop.cpp
+++ b/src/quick/scenegraph/qsgrenderloop.cpp
@@ -342,8 +342,7 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window)
         lastFrameTime = QTime::currentTime();
     }
 
-    Q_QML_PROFILE(sceneGraphFrame(
-            QQmlProfilerService::SceneGraphRenderLoopFrame,
+    Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphRenderLoopFrame, (
             syncTime,
             renderTime,
             swapTime));
diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
index 98a88a85402abe34cfb209c5ae6aaecdde546f6a..bc08b70557bbca095f10c8bf4eb43447d6784050 100644
--- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp
+++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
@@ -609,8 +609,7 @@ void QSGRenderThread::syncAndRender()
                    int((renderTime - syncTime)/1000000),
                    int(threadTimer.elapsed() - renderTime/1000000));
 
-        Q_QML_PROFILE(sceneGraphFrame(
-                QQmlProfilerService::SceneGraphRenderLoopFrame,
+        Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphRenderLoopFrame, (
                 syncTime,
                 renderTime - syncTime,
                 threadTimer.nsecsElapsed() - renderTime));
@@ -1141,8 +1140,7 @@ void QSGThreadedRenderLoop::polishAndSync(Window *w)
                int((syncTime - waitTime)/1000000),
                int((timer.nsecsElapsed() - syncTime)/1000000));
 
-    Q_QML_PROFILE(sceneGraphFrame(
-            QQmlProfilerService::SceneGraphPolishAndSync,
+    Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphPolishAndSync, (
             polishTime,
             waitTime - polishTime,
             syncTime - waitTime,
diff --git a/src/quick/scenegraph/qsgwindowsrenderloop.cpp b/src/quick/scenegraph/qsgwindowsrenderloop.cpp
index 14569788b0185738c479e1a3d74ad847a8a6d838..c3656eac7ac38b7d878db677077ec19a6fa60ac8 100644
--- a/src/quick/scenegraph/qsgwindowsrenderloop.cpp
+++ b/src/quick/scenegraph/qsgwindowsrenderloop.cpp
@@ -202,8 +202,7 @@ void QSGWindowsRenderLoop::show(QQuickWindow *window)
                    int((time_current - time_created)/1000000),
                    int((qsg_render_timer.nsecsElapsed() - time_current)/1000000));
         }
-        Q_QML_PROFILE(sceneGraphFrame(
-                QQmlProfilerService::SceneGraphWindowsRenderShow,
+        Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphWindowsRenderShow, (
                 time_created - time_start,
                 time_current - time_created,
                 qsg_render_timer.nsecsElapsed() - time_current));
@@ -405,8 +404,7 @@ void QSGWindowsRenderLoop::render()
             qDebug("WindowsRenderLoop: animations=%d ms",
                    int((qsg_render_timer.nsecsElapsed() - time_start)/1000000));
         }
-        Q_QML_PROFILE(sceneGraphFrame(
-                QQmlProfilerService::SceneGraphWindowsAnimations,
+        Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphWindowsAnimations, (
                 qsg_render_timer.nsecsElapsed() - time_start));
 #endif
 
@@ -469,12 +467,13 @@ void QSGWindowsRenderLoop::renderWindow(QQuickWindow *window)
                    int((time_rendered - time_synced)/1000000),
                    int((time_swapped - time_rendered)/1000000));
         }
-        Q_QML_PROFILE(sceneGraphFrame(QQmlProfilerService::SceneGraphWindowsPolishFrame,
-                time_polished - time_start));
-        Q_QML_PROFILE(sceneGraphFrame(QQmlProfilerService::SceneGraphRenderLoopFrame,
+
+        Q_QML_SG_PROFILE2(QQmlProfilerService::SceneGraphWindowsPolishFrame,
+                          QQmlProfilerService::SceneGraphRenderLoopFrame, (
                 time_synced - time_polished,
                 time_rendered - time_synced,
-                time_swapped - time_rendered));
+                time_swapped - time_rendered,
+                time_polished - time_start));
 #endif
 }
 
diff --git a/src/quick/scenegraph/util/qsgatlastexture.cpp b/src/quick/scenegraph/util/qsgatlastexture.cpp
index 0fce410b62d5bd2649e942d79e2aa9142832cae7..6e0fdc729004886b827b58ac88552dc166d4a7c8 100644
--- a/src/quick/scenegraph/util/qsgatlastexture.cpp
+++ b/src/quick/scenegraph/util/qsgatlastexture.cpp
@@ -381,8 +381,7 @@ bool Atlas::bind(QSGTexture::Filtering filtering)
                    (int) (qsg_renderer_timer.elapsed()));
         }
 
-        Q_QML_PROFILE(sceneGraphFrame(
-                QQmlProfilerService::SceneGraphTexturePrepare,
+        Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphTexturePrepare, (
                 0,  // bind (not relevant)
                 0,  // convert (not relevant)
                 0,  // swizzle (not relevant)
diff --git a/src/quick/scenegraph/util/qsgtexture.cpp b/src/quick/scenegraph/util/qsgtexture.cpp
index 4243e718449d61923997567d6db342cd0e3a8a25..d84ccb7a1f141f9e88b4382830b38e41f5fb6d6e 100644
--- a/src/quick/scenegraph/util/qsgtexture.cpp
+++ b/src/quick/scenegraph/util/qsgtexture.cpp
@@ -634,8 +634,7 @@ void QSGPlainTexture::bind()
                        m_texture_size.width(),
                        m_texture_size.height());
             }
-            Q_QML_PROFILE(sceneGraphFrame(
-                    QQmlProfilerService::SceneGraphTextureDeletion,
+            Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphTextureDeletion, (
                     qsg_renderer_timer.nsecsElapsed()));
 #endif
         }
@@ -736,8 +735,7 @@ void QSGPlainTexture::bind()
 
     }
 
-    Q_QML_PROFILE(sceneGraphFrame(
-            QQmlProfilerService::SceneGraphTexturePrepare,
+    Q_QML_SG_PROFILE1(QQmlProfilerService::SceneGraphTexturePrepare, (
             bindTime,
             convertTime - bindTime,
             swizzleTime - convertTime,
diff --git a/src/quick/util/qquickpixmapcache.cpp b/src/quick/util/qquickpixmapcache.cpp
index 0260bd1683d7d2dd01f4e93b615210cb6a082e86..af66ef26a4ab08b4c625e18056da98f304b5e9bc 100644
--- a/src/quick/util/qquickpixmapcache.cpp
+++ b/src/quick/util/qquickpixmapcache.cpp
@@ -519,7 +519,7 @@ void QQuickPixmapReader::processJobs()
             runningJob->loading = true;
 
             QUrl url = runningJob->url;
-            Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapLoadingStarted, url));
+            Q_QML_PROFILE(pixmapStateChanged<QQmlProfilerService::PixmapLoadingStarted>(url));
 
             QSize requestSize = runningJob->requestSize;
             locker.unlock();
@@ -897,11 +897,10 @@ bool QQuickPixmapReply::event(QEvent *event)
             if (data->pixmapStatus == QQuickPixmap::Ready) {
                 data->textureFactory = de->textureFactory;
                 data->implicitSize = de->implicitSize;
-                Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapLoadingFinished, data->url));
-                Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapSizeKnown, url,
+                Q_QML_PROFILE(pixmapLoadingFinished(data->url,
                         data->requestSize.width() > 0 ? data->requestSize : data->implicitSize));
             } else {
-                Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapLoadingError, data->url));
+                Q_QML_PROFILE(pixmapStateChanged<QQmlProfilerService::PixmapLoadingError>(data->url));
                 data->errorString = de->errorString;
                 data->removeFromCache(); // We don't continue to cache error'd pixmaps
             }
@@ -927,7 +926,7 @@ int QQuickPixmapData::cost() const
 void QQuickPixmapData::addref()
 {
     ++refCount;
-    Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapReferenceCountChanged, url, refCount));
+    Q_QML_PROFILE(pixmapCountChanged<QQmlProfilerService::PixmapReferenceCountChanged>(url, refCount));
     if (prevUnreferencedPtr) 
         pixmapStore()->referencePixmap(this);
 }
@@ -936,7 +935,7 @@ void QQuickPixmapData::release()
 {
     Q_ASSERT(refCount > 0);
     --refCount;
-    Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapReferenceCountChanged, url, refCount));
+    Q_QML_PROFILE(pixmapCountChanged<QQmlProfilerService::PixmapReferenceCountChanged>(url, refCount));
     if (refCount == 0) {
         if (reply) {
             QQuickPixmapReply *cancelReply = reply;
@@ -967,7 +966,7 @@ void QQuickPixmapData::addToCache()
         QQuickPixmapKey key = { &url, &requestSize };
         pixmapStore()->m_cache.insert(key, this);
         inCache = true;
-        Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapCacheCountChanged,
+        Q_QML_PROFILE(pixmapCountChanged<QQmlProfilerService::PixmapCacheCountChanged>(
                 url, pixmapStore()->m_cache.count()));
     }
 }
@@ -976,7 +975,7 @@ void QQuickPixmapData::removeFromCache()
 {
     if (inCache) {
         QQuickPixmapKey key = { &url, &requestSize };
-        Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapCacheCountChanged,
+        Q_QML_PROFILE(pixmapCountChanged<QQmlProfilerService::PixmapCacheCountChanged>(
                 url, pixmapStore()->m_cache.count()));
         pixmapStore()->m_cache.remove(key);
         inCache = false;
@@ -1240,18 +1239,17 @@ void QQuickPixmap::load(QQmlEngine *engine, const QUrl &url, const QSize &reques
 
         if (!(options & QQuickPixmap::Asynchronous)) {
             bool ok = false;
-            Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapLoadingStarted, url));
+            Q_QML_PROFILE(pixmapStateChanged<QQmlProfilerService::PixmapLoadingStarted>(url));
             d = createPixmapDataSync(this, engine, url, requestSize, &ok);
             if (ok) {
-                Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapLoadingFinished, url));
-                Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapSizeKnown, url,
+                Q_QML_PROFILE(pixmapLoadingFinished(url,
                         d->requestSize.width() > 0 ? d->requestSize : d->implicitSize));
                 if (options & QQuickPixmap::Cache)
                     d->addToCache();
                 return;
             }
             if (d) { // loadable, but encountered error while loading
-                Q_QML_PROFILE(pixmapEvent(QQmlProfilerService::PixmapLoadingError, url));
+                Q_QML_PROFILE(pixmapStateChanged<QQmlProfilerService::PixmapLoadingError>(url));
                 return;
             }
         } 
diff --git a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp
index acbc62807b45239d422047a2bc5454d63b74c586..56ed65f54d0834aa93ded3ff4deb13bfc32abb91 100644
--- a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp
+++ b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp
@@ -422,15 +422,15 @@ void tst_QQmlProfilerService::pixmapCacheData()
     QCOMPARE(m_client->traceMessages[16].messageType, (int)QQmlProfilerClient::PixmapCacheEvent);
     QCOMPARE(m_client->traceMessages[16].detailType, (int)QQmlProfilerClient::PixmapLoadingStarted);
 
-    // image loaded
+    // image size
     QCOMPARE(m_client->traceMessages[17].messageType, (int)QQmlProfilerClient::PixmapCacheEvent);
-    QCOMPARE(m_client->traceMessages[17].detailType, (int)QQmlProfilerClient::PixmapLoadingFinished);
+    QCOMPARE(m_client->traceMessages[17].detailType, (int)QQmlProfilerClient::PixmapSizeKnown);
+    QCOMPARE(m_client->traceMessages[17].line, 2); // width
+    QCOMPARE(m_client->traceMessages[17].column, 2); // height
 
-    // image size
+    // image loaded
     QCOMPARE(m_client->traceMessages[18].messageType, (int)QQmlProfilerClient::PixmapCacheEvent);
-    QCOMPARE(m_client->traceMessages[18].detailType, (int)QQmlProfilerClient::PixmapSizeKnown);
-    QCOMPARE(m_client->traceMessages[18].line, 2); // width
-    QCOMPARE(m_client->traceMessages[18].column, 2); // height
+    QCOMPARE(m_client->traceMessages[18].detailType, (int)QQmlProfilerClient::PixmapLoadingFinished);
 
     // cache size
     QCOMPARE(m_client->traceMessages[19].messageType, (int)QQmlProfilerClient::PixmapCacheEvent);