diff --git a/_test/tests/inc/httpclient_http.test.php b/_test/tests/inc/httpclient_http.test.php
index a19f2d2381346058198e9a32781772732368851f..3446e1184399ae6321a5d33abcee7293c6b78195 100644
--- a/_test/tests/inc/httpclient_http.test.php
+++ b/_test/tests/inc/httpclient_http.test.php
@@ -1,14 +1,21 @@
 <?php
 
+require_once (__DIR__ . '/httpclient_mock.php');
+
 class httpclient_http_test extends DokuWikiTest {
     protected $server = 'http://httpbin.org';
 
+
     /**
      * @group internet
      */
     function test_simpleget(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get($this->server.'/get?foo=bar');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -20,8 +27,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_dget(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->dget($this->server.'/get',array('foo'=>'bar'));
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -33,8 +44,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_gzip(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get($this->server.'/gzip');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -46,8 +61,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_simplepost(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->post($this->server.'/post',array('foo'=>'bar'));
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -59,8 +78,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_redirect(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get($this->server.'/redirect/3');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -72,8 +95,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_relredirect(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get($this->server.'/relative-redirect/3');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -85,8 +112,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_redirectfail(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get($this->server.'/redirect/5');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertTrue($data === false, 'HTTP response '.$http->error);
         $this->assertEquals('Maximum number of redirects exceeded',$http->error);
     }
@@ -95,10 +126,18 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_cookies(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $http->get($this->server.'/cookies/set/foo/bar');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertEquals(array('foo' => 'bar'), $http->cookies);
         $data = $http->get($this->server.'/cookies');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -110,8 +149,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_teapot(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get($this->server.'/status/418');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertTrue($data === false, 'HTTP response '.$http->error);
         $this->assertEquals(418,$http->status);
     }
@@ -120,17 +163,25 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_maxbody(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $http->max_bodysize = 250;
 
         // this should abort completely
         $data = $http->get($this->server.'/stream/30');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertTrue($data === false, 'HTTP response '.$http->error);
 
         // this should read just the needed bytes
         $http->max_bodysize_abort = false;
         $http->keep_alive = false;
         $data = $http->get($this->server.'/stream/30');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         /* should read no more than max_bodysize+1 */
         $this->assertLessThanOrEqual(251,strlen($data));
@@ -140,12 +191,20 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_maxbodyok(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $http->max_bodysize = 500*1024;
         $data = $http->get($this->server.'/stream/5');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertTrue($data !== false, 'HTTP response '.$http->error);
         $http->max_bodysize_abort = false;
         $data = $http->get($this->server.'/stream/5');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertTrue($data !== false, 'HTTP response '.$http->error);
     }
 
@@ -153,10 +212,14 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_basicauth(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $http->user = 'user';
         $http->pass = 'pass';
         $data = $http->get($this->server.'/basic-auth/user/pass');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -167,10 +230,14 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_basicauthfail(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $http->user = 'user';
         $http->pass = 'invalid';
         $data = $http->get($this->server.'/basic-auth/user/pass');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertTrue($data === false, 'HTTP response '.$http->error);
         $this->assertEquals(401,$http->status);
     }
@@ -179,7 +246,7 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_timeout(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $http->timeout = 5;
         $data = $http->get($this->server.'/delay/10');
         $this->assertTrue($data === false, 'HTTP response '.$http->error);
@@ -190,8 +257,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_headers(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get($this->server.'/response-headers?baz=&foo=bar');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $resp = json_decode($data, true);
         $this->assertTrue(is_array($resp), 'JSON response');
@@ -204,8 +275,12 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_chunked(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get('http://whoopdedo.org/cgi-bin/chunked/2550');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertFalse($data === false, 'HTTP response '.$http->error);
         $this->assertEquals(2550,strlen($data));
     }
@@ -216,13 +291,17 @@ class httpclient_http_test extends DokuWikiTest {
      * @group internet
      */
     function test_wikimatrix(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         $data = $http->get('http://www.wikimatrix.org/cfeed/dokuwiki/-/-');
+        if($http->noconnection()) {
+            $this->markTestSkipped('connection timed out');
+            return;
+        }
         $this->assertTrue($data !== false, 'HTTP response '.$http->error);
     }
 
     function test_postencode(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
 
 
         // check simple data
diff --git a/_test/tests/inc/httpclient_http_proxy.test.php b/_test/tests/inc/httpclient_http_proxy.test.php
index 4aa039fcc78b562847f6f0d53282c30b4a94b820..61228ad94535196a0bceb62be727bd06977d0ab5 100644
--- a/_test/tests/inc/httpclient_http_proxy.test.php
+++ b/_test/tests/inc/httpclient_http_proxy.test.php
@@ -1,5 +1,7 @@
 <?php
 
+require_once (__DIR__ . '/httpclient_mock.php');
+
 class httpclient_http_proxy_test extends DokuWikiTest {
     protected $url = 'http://test.dokuwiki.org/README';
 
@@ -7,7 +9,7 @@ class httpclient_http_proxy_test extends DokuWikiTest {
      * @group internet
      */
     function test_simpleget(){
-        $http = new HTTPClient();
+        $http = new HTTPMockClient();
         // proxy provided by  Andrwe Lord Weber <dokuwiki@andrwe.org>
         $http->proxy_host = 'proxy.andrwe.org';
         $http->proxy_port = 8080;
diff --git a/_test/tests/inc/httpclient_mock.php b/_test/tests/inc/httpclient_mock.php
new file mode 100644
index 0000000000000000000000000000000000000000..038045c8bb1cc91319a90c6ba0e3de6587d5183d
--- /dev/null
+++ b/_test/tests/inc/httpclient_mock.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Class HTTPMockClient
+ *
+ * Does not really mock the client, it still does real connections but will retry failed connections
+ * to work around shaky connectivity.
+ */
+class HTTPMockClient extends HTTPClient {
+    protected $tries;
+
+    /**
+     * Sets shorter timeout
+     */
+    function __construct() {
+        parent::__construct();
+        $this->timeout = 8; // slightly faster timeouts
+    }
+
+    /**
+     * Returns true if the connection timed out
+     *
+     * @return bool
+     */
+    function noconnection() {
+        return ($this->tries === 0);
+    }
+
+    /**
+     * Retries sending the request multiple times
+     *
+     * @param string $url
+     * @param string $data
+     * @param string $method
+     * @return bool
+     */
+    function sendRequest($url, $data = '', $method = 'GET') {
+        $this->tries = 2; // configures the number of retries
+        $return      = false;
+        while($this->tries) {
+            $return = parent::sendRequest($url, $data, $method);
+            if($this->status != -100) break;
+            $this->tries--;
+        }
+        return $return;
+    }
+}
\ No newline at end of file
diff --git a/_test/tests/inc/mailer.test.php b/_test/tests/inc/mailer.test.php
index 4541d99066d52e435f987c7af6e1f31cc3352902..50d282864d89c964373c77a96d49aca347d51d9f 100644
--- a/_test/tests/inc/mailer.test.php
+++ b/_test/tests/inc/mailer.test.php
@@ -191,7 +191,10 @@ class mailer_test extends DokuWikiTest {
         // ask message lint if it is okay
         $html = new HTTPClient();
         $results = $html->post('http://tools.ietf.org/tools/msglint/msglint', array('msg'=>$msg));
-        $this->assertTrue($results !== false);
+        if($results === false) {
+            $this->markTestSkipped('no response from validator');
+            return;
+        }
 
         // parse the result lines
         $lines = explode("\n", $results);