diff --git a/harnesses/host_controller/campaigns/vts.py b/harnesses/host_controller/campaigns/vts.py
index 9aac9f6..3ce4446 100644
--- a/harnesses/host_controller/campaigns/vts.py
+++ b/harnesses/host_controller/campaigns/vts.py
@@ -15,23 +15,21 @@
 #
 
 # The list of the kwargs key. can retrieve informations on the leased job.
-_JOB_ADDITIONAL_ATTR_LIST = [
+_JOB_ATTR_LIST = [
+    "build_id",
+    "test_name",
+    "shards",
+    "serial",
     "build_target",
     "manifest_branch",
     "gsi_branch",
     "gsi_build_target",
-    "gsi_pab_account_id",
     "test_branch",
     "test_build_target",
-    "test_pab_account_id",
 ]
 
 
-def EmitConsoleCommands(_build_id="latest",
-                        _test_name="vts/vts",
-                        _shards=1,
-                        _serials=None,
-                        **kwargs):
+def EmitConsoleCommands(**kwargs):
     """Runs a common VTS-on-GSI or CTS-on-GSI test.
 
     This uses a given device branch information and automatically
@@ -39,9 +37,9 @@
     """
     result = []
 
-    if not set(_JOB_ADDITIONAL_ATTR_LIST).issubset(kwargs):
+    if not set(_JOB_ATTR_LIST).issubset(kwargs):
         missing_keys = [
-            key for key in _JOB_ADDITIONAL_ATTR_LIST if key not in kwargs
+            key for key in _JOB_ATTR_LIST if key not in kwargs
         ]
         print("Leased job missing attribute(s): {}".format(
             ", ".join(missing_keys)))
@@ -52,54 +50,64 @@
     else:
         build_target = kwargs["build_target"]
 
+    manifest_branch = kwargs["manifest_branch"]
+    build_id = kwargs["build_id"]
     result.append(
         "fetch --type=pab --branch=%s --target=%s --artifact_name=%s-img-%s.zip "
         "--build_id=%s --account_id=541462473" %
-        (kwargs["manifest_branch"], build_target, build_target.split("-")[0],
-         _build_id if _build_id != "latest" else "{build_id}", _build_id), )
+        (manifest_branch, build_target, build_target.split("-")[0], build_id
+         if build_id != "latest" else "{build_id}", build_id), )
     result.append(
         "fetch --type=pab --branch=%s --target=%s --artifact_name=bootloader.img "
-        "--build_id=%s --account_id=541462473" % (kwargs["manifest_branch"],
-                                                  build_target, _build_id), )
+        "--build_id=%s --account_id=541462473" % (manifest_branch,
+                                                  build_target, build_id), )
     result.append(
         "fetch --type=pab --branch=%s --target=%s --artifact_name=radio.img "
-        "--build_id=%s --account_id=541462473" % (kwargs["manifest_branch"],
-                                                  build_target, _build_id), )
+        "--build_id=%s --account_id=541462473" % (manifest_branch,
+                                                  build_target, build_id), )
 
-    result.append("fetch --type=pab --branch=%s --target=%s "
-                  "--artifact_name=aosp_arm64_ab-img-{build_id}.zip "
-                  "--build_id=latest --account_id=%s" %
-                  (kwargs["gsi_branch"], kwargs["gsi_build_target"],
-                   kwargs["gsi_pab_account_id"]), )
-    result.append("fetch --type=pab --branch=%s --target=%s "
-                  "--artifact_name=android-vts.zip "
-                  "--build_id=latest --account_id=%s" %
-                  (kwargs["test_branch"], kwargs["test_build_target"],
-                   kwargs["test_pab_account_id"]), )
+    result.append(
+        "fetch --type=pab --branch=%s --target=%s "
+        "--artifact_name=aosp_arm64_ab-img-{build_id}.zip --build_id=latest"
+        % (kwargs["gsi_branch"], kwargs["gsi_build_target"]))
+    if "gsi_pab_account_id" in kwargs and kwargs["gsi_pab_account_id"] != "":
+        result[-1] += " --account_id=%s" % kwargs["gsi_pab_account_id"]
 
-    shards = int(_shards)
+    result.append(
+        "fetch --type=pab --branch=%s --target=%s "
+        "--artifact_name=android-vts.zip --build_id=latest"
+        % (kwargs["test_branch"], kwargs["test_build_target"]))
+    if "test_pab_account_id" in kwargs and kwargs["test_pab_account_id"] != "":
+        result[-1] += " --account_id=%s" % kwargs["test_pab_account_id"]
+
     result.append("info")
     result.append("gsispl --version_from_path=boot.img")
-    test_name = _test_name.split("/")[-1]
+
+    shards = int(kwargs["shards"])
+    test_name = kwargs["test_name"].split("/")[-1]
+    serials = kwargs["serial"]
     if shards > 1:
         sub_commands = []
-        if shards <= len(_serials):
+        if shards <= len(serials):
             for shard_index in range(shards):
                 new_cmd_list = []
                 new_cmd_list.append(
-                    "flash --current --serial %s" % _serials[shard_index])
+                    "flash --current --serial %s" % serials[shard_index])
                 new_cmd_list.append("test -- %s --serial %s --shard-count %d "
                                     "--shard-index %d" %
-                                    (test_name, _serials[shard_index], shards,
+                                    (test_name, serials[shard_index], shards,
                                      shard_index))
                 sub_commands.append(new_cmd_list)
         result.append(sub_commands)
     else:
-        result.append("flash --current --serial %s" % _serials[0])
-        if _serials:
-            result.append("test %s -- --serial %s --shards %s" %
-                          (test_name, ",".join(_serials), shards))
+        result.append("flash --current --serial %s" % serials[0])
+        if serials:
+            result.append("test --keep-result -- %s --serial %s --shards %s" %
+                          (test_name, ",".join(serials), shards))
         else:
-            result.append("test %s -- --shards %s" % (test_name, shards))
+            result.append("test --keep-result -- %s --shards %s" % (test_name,
+                                                                    shards))
+
+        result.append("upload --src={result_zip} --dest=gs://vts-report/")
 
     return result
diff --git a/harnesses/host_controller/console.py b/harnesses/host_controller/console.py
index 90379c8..0e6fd8c 100644
--- a/harnesses/host_controller/console.py
+++ b/harnesses/host_controller/console.py
@@ -325,12 +325,7 @@
 
         script_module = imp.load_source('script_module', script_file_path)
 
-        commands = script_module.EmitConsoleCommands(
-            _build_id=kwargs["build_id"],
-            _test_name=kwargs["test_name"].split("/")[0],
-            _shards=int(kwargs["shards"]),
-            _serials=kwargs["serial"],
-            **kwargs)
+        commands = script_module.EmitConsoleCommands(**kwargs)
         if commands:
             for command in commands:
                 self.onecmd(command)
@@ -1321,7 +1316,11 @@
                         "fastboot -s %s getvar product" % device["serial"])
                     if retcode == 0:
                         res = stderr.splitlines()[0].rstrip()
-                        device["product"] = res.split(":")[1].strip()
+                        print(res)
+                        if ":" in res:
+                            device["product"] = res.split(":")[1].strip()
+                        else:
+                            device["product"] = "error"
                     else:
                         device["product"] = "error"
                     device["status"] = DEVICE_STATUS_DICT["fastboot"]
@@ -1333,6 +1332,7 @@
             if lease:
                 filepath, kwargs = self._vti_endpoint_client.LeaseJob(
                     socket.gethostname(), False)
+
                 if filepath is not None:
                     self.leased_job_queue.put(kwargs)
 
