diff --git a/src/libs/qmldebug/baseenginedebugclient.cpp b/src/libs/qmldebug/baseenginedebugclient.cpp
index e04d60cb02511a0fe52e51e9e1c26dd4fb7faa7f..a3fea23b34b17c2485cfde25933c5a9b293e0d26 100644
--- a/src/libs/qmldebug/baseenginedebugclient.cpp
+++ b/src/libs/qmldebug/baseenginedebugclient.cpp
@@ -30,6 +30,7 @@
 
 #include "baseenginedebugclient.h"
 #include "qmldebugconstants.h"
+#include "qpacketprotocol.h"
 
 namespace QmlDebug {
 
@@ -182,7 +183,7 @@ void BaseEngineDebugClient::stateChanged(State state)
 
 void BaseEngineDebugClient::messageReceived(const QByteArray &data)
 {
-    QmlDebugStream ds(data);
+    QPacket ds(connection()->currentDataStreamVersion(), data);
     int queryId;
     QByteArray type;
     ds >> type >> queryId;
@@ -254,11 +255,10 @@ quint32 BaseEngineDebugClient::addWatch(const PropertyReference &property)
     quint32 id = 0;
     if (state() == Enabled) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("WATCH_PROPERTY") << id << property.m_objectDebugId
            << property.m_name.toUtf8();
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -276,10 +276,9 @@ quint32 BaseEngineDebugClient::addWatch(const ObjectReference &object,
     quint32 id = 0;
     if (state() == Enabled) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("WATCH_EXPR_OBJECT") << id << object.m_debugId << expr;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -289,10 +288,9 @@ quint32 BaseEngineDebugClient::addWatch(int objectDebugId)
     quint32 id = 0;
     if (state() == Enabled) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("WATCH_OBJECT") << id << objectDebugId;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -306,10 +304,9 @@ quint32 BaseEngineDebugClient::addWatch(const FileReference &/*file*/)
 void BaseEngineDebugClient::removeWatch(quint32 id)
 {
     if (state() == Enabled) {
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("NO_WATCH") << id;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
 }
 
@@ -318,10 +315,9 @@ quint32 BaseEngineDebugClient::queryAvailableEngines()
     quint32 id = 0;
     if (state() == Enabled) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("LIST_ENGINES") << id;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -331,10 +327,9 @@ quint32 BaseEngineDebugClient::queryRootContexts(const EngineReference &engine)
     quint32 id = 0;
     if (state() == Enabled && engine.m_debugId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("LIST_OBJECTS") << id << engine.m_debugId;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -344,11 +339,10 @@ quint32 BaseEngineDebugClient::queryObject(int objectId)
     quint32 id = 0;
     if (state() == Enabled && objectId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("FETCH_OBJECT") << id << objectId << false <<
               true;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -358,11 +352,10 @@ quint32 BaseEngineDebugClient::queryObjectRecursive(int objectId)
     quint32 id = 0;
     if (state() == Enabled && objectId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("FETCH_OBJECT") << id << objectId << true <<
               true;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -374,11 +367,10 @@ quint32 BaseEngineDebugClient::queryExpressionResult(int objectDebugId,
     quint32 id = 0;
     if (state() == Enabled && objectDebugId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("EVAL_EXPRESSION") << id << objectDebugId << expr
            << engineId;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -393,11 +385,10 @@ quint32 BaseEngineDebugClient::setBindingForObject(
     quint32 id = 0;
     if (state() == Enabled && objectDebugId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("SET_BINDING") << id << objectDebugId << propertyName
            << bindingExpression << isLiteralValue << source << line;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -409,10 +400,9 @@ quint32 BaseEngineDebugClient::resetBindingForObject(
     quint32 id = 0;
     if (state() == Enabled && objectDebugId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("RESET_BINDING") << id << objectDebugId << propertyName;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -424,11 +414,10 @@ quint32 BaseEngineDebugClient::setMethodBody(
     quint32 id = 0;
     if (state() == Enabled && objectDebugId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("SET_METHOD_BODY") << id << objectDebugId
            << methodName << methodBody;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -439,12 +428,11 @@ quint32 BaseEngineDebugClient::queryObjectsForLocation(
     quint32 id = 0;
     if (state() == Enabled) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("FETCH_OBJECTS_FOR_LOCATION") << id <<
               fileName << lineNumber << columnNumber << false <<
               true;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
diff --git a/src/libs/qmldebug/declarativeenginedebugclient.cpp b/src/libs/qmldebug/declarativeenginedebugclient.cpp
index 1e77b4d869a9fcdf83b2e9fe34545ce55654d819..d9dff061e0f34edf3b3bae661be038ca06ddd110 100644
--- a/src/libs/qmldebug/declarativeenginedebugclient.cpp
+++ b/src/libs/qmldebug/declarativeenginedebugclient.cpp
@@ -31,6 +31,7 @@
 #include "declarativeenginedebugclient.h"
 #include "qmldebugconstants.h"
 #include "qmldebugclient.h"
+#include "qpacketprotocol.h"
 
 namespace QmlDebug {
 
@@ -50,11 +51,10 @@ quint32 DeclarativeEngineDebugClient::setBindingForObject(
     quint32 id = 0;
     if (state() == Enabled && objectDebugId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("SET_BINDING") << objectDebugId << propertyName
            << bindingExpression << isLiteralValue << source << line;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -66,10 +66,9 @@ quint32 DeclarativeEngineDebugClient::resetBindingForObject(
     quint32 id = 0;
     if (state() == Enabled && objectDebugId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("RESET_BINDING") << objectDebugId << propertyName;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
@@ -81,18 +80,17 @@ quint32 DeclarativeEngineDebugClient::setMethodBody(
     quint32 id = 0;
     if (state() == Enabled && objectDebugId != -1) {
         id = getId();
-        QByteArray message;
-        QmlDebugStream ds(&message, QIODevice::WriteOnly);
+        QPacket ds(connection()->currentDataStreamVersion());
         ds << QByteArray("SET_METHOD_BODY") << objectDebugId
            << methodName << methodBody;
-        sendMessage(message);
+        sendMessage(ds.data());
     }
     return id;
 }
 
 void DeclarativeEngineDebugClient::messageReceived(const QByteArray &data)
 {
-    QmlDebugStream ds(data);
+    QPacket ds(connection()->currentDataStreamVersion(), data);
     QByteArray type;
     ds >> type;
 
diff --git a/src/libs/qmldebug/qmldebugclient.cpp b/src/libs/qmldebug/qmldebugclient.cpp
index 6c23d80d59200c8f6f4ea19fb386b0dc0e6faab1..bb18843cca5a5b94fd1be4ac3f2138e30c115ad9 100644
--- a/src/libs/qmldebug/qmldebugclient.cpp
+++ b/src/libs/qmldebug/qmldebugclient.cpp
@@ -39,7 +39,6 @@
 namespace QmlDebug {
 
 const int protocolVersion = 1;
-int QmlDebugClient::s_dataStreamVersion = QDataStream::Qt_4_7;
 
 const QString serverId = QLatin1String("QDeclarativeDebugServer");
 const QString clientId = QLatin1String("QDeclarativeDebugClient");
@@ -67,6 +66,9 @@ public:
     QHash <QString, float> serverPlugins;
     QHash<QString, QmlDebugClient *> plugins;
 
+    int currentDataStreamVersion;
+    int maximumDataStreamVersion;
+
     void advertisePlugins();
     void flush();
 
@@ -79,7 +81,9 @@ public slots:
 };
 
 QmlDebugConnectionPrivate::QmlDebugConnectionPrivate(QmlDebugConnection *c)
-    : QObject(c), q(c), protocol(0), device(0), gotHello(false)
+    : QObject(c), q(c), protocol(0), device(0), gotHello(false),
+    currentDataStreamVersion(QDataStream::Qt_4_7),
+    maximumDataStreamVersion(QDataStream::Qt_DefaultCompiledVersion)
 {
 }
 
@@ -88,17 +92,17 @@ void QmlDebugConnectionPrivate::advertisePlugins()
     if (!q->isOpen())
         return;
 
-    QPacket pack;
+    QPacket pack(currentDataStreamVersion);
     pack << serverId << 1 << plugins.keys();
-    protocol->send(pack);
+    protocol->send(pack.data());
     flush();
 }
 
 void QmlDebugConnectionPrivate::connected()
 {
-    QPacket pack;
-    pack << serverId << 0 << protocolVersion << plugins.keys() << QDataStream().version();
-    protocol->send(pack);
+    QPacket pack(currentDataStreamVersion);
+    pack << serverId << 0 << protocolVersion << plugins.keys() << maximumDataStreamVersion;
+    protocol->send(pack.data());
     flush();
 }
 
@@ -134,7 +138,7 @@ void QmlDebugConnectionPrivate::error(QAbstractSocket::SocketError socketError)
 void QmlDebugConnectionPrivate::readyRead()
 {
     if (!gotHello) {
-        QPacket pack = protocol->read();
+        QPacket pack(currentDataStreamVersion, protocol->read());
         QString name;
 
         pack >> name;
@@ -150,7 +154,7 @@ void QmlDebugConnectionPrivate::readyRead()
                     QStringList pluginNames;
                     QList<float> pluginVersions;
                     pack >> pluginNames;
-                    if (!pack.isEmpty())
+                    if (!pack.atEnd())
                         pack >> pluginVersions;
 
                     const int pluginNamesSize = pluginNames.size();
@@ -163,9 +167,8 @@ void QmlDebugConnectionPrivate::readyRead()
                     }
 
                     if (!pack.atEnd()) {
-                        pack >> QmlDebugClient::s_dataStreamVersion;
-                        if (QmlDebugClient::s_dataStreamVersion
-                                > QDataStream().version())
+                        pack >> currentDataStreamVersion;
+                        if (currentDataStreamVersion > maximumDataStreamVersion)
                             qWarning() << "Server returned invalid data stream version!";
                     }
                     validHello = true;
@@ -192,7 +195,7 @@ void QmlDebugConnectionPrivate::readyRead()
     }
 
     while (protocol && protocol->packetsAvailable()) {
-        QPacket pack = protocol->read();
+        QPacket pack(currentDataStreamVersion, protocol->read());
         QString name;
         pack >> name;
 
@@ -208,7 +211,7 @@ void QmlDebugConnectionPrivate::readyRead()
                 QStringList pluginNames;
                 QList<float> pluginVersions;
                 pack >> pluginNames;
-                if (!pack.isEmpty())
+                if (!pack.atEnd())
                     pack >> pluginVersions;
 
                 const int pluginNamesSize = pluginNames.size();
@@ -334,7 +337,15 @@ void QmlDebugConnection::connectToHost(const QString &hostName, quint16 port)
     socket->connectToHost(hostName, port);
 }
 
-//
+int QmlDebugConnection::currentDataStreamVersion() const
+{
+    return d->currentDataStreamVersion;
+}
+
+void QmlDebugConnection::setMaximumDataStreamVersion(int maximumVersion)
+{
+    d->maximumDataStreamVersion = maximumVersion;
+}
 
 QmlDebugClientPrivate::QmlDebugClientPrivate()
     : connection(0)
@@ -412,9 +423,9 @@ void QmlDebugClient::sendMessage(const QByteArray &message)
     if (state() != Enabled)
         return;
 
-    QPacket pack;
+    QPacket pack(d->connection->currentDataStreamVersion());
     pack << d->name << message;
-    d->connection->d->protocol->send(pack);
+    d->connection->d->protocol->send(pack.data());
     d->connection->d->flush();
 }
 
@@ -426,30 +437,6 @@ void QmlDebugClient::messageReceived(const QByteArray &)
 {
 }
 
-QmlDebugStream::QmlDebugStream()
-    : QDataStream()
-{
-    setVersion(QmlDebugClient::s_dataStreamVersion);
-}
-
-QmlDebugStream::QmlDebugStream(QIODevice *d)
-    : QDataStream(d)
-{
-    setVersion(QmlDebugClient::s_dataStreamVersion);
-}
-
-QmlDebugStream::QmlDebugStream(QByteArray *ba, QIODevice::OpenMode flags)
-    : QDataStream(ba, flags)
-{
-    setVersion(QmlDebugClient::s_dataStreamVersion);
-}
-
-QmlDebugStream::QmlDebugStream(const QByteArray &ba)
-    : QDataStream(ba)
-{
-    setVersion(QmlDebugClient::s_dataStreamVersion);
-}
-
 } // namespace QmlDebug
 
 #include <qmldebugclient.moc>
diff --git a/src/libs/qmldebug/qmldebugclient.h b/src/libs/qmldebug/qmldebugclient.h
index 001689a760f8a21c50e4e94f96a40adbe00e33cc..55ae29d9e0ce55f0d8e34a6e0a6c6068572e514c 100644
--- a/src/libs/qmldebug/qmldebugclient.h
+++ b/src/libs/qmldebug/qmldebugclient.h
@@ -56,6 +56,9 @@ public:
 
     void connectToHost(const QString &hostName, quint16 port);
 
+    int currentDataStreamVersion() const;
+    void setMaximumDataStreamVersion(int maximumVersion);
+
     bool isOpen() const;
     bool isConnecting() const;
     void close();
@@ -103,17 +106,7 @@ private:
     friend class QmlDebugConnectionPrivate;
     QScopedPointer<QmlDebugClientPrivate> d_ptr;
 
-public:
-    static int s_dataStreamVersion;
-};
 
-class QMLDEBUG_EXPORT QmlDebugStream : public QDataStream
-{
-public:
-    QmlDebugStream();
-    explicit QmlDebugStream(QIODevice *d);
-    QmlDebugStream(QByteArray *ba, QIODevice::OpenMode flags);
-    QmlDebugStream(const QByteArray &ba);
 };
 
 } // namespace QmlDebug
diff --git a/src/libs/qmldebug/qmlprofilertraceclient.cpp b/src/libs/qmldebug/qmlprofilertraceclient.cpp
index e5662a313d916bacab44c5d42d8d25f1598c1b1b..6c97f36832b74921e3e48cdf18743a54d09fc2db 100644
--- a/src/libs/qmldebug/qmlprofilertraceclient.cpp
+++ b/src/libs/qmldebug/qmlprofilertraceclient.cpp
@@ -31,6 +31,7 @@
 #include "qmlprofilertraceclient.h"
 #include "qmlenginecontrolclient.h"
 #include "qdebugmessageclient.h"
+#include "qpacketprotocol.h"
 
 namespace QmlDebug {
 
@@ -76,12 +77,11 @@ static const int GAP_TIME = 150;
 
 void QmlProfilerTraceClientPrivate::sendRecordingStatus(int engineId)
 {
-    QByteArray ba;
-    QmlDebugStream stream(&ba, QIODevice::WriteOnly);
+    QPacket stream(q->connection()->currentDataStreamVersion());
     stream << recording << engineId; // engineId -1 is OK. It means "all of them"
     if (recording)
         stream << requestedFeatures << flushInterval;
-    q->sendMessage(ba);
+    q->sendMessage(stream.data());
 }
 
 QmlProfilerTraceClient::QmlProfilerTraceClient(QmlDebugConnection *client, quint64 features)
@@ -201,8 +201,7 @@ void QmlProfilerTraceClient::stateChanged(State /*status*/)
 
 void QmlProfilerTraceClient::messageReceived(const QByteArray &data)
 {
-    QByteArray rwData = data;
-    QmlDebugStream stream(&rwData, QIODevice::ReadOnly);
+    QPacket stream(connection()->currentDataStreamVersion(), data);
 
     qint64 time;
     int messageType;
diff --git a/src/libs/qmldebug/qpacketprotocol.cpp b/src/libs/qmldebug/qpacketprotocol.cpp
index 4848fa7d4806004e13684abaafba17159acfede3..0bf46b6ba5e8916d29edd48c2adf8b8239777954 100644
--- a/src/libs/qmldebug/qpacketprotocol.cpp
+++ b/src/libs/qmldebug/qpacketprotocol.cpp
@@ -30,7 +30,6 @@
 
 #include "qpacketprotocol.h"
 
-#include <qbuffer.h>
 #include <qelapsedtimer.h>
 
 namespace QmlDebug {
@@ -111,8 +110,6 @@ public:
 
         QObject::connect(this, &QPacketProtocolPrivate::readyRead,
                          parent, &QPacketProtocol::readyRead);
-        QObject::connect(this, &QPacketProtocolPrivate::packetWritten,
-                         parent, &QPacketProtocol::packetWritten);
         QObject::connect(this, &QPacketProtocolPrivate::invalidPacket,
                          parent, &QPacketProtocol::invalidPacket);
         QObject::connect(dev, &QIODevice::readyRead,
@@ -125,7 +122,6 @@ public:
 
 signals:
     void readyRead();
-    void packetWritten();
     void invalidPacket();
 
 public slots:
@@ -147,7 +143,6 @@ public slots:
             } else {
                 bytes -= sendingPackets.at(0);
                 sendingPackets.removeFirst();
-                emit packetWritten();
             }
         }
     }
@@ -217,70 +212,22 @@ QPacketProtocol::QPacketProtocol(QIODevice *dev, QObject *parent)
     Q_ASSERT(dev);
 }
 
-/*!
-  Destroys the QPacketProtocol instance.
- */
-QPacketProtocol::~QPacketProtocol()
-{
-}
-
-/*!
-  Returns the maximum packet size allowed.  By default this is
-  2,147,483,647 bytes.
-
-  If a packet claiming to be larger than the maximum packet size is received,
-  the QPacketProtocol::invalidPacket() signal is emitted.
-
-  \sa QPacketProtocol::setMaximumPacketSize()
- */
-qint32 QPacketProtocol::maximumPacketSize() const
-{
-    return d->maxPacketSize;
-}
-
-/*!
-  Sets the maximum allowable packet size to \a max.
-
-  \sa QPacketProtocol::maximumPacketSize()
- */
-qint32 QPacketProtocol::setMaximumPacketSize(qint32 max)
-{
-    if (max > (signed)sizeof(qint32))
-        d->maxPacketSize = max;
-    return d->maxPacketSize;
-}
-
-/*!
-  Returns a streamable object that is transmitted on destruction.  For example
-
-  \code
-  protocol.send() << "Hello world" << 123;
-  \endcode
-
-  will send a packet containing "Hello world" and 123.  To construct more
-  complex packets, explicitly construct a QPacket instance.
- */
-QPacketAutoSend QPacketProtocol::send()
-{
-    return QPacketAutoSend(this);
-}
-
 /*!
   Transmits the packet \a p.
  */
-void QPacketProtocol::send(const QPacket & p)
+void QPacketProtocol::send(const QByteArray &p)
 {
-    if (p.b.isEmpty())
+    if (p.isEmpty())
         return; // We don't send empty packets
 
-    qint64 sendSize = p.b.size() + sizeof(qint32);
+    qint64 sendSize = p.size() + sizeof(qint32);
 
     d->sendingPackets.append(sendSize);
     qint32 sendSize32 = sendSize;
     qint64 writeBytes = d->dev->write((char *)&sendSize32, sizeof(qint32));
     Q_ASSERT(writeBytes == sizeof(qint32));
-    writeBytes = d->dev->write(p.b);
-    Q_ASSERT(writeBytes == p.b.size());
+    writeBytes = d->dev->write(p);
+    Q_ASSERT(writeBytes == p.size());
     Q_UNUSED(writeBytes); // For building in release mode.
 }
 
@@ -292,26 +239,16 @@ qint64 QPacketProtocol::packetsAvailable() const
     return d->packets.count();
 }
 
-/*!
-  Discards any unread packets.
-  */
-void QPacketProtocol::clear()
-{
-    d->packets.clear();
-}
-
 /*!
   Returns the next unread packet, or an invalid QPacket instance if no packets
   are available.  This function does NOT block.
   */
-QPacket QPacketProtocol::read()
+QByteArray QPacketProtocol::read()
 {
     if (0 == d->packets.count())
-        return QPacket();
+        return QByteArray();
 
-    QPacket rv(d->packets.at(0));
-    d->packets.removeFirst();
-    return rv;
+    return d->packets.takeFirst();
 }
 
 
@@ -357,14 +294,6 @@ bool QPacketProtocol::waitForReadyRead(int msecs)
     } while (true);
 }
 
-/*!
-  Returns the QIODevice passed to the QPacketProtocol constructor.
-*/
-QIODevice *QPacketProtocol::device()
-{
-    return d->dev;
-}
-
 /*!
   \fn void QPacketProtocol::readyRead()
 
@@ -380,13 +309,6 @@ QIODevice *QPacketProtocol::device()
   further packets will be received.
  */
 
-/*!
-  \fn void QPacketProtocol::packetWritten()
-
-  Emitted each time a packet is completely written to the device.  This signal
-  may be used for communications flow control.
- */
-
 /*!
   \class QPacket
   \internal
@@ -434,55 +356,22 @@ QIODevice *QPacketProtocol::device()
 /*!
   Constructs an empty write-only packet.
   */
-QPacket::QPacket()
-    : QDataStream(), buf(0)
+QPacket::QPacket(int version)
 {
-    buf = new QBuffer(&b);
-    buf->open(QIODevice::WriteOnly);
-    setDevice(buf);
-    setVersion(QDataStream::Qt_4_7);
+    buf.open(QIODevice::WriteOnly);
+    setDevice(&buf);
+    setVersion(version);
 }
 
 /*!
-  Destroys the QPacket instance.
-  */
-QPacket::~QPacket()
-{
-    if (buf) {
-        delete buf;
-        buf = 0;
-    }
-}
-
-/*!
-  Creates a copy of \a other.  The initial stream positions are shared, but the
-  two packets are otherwise independent.
+  Constructs a read-only packet.
  */
-QPacket::QPacket(const QPacket & other)
-    : QDataStream(), b(other.b), buf(0)
+QPacket::QPacket(int version, const QByteArray &data)
 {
-    buf = new QBuffer(&b);
-    buf->open(other.buf->openMode());
-    setDevice(buf);
-}
-
-/*!
-  \internal
-  */
-QPacket::QPacket(const QByteArray & ba)
-    : QDataStream(), b(ba), buf(0)
-{
-    buf = new QBuffer(&b);
-    buf->open(QIODevice::ReadOnly);
-    setDevice(buf);
-}
-
-/*!
-  Returns true if this packet is empty - that is, contains no data.
-  */
-bool QPacket::isEmpty() const
-{
-    return b.isEmpty();
+    buf.setData(data);
+    buf.open(QIODevice::ReadOnly);
+    setDevice(&buf);
+    setVersion(version);
 }
 
 /*!
@@ -490,48 +379,7 @@ bool QPacket::isEmpty() const
   */
 QByteArray QPacket::data() const
 {
-    return b;
-}
-
-/*!
-  Clears data in the packet.  This is useful for reusing one writable packet.
-  For example
-  \code
-  QPacketProtocol protocol(...);
-
-  QPacket packet;
-
-  packet << "Hello world!" << 123;
-  protocol.send(packet);
-
-  packet.clear();
-  packet << "Goodbyte world!" << 789;
-  protocol.send(packet);
-  \endcode
- */
-void QPacket::clear()
-{
-    QBuffer::OpenMode oldMode = buf->openMode();
-    buf->close();
-    b.clear();
-    buf->setBuffer(&b); // reset QBuffer internals with new size of b.
-    buf->open(oldMode);
-}
-
-/*!
-  \class QPacketAutoSend
-  \internal
-
-  */
-QPacketAutoSend::QPacketAutoSend(QPacketProtocol *_p)
-    : QPacket(), p(_p)
-{
-}
-
-QPacketAutoSend::~QPacketAutoSend()
-{
-    if (!b.isEmpty())
-        p->send(*this);
+    return buf.data();
 }
 
 } // namespace QmlDebug
diff --git a/src/libs/qmldebug/qpacketprotocol.h b/src/libs/qmldebug/qpacketprotocol.h
index 523611a66e8016367e3d5ab2d11fa3b53b690737..dcb80aaefe5bb5b5cd8bf26be178b6644aedac04 100644
--- a/src/libs/qmldebug/qpacketprotocol.h
+++ b/src/libs/qmldebug/qpacketprotocol.h
@@ -31,81 +31,54 @@
 #ifndef QPACKETPROTOCOL_H
 #define QPACKETPROTOCOL_H
 
+#include "qmldebug_global.h"
+
 #include <qobject.h>
 #include <qdatastream.h>
+#include <qbuffer.h>
 
 QT_BEGIN_NAMESPACE
 class QIODevice;
-class QBuffer;
 QT_END_NAMESPACE
 
 namespace QmlDebug {
 
-class QPacket;
-class QPacketAutoSend;
-
 class QPacketProtocolPrivate;
-
-class QPacketProtocol : public QObject
+class QMLDEBUG_EXPORT QPacketProtocol : public QObject
 {
     Q_OBJECT
-
+    Q_DECLARE_PRIVATE(QPacketProtocol)
 public:
     explicit QPacketProtocol(QIODevice *dev, QObject *parent = 0);
-    virtual ~QPacketProtocol();
-
-    qint32 maximumPacketSize() const;
-    qint32 setMaximumPacketSize(qint32);
-
-    QPacketAutoSend send();
-    void send(const QPacket &);
 
+    void send(const QByteArray &data);
     qint64 packetsAvailable() const;
-    QPacket read();
-
+    QByteArray read();
     bool waitForReadyRead(int msecs = 3000);
 
-    void clear();
-
-    QIODevice *device();
-
-signals:
+Q_SIGNALS:
     void readyRead();
     void invalidPacket();
-    void packetWritten();
+
+private Q_SLOTS:
+    void aboutToClose();
+    void bytesWritten(qint64 bytes);
+    void readyToRead();
 
 private:
     QPacketProtocolPrivate *d;
 };
 
-
-class QPacket : public QDataStream
+class QMLDEBUG_EXPORT QPacket : public QDataStream
 {
 public:
-    QPacket();
-    QPacket(const QPacket &);
-    virtual ~QPacket();
-
-    void clear();
-    bool isEmpty() const;
+    QPacket(int version);
+    explicit QPacket(int version, const QByteArray &ba);
     QByteArray data() const;
 
-protected:
-    friend class QPacketProtocol;
-    QPacket(const QByteArray &ba);
-    QByteArray b;
-    QBuffer *buf;
-};
-
-class QPacketAutoSend : public QPacket
-{
-public:
-    virtual ~QPacketAutoSend();
-
 private:
-    friend class QPacketProtocol;
-    QPacketAutoSend(QPacketProtocol *);
-    QPacketProtocol *p;
+    void init(QIODevice::OpenMode mode);
+    QBuffer buf;
 };
 
 } // QmlDebug
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index c4b6fcf7c77555cf6981538d8ca03732c9297682..a715204d5db506bd43eae49fb7afa3a5e88d6f03 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -57,6 +57,7 @@
 #include <qmljseditor/qmljseditorconstants.h>
 #include <qmljs/qmljsmodelmanagerinterface.h>
 #include <qmljs/consolemanagerinterface.h>
+#include <qmldebug/qpacketprotocol.h>
 
 #include <texteditor/textdocument.h>
 #include <texteditor/texteditor.h>
@@ -1504,11 +1505,10 @@ void QmlEnginePrivate::setBreakpoint(const QString type, const QString target,
     //                    }
     //    }
     if (type == _(EVENT)) {
-        QByteArray params;
-        QmlDebugStream rs(&params, QIODevice::WriteOnly);
+        QPacket rs(connection->currentDataStreamVersion());
         rs <<  target.toUtf8() << enabled;
         engine->showMessage(QString(_("%1 %2 %3")).arg(_(BREAKONSIGNAL), target, enabled ? _("enabled") : _("disabled")), LogInput);
-        runDirectCommand(BREAKONSIGNAL, params);
+        runDirectCommand(BREAKONSIGNAL, rs.data());
 
     } else {
         DebuggerCommand cmd(SETBREAKPOINT);
@@ -1704,14 +1704,13 @@ void QmlEnginePrivate::runDirectCommand(const QByteArray &type, const QByteArray
 
     engine->showMessage(QString::fromLatin1("%1 %2").arg(_(type), _(msg)), LogInput);
 
-    QByteArray request;
-    QmlDebugStream rs(&request, QIODevice::WriteOnly);
+    QPacket rs(connection->currentDataStreamVersion());
     rs << cmd << type << msg;
 
     if (state() == Enabled)
-        sendMessage(request);
+        sendMessage(rs.data());
     else
-        sendBuffer.append(request);
+        sendBuffer.append(rs.data());
 }
 
 void QmlEnginePrivate::memorizeRefs(const QVariant &refs)
@@ -1727,7 +1726,7 @@ void QmlEnginePrivate::memorizeRefs(const QVariant &refs)
 
 void QmlEnginePrivate::messageReceived(const QByteArray &data)
 {
-    QmlDebugStream ds(data);
+    QPacket ds(connection->currentDataStreamVersion(), data);
     QByteArray command;
     ds >> command;