diff --git a/test/py/console_sandbox.py b/test/py/console_sandbox.py
new file mode 100644
index 0000000..da55d2f
--- /dev/null
+++ b/test/py/console_sandbox.py
@@ -0,0 +1,119 @@
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2015 Stephen Warren
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+
+"""
+Logic to interact with the sandbox port of U-Boot, running as a sub-process.
+"""
+
+import time
+from spawn import Spawn
+from console_base import ConsoleBase
+
+class ConsoleSandbox(ConsoleBase):
+    """Represents a connection to a sandbox U-Boot console, executed as a sub-
+    process."""
+
+    def __init__(self, log, config):
+        """Initialize a U-Boot console connection.
+
+        Args:
+            log: A multiplexed_log.Logfile instance.
+            config: A "configuration" object as defined in conftest.py.
+
+        Returns:
+            Nothing.
+        """
+
+        super(ConsoleSandbox, self).__init__(log, config, max_fifo_fill=1024)
+        self.sandbox_flags = []
+        self.use_dtb = True
+
+    def get_spawn(self):
+        """Connect to a fresh U-Boot instance.
+
+        A new sandbox process is created, so that U-Boot begins running from
+        scratch.
+
+        Args:
+            None.
+
+        Returns:
+            A spawn.Spawn object that is attached to U-Boot.
+        """
+
+        bcfg = self.config.buildconfig
+        config_spl = bcfg.get('config_spl', 'n') == 'y'
+        config_vpl = bcfg.get('config_vpl', 'n') == 'y'
+        if config_vpl:
+            # Run TPL first, which runs VPL
+            fname = '/tpl/u-boot-tpl'
+        else:
+            fname = '/spl/u-boot-spl' if config_spl else '/u-boot'
+        print(fname)
+        cmd = []
+        if self.config.gdbserver:
+            cmd += ['gdbserver', self.config.gdbserver]
+        cmd += [self.config.build_dir + fname, '-v']
+        if self.use_dtb:
+            cmd += ['-d', self.config.dtb]
+        cmd += self.sandbox_flags
+        return Spawn(cmd, cwd=self.config.source_dir, decode_signal=True)
+
+    def restart_uboot_with_flags(self, flags, expect_reset=False, use_dtb=True):
+        """Run U-Boot with the given command-line flags
+
+        Args:
+            flags: List of flags to pass, each a string
+            expect_reset: Boolean indication whether this boot is expected
+                to be reset while the 1st boot process after main boot before
+                prompt. False by default.
+            use_dtb: True to use a device tree file, False to run without one
+
+        Returns:
+            A spawn.Spawn object that is attached to U-Boot.
+        """
+
+        try:
+            self.sandbox_flags = flags
+            self.use_dtb = use_dtb
+            return self.restart_uboot(expect_reset)
+        finally:
+            self.sandbox_flags = []
+            self.use_dtb = True
+
+    def kill(self, sig):
+        """Send a specific Unix signal to the sandbox process.
+
+        Args:
+            sig: The Unix signal to send to the process.
+
+        Returns:
+            Nothing.
+        """
+
+        self.log.action('kill %d' % sig)
+        self.p.kill(sig)
+
+    def validate_exited(self):
+        """Determine whether the sandbox process has exited.
+
+        If required, this function waits a reasonable time for the process to
+        exit.
+
+        Args:
+            None.
+
+        Returns:
+            Boolean indicating whether the process has exited.
+        """
+
+        p = self.p
+        self.p = None
+        for i in range(100):
+            ret = not p.isalive()
+            if ret:
+                break
+            time.sleep(0.1)
+        p.close()
+        return ret
