diff --git a/doc/source/revent.rst b/doc/source/revent.rst
index 8a0d8adc..8c843a74 100644
--- a/doc/source/revent.rst
+++ b/doc/source/revent.rst
@@ -246,7 +246,7 @@ definition.yaml file
 This defines each state of the workload and lists which templates are expected
 to be found and how many are required to be detected for a conclusive match. It
 also defines the expected state in each workload phase where a state detection
-is run (currently those are setupComplete and runComplete).
+is run (currently those are setup_complete and run_complete).
 
 Templates are picture elements to be matched in a screenshot. Each template
 mentioned in the definition file should be placed as a file with the same name
@@ -260,7 +260,7 @@ understand the format. Note that more than just two states (for the afterSetup
 and afterRun phase) can be defined and this helps track the cause of errors in
 case an unexpected state is encountered.
 
-.. code-block:: python
+.. code-block:: yaml
 
     workload_name: angrybirds
 
diff --git a/wlauto/commands/record.py b/wlauto/commands/record.py
index 5b08a0a1..c7c3eabd 100644
--- a/wlauto/commands/record.py
+++ b/wlauto/commands/record.py
@@ -101,6 +101,8 @@ class RecordCommand(ReventCommand):
         self.parser.add_argument('-p', '--package', help='Package to launch before recording')
         self.parser.add_argument('-C', '--clear', help='Clear app cache before launching it',
                                  action="store_true")
+        self.parser.add_argument('-S', '--capture-screen', help='Record a screen capture after recording',
+                                 action="store_true")
 
     def run(self, args):
         if args.device:
@@ -128,6 +130,9 @@ class RecordCommand(ReventCommand):
 
         self.logger.info("Press Enter when you have finished recording...")
         raw_input("")
+        if args.screencapture:
+            self.logger.info("Recording screen capture")
+            self.device.capture_screen(args.output or os.getcwdu())
         self.device.killall("revent", signal.SIGTERM)
         self.logger.info("Waiting for revent to finish")
         while self.device.get_pids_of("revent"):
diff --git a/wlauto/common/android/workload.py b/wlauto/common/android/workload.py
index 4dc5e630..0441ce0f 100644
--- a/wlauto/common/android/workload.py
+++ b/wlauto/common/android/workload.py
@@ -240,7 +240,7 @@ class ApkWorkload(Workload):
         context.add_classifiers(apk_version=self.apk_version)
 
         if self.launch_main:
-            self.launch_package() # launch default activity without intent data
+            self.launch_package()  # launch default activity without intent data
         self.device.execute('am kill-all')  # kill all *background* activities
         self.device.clear_logcat()
 
@@ -439,6 +439,7 @@ AndroidBenchmark = ApkWorkload  # backward compatibility
 
 
 class ReventWorkload(Workload):
+    # pylint: disable=attribute-defined-outside-init
 
     def __init__(self, device, _call_super=True, **kwargs):
         if _call_super:
@@ -452,7 +453,9 @@ class ReventWorkload(Workload):
         self.on_device_setup_revent = None
         self.on_device_run_revent = None
         self.statedefs_dir = None
-        self.check_states = None
+
+        if self.check_states:
+            state_detector.check_match_state_dependencies()
 
     def setup(self, context):
         self.revent_setup_file = context.resolver.get(ReventFile(self, 'setup'))
diff --git a/wlauto/utils/statedetect.py b/wlauto/utils/statedetect.py
index 13463f61..94790659 100755
--- a/wlauto/utils/statedetect.py
+++ b/wlauto/utils/statedetect.py
@@ -40,6 +40,8 @@ try:
 except ImportError:
     imutils = None
 
+from wlauto.exceptions import HostError
+
 
 class StateDefinitionError(RuntimeError):
     pass
@@ -58,10 +60,14 @@ def auto_canny(image, sigma=0.33):
     return edged
 
 
+def check_match_state_dependencies():
+    if np is None or cv2 is None or imutils is None:
+        raise HostError("State detection requires numpy, opencv (cv2) and imutils.")
+
+
 def match_state(screenshot_file, defpath, state_definitions):  # pylint: disable=too-many-locals
     # check dependencies
-    if np is None or cv2 is None or imutils is None:
-        raise RuntimeError("State detection requires numpy, opencv (cv2) and imutils.")
+    check_match_state_dependencies()
 
     # check if file exists, then load screenshot into opencv and create edge map
     if not os.path.isfile(screenshot_file):