diff --git a/wlauto/core/device.py b/wlauto/core/device.py
index 5441bad2..3fcf811f 100644
--- a/wlauto/core/device.py
+++ b/wlauto/core/device.py
@@ -381,6 +381,19 @@ class Device(Extension):
         """
         raise NotImplementedError()
 
+    def sleep(self, seconds):
+        """Sleep for the specified time on the target device.
+
+        :param seconds: Time in seconds to sleep on the device
+
+        The sleep is executed on the device using self.execute(). We
+        set the timeout for this command to be 10 seconds longer than
+        the sleep itself to make sure the command has time to complete
+        before we timeout.
+
+        """
+        self.execute("sleep {}".format(seconds), timeout=seconds + 10)
+
     def set_sysfile_value(self, filepath, value, verify=True):
         """
         Write the specified value to the specified file on the device
diff --git a/wlauto/workloads/apklaunch/__init__.py b/wlauto/workloads/apklaunch/__init__.py
index 6dc201fc..f1fc996a 100644
--- a/wlauto/workloads/apklaunch/__init__.py
+++ b/wlauto/workloads/apklaunch/__init__.py
@@ -15,8 +15,6 @@
 # pylint: disable=attribute-defined-outside-init
 import os
 
-from time import sleep
-
 from wlauto import Workload, Parameter
 from wlauto import File
 from wlauto.exceptions import ConfigError
@@ -51,7 +49,7 @@ class ApkLaunchWorkload(Workload):
         self.device.execute('am start -W {}'.format(self.package))
 
         self.logger.info('Waiting {} seconds'.format(self.wait_time_seconds))
-        sleep(self.wait_time_seconds)
+        self.device.sleep(self.wait_time_seconds)
 
     def update_result(self, context):
         app_is_running = bool([p for p in self.device.ps() if p.name == self.package])
diff --git a/wlauto/workloads/applaunch/__init__.py b/wlauto/workloads/applaunch/__init__.py
index 4323ad29..546825df 100644
--- a/wlauto/workloads/applaunch/__init__.py
+++ b/wlauto/workloads/applaunch/__init__.py
@@ -15,8 +15,6 @@
 # pylint: disable=attribute-defined-outside-init
 import os
 
-from time import sleep
-
 from wlauto import Workload, AndroidBenchmark, AndroidUxPerfWorkload, UiAutomatorWorkload
 from wlauto import Parameter
 from wlauto import ExtensionLoader
diff --git a/wlauto/workloads/audio/__init__.py b/wlauto/workloads/audio/__init__.py
index 6487733f..59dab066 100644
--- a/wlauto/workloads/audio/__init__.py
+++ b/wlauto/workloads/audio/__init__.py
@@ -14,7 +14,6 @@
 #
 # pylint: disable=E1101,W0201
 import os
-import time
 import urllib
 
 from wlauto import settings, Workload, Parameter
@@ -70,7 +69,7 @@ class Audio(Workload):
         self.device.execute('am start -W -S -n com.android.music/.MediaPlaybackActivity -d {}'.format(self.on_device_file))
 
     def run(self, context):
-        time.sleep(self.duration)
+        self.device.sleep(self.duration)
 
     def update_result(self, context):
         # Stop the audio
diff --git a/wlauto/workloads/bbench/__init__.py b/wlauto/workloads/bbench/__init__.py
index 94161f44..918362d4 100644
--- a/wlauto/workloads/bbench/__init__.py
+++ b/wlauto/workloads/bbench/__init__.py
@@ -14,7 +14,6 @@
 #
 # pylint: disable=E1101,W0201
 import os
-import time
 import urllib
 import tarfile
 import shutil
@@ -107,11 +106,11 @@ class BBench(Workload):
 
         # Open the browser with default page
         self.device.execute('am start -n  {}/{} about:blank'.format(self.browser_package, self.browser_activity))
-        time.sleep(5)
+        self.device.sleep(5)
 
         # Stop the browser if already running and wait for it to stop
         self.device.execute('am force-stop {}'.format(self.browser_package))
-        time.sleep(5)
+        self.device.sleep(5)
 
         # Clear the logs
         self.device.clear_logcat()
