diff --git a/labs/lib/functions.guest b/labs/lib/functions.guest
index b7844735..c3bd25a3 100644
--- a/labs/lib/functions.guest
+++ b/labs/lib/functions.guest
@@ -127,8 +127,14 @@ function as_root_exec_script {
     local log_path=$LOG_DIR/${prefix}_$script_name.auto
 
     su - "$VM_SHELL_USER" -c "bash $script_path" >"$log_path" 2>&1
-
-    echo "$(date)  done"
+    local rc=$?
+    if [ $rc -ne 0 ]; then
+        echo "$(date) ERROR: status $rc for $script_path" |
+            tee >&2 -a "$LOG_DIR/error.log"
+    else
+        echo "$(date)  done"
+    fi
+    return $rc
 }
 
 #-------------------------------------------------------------------------------
diff --git a/labs/lib/osbash/functions.host b/labs/lib/osbash/functions.host
index 32ad4538..fb93ef77 100644
--- a/labs/lib/osbash/functions.host
+++ b/labs/lib/osbash/functions.host
@@ -187,7 +187,7 @@ function wait_for_autofiles {
     ${OSBASH:+:} autostart_reset
     ${OSBASH:+:} return 0
 
-    until [ -f "$STATUS_DIR/done" ]; do
+    until [ -f "$STATUS_DIR/done" -o -f "$STATUS_DIR/error" ]; do
         # Note: begin files (created by indicate_current_auto) are only visible
         # if the STATUS_DIR directory is shared between host and VM
         ${WBATCH:-:} process_begin_files
@@ -196,7 +196,12 @@ function wait_for_autofiles {
     done
     # Check for remaining *.sh.begin files
     ${WBATCH:-:} process_begin_files
-    rm "$STATUS_DIR/done"
+    if [ -f "$STATUS_DIR/done" ]; then
+        rm "$STATUS_DIR/done"
+    else
+        echo -e >&2 "\nERROR occured. Exiting."
+        kill -- -$$
+    fi
     echo
 }
 
diff --git a/labs/lib/wbatch/template-end_file_bat b/labs/lib/wbatch/template-end_file_bat
index b81a84ee..ee732fe9 100644
--- a/labs/lib/wbatch/template-end_file_bat
+++ b/labs/lib/wbatch/template-end_file_bat
@@ -13,6 +13,7 @@ ECHO.
 :terminate
 ENDLOCAL
 PAUSE
+EXIT
 GOTO :eof
 
 REM ============================================================================
@@ -25,6 +26,17 @@ IF EXIST %STATUSDIR%\done (
     DEL %STATUSDIR%\done
     GOTO :eof
 )
+IF EXIST %STATUSDIR%\error (
+    ECHO.
+    ECHO %time% ERROR Script returned error:
+    ECHO.
+    TYPE %STATUSDIR%\error
+    ECHO.
+    ECHO %time% Aborting.
+    ECHO.
+    DEL %STATUSDIR%\error
+    GOTO :terminate
+)
 TIMEOUT /T 5 /NOBREAK
 GOTO :wait_auto
 REM - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/labs/scripts/osbash/template-osbashauto b/labs/scripts/osbash/template-osbashauto
index 216aad22..10e8e8ac 100644
--- a/labs/scripts/osbash/template-osbashauto
+++ b/labs/scripts/osbash/template-osbashauto
@@ -36,8 +36,12 @@ for AUTODIR in "/$SHARE_NAME/autostart" "/$SHARE_NAME/autostart/$HOSTNAME"; do
     if [ -d "$AUTODIR" ]; then
         echo "$(date) autodir $AUTODIR"
         for SCRIPT in $AUTODIR/*.sh; do
-            as_root_exec_script "$SCRIPT"
-
+            if ! as_root_exec_script "$SCRIPT"; then
+                echo >&2 "Script returned with error, giving up."
+                # Tell host about the error
+                echo "ERROR in $SCRIPT" >> "$STATUS_DIR/error"
+                exit 1
+            fi
             # Remove script after execution
             rm "$SCRIPT"
         done