diff --git a/yotta/data/example-tls-client/main.cpp b/yotta/data/example-tls-client/main.cpp
index 56be087..4c4f278 100644
--- a/yotta/data/example-tls-client/main.cpp
+++ b/yotta/data/example-tls-client/main.cpp
@@ -48,10 +48,13 @@
 #define UNSAFE 0
 
 #include "mbed.h"
-#include "sal-iface-eth/EthernetInterface.h"
+#include "EthernetInterface.h"
 #include "mbed-net-sockets/TCPStream.h"
+#include "test_env.h"
 #include "minar/minar.h"
 
+#include "lwipv4_init.h"
+
 #include "mbedtls/ssl.h"
 #include "mbedtls/entropy.h"
 #include "mbedtls/ctr_drbg.h"
@@ -60,8 +63,6 @@
 #include "mbedtls/debug.h"
 #endif
 
-#include "lwipv4_init.h"
-
 namespace {
 const char *HTTPS_SERVER_NAME = "developer.mbed.org";
 const int HTTPS_SERVER_PORT = 443;
@@ -213,11 +214,10 @@
 
 
         /* Connect to the server */
-        printf("Connecting to %s:%d\r\n", _domain, _port);
+        printf("Starting DNS lookup for %s\r\n", _domain);
         /* Resolve the domain name: */
         socket_error_t err = _stream.resolve(_domain, TCPStream::DNSHandler_t(this, &HelloHTTPS::onDNS));
-        if(err != SOCKET_ERROR_NONE)
-            _error = true;
+        _stream.error_check(err);
     }
     /**
      * Check if the test has completed.
@@ -327,23 +327,28 @@
         printf("MBED: Socket Error: %s (%d)\r\n", socket_strerror(err), err);
         _stream.close();
         _error = true;
-        minar::Scheduler::stop();
+        MBED_HOSTTEST_RESULT(false);
     }
     /**
      * On Connect handler
      * Starts the TLS handshake
      */
     void onConnect(TCPStream *s) {
+        char buf[16];
+        _remoteAddr.fmtIPv4(buf,sizeof(buf));
+        printf("Connected to %s:%d\r\n", buf, _port);
+
         s->setOnReadable(TCPStream::ReadableHandler_t(this, &HelloHTTPS::onReceive));
         s->setOnDisconnect(TCPStream::DisconnectHandler_t(this, &HelloHTTPS::onDisconnect));
 
         /* Start the handshake, the rest will be done in onReceive() */
+        printf("Starting the TLS handshake...\r\n");
         int ret = mbedtls_ssl_handshake(&_ssl);
         if (ret < 0) {
             if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
                 ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
                 print_mbedtls_error("mbedtls_ssl_handshake", ret);
-                _error = true;
+                onError(s, SOCKET_ERROR_UNKNOWN);
             }
             return;
         }
@@ -353,9 +358,6 @@
      * Parses the response from the server, to check for the HTTPS 200 status code and the expected response ("Hello World!")
      */
     void onReceive(Socket *s) {
-        if (_error)
-            return;
-
         /* Send request if not done yet */
         if (!_request_sent) {
             int ret = mbedtls_ssl_write(&_ssl, (const unsigned char *) _buffer, _bpos);
@@ -363,7 +365,7 @@
                 if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
                     ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
                     print_mbedtls_error("mbedtls_ssl_write", ret);
-                    _error = true;
+                    onError(s, SOCKET_ERROR_UNKNOWN);
                 }
                 return;
             }
@@ -395,10 +397,9 @@
         /* Read data out of the socket */
         int ret = mbedtls_ssl_read(&_ssl, (unsigned char *) _buffer, sizeof(_buffer));
         if (ret < 0) {
-            if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
-                ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
-                    print_mbedtls_error("mbedtls_ssl_read", ret);
-                _error = true;
+            if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
+                print_mbedtls_error("mbedtls_ssl_read", ret);
+                onError(s, SOCKET_ERROR_UNKNOWN);
             }
             return;
         }
@@ -435,7 +436,8 @@
             char buf[16];
             _remoteAddr.setAddr(&addr);
             _remoteAddr.fmtIPv4(buf,sizeof(buf));
-            printf("%s address: %s\r\n",domain, buf);
+            printf("DNS Response Received:\r\n%s: %s\r\n", domain, buf);
+            printf("Connecting to %s:%d\r\n", buf, _port);
             socket_error_t err = _stream.connect(_remoteAddr, _port, TCPStream::ConnectHandler_t(this, &HelloHTTPS::onConnect));
 
             if (err != SOCKET_ERROR_NONE) {
@@ -445,7 +447,7 @@
     }
     void onDisconnect(TCPStream *s) {
         s->close();
-        minar::Scheduler::stop();
+        MBED_HOSTTEST_RESULT(!error());
     }
 
 protected:
@@ -471,33 +473,10 @@
 /**
  * The main loop of the HTTPS Hello World test
  */
-int example_client() {
-    EthernetInterface eth;
-    /* Initialise with DHCP, connect, and start up the stack */
-    eth.init();
-    eth.connect();
-    lwipv4_socket_init();
+EthernetInterface eth;
+HelloHTTPS *hello;
 
-    printf("\r\n\r\n");
-    printf("Client IP Address is %s\r\n", eth.getIPAddress());
-
-    HelloHTTPS hello(HTTPS_SERVER_NAME, HTTPS_SERVER_PORT);
-    {
-        mbed::FunctionPointer1<void, const char*> fp(&hello, &HelloHTTPS::startTest);
-        minar::Scheduler::postCallback(fp.bind(HTTPS_PATH));
-    }
-
-    minar::Scheduler::start();
-
-    eth.disconnect();
-
-    return static_cast<int>(hello.error());
-}
-
-#include "mbed/test_env.h"
-#include "minar/minar.h"
-
-static void run() {
+void app_start(int, char*[]) {
     /* The default 9600 bps is too slow to print full TLS debug info and could
      * cause the other party to time out. Select a higher baud rate for
      * printf(), regardless of debug level for the sake of uniformity. */
@@ -508,11 +487,19 @@
     MBED_HOSTTEST_SELECT(default);
     MBED_HOSTTEST_DESCRIPTION(mbed TLS example HTTPS client);
     MBED_HOSTTEST_START("MBEDTLS_EX_HTTPS_CLIENT");
-    MBED_HOSTTEST_RESULT(example_client() == 0);
-}
 
-void app_start(int, char*[]) {
-    minar::Scheduler::postCallback(FunctionPointer0<void>(run).bind());
+    /* Initialise with DHCP, connect, and start up the stack */
+    eth.init();
+    eth.connect();
+    lwipv4_socket_init();
+
+    hello = new HelloHTTPS(HTTPS_SERVER_NAME, HTTPS_SERVER_PORT);
+
+    printf("\r\n\r\n");
+    printf("Client IP Address is %s\r\n", eth.getIPAddress());
+
+    mbed::FunctionPointer1<void, const char*> fp(hello, &HelloHTTPS::startTest);
+    minar::Scheduler::postCallback(fp.bind(HTTPS_PATH));
 }
 
 #endif /* TARGET_LIKE_MBED */