@@ -134,7 +133,7 @@ class BBench(Workload):
     def run(self, context):
         # Launch the bbench
         self.device.execute('am start -n  {}/{} {}'.format(self.browser_package, self.browser_activity, self.index_noinput))
-        time.sleep(5)  # WA1 parity
+        self.device.sleep(5)  # WA1 parity
         # Launch the server waiting for Bbench to complete
         self.device.execute(self.luanch_server_command, self.server_timeout)
 
diff --git a/wlauto/workloads/citadel/__init__.py b/wlauto/workloads/citadel/__init__.py
index 71b433b9..2dd6098c 100644
--- a/wlauto/workloads/citadel/__init__.py
+++ b/wlauto/workloads/citadel/__init__.py
@@ -14,8 +14,6 @@
 #
 
 # pylint: disable=E1101
-import time
-
 from wlauto import GameWorkload, Parameter
 
 
@@ -41,4 +39,4 @@ class EpicCitadel(GameWorkload):
 
     def run(self, context):
         super(EpicCitadel, self).run(context)
-        time.sleep(self.duration)
+        self.device.sleep(self.duration)
diff --git a/wlauto/workloads/cyclictest/__init__.py b/wlauto/workloads/cyclictest/__init__.py
index c7d2e36e..e26ee0c7 100644
--- a/wlauto/workloads/cyclictest/__init__.py
+++ b/wlauto/workloads/cyclictest/__init__.py
@@ -16,7 +16,6 @@
 # pylint: disable=attribute-defined-outside-init
 
 import os
-import time
 
 from wlauto import settings, Workload, Executable, Parameter
 from wlauto.exceptions import ConfigError, WorkloadError
diff --git a/wlauto/workloads/facebook/__init__.py b/wlauto/workloads/facebook/__init__.py
index 9f456ee3..a78832da 100644
--- a/wlauto/workloads/facebook/__init__.py
+++ b/wlauto/workloads/facebook/__init__.py
@@ -15,7 +15,6 @@
 
 
 import os
-import time
 import sys
 
 from wlauto import AndroidUiAutoBenchmark
@@ -68,7 +67,7 @@ class Facebook(AndroidUiAutoBenchmark):
 
         #Start the disable update workload
         self.device.execute(command, self.du_run_timeout)
-        time.sleep(self.DELAY)
+        self.device.sleep(self.DELAY)
 
         #Stop the play store activity
         self.device.execute('am force-stop com.android.vending')
diff --git a/wlauto/workloads/glbcorp/__init__.py b/wlauto/workloads/glbcorp/__init__.py
index 449ab57f..3fe0c7b8 100644
--- a/wlauto/workloads/glbcorp/__init__.py
+++ b/wlauto/workloads/glbcorp/__init__.py
@@ -18,7 +18,6 @@
 from __future__ import division
 import os
 import re
-import time
 import select
 import json
 import threading
@@ -122,7 +121,7 @@ class GlbCorp(ApkWorkload):
                 raise WorkloadError(result)
             else:
                 self.logger.debug(result)
-            time.sleep(DELAY)
+            self.device.sleep(DELAY)
             self.monitor.wait_for_run_end(self.run_timeout)
 
     def update_result(self, context):  # NOQA
