diff --git a/src/shared/symbianutils/launcher.cpp b/src/shared/symbianutils/launcher.cpp
index 3bf0f134155f15311a1d2e26f06efbc98b434b9f..f91bb1e93d05b3d79c264a9deb3050d4b055cca6 100644
--- a/src/shared/symbianutils/launcher.cpp
+++ b/src/shared/symbianutils/launcher.cpp
@@ -94,6 +94,9 @@ Launcher::Launcher(Actions startupActions,
 
 Launcher::~Launcher()
 {
+    // Destroyed before protocol was through: Close
+    if (d->m_closeDevice && d->m_device->isOpen())
+        d->m_device->close();
     emit destroyed(d->m_device->port());
     logMessage("Shutting down.\n");
     delete d;
diff --git a/src/shared/symbianutils/symbiandevicemanager.cpp b/src/shared/symbianutils/symbiandevicemanager.cpp
index d92a07919a8a5696533475f8fbf373375e1dd4ca..8bc3cdd1c85144e35f4f9326f8240a280dd30a37 100644
--- a/src/shared/symbianutils/symbiandevicemanager.cpp
+++ b/src/shared/symbianutils/symbiandevicemanager.cpp
@@ -165,6 +165,8 @@ void SymbianDevice::releaseDevice(TrkDevicePtr *ptr /* = 0 */)
         qDebug() << "SymbianDevice::releaseDevice" << m_data->portName
                 << " open: " << isOpen();
     if (m_data->deviceAcquired) {
+        if (m_data->device->isOpen())
+            m_data->device->clearWriteQueue();
         // Release if a valid pointer was passed in.
         if (ptr && !ptr->isNull()) {
             ptr->data()->disconnect();
diff --git a/src/shared/symbianutils/trkdevice.cpp b/src/shared/symbianutils/trkdevice.cpp
index 8ba23aee03a5174e972a971a26421b69bbb204b0..72d91723a8b1a29c3865f2d79eea81617a008ad9 100644
--- a/src/shared/symbianutils/trkdevice.cpp
+++ b/src/shared/symbianutils/trkdevice.cpp
@@ -208,7 +208,10 @@ void TrkWriteQueue::clear()
     m_trkWriteToken = 0;
     m_trkWriteBusy = false;
     m_trkWriteQueue.clear();
+    const int discarded = m_writtenTrkMessages.size();
     m_writtenTrkMessages.clear();
+    if (verboseTrk)
+        qDebug() << "TrkWriteQueue::clear: discarded " << discarded;
 }
 
 byte TrkWriteQueue::nextTrkWriteToken()
@@ -360,6 +363,8 @@ public:
                         const QByteArray &data, const QVariant &cookie);
     void queueTrkInitialPing();
 
+    void clearWriteQueue();
+
     // Call this from the device read notification with the results.
     void slotHandleResult(const TrkResult &result);
 
@@ -565,6 +570,13 @@ void WriterThread::queueTrkMessage(byte code, TrkCallback callback,
     tryWrite();
 }
 
+void WriterThread::clearWriteQueue()
+{
+    m_dataMutex.lock();
+    m_queue.clear();
+    m_dataMutex.unlock();
+}
+
 void WriterThread::queueTrkInitialPing()
 {
     m_dataMutex.lock();
@@ -1092,6 +1104,12 @@ void TrkDevice::emitError(const QString &s)
     emit error(s);
 }
 
+void TrkDevice::clearWriteQueue()
+{
+    if (isOpen())
+        d->writerThread->clearWriteQueue();
+}
+
 void TrkDevice::sendTrkMessage(byte code, TrkCallback callback,
      const QByteArray &data, const QVariant &cookie)
 {
diff --git a/src/shared/symbianutils/trkdevice.h b/src/shared/symbianutils/trkdevice.h
index a5ddc558984cd751a994d20880ecf88c46dc3c93..9c2f1f292920df31eb0ad737c4256a78aab94b93 100644
--- a/src/shared/symbianutils/trkdevice.h
+++ b/src/shared/symbianutils/trkdevice.h
@@ -101,6 +101,9 @@ public:
     // Send an Ack synchronously, bypassing the queue
     bool sendTrkAck(unsigned char token);
 
+public slots:
+    void clearWriteQueue();
+
 signals:
     void messageReceived(const trk::TrkResult &result);
     // Emitted with the contents of messages enclosed in 07e, not for log output