diff --git a/lib/cpp/test/qt/TQTcpServerTest.cpp b/lib/cpp/test/qt/TQTcpServerTest.cpp
index 0cad6a9..422d771 100644
--- a/lib/cpp/test/qt/TQTcpServerTest.cpp
+++ b/lib/cpp/test/qt/TQTcpServerTest.cpp
@@ -5,6 +5,7 @@
 #include <QTcpServer>
 #include <QTcpSocket>
 #include <QHostAddress>
+#include <QThread>
 
 #ifndef Q_MOC_RUN
   #include <boost/smart_ptr.hpp>
@@ -42,46 +43,68 @@
 };
 
 class TQTcpServerTest : public QObject {
-  void init() {
-    // setup server
-    serverSocket.reset(new QTcpServer);
-    server.reset(new async::TQTcpServer(serverSocket,
-                                        boost::make_shared<test::ParentServiceAsyncProcessor>(
-                                            boost::make_shared<AsyncHandler>()),
-                                        boost::make_shared<protocol::TBinaryProtocolFactory>()));
-    QVERIFY(serverSocket->listen(QHostAddress::LocalHost));
-    int port = serverSocket->serverPort();
-    QVERIFY(port > 0);
+  Q_OBJECT
 
-    // setup client
-    socket.reset(new QTcpSocket);
-    client.reset(new test::ParentServiceClient(boost::make_shared<protocol::TBinaryProtocol>(
-        boost::make_shared<transport::TQIODeviceTransport>(socket))));
-    socket->connectToHost(QHostAddress::LocalHost, port);
-    QVERIFY(socket->waitForConnected());
-  }
+private slots:
+  void initTestCase();
+  void cleanupTestCase();
+  void test_communicate();
 
-  void cleanup() {
-    socket->close();
-    serverSocket->close();
-  }
-
-  void test_communicate() {
-    client->addString("foo");
-    client->addString("bar");
-
-    std::vector<std::string> reply;
-    client->getStrings(reply);
-    QCOMPARE(reply[0], "foo");
-    QCOMPARE(reply[1], "foo");
-  }
-
-  boost::shared_ptr<QTcpServer> serverSocket;
+private:
+  boost::shared_ptr<QThread> serverThread;
   boost::shared_ptr<async::TQTcpServer> server;
-  boost::shared_ptr<QTcpSocket> socket;
   boost::shared_ptr<test::ParentServiceClient> client;
 };
 
+void TQTcpServerTest::initTestCase() {
+  // setup server
+  boost::shared_ptr<QTcpServer> serverSocket = boost::make_shared<QTcpServer>();
+  server.reset(new async::TQTcpServer(serverSocket,
+                                      boost::make_shared<test::ParentServiceAsyncProcessor>(
+                                          boost::make_shared<AsyncHandler>()),
+                                      boost::make_shared<protocol::TBinaryProtocolFactory>()));
+  QVERIFY(serverSocket->listen(QHostAddress::LocalHost));
+  int port = serverSocket->serverPort();
+  QVERIFY(port > 0);
+
+  //setup server thread and move server to it
+  serverThread.reset(new QThread());
+  serverSocket->moveToThread(serverThread.get());
+  server->moveToThread(serverThread.get());
+  serverThread->start();
+
+  // setup client
+  boost::shared_ptr<QTcpSocket> socket = boost::make_shared<QTcpSocket>();
+  client.reset(new test::ParentServiceClient(boost::make_shared<protocol::TBinaryProtocol>(
+      boost::make_shared<transport::TQIODeviceTransport>(socket))));
+  socket->connectToHost(QHostAddress::LocalHost, port);
+  QVERIFY(socket->waitForConnected());
+}
+
+void TQTcpServerTest::cleanupTestCase() {
+  //first, stop the thread which holds the server
+  serverThread->quit();
+  serverThread->wait();
+  // now, it is safe to delete the server
+  server.reset();
+  // delete thread now
+  serverThread.reset();
+
+  // cleanup client
+  client.reset();
+}
+
+void TQTcpServerTest::test_communicate() {
+  client->addString("foo");
+  client->addString("bar");
+
+  std::vector<std::string> reply;
+  client->getStrings(reply);
+  QCOMPARE(QString::fromStdString(reply[0]), QString("foo"));
+  QCOMPARE(QString::fromStdString(reply[1]), QString("bar"));
+}
+
+
 #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
 QTEST_GUILESS_MAIN(TQTcpServerTest);
 #else