@@ -209,7 +208,7 @@ class GlbRunMonitor(threading.Thread):
         proc = subprocess.Popen(self.command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
         while not self.stop_event.is_set():
             if self.run_ended.is_set():
-                time.sleep(DELAY)
+                self.device.sleep(DELAY)
             else:
                 ready, _, _ = select.select([proc.stdout, proc.stderr], [], [], 2)
                 if ready:
diff --git a/wlauto/workloads/homescreen/__init__.py b/wlauto/workloads/homescreen/__init__.py
index 737d435b..94cf912b 100644
--- a/wlauto/workloads/homescreen/__init__.py
+++ b/wlauto/workloads/homescreen/__init__.py
@@ -15,8 +15,6 @@
 
 # pylint: disable=E1101
 
-import time
-
 from wlauto import Workload, Parameter
 
 
@@ -40,4 +38,4 @@ class HomeScreen(Workload):
         self.device.execute('input keyevent 3')  # press the home key
 
     def run(self, context):
-        time.sleep(self.duration)
+        self.device.sleep(self.duration)
diff --git a/wlauto/workloads/idle/__init__.py b/wlauto/workloads/idle/__init__.py
index 8c85a289..9fe4c021 100644
--- a/wlauto/workloads/idle/__init__.py
+++ b/wlauto/workloads/idle/__init__.py
@@ -15,8 +15,6 @@
 
 # pylint: disable=E1101
 
-import time
-
 from wlauto import Workload, Parameter
 from wlauto.exceptions import WorkloadError, ConfigError
 
@@ -56,13 +54,13 @@ class IdleWorkload(Workload):
             self.device.execute('stop && sleep {} && start'.format(self.duration),
                                 timeout=timeout, as_root=True)
         else:
-            time.sleep(self.duration)
+            self.device.sleep(self.duration)
 
     def teardown(self, context):
         if self.stop_android:
             self.logger.debug('Waiting for Android restart to complete...')
             # Wait for the boot animation to start and then to finish.
             while self.device.execute('getprop init.svc.bootanim').strip() == 'stopped':
-                time.sleep(0.2)
+                self.device.sleep(0.2)
             while self.device.execute('getprop init.svc.bootanim').strip() == 'running':
-                time.sleep(1)
+                self.device.sleep(1)
diff --git a/wlauto/workloads/manual/__init__.py b/wlauto/workloads/manual/__init__.py
index 8edeefd6..05e91f97 100644
--- a/wlauto/workloads/manual/__init__.py
+++ b/wlauto/workloads/manual/__init__.py
@@ -14,7 +14,6 @@
 #
 # pylint: disable=E1101,W0201,E0203
 import os
-import time
 
 from wlauto import Workload, Parameter
 from wlauto.exceptions import ConfigError
@@ -74,7 +73,7 @@ class ManualWorkload(Workload):
     def run(self, context):
         self.logger.info('START NOW!')
         if self.duration:
-            time.sleep(self.duration)
+            self.device.sleep(self.duration)
         elif self.user_triggered:
             self.logger.info('')
             self.logger.info('hit any key to end your workload execution...')
diff --git a/wlauto/workloads/nenamark/__init__.py b/wlauto/workloads/nenamark/__init__.py
index 351dcb91..b34b6f8b 100644
--- a/wlauto/workloads/nenamark/__init__.py
+++ b/wlauto/workloads/nenamark/__init__.py
@@ -16,7 +16,6 @@
 
 import os
 import re
-import time
 
 from wlauto import AndroidBenchmark, Parameter
 
@@ -50,9 +49,9 @@ class Nenamark(AndroidBenchmark):
     regex = re.compile('.*NenaMark2.*Score.*?([0-9\.]*)fps')
 
     def run(self, context):
-        time.sleep(5)  # wait for nenamark menu to show up
+        self.device.sleep(5)  # wait for nenamark menu to show up
         self.device.execute('input keyevent 23')
-        time.sleep(self.duration)
+        self.device.sleep(self.duration)
 
     def update_result(self, context):
         super(Nenamark, self).update_result(context)
diff --git a/wlauto/workloads/thechase/__init__.py b/wlauto/workloads/thechase/__init__.py
index 947fc673..b3cc1050 100755
--- a/wlauto/workloads/thechase/__init__.py
+++ b/wlauto/workloads/thechase/__init__.py
@@ -14,8 +14,6 @@
 #
 
 # pylint: disable=E1101
-import time
-
 from wlauto import ApkWorkload, Parameter
 
 
@@ -42,4 +40,4 @@ class TheChase(ApkWorkload):
     ]
 
     def run(self, context):
-        time.sleep(self.duration)
+        self.device.sleep(self.duration)
diff --git a/wlauto/workloads/video/__init__.py b/wlauto/workloads/video/__init__.py
index 40824c4c..e2d1c535 100644
--- a/wlauto/workloads/video/__init__.py
+++ b/wlauto/workloads/video/__init__.py
@@ -16,7 +16,6 @@
 # pylint: disable=E1101,E0203,W0201
 
 import os
-import time
 import urllib
 from collections import defaultdict
 
@@ -114,7 +113,7 @@ class VideoWorkload(Workload):
         self.device.execute(command)
 
     def run(self, context):
-        time.sleep(self.play_duration)
+        self.device.sleep(self.play_duration)
 
     def update_result(self, context):
         self.device.execute('am force-stop com.android.gallery3d')