Merge "Do not follow symbolic link when deleting virtualenv" into oreo-vts-dev am: 158f4c7a6c am: 68b2f477cf
am: 7e6720cd83

Change-Id: I88156bcbace39086145979dd5fb36f8793977f64
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..b9c362e
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,5 @@
+ryanjcampbell@google.com
+trong@google.com
+yim@google.com
+yuexima@google.com
+zhuoyao@google.com
diff --git a/README.md b/README.md
index 7c8643d..ebb2009 100644
--- a/README.md
+++ b/README.md
@@ -21,5 +21,4 @@
 2. [Where to find VTS test cases](testcases/README.md)
 3. [VTS Test Developer
    Manual (Codelab)](https://codelabs.developers.google.com/codelabs/android-vts)
-4. [VTS Framework Developer Manual](doc/framework_developer_manual.md)
 
diff --git a/agents/hal/AgentRequestHandler.cpp b/agents/hal/AgentRequestHandler.cpp
index b43ec55..df2698a 100644
--- a/agents/hal/AgentRequestHandler.cpp
+++ b/agents/hal/AgentRequestHandler.cpp
@@ -170,14 +170,14 @@
         if (driver_hal_spec_dir_path_.length() < 1) {
 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
           asprintf(&cmd,
-                   "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s --server "
+                   "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s "
                    "--server_socket_path=%s "
                    "--callback_socket_name=%s",
                    ld_dir_path.c_str(), driver_binary_path.c_str(),
                    socket_port_flie_path.c_str(), callback_socket_name.c_str());
 #else  // binder
           asprintf(&cmd,
-                   "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s --server "
+                   "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s "
                    "--service_name=%s "
                    "--callback_socket_name=%s",
                    ld_dir_path.c_str(), driver_binary_path.c_str(),
@@ -186,18 +186,18 @@
         } else {
 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
           asprintf(&cmd,
-                   "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s --server "
+                   "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s "
                    "--server_socket_path=%s "
-                   "--spec_dir=%s --callback_socket_name=%s",
+                   "--spec_dir_path=%s --callback_socket_name=%s",
                    ld_dir_path.c_str(), driver_binary_path.c_str(),
                    socket_port_flie_path.c_str(),
                    driver_hal_spec_dir_path_.c_str(),
                    callback_socket_name.c_str());
 #else  // binder
           asprintf(&cmd,
-                   "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s --server "
+                   "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s "
                    "--service_name=%s "
-                   "--spec_dir=%s --callback_socket_name=%s",
+                   "--spec_dir_path=%s --callback_socket_name=%s",
                    ld_dir_path.c_str(), driver_binary_path.c_str(),
                    service_name.c_str(), driver_hal_spec_dir_path_.c_str(),
                    callback_socket_name.c_str());
@@ -257,24 +257,25 @@
           // TODO: kill the driver?
           return VtsSocketSendMessage(response_msg);
         }
-        int32_t result;
+
         if (driver_type == VTS_DRIVER_TYPE_HAL_CONVENTIONAL ||
             driver_type == VTS_DRIVER_TYPE_HAL_LEGACY ||
             driver_type == VTS_DRIVER_TYPE_HAL_HIDL) {
           cout << "[agent->driver]: LoadHal " << module_name << endl;
-          result = client->LoadHal(file_path, target_class, target_type,
-                                   target_version, target_package,
-                                   target_component_name,
-                                   hw_binder_service_name, module_name);
-          cout << "[driver->agent]: LoadHal returns " << result << endl;
-          if (result == VTS_DRIVER_RESPONSE_SUCCESS) {
+          int32_t driver_id = client->LoadHal(
+              file_path, target_class, target_type, target_version,
+              target_package, target_component_name, hw_binder_service_name,
+              module_name);
+          cout << "[driver->agent]: LoadHal returns " << driver_id << endl;
+          if (driver_id == -1) {
+            response_msg.set_response_code(FAIL);
+            response_msg.set_reason("Failed to load the selected HAL.");
+          } else {
             response_msg.set_response_code(SUCCESS);
+            response_msg.set_result(std::to_string(driver_id));
             response_msg.set_reason("Loaded the selected HAL.");
             cout << "set service_name " << service_name << endl;
             service_name_ = service_name;
-          } else {
-            response_msg.set_response_code(FAIL);
-            response_msg.set_reason("Failed to load the selected HAL.");
           }
         } else if (driver_type == VTS_DRIVER_TYPE_SHELL) {
           response_msg.set_response_code(SUCCESS);
@@ -311,28 +312,12 @@
     return false;
   }
 
-  const char* result = client->ReadSpecification(
-      command_message.service_name(),
-      command_message.target_class(),
-      command_message.target_type(),
-      command_message.target_version() / 100.0,
+  const string& result = client->ReadSpecification(
+      command_message.service_name(), command_message.target_class(),
+      command_message.target_type(), command_message.target_version() / 100.0f,
       command_message.target_package());
 
-  AndroidSystemControlResponseMessage response_msg;
-  if (result != NULL && strlen(result) > 0) {
-    cout << "[agent] Call: success" << endl;
-    response_msg.set_response_code(SUCCESS);
-    response_msg.set_result(result);
-  } else {
-    cout << "[agent] Call: fail" << endl;
-    response_msg.set_response_code(FAIL);
-    response_msg.set_reason("Failed to call the api.");
-  }
-  bool succ = VtsSocketSendMessage(response_msg);
-#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
-  free((void*)result);
-#endif
-  return succ;
+  return SendApiResult("ReadSpecification", result);
 }
 
 bool AgentRequestHandler::ListApis() {
@@ -348,25 +333,7 @@
 #endif
     return false;
   }
-  const char* result = client->GetFunctions();
-  if (result != NULL) {
-    cout << "GetFunctions: len " << strlen(result) << endl;
-  }
-
-  AndroidSystemControlResponseMessage response_msg;
-  if (result != NULL && strlen(result) > 0) {
-    response_msg.set_response_code(SUCCESS);
-    response_msg.set_spec(string(result));
-  } else {
-    response_msg.set_response_code(FAIL);
-    response_msg.set_reason("Failed to get the functions.");
-  }
-
-  bool succ = VtsSocketSendMessage(response_msg);
-#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
-  free((void*)result);
-#endif
-  return succ;
+  return SendApiResult("GetAttribute", "", client->GetFunctions());
 }
 
 bool AgentRequestHandler::CallApi(const string& call_payload,
@@ -384,23 +351,7 @@
     return false;
   }
 
-  const char* result = client->Call(call_payload, uid);
-
-  AndroidSystemControlResponseMessage response_msg;
-  if (result != NULL && strlen(result) > 0) {
-    cout << "[agent] Call: success" << endl;
-    response_msg.set_response_code(SUCCESS);
-    response_msg.set_result(result);
-  } else {
-    cout << "[agent] Call: fail" << endl;
-    response_msg.set_response_code(FAIL);
-    response_msg.set_reason("Failed to call the api.");
-  }
-  bool succ = VtsSocketSendMessage(response_msg);
-#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
-  free((void*)result);
-#endif
-  return succ;
+  return SendApiResult("Call", client->Call(call_payload, uid));
 }
 
 bool AgentRequestHandler::GetAttribute(const string& payload) {
@@ -417,23 +368,28 @@
     return false;
   }
 
-  const char* result = client->GetAttribute(payload);
+  return SendApiResult("GetAttribute", client->GetAttribute(payload));
+}
 
+bool AgentRequestHandler::SendApiResult(const string& func_name,
+                                        const string& result,
+                                        const string& spec) {
   AndroidSystemControlResponseMessage response_msg;
-  if (result != NULL && strlen(result) > 0) {
+  if (result.size() > 0 || spec.size() > 0) {
     cout << "[agent] Call: success" << endl;
     response_msg.set_response_code(SUCCESS);
-    response_msg.set_result(result);
+    if (result.size() > 0) {
+      response_msg.set_result(result);
+    }
+    if (spec.size() > 0) {
+      response_msg.set_spec(spec);
+    }
   } else {
     cout << "[agent] Call: fail" << endl;
     response_msg.set_response_code(FAIL);
-    response_msg.set_reason("Failed to call the api.");
+    response_msg.set_reason("Failed to call api function: " + func_name);
   }
-  bool succ = VtsSocketSendMessage(response_msg);
-#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
-  free((void*)result);
-#endif
-  return succ;
+  return VtsSocketSendMessage(response_msg);
 }
 
 bool AgentRequestHandler::DefaultResponse() {
@@ -457,23 +413,21 @@
     return false;
   }
 
-  VtsDriverControlResponseMessage* result_message = client->ExecuteShellCommand(
-      command_message.shell_command());
+  auto result_message =
+      client->ExecuteShellCommand(command_message.shell_command());
 
   AndroidSystemControlResponseMessage response_msg;
 
-  if (result_message == NULL) {
+  if (result_message) {
+    CreateSystemControlResponseFromDriverControlResponse(*result_message,
+                                                         &response_msg);
+  } else {
     cout << "ExecuteShellCommand: failed to call the api" << endl;
     response_msg.set_response_code(FAIL);
     response_msg.set_reason("Failed to call the api.");
-  } else {
-    CreateSystemControlResponseFromDriverControlResponse(
-        *result_message, &response_msg);
-    delete(result_message);
   }
 
-  bool succ = VtsSocketSendMessage(response_msg);
-  return succ;
+  return VtsSocketSendMessage(response_msg);
 }
 
 void AgentRequestHandler::CreateSystemControlResponseFromDriverControlResponse(
diff --git a/agents/hal/AgentRequestHandler.h b/agents/hal/AgentRequestHandler.h
index 4058872..794f882 100644
--- a/agents/hal/AgentRequestHandler.h
+++ b/agents/hal/AgentRequestHandler.h
@@ -86,6 +86,11 @@
   // Returns a default response message.
   bool DefaultResponse();
 
+  // Send SUCCESS response with given result and/or spec if it is not empty,
+  // otherwise send FAIL.
+  bool SendApiResult(const string& func_name, const string& result,
+                     const string& spec = "");
+
  protected:
   // the currently opened, connected service name.
   string service_name_;
diff --git a/agents/hal/SocketClientToDriver.cpp b/agents/hal/SocketClientToDriver.cpp
index b6f6655..be28f50 100644
--- a/agents/hal/SocketClientToDriver.cpp
+++ b/agents/hal/SocketClientToDriver.cpp
@@ -85,37 +85,36 @@
 
   VtsDriverControlResponseMessage response_message;
   if (!VtsSocketRecvMessage(&response_message)) return -1;
-  cout << __func__ << " response code: " << response_message.response_code()
-       << endl;
-  return response_message.response_code();
+  if (response_message.response_code() != VTS_DRIVER_RESPONSE_SUCCESS) {
+    cerr << __func__ << "Failed to load the selected HAL." << endl;
+    return -1;
+  }
+  cout << __func__ << "Loaded the selected HAL." << endl;
+  return response_message.return_value();
 }
 
-const char* VtsDriverSocketClient::GetFunctions() {
+string VtsDriverSocketClient::GetFunctions() {
   cout << "[agent->driver] LIST_FUNCTIONS" << endl;
 
   VtsDriverControlCommandMessage command_message;
   command_message.set_command_type(LIST_FUNCTIONS);
-  if (!VtsSocketSendMessage(command_message)) return NULL;
+  if (!VtsSocketSendMessage(command_message)) {
+    return {};
+  }
 
   VtsDriverControlResponseMessage response_message;
-  if (!VtsSocketRecvMessage(&response_message)) return NULL;
-
-  char* result =
-      (char*)malloc(strlen(response_message.return_message().c_str()) + 1);
-  if (!result) {
-    cerr << __func__ << " ERROR result is NULL" << endl;
-    return NULL;
+  if (!VtsSocketRecvMessage(&response_message)) {
+    return {};
   }
-  strcpy(result, response_message.return_message().c_str());
-  return result;
+
+  return response_message.return_message();
 }
 
-const char* VtsDriverSocketClient::ReadSpecification(
-    const string& component_name,
-    int target_class,
-    int target_type,
-    float target_version,
-    const string& target_package) {
+string VtsDriverSocketClient::ReadSpecification(const string& component_name,
+                                                int target_class,
+                                                int target_type,
+                                                float target_version,
+                                                const string& target_package) {
   cout << "[agent->driver] LIST_FUNCTIONS" << endl;
 
   VtsDriverControlCommandMessage command_message;
@@ -127,72 +126,64 @@
   command_message.set_target_version(target_version);
   command_message.set_target_package(target_package);
 
-  if (!VtsSocketSendMessage(command_message)) return NULL;
+  if (!VtsSocketSendMessage(command_message)) {
+    return {};
+  }
 
   VtsDriverControlResponseMessage response_message;
-  if (!VtsSocketRecvMessage(&response_message)) return NULL;
-
-  char* result =
-      (char*)malloc(strlen(response_message.return_message().c_str()) + 1);
-  if (!result) {
-    cerr << __func__ << " ERROR result is NULL" << endl;
-    return NULL;
+  if (!VtsSocketRecvMessage(&response_message)) {
+    return {};
   }
-  strcpy(result, response_message.return_message().c_str());
-  return result;
+
+  return response_message.return_message();
 }
 
-const char* VtsDriverSocketClient::Call(const string& arg, const string& uid) {
+string VtsDriverSocketClient::Call(const string& arg, const string& uid) {
   VtsDriverControlCommandMessage command_message;
   command_message.set_command_type(CALL_FUNCTION);
   command_message.set_arg(arg);
   command_message.set_driver_caller_uid(uid);
-  if (!VtsSocketSendMessage(command_message)) return NULL;
+  if (!VtsSocketSendMessage(command_message)) {
+    return {};
+  }
 
   VtsDriverControlResponseMessage response_message;
-  if (!VtsSocketRecvMessage(&response_message)) return NULL;
-
-  char* result =
-      (char*)malloc(strlen(response_message.return_message().c_str()) + 1);
-  if (!result) {
-    cerr << __func__ << " ERROR result is NULL" << endl;
-    return NULL;
+  if (!VtsSocketRecvMessage(&response_message)) {
+    return {};
   }
-  strcpy(result, response_message.return_message().c_str());
-  return result;
+
+  cout << __func__ << " result: " << response_message.return_message() << endl;
+  return response_message.return_message();
 }
 
-const char* VtsDriverSocketClient::GetAttribute(const string& arg) {
+string VtsDriverSocketClient::GetAttribute(const string& arg) {
   VtsDriverControlCommandMessage command_message;
   command_message.set_command_type(GET_ATTRIBUTE);
   command_message.set_arg(arg);
-  if (!VtsSocketSendMessage(command_message)) return NULL;
+  if (!VtsSocketSendMessage(command_message)) {
+    return {};
+  }
 
   VtsDriverControlResponseMessage response_message;
-  if (!VtsSocketRecvMessage(&response_message)) return NULL;
-
-  char* result =
-      (char*)malloc(strlen(response_message.return_message().c_str()) + 1);
-  if (!result) {
-    cerr << __func__ << " ERROR result is NULL" << endl;
-    return NULL;
+  if (!VtsSocketRecvMessage(&response_message)) {
+    return {};
   }
-  strcpy(result, response_message.return_message().c_str());
-  return result;
+
+  return response_message.return_message();
 }
 
-VtsDriverControlResponseMessage* VtsDriverSocketClient::ExecuteShellCommand(
+unique_ptr<VtsDriverControlResponseMessage>
+VtsDriverSocketClient::ExecuteShellCommand(
     const ::google::protobuf::RepeatedPtrField<::std::string> shell_command) {
   VtsDriverControlCommandMessage command_message;
   command_message.set_command_type(EXECUTE_COMMAND);
   for (const auto& cmd : shell_command) {
     command_message.add_shell_command(cmd);
   }
-  if (!VtsSocketSendMessage(command_message)) return NULL;
+  if (!VtsSocketSendMessage(command_message)) return nullptr;
 
-  VtsDriverControlResponseMessage* response_message =
-      new VtsDriverControlResponseMessage();
-  if (!VtsSocketRecvMessage(response_message)) return NULL;
+  auto response_message = make_unique<VtsDriverControlResponseMessage>();
+  if (!VtsSocketRecvMessage(response_message.get())) return nullptr;
 
   return response_message;
 }
diff --git a/agents/hal/SocketClientToDriver.h b/agents/hal/SocketClientToDriver.h
index e572431..4dbf4c7 100644
--- a/agents/hal/SocketClientToDriver.h
+++ b/agents/hal/SocketClientToDriver.h
@@ -47,27 +47,24 @@
                   const string& module_name);
 
   // Sends a LIST_FUNCTIONS request.
-  const char* GetFunctions();
+  string GetFunctions();
 
   // Sends a VTS_DRIVER_COMMAND_READ_SPECIFICATION request.
-  const char* ReadSpecification(
-          const string& component_name,
-          int target_class,
-          int target_type,
-          float target_version,
-          const string& target_package);
+  string ReadSpecification(const string& component_name, int target_class,
+                           int target_type, float target_version,
+                           const string& target_package);
 
   // Sends a CALL_FUNCTION request.
-  const char* Call(const string& arg, const string& uid);
+  string Call(const string& arg, const string& uid);
 
   // Sends a GET_ATTRIBUTE request.
-  const char* GetAttribute(const string& arg);
+  string GetAttribute(const string& arg);
 
   // Sends a GET_STATUS request.
   int32_t Status(int32_t type);
 
   // Sends a EXECUTE request.
-  VtsDriverControlResponseMessage* ExecuteShellCommand(
+  unique_ptr<VtsDriverControlResponseMessage> ExecuteShellCommand(
       const ::google::protobuf::RepeatedPtrField<::std::string> shell_command);
 };
 
diff --git a/agents/hal/TcpServerForRunner.cpp b/agents/hal/TcpServerForRunner.cpp
index 8999717..683f637 100644
--- a/agents/hal/TcpServerForRunner.cpp
+++ b/agents/hal/TcpServerForRunner.cpp
@@ -47,9 +47,10 @@
 
 // Starts to run a TCP server (foreground).
 int StartTcpServerForRunner(const char* spec_dir_path,
-                            const char* fuzzer_path32,
-                            const char* fuzzer_path64, const char* shell_path32,
-                            const char* shell_path64) {
+                            const char* hal_driver_path32,
+                            const char* hal_driver_path64,
+                            const char* shell_driver_path32,
+                            const char* shell_driver_path64) {
   int sockfd;
   socklen_t clilen;
   struct sockaddr_in serv_addr;
@@ -110,8 +111,9 @@
     if (pid == 0) {  // child
       close(sockfd);
       cout << "[agent] process for a runner - pid = " << getpid() << endl;
-      AgentRequestHandler handler(spec_dir_path, fuzzer_path32, fuzzer_path64,
-                                  shell_path32, shell_path64);
+      AgentRequestHandler handler(spec_dir_path, hal_driver_path32,
+                                  hal_driver_path64, shell_driver_path32,
+                                  shell_driver_path64);
       handler.SetSockfd(newsockfd);
       while (handler.ProcessOneCommand())
         ;
diff --git a/agents/hal/TcpServerForRunner.h b/agents/hal/TcpServerForRunner.h
index 0b929ae..addd247 100644
--- a/agents/hal/TcpServerForRunner.h
+++ b/agents/hal/TcpServerForRunner.h
@@ -21,10 +21,10 @@
 namespace vts {
 
 extern int StartTcpServerForRunner(const char* spec_dir_path,
-                                   const char* fuzzer_path32,
-                                   const char* fuzzer_path64,
-                                   const char* shell_path32,
-                                   const char* shell_path64);
+                                   const char* hal_dirver_path32,
+                                   const char* hal_driver_path64,
+                                   const char* shell_driver_path32,
+                                   const char* shell_driver_path64);
 
 }  // namespace vts
 }  // namespace android
diff --git a/agents/hal/VtsAgentMain.cpp b/agents/hal/VtsAgentMain.cpp
index 2df0ffe..cf2e00f 100644
--- a/agents/hal/VtsAgentMain.cpp
+++ b/agents/hal/VtsAgentMain.cpp
@@ -20,8 +20,8 @@
 
 #include "TcpServerForRunner.h"
 
-#define DEFAULT_HAL_DRIVER_FILE_PATH32 "./fuzzer32"
-#define DEFAULT_HAL_DRIVER_FILE_PATH64 "./fuzzer64"
+#define DEFAULT_HAL_DRIVER_FILE_PATH32 "./vts_hal_driver32"
+#define DEFAULT_HAL_DRIVER_FILE_PATH64 "./vts_hal_driver64"
 #define DEFAULT_SHELL_DRIVER_FILE_PATH32 "./vts_shell_driver32"
 #define DEFAULT_SHELL_DRIVER_FILE_PATH64 "./vts_shell_driver64"
 
diff --git a/compilation_tools/vtsc/VtsCompilerUtils.cpp b/compilation_tools/vtsc/VtsCompilerUtils.cpp
index eb203c7..0a3f195 100644
--- a/compilation_tools/vtsc/VtsCompilerUtils.cpp
+++ b/compilation_tools/vtsc/VtsCompilerUtils.cpp
@@ -29,7 +29,6 @@
 
 #include <google/protobuf/text_format.h>
 
-#include "specification_parser/InterfaceSpecificationParser.h"
 #include "utils/InterfaceSpecUtil.h"
 #include "utils/StringUtil.h"
 
diff --git a/compilation_tools/vtsc/code_gen/CodeGenBase.cpp b/compilation_tools/vtsc/code_gen/CodeGenBase.cpp
index 09771af..37f4671 100644
--- a/compilation_tools/vtsc/code_gen/CodeGenBase.cpp
+++ b/compilation_tools/vtsc/code_gen/CodeGenBase.cpp
@@ -30,10 +30,8 @@
 
 #include <hidl-util/Formatter.h>
 
-#include "specification_parser/InterfaceSpecificationParser.h"
-#include "utils/InterfaceSpecUtil.h"
-
 #include "test/vts/proto/ComponentSpecificationMessage.pb.h"
+#include "utils/InterfaceSpecUtil.h"
 
 #include "VtsCompilerUtils.h"
 #include "code_gen/driver/HalCodeGen.h"
@@ -82,7 +80,7 @@
   string output_dir = output_cpp_file_path_str.substr(0, found + 1);
 
   ComponentSpecificationMessage message;
-  if (!InterfaceSpecificationParser::parse(input_vts_file_path, &message)) {
+  if (!ParseInterfaceSpec(input_vts_file_path, &message)) {
     cerr << __func__ << " can't parse " << input_vts_file_path << endl;
   }
 
diff --git a/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.cpp b/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.cpp
index 057e3b1..ffac79f 100644
--- a/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.cpp
+++ b/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.cpp
@@ -113,7 +113,8 @@
 void DriverCodeGenBase::GenerateClassHeader(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
-  out << "class " << fuzzer_extended_class_name << " : public FuzzerBase {"
+  GenerateHeaderInterfaceImpl(out, message);
+  out << "class " << fuzzer_extended_class_name << " : public DriverBase {"
       << "\n";
   out << " public:" << "\n";
 
@@ -157,7 +158,7 @@
 void DriverCodeGenBase::GenerateClassImpl(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
-  GenerateCppBodyCallbackFunction(out, message, fuzzer_extended_class_name);
+  GenerateCppBodyInterfaceImpl(out, message, fuzzer_extended_class_name);
   GenerateCppBodyFuzzFunction(out, message, fuzzer_extended_class_name);
   GenerateCppBodyGetAttributeFunction(out, message, fuzzer_extended_class_name);
   GenerateDriverFunctionImpl(out, message, fuzzer_extended_class_name);
@@ -176,11 +177,12 @@
   out << "#include <string.h>" << "\n";
   out << "#include <utils/Log.h>" << "\n";
   out << "\n";
-  out << "#include <fuzz_tester/FuzzerBase.h>" << "\n";
-  out << "#include <fuzz_tester/FuzzerCallbackBase.h>" << "\n";
+  out << "#include <driver_base/DriverBase.h>"
+      << "\n";
+  out << "#include <driver_base/DriverCallbackBase.h>"
+      << "\n";
   out << "\n";
-  if (message.component_class() == HAL_HIDL &&
-      endsWith(message.component_name(), "Callback")) {
+  if (message.component_class() == HAL_HIDL) {
     out << "#include <VtsDriverCommUtil.h>" << "\n";
     out << "\n";
   }
@@ -211,8 +213,8 @@
   if (print_extern_block) {
     out << "extern \"C\" {" << "\n";
   }
-  out << "extern " << "android::vts::FuzzerBase* " << function_name_prefix
-      << "();\n";
+  out << "extern "
+      << "android::vts::DriverBase* " << function_name_prefix << "();\n";
   if (print_extern_block) {
     out << "}" << "\n";
   }
@@ -226,9 +228,10 @@
   if (print_extern_block) {
     out << "extern \"C\" {" << "\n";
   }
-  out << "android::vts::FuzzerBase* " << function_name_prefix << "() {\n";
+  out << "android::vts::DriverBase* " << function_name_prefix << "() {\n";
   out.indent();
-  out << "return (android::vts::FuzzerBase*) " << "new android::vts::";
+  out << "return (android::vts::DriverBase*) "
+      << "new android::vts::";
   out << fuzzer_extended_class_name << "();\n";
   out.unindent();
   out << "}\n\n";
diff --git a/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.h b/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.h
index ba81dbe..a66ff1b 100644
--- a/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.h
+++ b/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.h
@@ -82,10 +82,14 @@
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name);
 
-  // Generates C/C++ code for callback functions.
-  virtual void GenerateCppBodyCallbackFunction(Formatter& /*out*/,
-      const ComponentSpecificationMessage& /*message*/,
-      const string& /*fuzzer_extended_class_name*/) {};
+  // Generates C/C++ code for interface implemetation class.
+  virtual void GenerateCppBodyInterfaceImpl(
+      Formatter& /*out*/, const ComponentSpecificationMessage& /*message*/,
+      const string& /*fuzzer_extended_class_name*/){};
+
+  // Generates header code for interface impl class.
+  virtual void GenerateHeaderInterfaceImpl(
+      Formatter& /*out*/, const ComponentSpecificationMessage& /*message*/){};
 
   // Generates header code for construction function.
   virtual void GenerateClassConstructionFunction(Formatter& /*out*/,
diff --git a/compilation_tools/vtsc/code_gen/driver/HalCodeGen.cpp b/compilation_tools/vtsc/code_gen/driver/HalCodeGen.cpp
index e215cf3..7d43162 100644
--- a/compilation_tools/vtsc/code_gen/driver/HalCodeGen.cpp
+++ b/compilation_tools/vtsc/code_gen/driver/HalCodeGen.cpp
@@ -35,8 +35,7 @@
 
 const char* const HalCodeGen::kInstanceVariableName = "device_";
 
-
-void HalCodeGen::GenerateCppBodyCallbackFunction(
+void HalCodeGen::GenerateCppBodyInterfaceImpl(
     Formatter& out, const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
   bool first_callback = true;
@@ -53,7 +52,8 @@
       first_callback = false;
     }
     out << "\n";
-    out << "class " << name << " : public FuzzerCallbackBase {" << "\n";
+    out << "class " << name << " : public DriverCallbackBase {"
+        << "\n";
     out << " public:" << "\n";
     out.indent();
     out << name << "(const string& callback_socket_name) {" << "\n";
@@ -854,7 +854,7 @@
 void HalCodeGen::GenerateClassConstructionFunction(Formatter& out,
       const ComponentSpecificationMessage& /*message*/,
       const string& fuzzer_extended_class_name) {
-  out << fuzzer_extended_class_name << "() : FuzzerBase(HAL_CONVENTIONAL) {}\n";
+  out << fuzzer_extended_class_name << "() : DriverBase(HAL_CONVENTIONAL) {}\n";
 }
 
 void HalCodeGen::GenerateSubStructFuzzFunctionCall(
diff --git a/compilation_tools/vtsc/code_gen/driver/HalCodeGen.h b/compilation_tools/vtsc/code_gen/driver/HalCodeGen.h
index b2d2186..2ff0f5f 100644
--- a/compilation_tools/vtsc/code_gen/driver/HalCodeGen.h
+++ b/compilation_tools/vtsc/code_gen/driver/HalCodeGen.h
@@ -46,8 +46,8 @@
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
 
-  void GenerateCppBodyCallbackFunction(Formatter& out,
-      const ComponentSpecificationMessage& message,
+  void GenerateCppBodyInterfaceImpl(
+      Formatter& out, const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
 
   void GenerateClassConstructionFunction(Formatter& out,
diff --git a/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.cpp b/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.cpp
index 9241d36..3c7ddce 100644
--- a/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.cpp
+++ b/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.cpp
@@ -36,106 +36,109 @@
 
 const char* const HalHidlCodeGen::kInstanceVariableName = "hw_binder_proxy_";
 
-void HalHidlCodeGen::GenerateCppBodyCallbackFunction(Formatter& out,
-    const ComponentSpecificationMessage& message,
+void HalHidlCodeGen::GenerateCppBodyInterfaceImpl(
+    Formatter& out, const ComponentSpecificationMessage& message,
     const string& /*fuzzer_extended_class_name*/) {
-  if (endsWith(message.component_name(), "Callback")) {
-    out << "\n";
-    FQName component_fq_name = GetFQName(message);
-    for (const auto& api : message.interface().api()) {
-      // Generate return statement.
-      if (CanElideCallback(api)) {
-        out << "::android::hardware::Return<"
-            << GetCppVariableType(api.return_type_hidl(0), &message) << "> ";
+  out << "\n";
+  FQName component_fq_name = GetFQName(message);
+  for (const auto& api : message.interface().api()) {
+    // Generate return statement.
+    if (CanElideCallback(api)) {
+      out << "::android::hardware::Return<"
+          << GetCppVariableType(api.return_type_hidl(0), &message) << "> ";
+    } else {
+      out << "::android::hardware::Return<void> ";
+    }
+    // Generate function call.
+    string full_method_name =
+        "Vts_" + component_fq_name.tokenName() + "::" + api.name();
+    out << full_method_name << "(\n";
+    out.indent();
+    for (int index = 0; index < api.arg_size(); index++) {
+      const auto& arg = api.arg(index);
+      if (!isConstType(arg.type())) {
+        out << GetCppVariableType(arg, &message);
       } else {
-        out << "::android::hardware::Return<void> ";
+        out << GetCppVariableType(arg, &message, true);
       }
-      // Generate function call.
-      string full_method_name = "Vts_" + component_fq_name.tokenName() + "::"
-          + api.name();
-      out << full_method_name << "(\n";
-      out.indent();
-      for (int index = 0; index < api.arg_size(); index++) {
-        const auto& arg = api.arg(index);
-        if (!isConstType(arg.type())) {
-          out << GetCppVariableType(arg, &message);
+      out << " arg" << index << " __attribute__((__unused__))";
+      if (index != (api.arg_size() - 1)) out << ",\n";
+    }
+    if (api.return_type_hidl_size() == 0 || CanElideCallback(api)) {
+      out << ") {\n";
+    } else {  // handle the case of callbacks.
+      out << (api.arg_size() != 0 ? ", " : "");
+      out << "std::function<void(";
+      for (int index = 0; index < api.return_type_hidl_size(); index++) {
+        const auto& return_val = api.return_type_hidl(index);
+        if (!isConstType(return_val.type())) {
+          out << GetCppVariableType(return_val, &message);
         } else {
-          out << GetCppVariableType(arg, &message, true);
+          out << GetCppVariableType(return_val, &message, true);
         }
         out << " arg" << index;
-        if (index != (api.arg_size() - 1))
-          out << ",\n";
-      }
-      if (api.return_type_hidl_size() == 0 || CanElideCallback(api)) {
-        out << ") {" << "\n";
-      } else {  // handle the case of callbacks.
-        out << (api.arg_size() != 0 ? ", " : "");
-        out << "std::function<void(";
-        for (int index = 0; index < api.return_type_hidl_size(); index++) {
-          const auto& return_val = api.return_type_hidl(index);
-          if (!isConstType(return_val.type())) {
-            out << GetCppVariableType(return_val, &message);
-          } else {
-            out << GetCppVariableType(return_val, &message, true);
-          }
-          out << " arg" << index;
-          if (index != (api.return_type_hidl_size() - 1))
-            out << ",";
+        if (index != (api.return_type_hidl_size() - 1)) {
+          out << ",";
         }
-        out << ")>) {" << "\n";
       }
-      out << "cout << \"" << api.name() << " called\" << endl;" << "\n";
-      out << "AndroidSystemCallbackRequestMessage callback_message;" << "\n";
-      out << "callback_message.set_id(GetCallbackID(\"" << api.name() << "\"));" << "\n";
-      out << "callback_message.set_name(\"" << full_method_name << "\");" << "\n";
-      for (int index = 0; index < api.arg_size(); index++) {
-        out << "VariableSpecificationMessage* var_msg" << index << " = "
-            << "callback_message.add_arg();\n";
-        GenerateSetResultCodeForTypedVariable(out, api.arg(index),
-                                              "var_msg" + std::to_string(index),
-                                              "arg" + std::to_string(index));
-      }
-      out << "RpcCallToAgent(callback_message, callback_socket_name_);" << "\n";
+      out << ")>) {\n";
+    }
+    out << "cout << \"" << api.name() << " called\" << endl;\n";
+    out << "AndroidSystemCallbackRequestMessage callback_message;\n";
+    out << "callback_message.set_id(GetCallbackID(\"" << api.name()
+        << "\"));\n";
+    out << "callback_message.set_name(\"" << full_method_name << "\");\n";
+    for (int index = 0; index < api.arg_size(); index++) {
+      out << "VariableSpecificationMessage* var_msg" << index << " = "
+          << "callback_message.add_arg();\n";
+      GenerateSetResultCodeForTypedVariable(out, api.arg(index),
+                                            "var_msg" + std::to_string(index),
+                                            "arg" + std::to_string(index));
+    }
+    out << "RpcCallToAgent(callback_message, callback_socket_name_);\n";
 
-      // TODO(zhuoyao): return the received results from host.
-      if (CanElideCallback(api)) {
-        const auto& return_val = api.return_type_hidl(0);
-        const auto& type = return_val.type();
-        if (type == TYPE_SCALAR) {
-          out << "return static_cast<"
-              << GetCppVariableType(return_val.scalar_type()) << ">(0);\n";
-        } else if (type == TYPE_ENUM || type == TYPE_MASK) {
-          if (return_val.has_predefined_type()) {
-            std::string predefined_type_name = return_val.predefined_type();
-            ReplaceSubString(predefined_type_name, "::", "__");
-            out << "return Random" << predefined_type_name << "();\n";
+    // TODO(zhuoyao): return the received results from host.
+    if (CanElideCallback(api)) {
+      const auto& return_val = api.return_type_hidl(0);
+      const auto& type = return_val.type();
+      if (type == TYPE_SCALAR) {
+        out << "return static_cast<"
+            << GetCppVariableType(return_val.scalar_type()) << ">(0);\n";
+      } else if (type == TYPE_ENUM || type == TYPE_MASK) {
+        if (return_val.has_predefined_type()) {
+          std::string predefined_type_name = return_val.predefined_type();
+          ReplaceSubString(predefined_type_name, "::", "__");
+          if (type == TYPE_ENUM) {
+            out << "return static_cast< " << GetCppVariableType(return_val)
+                << ">(Random" << predefined_type_name << "());\n";
           } else {
-            cerr << __func__ << " ENUM doesn't have predefined type" << endl;
-            exit(-1);
+            out << "return Random" << predefined_type_name << "();\n";
           }
         } else {
-          out << "return nullptr;\n";
+          cerr << __func__ << " ENUM doesn't have predefined type" << endl;
+          exit(-1);
         }
       } else {
-        out << "return ::android::hardware::Void();\n";
+        out << "return nullptr;\n";
       }
-      out.unindent();
-      out << "}" << "\n";
-      out << "\n";
+    } else {
+      out << "return ::android::hardware::Void();\n";
     }
-
-    string component_name_token = "Vts_" + component_fq_name.tokenName();
-    out << "sp<" << component_fq_name.cppName() << "> VtsFuzzerCreate"
-        << component_name_token << "(const string& callback_socket_name)";
-    out << " {" << "\n";
-    out.indent();
-    out << "static sp<" << component_fq_name.cppName() << "> result;\n";
-    out << "result = new " << component_name_token << "(callback_socket_name);"
-        << "\n";
-    out << "return result;\n";
     out.unindent();
-    out << "}" << "\n" << "\n";
+    out << "}"
+        << "\n";
+    out << "\n";
   }
+
+  string component_name_token = "Vts_" + component_fq_name.tokenName();
+  out << "sp<" << component_fq_name.cppName() << "> VtsFuzzerCreate"
+      << component_name_token << "(const string& callback_socket_name) {\n";
+  out.indent();
+  out << "static sp<" << component_fq_name.cppName() << "> result;\n";
+  out << "result = new " << component_name_token << "(callback_socket_name);\n";
+  out << "return result;\n";
+  out.unindent();
+  out << "}\n\n";
 }
 
 void HalHidlCodeGen::GenerateScalarTypeInC(Formatter& out, const string& type) {
@@ -170,10 +173,10 @@
     Formatter& out, const ComponentSpecificationMessage& /*message*/,
     const string& fuzzer_extended_class_name) {
     out << "bool " << fuzzer_extended_class_name << "::Fuzz(" << "\n";
-    out << "    FunctionSpecificationMessage* /*func_msg*/,"
-        << "\n";
-    out << "    void** /*result*/, const string& /*callback_socket_name*/) {\n";
     out.indent();
+    out << "FunctionSpecificationMessage* /*func_msg*/,"
+        << "\n";
+    out << "void** /*result*/, const string& /*callback_socket_name*/) {\n";
     out << "return true;\n";
     out.unindent();
     out << "}\n";
@@ -182,13 +185,15 @@
 void HalHidlCodeGen::GenerateDriverFunctionImpl(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
-  if (message.component_name() != "types"
-      && !endsWith(message.component_name(), "Callback")) {
+  if (message.component_name() != "types") {
     out << "bool " << fuzzer_extended_class_name << "::CallFunction("
-        << "const FunctionSpecificationMessage& func_msg, "
-        << "const string& callback_socket_name, "
-        << "FunctionSpecificationMessage* result_msg) {\n";
+        << "\n";
     out.indent();
+    out << "const FunctionSpecificationMessage& func_msg,"
+        << "\n";
+    out << "const string& callback_socket_name __attribute__((__unused__)),"
+        << "\n";
+    out << "FunctionSpecificationMessage* result_msg) {\n";
 
     out << "const char* func_name = func_msg.name().c_str();" << "\n";
     out << "cout << \"Function: \" << __func__ << \" \" << func_name << endl;"
@@ -196,6 +201,12 @@
     out << "cout << \"Callback socket name: \" << callback_socket_name << endl;"
         << "\n";
 
+    out << "if (hw_binder_proxy_ == nullptr) {\n";
+    out.indent();
+    out << "cerr << \"" << kInstanceVariableName << " is null. \"<< endl;\n";
+    out << "return false;\n";
+    out.unindent();
+    out << "}\n";
     for (auto const& api : message.interface().api()) {
       GenerateDriverImplForMethod(out, message, api);
     }
@@ -356,14 +367,13 @@
 void HalHidlCodeGen::GenerateCppBodyGetAttributeFunction(
     Formatter& out, const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
-  if (message.component_name() != "types" &&
-      !endsWith(message.component_name(), "Callback")) {
+  if (message.component_name() != "types") {
     out << "bool " << fuzzer_extended_class_name << "::GetAttribute(" << "\n";
-    out << "    FunctionSpecificationMessage* /*func_msg*/,"
-        << "\n";
-    out << "    void** /*result*/) {"
-        << "\n";
     out.indent();
+    out << "FunctionSpecificationMessage* /*func_msg*/,"
+        << "\n";
+    out << "void** /*result*/) {"
+        << "\n";
     // TOOD: impl
     out << "cerr << \"attribute not found\" << endl;\n"
         << "return false;\n";
@@ -375,7 +385,7 @@
 void HalHidlCodeGen::GenerateClassConstructionFunction(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
-  out << fuzzer_extended_class_name << "() : FuzzerBase(";
+  out << fuzzer_extended_class_name << "() : DriverBase(";
   if (message.component_name() != "types") {
     out << "HAL_HIDL), " << kInstanceVariableName << "()";
   } else {
@@ -386,7 +396,7 @@
 
   FQName fqname = GetFQName(message);
   out << "explicit " << fuzzer_extended_class_name << "(" << fqname.cppName()
-      << "* hw_binder_proxy) : FuzzerBase("
+      << "* hw_binder_proxy) : DriverBase("
       << "HAL_HIDL)";
   if (message.component_name() != "types") {
     out << ", " << kInstanceVariableName << "(hw_binder_proxy)";
@@ -397,8 +407,7 @@
 void HalHidlCodeGen::GenerateHeaderGlobalFunctionDeclarations(Formatter& out,
     const ComponentSpecificationMessage& message,
     const bool print_extern_block) {
-  if (message.component_name() != "types"
-      && !endsWith(message.component_name(), "Callback")) {
+  if (message.component_name() != "types") {
     if (print_extern_block) {
       out << "extern \"C\" {" << "\n";
     }
@@ -407,7 +416,8 @@
 
     string function_name_prefix = GetFunctionNamePrefix(message);
     FQName fqname = GetFQName(message);
-    out << "extern " << "android::vts::FuzzerBase* " << function_name_prefix
+    out << "extern "
+        << "android::vts::DriverBase* " << function_name_prefix
         << "with_arg(uint64_t hw_binder_proxy);\n";
     if (print_extern_block) {
       out << "}" << "\n";
@@ -418,8 +428,7 @@
 void HalHidlCodeGen::GenerateCppBodyGlobalFunctions(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name, const bool print_extern_block) {
-  if (message.component_name() != "types"
-      && !endsWith(message.component_name(), "Callback")) {
+  if (message.component_name() != "types") {
     if (print_extern_block) {
       out << "extern \"C\" {" << "\n";
     }
@@ -428,15 +437,29 @@
 
     string function_name_prefix = GetFunctionNamePrefix(message);
     FQName fqname = GetFQName(message);
-    out << "android::vts::FuzzerBase* " << function_name_prefix << "with_arg("
+    out << "android::vts::DriverBase* " << function_name_prefix << "with_arg("
         << "uint64_t hw_binder_proxy) {\n";
     out.indent();
-    out << fqname.cppName() << "* arg = reinterpret_cast<" << fqname.cppName()
+    out << fqname.cppName() << "* arg = nullptr;\n";
+    out << "if (hw_binder_proxy) {\n";
+    out.indent();
+    out << "arg = reinterpret_cast<" << fqname.cppName()
         << "*>(hw_binder_proxy);\n";
-    out << "android::vts::FuzzerBase* result =" << "\n"
+    out.unindent();
+    out << "} else {\n";
+    out.indent();
+    out << "cout << \" Creating DriverBase with null proxy.\" << endl;\n";
+    out.unindent();
+    out << "}\n";
+    out << "android::vts::DriverBase* result ="
+        << "\n"
         << "    new android::vts::" << fuzzer_extended_class_name << "(\n"
         << "        arg);\n";
+    out << "if (arg != nullptr) {\n";
+    out.indent();
     out << "arg->decStrong(arg);" << "\n";
+    out.unindent();
+    out << "}\n";
     out << "return result;" << "\n";
     out.unindent();
     out << "}\n\n";
@@ -449,113 +472,98 @@
 void HalHidlCodeGen::GenerateClassHeader(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
-  if (message.component_name() != "types"
-      && !endsWith(message.component_name(), "Callback")) {
+  if (message.component_name() != "types") {
     for (const auto attribute : message.interface().attribute()) {
       GenerateAllFunctionDeclForAttribute(out, attribute);
     }
     DriverCodeGenBase::GenerateClassHeader(out, message,
                                            fuzzer_extended_class_name);
-  } else if (message.component_name() == "types") {
+  } else {
     for (const auto attribute : message.attribute()) {
       GenerateAllFunctionDeclForAttribute(out, attribute);
     };
-  } else if (endsWith(message.component_name(), "Callback")) {
-    for (const auto attribute : message.interface().attribute()) {
-      GenerateAllFunctionDeclForAttribute(out, attribute);
-    }
+  }
+}
 
-    out << "\n";
-    FQName component_fq_name = GetFQName(message);
-    string component_name_token = "Vts_" + component_fq_name.tokenName();;
-    out << "class " << component_name_token << " : public "
-        << component_fq_name.cppName() << ", public FuzzerCallbackBase {" << "\n";
-    out << " public:" << "\n";
+void HalHidlCodeGen::GenerateHeaderInterfaceImpl(
+    Formatter& out, const ComponentSpecificationMessage& message) {
+  out << "\n";
+  FQName component_fq_name = GetFQName(message);
+  string component_name_token = "Vts_" + component_fq_name.tokenName();
+  out << "class " << component_name_token << " : public "
+      << component_fq_name.cppName() << ", public DriverCallbackBase {\n";
+  out << " public:\n";
+  out.indent();
+  out << component_name_token << "(const string& callback_socket_name)\n"
+      << "    : callback_socket_name_(callback_socket_name) {};\n\n";
+  out << "virtual ~" << component_name_token << "()"
+      << " = default;\n\n";
+  for (const auto& api : message.interface().api()) {
+    // Generate return statement.
+    if (CanElideCallback(api)) {
+      out << "::android::hardware::Return<"
+          << GetCppVariableType(api.return_type_hidl(0), &message) << "> ";
+    } else {
+      out << "::android::hardware::Return<void> ";
+    }
+    // Generate function call.
+    out << api.name() << "(\n";
     out.indent();
-    out << component_name_token << "(const string& callback_socket_name)\n"
-        << "    : callback_socket_name_(callback_socket_name) {};" << "\n";
-    out << "\n";
-    out << "virtual ~" << component_name_token << "()"
-        << " = default;" << "\n";
-    out << "\n";
-    for (const auto& api : message.interface().api()) {
-      // Generate return statement.
-      if (CanElideCallback(api)) {
-        out << "::android::hardware::Return<"
-            << GetCppVariableType(api.return_type_hidl(0), &message) << "> ";
+    for (int index = 0; index < api.arg_size(); index++) {
+      const auto& arg = api.arg(index);
+      if (!isConstType(arg.type())) {
+        out << GetCppVariableType(arg, &message);
       } else {
-        out << "::android::hardware::Return<void> ";
+        out << GetCppVariableType(arg, &message, true);
       }
-      // Generate function call.
-      out << api.name() << "(\n";
-      out.indent();
-      for (int index = 0; index < api.arg_size(); index++) {
-        const auto& arg = api.arg(index);
-        if (!isConstType(arg.type())) {
-          out << GetCppVariableType(arg, &message);
+      out << " arg" << index;
+      if (index != (api.arg_size() - 1)) out << ",\n";
+    }
+    if (api.return_type_hidl_size() == 0 || CanElideCallback(api)) {
+      out << ") override;\n\n";
+    } else {  // handle the case of callbacks.
+      out << (api.arg_size() != 0 ? ", " : "");
+      out << "std::function<void(";
+      for (int index = 0; index < api.return_type_hidl_size(); index++) {
+        const auto& return_val = api.return_type_hidl(index);
+        if (!isConstType(return_val.type())) {
+          out << GetCppVariableType(return_val, &message);
         } else {
-          out << GetCppVariableType(arg, &message, true);
+          out << GetCppVariableType(return_val, &message, true);
         }
         out << " arg" << index;
-        if (index != (api.arg_size() - 1))
-          out << ",\n";
+        if (index != (api.return_type_hidl_size() - 1)) out << ",";
       }
-      if (api.return_type_hidl_size() == 0 || CanElideCallback(api)) {
-        out << ") override;" << "\n\n";
-      } else {  // handle the case of callbacks.
-        out << (api.arg_size() != 0 ? ", " : "");
-        out << "std::function<void(";
-        for (int index = 0; index < api.return_type_hidl_size(); index++) {
-          const auto& return_val = api.return_type_hidl(index);
-          if (!isConstType(return_val.type())) {
-            out << GetCppVariableType(return_val, &message);
-          } else {
-            out << GetCppVariableType(return_val, &message, true);
-          }
-          out << " arg" << index;
-          if (index != (api.return_type_hidl_size() - 1))
-            out << ",";
-        }
-        out << ")>) override;" << "\n\n";
-      }
-      out.unindent();
+      out << ")>) override;\n\n";
     }
-    out << "\n";
     out.unindent();
-    out << " private:" << "\n";
-    out.indent();
-    out << "string callback_socket_name_;\n";
-    out.unindent();
-    out << "};" << "\n";
-    out << "\n";
-
-    out << "sp<" << component_fq_name.cppName() << "> VtsFuzzerCreate"
-        << component_name_token << "(const string& callback_socket_name);"
-        << "\n";
-    out << "\n";
   }
+  out << "\n";
+  out.unindent();
+  out << " private:\n";
+  out.indent();
+  out << "string callback_socket_name_;\n";
+  out.unindent();
+  out << "};\n\n";
+
+  out << "sp<" << component_fq_name.cppName() << "> VtsFuzzerCreate"
+      << component_name_token << "(const string& callback_socket_name);\n\n";
 }
 
 void HalHidlCodeGen::GenerateClassImpl(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
-  if (message.component_name() != "types"
-      && !endsWith(message.component_name(), "Callback")) {
+  if (message.component_name() != "types") {
     for (auto attribute : message.interface().attribute()) {
       GenerateAllFunctionImplForAttribute(out, attribute);
     }
     GenerateGetServiceImpl(out, message, fuzzer_extended_class_name);
     DriverCodeGenBase::GenerateClassImpl(out, message,
                                          fuzzer_extended_class_name);
-  } else if (message.component_name() == "types") {
+  } else {
     for (auto attribute : message.attribute()) {
       GenerateAllFunctionImplForAttribute(out, attribute);
     }
-  } else if (endsWith(message.component_name(), "Callback")) {
-    for (auto attribute : message.interface().attribute()) {
-      GenerateAllFunctionImplForAttribute(out, attribute);
-    }
-    GenerateCppBodyCallbackFunction(out, message, fuzzer_extended_class_name);
   }
 }
 
@@ -628,8 +636,7 @@
 void HalHidlCodeGen::GenerateAdditionalFuctionDeclarations(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& /*fuzzer_extended_class_name*/) {
-  if (message.component_name() != "types"
-      && !endsWith(message.component_name(), "Callback")) {
+  if (message.component_name() != "types") {
     out << "bool GetService(bool get_stub, const char* service_name);"
         << "\n\n";
   }
@@ -659,7 +666,8 @@
       return;
     }
     string attribute_name = ClearStringWithNameSpaceAccess(attribute.name());
-    out << attribute.name() << " " << "Random" << attribute_name << "();\n";
+    out << attribute.enum_value().scalar_type() << " "
+        << "Random" << attribute_name << "();\n";
   }
 }
 
@@ -672,8 +680,8 @@
       return;
     }
     string attribute_name = ClearStringWithNameSpaceAccess(attribute.name());
-    out << attribute.name() << " " << "Random" << attribute_name << "() {"
-        << "\n";
+    out << attribute.enum_value().scalar_type() << " Random" << attribute_name
+        << "() {\n";
     out.indent();
     out << attribute.enum_value().scalar_type() << " choice = " << "("
         << attribute.enum_value().scalar_type() << ") " << "rand() / "
@@ -706,11 +714,13 @@
             << attribute.enum_value().scalar_type() << "\n";
         exit(-1);
       }
-      out << ") return " << attribute.name() << "::"
-          << attribute.enum_value().enumerator(index) << ";" << "\n";
+      out << ") return static_cast<" << attribute.enum_value().scalar_type()
+          << ">(" << attribute.name()
+          << "::" << attribute.enum_value().enumerator(index) << ");\n";
     }
-    out << "return " << attribute.name() << "::"
-        << attribute.enum_value().enumerator(0) << ";" << "\n";
+    out << "return static_cast<" << attribute.enum_value().scalar_type() << ">("
+        << attribute.name() << "::" << attribute.enum_value().enumerator(0)
+        << ");\n";
     out.unindent();
     out << "}" << "\n";
   }
@@ -769,9 +779,10 @@
       }
       string func_name = "MessageTo"
           + ClearStringWithNameSpaceAccess(attribute.name());
-      out << "void " << func_name
-          << "(const VariableSpecificationMessage& var_msg, "
-          << attribute.name() << "* arg) {" << "\n";
+      out << "void " << func_name << "(const VariableSpecificationMessage& "
+                                     "var_msg __attribute__((__unused__)), "
+          << attribute.name() << "* arg __attribute__((__unused__))) {"
+          << "\n";
       out.indent();
       int struct_index = 0;
       for (const auto& struct_value : attribute.struct_value()) {
@@ -1192,13 +1203,15 @@
 void HalHidlCodeGen::GenerateVerificationFunctionImpl(Formatter& out,
     const ComponentSpecificationMessage& message,
     const string& fuzzer_extended_class_name) {
-  if (message.component_name() != "types"
-      && !endsWith(message.component_name(), "Callback")) {
+  if (message.component_name() != "types") {
     // Generate the main profiler function.
-    out << "\nbool " << fuzzer_extended_class_name
-        << "::VerifyResults(const FunctionSpecificationMessage& expected_result, "
-        << "const FunctionSpecificationMessage& actual_result) {\n";
+    out << "\nbool " << fuzzer_extended_class_name;
     out.indent();
+    out << "::VerifyResults(const FunctionSpecificationMessage& "
+           "expected_result __attribute__((__unused__)),"
+        << "\n";
+    out << "const FunctionSpecificationMessage& actual_result "
+           "__attribute__((__unused__))) {\n";
     for (const FunctionSpecificationMessage api : message.interface().api()) {
       out << "if (!strcmp(actual_result.name().c_str(), \"" << api.name()
           << "\")) {\n";
@@ -1425,8 +1438,10 @@
   }
   std::string func_name = "bool Verify"
       + ClearStringWithNameSpaceAccess(attribute.name());
-  out << func_name << "(const VariableSpecificationMessage& expected_result, "
-      << "const VariableSpecificationMessage& actual_result){\n";
+  out << func_name << "(const VariableSpecificationMessage& expected_result "
+                      "__attribute__((__unused__)), "
+      << "const VariableSpecificationMessage& actual_result "
+         "__attribute__((__unused__))){\n";
   out.indent();
   GenerateVerificationCodeForTypedVariable(out, attribute, "expected_result",
                                            "actual_result");
@@ -1581,11 +1596,19 @@
              << "but predefined_type is unset." << endl;
         exit(-1);
       }
+      out << result_msg << "->set_predefined_type(\"" << val.predefined_type()
+          << "\");\n";
+      out << "if (" << result_value << " != nullptr) {\n";
+      out.indent();
       out << result_value << "->incStrong(" << result_value << ".get());\n";
       out << result_msg << "->set_hidl_interface_pointer("
           << "reinterpret_cast<uintptr_t>(" << result_value << ".get()));\n";
-      out << result_msg << "->set_predefined_type(\"" << val.predefined_type()
-          << "\");\n";
+      out.unindent();
+      out << "} else {\n";
+      out.indent();
+      out << result_msg << "->set_hidl_interface_pointer(0);\n";
+      out.unindent();
+      out << "}\n";
       break;
     }
     case TYPE_HIDL_MEMORY:
@@ -1657,7 +1680,7 @@
   string func_name = "void SetResult"
       + ClearStringWithNameSpaceAccess(attribute.name());
   out << func_name << "(VariableSpecificationMessage* result_msg, "
-      << attribute.name() << " result_value){\n";
+      << attribute.name() << " result_value __attribute__((__unused__))){\n";
   out.indent();
   GenerateSetResultCodeForTypedVariable(out, attribute, "result_msg",
                                         "result_value");
@@ -1704,7 +1727,8 @@
 }
 
 bool HalHidlCodeGen::isConstType(const VariableType& type) {
-  if (type == TYPE_ARRAY || type == TYPE_VECTOR || type == TYPE_REF) {
+  if (type == TYPE_ARRAY || type == TYPE_VECTOR || type == TYPE_REF ||
+      type == TYPE_HIDL_INTERFACE) {
     return true;
   }
   if (isElidableType(type)) {
diff --git a/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.h b/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.h
index 9e719d8..a5ba370 100644
--- a/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.h
+++ b/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.h
@@ -61,8 +61,11 @@
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
 
-  void GenerateCppBodyCallbackFunction(Formatter& out,
-      const ComponentSpecificationMessage& message,
+  void GenerateHeaderInterfaceImpl(
+      Formatter& out, const ComponentSpecificationMessage& message) override;
+
+  void GenerateCppBodyInterfaceImpl(
+      Formatter& out, const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
 
   void GenerateClassConstructionFunction(Formatter& out,
@@ -96,11 +99,16 @@
   void GeneratePrivateMemberDeclarations(Formatter& out,
       const ComponentSpecificationMessage& message) override;
 
+ private:
   void GenerateCppBodyFuzzFunction(Formatter& out,
       const StructSpecificationMessage& message,
       const string& fuzzer_extended_class_name,
       const string& original_data_structure_name, const string& parent_path);
 
+  // Generates the code to declar the impl class for an interface.
+  void GenerateClassDecalrationForInterface(
+      Formatter& out, const ComponentSpecificationMessage& message);
+
   // Generates a scalar type in C/C++.
   void GenerateScalarTypeInC(Formatter& out, const string& type);
 
diff --git a/compilation_tools/vtsc/code_gen/driver/HalSubmoduleCodeGen.cpp b/compilation_tools/vtsc/code_gen/driver/HalSubmoduleCodeGen.cpp
index 8019b8a..eaf46ec 100644
--- a/compilation_tools/vtsc/code_gen/driver/HalSubmoduleCodeGen.cpp
+++ b/compilation_tools/vtsc/code_gen/driver/HalSubmoduleCodeGen.cpp
@@ -37,7 +37,7 @@
     const ComponentSpecificationMessage& /*message*/,
     const string& fuzzer_extended_class_name) {
   out << fuzzer_extended_class_name
-      << "() : FuzzerBase(HAL_CONVENTIONAL_SUBMODULE) {}\n";
+      << "() : DriverBase(HAL_CONVENTIONAL_SUBMODULE) {}\n";
 }
 
 void HalSubmoduleCodeGen::GenerateAdditionalFuctionDeclarations(Formatter& out,
diff --git a/compilation_tools/vtsc/code_gen/driver/LegacyHalCodeGen.cpp b/compilation_tools/vtsc/code_gen/driver/LegacyHalCodeGen.cpp
index 2df1f82..ae3ecf6 100644
--- a/compilation_tools/vtsc/code_gen/driver/LegacyHalCodeGen.cpp
+++ b/compilation_tools/vtsc/code_gen/driver/LegacyHalCodeGen.cpp
@@ -128,7 +128,7 @@
 void LegacyHalCodeGen::GenerateClassConstructionFunction(Formatter& out,
     const ComponentSpecificationMessage& /*message*/,
     const string& fuzzer_extended_class_name) {
-  out << fuzzer_extended_class_name << "() : FuzzerBase(HAL_LEGACY) {}\n";
+  out << fuzzer_extended_class_name << "() : DriverBase(HAL_LEGACY) {}\n";
 }
 
 }  // namespace vts
diff --git a/compilation_tools/vtsc/code_gen/driver/LegacyHalCodeGen.h b/compilation_tools/vtsc/code_gen/driver/LegacyHalCodeGen.h
index a68179f..ec570b5 100644
--- a/compilation_tools/vtsc/code_gen/driver/LegacyHalCodeGen.h
+++ b/compilation_tools/vtsc/code_gen/driver/LegacyHalCodeGen.h
@@ -45,10 +45,6 @@
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
 
-  void GenerateCppBodyCallbackFunction(Formatter& /*out*/,
-      const ComponentSpecificationMessage& /*message*/,
-      const string& /*fuzzer_extended_class_name*/) override {};
-
   void GenerateClassConstructionFunction(Formatter& out,
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
diff --git a/compilation_tools/vtsc/code_gen/driver/LibSharedCodeGen.cpp b/compilation_tools/vtsc/code_gen/driver/LibSharedCodeGen.cpp
index fe20906..2d20e5f 100644
--- a/compilation_tools/vtsc/code_gen/driver/LibSharedCodeGen.cpp
+++ b/compilation_tools/vtsc/code_gen/driver/LibSharedCodeGen.cpp
@@ -169,7 +169,7 @@
 void LibSharedCodeGen::GenerateClassConstructionFunction(Formatter& out,
     const ComponentSpecificationMessage& /*message*/,
     const string& fuzzer_extended_class_name) {
-  out << fuzzer_extended_class_name << "() : FuzzerBase(LIB_SHARED) {}\n";
+  out << fuzzer_extended_class_name << "() : DriverBase(LIB_SHARED) {}\n";
 }
 
 }  // namespace vts
diff --git a/compilation_tools/vtsc/code_gen/driver/LibSharedCodeGen.h b/compilation_tools/vtsc/code_gen/driver/LibSharedCodeGen.h
index a28648c..3ba52cf 100644
--- a/compilation_tools/vtsc/code_gen/driver/LibSharedCodeGen.h
+++ b/compilation_tools/vtsc/code_gen/driver/LibSharedCodeGen.h
@@ -45,10 +45,6 @@
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
 
-  void GenerateCppBodyCallbackFunction(Formatter& /*out*/,
-      const ComponentSpecificationMessage& /*message*/,
-      const string& /*fuzzer_extended_class_name*/) override {};
-
   void GenerateClassConstructionFunction(Formatter& out,
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
diff --git a/compilation_tools/vtsc/code_gen/profiler/HalHidlProfilerCodeGen.cpp b/compilation_tools/vtsc/code_gen/profiler/HalHidlProfilerCodeGen.cpp
index 1bbb4af..8904a30 100644
--- a/compilation_tools/vtsc/code_gen/profiler/HalHidlProfilerCodeGen.cpp
+++ b/compilation_tools/vtsc/code_gen/profiler/HalHidlProfilerCodeGen.cpp
@@ -15,34 +15,34 @@
  */
 
 #include "HalHidlProfilerCodeGen.h"
+#include "VtsCompilerUtils.h"
 #include "utils/InterfaceSpecUtil.h"
 #include "utils/StringUtil.h"
-#include "VtsCompilerUtils.h"
 
 namespace android {
 namespace vts {
 
-void HalHidlProfilerCodeGen::GenerateProfilerForScalarVariable(Formatter& out,
-  const VariableSpecificationMessage& val, const std::string& arg_name,
-  const std::string& arg_value) {
+void HalHidlProfilerCodeGen::GenerateProfilerForScalarVariable(
+    Formatter& out, const VariableSpecificationMessage& val,
+    const std::string& arg_name, const std::string& arg_value) {
   out << arg_name << "->set_type(TYPE_SCALAR);\n";
   out << arg_name << "->mutable_scalar_value()->set_" << val.scalar_type()
       << "(" << arg_value << ");\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateProfilerForStringVariable(Formatter& out,
-  const VariableSpecificationMessage&, const std::string& arg_name,
-  const std::string& arg_value) {
+void HalHidlProfilerCodeGen::GenerateProfilerForStringVariable(
+    Formatter& out, const VariableSpecificationMessage&,
+    const std::string& arg_name, const std::string& arg_value) {
   out << arg_name << "->set_type(TYPE_STRING);\n";
-  out << arg_name << "->mutable_string_value()->set_message" << "(" << arg_value
-      << ".c_str());\n";
-  out << arg_name << "->mutable_string_value()->set_length" << "(" << arg_value
-      << ".size());\n";
+  out << arg_name << "->mutable_string_value()->set_message"
+      << "(" << arg_value << ".c_str());\n";
+  out << arg_name << "->mutable_string_value()->set_length"
+      << "(" << arg_value << ".size());\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateProfilerForEnumVariable(Formatter& out,
-  const VariableSpecificationMessage& val, const std::string& arg_name,
-  const std::string& arg_value) {
+void HalHidlProfilerCodeGen::GenerateProfilerForEnumVariable(
+    Formatter& out, const VariableSpecificationMessage& val,
+    const std::string& arg_name, const std::string& arg_value) {
   out << arg_name << "->set_type(TYPE_ENUM);\n";
 
   // For predefined type, call the corresponding profile method.
@@ -59,15 +59,16 @@
   }
 }
 
-void HalHidlProfilerCodeGen::GenerateProfilerForVectorVariable(Formatter& out,
-  const VariableSpecificationMessage& val, const std::string& arg_name,
-  const std::string& arg_value) {
+void HalHidlProfilerCodeGen::GenerateProfilerForVectorVariable(
+    Formatter& out, const VariableSpecificationMessage& val,
+    const std::string& arg_name, const std::string& arg_value) {
   out << arg_name << "->set_type(TYPE_VECTOR);\n";
   out << arg_name << "->set_vector_size(" << arg_value << ".size());\n";
   out << "for (int i = 0; i < (int)" << arg_value << ".size(); i++) {\n";
   out.indent();
   std::string vector_element_name = arg_name + "_vector_i";
-  out << "auto *" << vector_element_name << " = " << arg_name
+  out << "auto *" << vector_element_name
+      << " __attribute__((__unused__)) = " << arg_name
       << "->add_vector_value();\n";
   GenerateProfilerForTypedVariable(out, val.vector_value(0),
                                    vector_element_name, arg_value + "[i]");
@@ -75,15 +76,16 @@
   out << "}\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateProfilerForArrayVariable(Formatter& out,
-  const VariableSpecificationMessage& val, const std::string& arg_name,
-  const std::string& arg_value) {
+void HalHidlProfilerCodeGen::GenerateProfilerForArrayVariable(
+    Formatter& out, const VariableSpecificationMessage& val,
+    const std::string& arg_name, const std::string& arg_value) {
   out << arg_name << "->set_type(TYPE_ARRAY);\n";
   out << arg_name << "->set_vector_size(" << val.vector_size() << ");\n";
   out << "for (int i = 0; i < " << val.vector_size() << "; i++) {\n";
   out.indent();
   std::string array_element_name = arg_name + "_array_i";
-  out << "auto *" << array_element_name << " = " << arg_name
+  out << "auto *" << array_element_name
+      << " __attribute__((__unused__)) = " << arg_name
       << "->add_vector_value();\n";
   GenerateProfilerForTypedVariable(out, val.vector_value(0), array_element_name,
                                    arg_value + "[i]");
@@ -91,9 +93,9 @@
   out << "}\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateProfilerForStructVariable(Formatter& out,
-  const VariableSpecificationMessage& val, const std::string& arg_name,
-  const std::string& arg_value) {
+void HalHidlProfilerCodeGen::GenerateProfilerForStructVariable(
+    Formatter& out, const VariableSpecificationMessage& val,
+    const std::string& arg_name, const std::string& arg_value) {
   out << arg_name << "->set_type(TYPE_STRUCT);\n";
   // For predefined type, call the corresponding profile method.
   if (val.struct_value().size() == 0 && val.has_predefined_type()) {
@@ -104,7 +106,8 @@
   } else {
     for (const auto struct_field : val.struct_value()) {
       std::string struct_field_name = arg_name + "_" + struct_field.name();
-      out << "auto *" << struct_field_name << " = " << arg_name
+      out << "auto *" << struct_field_name
+          << " __attribute__((__unused__)) = " << arg_name
           << "->add_struct_value();\n";
       GenerateProfilerForTypedVariable(out, struct_field, struct_field_name,
                                        arg_value + "." + struct_field.name());
@@ -112,9 +115,9 @@
   }
 }
 
-void HalHidlProfilerCodeGen::GenerateProfilerForUnionVariable(Formatter& out,
-  const VariableSpecificationMessage& val, const std::string& arg_name,
-  const std::string& arg_value) {
+void HalHidlProfilerCodeGen::GenerateProfilerForUnionVariable(
+    Formatter& out, const VariableSpecificationMessage& val,
+    const std::string& arg_name, const std::string& arg_value) {
   out << arg_name << "->set_type(TYPE_UNION);\n";
   // For predefined type, call the corresponding profile method.
   if (val.union_value().size() == 0 && val.has_predefined_type()) {
@@ -253,9 +256,9 @@
   // TODO(zhuoyao): dump the memory contents as well.
 }
 
-void HalHidlProfilerCodeGen::GenerateProfilerForPointerVariable(Formatter& out,
-    const VariableSpecificationMessage&, const std::string& arg_name,
-    const std::string&) {
+void HalHidlProfilerCodeGen::GenerateProfilerForPointerVariable(
+    Formatter& out, const VariableSpecificationMessage&,
+    const std::string& arg_name, const std::string&) {
   out << arg_name << "->set_type(TYPE_POINTER);\n";
   // TODO(zhuoyao): figure the right way to profile pointer type.
 }
@@ -307,8 +310,8 @@
   out << "}\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateProfilerForMethod(Formatter& out,
-  const FunctionSpecificationMessage& method) {
+void HalHidlProfilerCodeGen::GenerateProfilerForMethod(
+    Formatter& out, const FunctionSpecificationMessage& method) {
   out << "FunctionSpecificationMessage msg;\n";
   out << "msg.set_name(\"" << method.name() << "\");\n";
   out << "if (!args) {\n";
@@ -326,12 +329,11 @@
   out << "{\n";
   out.indent();
   ComponentSpecificationMessage message;
-  out << "if ((*args).size() != " <<  method.arg().size() << ") {\n";
+  out << "if ((*args).size() != " << method.arg().size() << ") {\n";
   out.indent();
   out << "LOG(ERROR) << \"Number of arguments does not match. expect: "
       << method.arg().size()
-      << ", actual: \" << (*args).size() << \", method name: "
-      << method.name()
+      << ", actual: \" << (*args).size() << \", method name: " << method.name()
       << ", event type: \" << event;\n";
   out << "break;\n";
   out.unindent();
@@ -340,10 +342,11 @@
     const VariableSpecificationMessage arg = method.arg(i);
     std::string arg_name = "arg_" + std::to_string(i);
     std::string arg_value = "arg_val_" + std::to_string(i);
-    out << "auto *" << arg_name << " = msg.add_arg();\n";
+    out << "auto *" << arg_name
+        << " __attribute__((__unused__)) = msg.add_arg();\n";
     out << GetCppVariableType(arg, &message) << " *" << arg_value
-        << " = reinterpret_cast<" << GetCppVariableType(arg, &message)
-        << "*> ((*args)[" << i << "]);\n";
+        << " __attribute__((__unused__)) = reinterpret_cast<"
+        << GetCppVariableType(arg, &message) << "*> ((*args)[" << i << "]);\n";
     GenerateProfilerForTypedVariable(out, arg, arg_name,
                                      "(*" + arg_value + ")");
   }
@@ -356,12 +359,12 @@
   out << "case details::HidlInstrumentor::PASSTHROUGH_EXIT:\n";
   out << "{\n";
   out.indent();
-  out << "if ((*args).size() != " <<  method.return_type_hidl().size() << ") {\n";
+  out << "if ((*args).size() != " << method.return_type_hidl().size()
+      << ") {\n";
   out.indent();
   out << "LOG(ERROR) << \"Number of return values does not match. expect: "
       << method.return_type_hidl().size()
-      << ", actual: \" << (*args).size() << \", method name: "
-      << method.name()
+      << ", actual: \" << (*args).size() << \", method name: " << method.name()
       << ", event type: \" << event;\n";
   out << "break;\n";
   out.unindent();
@@ -370,10 +373,11 @@
     const VariableSpecificationMessage arg = method.return_type_hidl(i);
     std::string result_name = "result_" + std::to_string(i);
     std::string result_value = "result_val_" + std::to_string(i);
-    out << "auto *" << result_name << " = msg.add_return_type_hidl();\n";
+    out << "auto *" << result_name
+        << " __attribute__((__unused__)) = msg.add_return_type_hidl();\n";
     out << GetCppVariableType(arg, &message) << " *" << result_value
-        << " = reinterpret_cast<" << GetCppVariableType(arg, &message)
-        << "*> ((*args)[" << i << "]);\n";
+        << " __attribute__((__unused__)) = reinterpret_cast<"
+        << GetCppVariableType(arg, &message) << "*> ((*args)[" << i << "]);\n";
     GenerateProfilerForTypedVariable(out, arg, result_name,
                                      "(*" + result_value + ")");
   }
@@ -394,8 +398,8 @@
   out << "profiler.AddTraceEvent(event, package, version, interface, msg);\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateHeaderIncludeFiles(Formatter& out,
-    const ComponentSpecificationMessage& message) {
+void HalHidlProfilerCodeGen::GenerateHeaderIncludeFiles(
+    Formatter& out, const ComponentSpecificationMessage& message) {
   // Basic includes.
   out << "#include <android-base/logging.h>\n";
   out << "#include <hidl/HidlSupport.h>\n";
@@ -443,8 +447,8 @@
   out << "\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateUsingDeclaration(Formatter& out,
-  const ComponentSpecificationMessage& message) {
+void HalHidlProfilerCodeGen::GenerateUsingDeclaration(
+    Formatter& out, const ComponentSpecificationMessage& message) {
   out << "using namespace ";
   out << GetPackageNamespaceToken(message) << "::" << GetVersion(message, true)
       << ";\n";
@@ -452,14 +456,14 @@
   out << "\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateMacros(Formatter& out,
-    const ComponentSpecificationMessage&) {
+void HalHidlProfilerCodeGen::GenerateMacros(
+    Formatter& out, const ComponentSpecificationMessage&) {
   out << "#define TRACEFILEPREFIX \"/data/local/tmp\"\n";
   out << "\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateProfierSanityCheck(Formatter& out,
-  const ComponentSpecificationMessage& message) {
+void HalHidlProfilerCodeGen::GenerateProfilerSanityCheck(
+    Formatter& out, const ComponentSpecificationMessage& message) {
   out << "if (strcmp(package, \"" << GetPackageName(message) << "\") != 0) {\n";
   out.indent();
   out << "LOG(WARNING) << \"incorrect package.\";\n";
@@ -484,8 +488,8 @@
   out << "\n";
 }
 
-void HalHidlProfilerCodeGen::GenerateLocalVariableDefinition(Formatter& out,
-  const ComponentSpecificationMessage&) {
+void HalHidlProfilerCodeGen::GenerateLocalVariableDefinition(
+    Formatter& out, const ComponentSpecificationMessage&) {
   // generate the name of file to store the trace.
   out << "char trace_file[PATH_MAX];\n";
   out << "sprintf(trace_file, \"%s/%s_%s\", TRACEFILEPREFIX, package, version);"
diff --git a/compilation_tools/vtsc/code_gen/profiler/HalHidlProfilerCodeGen.h b/compilation_tools/vtsc/code_gen/profiler/HalHidlProfilerCodeGen.h
index 7fd1ed7..b1c1262 100644
--- a/compilation_tools/vtsc/code_gen/profiler/HalHidlProfilerCodeGen.h
+++ b/compilation_tools/vtsc/code_gen/profiler/HalHidlProfilerCodeGen.h
@@ -100,8 +100,8 @@
     const ComponentSpecificationMessage& message) override;
   void GenerateMacros(Formatter& out,
     const ComponentSpecificationMessage& message) override;
-  virtual void GenerateProfierSanityCheck(Formatter& out,
-    const ComponentSpecificationMessage& message) override;
+  virtual void GenerateProfilerSanityCheck(
+      Formatter& out, const ComponentSpecificationMessage& message) override;
   virtual void GenerateLocalVariableDefinition(Formatter& out,
     const ComponentSpecificationMessage& message) override;
 
diff --git a/compilation_tools/vtsc/code_gen/profiler/ProfilerCodeGenBase.cpp b/compilation_tools/vtsc/code_gen/profiler/ProfilerCodeGenBase.cpp
index e5a5b82..8468ea1 100644
--- a/compilation_tools/vtsc/code_gen/profiler/ProfilerCodeGenBase.cpp
+++ b/compilation_tools/vtsc/code_gen/profiler/ProfilerCodeGenBase.cpp
@@ -101,16 +101,17 @@
         << "(\n";
     out.indent();
     out.indent();
-    out << "details::HidlInstrumentor::InstrumentationEvent event,\n";
+    out << "details::HidlInstrumentor::InstrumentationEvent event "
+           "__attribute__((__unused__)),\n";
     out << "const char* package,\n";
     out << "const char* version,\n";
     out << "const char* interface,\n";
-    out << "const char* method,\n";
-    out << "std::vector<void *> *args) {\n";
+    out << "const char* method __attribute__((__unused__)),\n";
+    out << "std::vector<void *> *args __attribute__((__unused__))) {\n";
     out.unindent();
 
     // Generate code for sanity check.
-    GenerateProfierSanityCheck(out, message);
+    GenerateProfilerSanityCheck(out, message);
 
     // Generate code to define local variables.
     GenerateLocalVariableDefinition(out, message);
@@ -253,8 +254,8 @@
   std::string attribute_name = attribute.name();
   ReplaceSubString(attribute_name, "::", "__");
   out << "void profile__" << attribute_name
-      << "(VariableSpecificationMessage* arg_name,\n" << attribute.name()
-      << " arg_val_name) {\n";
+      << "(VariableSpecificationMessage* arg_name,\n"
+      << attribute.name() << " arg_val_name __attribute__((__unused__))) {\n";
   out.indent();
   GenerateProfilerForTypedVariable(out, attribute, "arg_name", "arg_val_name");
   out.unindent();
diff --git a/compilation_tools/vtsc/code_gen/profiler/ProfilerCodeGenBase.h b/compilation_tools/vtsc/code_gen/profiler/ProfilerCodeGenBase.h
index 6292c27..e619ea9 100644
--- a/compilation_tools/vtsc/code_gen/profiler/ProfilerCodeGenBase.h
+++ b/compilation_tools/vtsc/code_gen/profiler/ProfilerCodeGenBase.h
@@ -146,8 +146,8 @@
       const ComponentSpecificationMessage&) {};
   // Generates sanity check for profiler. These codes will be generated at the
   // beginning of the main profiler function.
-  virtual void GenerateProfierSanityCheck(Formatter&,
-    const ComponentSpecificationMessage&) {};
+  virtual void GenerateProfilerSanityCheck(
+      Formatter&, const ComponentSpecificationMessage&){};
   // Generate local variable definition. These codes will be generated after
   // the sanity check code.
   virtual void GenerateLocalVariableDefinition(Formatter&,
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/Bar.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/Bar.driver.cpp
index 8da4e22..e2d07bb 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/Bar.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/Bar.driver.cpp
@@ -19,15 +19,15 @@
 using namespace android::hardware::tests::bar::V1_0;
 namespace android {
 namespace vts {
-void MessageTo__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& var_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated* arg) {
+void MessageTo__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& var_msg __attribute__((__unused__)), ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated* arg __attribute__((__unused__))) {
     MessageTo__android__hardware__tests__foo__V1_0__Unrelated(var_msg.struct_value(0), &(arg->myRelated));
 }
-bool Verify__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result){
+bool Verify__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& expected_result __attribute__((__unused__)), const VariableSpecificationMessage& actual_result __attribute__((__unused__))){
     if (!Verify__android__hardware__tests__foo__V1_0__Unrelated(expected_result.struct_value(0), actual_result.struct_value(0))) { return false; }
     return true;
 }
 
-void SetResult__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(VariableSpecificationMessage* result_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated result_value){
+void SetResult__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(VariableSpecificationMessage* result_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated result_value __attribute__((__unused__))){
     result_msg->set_type(TYPE_STRUCT);
     auto *result_msg_myRelated = result_msg->add_struct_value();
     result_msg_myRelated->set_type(TYPE_STRUCT);
@@ -53,6 +53,547 @@
     return true;
 }
 
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::doThis(
+    float arg0 __attribute__((__unused__))) {
+    cout << "doThis called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("doThis"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::doThis");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("float_t");
+    var_msg0->mutable_scalar_value()->set_float_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<int32_t> Vts_android_hardware_tests_bar_V1_0_IBar::doThatAndReturnSomething(
+    int64_t arg0 __attribute__((__unused__))) {
+    cout << "doThatAndReturnSomething called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("doThatAndReturnSomething"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::doThatAndReturnSomething");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int64_t");
+    var_msg0->mutable_scalar_value()->set_int64_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast<int32_t>(0);
+}
+
+::android::hardware::Return<double> Vts_android_hardware_tests_bar_V1_0_IBar::doQuiteABit(
+    int32_t arg0 __attribute__((__unused__)),
+    int64_t arg1 __attribute__((__unused__)),
+    float arg2 __attribute__((__unused__)),
+    double arg3 __attribute__((__unused__))) {
+    cout << "doQuiteABit called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("doQuiteABit"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::doQuiteABit");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int32_t");
+    var_msg0->mutable_scalar_value()->set_int32_t(arg0);
+    VariableSpecificationMessage* var_msg1 = callback_message.add_arg();
+    var_msg1->set_type(TYPE_SCALAR);
+    var_msg1->set_scalar_type("int64_t");
+    var_msg1->mutable_scalar_value()->set_int64_t(arg1);
+    VariableSpecificationMessage* var_msg2 = callback_message.add_arg();
+    var_msg2->set_type(TYPE_SCALAR);
+    var_msg2->set_scalar_type("float_t");
+    var_msg2->mutable_scalar_value()->set_float_t(arg2);
+    VariableSpecificationMessage* var_msg3 = callback_message.add_arg();
+    var_msg3->set_type(TYPE_SCALAR);
+    var_msg3->set_scalar_type("double_t");
+    var_msg3->mutable_scalar_value()->set_double_t(arg3);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast<double>(0);
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::doSomethingElse(
+    const ::android::hardware::hidl_array<int32_t,15>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_array<int32_t,32>& arg0)>) {
+    cout << "doSomethingElse called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("doSomethingElse"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::doSomethingElse");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_ARRAY);
+    var_msg0->set_vector_size(1);
+    for (int i = 0; i < 1; i++) {
+        auto *var_msg0_array_i = var_msg0->add_vector_value();
+        var_msg0_array_i->set_type(TYPE_SCALAR);
+        var_msg0_array_i->set_scalar_type("int32_t");
+        var_msg0_array_i->mutable_scalar_value()->set_int32_t(arg0[i]);
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::doStuffAndReturnAString(
+    std::function<void(const ::android::hardware::hidl_string& arg0)>) {
+    cout << "doStuffAndReturnAString called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("doStuffAndReturnAString"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::doStuffAndReturnAString");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::mapThisVector(
+    const ::android::hardware::hidl_vec<int32_t>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_vec<int32_t>& arg0)>) {
+    cout << "mapThisVector called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("mapThisVector"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::mapThisVector");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_VECTOR);
+    var_msg0->set_vector_size(arg0.size());
+    for (int i = 0; i < (int)arg0.size(); i++) {
+        auto *var_msg0_vector_i = var_msg0->add_vector_value();
+        var_msg0_vector_i->set_type(TYPE_SCALAR);
+        var_msg0_vector_i->set_scalar_type("int32_t");
+        var_msg0_vector_i->mutable_scalar_value()->set_int32_t(arg0[i]);
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::callMe(
+    const sp<::android::hardware::tests::foo::V1_0::IFooCallback>& arg0 __attribute__((__unused__))) {
+    cout << "callMe called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("callMe"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::callMe");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_HIDL_CALLBACK);
+    /* ERROR: TYPE_HIDL_CALLBACK is not supported yet. */
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<::android::hardware::tests::foo::V1_0::IFoo::SomeEnum> Vts_android_hardware_tests_bar_V1_0_IBar::useAnEnum(
+    ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum arg0 __attribute__((__unused__))) {
+    cout << "useAnEnum called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("useAnEnum"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::useAnEnum");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_ENUM);
+    SetResult__android__hardware__tests__foo__V1_0__IFoo__SomeEnum(var_msg0, arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast< ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum>(Random__android__hardware__tests__foo__V1_0__IFoo__SomeEnum());
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::haveAGooberVec(
+    const ::android::hardware::hidl_vec<::android::hardware::tests::foo::V1_0::IFoo::Goober>& arg0 __attribute__((__unused__))) {
+    cout << "haveAGooberVec called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveAGooberVec"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveAGooberVec");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_VECTOR);
+    var_msg0->set_vector_size(arg0.size());
+    for (int i = 0; i < (int)arg0.size(); i++) {
+        auto *var_msg0_vector_i = var_msg0->add_vector_value();
+        var_msg0_vector_i->set_type(TYPE_STRUCT);
+        SetResult__android__hardware__tests__foo__V1_0__IFoo__Goober(var_msg0_vector_i, arg0[i]);
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::haveAGoober(
+    const ::android::hardware::tests::foo::V1_0::IFoo::Goober& arg0 __attribute__((__unused__))) {
+    cout << "haveAGoober called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveAGoober"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveAGoober");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_STRUCT);
+    SetResult__android__hardware__tests__foo__V1_0__IFoo__Goober(var_msg0, arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::haveAGooberArray(
+    const ::android::hardware::hidl_array<::android::hardware::tests::foo::V1_0::IFoo::Goober,20>& arg0 __attribute__((__unused__))) {
+    cout << "haveAGooberArray called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveAGooberArray"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveAGooberArray");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_ARRAY);
+    var_msg0->set_vector_size(1);
+    for (int i = 0; i < 1; i++) {
+        auto *var_msg0_array_i = var_msg0->add_vector_value();
+        var_msg0_array_i->set_type(TYPE_STRUCT);
+        auto *var_msg0_array_i_q = var_msg0_array_i->add_struct_value();
+        var_msg0_array_i_q->set_type(TYPE_SCALAR);
+        var_msg0_array_i_q->set_scalar_type("int32_t");
+        var_msg0_array_i_q->mutable_scalar_value()->set_int32_t(arg0[i].q);
+        var_msg0_array_i_q->set_name("q");
+        auto *var_msg0_array_i_name = var_msg0_array_i->add_struct_value();
+        var_msg0_array_i_name->set_type(TYPE_STRING);
+        var_msg0_array_i_name->mutable_string_value()->set_message(arg0[i].name.c_str());
+        var_msg0_array_i_name->mutable_string_value()->set_length(arg0[i].name.size());
+        var_msg0_array_i_name->set_name("name");
+        auto *var_msg0_array_i_address = var_msg0_array_i->add_struct_value();
+        var_msg0_array_i_address->set_type(TYPE_STRING);
+        var_msg0_array_i_address->mutable_string_value()->set_message(arg0[i].address.c_str());
+        var_msg0_array_i_address->mutable_string_value()->set_length(arg0[i].address.size());
+        var_msg0_array_i_address->set_name("address");
+        auto *var_msg0_array_i_numbers = var_msg0_array_i->add_struct_value();
+        var_msg0_array_i_numbers->set_type(TYPE_ARRAY);
+        var_msg0_array_i_numbers->set_vector_size(1);
+        for (int i = 0; i < 1; i++) {
+            auto *var_msg0_array_i_numbers_array_i = var_msg0_array_i_numbers->add_vector_value();
+            var_msg0_array_i_numbers_array_i->set_type(TYPE_SCALAR);
+            var_msg0_array_i_numbers_array_i->set_scalar_type("double_t");
+            var_msg0_array_i_numbers_array_i->mutable_scalar_value()->set_double_t(arg0[i].numbers[i]);
+        }
+        var_msg0_array_i_numbers->set_name("numbers");
+        auto *var_msg0_array_i_fumble = var_msg0_array_i->add_struct_value();
+        var_msg0_array_i_fumble->set_type(TYPE_STRUCT);
+        SetResult__android__hardware__tests__foo__V1_0__IFoo__Fumble(var_msg0_array_i_fumble, arg0[i].fumble);
+        var_msg0_array_i_fumble->set_name("fumble");
+        auto *var_msg0_array_i_gumble = var_msg0_array_i->add_struct_value();
+        var_msg0_array_i_gumble->set_type(TYPE_STRUCT);
+        SetResult__android__hardware__tests__foo__V1_0__IFoo__Fumble(var_msg0_array_i_gumble, arg0[i].gumble);
+        var_msg0_array_i_gumble->set_name("gumble");
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::haveATypeFromAnotherFile(
+    const ::android::hardware::tests::foo::V1_0::Abc& arg0 __attribute__((__unused__))) {
+    cout << "haveATypeFromAnotherFile called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveATypeFromAnotherFile"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveATypeFromAnotherFile");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_STRUCT);
+    SetResult__android__hardware__tests__foo__V1_0__Abc(var_msg0, arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::haveSomeStrings(
+    const ::android::hardware::hidl_array<::android::hardware::hidl_string,3>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_array<::android::hardware::hidl_string,2>& arg0)>) {
+    cout << "haveSomeStrings called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveSomeStrings"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveSomeStrings");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_ARRAY);
+    var_msg0->set_vector_size(1);
+    for (int i = 0; i < 1; i++) {
+        auto *var_msg0_array_i = var_msg0->add_vector_value();
+        var_msg0_array_i->set_type(TYPE_STRING);
+        var_msg0_array_i->mutable_string_value()->set_message(arg0[i].c_str());
+        var_msg0_array_i->mutable_string_value()->set_length(arg0[i].size());
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::haveAStringVec(
+    const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& arg0)>) {
+    cout << "haveAStringVec called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveAStringVec"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveAStringVec");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_VECTOR);
+    var_msg0->set_vector_size(arg0.size());
+    for (int i = 0; i < (int)arg0.size(); i++) {
+        auto *var_msg0_vector_i = var_msg0->add_vector_value();
+        var_msg0_vector_i->set_type(TYPE_STRING);
+        var_msg0_vector_i->mutable_string_value()->set_message(arg0[i].c_str());
+        var_msg0_vector_i->mutable_string_value()->set_length(arg0[i].size());
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::transposeMe(
+    const ::android::hardware::hidl_array<float, 3,5>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_array<float, 5,3>& arg0)>) {
+    cout << "transposeMe called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("transposeMe"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::transposeMe");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_ARRAY);
+    var_msg0->set_vector_size(1);
+    for (int i = 0; i < 1; i++) {
+        auto *var_msg0_array_i = var_msg0->add_vector_value();
+        var_msg0_array_i->set_type(TYPE_ARRAY);
+        var_msg0_array_i->set_vector_size(1);
+        for (int i = 0; i < 1; i++) {
+            auto *var_msg0_array_i_array_i = var_msg0_array_i->add_vector_value();
+            var_msg0_array_i_array_i->set_type(TYPE_SCALAR);
+            var_msg0_array_i_array_i->set_scalar_type("float_t");
+            var_msg0_array_i_array_i->mutable_scalar_value()->set_float_t(arg0[i][i]);
+        }
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::callingDrWho(
+    const ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional& arg0)>) {
+    cout << "callingDrWho called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("callingDrWho"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::callingDrWho");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_STRUCT);
+    SetResult__android__hardware__tests__foo__V1_0__IFoo__MultiDimensional(var_msg0, arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::transpose(
+    const ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix5x3& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix3x5& arg0)>) {
+    cout << "transpose called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("transpose"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::transpose");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_STRUCT);
+    SetResult__android__hardware__tests__foo__V1_0__IFoo__StringMatrix5x3(var_msg0, arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::transpose2(
+    const ::android::hardware::hidl_array<::android::hardware::hidl_string, 5,3>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_array<::android::hardware::hidl_string, 3,5>& arg0)>) {
+    cout << "transpose2 called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("transpose2"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::transpose2");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_ARRAY);
+    var_msg0->set_vector_size(1);
+    for (int i = 0; i < 1; i++) {
+        auto *var_msg0_array_i = var_msg0->add_vector_value();
+        var_msg0_array_i->set_type(TYPE_ARRAY);
+        var_msg0_array_i->set_vector_size(1);
+        for (int i = 0; i < 1; i++) {
+            auto *var_msg0_array_i_array_i = var_msg0_array_i->add_vector_value();
+            var_msg0_array_i_array_i->set_type(TYPE_STRING);
+            var_msg0_array_i_array_i->mutable_string_value()->set_message(arg0[i][i].c_str());
+            var_msg0_array_i_array_i->mutable_string_value()->set_length(arg0[i][i].size());
+        }
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::sendVec(
+    const ::android::hardware::hidl_vec<uint8_t>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_vec<uint8_t>& arg0)>) {
+    cout << "sendVec called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("sendVec"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::sendVec");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_VECTOR);
+    var_msg0->set_vector_size(arg0.size());
+    for (int i = 0; i < (int)arg0.size(); i++) {
+        auto *var_msg0_vector_i = var_msg0->add_vector_value();
+        var_msg0_vector_i->set_type(TYPE_SCALAR);
+        var_msg0_vector_i->set_scalar_type("uint8_t");
+        var_msg0_vector_i->mutable_scalar_value()->set_uint8_t(arg0[i]);
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::sendVecVec(
+    std::function<void(const ::android::hardware::hidl_vec<::android::hardware::hidl_vec<uint8_t>>& arg0)>) {
+    cout << "sendVecVec called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("sendVecVec"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::sendVecVec");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::haveAVectorOfInterfaces(
+    const ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>& arg0)>) {
+    cout << "haveAVectorOfInterfaces called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveAVectorOfInterfaces"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveAVectorOfInterfaces");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_VECTOR);
+    var_msg0->set_vector_size(arg0.size());
+    for (int i = 0; i < (int)arg0.size(); i++) {
+        auto *var_msg0_vector_i = var_msg0->add_vector_value();
+        var_msg0_vector_i->set_type(TYPE_HIDL_INTERFACE);
+        var_msg0_vector_i->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
+        if (arg0[i] != nullptr) {
+            arg0[i]->incStrong(arg0[i].get());
+            var_msg0_vector_i->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(arg0[i].get()));
+        } else {
+            var_msg0_vector_i->set_hidl_interface_pointer(0);
+        }
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::haveAVectorOfGenericInterfaces(
+    const ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>& arg0)>) {
+    cout << "haveAVectorOfGenericInterfaces called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveAVectorOfGenericInterfaces"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveAVectorOfGenericInterfaces");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_VECTOR);
+    var_msg0->set_vector_size(arg0.size());
+    for (int i = 0; i < (int)arg0.size(); i++) {
+        auto *var_msg0_vector_i = var_msg0->add_vector_value();
+        var_msg0_vector_i->set_type(TYPE_HIDL_INTERFACE);
+        var_msg0_vector_i->set_predefined_type("::android::hidl::base::V1_0::IBase");
+        if (arg0[i] != nullptr) {
+            arg0[i]->incStrong(arg0[i].get());
+            var_msg0_vector_i->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(arg0[i].get()));
+        } else {
+            var_msg0_vector_i->set_hidl_interface_pointer(0);
+        }
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::echoNullInterface(
+    const sp<::android::hardware::tests::foo::V1_0::IFooCallback>& arg0 __attribute__((__unused__)), std::function<void(bool arg0,const sp<::android::hardware::tests::foo::V1_0::IFooCallback>& arg1)>) {
+    cout << "echoNullInterface called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("echoNullInterface"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::echoNullInterface");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_HIDL_CALLBACK);
+    /* ERROR: TYPE_HIDL_CALLBACK is not supported yet. */
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::createMyHandle(
+    std::function<void(const ::android::hardware::tests::foo::V1_0::IFoo::MyHandle& arg0)>) {
+    cout << "createMyHandle called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("createMyHandle"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::createMyHandle");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::createHandles(
+    uint32_t arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_vec<::android::hardware::hidl_handle>& arg0)>) {
+    cout << "createHandles called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("createHandles"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::createHandles");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("uint32_t");
+    var_msg0->mutable_scalar_value()->set_uint32_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::closeHandles(
+    ) {
+    cout << "closeHandles called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("closeHandles"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::closeHandles");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::thisIsNew(
+    ) {
+    cout << "thisIsNew called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("thisIsNew"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::thisIsNew");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::expectNullHandle(
+    const ::android::hardware::hidl_handle& arg0 __attribute__((__unused__)),
+    const ::android::hardware::tests::foo::V1_0::Abc& arg1 __attribute__((__unused__)), std::function<void(bool arg0,bool arg1)>) {
+    cout << "expectNullHandle called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("expectNullHandle"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::expectNullHandle");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_HANDLE);
+    /* ERROR: TYPE_HANDLE is not supported yet. */
+    VariableSpecificationMessage* var_msg1 = callback_message.add_arg();
+    var_msg1->set_type(TYPE_STRUCT);
+    SetResult__android__hardware__tests__foo__V1_0__Abc(var_msg1, arg1);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_bar_V1_0_IBar::takeAMask(
+    ::android::hardware::tests::foo::V1_0::IFoo::BitField arg0 __attribute__((__unused__)),
+    uint8_t arg1 __attribute__((__unused__)),
+    const ::android::hardware::tests::foo::V1_0::IFoo::MyMask& arg2 __attribute__((__unused__)),
+    uint8_t arg3 __attribute__((__unused__)), std::function<void(::android::hardware::tests::foo::V1_0::IFoo::BitField arg0,uint8_t arg1,uint8_t arg2,uint8_t arg3)>) {
+    cout << "takeAMask called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("takeAMask"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::takeAMask");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_ENUM);
+    SetResult__android__hardware__tests__foo__V1_0__IFoo__BitField(var_msg0, arg0);
+    VariableSpecificationMessage* var_msg1 = callback_message.add_arg();
+    var_msg1->set_type(TYPE_MASK);
+    var_msg1->set_scalar_type("uint8_t");
+    var_msg1->mutable_scalar_value()->set_uint8_t(arg1);
+    VariableSpecificationMessage* var_msg2 = callback_message.add_arg();
+    var_msg2->set_type(TYPE_STRUCT);
+    SetResult__android__hardware__tests__foo__V1_0__IFoo__MyMask(var_msg2, arg2);
+    VariableSpecificationMessage* var_msg3 = callback_message.add_arg();
+    var_msg3->set_type(TYPE_MASK);
+    var_msg3->set_scalar_type("uint8_t");
+    var_msg3->mutable_scalar_value()->set_uint8_t(arg3);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<sp<::android::hardware::tests::foo::V1_0::ISimple>> Vts_android_hardware_tests_bar_V1_0_IBar::haveAInterface(
+    const sp<::android::hardware::tests::foo::V1_0::ISimple>& arg0 __attribute__((__unused__))) {
+    cout << "haveAInterface called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveAInterface"));
+    callback_message.set_name("Vts_android_hardware_tests_bar_V1_0_IBar::haveAInterface");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_HIDL_INTERFACE);
+    var_msg0->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
+    if (arg0 != nullptr) {
+        arg0->incStrong(arg0.get());
+        var_msg0->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(arg0.get()));
+    } else {
+        var_msg0->set_hidl_interface_pointer(0);
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return nullptr;
+}
+
+sp<::android::hardware::tests::bar::V1_0::IBar> VtsFuzzerCreateVts_android_hardware_tests_bar_V1_0_IBar(const string& callback_socket_name) {
+    static sp<::android::hardware::tests::bar::V1_0::IBar> result;
+    result = new Vts_android_hardware_tests_bar_V1_0_IBar(callback_socket_name);
+    return result;
+}
+
 bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::Fuzz(
     FunctionSpecificationMessage* /*func_msg*/,
     void** /*result*/, const string& /*callback_socket_name*/) {
@@ -64,10 +605,17 @@
     cerr << "attribute not found" << endl;
     return false;
 }
-bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg) {
+bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::CallFunction(
+    const FunctionSpecificationMessage& func_msg,
+    const string& callback_socket_name __attribute__((__unused__)),
+    FunctionSpecificationMessage* result_msg) {
     const char* func_name = func_msg.name().c_str();
     cout << "Function: " << __func__ << " " << func_name << endl;
     cout << "Callback socket name: " << callback_socket_name << endl;
+    if (hw_binder_proxy_ == nullptr) {
+        cerr << "hw_binder_proxy_ is null. "<< endl;
+        return false;
+    }
     if (!strcmp(func_name, "doThis")) {
         float arg0 = 0;
         arg0 = func_msg.arg(0).scalar_value().float_t();
@@ -563,9 +1111,13 @@
         for (int i = 0; i < (int)result0.size(); i++) {
             auto *result_val_0_vector_i = result_val_0->add_vector_value();
             result_val_0_vector_i->set_type(TYPE_HIDL_INTERFACE);
-            result0[i]->incStrong(result0[i].get());
-            result_val_0_vector_i->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0[i].get()));
             result_val_0_vector_i->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
+            if (result0[i] != nullptr) {
+                result0[i]->incStrong(result0[i].get());
+                result_val_0_vector_i->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0[i].get()));
+            } else {
+                result_val_0_vector_i->set_hidl_interface_pointer(0);
+            }
         }
         cout << "called" << endl;
         return true;
@@ -594,9 +1146,13 @@
         for (int i = 0; i < (int)result0.size(); i++) {
             auto *result_val_0_vector_i = result_val_0->add_vector_value();
             result_val_0_vector_i->set_type(TYPE_HIDL_INTERFACE);
-            result0[i]->incStrong(result0[i].get());
-            result_val_0_vector_i->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0[i].get()));
             result_val_0_vector_i->set_predefined_type("::android::hidl::base::V1_0::IBase");
+            if (result0[i] != nullptr) {
+                result0[i]->incStrong(result0[i].get());
+                result_val_0_vector_i->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0[i].get()));
+            } else {
+                result_val_0_vector_i->set_hidl_interface_pointer(0);
+            }
         }
         cout << "called" << endl;
         return true;
@@ -851,9 +1407,13 @@
         result_msg->set_name("haveAInterface");
         VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
         result_val_0->set_type(TYPE_HIDL_INTERFACE);
-        result0->incStrong(result0.get());
-        result_val_0->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0.get()));
         result_val_0->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
+        if (result0 != nullptr) {
+            result0->incStrong(result0.get());
+            result_val_0->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0.get()));
+        } else {
+            result_val_0->set_hidl_interface_pointer(0);
+        }
         cout << "called" << endl;
         return true;
     }
@@ -867,7 +1427,8 @@
     return false;
 }
 
-bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::VerifyResults(const FunctionSpecificationMessage& expected_result, const FunctionSpecificationMessage& actual_result) {
+bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::VerifyResults(const FunctionSpecificationMessage& expected_result __attribute__((__unused__)),
+    const FunctionSpecificationMessage& actual_result __attribute__((__unused__))) {
     if (!strcmp(actual_result.name().c_str(), "doThis")) {
         if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
         return true;
@@ -1103,16 +1664,23 @@
 }
 
 extern "C" {
-android::vts::FuzzerBase* vts_func_4_android_hardware_tests_bar_V1_0_IBar_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_android_hardware_tests_bar_V1_0_IBar();
+android::vts::DriverBase* vts_func_4_android_hardware_tests_bar_V1_0_IBar_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_android_hardware_tests_bar_V1_0_IBar();
 }
 
-android::vts::FuzzerBase* vts_func_4_android_hardware_tests_bar_V1_0_IBar_with_arg(uint64_t hw_binder_proxy) {
-    ::android::hardware::tests::bar::V1_0::IBar* arg = reinterpret_cast<::android::hardware::tests::bar::V1_0::IBar*>(hw_binder_proxy);
-    android::vts::FuzzerBase* result =
+android::vts::DriverBase* vts_func_4_android_hardware_tests_bar_V1_0_IBar_with_arg(uint64_t hw_binder_proxy) {
+    ::android::hardware::tests::bar::V1_0::IBar* arg = nullptr;
+    if (hw_binder_proxy) {
+        arg = reinterpret_cast<::android::hardware::tests::bar::V1_0::IBar*>(hw_binder_proxy);
+    } else {
+        cout << " Creating DriverBase with null proxy." << endl;
+    }
+    android::vts::DriverBase* result =
         new android::vts::FuzzerExtended_android_hardware_tests_bar_V1_0_IBar(
             arg);
-    arg->decStrong(arg);
+    if (arg != nullptr) {
+        arg->decStrong(arg);
+    }
     return result;
 }
 
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/Bar.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/Bar.vts.h
index c697e40..65874ba 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/Bar.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/Bar.vts.h
@@ -10,8 +10,10 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
+
+#include <VtsDriverCommUtil.h>
 
 #include <android/hardware/tests/bar/1.0/IBar.h>
 #include <hidl/HidlSupport.h>
@@ -36,11 +38,123 @@
 void MessageTo__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& var_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated* arg);
 bool Verify__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result);
 void SetResult__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(VariableSpecificationMessage* result_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated result_value);
-class FuzzerExtended_android_hardware_tests_bar_V1_0_IBar : public FuzzerBase {
- public:
-    FuzzerExtended_android_hardware_tests_bar_V1_0_IBar() : FuzzerBase(HAL_HIDL), hw_binder_proxy_() {}
 
-    explicit FuzzerExtended_android_hardware_tests_bar_V1_0_IBar(::android::hardware::tests::bar::V1_0::IBar* hw_binder_proxy) : FuzzerBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
+class Vts_android_hardware_tests_bar_V1_0_IBar : public ::android::hardware::tests::bar::V1_0::IBar, public DriverCallbackBase {
+ public:
+    Vts_android_hardware_tests_bar_V1_0_IBar(const string& callback_socket_name)
+        : callback_socket_name_(callback_socket_name) {};
+
+    virtual ~Vts_android_hardware_tests_bar_V1_0_IBar() = default;
+
+    ::android::hardware::Return<void> doThis(
+        float arg0) override;
+
+    ::android::hardware::Return<int32_t> doThatAndReturnSomething(
+        int64_t arg0) override;
+
+    ::android::hardware::Return<double> doQuiteABit(
+        int32_t arg0,
+        int64_t arg1,
+        float arg2,
+        double arg3) override;
+
+    ::android::hardware::Return<void> doSomethingElse(
+        const ::android::hardware::hidl_array<int32_t,15>& arg0, std::function<void(const ::android::hardware::hidl_array<int32_t,32>& arg0)>) override;
+
+    ::android::hardware::Return<void> doStuffAndReturnAString(
+        std::function<void(const ::android::hardware::hidl_string& arg0)>) override;
+
+    ::android::hardware::Return<void> mapThisVector(
+        const ::android::hardware::hidl_vec<int32_t>& arg0, std::function<void(const ::android::hardware::hidl_vec<int32_t>& arg0)>) override;
+
+    ::android::hardware::Return<void> callMe(
+        const sp<::android::hardware::tests::foo::V1_0::IFooCallback>& arg0) override;
+
+    ::android::hardware::Return<::android::hardware::tests::foo::V1_0::IFoo::SomeEnum> useAnEnum(
+        ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum arg0) override;
+
+    ::android::hardware::Return<void> haveAGooberVec(
+        const ::android::hardware::hidl_vec<::android::hardware::tests::foo::V1_0::IFoo::Goober>& arg0) override;
+
+    ::android::hardware::Return<void> haveAGoober(
+        const ::android::hardware::tests::foo::V1_0::IFoo::Goober& arg0) override;
+
+    ::android::hardware::Return<void> haveAGooberArray(
+        const ::android::hardware::hidl_array<::android::hardware::tests::foo::V1_0::IFoo::Goober,20>& arg0) override;
+
+    ::android::hardware::Return<void> haveATypeFromAnotherFile(
+        const ::android::hardware::tests::foo::V1_0::Abc& arg0) override;
+
+    ::android::hardware::Return<void> haveSomeStrings(
+        const ::android::hardware::hidl_array<::android::hardware::hidl_string,3>& arg0, std::function<void(const ::android::hardware::hidl_array<::android::hardware::hidl_string,2>& arg0)>) override;
+
+    ::android::hardware::Return<void> haveAStringVec(
+        const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& arg0, std::function<void(const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& arg0)>) override;
+
+    ::android::hardware::Return<void> transposeMe(
+        const ::android::hardware::hidl_array<float, 3,5>& arg0, std::function<void(const ::android::hardware::hidl_array<float, 5,3>& arg0)>) override;
+
+    ::android::hardware::Return<void> callingDrWho(
+        const ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional& arg0, std::function<void(const ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional& arg0)>) override;
+
+    ::android::hardware::Return<void> transpose(
+        const ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix5x3& arg0, std::function<void(const ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix3x5& arg0)>) override;
+
+    ::android::hardware::Return<void> transpose2(
+        const ::android::hardware::hidl_array<::android::hardware::hidl_string, 5,3>& arg0, std::function<void(const ::android::hardware::hidl_array<::android::hardware::hidl_string, 3,5>& arg0)>) override;
+
+    ::android::hardware::Return<void> sendVec(
+        const ::android::hardware::hidl_vec<uint8_t>& arg0, std::function<void(const ::android::hardware::hidl_vec<uint8_t>& arg0)>) override;
+
+    ::android::hardware::Return<void> sendVecVec(
+        std::function<void(const ::android::hardware::hidl_vec<::android::hardware::hidl_vec<uint8_t>>& arg0)>) override;
+
+    ::android::hardware::Return<void> haveAVectorOfInterfaces(
+        const ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>& arg0, std::function<void(const ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>& arg0)>) override;
+
+    ::android::hardware::Return<void> haveAVectorOfGenericInterfaces(
+        const ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>& arg0, std::function<void(const ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>& arg0)>) override;
+
+    ::android::hardware::Return<void> echoNullInterface(
+        const sp<::android::hardware::tests::foo::V1_0::IFooCallback>& arg0, std::function<void(bool arg0,const sp<::android::hardware::tests::foo::V1_0::IFooCallback>& arg1)>) override;
+
+    ::android::hardware::Return<void> createMyHandle(
+        std::function<void(const ::android::hardware::tests::foo::V1_0::IFoo::MyHandle& arg0)>) override;
+
+    ::android::hardware::Return<void> createHandles(
+        uint32_t arg0, std::function<void(const ::android::hardware::hidl_vec<::android::hardware::hidl_handle>& arg0)>) override;
+
+    ::android::hardware::Return<void> closeHandles(
+        ) override;
+
+    ::android::hardware::Return<void> thisIsNew(
+        ) override;
+
+    ::android::hardware::Return<void> expectNullHandle(
+        const ::android::hardware::hidl_handle& arg0,
+        const ::android::hardware::tests::foo::V1_0::Abc& arg1, std::function<void(bool arg0,bool arg1)>) override;
+
+    ::android::hardware::Return<void> takeAMask(
+        ::android::hardware::tests::foo::V1_0::IFoo::BitField arg0,
+        uint8_t arg1,
+        const ::android::hardware::tests::foo::V1_0::IFoo::MyMask& arg2,
+        uint8_t arg3, std::function<void(::android::hardware::tests::foo::V1_0::IFoo::BitField arg0,uint8_t arg1,uint8_t arg2,uint8_t arg3)>) override;
+
+    ::android::hardware::Return<sp<::android::hardware::tests::foo::V1_0::ISimple>> haveAInterface(
+        const sp<::android::hardware::tests::foo::V1_0::ISimple>& arg0) override;
+
+
+ private:
+    string callback_socket_name_;
+};
+
+sp<::android::hardware::tests::bar::V1_0::IBar> VtsFuzzerCreateVts_android_hardware_tests_bar_V1_0_IBar(const string& callback_socket_name);
+
+class FuzzerExtended_android_hardware_tests_bar_V1_0_IBar : public DriverBase {
+ public:
+    FuzzerExtended_android_hardware_tests_bar_V1_0_IBar() : DriverBase(HAL_HIDL), hw_binder_proxy_() {}
+
+    explicit FuzzerExtended_android_hardware_tests_bar_V1_0_IBar(::android::hardware::tests::bar::V1_0::IBar* hw_binder_proxy) : DriverBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
     uint64_t GetHidlInterfaceProxy() const {
         return reinterpret_cast<uintptr_t>(hw_binder_proxy_.get());
     }
@@ -57,8 +171,8 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_4_android_hardware_tests_bar_V1_0_IBar_();
-extern android::vts::FuzzerBase* vts_func_4_android_hardware_tests_bar_V1_0_IBar_with_arg(uint64_t hw_binder_proxy);
+extern android::vts::DriverBase* vts_func_4_android_hardware_tests_bar_V1_0_IBar_();
+extern android::vts::DriverBase* vts_func_4_android_hardware_tests_bar_V1_0_IBar_with_arg(uint64_t hw_binder_proxy);
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/BluetoothHalV1.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/BluetoothHalV1.driver.cpp
index ea49744..963bea0 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/BluetoothHalV1.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/BluetoothHalV1.driver.cpp
@@ -68,8 +68,8 @@
     return true;
 }
 extern "C" {
-android::vts::FuzzerBase* vts_func_1_7_V1_0_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_bluetooth_module_t();
+android::vts::DriverBase* vts_func_1_7_V1_0_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_bluetooth_module_t();
 }
 
 }
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/BluetoothHalV1bt_interface_t.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/BluetoothHalV1bt_interface_t.driver.cpp
index c13d19d..495f345 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/BluetoothHalV1bt_interface_t.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/BluetoothHalV1bt_interface_t.driver.cpp
@@ -10,7 +10,7 @@
 namespace vts {
 static string callback_socket_name_;
 
-class vts_callback_FuzzerExtended_bt_interface_t_bt_callbacks_t : public FuzzerCallbackBase {
+class vts_callback_FuzzerExtended_bt_interface_t_bt_callbacks_t : public DriverCallbackBase {
  public:
     vts_callback_FuzzerExtended_bt_interface_t_bt_callbacks_t(const string& callback_socket_name) {
         callback_socket_name_ = callback_socket_name;
@@ -43,7 +43,7 @@
 
 
     static void
-     remote_device_properties_cb(bt_status_t arg0, bt_bdaddr_t* arg1, int32_t arg2, bt_property_t* arg3) {
+     remote_device_properties_cb(bt_status_t arg0, RawAddress* arg1, int32_t arg2, bt_property_t* arg3) {
         AndroidSystemCallbackRequestMessage callback_message;
         callback_message.set_id(GetCallbackID("remote_device_properties_cb"));
         VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
@@ -85,7 +85,7 @@
 
 
     static void
-     pin_request_cb(bt_bdaddr_t* arg0, bt_bdname_t* arg1, uint32_t arg2, bool arg3) {
+     pin_request_cb(RawAddress* arg0, bt_bdname_t* arg1, uint32_t arg2, bool arg3) {
         AndroidSystemCallbackRequestMessage callback_message;
         callback_message.set_id(GetCallbackID("pin_request_cb"));
         VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
@@ -105,7 +105,7 @@
 
 
     static void
-     ssp_request_cb(bt_bdaddr_t* arg0, bt_bdname_t* arg1, uint32_t arg2, bt_ssp_variant_t arg3, uint32_t arg4) {
+     ssp_request_cb(RawAddress* arg0, bt_bdname_t* arg1, uint32_t arg2, bt_ssp_variant_t arg3, uint32_t arg4) {
         AndroidSystemCallbackRequestMessage callback_message;
         callback_message.set_id(GetCallbackID("ssp_request_cb"));
         VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
@@ -127,7 +127,7 @@
 
 
     static void
-     bond_state_changed_cb(bt_status_t arg0, bt_bdaddr_t* arg1, bt_bond_state_t arg2) {
+     bond_state_changed_cb(bt_status_t arg0, RawAddress* arg1, bt_bond_state_t arg2) {
         AndroidSystemCallbackRequestMessage callback_message;
         callback_message.set_id(GetCallbackID("bond_state_changed_cb"));
         VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
@@ -141,7 +141,7 @@
 
 
     static void
-     acl_state_changed_cb(bt_status_t arg0, bt_bdaddr_t* arg1, bt_acl_state_t arg2) {
+     acl_state_changed_cb(bt_status_t arg0, RawAddress* arg1, bt_acl_state_t arg2) {
         AndroidSystemCallbackRequestMessage callback_message;
         callback_message.set_id(GetCallbackID("acl_state_changed_cb"));
         VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
@@ -291,8 +291,8 @@
     return true;
 }
 extern "C" {
-android::vts::FuzzerBase* vts_func_2_7_V1_0_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_bt_interface_t();
+android::vts::DriverBase* vts_func_2_7_V1_0_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_bt_interface_t();
 }
 
 }
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/CameraHalV2.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/CameraHalV2.driver.cpp
index bc91801..f4002ad 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/CameraHalV2.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/CameraHalV2.driver.cpp
@@ -11,7 +11,7 @@
 namespace vts {
 static string callback_socket_name_;
 
-class vts_callback_FuzzerExtended_camera_module_t_camera_module_callbacks_t : public FuzzerCallbackBase {
+class vts_callback_FuzzerExtended_camera_module_t_camera_module_callbacks_t : public DriverCallbackBase {
  public:
     vts_callback_FuzzerExtended_camera_module_t_camera_module_callbacks_t(const string& callback_socket_name) {
         callback_socket_name_ = callback_socket_name;
@@ -293,8 +293,8 @@
     return true;
 }
 extern "C" {
-android::vts::FuzzerBase* vts_func_1_2_V2_1_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_camera_module_t();
+android::vts::DriverBase* vts_func_1_2_V2_1_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_camera_module_t();
 }
 
 }
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/MemoryTest.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/MemoryTest.driver.cpp
index 1363a3e..38408e6 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/MemoryTest.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/MemoryTest.driver.cpp
@@ -31,6 +31,44 @@
     return true;
 }
 
+
+::android::hardware::Return<void> Vts_android_hardware_tests_memory_V1_0_IMemoryTest::haveSomeMemory(
+    const ::android::hardware::hidl_memory& arg0 __attribute__((__unused__)), std::function<void(const ::android::hardware::hidl_memory& arg0)>) {
+    cout << "haveSomeMemory called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("haveSomeMemory"));
+    callback_message.set_name("Vts_android_hardware_tests_memory_V1_0_IMemoryTest::haveSomeMemory");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_HIDL_MEMORY);
+    /* ERROR: TYPE_HIDL_MEMORY is not supported yet. */
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_memory_V1_0_IMemoryTest::fillMemory(
+    const ::android::hardware::hidl_memory& arg0 __attribute__((__unused__)),
+    uint8_t arg1 __attribute__((__unused__))) {
+    cout << "fillMemory called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("fillMemory"));
+    callback_message.set_name("Vts_android_hardware_tests_memory_V1_0_IMemoryTest::fillMemory");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_HIDL_MEMORY);
+    /* ERROR: TYPE_HIDL_MEMORY is not supported yet. */
+    VariableSpecificationMessage* var_msg1 = callback_message.add_arg();
+    var_msg1->set_type(TYPE_SCALAR);
+    var_msg1->set_scalar_type("uint8_t");
+    var_msg1->mutable_scalar_value()->set_uint8_t(arg1);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+sp<::android::hardware::tests::memory::V1_0::IMemoryTest> VtsFuzzerCreateVts_android_hardware_tests_memory_V1_0_IMemoryTest(const string& callback_socket_name) {
+    static sp<::android::hardware::tests::memory::V1_0::IMemoryTest> result;
+    result = new Vts_android_hardware_tests_memory_V1_0_IMemoryTest(callback_socket_name);
+    return result;
+}
+
 bool FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest::Fuzz(
     FunctionSpecificationMessage* /*func_msg*/,
     void** /*result*/, const string& /*callback_socket_name*/) {
@@ -42,10 +80,17 @@
     cerr << "attribute not found" << endl;
     return false;
 }
-bool FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest::CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg) {
+bool FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest::CallFunction(
+    const FunctionSpecificationMessage& func_msg,
+    const string& callback_socket_name __attribute__((__unused__)),
+    FunctionSpecificationMessage* result_msg) {
     const char* func_name = func_msg.name().c_str();
     cout << "Function: " << __func__ << " " << func_name << endl;
     cout << "Callback socket name: " << callback_socket_name << endl;
+    if (hw_binder_proxy_ == nullptr) {
+        cerr << "hw_binder_proxy_ is null. "<< endl;
+        return false;
+    }
     if (!strcmp(func_name, "haveSomeMemory")) {
         ::android::hardware::hidl_memory arg0;
         sp<::android::hidl::allocator::V1_0::IAllocator> ashmemAllocator = ::android::hidl::allocator::V1_0::IAllocator::getService("ashmem");
@@ -117,7 +162,8 @@
     return false;
 }
 
-bool FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest::VerifyResults(const FunctionSpecificationMessage& expected_result, const FunctionSpecificationMessage& actual_result) {
+bool FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest::VerifyResults(const FunctionSpecificationMessage& expected_result __attribute__((__unused__)),
+    const FunctionSpecificationMessage& actual_result __attribute__((__unused__))) {
     if (!strcmp(actual_result.name().c_str(), "haveSomeMemory")) {
         if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
         /* ERROR: TYPE_HIDL_MEMORY is not supported yet. */
@@ -131,16 +177,23 @@
 }
 
 extern "C" {
-android::vts::FuzzerBase* vts_func_4_android_hardware_tests_memory_V1_0_IMemoryTest_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest();
+android::vts::DriverBase* vts_func_4_android_hardware_tests_memory_V1_0_IMemoryTest_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest();
 }
 
-android::vts::FuzzerBase* vts_func_4_android_hardware_tests_memory_V1_0_IMemoryTest_with_arg(uint64_t hw_binder_proxy) {
-    ::android::hardware::tests::memory::V1_0::IMemoryTest* arg = reinterpret_cast<::android::hardware::tests::memory::V1_0::IMemoryTest*>(hw_binder_proxy);
-    android::vts::FuzzerBase* result =
+android::vts::DriverBase* vts_func_4_android_hardware_tests_memory_V1_0_IMemoryTest_with_arg(uint64_t hw_binder_proxy) {
+    ::android::hardware::tests::memory::V1_0::IMemoryTest* arg = nullptr;
+    if (hw_binder_proxy) {
+        arg = reinterpret_cast<::android::hardware::tests::memory::V1_0::IMemoryTest*>(hw_binder_proxy);
+    } else {
+        cout << " Creating DriverBase with null proxy." << endl;
+    }
+    android::vts::DriverBase* result =
         new android::vts::FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest(
             arg);
-    arg->decStrong(arg);
+    if (arg != nullptr) {
+        arg->decStrong(arg);
+    }
     return result;
 }
 
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/MemoryTest.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/MemoryTest.vts.h
index 0ac01e1..fe6e0ac 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/MemoryTest.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/MemoryTest.vts.h
@@ -10,8 +10,10 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
+
+#include <VtsDriverCommUtil.h>
 
 #include <android/hardware/tests/memory/1.0/IMemoryTest.h>
 #include <hidl/HidlSupport.h>
@@ -21,11 +23,33 @@
 using namespace android::hardware::tests::memory::V1_0;
 namespace android {
 namespace vts {
-class FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest : public FuzzerBase {
- public:
-    FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest() : FuzzerBase(HAL_HIDL), hw_binder_proxy_() {}
 
-    explicit FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest(::android::hardware::tests::memory::V1_0::IMemoryTest* hw_binder_proxy) : FuzzerBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
+class Vts_android_hardware_tests_memory_V1_0_IMemoryTest : public ::android::hardware::tests::memory::V1_0::IMemoryTest, public DriverCallbackBase {
+ public:
+    Vts_android_hardware_tests_memory_V1_0_IMemoryTest(const string& callback_socket_name)
+        : callback_socket_name_(callback_socket_name) {};
+
+    virtual ~Vts_android_hardware_tests_memory_V1_0_IMemoryTest() = default;
+
+    ::android::hardware::Return<void> haveSomeMemory(
+        const ::android::hardware::hidl_memory& arg0, std::function<void(const ::android::hardware::hidl_memory& arg0)>) override;
+
+    ::android::hardware::Return<void> fillMemory(
+        const ::android::hardware::hidl_memory& arg0,
+        uint8_t arg1) override;
+
+
+ private:
+    string callback_socket_name_;
+};
+
+sp<::android::hardware::tests::memory::V1_0::IMemoryTest> VtsFuzzerCreateVts_android_hardware_tests_memory_V1_0_IMemoryTest(const string& callback_socket_name);
+
+class FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest : public DriverBase {
+ public:
+    FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest() : DriverBase(HAL_HIDL), hw_binder_proxy_() {}
+
+    explicit FuzzerExtended_android_hardware_tests_memory_V1_0_IMemoryTest(::android::hardware::tests::memory::V1_0::IMemoryTest* hw_binder_proxy) : DriverBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
     uint64_t GetHidlInterfaceProxy() const {
         return reinterpret_cast<uintptr_t>(hw_binder_proxy_.get());
     }
@@ -42,8 +66,8 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_4_android_hardware_tests_memory_V1_0_IMemoryTest_();
-extern android::vts::FuzzerBase* vts_func_4_android_hardware_tests_memory_V1_0_IMemoryTest_with_arg(uint64_t hw_binder_proxy);
+extern android::vts::DriverBase* vts_func_4_android_hardware_tests_memory_V1_0_IMemoryTest_();
+extern android::vts::DriverBase* vts_func_4_android_hardware_tests_memory_V1_0_IMemoryTest_with_arg(uint64_t hw_binder_proxy);
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/Nfc.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/Nfc.driver.cpp
index 4af8ef8..fd31eaf 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/Nfc.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/Nfc.driver.cpp
@@ -33,6 +33,104 @@
     return true;
 }
 
+
+::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> Vts_android_hardware_nfc_V1_0_INfc::open(
+    const sp<::android::hardware::nfc::V1_0::INfcClientCallback>& arg0 __attribute__((__unused__))) {
+    cout << "open called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("open"));
+    callback_message.set_name("Vts_android_hardware_nfc_V1_0_INfc::open");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_HIDL_CALLBACK);
+    /* ERROR: TYPE_HIDL_CALLBACK is not supported yet. */
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast< ::android::hardware::nfc::V1_0::NfcStatus>(Random__android__hardware__nfc__V1_0__NfcStatus());
+}
+
+::android::hardware::Return<uint32_t> Vts_android_hardware_nfc_V1_0_INfc::write(
+    const ::android::hardware::hidl_vec<uint8_t>& arg0 __attribute__((__unused__))) {
+    cout << "write called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("write"));
+    callback_message.set_name("Vts_android_hardware_nfc_V1_0_INfc::write");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_VECTOR);
+    var_msg0->set_vector_size(arg0.size());
+    for (int i = 0; i < (int)arg0.size(); i++) {
+        auto *var_msg0_vector_i = var_msg0->add_vector_value();
+        var_msg0_vector_i->set_type(TYPE_SCALAR);
+        var_msg0_vector_i->set_scalar_type("uint8_t");
+        var_msg0_vector_i->mutable_scalar_value()->set_uint8_t(arg0[i]);
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast<uint32_t>(0);
+}
+
+::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> Vts_android_hardware_nfc_V1_0_INfc::coreInitialized(
+    const ::android::hardware::hidl_vec<uint8_t>& arg0 __attribute__((__unused__))) {
+    cout << "coreInitialized called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("coreInitialized"));
+    callback_message.set_name("Vts_android_hardware_nfc_V1_0_INfc::coreInitialized");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_VECTOR);
+    var_msg0->set_vector_size(arg0.size());
+    for (int i = 0; i < (int)arg0.size(); i++) {
+        auto *var_msg0_vector_i = var_msg0->add_vector_value();
+        var_msg0_vector_i->set_type(TYPE_SCALAR);
+        var_msg0_vector_i->set_scalar_type("uint8_t");
+        var_msg0_vector_i->mutable_scalar_value()->set_uint8_t(arg0[i]);
+    }
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast< ::android::hardware::nfc::V1_0::NfcStatus>(Random__android__hardware__nfc__V1_0__NfcStatus());
+}
+
+::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> Vts_android_hardware_nfc_V1_0_INfc::prediscover(
+    ) {
+    cout << "prediscover called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("prediscover"));
+    callback_message.set_name("Vts_android_hardware_nfc_V1_0_INfc::prediscover");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast< ::android::hardware::nfc::V1_0::NfcStatus>(Random__android__hardware__nfc__V1_0__NfcStatus());
+}
+
+::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> Vts_android_hardware_nfc_V1_0_INfc::close(
+    ) {
+    cout << "close called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("close"));
+    callback_message.set_name("Vts_android_hardware_nfc_V1_0_INfc::close");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast< ::android::hardware::nfc::V1_0::NfcStatus>(Random__android__hardware__nfc__V1_0__NfcStatus());
+}
+
+::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> Vts_android_hardware_nfc_V1_0_INfc::controlGranted(
+    ) {
+    cout << "controlGranted called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("controlGranted"));
+    callback_message.set_name("Vts_android_hardware_nfc_V1_0_INfc::controlGranted");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast< ::android::hardware::nfc::V1_0::NfcStatus>(Random__android__hardware__nfc__V1_0__NfcStatus());
+}
+
+::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> Vts_android_hardware_nfc_V1_0_INfc::powerCycle(
+    ) {
+    cout << "powerCycle called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("powerCycle"));
+    callback_message.set_name("Vts_android_hardware_nfc_V1_0_INfc::powerCycle");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast< ::android::hardware::nfc::V1_0::NfcStatus>(Random__android__hardware__nfc__V1_0__NfcStatus());
+}
+
+sp<::android::hardware::nfc::V1_0::INfc> VtsFuzzerCreateVts_android_hardware_nfc_V1_0_INfc(const string& callback_socket_name) {
+    static sp<::android::hardware::nfc::V1_0::INfc> result;
+    result = new Vts_android_hardware_nfc_V1_0_INfc(callback_socket_name);
+    return result;
+}
+
 bool FuzzerExtended_android_hardware_nfc_V1_0_INfc::Fuzz(
     FunctionSpecificationMessage* /*func_msg*/,
     void** /*result*/, const string& /*callback_socket_name*/) {
@@ -44,10 +142,17 @@
     cerr << "attribute not found" << endl;
     return false;
 }
-bool FuzzerExtended_android_hardware_nfc_V1_0_INfc::CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg) {
+bool FuzzerExtended_android_hardware_nfc_V1_0_INfc::CallFunction(
+    const FunctionSpecificationMessage& func_msg,
+    const string& callback_socket_name __attribute__((__unused__)),
+    FunctionSpecificationMessage* result_msg) {
     const char* func_name = func_msg.name().c_str();
     cout << "Function: " << __func__ << " " << func_name << endl;
     cout << "Callback socket name: " << callback_socket_name << endl;
+    if (hw_binder_proxy_ == nullptr) {
+        cerr << "hw_binder_proxy_ is null. "<< endl;
+        return false;
+    }
     if (!strcmp(func_name, "open")) {
         sp<::android::hardware::nfc::V1_0::INfcClientCallback> arg0;
         arg0 = VtsFuzzerCreateVts_android_hardware_nfc_V1_0_INfcClientCallback(callback_socket_name);
@@ -184,7 +289,8 @@
     return false;
 }
 
-bool FuzzerExtended_android_hardware_nfc_V1_0_INfc::VerifyResults(const FunctionSpecificationMessage& expected_result, const FunctionSpecificationMessage& actual_result) {
+bool FuzzerExtended_android_hardware_nfc_V1_0_INfc::VerifyResults(const FunctionSpecificationMessage& expected_result __attribute__((__unused__)),
+    const FunctionSpecificationMessage& actual_result __attribute__((__unused__))) {
     if (!strcmp(actual_result.name().c_str(), "open")) {
         if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
         if(!Verify__android__hardware__nfc__V1_0__NfcStatus(expected_result.return_type_hidl(0), actual_result.return_type_hidl(0))) { return false; }
@@ -224,16 +330,23 @@
 }
 
 extern "C" {
-android::vts::FuzzerBase* vts_func_4_android_hardware_nfc_V1_0_INfc_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_android_hardware_nfc_V1_0_INfc();
+android::vts::DriverBase* vts_func_4_android_hardware_nfc_V1_0_INfc_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_android_hardware_nfc_V1_0_INfc();
 }
 
-android::vts::FuzzerBase* vts_func_4_android_hardware_nfc_V1_0_INfc_with_arg(uint64_t hw_binder_proxy) {
-    ::android::hardware::nfc::V1_0::INfc* arg = reinterpret_cast<::android::hardware::nfc::V1_0::INfc*>(hw_binder_proxy);
-    android::vts::FuzzerBase* result =
+android::vts::DriverBase* vts_func_4_android_hardware_nfc_V1_0_INfc_with_arg(uint64_t hw_binder_proxy) {
+    ::android::hardware::nfc::V1_0::INfc* arg = nullptr;
+    if (hw_binder_proxy) {
+        arg = reinterpret_cast<::android::hardware::nfc::V1_0::INfc*>(hw_binder_proxy);
+    } else {
+        cout << " Creating DriverBase with null proxy." << endl;
+    }
+    android::vts::DriverBase* result =
         new android::vts::FuzzerExtended_android_hardware_nfc_V1_0_INfc(
             arg);
-    arg->decStrong(arg);
+    if (arg != nullptr) {
+        arg->decStrong(arg);
+    }
     return result;
 }
 
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/Nfc.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/Nfc.vts.h
index dcfad76..499528b 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/Nfc.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/Nfc.vts.h
@@ -10,8 +10,10 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
+
+#include <VtsDriverCommUtil.h>
 
 #include <android/hardware/nfc/1.0/INfc.h>
 #include <hidl/HidlSupport.h>
@@ -25,11 +27,47 @@
 using namespace android::hardware::nfc::V1_0;
 namespace android {
 namespace vts {
-class FuzzerExtended_android_hardware_nfc_V1_0_INfc : public FuzzerBase {
- public:
-    FuzzerExtended_android_hardware_nfc_V1_0_INfc() : FuzzerBase(HAL_HIDL), hw_binder_proxy_() {}
 
-    explicit FuzzerExtended_android_hardware_nfc_V1_0_INfc(::android::hardware::nfc::V1_0::INfc* hw_binder_proxy) : FuzzerBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
+class Vts_android_hardware_nfc_V1_0_INfc : public ::android::hardware::nfc::V1_0::INfc, public DriverCallbackBase {
+ public:
+    Vts_android_hardware_nfc_V1_0_INfc(const string& callback_socket_name)
+        : callback_socket_name_(callback_socket_name) {};
+
+    virtual ~Vts_android_hardware_nfc_V1_0_INfc() = default;
+
+    ::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> open(
+        const sp<::android::hardware::nfc::V1_0::INfcClientCallback>& arg0) override;
+
+    ::android::hardware::Return<uint32_t> write(
+        const ::android::hardware::hidl_vec<uint8_t>& arg0) override;
+
+    ::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> coreInitialized(
+        const ::android::hardware::hidl_vec<uint8_t>& arg0) override;
+
+    ::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> prediscover(
+        ) override;
+
+    ::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> close(
+        ) override;
+
+    ::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> controlGranted(
+        ) override;
+
+    ::android::hardware::Return<::android::hardware::nfc::V1_0::NfcStatus> powerCycle(
+        ) override;
+
+
+ private:
+    string callback_socket_name_;
+};
+
+sp<::android::hardware::nfc::V1_0::INfc> VtsFuzzerCreateVts_android_hardware_nfc_V1_0_INfc(const string& callback_socket_name);
+
+class FuzzerExtended_android_hardware_nfc_V1_0_INfc : public DriverBase {
+ public:
+    FuzzerExtended_android_hardware_nfc_V1_0_INfc() : DriverBase(HAL_HIDL), hw_binder_proxy_() {}
+
+    explicit FuzzerExtended_android_hardware_nfc_V1_0_INfc(::android::hardware::nfc::V1_0::INfc* hw_binder_proxy) : DriverBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
     uint64_t GetHidlInterfaceProxy() const {
         return reinterpret_cast<uintptr_t>(hw_binder_proxy_.get());
     }
@@ -46,8 +84,8 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_4_android_hardware_nfc_V1_0_INfc_();
-extern android::vts::FuzzerBase* vts_func_4_android_hardware_nfc_V1_0_INfc_with_arg(uint64_t hw_binder_proxy);
+extern android::vts::DriverBase* vts_func_4_android_hardware_nfc_V1_0_INfc_();
+extern android::vts::DriverBase* vts_func_4_android_hardware_nfc_V1_0_INfc_with_arg(uint64_t hw_binder_proxy);
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/NfcClientCallback.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/NfcClientCallback.driver.cpp
index 65056c8..fd737d0 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/NfcClientCallback.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/NfcClientCallback.driver.cpp
@@ -14,10 +14,28 @@
 using namespace android::hardware::nfc::V1_0;
 namespace android {
 namespace vts {
+bool FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback::GetService(bool get_stub, const char* service_name) {
+    static bool initialized = false;
+    if (!initialized) {
+        cout << "[agent:hal] HIDL getService" << endl;
+        if (service_name) {
+          cout << "  - service name: " << service_name << endl;
+        }
+        hw_binder_proxy_ = ::android::hardware::nfc::V1_0::INfcClientCallback::getService(service_name, get_stub);
+        if (hw_binder_proxy_ == nullptr) {
+            cerr << "getService() returned a null pointer." << endl;
+            return false;
+        }
+        cout << "[agent:hal] hw_binder_proxy_ = " << hw_binder_proxy_.get() << endl;
+        initialized = true;
+    }
+    return true;
+}
+
 
 ::android::hardware::Return<void> Vts_android_hardware_nfc_V1_0_INfcClientCallback::sendEvent(
-    ::android::hardware::nfc::V1_0::NfcEvent arg0,
-    ::android::hardware::nfc::V1_0::NfcStatus arg1) {
+    ::android::hardware::nfc::V1_0::NfcEvent arg0 __attribute__((__unused__)),
+    ::android::hardware::nfc::V1_0::NfcStatus arg1 __attribute__((__unused__))) {
     cout << "sendEvent called" << endl;
     AndroidSystemCallbackRequestMessage callback_message;
     callback_message.set_id(GetCallbackID("sendEvent"));
@@ -33,7 +51,7 @@
 }
 
 ::android::hardware::Return<void> Vts_android_hardware_nfc_V1_0_INfcClientCallback::sendData(
-    const ::android::hardware::hidl_vec<uint8_t>& arg0) {
+    const ::android::hardware::hidl_vec<uint8_t>& arg0 __attribute__((__unused__))) {
     cout << "sendData called" << endl;
     AndroidSystemCallbackRequestMessage callback_message;
     callback_message.set_id(GetCallbackID("sendData"));
@@ -57,5 +75,105 @@
     return result;
 }
 
+bool FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback::Fuzz(
+    FunctionSpecificationMessage* /*func_msg*/,
+    void** /*result*/, const string& /*callback_socket_name*/) {
+    return true;
+}
+bool FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback::GetAttribute(
+    FunctionSpecificationMessage* /*func_msg*/,
+    void** /*result*/) {
+    cerr << "attribute not found" << endl;
+    return false;
+}
+bool FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback::CallFunction(
+    const FunctionSpecificationMessage& func_msg,
+    const string& callback_socket_name __attribute__((__unused__)),
+    FunctionSpecificationMessage* result_msg) {
+    const char* func_name = func_msg.name().c_str();
+    cout << "Function: " << __func__ << " " << func_name << endl;
+    cout << "Callback socket name: " << callback_socket_name << endl;
+    if (hw_binder_proxy_ == nullptr) {
+        cerr << "hw_binder_proxy_ is null. "<< endl;
+        return false;
+    }
+    if (!strcmp(func_name, "sendEvent")) {
+        ::android::hardware::nfc::V1_0::NfcEvent arg0;
+        arg0 = EnumValue__android__hardware__nfc__V1_0__NfcEvent(func_msg.arg(0).scalar_value());
+        ::android::hardware::nfc::V1_0::NfcStatus arg1;
+        arg1 = EnumValue__android__hardware__nfc__V1_0__NfcStatus(func_msg.arg(1).scalar_value());
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->sendEvent(arg0, arg1);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("sendEvent");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "sendData")) {
+         ::android::hardware::hidl_vec<uint8_t> arg0;
+        arg0.resize(func_msg.arg(0).vector_value_size());
+        for (int i = 0; i <func_msg.arg(0).vector_value_size(); i++) {
+            arg0[i] = func_msg.arg(0).vector_value(i).scalar_value().uint8_t();
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->sendData(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("sendData");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "notifySyspropsChanged")) {
+        cout << "Call notifySyspropsChanged" << endl;
+        hw_binder_proxy_->notifySyspropsChanged();
+        result_msg->set_name("notifySyspropsChanged");
+        cout << "called" << endl;
+        return true;
+    }
+    return false;
+}
+
+bool FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback::VerifyResults(const FunctionSpecificationMessage& expected_result __attribute__((__unused__)),
+    const FunctionSpecificationMessage& actual_result __attribute__((__unused__))) {
+    if (!strcmp(actual_result.name().c_str(), "sendEvent")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "sendData")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    return false;
+}
+
+extern "C" {
+android::vts::DriverBase* vts_func_4_android_hardware_nfc_V1_0_INfcClientCallback_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback();
+}
+
+android::vts::DriverBase* vts_func_4_android_hardware_nfc_V1_0_INfcClientCallback_with_arg(uint64_t hw_binder_proxy) {
+    ::android::hardware::nfc::V1_0::INfcClientCallback* arg = nullptr;
+    if (hw_binder_proxy) {
+        arg = reinterpret_cast<::android::hardware::nfc::V1_0::INfcClientCallback*>(hw_binder_proxy);
+    } else {
+        cout << " Creating DriverBase with null proxy." << endl;
+    }
+    android::vts::DriverBase* result =
+        new android::vts::FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback(
+            arg);
+    if (arg != nullptr) {
+        arg->decStrong(arg);
+    }
+    return result;
+}
+
+}
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/NfcClientCallback.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/NfcClientCallback.vts.h
index 6050c98..b8457b1 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/NfcClientCallback.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/NfcClientCallback.vts.h
@@ -10,8 +10,8 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
 
 #include <VtsDriverCommUtil.h>
 
@@ -26,7 +26,7 @@
 namespace android {
 namespace vts {
 
-class Vts_android_hardware_nfc_V1_0_INfcClientCallback : public ::android::hardware::nfc::V1_0::INfcClientCallback, public FuzzerCallbackBase {
+class Vts_android_hardware_nfc_V1_0_INfcClientCallback : public ::android::hardware::nfc::V1_0::INfcClientCallback, public DriverCallbackBase {
  public:
     Vts_android_hardware_nfc_V1_0_INfcClientCallback(const string& callback_socket_name)
         : callback_socket_name_(callback_socket_name) {};
@@ -47,8 +47,30 @@
 
 sp<::android::hardware::nfc::V1_0::INfcClientCallback> VtsFuzzerCreateVts_android_hardware_nfc_V1_0_INfcClientCallback(const string& callback_socket_name);
 
+class FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback : public DriverBase {
+ public:
+    FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback() : DriverBase(HAL_HIDL), hw_binder_proxy_() {}
+
+    explicit FuzzerExtended_android_hardware_nfc_V1_0_INfcClientCallback(::android::hardware::nfc::V1_0::INfcClientCallback* hw_binder_proxy) : DriverBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
+    uint64_t GetHidlInterfaceProxy() const {
+        return reinterpret_cast<uintptr_t>(hw_binder_proxy_.get());
+    }
+ protected:
+    bool Fuzz(FunctionSpecificationMessage* func_msg, void** result, const string& callback_socket_name);
+    bool CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg);
+    bool VerifyResults(const FunctionSpecificationMessage& expected_result, const FunctionSpecificationMessage& actual_result);
+    bool GetAttribute(FunctionSpecificationMessage* func_msg, void** result);
+    bool GetService(bool get_stub, const char* service_name);
+
+ private:
+    sp<::android::hardware::nfc::V1_0::INfcClientCallback> hw_binder_proxy_;
+};
 
 
+extern "C" {
+extern android::vts::DriverBase* vts_func_4_android_hardware_nfc_V1_0_INfcClientCallback_();
+extern android::vts::DriverBase* vts_func_4_android_hardware_nfc_V1_0_INfcClientCallback_with_arg(uint64_t hw_binder_proxy);
+}
 }  // namespace vts
 }  // namespace android
 #endif
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/TestMsgQ.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/TestMsgQ.driver.cpp
index baebc4c..076e614 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/TestMsgQ.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/TestMsgQ.driver.cpp
@@ -16,18 +16,18 @@
 ::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits EnumValue__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(const ScalarDataValueMessage& arg) {
     return (::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits) arg.uint32_t();
 }
-::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits Random__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits() {
+uint32_t Random__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits() {
     uint32_t choice = (uint32_t) rand() / 2;
-    if (choice == (uint32_t) 1) return ::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits::FMQ_NOT_EMPTY;
-    if (choice == (uint32_t) 2) return ::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits::FMQ_NOT_FULL;
-    return ::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits::FMQ_NOT_EMPTY;
+    if (choice == (uint32_t) 1) return static_cast<uint32_t>(::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits::FMQ_NOT_EMPTY);
+    if (choice == (uint32_t) 2) return static_cast<uint32_t>(::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits::FMQ_NOT_FULL);
+    return static_cast<uint32_t>(::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits::FMQ_NOT_EMPTY);
 }
-bool Verify__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result){
+bool Verify__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(const VariableSpecificationMessage& expected_result __attribute__((__unused__)), const VariableSpecificationMessage& actual_result __attribute__((__unused__))){
     if (actual_result.scalar_value().uint32_t() != expected_result.scalar_value().uint32_t()) { return false; }
     return true;
 }
 
-void SetResult__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(VariableSpecificationMessage* result_msg, ::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits result_value){
+void SetResult__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(VariableSpecificationMessage* result_msg, ::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits result_value __attribute__((__unused__))){
     result_msg->set_type(TYPE_ENUM);
     result_msg->set_scalar_type("uint32_t");
     result_msg->mutable_scalar_value()->set_uint32_t(static_cast<uint32_t>(result_value));
@@ -51,6 +51,140 @@
     return true;
 }
 
+
+::android::hardware::Return<void> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::configureFmqSyncReadWrite(
+    std::function<void(bool arg0,const ::android::hardware::MQDescriptorSync<uint16_t>& arg1)>) {
+    cout << "configureFmqSyncReadWrite called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("configureFmqSyncReadWrite"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::configureFmqSyncReadWrite");
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::getFmqUnsyncWrite(
+    bool arg0 __attribute__((__unused__)), std::function<void(bool arg0,const ::android::hardware::MQDescriptorUnsync<uint16_t>& arg1)>) {
+    cout << "getFmqUnsyncWrite called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("getFmqUnsyncWrite"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::getFmqUnsyncWrite");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("bool_t");
+    var_msg0->mutable_scalar_value()->set_bool_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<bool> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestWriteFmqSync(
+    int32_t arg0 __attribute__((__unused__))) {
+    cout << "requestWriteFmqSync called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("requestWriteFmqSync"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestWriteFmqSync");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int32_t");
+    var_msg0->mutable_scalar_value()->set_int32_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast<bool>(0);
+}
+
+::android::hardware::Return<bool> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestReadFmqSync(
+    int32_t arg0 __attribute__((__unused__))) {
+    cout << "requestReadFmqSync called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("requestReadFmqSync"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestReadFmqSync");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int32_t");
+    var_msg0->mutable_scalar_value()->set_int32_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast<bool>(0);
+}
+
+::android::hardware::Return<bool> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestWriteFmqUnsync(
+    int32_t arg0 __attribute__((__unused__))) {
+    cout << "requestWriteFmqUnsync called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("requestWriteFmqUnsync"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestWriteFmqUnsync");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int32_t");
+    var_msg0->mutable_scalar_value()->set_int32_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast<bool>(0);
+}
+
+::android::hardware::Return<bool> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestReadFmqUnsync(
+    int32_t arg0 __attribute__((__unused__))) {
+    cout << "requestReadFmqUnsync called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("requestReadFmqUnsync"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestReadFmqUnsync");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int32_t");
+    var_msg0->mutable_scalar_value()->set_int32_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return static_cast<bool>(0);
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestBlockingRead(
+    int32_t arg0 __attribute__((__unused__))) {
+    cout << "requestBlockingRead called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("requestBlockingRead"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestBlockingRead");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int32_t");
+    var_msg0->mutable_scalar_value()->set_int32_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestBlockingReadDefaultEventFlagBits(
+    int32_t arg0 __attribute__((__unused__))) {
+    cout << "requestBlockingReadDefaultEventFlagBits called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("requestBlockingReadDefaultEventFlagBits"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestBlockingReadDefaultEventFlagBits");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int32_t");
+    var_msg0->mutable_scalar_value()->set_int32_t(arg0);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+::android::hardware::Return<void> Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestBlockingReadRepeat(
+    int32_t arg0 __attribute__((__unused__)),
+    int32_t arg1 __attribute__((__unused__))) {
+    cout << "requestBlockingReadRepeat called" << endl;
+    AndroidSystemCallbackRequestMessage callback_message;
+    callback_message.set_id(GetCallbackID("requestBlockingReadRepeat"));
+    callback_message.set_name("Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ::requestBlockingReadRepeat");
+    VariableSpecificationMessage* var_msg0 = callback_message.add_arg();
+    var_msg0->set_type(TYPE_SCALAR);
+    var_msg0->set_scalar_type("int32_t");
+    var_msg0->mutable_scalar_value()->set_int32_t(arg0);
+    VariableSpecificationMessage* var_msg1 = callback_message.add_arg();
+    var_msg1->set_type(TYPE_SCALAR);
+    var_msg1->set_scalar_type("int32_t");
+    var_msg1->mutable_scalar_value()->set_int32_t(arg1);
+    RpcCallToAgent(callback_message, callback_socket_name_);
+    return ::android::hardware::Void();
+}
+
+sp<::android::hardware::tests::msgq::V1_0::ITestMsgQ> VtsFuzzerCreateVts_android_hardware_tests_msgq_V1_0_ITestMsgQ(const string& callback_socket_name) {
+    static sp<::android::hardware::tests::msgq::V1_0::ITestMsgQ> result;
+    result = new Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ(callback_socket_name);
+    return result;
+}
+
 bool FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ::Fuzz(
     FunctionSpecificationMessage* /*func_msg*/,
     void** /*result*/, const string& /*callback_socket_name*/) {
@@ -62,10 +196,17 @@
     cerr << "attribute not found" << endl;
     return false;
 }
-bool FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ::CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg) {
+bool FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ::CallFunction(
+    const FunctionSpecificationMessage& func_msg,
+    const string& callback_socket_name __attribute__((__unused__)),
+    FunctionSpecificationMessage* result_msg) {
     const char* func_name = func_msg.name().c_str();
     cout << "Function: " << __func__ << " " << func_name << endl;
     cout << "Callback socket name: " << callback_socket_name << endl;
+    if (hw_binder_proxy_ == nullptr) {
+        cerr << "hw_binder_proxy_ is null. "<< endl;
+        return false;
+    }
     if (!strcmp(func_name, "configureFmqSyncReadWrite")) {
         VtsMeasurement vts_measurement;
         vts_measurement.Start();
@@ -248,7 +389,8 @@
     return false;
 }
 
-bool FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ::VerifyResults(const FunctionSpecificationMessage& expected_result, const FunctionSpecificationMessage& actual_result) {
+bool FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ::VerifyResults(const FunctionSpecificationMessage& expected_result __attribute__((__unused__)),
+    const FunctionSpecificationMessage& actual_result __attribute__((__unused__))) {
     if (!strcmp(actual_result.name().c_str(), "configureFmqSyncReadWrite")) {
         if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
         if (actual_result.return_type_hidl(0).scalar_value().bool_t() != expected_result.return_type_hidl(0).scalar_value().bool_t()) { return false; }
@@ -297,16 +439,23 @@
 }
 
 extern "C" {
-android::vts::FuzzerBase* vts_func_4_android_hardware_tests_msgq_V1_0_ITestMsgQ_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ();
+android::vts::DriverBase* vts_func_4_android_hardware_tests_msgq_V1_0_ITestMsgQ_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ();
 }
 
-android::vts::FuzzerBase* vts_func_4_android_hardware_tests_msgq_V1_0_ITestMsgQ_with_arg(uint64_t hw_binder_proxy) {
-    ::android::hardware::tests::msgq::V1_0::ITestMsgQ* arg = reinterpret_cast<::android::hardware::tests::msgq::V1_0::ITestMsgQ*>(hw_binder_proxy);
-    android::vts::FuzzerBase* result =
+android::vts::DriverBase* vts_func_4_android_hardware_tests_msgq_V1_0_ITestMsgQ_with_arg(uint64_t hw_binder_proxy) {
+    ::android::hardware::tests::msgq::V1_0::ITestMsgQ* arg = nullptr;
+    if (hw_binder_proxy) {
+        arg = reinterpret_cast<::android::hardware::tests::msgq::V1_0::ITestMsgQ*>(hw_binder_proxy);
+    } else {
+        cout << " Creating DriverBase with null proxy." << endl;
+    }
+    android::vts::DriverBase* result =
         new android::vts::FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ(
             arg);
-    arg->decStrong(arg);
+    if (arg != nullptr) {
+        arg->decStrong(arg);
+    }
     return result;
 }
 
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/TestMsgQ.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/TestMsgQ.vts.h
index 7dcbea9..6b8cf3c 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/TestMsgQ.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/TestMsgQ.vts.h
@@ -10,8 +10,10 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
+
+#include <VtsDriverCommUtil.h>
 
 #include <android/hardware/tests/msgq/1.0/ITestMsgQ.h>
 #include <hidl/HidlSupport.h>
@@ -22,14 +24,57 @@
 namespace android {
 namespace vts {
 ::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits EnumValue__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(const ScalarDataValueMessage& arg);
-::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits Random__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits();
+uint32_t Random__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits();
 bool Verify__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result);
 void SetResult__android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(VariableSpecificationMessage* result_msg, ::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits result_value);
-class FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ : public FuzzerBase {
- public:
-    FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ() : FuzzerBase(HAL_HIDL), hw_binder_proxy_() {}
 
-    explicit FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ(::android::hardware::tests::msgq::V1_0::ITestMsgQ* hw_binder_proxy) : FuzzerBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
+class Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ : public ::android::hardware::tests::msgq::V1_0::ITestMsgQ, public DriverCallbackBase {
+ public:
+    Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ(const string& callback_socket_name)
+        : callback_socket_name_(callback_socket_name) {};
+
+    virtual ~Vts_android_hardware_tests_msgq_V1_0_ITestMsgQ() = default;
+
+    ::android::hardware::Return<void> configureFmqSyncReadWrite(
+        std::function<void(bool arg0,const ::android::hardware::MQDescriptorSync<uint16_t>& arg1)>) override;
+
+    ::android::hardware::Return<void> getFmqUnsyncWrite(
+        bool arg0, std::function<void(bool arg0,const ::android::hardware::MQDescriptorUnsync<uint16_t>& arg1)>) override;
+
+    ::android::hardware::Return<bool> requestWriteFmqSync(
+        int32_t arg0) override;
+
+    ::android::hardware::Return<bool> requestReadFmqSync(
+        int32_t arg0) override;
+
+    ::android::hardware::Return<bool> requestWriteFmqUnsync(
+        int32_t arg0) override;
+
+    ::android::hardware::Return<bool> requestReadFmqUnsync(
+        int32_t arg0) override;
+
+    ::android::hardware::Return<void> requestBlockingRead(
+        int32_t arg0) override;
+
+    ::android::hardware::Return<void> requestBlockingReadDefaultEventFlagBits(
+        int32_t arg0) override;
+
+    ::android::hardware::Return<void> requestBlockingReadRepeat(
+        int32_t arg0,
+        int32_t arg1) override;
+
+
+ private:
+    string callback_socket_name_;
+};
+
+sp<::android::hardware::tests::msgq::V1_0::ITestMsgQ> VtsFuzzerCreateVts_android_hardware_tests_msgq_V1_0_ITestMsgQ(const string& callback_socket_name);
+
+class FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ : public DriverBase {
+ public:
+    FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ() : DriverBase(HAL_HIDL), hw_binder_proxy_() {}
+
+    explicit FuzzerExtended_android_hardware_tests_msgq_V1_0_ITestMsgQ(::android::hardware::tests::msgq::V1_0::ITestMsgQ* hw_binder_proxy) : DriverBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
     uint64_t GetHidlInterfaceProxy() const {
         return reinterpret_cast<uintptr_t>(hw_binder_proxy_.get());
     }
@@ -46,8 +91,8 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_4_android_hardware_tests_msgq_V1_0_ITestMsgQ_();
-extern android::vts::FuzzerBase* vts_func_4_android_hardware_tests_msgq_V1_0_ITestMsgQ_with_arg(uint64_t hw_binder_proxy);
+extern android::vts::DriverBase* vts_func_4_android_hardware_tests_msgq_V1_0_ITestMsgQ_();
+extern android::vts::DriverBase* vts_func_4_android_hardware_tests_msgq_V1_0_ITestMsgQ_with_arg(uint64_t hw_binder_proxy);
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/WifiHalV1.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/WifiHalV1.driver.cpp
index fdbd63f..7b8bfc7 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/WifiHalV1.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/WifiHalV1.driver.cpp
@@ -40,8 +40,8 @@
     return true;
 }
 extern "C" {
-android::vts::FuzzerBase* vts_func_3_5_V1_0_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_wifi();
+android::vts::DriverBase* vts_func_3_5_V1_0_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_wifi();
 }
 
 }
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/libcV1.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/libcV1.driver.cpp
index 023ebc6..c5f72d6 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/libcV1.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/libcV1.driver.cpp
@@ -208,8 +208,8 @@
     return true;
 }
 extern "C" {
-android::vts::FuzzerBase* vts_func_11_1002_V1_0_() {
-    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_libc();
+android::vts::DriverBase* vts_func_11_1002_V1_0_() {
+    return (android::vts::DriverBase*) new android::vts::FuzzerExtended_libc();
 }
 
 }
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1.vts.h
index 63590d5..b077a6a 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1.vts.h
@@ -12,14 +12,14 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
 
 namespace android {
 namespace vts {
-class FuzzerExtended_bluetooth_module_t : public FuzzerBase {
+class FuzzerExtended_bluetooth_module_t : public DriverBase {
  public:
-    FuzzerExtended_bluetooth_module_t() : FuzzerBase(HAL_CONVENTIONAL) {}
+    FuzzerExtended_bluetooth_module_t() : DriverBase(HAL_CONVENTIONAL) {}
  protected:
     bool Fuzz(FunctionSpecificationMessage* func_msg, void** result, const string& callback_socket_name);
     bool CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg);
@@ -30,7 +30,7 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_1_7_V1_0_();
+extern android::vts::DriverBase* vts_func_1_7_V1_0_();
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1bt_interface_t.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1bt_interface_t.vts.h
index 6078b70..7864fb7 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1bt_interface_t.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1bt_interface_t.vts.h
@@ -12,14 +12,14 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
 
 namespace android {
 namespace vts {
-class FuzzerExtended_bt_interface_t : public FuzzerBase {
+class FuzzerExtended_bt_interface_t : public DriverBase {
  public:
-    FuzzerExtended_bt_interface_t() : FuzzerBase(HAL_CONVENTIONAL_SUBMODULE) {}
+    FuzzerExtended_bt_interface_t() : DriverBase(HAL_CONVENTIONAL_SUBMODULE) {}
  protected:
     bool Fuzz(FunctionSpecificationMessage* func_msg, void** result, const string& callback_socket_name);
     bool CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg);
@@ -35,7 +35,7 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_2_7_V1_0_();
+extern android::vts::DriverBase* vts_func_2_7_V1_0_();
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/camera/2.1/CameraHalV2.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/camera/2.1/CameraHalV2.vts.h
index e1d9deb..daec824 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/camera/2.1/CameraHalV2.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/camera/2.1/CameraHalV2.vts.h
@@ -13,14 +13,14 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
 
 namespace android {
 namespace vts {
-class FuzzerExtended_camera_module_t : public FuzzerBase {
+class FuzzerExtended_camera_module_t : public DriverBase {
  public:
-    FuzzerExtended_camera_module_t() : FuzzerBase(HAL_CONVENTIONAL) {}
+    FuzzerExtended_camera_module_t() : DriverBase(HAL_CONVENTIONAL) {}
  protected:
     bool Fuzz(FunctionSpecificationMessage* func_msg, void** result, const string& callback_socket_name);
     bool CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg);
@@ -39,7 +39,7 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_1_2_V2_1_();
+extern android::vts::DriverBase* vts_func_1_2_V2_1_();
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/wifi/1.0/WifiHalV1.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/wifi/1.0/WifiHalV1.vts.h
index 4c803f6..cb7784e 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/wifi/1.0/WifiHalV1.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/hal/conventional/wifi/1.0/WifiHalV1.vts.h
@@ -12,14 +12,14 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
 
 namespace android {
 namespace vts {
-class FuzzerExtended_wifi : public FuzzerBase {
+class FuzzerExtended_wifi : public DriverBase {
  public:
-    FuzzerExtended_wifi() : FuzzerBase(HAL_LEGACY) {}
+    FuzzerExtended_wifi() : DriverBase(HAL_LEGACY) {}
  protected:
     bool Fuzz(FunctionSpecificationMessage* func_msg, void** result, const string& callback_socket_name);
     bool CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg);
@@ -30,7 +30,7 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_3_5_V1_0_();
+extern android::vts::DriverBase* vts_func_3_5_V1_0_();
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/lib/ndk/bionic/1.0/libcV1.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/lib/ndk/bionic/1.0/libcV1.vts.h
index 888f274..b4bd18f 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/lib/ndk/bionic/1.0/libcV1.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/test/vts/specification/lib/ndk/bionic/1.0/libcV1.vts.h
@@ -14,14 +14,14 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
 
 namespace android {
 namespace vts {
-class FuzzerExtended_libc : public FuzzerBase {
+class FuzzerExtended_libc : public DriverBase {
  public:
-    FuzzerExtended_libc() : FuzzerBase(LIB_SHARED) {}
+    FuzzerExtended_libc() : DriverBase(LIB_SHARED) {}
  protected:
     bool Fuzz(FunctionSpecificationMessage* func_msg, void** result, const string& callback_socket_name);
     bool CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg);
@@ -32,7 +32,7 @@
 
 
 extern "C" {
-extern android::vts::FuzzerBase* vts_func_11_1002_V1_0_();
+extern android::vts::DriverBase* vts_func_11_1002_V1_0_();
 }
 }  // namespace vts
 }  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/types.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/types.driver.cpp
index 15a4227..e9d49da 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/types.driver.cpp
+++ b/compilation_tools/vtsc/test/golden/DRIVER/types.driver.cpp
@@ -15,23 +15,23 @@
 ::android::hardware::nfc::V1_0::NfcEvent EnumValue__android__hardware__nfc__V1_0__NfcEvent(const ScalarDataValueMessage& arg) {
     return (::android::hardware::nfc::V1_0::NfcEvent) arg.uint32_t();
 }
-::android::hardware::nfc::V1_0::NfcEvent Random__android__hardware__nfc__V1_0__NfcEvent() {
+uint32_t Random__android__hardware__nfc__V1_0__NfcEvent() {
     uint32_t choice = (uint32_t) rand() / 7;
-    if (choice == (uint32_t) 0) return ::android::hardware::nfc::V1_0::NfcEvent::OPEN_CPLT;
-    if (choice == (uint32_t) 1) return ::android::hardware::nfc::V1_0::NfcEvent::CLOSE_CPLT;
-    if (choice == (uint32_t) 2) return ::android::hardware::nfc::V1_0::NfcEvent::POST_INIT_CPLT;
-    if (choice == (uint32_t) 3) return ::android::hardware::nfc::V1_0::NfcEvent::PRE_DISCOVER_CPLT;
-    if (choice == (uint32_t) 4) return ::android::hardware::nfc::V1_0::NfcEvent::REQUEST_CONTROL;
-    if (choice == (uint32_t) 5) return ::android::hardware::nfc::V1_0::NfcEvent::RELEASE_CONTROL;
-    if (choice == (uint32_t) 6) return ::android::hardware::nfc::V1_0::NfcEvent::ERROR;
-    return ::android::hardware::nfc::V1_0::NfcEvent::OPEN_CPLT;
+    if (choice == (uint32_t) 0) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcEvent::OPEN_CPLT);
+    if (choice == (uint32_t) 1) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcEvent::CLOSE_CPLT);
+    if (choice == (uint32_t) 2) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcEvent::POST_INIT_CPLT);
+    if (choice == (uint32_t) 3) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcEvent::PRE_DISCOVER_CPLT);
+    if (choice == (uint32_t) 4) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcEvent::REQUEST_CONTROL);
+    if (choice == (uint32_t) 5) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcEvent::RELEASE_CONTROL);
+    if (choice == (uint32_t) 6) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcEvent::ERROR);
+    return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcEvent::OPEN_CPLT);
 }
-bool Verify__android__hardware__nfc__V1_0__NfcEvent(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result){
+bool Verify__android__hardware__nfc__V1_0__NfcEvent(const VariableSpecificationMessage& expected_result __attribute__((__unused__)), const VariableSpecificationMessage& actual_result __attribute__((__unused__))){
     if (actual_result.scalar_value().uint32_t() != expected_result.scalar_value().uint32_t()) { return false; }
     return true;
 }
 
-void SetResult__android__hardware__nfc__V1_0__NfcEvent(VariableSpecificationMessage* result_msg, ::android::hardware::nfc::V1_0::NfcEvent result_value){
+void SetResult__android__hardware__nfc__V1_0__NfcEvent(VariableSpecificationMessage* result_msg, ::android::hardware::nfc::V1_0::NfcEvent result_value __attribute__((__unused__))){
     result_msg->set_type(TYPE_ENUM);
     result_msg->set_scalar_type("uint32_t");
     result_msg->mutable_scalar_value()->set_uint32_t(static_cast<uint32_t>(result_value));
@@ -40,21 +40,21 @@
 ::android::hardware::nfc::V1_0::NfcStatus EnumValue__android__hardware__nfc__V1_0__NfcStatus(const ScalarDataValueMessage& arg) {
     return (::android::hardware::nfc::V1_0::NfcStatus) arg.uint32_t();
 }
-::android::hardware::nfc::V1_0::NfcStatus Random__android__hardware__nfc__V1_0__NfcStatus() {
+uint32_t Random__android__hardware__nfc__V1_0__NfcStatus() {
     uint32_t choice = (uint32_t) rand() / 5;
-    if (choice == (uint32_t) 0) return ::android::hardware::nfc::V1_0::NfcStatus::OK;
-    if (choice == (uint32_t) 1) return ::android::hardware::nfc::V1_0::NfcStatus::FAILED;
-    if (choice == (uint32_t) 2) return ::android::hardware::nfc::V1_0::NfcStatus::ERR_TRANSPORT;
-    if (choice == (uint32_t) 3) return ::android::hardware::nfc::V1_0::NfcStatus::ERR_CMD_TIMEOUT;
-    if (choice == (uint32_t) 4) return ::android::hardware::nfc::V1_0::NfcStatus::REFUSED;
-    return ::android::hardware::nfc::V1_0::NfcStatus::OK;
+    if (choice == (uint32_t) 0) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcStatus::OK);
+    if (choice == (uint32_t) 1) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcStatus::FAILED);
+    if (choice == (uint32_t) 2) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcStatus::ERR_TRANSPORT);
+    if (choice == (uint32_t) 3) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcStatus::ERR_CMD_TIMEOUT);
+    if (choice == (uint32_t) 4) return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcStatus::REFUSED);
+    return static_cast<uint32_t>(::android::hardware::nfc::V1_0::NfcStatus::OK);
 }
-bool Verify__android__hardware__nfc__V1_0__NfcStatus(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result){
+bool Verify__android__hardware__nfc__V1_0__NfcStatus(const VariableSpecificationMessage& expected_result __attribute__((__unused__)), const VariableSpecificationMessage& actual_result __attribute__((__unused__))){
     if (actual_result.scalar_value().uint32_t() != expected_result.scalar_value().uint32_t()) { return false; }
     return true;
 }
 
-void SetResult__android__hardware__nfc__V1_0__NfcStatus(VariableSpecificationMessage* result_msg, ::android::hardware::nfc::V1_0::NfcStatus result_value){
+void SetResult__android__hardware__nfc__V1_0__NfcStatus(VariableSpecificationMessage* result_msg, ::android::hardware::nfc::V1_0::NfcStatus result_value __attribute__((__unused__))){
     result_msg->set_type(TYPE_ENUM);
     result_msg->set_scalar_type("uint32_t");
     result_msg->mutable_scalar_value()->set_uint32_t(static_cast<uint32_t>(result_value));
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/types.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/types.vts.h
index 109079f..18593c5 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/types.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/types.vts.h
@@ -10,8 +10,10 @@
 #include <string.h>
 #include <utils/Log.h>
 
-#include <fuzz_tester/FuzzerBase.h>
-#include <fuzz_tester/FuzzerCallbackBase.h>
+#include <driver_base/DriverBase.h>
+#include <driver_base/DriverCallbackBase.h>
+
+#include <VtsDriverCommUtil.h>
 
 #include <android/hardware/nfc/1.0/types.h>
 #include <hidl/HidlSupport.h>
@@ -21,11 +23,11 @@
 namespace android {
 namespace vts {
 ::android::hardware::nfc::V1_0::NfcEvent EnumValue__android__hardware__nfc__V1_0__NfcEvent(const ScalarDataValueMessage& arg);
-::android::hardware::nfc::V1_0::NfcEvent Random__android__hardware__nfc__V1_0__NfcEvent();
+uint32_t Random__android__hardware__nfc__V1_0__NfcEvent();
 bool Verify__android__hardware__nfc__V1_0__NfcEvent(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result);
 void SetResult__android__hardware__nfc__V1_0__NfcEvent(VariableSpecificationMessage* result_msg, ::android::hardware::nfc::V1_0::NfcEvent result_value);
 ::android::hardware::nfc::V1_0::NfcStatus EnumValue__android__hardware__nfc__V1_0__NfcStatus(const ScalarDataValueMessage& arg);
-::android::hardware::nfc::V1_0::NfcStatus Random__android__hardware__nfc__V1_0__NfcStatus();
+uint32_t Random__android__hardware__nfc__V1_0__NfcStatus();
 bool Verify__android__hardware__nfc__V1_0__NfcStatus(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result);
 void SetResult__android__hardware__nfc__V1_0__NfcStatus(VariableSpecificationMessage* result_msg, ::android::hardware::nfc::V1_0::NfcStatus result_value);
 
diff --git a/compilation_tools/vtsc/test/golden/PROFILER/Bar.profiler.cpp b/compilation_tools/vtsc/test/golden/PROFILER/Bar.profiler.cpp
index eb48d22..86eff92 100644
--- a/compilation_tools/vtsc/test/golden/PROFILER/Bar.profiler.cpp
+++ b/compilation_tools/vtsc/test/golden/PROFILER/Bar.profiler.cpp
@@ -12,21 +12,21 @@
 namespace android {
 namespace vts {
 void profile____android__hardware__tests__bar__V1_0__IBar__SomethingRelated(VariableSpecificationMessage* arg_name,
-::android::hardware::tests::bar::V1_0::IBar::SomethingRelated arg_val_name) {
+::android::hardware::tests::bar::V1_0::IBar::SomethingRelated arg_val_name __attribute__((__unused__))) {
     arg_name->set_type(TYPE_STRUCT);
-    auto *arg_name_myRelated = arg_name->add_struct_value();
+    auto *arg_name_myRelated __attribute__((__unused__)) = arg_name->add_struct_value();
     arg_name_myRelated->set_type(TYPE_STRUCT);
     profile____android__hardware__tests__foo__V1_0__Unrelated(arg_name_myRelated, arg_val_name.myRelated);
 }
 
 
 void HIDL_INSTRUMENTATION_FUNCTION_android_hardware_tests_bar_V1_0_IBar(
-        details::HidlInstrumentor::InstrumentationEvent event,
+        details::HidlInstrumentor::InstrumentationEvent event __attribute__((__unused__)),
         const char* package,
         const char* version,
         const char* interface,
-        const char* method,
-        std::vector<void *> *args) {
+        const char* method __attribute__((__unused__)),
+        std::vector<void *> *args __attribute__((__unused__))) {
     if (strcmp(package, "android.hardware.tests.bar") != 0) {
         LOG(WARNING) << "incorrect package.";
         return;
@@ -60,8 +60,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: doThis, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    float *arg_val_0 = reinterpret_cast<float*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    float *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<float*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_float_t((*arg_val_0));
                     break;
@@ -100,8 +100,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: doThatAndReturnSomething, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int64_t *arg_val_0 = reinterpret_cast<int64_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int64_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int64_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int64_t((*arg_val_0));
                     break;
@@ -114,8 +114,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: doThatAndReturnSomething, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    int32_t *result_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    int32_t *result_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_int32_t((*result_val_0));
                     break;
@@ -144,20 +144,20 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 4, actual: " << (*args).size() << ", method name: doQuiteABit, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int32_t *arg_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int32_t((*arg_val_0));
-                    auto *arg_1 = msg.add_arg();
-                    int64_t *arg_val_1 = reinterpret_cast<int64_t*> ((*args)[1]);
+                    auto *arg_1 __attribute__((__unused__)) = msg.add_arg();
+                    int64_t *arg_val_1 __attribute__((__unused__)) = reinterpret_cast<int64_t*> ((*args)[1]);
                     arg_1->set_type(TYPE_SCALAR);
                     arg_1->mutable_scalar_value()->set_int64_t((*arg_val_1));
-                    auto *arg_2 = msg.add_arg();
-                    float *arg_val_2 = reinterpret_cast<float*> ((*args)[2]);
+                    auto *arg_2 __attribute__((__unused__)) = msg.add_arg();
+                    float *arg_val_2 __attribute__((__unused__)) = reinterpret_cast<float*> ((*args)[2]);
                     arg_2->set_type(TYPE_SCALAR);
                     arg_2->mutable_scalar_value()->set_float_t((*arg_val_2));
-                    auto *arg_3 = msg.add_arg();
-                    double *arg_val_3 = reinterpret_cast<double*> ((*args)[3]);
+                    auto *arg_3 __attribute__((__unused__)) = msg.add_arg();
+                    double *arg_val_3 __attribute__((__unused__)) = reinterpret_cast<double*> ((*args)[3]);
                     arg_3->set_type(TYPE_SCALAR);
                     arg_3->mutable_scalar_value()->set_double_t((*arg_val_3));
                     break;
@@ -170,8 +170,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: doQuiteABit, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    double *result_val_0 = reinterpret_cast<double*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    double *result_val_0 __attribute__((__unused__)) = reinterpret_cast<double*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_double_t((*result_val_0));
                     break;
@@ -200,12 +200,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: doSomethingElse, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_array<int32_t,15> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_array<int32_t,15>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_array<int32_t,15> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<int32_t,15>*> ((*args)[0]);
                     arg_0->set_type(TYPE_ARRAY);
                     arg_0->set_vector_size(15);
                     for (int i = 0; i < 15; i++) {
-                        auto *arg_0_array_i = arg_0->add_vector_value();
+                        auto *arg_0_array_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_array_i->set_type(TYPE_SCALAR);
                         arg_0_array_i->mutable_scalar_value()->set_int32_t((*arg_val_0)[i]);
                     }
@@ -219,12 +219,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: doSomethingElse, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_array<int32_t,32> *result_val_0 = reinterpret_cast<::android::hardware::hidl_array<int32_t,32>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_array<int32_t,32> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<int32_t,32>*> ((*args)[0]);
                     result_0->set_type(TYPE_ARRAY);
                     result_0->set_vector_size(32);
                     for (int i = 0; i < 32; i++) {
-                        auto *result_0_array_i = result_0->add_vector_value();
+                        auto *result_0_array_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_array_i->set_type(TYPE_SCALAR);
                         result_0_array_i->mutable_scalar_value()->set_int32_t((*result_val_0)[i]);
                     }
@@ -264,8 +264,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: doStuffAndReturnAString, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_string *result_val_0 = reinterpret_cast<::android::hardware::hidl_string*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_string *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_string*> ((*args)[0]);
                     result_0->set_type(TYPE_STRING);
                     result_0->mutable_string_value()->set_message((*result_val_0).c_str());
                     result_0->mutable_string_value()->set_length((*result_val_0).size());
@@ -295,12 +295,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: mapThisVector, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<int32_t> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<int32_t>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<int32_t> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<int32_t>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_SCALAR);
                         arg_0_vector_i->mutable_scalar_value()->set_int32_t((*arg_val_0)[i]);
                     }
@@ -314,12 +314,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: mapThisVector, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_vec<int32_t> *result_val_0 = reinterpret_cast<::android::hardware::hidl_vec<int32_t>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_vec<int32_t> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<int32_t>*> ((*args)[0]);
                     result_0->set_type(TYPE_VECTOR);
                     result_0->set_vector_size((*result_val_0).size());
                     for (int i = 0; i < (int)(*result_val_0).size(); i++) {
-                        auto *result_0_vector_i = result_0->add_vector_value();
+                        auto *result_0_vector_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_vector_i->set_type(TYPE_SCALAR);
                         result_0_vector_i->mutable_scalar_value()->set_int32_t((*result_val_0)[i]);
                     }
@@ -349,8 +349,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: callMe, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    sp<::android::hardware::tests::foo::V1_0::IFooCallback> *arg_val_0 = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::IFooCallback>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    sp<::android::hardware::tests::foo::V1_0::IFooCallback> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::IFooCallback>*> ((*args)[0]);
                     arg_0->set_type(TYPE_HIDL_CALLBACK);
                     arg_0->set_predefined_type("::android::hardware::tests::foo::V1_0::IFooCallback");
                     break;
@@ -389,8 +389,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: useAnEnum, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum *arg_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::SomeEnum*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::SomeEnum*> ((*args)[0]);
                     arg_0->set_type(TYPE_ENUM);
                     profile____android__hardware__tests__foo__V1_0__IFoo__SomeEnum(arg_0, (*arg_val_0));
                     break;
@@ -403,8 +403,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: useAnEnum, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum *result_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::SomeEnum*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::SomeEnum*> ((*args)[0]);
                     result_0->set_type(TYPE_ENUM);
                     profile____android__hardware__tests__foo__V1_0__IFoo__SomeEnum(result_0, (*result_val_0));
                     break;
@@ -433,12 +433,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAGooberVec, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<::android::hardware::tests::foo::V1_0::IFoo::Goober> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::tests::foo::V1_0::IFoo::Goober>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<::android::hardware::tests::foo::V1_0::IFoo::Goober> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::tests::foo::V1_0::IFoo::Goober>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_STRUCT);
                         profile____android__hardware__tests__foo__V1_0__IFoo__Goober(arg_0_vector_i, (*arg_val_0)[i]);
                     }
@@ -478,8 +478,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAGoober, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::tests::foo::V1_0::IFoo::Goober *arg_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::Goober*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::tests::foo::V1_0::IFoo::Goober *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::Goober*> ((*args)[0]);
                     arg_0->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__IFoo__Goober(arg_0, (*arg_val_0));
                     break;
@@ -518,36 +518,36 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAGooberArray, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_array<::android::hardware::tests::foo::V1_0::IFoo::Goober,20> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::tests::foo::V1_0::IFoo::Goober,20>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_array<::android::hardware::tests::foo::V1_0::IFoo::Goober,20> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::tests::foo::V1_0::IFoo::Goober,20>*> ((*args)[0]);
                     arg_0->set_type(TYPE_ARRAY);
                     arg_0->set_vector_size(20);
                     for (int i = 0; i < 20; i++) {
-                        auto *arg_0_array_i = arg_0->add_vector_value();
+                        auto *arg_0_array_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_array_i->set_type(TYPE_STRUCT);
-                        auto *arg_0_array_i_q = arg_0_array_i->add_struct_value();
+                        auto *arg_0_array_i_q __attribute__((__unused__)) = arg_0_array_i->add_struct_value();
                         arg_0_array_i_q->set_type(TYPE_SCALAR);
                         arg_0_array_i_q->mutable_scalar_value()->set_int32_t((*arg_val_0)[i].q);
-                        auto *arg_0_array_i_name = arg_0_array_i->add_struct_value();
+                        auto *arg_0_array_i_name __attribute__((__unused__)) = arg_0_array_i->add_struct_value();
                         arg_0_array_i_name->set_type(TYPE_STRING);
                         arg_0_array_i_name->mutable_string_value()->set_message((*arg_val_0)[i].name.c_str());
                         arg_0_array_i_name->mutable_string_value()->set_length((*arg_val_0)[i].name.size());
-                        auto *arg_0_array_i_address = arg_0_array_i->add_struct_value();
+                        auto *arg_0_array_i_address __attribute__((__unused__)) = arg_0_array_i->add_struct_value();
                         arg_0_array_i_address->set_type(TYPE_STRING);
                         arg_0_array_i_address->mutable_string_value()->set_message((*arg_val_0)[i].address.c_str());
                         arg_0_array_i_address->mutable_string_value()->set_length((*arg_val_0)[i].address.size());
-                        auto *arg_0_array_i_numbers = arg_0_array_i->add_struct_value();
+                        auto *arg_0_array_i_numbers __attribute__((__unused__)) = arg_0_array_i->add_struct_value();
                         arg_0_array_i_numbers->set_type(TYPE_ARRAY);
                         arg_0_array_i_numbers->set_vector_size(10);
                         for (int i = 0; i < 10; i++) {
-                            auto *arg_0_array_i_numbers_array_i = arg_0_array_i_numbers->add_vector_value();
+                            auto *arg_0_array_i_numbers_array_i __attribute__((__unused__)) = arg_0_array_i_numbers->add_vector_value();
                             arg_0_array_i_numbers_array_i->set_type(TYPE_SCALAR);
                             arg_0_array_i_numbers_array_i->mutable_scalar_value()->set_double_t((*arg_val_0)[i].numbers[i]);
                         }
-                        auto *arg_0_array_i_fumble = arg_0_array_i->add_struct_value();
+                        auto *arg_0_array_i_fumble __attribute__((__unused__)) = arg_0_array_i->add_struct_value();
                         arg_0_array_i_fumble->set_type(TYPE_STRUCT);
                         profile____android__hardware__tests__foo__V1_0__IFoo__Fumble(arg_0_array_i_fumble, (*arg_val_0)[i].fumble);
-                        auto *arg_0_array_i_gumble = arg_0_array_i->add_struct_value();
+                        auto *arg_0_array_i_gumble __attribute__((__unused__)) = arg_0_array_i->add_struct_value();
                         arg_0_array_i_gumble->set_type(TYPE_STRUCT);
                         profile____android__hardware__tests__foo__V1_0__IFoo__Fumble(arg_0_array_i_gumble, (*arg_val_0)[i].gumble);
                     }
@@ -587,8 +587,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveATypeFromAnotherFile, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::tests::foo::V1_0::Abc *arg_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::Abc*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::tests::foo::V1_0::Abc *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::Abc*> ((*args)[0]);
                     arg_0->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__Abc(arg_0, (*arg_val_0));
                     break;
@@ -627,12 +627,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveSomeStrings, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_array<::android::hardware::hidl_string,3> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::hidl_string,3>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_array<::android::hardware::hidl_string,3> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::hidl_string,3>*> ((*args)[0]);
                     arg_0->set_type(TYPE_ARRAY);
                     arg_0->set_vector_size(3);
                     for (int i = 0; i < 3; i++) {
-                        auto *arg_0_array_i = arg_0->add_vector_value();
+                        auto *arg_0_array_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_array_i->set_type(TYPE_STRING);
                         arg_0_array_i->mutable_string_value()->set_message((*arg_val_0)[i].c_str());
                         arg_0_array_i->mutable_string_value()->set_length((*arg_val_0)[i].size());
@@ -647,12 +647,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: haveSomeStrings, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_array<::android::hardware::hidl_string,2> *result_val_0 = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::hidl_string,2>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_array<::android::hardware::hidl_string,2> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::hidl_string,2>*> ((*args)[0]);
                     result_0->set_type(TYPE_ARRAY);
                     result_0->set_vector_size(2);
                     for (int i = 0; i < 2; i++) {
-                        auto *result_0_array_i = result_0->add_vector_value();
+                        auto *result_0_array_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_array_i->set_type(TYPE_STRING);
                         result_0_array_i->mutable_string_value()->set_message((*result_val_0)[i].c_str());
                         result_0_array_i->mutable_string_value()->set_length((*result_val_0)[i].size());
@@ -683,12 +683,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAStringVec, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<::android::hardware::hidl_string> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::hidl_string>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<::android::hardware::hidl_string> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::hidl_string>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_STRING);
                         arg_0_vector_i->mutable_string_value()->set_message((*arg_val_0)[i].c_str());
                         arg_0_vector_i->mutable_string_value()->set_length((*arg_val_0)[i].size());
@@ -703,12 +703,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAStringVec, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_vec<::android::hardware::hidl_string> *result_val_0 = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::hidl_string>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_vec<::android::hardware::hidl_string> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::hidl_string>*> ((*args)[0]);
                     result_0->set_type(TYPE_VECTOR);
                     result_0->set_vector_size((*result_val_0).size());
                     for (int i = 0; i < (int)(*result_val_0).size(); i++) {
-                        auto *result_0_vector_i = result_0->add_vector_value();
+                        auto *result_0_vector_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_vector_i->set_type(TYPE_STRING);
                         result_0_vector_i->mutable_string_value()->set_message((*result_val_0)[i].c_str());
                         result_0_vector_i->mutable_string_value()->set_length((*result_val_0)[i].size());
@@ -739,16 +739,16 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: transposeMe, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_array<float, 3,5> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_array<float, 3,5>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_array<float, 3,5> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<float, 3,5>*> ((*args)[0]);
                     arg_0->set_type(TYPE_ARRAY);
                     arg_0->set_vector_size(3);
                     for (int i = 0; i < 3; i++) {
-                        auto *arg_0_array_i = arg_0->add_vector_value();
+                        auto *arg_0_array_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_array_i->set_type(TYPE_ARRAY);
                         arg_0_array_i->set_vector_size(5);
                         for (int i = 0; i < 5; i++) {
-                            auto *arg_0_array_i_array_i = arg_0_array_i->add_vector_value();
+                            auto *arg_0_array_i_array_i __attribute__((__unused__)) = arg_0_array_i->add_vector_value();
                             arg_0_array_i_array_i->set_type(TYPE_SCALAR);
                             arg_0_array_i_array_i->mutable_scalar_value()->set_float_t((*arg_val_0)[i][i]);
                         }
@@ -763,16 +763,16 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: transposeMe, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_array<float, 5,3> *result_val_0 = reinterpret_cast<::android::hardware::hidl_array<float, 5,3>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_array<float, 5,3> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<float, 5,3>*> ((*args)[0]);
                     result_0->set_type(TYPE_ARRAY);
                     result_0->set_vector_size(5);
                     for (int i = 0; i < 5; i++) {
-                        auto *result_0_array_i = result_0->add_vector_value();
+                        auto *result_0_array_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_array_i->set_type(TYPE_ARRAY);
                         result_0_array_i->set_vector_size(3);
                         for (int i = 0; i < 3; i++) {
-                            auto *result_0_array_i_array_i = result_0_array_i->add_vector_value();
+                            auto *result_0_array_i_array_i __attribute__((__unused__)) = result_0_array_i->add_vector_value();
                             result_0_array_i_array_i->set_type(TYPE_SCALAR);
                             result_0_array_i_array_i->mutable_scalar_value()->set_float_t((*result_val_0)[i][i]);
                         }
@@ -803,8 +803,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: callingDrWho, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional *arg_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional*> ((*args)[0]);
                     arg_0->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__IFoo__MultiDimensional(arg_0, (*arg_val_0));
                     break;
@@ -817,8 +817,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: callingDrWho, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional *result_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional*> ((*args)[0]);
                     result_0->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__IFoo__MultiDimensional(result_0, (*result_val_0));
                     break;
@@ -847,8 +847,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: transpose, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix5x3 *arg_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::StringMatrix5x3*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix5x3 *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::StringMatrix5x3*> ((*args)[0]);
                     arg_0->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__IFoo__StringMatrix5x3(arg_0, (*arg_val_0));
                     break;
@@ -861,8 +861,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: transpose, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix3x5 *result_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::StringMatrix3x5*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix3x5 *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::StringMatrix3x5*> ((*args)[0]);
                     result_0->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__IFoo__StringMatrix3x5(result_0, (*result_val_0));
                     break;
@@ -891,16 +891,16 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: transpose2, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_array<::android::hardware::hidl_string, 5,3> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::hidl_string, 5,3>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_array<::android::hardware::hidl_string, 5,3> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::hidl_string, 5,3>*> ((*args)[0]);
                     arg_0->set_type(TYPE_ARRAY);
                     arg_0->set_vector_size(5);
                     for (int i = 0; i < 5; i++) {
-                        auto *arg_0_array_i = arg_0->add_vector_value();
+                        auto *arg_0_array_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_array_i->set_type(TYPE_ARRAY);
                         arg_0_array_i->set_vector_size(3);
                         for (int i = 0; i < 3; i++) {
-                            auto *arg_0_array_i_array_i = arg_0_array_i->add_vector_value();
+                            auto *arg_0_array_i_array_i __attribute__((__unused__)) = arg_0_array_i->add_vector_value();
                             arg_0_array_i_array_i->set_type(TYPE_STRING);
                             arg_0_array_i_array_i->mutable_string_value()->set_message((*arg_val_0)[i][i].c_str());
                             arg_0_array_i_array_i->mutable_string_value()->set_length((*arg_val_0)[i][i].size());
@@ -916,16 +916,16 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: transpose2, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_array<::android::hardware::hidl_string, 3,5> *result_val_0 = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::hidl_string, 3,5>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_array<::android::hardware::hidl_string, 3,5> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_array<::android::hardware::hidl_string, 3,5>*> ((*args)[0]);
                     result_0->set_type(TYPE_ARRAY);
                     result_0->set_vector_size(3);
                     for (int i = 0; i < 3; i++) {
-                        auto *result_0_array_i = result_0->add_vector_value();
+                        auto *result_0_array_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_array_i->set_type(TYPE_ARRAY);
                         result_0_array_i->set_vector_size(5);
                         for (int i = 0; i < 5; i++) {
-                            auto *result_0_array_i_array_i = result_0_array_i->add_vector_value();
+                            auto *result_0_array_i_array_i __attribute__((__unused__)) = result_0_array_i->add_vector_value();
                             result_0_array_i_array_i->set_type(TYPE_STRING);
                             result_0_array_i_array_i->mutable_string_value()->set_message((*result_val_0)[i][i].c_str());
                             result_0_array_i_array_i->mutable_string_value()->set_length((*result_val_0)[i][i].size());
@@ -957,12 +957,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: sendVec, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<uint8_t> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<uint8_t> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_SCALAR);
                         arg_0_vector_i->mutable_scalar_value()->set_uint8_t((*arg_val_0)[i]);
                     }
@@ -976,12 +976,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: sendVec, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_vec<uint8_t> *result_val_0 = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_vec<uint8_t> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
                     result_0->set_type(TYPE_VECTOR);
                     result_0->set_vector_size((*result_val_0).size());
                     for (int i = 0; i < (int)(*result_val_0).size(); i++) {
-                        auto *result_0_vector_i = result_0->add_vector_value();
+                        auto *result_0_vector_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_vector_i->set_type(TYPE_SCALAR);
                         result_0_vector_i->mutable_scalar_value()->set_uint8_t((*result_val_0)[i]);
                     }
@@ -1021,16 +1021,16 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: sendVecVec, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_vec<::android::hardware::hidl_vec<uint8_t>> *result_val_0 = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::hidl_vec<uint8_t>>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_vec<::android::hardware::hidl_vec<uint8_t>> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::hidl_vec<uint8_t>>*> ((*args)[0]);
                     result_0->set_type(TYPE_VECTOR);
                     result_0->set_vector_size((*result_val_0).size());
                     for (int i = 0; i < (int)(*result_val_0).size(); i++) {
-                        auto *result_0_vector_i = result_0->add_vector_value();
+                        auto *result_0_vector_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_vector_i->set_type(TYPE_VECTOR);
                         result_0_vector_i->set_vector_size((*result_val_0)[i].size());
                         for (int i = 0; i < (int)(*result_val_0)[i].size(); i++) {
-                            auto *result_0_vector_i_vector_i = result_0_vector_i->add_vector_value();
+                            auto *result_0_vector_i_vector_i __attribute__((__unused__)) = result_0_vector_i->add_vector_value();
                             result_0_vector_i_vector_i->set_type(TYPE_SCALAR);
                             result_0_vector_i_vector_i->mutable_scalar_value()->set_uint8_t((*result_val_0)[i][i]);
                         }
@@ -1061,12 +1061,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAVectorOfInterfaces, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_HIDL_INTERFACE);
                         arg_0_vector_i->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
                     }
@@ -1080,12 +1080,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAVectorOfInterfaces, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>> *result_val_0 = reinterpret_cast<::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>*> ((*args)[0]);
                     result_0->set_type(TYPE_VECTOR);
                     result_0->set_vector_size((*result_val_0).size());
                     for (int i = 0; i < (int)(*result_val_0).size(); i++) {
-                        auto *result_0_vector_i = result_0->add_vector_value();
+                        auto *result_0_vector_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_vector_i->set_type(TYPE_HIDL_INTERFACE);
                         result_0_vector_i->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
                     }
@@ -1115,12 +1115,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAVectorOfGenericInterfaces, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_HIDL_INTERFACE);
                         arg_0_vector_i->set_predefined_type("::android::hidl::base::V1_0::IBase");
                     }
@@ -1134,12 +1134,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAVectorOfGenericInterfaces, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>> *result_val_0 = reinterpret_cast<::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>*> ((*args)[0]);
                     result_0->set_type(TYPE_VECTOR);
                     result_0->set_vector_size((*result_val_0).size());
                     for (int i = 0; i < (int)(*result_val_0).size(); i++) {
-                        auto *result_0_vector_i = result_0->add_vector_value();
+                        auto *result_0_vector_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_vector_i->set_type(TYPE_HIDL_INTERFACE);
                         result_0_vector_i->set_predefined_type("::android::hidl::base::V1_0::IBase");
                     }
@@ -1169,8 +1169,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: echoNullInterface, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    sp<::android::hardware::tests::foo::V1_0::IFooCallback> *arg_val_0 = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::IFooCallback>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    sp<::android::hardware::tests::foo::V1_0::IFooCallback> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::IFooCallback>*> ((*args)[0]);
                     arg_0->set_type(TYPE_HIDL_CALLBACK);
                     arg_0->set_predefined_type("::android::hardware::tests::foo::V1_0::IFooCallback");
                     break;
@@ -1183,12 +1183,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 2, actual: " << (*args).size() << ", method name: echoNullInterface, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    bool *result_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_bool_t((*result_val_0));
-                    auto *result_1 = msg.add_return_type_hidl();
-                    sp<::android::hardware::tests::foo::V1_0::IFooCallback> *result_val_1 = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::IFooCallback>*> ((*args)[1]);
+                    auto *result_1 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    sp<::android::hardware::tests::foo::V1_0::IFooCallback> *result_val_1 __attribute__((__unused__)) = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::IFooCallback>*> ((*args)[1]);
                     result_1->set_type(TYPE_HIDL_CALLBACK);
                     result_1->set_predefined_type("::android::hardware::tests::foo::V1_0::IFooCallback");
                     break;
@@ -1227,8 +1227,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: createMyHandle, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::tests::foo::V1_0::IFoo::MyHandle *result_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::MyHandle*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::tests::foo::V1_0::IFoo::MyHandle *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::MyHandle*> ((*args)[0]);
                     result_0->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__IFoo__MyHandle(result_0, (*result_val_0));
                     break;
@@ -1257,8 +1257,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: createHandles, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    uint32_t *arg_val_0 = reinterpret_cast<uint32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    uint32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<uint32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_uint32_t((*arg_val_0));
                     break;
@@ -1271,12 +1271,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: createHandles, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_vec<::android::hardware::hidl_handle> *result_val_0 = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::hidl_handle>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_vec<::android::hardware::hidl_handle> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<::android::hardware::hidl_handle>*> ((*args)[0]);
                     result_0->set_type(TYPE_VECTOR);
                     result_0->set_vector_size((*result_val_0).size());
                     for (int i = 0; i < (int)(*result_val_0).size(); i++) {
-                        auto *result_0_vector_i = result_0->add_vector_value();
+                        auto *result_0_vector_i __attribute__((__unused__)) = result_0->add_vector_value();
                         result_0_vector_i->set_type(TYPE_HANDLE);
                         auto result_0_vector_i_h = (*result_val_0)[i].getNativeHandle();
                         if (!result_0_vector_i_h) {
@@ -1425,8 +1425,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 2, actual: " << (*args).size() << ", method name: expectNullHandle, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_handle *arg_val_0 = reinterpret_cast<::android::hardware::hidl_handle*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_handle *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_handle*> ((*args)[0]);
                     arg_0->set_type(TYPE_HANDLE);
                     auto arg_0_h = (*arg_val_0).getNativeHandle();
                     if (!arg_0_h) {
@@ -1476,8 +1476,8 @@
                             arg_0->mutable_handle_value()->add_int_val(arg_0_h->data[i]);
                         }
                     }
-                    auto *arg_1 = msg.add_arg();
-                    ::android::hardware::tests::foo::V1_0::Abc *arg_val_1 = reinterpret_cast<::android::hardware::tests::foo::V1_0::Abc*> ((*args)[1]);
+                    auto *arg_1 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::tests::foo::V1_0::Abc *arg_val_1 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::Abc*> ((*args)[1]);
                     arg_1->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__Abc(arg_1, (*arg_val_1));
                     break;
@@ -1490,12 +1490,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 2, actual: " << (*args).size() << ", method name: expectNullHandle, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    bool *result_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_bool_t((*result_val_0));
-                    auto *result_1 = msg.add_return_type_hidl();
-                    bool *result_val_1 = reinterpret_cast<bool*> ((*args)[1]);
+                    auto *result_1 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_1 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[1]);
                     result_1->set_type(TYPE_SCALAR);
                     result_1->mutable_scalar_value()->set_bool_t((*result_val_1));
                     break;
@@ -1524,21 +1524,21 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 4, actual: " << (*args).size() << ", method name: takeAMask, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::tests::foo::V1_0::IFoo::BitField *arg_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::BitField*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::tests::foo::V1_0::IFoo::BitField *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::BitField*> ((*args)[0]);
                     arg_0->set_type(TYPE_ENUM);
                     profile____android__hardware__tests__foo__V1_0__IFoo__BitField(arg_0, (*arg_val_0));
-                    auto *arg_1 = msg.add_arg();
-                    uint8_t *arg_val_1 = reinterpret_cast<uint8_t*> ((*args)[1]);
+                    auto *arg_1 __attribute__((__unused__)) = msg.add_arg();
+                    uint8_t *arg_val_1 __attribute__((__unused__)) = reinterpret_cast<uint8_t*> ((*args)[1]);
                     arg_1->set_type(TYPE_MASK);
                     arg_1->set_scalar_type("uint8_t");
                     arg_1->mutable_scalar_value()->set_uint8_t((*arg_val_1));
-                    auto *arg_2 = msg.add_arg();
-                    ::android::hardware::tests::foo::V1_0::IFoo::MyMask *arg_val_2 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::MyMask*> ((*args)[2]);
+                    auto *arg_2 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::tests::foo::V1_0::IFoo::MyMask *arg_val_2 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::MyMask*> ((*args)[2]);
                     arg_2->set_type(TYPE_STRUCT);
                     profile____android__hardware__tests__foo__V1_0__IFoo__MyMask(arg_2, (*arg_val_2));
-                    auto *arg_3 = msg.add_arg();
-                    uint8_t *arg_val_3 = reinterpret_cast<uint8_t*> ((*args)[3]);
+                    auto *arg_3 __attribute__((__unused__)) = msg.add_arg();
+                    uint8_t *arg_val_3 __attribute__((__unused__)) = reinterpret_cast<uint8_t*> ((*args)[3]);
                     arg_3->set_type(TYPE_MASK);
                     arg_3->set_scalar_type("uint8_t");
                     arg_3->mutable_scalar_value()->set_uint8_t((*arg_val_3));
@@ -1552,20 +1552,20 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 4, actual: " << (*args).size() << ", method name: takeAMask, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::tests::foo::V1_0::IFoo::BitField *result_val_0 = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::BitField*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::tests::foo::V1_0::IFoo::BitField *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::tests::foo::V1_0::IFoo::BitField*> ((*args)[0]);
                     result_0->set_type(TYPE_ENUM);
                     profile____android__hardware__tests__foo__V1_0__IFoo__BitField(result_0, (*result_val_0));
-                    auto *result_1 = msg.add_return_type_hidl();
-                    uint8_t *result_val_1 = reinterpret_cast<uint8_t*> ((*args)[1]);
+                    auto *result_1 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    uint8_t *result_val_1 __attribute__((__unused__)) = reinterpret_cast<uint8_t*> ((*args)[1]);
                     result_1->set_type(TYPE_SCALAR);
                     result_1->mutable_scalar_value()->set_uint8_t((*result_val_1));
-                    auto *result_2 = msg.add_return_type_hidl();
-                    uint8_t *result_val_2 = reinterpret_cast<uint8_t*> ((*args)[2]);
+                    auto *result_2 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    uint8_t *result_val_2 __attribute__((__unused__)) = reinterpret_cast<uint8_t*> ((*args)[2]);
                     result_2->set_type(TYPE_SCALAR);
                     result_2->mutable_scalar_value()->set_uint8_t((*result_val_2));
-                    auto *result_3 = msg.add_return_type_hidl();
-                    uint8_t *result_val_3 = reinterpret_cast<uint8_t*> ((*args)[3]);
+                    auto *result_3 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    uint8_t *result_val_3 __attribute__((__unused__)) = reinterpret_cast<uint8_t*> ((*args)[3]);
                     result_3->set_type(TYPE_SCALAR);
                     result_3->mutable_scalar_value()->set_uint8_t((*result_val_3));
                     break;
@@ -1594,8 +1594,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAInterface, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    sp<::android::hardware::tests::foo::V1_0::ISimple> *arg_val_0 = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::ISimple>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    sp<::android::hardware::tests::foo::V1_0::ISimple> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::ISimple>*> ((*args)[0]);
                     arg_0->set_type(TYPE_HIDL_INTERFACE);
                     arg_0->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
                     break;
@@ -1608,8 +1608,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: haveAInterface, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    sp<::android::hardware::tests::foo::V1_0::ISimple> *result_val_0 = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::ISimple>*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    sp<::android::hardware::tests::foo::V1_0::ISimple> *result_val_0 __attribute__((__unused__)) = reinterpret_cast<sp<::android::hardware::tests::foo::V1_0::ISimple>*> ((*args)[0]);
                     result_0->set_type(TYPE_HIDL_INTERFACE);
                     result_0->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
                     break;
diff --git a/compilation_tools/vtsc/test/golden/PROFILER/MemoryTest.profiler.cpp b/compilation_tools/vtsc/test/golden/PROFILER/MemoryTest.profiler.cpp
index d50e219..8a641e8 100644
--- a/compilation_tools/vtsc/test/golden/PROFILER/MemoryTest.profiler.cpp
+++ b/compilation_tools/vtsc/test/golden/PROFILER/MemoryTest.profiler.cpp
@@ -13,12 +13,12 @@
 namespace vts {
 
 void HIDL_INSTRUMENTATION_FUNCTION_android_hardware_tests_memory_V1_0_IMemoryTest(
-        details::HidlInstrumentor::InstrumentationEvent event,
+        details::HidlInstrumentor::InstrumentationEvent event __attribute__((__unused__)),
         const char* package,
         const char* version,
         const char* interface,
-        const char* method,
-        std::vector<void *> *args) {
+        const char* method __attribute__((__unused__)),
+        std::vector<void *> *args __attribute__((__unused__))) {
     if (strcmp(package, "android.hardware.tests.memory") != 0) {
         LOG(WARNING) << "incorrect package.";
         return;
@@ -52,8 +52,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: haveSomeMemory, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_memory *arg_val_0 = reinterpret_cast<::android::hardware::hidl_memory*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_memory *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_memory*> ((*args)[0]);
                     arg_0->set_type(TYPE_HIDL_MEMORY);
                     arg_0->mutable_hidl_memory_value()->set_size((*arg_val_0).size());
                     break;
@@ -66,8 +66,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: haveSomeMemory, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::hidl_memory *result_val_0 = reinterpret_cast<::android::hardware::hidl_memory*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::hidl_memory *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_memory*> ((*args)[0]);
                     result_0->set_type(TYPE_HIDL_MEMORY);
                     result_0->mutable_hidl_memory_value()->set_size((*result_val_0).size());
                     break;
@@ -96,12 +96,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 2, actual: " << (*args).size() << ", method name: fillMemory, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_memory *arg_val_0 = reinterpret_cast<::android::hardware::hidl_memory*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_memory *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_memory*> ((*args)[0]);
                     arg_0->set_type(TYPE_HIDL_MEMORY);
                     arg_0->mutable_hidl_memory_value()->set_size((*arg_val_0).size());
-                    auto *arg_1 = msg.add_arg();
-                    uint8_t *arg_val_1 = reinterpret_cast<uint8_t*> ((*args)[1]);
+                    auto *arg_1 __attribute__((__unused__)) = msg.add_arg();
+                    uint8_t *arg_val_1 __attribute__((__unused__)) = reinterpret_cast<uint8_t*> ((*args)[1]);
                     arg_1->set_type(TYPE_SCALAR);
                     arg_1->mutable_scalar_value()->set_uint8_t((*arg_val_1));
                     break;
diff --git a/compilation_tools/vtsc/test/golden/PROFILER/Nfc.profiler.cpp b/compilation_tools/vtsc/test/golden/PROFILER/Nfc.profiler.cpp
index ac65b5b..7aac21d 100644
--- a/compilation_tools/vtsc/test/golden/PROFILER/Nfc.profiler.cpp
+++ b/compilation_tools/vtsc/test/golden/PROFILER/Nfc.profiler.cpp
@@ -13,12 +13,12 @@
 namespace vts {
 
 void HIDL_INSTRUMENTATION_FUNCTION_android_hardware_nfc_V1_0_INfc(
-        details::HidlInstrumentor::InstrumentationEvent event,
+        details::HidlInstrumentor::InstrumentationEvent event __attribute__((__unused__)),
         const char* package,
         const char* version,
         const char* interface,
-        const char* method,
-        std::vector<void *> *args) {
+        const char* method __attribute__((__unused__)),
+        std::vector<void *> *args __attribute__((__unused__))) {
     if (strcmp(package, "android.hardware.nfc") != 0) {
         LOG(WARNING) << "incorrect package.";
         return;
@@ -52,8 +52,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: open, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    sp<::android::hardware::nfc::V1_0::INfcClientCallback> *arg_val_0 = reinterpret_cast<sp<::android::hardware::nfc::V1_0::INfcClientCallback>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    sp<::android::hardware::nfc::V1_0::INfcClientCallback> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<sp<::android::hardware::nfc::V1_0::INfcClientCallback>*> ((*args)[0]);
                     arg_0->set_type(TYPE_HIDL_CALLBACK);
                     arg_0->set_predefined_type("::android::hardware::nfc::V1_0::INfcClientCallback");
                     break;
@@ -66,8 +66,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: open, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
                     result_0->set_type(TYPE_ENUM);
                     profile____android__hardware__nfc__V1_0__NfcStatus(result_0, (*result_val_0));
                     break;
@@ -96,12 +96,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: write, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<uint8_t> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<uint8_t> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_SCALAR);
                         arg_0_vector_i->mutable_scalar_value()->set_uint8_t((*arg_val_0)[i]);
                     }
@@ -115,8 +115,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: write, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    uint32_t *result_val_0 = reinterpret_cast<uint32_t*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    uint32_t *result_val_0 __attribute__((__unused__)) = reinterpret_cast<uint32_t*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_uint32_t((*result_val_0));
                     break;
@@ -145,12 +145,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: coreInitialized, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<uint8_t> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<uint8_t> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_SCALAR);
                         arg_0_vector_i->mutable_scalar_value()->set_uint8_t((*arg_val_0)[i]);
                     }
@@ -164,8 +164,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: coreInitialized, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
                     result_0->set_type(TYPE_ENUM);
                     profile____android__hardware__nfc__V1_0__NfcStatus(result_0, (*result_val_0));
                     break;
@@ -204,8 +204,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: prediscover, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
                     result_0->set_type(TYPE_ENUM);
                     profile____android__hardware__nfc__V1_0__NfcStatus(result_0, (*result_val_0));
                     break;
@@ -244,8 +244,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: close, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
                     result_0->set_type(TYPE_ENUM);
                     profile____android__hardware__nfc__V1_0__NfcStatus(result_0, (*result_val_0));
                     break;
@@ -284,8 +284,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: controlGranted, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
                     result_0->set_type(TYPE_ENUM);
                     profile____android__hardware__nfc__V1_0__NfcStatus(result_0, (*result_val_0));
                     break;
@@ -324,8 +324,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: powerCycle, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::nfc::V1_0::NfcStatus *result_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[0]);
                     result_0->set_type(TYPE_ENUM);
                     profile____android__hardware__nfc__V1_0__NfcStatus(result_0, (*result_val_0));
                     break;
diff --git a/compilation_tools/vtsc/test/golden/PROFILER/NfcClientCallback.profiler.cpp b/compilation_tools/vtsc/test/golden/PROFILER/NfcClientCallback.profiler.cpp
index b0b4dd6..47375bc 100644
--- a/compilation_tools/vtsc/test/golden/PROFILER/NfcClientCallback.profiler.cpp
+++ b/compilation_tools/vtsc/test/golden/PROFILER/NfcClientCallback.profiler.cpp
@@ -13,12 +13,12 @@
 namespace vts {
 
 void HIDL_INSTRUMENTATION_FUNCTION_android_hardware_nfc_V1_0_INfcClientCallback(
-        details::HidlInstrumentor::InstrumentationEvent event,
+        details::HidlInstrumentor::InstrumentationEvent event __attribute__((__unused__)),
         const char* package,
         const char* version,
         const char* interface,
-        const char* method,
-        std::vector<void *> *args) {
+        const char* method __attribute__((__unused__)),
+        std::vector<void *> *args __attribute__((__unused__))) {
     if (strcmp(package, "android.hardware.nfc") != 0) {
         LOG(WARNING) << "incorrect package.";
         return;
@@ -52,12 +52,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 2, actual: " << (*args).size() << ", method name: sendEvent, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::nfc::V1_0::NfcEvent *arg_val_0 = reinterpret_cast<::android::hardware::nfc::V1_0::NfcEvent*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::nfc::V1_0::NfcEvent *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::nfc::V1_0::NfcEvent*> ((*args)[0]);
                     arg_0->set_type(TYPE_ENUM);
                     profile____android__hardware__nfc__V1_0__NfcEvent(arg_0, (*arg_val_0));
-                    auto *arg_1 = msg.add_arg();
-                    ::android::hardware::nfc::V1_0::NfcStatus *arg_val_1 = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[1]);
+                    auto *arg_1 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::nfc::V1_0::NfcStatus *arg_val_1 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::nfc::V1_0::NfcStatus*> ((*args)[1]);
                     arg_1->set_type(TYPE_ENUM);
                     profile____android__hardware__nfc__V1_0__NfcStatus(arg_1, (*arg_val_1));
                     break;
@@ -96,12 +96,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: sendData, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    ::android::hardware::hidl_vec<uint8_t> *arg_val_0 = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    ::android::hardware::hidl_vec<uint8_t> *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::hidl_vec<uint8_t>*> ((*args)[0]);
                     arg_0->set_type(TYPE_VECTOR);
                     arg_0->set_vector_size((*arg_val_0).size());
                     for (int i = 0; i < (int)(*arg_val_0).size(); i++) {
-                        auto *arg_0_vector_i = arg_0->add_vector_value();
+                        auto *arg_0_vector_i __attribute__((__unused__)) = arg_0->add_vector_value();
                         arg_0_vector_i->set_type(TYPE_SCALAR);
                         arg_0_vector_i->mutable_scalar_value()->set_uint8_t((*arg_val_0)[i]);
                     }
diff --git a/compilation_tools/vtsc/test/golden/PROFILER/TestMsgQ.profiler.cpp b/compilation_tools/vtsc/test/golden/PROFILER/TestMsgQ.profiler.cpp
index 0f045ba..0f0a6c7 100644
--- a/compilation_tools/vtsc/test/golden/PROFILER/TestMsgQ.profiler.cpp
+++ b/compilation_tools/vtsc/test/golden/PROFILER/TestMsgQ.profiler.cpp
@@ -12,7 +12,7 @@
 namespace android {
 namespace vts {
 void profile____android__hardware__tests__msgq__V1_0__ITestMsgQ__EventFlagBits(VariableSpecificationMessage* arg_name,
-::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits arg_val_name) {
+::android::hardware::tests::msgq::V1_0::ITestMsgQ::EventFlagBits arg_val_name __attribute__((__unused__))) {
     arg_name->set_type(TYPE_ENUM);
     arg_name->mutable_scalar_value()->set_uint32_t(static_cast<uint32_t>(arg_val_name));
     arg_name->set_scalar_type("uint32_t");
@@ -20,12 +20,12 @@
 
 
 void HIDL_INSTRUMENTATION_FUNCTION_android_hardware_tests_msgq_V1_0_ITestMsgQ(
-        details::HidlInstrumentor::InstrumentationEvent event,
+        details::HidlInstrumentor::InstrumentationEvent event __attribute__((__unused__)),
         const char* package,
         const char* version,
         const char* interface,
-        const char* method,
-        std::vector<void *> *args) {
+        const char* method __attribute__((__unused__)),
+        std::vector<void *> *args __attribute__((__unused__))) {
     if (strcmp(package, "android.hardware.tests.msgq") != 0) {
         LOG(WARNING) << "incorrect package.";
         return;
@@ -69,12 +69,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 2, actual: " << (*args).size() << ", method name: configureFmqSyncReadWrite, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    bool *result_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_bool_t((*result_val_0));
-                    auto *result_1 = msg.add_return_type_hidl();
-                    ::android::hardware::MQDescriptorSync<uint16_t> *result_val_1 = reinterpret_cast<::android::hardware::MQDescriptorSync<uint16_t>*> ((*args)[1]);
+                    auto *result_1 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::MQDescriptorSync<uint16_t> *result_val_1 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::MQDescriptorSync<uint16_t>*> ((*args)[1]);
                     result_1->set_type(TYPE_FMQ_SYNC);
                     MessageQueue<uint16_t, kSynchronizedReadWrite> result_1_q((*result_val_1), false);
                     for (int i = 0; i < (int)result_1_q.availableToRead(); i++) {
@@ -111,8 +111,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: getFmqUnsyncWrite, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    bool *arg_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    bool *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_bool_t((*arg_val_0));
                     break;
@@ -125,12 +125,12 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 2, actual: " << (*args).size() << ", method name: getFmqUnsyncWrite, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    bool *result_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_bool_t((*result_val_0));
-                    auto *result_1 = msg.add_return_type_hidl();
-                    ::android::hardware::MQDescriptorUnsync<uint16_t> *result_val_1 = reinterpret_cast<::android::hardware::MQDescriptorUnsync<uint16_t>*> ((*args)[1]);
+                    auto *result_1 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    ::android::hardware::MQDescriptorUnsync<uint16_t> *result_val_1 __attribute__((__unused__)) = reinterpret_cast<::android::hardware::MQDescriptorUnsync<uint16_t>*> ((*args)[1]);
                     result_1->set_type(TYPE_FMQ_UNSYNC);
                     MessageQueue<uint16_t, kUnsynchronizedWrite> result_1_q((*result_val_1));
                     for (int i = 0; i < (int)result_1_q.availableToRead(); i++) {
@@ -166,8 +166,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: requestWriteFmqSync, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int32_t *arg_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int32_t((*arg_val_0));
                     break;
@@ -180,8 +180,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: requestWriteFmqSync, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    bool *result_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_bool_t((*result_val_0));
                     break;
@@ -210,8 +210,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: requestReadFmqSync, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int32_t *arg_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int32_t((*arg_val_0));
                     break;
@@ -224,8 +224,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: requestReadFmqSync, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    bool *result_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_bool_t((*result_val_0));
                     break;
@@ -254,8 +254,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: requestWriteFmqUnsync, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int32_t *arg_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int32_t((*arg_val_0));
                     break;
@@ -268,8 +268,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: requestWriteFmqUnsync, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    bool *result_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_bool_t((*result_val_0));
                     break;
@@ -298,8 +298,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: requestReadFmqUnsync, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int32_t *arg_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int32_t((*arg_val_0));
                     break;
@@ -312,8 +312,8 @@
                         LOG(ERROR) << "Number of return values does not match. expect: 1, actual: " << (*args).size() << ", method name: requestReadFmqUnsync, event type: " << event;
                         break;
                     }
-                    auto *result_0 = msg.add_return_type_hidl();
-                    bool *result_val_0 = reinterpret_cast<bool*> ((*args)[0]);
+                    auto *result_0 __attribute__((__unused__)) = msg.add_return_type_hidl();
+                    bool *result_val_0 __attribute__((__unused__)) = reinterpret_cast<bool*> ((*args)[0]);
                     result_0->set_type(TYPE_SCALAR);
                     result_0->mutable_scalar_value()->set_bool_t((*result_val_0));
                     break;
@@ -342,8 +342,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: requestBlockingRead, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int32_t *arg_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int32_t((*arg_val_0));
                     break;
@@ -382,8 +382,8 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 1, actual: " << (*args).size() << ", method name: requestBlockingReadDefaultEventFlagBits, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int32_t *arg_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int32_t((*arg_val_0));
                     break;
@@ -422,12 +422,12 @@
                         LOG(ERROR) << "Number of arguments does not match. expect: 2, actual: " << (*args).size() << ", method name: requestBlockingReadRepeat, event type: " << event;
                         break;
                     }
-                    auto *arg_0 = msg.add_arg();
-                    int32_t *arg_val_0 = reinterpret_cast<int32_t*> ((*args)[0]);
+                    auto *arg_0 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_0 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[0]);
                     arg_0->set_type(TYPE_SCALAR);
                     arg_0->mutable_scalar_value()->set_int32_t((*arg_val_0));
-                    auto *arg_1 = msg.add_arg();
-                    int32_t *arg_val_1 = reinterpret_cast<int32_t*> ((*args)[1]);
+                    auto *arg_1 __attribute__((__unused__)) = msg.add_arg();
+                    int32_t *arg_val_1 __attribute__((__unused__)) = reinterpret_cast<int32_t*> ((*args)[1]);
                     arg_1->set_type(TYPE_SCALAR);
                     arg_1->mutable_scalar_value()->set_int32_t((*arg_val_1));
                     break;
diff --git a/compilation_tools/vtsc/test/golden/PROFILER/types.profiler.cpp b/compilation_tools/vtsc/test/golden/PROFILER/types.profiler.cpp
index 9158fae..313aece 100644
--- a/compilation_tools/vtsc/test/golden/PROFILER/types.profiler.cpp
+++ b/compilation_tools/vtsc/test/golden/PROFILER/types.profiler.cpp
@@ -12,14 +12,14 @@
 namespace android {
 namespace vts {
 void profile____android__hardware__nfc__V1_0__NfcEvent(VariableSpecificationMessage* arg_name,
-::android::hardware::nfc::V1_0::NfcEvent arg_val_name) {
+::android::hardware::nfc::V1_0::NfcEvent arg_val_name __attribute__((__unused__))) {
     arg_name->set_type(TYPE_ENUM);
     arg_name->mutable_scalar_value()->set_uint32_t(static_cast<uint32_t>(arg_val_name));
     arg_name->set_scalar_type("uint32_t");
 }
 
 void profile____android__hardware__nfc__V1_0__NfcStatus(VariableSpecificationMessage* arg_name,
-::android::hardware::nfc::V1_0::NfcStatus arg_val_name) {
+::android::hardware::nfc::V1_0::NfcStatus arg_val_name __attribute__((__unused__))) {
     arg_name->set_type(TYPE_ENUM);
     arg_name->mutable_scalar_value()->set_uint32_t(static_cast<uint32_t>(arg_val_name));
     arg_name->set_scalar_type("uint32_t");
diff --git a/doc/framework_developer_manual.md b/doc/framework_developer_manual.md
deleted file mode 100644
index 84f2bed..0000000
--- a/doc/framework_developer_manual.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# VTS Framework Developer Manual
-
-VTS infrastructure and service design docs will be available publically.
-Until then, please contact Android Partner Engineering.
-
-## 1. Web Dashboard and Notification
-
-[Overview](web/vts_dashboard.md)
\ No newline at end of file
diff --git a/doc/testcase_develop_manual/run_vts_directly.md b/doc/testcase_develop_manual/run_vts_directly.md
index a626fe2..a4a2082 100644
--- a/doc/testcase_develop_manual/run_vts_directly.md
+++ b/doc/testcase_develop_manual/run_vts_directly.md
@@ -2,6 +2,10 @@
 
 First of all, if you have not done [VTS setup](../setup/index.md), that is required here.
 
+## Download required Python packages to local host
+
+`$ . test/vts/script/pypi-packages-local.sh`
+
 ## Build Binaries
 
 `$ cd test/vts/script`
diff --git a/doc/user_manual.md b/doc/user_manual.md
index 86b55d3..0aba7c9 100644
--- a/doc/user_manual.md
+++ b/doc/user_manual.md
@@ -8,8 +8,17 @@
 
 ### 1.1. Host setup
 
+Please follow:
+
 * [Setup Manual](setup/index.md)
 
+(Optional)
+During VTS test runs, required Python packages are downloaded from the [Python Package Index](https://pypi.python.org/simple/). There is an option to instead install these packages from a local directory during test runtime by predownloading the packages. First run the lunch command, then set an environment variable VTS_PYPI_PATH as a new local directory to host the Python packages. Then run the download-pypi-packages.sh script:
+
+* `$ cd ${branch}`
+
+* `$ . test/vts/script/download-pypi-packages.sh`
+
 ### 1.2. Checkout master git repository
 
 [Download Android Source Code](https://source.android.com/source/downloading.html)
diff --git a/doc/web/google_app_engine_architecture.png b/doc/web/google_app_engine_architecture.png
deleted file mode 100644
index a81a019..0000000
--- a/doc/web/google_app_engine_architecture.png
+++ /dev/null
Binary files differ
diff --git a/doc/web/high_level_design.png b/doc/web/high_level_design.png
deleted file mode 100644
index 6a30552..0000000
--- a/doc/web/high_level_design.png
+++ /dev/null
Binary files differ
diff --git a/doc/web/notification_samples.md b/doc/web/notification_samples.md
deleted file mode 100644
index fc97131..0000000
--- a/doc/web/notification_samples.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# VTS Dashboard Notification Samples
-
-## Introduction
-
-The VTS Alert and Performance jobs monitor the Dashboard for changes on a regular
-basis. The services notify subscibers via email when attention is required.
-
-## VTS Alert Job
-
-The alerting job monitors for test breakages, fixes, and loss of service. When
-new data is uploaded to the database, the alerting job scans for breakages or fixes
-and sends emails accordingly. If tests are idle for more than 24 hours, a warning
-is sent out as well.
-
-### Sample Email
-
-<div style='border: 1px solid gray; padding: 25px; margin: 20px 0'>
-<i><b>Subject:</b> New test failures in SampleCameraV2Test @ 3572205</i><br><br>
-Hello,<br><br>Test cases are failing in SampleCameraV2Test for device build ID(s): 3572205.<br><br>
-The following test cases failed in the latest test run:<br>
-- <b>testCameraNormal</b><br><br><br>
-
-For details, visit the <a href="#">VTS dashboard.</a>
-</div>
-
-## VTS Performance Digests
-
-Each day, the VTS Dashboard scans tests which have accompanying performance
-data. If so, it compares the past 24 hours to the 24 hours that preceeded it and
-summaries the changes in performance.
-
-### Sample Email
-
-<div style='border: 1px solid gray; padding: 25px; margin: 20px 0'>
-<i><b>Subject:</b> Daily Performance Digest: BinderPerformanceTest</i><br><br>
-<p style='font-family: arial'><b>BinderPerformanceTest</b></p><table cellpadding='2' style='border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='7'>binder_vector_roundtrip_latency_benchmark_64bits</td></tr><tr><td colspan='7'>Roundtrip Binder RPC Latency (nanoseconds)</td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' ></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='2'>12-15-2016</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='2'>12-14-2016</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='2'>Difference</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Message Size (Bytes)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>4</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>65263.43</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>16243.85</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>61950.12</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>15198.13</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.05348354679551394);'>3313.32</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.06880574577749773);'>1045.72</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>8</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>62017.23</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>15297.71</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>60683.64</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>14546.73</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.021976199308481374);'>1333.6</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.05162533230917583);'>750.98</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>16</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>59171.27</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>14061.87</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>58840.29</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>14305.1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.0056250589761115315);'>330.99</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-243.23</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>32</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>60201.4</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13759.66</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>57687.63</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>14320.71</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.04357542043270162);'>2513.77</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-561.05</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>64</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>59526</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13138.61</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>58134.28</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13776.87</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.02393979154608629);'>1391.73</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-638.26</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>128</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>59658.09</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>12699.15</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>58215.99</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13895.32</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.02477162979154056);'>1442.11</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-1196.17</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>256</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>58869.27</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13307.27</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>57888.51</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13175.08</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.016942232349139386);'>980.77</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.010033364490373902);'>132.2</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>512</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>60097.32</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13595.57</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>58211.45</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13352.47</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.03239680669694265);'>1885.87</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.018206369625088432);'>243.1</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>1024</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>59900.84</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13540.77</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>58655.61</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13696.13</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.021229565030634223);'>1245.24</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-155.36</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>2k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>60377.91</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13060.9</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>60063.71</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13907.18</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.005231078774897549);'>314.2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-846.27</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>4k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>77967.83</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>16944.06</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>76550.12</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>18052.7</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.018520011278221876);'>1417.71</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-1108.63</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>8k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>90121.44</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>21365.7</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>87814.47</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>22779.75</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.02627099084257229);'>2306.98</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-1414.05</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>16k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>123431.76</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>24890.05</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>116002.24</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>27537.16</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.06404635766565732);'>7429.53</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-2647.11</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>32k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>179830.98</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>37024.92</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>179219.42</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>40480.43</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.0034123528276210962);'>611.56</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-3455.5</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>64k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>310777.84</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>68022.61</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>325255.19</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>73006.23</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-14477.35</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-4983.61</td></tr></table><br><table cellpadding='2' style='border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='7'>binder_vector_roundtrip_latency_benchmark_32bits</td></tr><tr><td colspan='7'>Roundtrip Binder RPC Latency (nanoseconds)</td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' ></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='2'>12-15-2016</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='2'>12-14-2016</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='2'>Difference</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Message Size (Bytes)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>4</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>56309.18</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13006.27</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>52456.53</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>9413.16</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.07344467700622763);'>3852.66</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.3817111941575617);'>3593.11</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>8</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>56697.55</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13180.45</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>52979.84</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>9885.85</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.07017220506617967);'>3717.72</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.3332647598238697);'>3294.61</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>16</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>57496.8</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>12518.8</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>53909.06</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>10273.64</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.0665517258404399);'>3587.75</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.21853593904259516);'>2245.16</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>32</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>57159.51</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>12736.12</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>53308.35</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>10055.59</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.07224310715938732);'>3851.17</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.2665714523398815);'>2680.54</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>64</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>57339.59</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>12823.4</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>53487.21</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>10158.66</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.07202424546046335);'>3852.38</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.26231286775275375);'>2664.75</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>128</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>56847.74</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13227.75</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>53429.37</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>10033.76</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.0639791653819366);'>3418.37</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.3183236013355946);'>3193.99</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>256</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>56602.05</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13421.4</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>53552.06</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>10186.89</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.05695376750564279);'>3050</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.31751710651965814);'>3234.51</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>512</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>56847.58</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13612.71</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>53603.97</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>9695.52</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.060510768173666414);'>3243.62</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.4040216055624986);'>3917.2</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>1024</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>57763.24</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13104.91</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>54644.6</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>9829.59</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.05707142632570563);'>3118.65</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.3332103586458765);'>3275.33</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>2k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>59425.7</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>12980.45</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>56566.91</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>9826.89</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.050538310013586586);'>2858.8</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.32091148755758103);'>3153.57</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>4k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>76829.82</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>15204.6</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>73593.79</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>13091.01</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.04397155961413002);'>3236.04</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.16145347317506317);'>2113.59</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>8k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>88549.51</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>19759.19</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>82768.58</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>15674.11</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.06984458128993302);'>5780.94</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.2606261864393722);'>4085.09</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>16k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>112841.27</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>27083.73</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>103774.14</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>21473.39</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.08737362661583523);'>9067.13</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.26126945416091857);'>5610.34</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>32k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>156421.89</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>42701.39</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>148318.5</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>33647.01</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.05463504947732912);'>8103.39</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.26909911742510617);'>9054.39</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>64k</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>272601.44</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>89228.41</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>272605.1</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>72075.39</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;background-color: rgba(255, 0, 0, 0.0);'>-3.65</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;background-color: rgba(255, 0, 0, 0.2379872529135535);'>17153.03</td></tr></table>
-</div>
diff --git a/doc/web/vts_dashboard.md b/doc/web/vts_dashboard.md
deleted file mode 100644
index 638131a..0000000
--- a/doc/web/vts_dashboard.md
+++ /dev/null
@@ -1,146 +0,0 @@
-# VTS Dashboard
-
-## Introduction
-
-The VTS Dashboard displays the summarized results of the Multi Device Tests along with graphs.
-
-## High Level Design
-
-The high level view is that tests are through TradeFed on multiple devices and results are uploaded to cloud Bigtable
-database using Protocol Buffer. The Google App Engine then reads data from the cloud and presents it on the dashboard.
-
-![alt tag](high_level_design.png)
-
-## Google App Engine Architecture
-
-The following diagram discusses the flow of the dashboard wrt to the directory :
-`/vts/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet`
-
-![alt tag](google_app_engine_architecture.png)
-
-## Installation
-
-### Steps to run locally:
-
-1. Google App Engine uses Java 8. Install Java 8 before running running locally:
-   'sudo apt install openjdk-8-jdk'
-
-   To use java 8:
-   Copy the following lines in ~/.bashrc :
-
-```
-    function setup_jdk() {
-      # Remove the current JDK from PATH
-      if [ -n "$JAVA_HOME" ] ; then
-        PATH=${PATH/$JAVA_HOME\/bin:/}
-      fi
-      export JAVA_HOME=$1
-      export PATH=$JAVA_HOME/bin:$PATH
-    }
-
-    function use_java8() {
-    #  setup_jdk /usr/java/jre1.8.0_73
-      setup_jdk /usr/lib/jvm/java-8-openjdk-amd64
-    }
-
-    Then from cmd:
-    $ use_java8
-```
-
-2. Maven is used for build. Install Maven 3.3.9:
-   Download `maven` from:
-   https://maven.apache.org/download.cgi
-
-   Steps to Install Maven:
-   1) Unzip the Binary tar:
-      `tar -zxf apache-maven-3.3.3-bin.tar.gz`
-
-   2) Move the application directory to `/usr/local`:
-      `sudo cp -R apache-maven-3.3.3 /usr/local`
-
-   3) Make a soft link in `/usr/bin` for universal access of `mvn`:
-      `sudo ln -s /usr/local/apache-maven-3.3.3/bin/mvn /usr/bin/mvn`
-
-   4) Verify maven installation:
-      `$ mvn -v`
-
-      The output should resemble this:
-
-```
-      Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T08:41:47-08:00)
-      Maven home: /opt/apache-maven-3.3.9
-      Java version: 1.8.0_45-internal, vendor: Oracle Corporation
-      Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
-      Default locale: en_US, platform encoding: UTF-8
-      OS name: "linux", version: "3.13.0-88-generic", arch: "amd64", family: "unix"
-```
-
-3. Install Google Cloud SDK. Follow the instructions listed on official source:
-   https://cloud.google.com/sdk/docs/quickstart-linux
-
-   The default location where the application searches for a google-cloud-sdk is:
-   `/usr/local/share/google/google-cloud-sdk`
-
-   Therefore move the extracted folder to this location: `/usr/local/share/google/`
-
-   Otherwise, to have a custom location, specify the location of
-   google-cloud-sdk in `/vts/web/dashboard/appengine/servlet/pom.xml` by putting the configuration:
-
-```
-   <configuration>
-     <gcloud_directory>PATH/TO/GCLOUD_DIRECTORY</gcloud_directory>
-   </configuration>
-```
-   within the 'com.google.appengine' plugin tag :
-
-   Install the Google App Engine Python SDK:
-   https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Python
-
-4. Configure Source Code API access
-
-   To access source code using the Gerrit API, the App Engine project must be
-   configured with an authentication scope, a request URI, and a client ID.
-   These parameters are required to authenticate over the REST API.
-
-   1) Enable CORS. Ensure that the VTS dashboard's domain is authorized to make requests
-      to the Gerrit server using cross-origin resource sharing (CORS). This is only
-      necessary if the source code is hosted on a different domain than the VTS
-      dashboard. Simply add the VTS dashboard's domain to the configuration file
-      specifying allowed CORS origins.
-
-   2) Create a client ID. Navigate to https://pantheon.corp.google.com/apis/credentials
-      and create an OAuth client ID. Add the VTS dashboard's domain to the list
-      of authorized JavaScript origins in order to permit authenticated RESTful
-      calls from the dashboard.
-
-   3) Specify auth scope, request URI, and client ID in pom.xml. Enter the two
-      addresses and the client ID in the file dashboard/appengine/servlet/pom.xml
-      in the tags gerrit.scope, gerrit.uri, and appengine.clientId.
-
-5. (Optional) Configure App Engine authorized senders
-
-   In order for the dashboard to send alert emails when test failures occur, the
-   sender address must be added to the authorized list. Navigate to the App Engine
-   settings page and edit the list "Email API Authorized senders". The address
-   VTS_EMAIL_ADDRESS in VtsAlertJobServlet must be authorized before alerts will
-   successfully send. For more information about sending mail on App Engine, visit:
-   https://cloud.google.com/appengine/docs/java/mail/
-
-## To run GAE on local machine:
-
-`$ cd web/dashboard/appengine/servlet`
-`$ mvn clean gcloud:run`
-
-## To deploy to Google App Engine
-
-Caution: only a release engineer must do the following based on a procedure.
-
-`$ cd web/dashboard/appengine/servlet`
-`$ mvn clean gcloud:deploy`
-
-To update cron jobs
-
-`$ cd web/dashboard/appengine/servlet`
-`$ <your appengine-java-sdk dir>/bin/appcfg.sh update_cron src/main/webapp/`
-
-visit https://<YOUR-PROJECT-NAME>.googleplex.com
diff --git a/drivers/Android.bp b/drivers/Android.bp
index 5293ef8..b07159c 100644
--- a/drivers/Android.bp
+++ b/drivers/Android.bp
@@ -15,5 +15,4 @@
 subdirs = [
      "hal",
      "libdrivercomm",
-     "libprofiling",
 ]
diff --git a/drivers/hal/Android.bp b/drivers/hal/Android.bp
index 288a941..4a31f87 100644
--- a/drivers/hal/Android.bp
+++ b/drivers/hal/Android.bp
@@ -19,4 +19,6 @@
      "libcodecoverage",
      "libdatatype",
      "libmeasurement",
+     "replayer",
+     "server",
 ]
diff --git a/drivers/hal/common/Android.bp b/drivers/hal/common/Android.bp
index 6895bd1..0b508ff 100644
--- a/drivers/hal/common/Android.bp
+++ b/drivers/hal/common/Android.bp
@@ -25,10 +25,8 @@
     ],
 
     srcs: [
-        "specification_parser/InterfaceSpecificationParser.cpp",
         "utils/InterfaceSpecUtil.cpp",
         "utils/StringUtil.cpp",
-        "utils/VtsProfilingUtil.cpp"
     ],
 
     include_dirs: [
@@ -52,11 +50,10 @@
             srcs: [
                 "binder/VtsFuzzerBinderService.cpp",
                 "component_loader/DllLoader.cpp",
-                "fuzz_tester/FuzzerBase.cpp",
-                "fuzz_tester/FuzzerCallbackBase.cpp",
-                "fuzz_tester/FuzzerWrapper.cpp",
-                "specification_parser/SpecificationBuilder.cpp",
-                "replayer/VtsHidlHalReplayer.cpp",
+                "component_loader/HalDriverLoader.cpp",
+                "driver_base/DriverBase.cpp",
+                "driver_base/DriverCallbackBase.cpp",
+                "driver_manager/VtsHalDriverManager.cpp",
             ],
             shared_libs: [
                 "libbinder",
diff --git a/drivers/hal/common/binder/VtsFuzzerBinderService.cpp b/drivers/hal/common/binder/VtsFuzzerBinderService.cpp
index 449ad5d..283ea8d 100644
--- a/drivers/hal/common/binder/VtsFuzzerBinderService.cpp
+++ b/drivers/hal/common/binder/VtsFuzzerBinderService.cpp
@@ -109,7 +109,7 @@
   return res;
 }
 
-const char* BpVtsFuzzer::Call(const string& call_payload) {
+string BpVtsFuzzer::Call(const string& call_payload) {
   Parcel data, reply;
   data.writeInterfaceToken(IVtsFuzzer::getInterfaceDescriptor());
   data.writeCString(call_payload.c_str());
@@ -129,7 +129,7 @@
   }
 
   printf("len(reply) = %zu\n", strlen(res));
-  return res;
+  return {res};
 }
 
 const char* BpVtsFuzzer::GetFunctions() {
diff --git a/drivers/hal/common/component_loader/HalDriverLoader.cpp b/drivers/hal/common/component_loader/HalDriverLoader.cpp
new file mode 100644
index 0000000..f64c209
--- /dev/null
+++ b/drivers/hal/common/component_loader/HalDriverLoader.cpp
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "component_loader/HalDriverLoader.h"
+
+#include <cutils/properties.h>
+#include <dirent.h>
+#include <google/protobuf/text_format.h>
+#include <iostream>
+
+#include "utils/InterfaceSpecUtil.h"
+#include "utils/StringUtil.h"
+
+static constexpr const char* kSpecFileExt = ".vts";
+static constexpr const char* kDefaultHwbinderServiceName = "default";
+
+namespace android {
+namespace vts {
+
+HalDriverLoader::HalDriverLoader(const string dir_path, int epoch_count,
+                                 const string& callback_socket_name)
+    : dir_path_(dir_path),
+      epoch_count_(epoch_count),
+      callback_socket_name_(callback_socket_name) {}
+
+bool HalDriverLoader::FindComponentSpecification(
+    const int component_class, const string& package_name, const float version,
+    const string& component_name, const int component_type,
+    const string& submodule_name, ComponentSpecificationMessage* spec_msg) {
+  DIR* dir;
+  struct dirent* ent;
+
+  // Derive the package-specific dir which contains .vts files
+  string driver_lib_dir = dir_path_;
+  if (!endsWith(driver_lib_dir, "/")) {
+    driver_lib_dir += "/";
+  }
+  string package_path = package_name;
+  ReplaceSubString(package_path, ".", "/");
+  driver_lib_dir += package_path + "/";
+  driver_lib_dir += GetVersionString(version);
+
+  if (!(dir = opendir(driver_lib_dir.c_str()))) {
+    cerr << __func__ << ": Can't open dir " << driver_lib_dir << endl;
+    return false;
+  }
+
+  while ((ent = readdir(dir))) {
+    if (ent->d_type == DT_REG &&
+        string(ent->d_name).find(kSpecFileExt) != std::string::npos) {
+      cout << __func__ << ": Checking a file " << ent->d_name << endl;
+      const string file_path = driver_lib_dir + "/" + string(ent->d_name);
+      if (ParseInterfaceSpec(file_path.c_str(), spec_msg)) {
+        if (spec_msg->component_class() != component_class) {
+          continue;
+        }
+        if (spec_msg->component_class() != HAL_HIDL) {
+          if (spec_msg->component_type() != component_type ||
+              spec_msg->component_type_version() != version) {
+            continue;
+          }
+          if (!submodule_name.empty()) {
+            if (spec_msg->component_class() != HAL_CONVENTIONAL_SUBMODULE ||
+                spec_msg->original_data_structure_name() != submodule_name) {
+              continue;
+            }
+          }
+          closedir(dir);
+          return true;
+        } else {
+          if (spec_msg->package() != package_name ||
+              spec_msg->component_type_version() != version) {
+            continue;
+          }
+          if (!component_name.empty()) {
+            if (spec_msg->component_name() != component_name) {
+              continue;
+            }
+          }
+          closedir(dir);
+          return true;
+        }
+      }
+    }
+  }
+  closedir(dir);
+  return false;
+}
+
+DriverBase* HalDriverLoader::GetDriver(
+    const string& driver_lib_path,
+    const ComponentSpecificationMessage& spec_msg,
+    const string& hw_binder_service_name, const uint64_t interface_pt,
+    bool with_interface_pointer, const string& dll_file_name,
+    const string& target_func_name) {
+  DriverBase* driver = nullptr;
+  if (spec_msg.component_class() == HAL_HIDL) {
+    driver = GetHidlHalDriver(driver_lib_path, spec_msg, hw_binder_service_name,
+                              interface_pt, with_interface_pointer);
+  } else {
+    driver = GetConventionalHalDriver(driver_lib_path, spec_msg, dll_file_name,
+                                      target_func_name);
+  }
+  cout << __func__ << ":" << __LINE__ << " loaded target comp" << endl;
+
+  return driver;
+}
+
+DriverBase* HalDriverLoader::GetConventionalHalDriver(
+    const string& driver_lib_path,
+    const ComponentSpecificationMessage& spec_msg, const string& dll_file_name,
+    const string& /*target_func_name*/) {
+  DriverBase* driver = LoadDriver(driver_lib_path, spec_msg);
+  if (!driver) {
+    cerr << __func__ << ": couldn't get a driver base class" << endl;
+    return nullptr;
+  }
+  if (!driver->LoadTargetComponent(dll_file_name.c_str())) {
+    cerr << __FUNCTION__ << ": couldn't load target component file, "
+         << dll_file_name << endl;
+    return nullptr;
+  }
+  return driver;
+  /*
+   * TODO: now always return the fuzzer. this change is due to the difficulty
+   * in checking nested apis although that's possible. need to check whether
+   * Fuzz() found the function, while still distinguishing the difference
+   * between that and defined but non-set api.
+  if (!strcmp(target_func_name, "#Open")) return driver;
+
+  for (const vts::FunctionSpecificationMessage& func_msg : spec_msg.api())
+  {
+    cout << "checking " << func_msg.name() << endl;
+    if (!strcmp(target_func_name, func_msg.name().c_str())) {
+      return driver;
+    }
+  }
+  return NULL;
+  */
+}
+
+DriverBase* HalDriverLoader::GetDriverForSubModule(
+    const string& spec_lib_file_path,
+    const ComponentSpecificationMessage& spec_msg, void* object_pointer) {
+  cout << __func__ << ":" << __LINE__ << " "
+       << "entry object_pointer " << ((uint64_t)object_pointer) << endl;
+  DriverBase* driver = LoadDriver(spec_lib_file_path, spec_msg);
+  if (!driver) {
+    cerr << __FUNCTION__ << ": couldn't get a driver base class" << endl;
+    return nullptr;
+  }
+
+  cout << __func__ << ":" << __LINE__ << " "
+       << "got fuzzer" << endl;
+  if (spec_msg.component_class() == HAL_HIDL) {
+    cerr << __func__ << " HIDL not supported" << endl;
+    return nullptr;
+  } else {
+    if (!driver->SetTargetObject(object_pointer)) {
+      cerr << __FUNCTION__ << ": couldn't set target object" << endl;
+      return nullptr;
+    }
+  }
+  cout << __func__ << ":" << __LINE__ << " "
+       << "loaded target comp" << endl;
+  return driver;
+}
+
+DriverBase* HalDriverLoader::GetFuzzerBaseAndAddAllFunctionsToQueue(
+    const char* driver_lib_path,
+    const ComponentSpecificationMessage& iface_spec_msg,
+    const char* dll_file_name, const char* hw_service_name) {
+  DriverBase* driver = GetDriver(driver_lib_path, iface_spec_msg,
+                                 hw_service_name, 0, false, dll_file_name, "");
+  if (!driver) {
+    cerr << __FUNCTION__ << ": couldn't get a driver base class" << endl;
+    return NULL;
+  }
+
+  for (const FunctionSpecificationMessage& func_msg :
+       iface_spec_msg.interface().api()) {
+    cout << "Add a job " << func_msg.name() << endl;
+    FunctionSpecificationMessage* func_msg_copy = func_msg.New();
+    func_msg_copy->CopyFrom(func_msg);
+    job_queue_.push(make_pair(func_msg_copy, driver));
+  }
+  return driver;
+}
+
+DriverBase* HalDriverLoader::GetHidlHalDriver(
+    const string& driver_lib_path,
+    const ComponentSpecificationMessage& spec_msg,
+    const string& hal_service_name, const uint64_t interface_pt,
+    bool with_interface_pt) {
+  string package_name = spec_msg.package();
+
+  DriverBase* driver = nullptr;
+  if (with_interface_pt) {
+    driver =
+        LoadDriverWithInterfacePointer(driver_lib_path, spec_msg, interface_pt);
+  } else {
+    driver = LoadDriver(driver_lib_path, spec_msg);
+  }
+  if (!driver) {
+    cerr << __func__ << ": couldn't get a driver base class" << endl;
+    return nullptr;
+  }
+  cout << __func__ << ":" << __LINE__ << " "
+       << "got driver" << endl;
+
+  if (!with_interface_pt) {
+    string service_name;
+    if (!hal_service_name.empty()) {
+      service_name = hal_service_name;
+    } else {
+      service_name = kDefaultHwbinderServiceName;
+    }
+
+    char get_sub_property[PROPERTY_VALUE_MAX];
+    bool get_stub = false; /* default is binderized */
+    if (property_get("vts.hidl.get_stub", get_sub_property, "") > 0) {
+      if (!strcmp(get_sub_property, "true") ||
+          !strcmp(get_sub_property, "True") || !strcmp(get_sub_property, "1")) {
+        get_stub = true;
+      }
+    }
+    if (!driver->GetService(get_stub, service_name.c_str())) {
+      cerr << __FUNCTION__ << ": couldn't get service" << endl;
+      return nullptr;
+    }
+  } else {
+    cout << __func__ << ":" << __LINE__
+         << " created DriverBase with interface pointer:" << interface_pt
+         << endl;
+  }
+  cout << __func__ << ":" << __LINE__ << " loaded target comp" << endl;
+  return driver;
+}
+
+DriverBase* HalDriverLoader::LoadDriver(
+    const string& driver_lib_path,
+    const ComponentSpecificationMessage& spec_msg) {
+  if (!dll_loader_.Load(driver_lib_path.c_str(), false)) {
+    cerr << __func__ << ": failed to load  " << driver_lib_path << endl;
+    return nullptr;
+  }
+  cout << "DLL loaded " << driver_lib_path << endl;
+  string function_name_prefix = GetFunctionNamePrefix(spec_msg);
+  loader_function func =
+      dll_loader_.GetLoaderFunction(function_name_prefix.c_str());
+  if (!func) {
+    cerr << __func__ << ": function not found." << endl;
+    return nullptr;
+  }
+  cout << __func__ << ": function found; trying to call." << endl;
+  DriverBase* driver = func();
+  return driver;
+}
+
+DriverBase* HalDriverLoader::LoadDriverWithInterfacePointer(
+    const string& driver_lib_path,
+    const ComponentSpecificationMessage& spec_msg,
+    const uint64_t interface_pt) {
+  // Assumption: no shared library lookup is needed because that is handled
+  // the by the driver's linking dependency.
+  // Example: name (android::hardware::gnss::V1_0::IAGnssRil) converted to
+  // function name (vts_func_4_android_hardware_tests_bar_V1_0_IBar_with_arg)
+  if (!dll_loader_.Load(driver_lib_path.c_str(), false)) {
+    cerr << __func__ << ": failed to load  " << driver_lib_path << endl;
+    return nullptr;
+  }
+  cout << "DLL loaded " << driver_lib_path << endl;
+  string function_name_prefix = GetFunctionNamePrefix(spec_msg);
+  function_name_prefix += "with_arg";
+  loader_function_with_arg func =
+      dll_loader_.GetLoaderFunctionWithArg(function_name_prefix.c_str());
+  if (!func) {
+    cerr << __func__ << ": function not found." << endl;
+    return nullptr;
+  }
+  return func(interface_pt);
+}
+
+bool HalDriverLoader::Process(const char* dll_file_name,
+                              const char* spec_lib_file_path, int target_class,
+                              int target_type, float target_version,
+                              const char* target_package,
+                              const char* target_component_name,
+                              const char* hal_service_name) {
+  ComponentSpecificationMessage interface_specification_message;
+  if (!FindComponentSpecification(target_class, target_package, target_version,
+                                  target_component_name, target_type, "",
+                                  &interface_specification_message)) {
+    cerr << __func__ << ": no interface specification file found for class "
+         << target_class << " type " << target_type << " version "
+         << target_version << endl;
+    return false;
+  }
+
+  if (!GetFuzzerBaseAndAddAllFunctionsToQueue(
+          spec_lib_file_path, interface_specification_message, dll_file_name,
+          hal_service_name)) {
+    return false;
+  }
+
+  for (int i = 0; i < epoch_count_; i++) {
+    // by default, breath-first-searching is used.
+    if (job_queue_.empty()) {
+      cerr << "no more job to process; stopping after epoch " << i << endl;
+      break;
+    }
+
+    pair<vts::FunctionSpecificationMessage*, DriverBase*> curr_job =
+        job_queue_.front();
+    job_queue_.pop();
+
+    vts::FunctionSpecificationMessage* func_msg = curr_job.first;
+    DriverBase* func_fuzzer = curr_job.second;
+
+    void* result;
+    FunctionSpecificationMessage result_msg;
+    cout << "Iteration " << (i + 1) << " Function " << func_msg->name() << endl;
+    // For Hidl HAL, use CallFunction method.
+    if (interface_specification_message.component_class() == HAL_HIDL) {
+      func_fuzzer->CallFunction(*func_msg, callback_socket_name_, &result_msg);
+    } else {
+      func_fuzzer->Fuzz(func_msg, &result, callback_socket_name_);
+    }
+    if (func_msg->return_type().type() == TYPE_PREDEFINED) {
+      if (result != NULL) {
+        // loads that interface spec and enqueues all functions.
+        cout << __FUNCTION__
+             << " return type: " << func_msg->return_type().predefined_type()
+             << endl;
+        // TODO: handle the case when size > 1
+        string submodule_name = func_msg->return_type().predefined_type();
+        while (!submodule_name.empty() &&
+               (std::isspace(submodule_name.back()) ||
+                submodule_name.back() == '*')) {
+          submodule_name.pop_back();
+        }
+        ComponentSpecificationMessage iface_spec_msg;
+        if (FindComponentSpecification(target_class, "", target_version, "",
+                                       target_type, submodule_name,
+                                       &iface_spec_msg)) {
+          cout << __FUNCTION__ << " submodule found - " << submodule_name
+               << endl;
+          if (!GetFuzzerBaseAndAddAllFunctionsToQueue(
+                  spec_lib_file_path, iface_spec_msg, dll_file_name,
+                  hal_service_name)) {
+            return false;
+          }
+        } else {
+          cout << __FUNCTION__ << " submodule not found - " << submodule_name
+               << endl;
+        }
+      } else {
+        cout << __FUNCTION__ << " return value = NULL" << endl;
+      }
+    }
+  }
+
+  return true;
+}
+
+}  // namespace vts
+}  // namespace android
diff --git a/drivers/hal/common/fuzz_tester/FuzzerBase.cpp b/drivers/hal/common/driver_base/DriverBase.cpp
similarity index 88%
rename from drivers/hal/common/fuzz_tester/FuzzerBase.cpp
rename to drivers/hal/common/driver_base/DriverBase.cpp
index 927e56c..90a07cd 100644
--- a/drivers/hal/common/fuzz_tester/FuzzerBase.cpp
+++ b/drivers/hal/common/driver_base/DriverBase.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "fuzz_tester/FuzzerBase.h"
+#include "driver_base/DriverBase.h"
 
 #include <dirent.h>
 #include <stdio.h>
@@ -253,7 +253,7 @@
   remove(path);
 }
 
-FuzzerBase::FuzzerBase(int target_class)
+DriverBase::DriverBase(int target_class)
     : device_(NULL),
       hmi_(NULL),
       target_dll_path_(NULL),
@@ -261,17 +261,13 @@
       component_filename_(NULL),
       gcov_output_basepath_(NULL) {}
 
-FuzzerBase::~FuzzerBase() { free(component_filename_); }
+DriverBase::~DriverBase() { free(component_filename_); }
 
-void wfn() {
-  cout << __func__ << endl;
-}
+void wfn() { cout << __func__ << endl; }
 
-void ffn() {
-  cout << __func__ << endl;
-}
+void ffn() { cout << __func__ << endl; }
 
-bool FuzzerBase::LoadTargetComponent(const char* target_dll_path) {
+bool DriverBase::LoadTargetComponent(const char* target_dll_path) {
   cout << __func__ << ":" << __LINE__ << " entry" << endl;
   if (target_dll_path && target_dll_path_ &&
       !strcmp(target_dll_path, target_dll_path_)) {
@@ -325,18 +321,18 @@
   return true;
 }
 
-bool FuzzerBase::SetTargetObject(void* object_pointer) {
+bool DriverBase::SetTargetObject(void* object_pointer) {
   device_ = NULL;
   hmi_ = reinterpret_cast<struct hw_module_t*>(object_pointer);
   return true;
 }
 
-bool FuzzerBase::GetService(bool /*get_stub*/, const char* /*service_name*/) {
+bool DriverBase::GetService(bool /*get_stub*/, const char* /*service_name*/) {
   cerr << __func__ << " not impl" << endl;
   return false;
 }
 
-int FuzzerBase::OpenConventionalHal(const char* module_name) {
+int DriverBase::OpenConventionalHal(const char* module_name) {
   cout << __func__ << endl;
   if (module_name) cout << __func__ << " " << module_name << endl;
   device_ = target_loader_.OpenConventionalHal(module_name);
@@ -345,7 +341,7 @@
   return 0;
 }
 
-bool FuzzerBase::Fuzz(vts::ComponentSpecificationMessage* message,
+bool DriverBase::Fuzz(vts::ComponentSpecificationMessage* message,
                       void** result) {
   cout << __func__ << " Fuzzing target component: "
        << "class " << message->component_class() << " type "
@@ -361,7 +357,7 @@
   return true;
 }
 
-void FuzzerBase::FunctionCallBegin() {
+void DriverBase::FunctionCallBegin() {
   char product_path[4096];
   char product[128];
   char module_basepath[4096];
@@ -453,33 +449,31 @@
   cout << __func__ << ":" << __LINE__ << " end" << endl;
 }
 
-bool FuzzerBase::ReadGcdaFile(
-    const string& basepath, const string& filename,
-    FunctionSpecificationMessage* msg) {
+bool DriverBase::ReadGcdaFile(const string& basepath, const string& filename,
+                              FunctionSpecificationMessage* msg) {
 #if VTS_GCOV_DEBUG
-      cout << __func__ << ":" << __LINE__
-           << " file = " << dent->d_name << endl;
+  cout << __func__ << ":" << __LINE__ << " file = " << dent->d_name << endl;
 #endif
   if (string(filename).rfind(".gcda") != string::npos) {
     string buffer = basepath + "/" + filename;
     vector<unsigned> processed_data =
-      android::vts::GcdaRawCoverageParser(buffer.c_str()).Parse();
+        android::vts::GcdaRawCoverageParser(buffer.c_str()).Parse();
     for (const auto& data : processed_data) {
       msg->mutable_processed_coverage_data()->Add(data);
     }
 
     FILE* gcda_file = fopen(buffer.c_str(), "rb");
     if (!gcda_file) {
-      cerr << __func__ << ":" << __LINE__
-           << " Unable to open a gcda file. " << buffer << endl;
+      cerr << __func__ << ":" << __LINE__ << " Unable to open a gcda file. "
+           << buffer << endl;
     } else {
-      cout << __func__ << ":" << __LINE__
-           << " Opened a gcda file. " << buffer << endl;
+      cout << __func__ << ":" << __LINE__ << " Opened a gcda file. " << buffer
+           << endl;
       fseek(gcda_file, 0, SEEK_END);
       long gcda_file_size = ftell(gcda_file);
 #if VTS_GCOV_DEBUG
-      cout << __func__ << ":" << __LINE__
-           << " File size " << gcda_file_size << " bytes" << endl;
+      cout << __func__ << ":" << __LINE__ << " File size " << gcda_file_size
+           << " bytes" << endl;
 #endif
       fseek(gcda_file, 0, SEEK_SET);
 
@@ -489,12 +483,11 @@
              << "Unable to allocate memory to read a gcda file. " << endl;
       } else {
         if (fread(gcda_file_buffer, gcda_file_size, 1, gcda_file) != 1) {
-          cerr << __func__ << ":" << __LINE__
-               << "File read error" << endl;
+          cerr << __func__ << ":" << __LINE__ << "File read error" << endl;
         } else {
 #if VTS_GCOV_DEBUG
-          cout << __func__ << ":" << __LINE__
-               << " GCDA field populated." << endl;
+          cout << __func__ << ":" << __LINE__ << " GCDA field populated."
+               << endl;
 #endif
           gcda_file_buffer[gcda_file_size] = '\0';
           NativeCodeCoverageRawDataMessage* raw_msg =
@@ -519,20 +512,19 @@
   return false;
 }
 
-bool FuzzerBase::ScanAllGcdaFiles(
-    const string& basepath, FunctionSpecificationMessage* msg) {
+bool DriverBase::ScanAllGcdaFiles(const string& basepath,
+                                  FunctionSpecificationMessage* msg) {
   DIR* srcdir = opendir(basepath.c_str());
   if (!srcdir) {
-    cerr << __func__ << ":" << __LINE__
-         << " couln't open " << basepath << endl;
+    cerr << __func__ << ":" << __LINE__ << " couln't open " << basepath << endl;
     return false;
   }
 
   struct dirent* dent;
   while ((dent = readdir(srcdir)) != NULL) {
 #if VTS_GCOV_DEBUG
-    cout << __func__ << ":" << __LINE__
-         << " readdir(" << basepath << ") for " << dent->d_name << endl;
+    cout << __func__ << ":" << __LINE__ << " readdir(" << basepath << ") for "
+         << dent->d_name << endl;
 #endif
     struct stat st;
     if (strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0) {
@@ -549,14 +541,13 @@
     }
   }
 #if VTS_GCOV_DEBUG
-  cout << __func__ << ":" << __LINE__
-       << " closedir(" << srcdir << ")" << endl;
+  cout << __func__ << ":" << __LINE__ << " closedir(" << srcdir << ")" << endl;
 #endif
   closedir(srcdir);
   return true;
 }
 
-bool FuzzerBase::FunctionCallEnd(FunctionSpecificationMessage* msg) {
+bool DriverBase::FunctionCallEnd(FunctionSpecificationMessage* msg) {
   cout << __func__ << ": gcov flush " << endl;
 #if USE_GCOV
   target_loader_.GcovFlush();
@@ -584,8 +575,8 @@
       cerr << "error " << dent->d_name << endl;
       continue;
     }
-    if (!S_ISDIR(st.st_mode)
-        && ReadGcdaFile(gcov_output_basepath_, dent->d_name, msg)) {
+    if (!S_ISDIR(st.st_mode) &&
+        ReadGcdaFile(gcov_output_basepath_, dent->d_name, msg)) {
       break;
     }
   }
diff --git a/drivers/hal/common/fuzz_tester/FuzzerCallbackBase.cpp b/drivers/hal/common/driver_base/DriverCallbackBase.cpp
similarity index 89%
rename from drivers/hal/common/fuzz_tester/FuzzerCallbackBase.cpp
rename to drivers/hal/common/driver_base/DriverCallbackBase.cpp
index 8106b18..ef4e141 100644
--- a/drivers/hal/common/fuzz_tester/FuzzerCallbackBase.cpp
+++ b/drivers/hal/common/driver_base/DriverCallbackBase.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "fuzz_tester/FuzzerCallbackBase.h"
+#include "driver_base/DriverCallbackBase.h"
 
 #include <dirent.h>
 #include <netdb.h>
@@ -34,8 +34,8 @@
 #include <vector>
 
 #include <VtsDriverCommUtil.h>
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
 #include "test/vts/proto/AndroidSystemControlMessage.pb.h"
+#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
 
 #include "component_loader/DllLoader.h"
 #include "utils/InterfaceSpecUtil.h"
@@ -47,11 +47,11 @@
 
 static std::map<string, string> id_map_;
 
-FuzzerCallbackBase::FuzzerCallbackBase() {}
+DriverCallbackBase::DriverCallbackBase() {}
 
-FuzzerCallbackBase::~FuzzerCallbackBase() {}
+DriverCallbackBase::~DriverCallbackBase() {}
 
-bool FuzzerCallbackBase::Register(const VariableSpecificationMessage& message) {
+bool DriverCallbackBase::Register(const VariableSpecificationMessage& message) {
   cout << __func__ << " type = " << message.type() << endl;
   if (!message.is_callback()) {
     cerr << __func__ << " ERROR: argument is not a callback." << endl;
@@ -71,7 +71,7 @@
   return true;
 }
 
-const char* FuzzerCallbackBase::GetCallbackID(const string& name) {
+const char* DriverCallbackBase::GetCallbackID(const string& name) {
   // TODO: handle when not found.
   cout << __func__ << ":" << __LINE__ << " " << name << endl;
   cout << __func__ << ":" << __LINE__ << " returns '" << id_map_[name].c_str()
@@ -79,7 +79,7 @@
   return id_map_[name].c_str();
 }
 
-void FuzzerCallbackBase::RpcCallToAgent(
+void DriverCallbackBase::RpcCallToAgent(
     const AndroidSystemCallbackRequestMessage& message,
     const string& callback_socket_name) {
   cout << __func__ << ":" << __LINE__ << " id = '" << message.id() << "'"
diff --git a/drivers/hal/common/driver_manager/VtsHalDriverManager.cpp b/drivers/hal/common/driver_manager/VtsHalDriverManager.cpp
new file mode 100644
index 0000000..feafd8b
--- /dev/null
+++ b/drivers/hal/common/driver_manager/VtsHalDriverManager.cpp
@@ -0,0 +1,509 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "driver_manager/VtsHalDriverManager.h"
+
+#include <iostream>
+#include <string>
+
+#include <google/protobuf/text_format.h>
+
+#include "utils/InterfaceSpecUtil.h"
+#include "utils/StringUtil.h"
+
+static constexpr const char* kErrorString = "error";
+static constexpr const char* kVoidString = "void";
+static constexpr const int kInvalidDriverId = -1;
+
+namespace android {
+namespace vts {
+
+VtsHalDriverManager::VtsHalDriverManager(const string& spec_dir,
+                                         const int epoch_count,
+                                         const string& callback_socket_name)
+    : callback_socket_name_(callback_socket_name),
+      default_driver_lib_name_(""),
+      hal_driver_loader_(
+          HalDriverLoader(spec_dir, epoch_count, callback_socket_name)) {}
+
+DriverId VtsHalDriverManager::LoadTargetComponent(
+    const string& dll_file_name, const string& spec_lib_file_path,
+    const int component_class, const int component_type, const float version,
+    const string& package_name, const string& component_name,
+    const string& hw_binder_service_name, const string& submodule_name) {
+  cout << __func__ << " entry dll_file_name = " << dll_file_name << endl;
+  ComponentSpecificationMessage spec_message;
+  if (!hal_driver_loader_.FindComponentSpecification(
+          component_class, package_name, version, component_name,
+          component_type, submodule_name, &spec_message)) {
+    cerr << __func__ << ": Faild to load specification for component with "
+         << "class: " << component_class << " type: " << component_type
+         << " version: " << version << endl;
+    return kInvalidDriverId;
+  }
+  cout << "loaded specification for component with class: " << component_class
+       << " type: " << component_type << " version: " << version << endl;
+
+  string driver_lib_path = "";
+  if (component_class == HAL_HIDL) {
+    driver_lib_path = GetHidlHalDriverLibName(package_name, version);
+  } else {
+    driver_lib_path = spec_lib_file_path;
+    default_driver_lib_name_ = driver_lib_path;
+  }
+
+  cout << __func__ << " driver lib path " << driver_lib_path << endl;
+
+  std::unique_ptr<DriverBase> hal_driver = nullptr;
+  hal_driver.reset(hal_driver_loader_.GetDriver(driver_lib_path, spec_message,
+                                                hw_binder_service_name, 0,
+                                                false, dll_file_name, ""));
+  if (!hal_driver) {
+    cerr << "can't load driver for component with class: " << component_class
+         << " type: " << component_type << " version: " << version << endl;
+    return kInvalidDriverId;
+  }
+
+  // TODO (zhuoyao): get hidl_proxy_pointer for loaded hidl hal dirver.
+  uint64_t interface_pt = 0;
+  return RegisterDriver(std::move(hal_driver), spec_message, "", interface_pt);
+}
+
+string VtsHalDriverManager::CallFunction(FunctionCallMessage* call_msg) {
+  string output = "";
+  DriverBase* driver = GetDriverWithCallMsg(*call_msg);
+  if (!driver) {
+    cerr << "can't find driver for package: " << call_msg->package_name()
+         << " version: " << call_msg->component_type_version() << endl;
+    return kErrorString;
+  }
+
+  // Special process to open conventional hal.
+  FunctionSpecificationMessage* api = call_msg->mutable_api();
+  if (call_msg->component_class() != HAL_HIDL && api->name() == "#Open") {
+    cout << __func__ << ":" << __LINE__ << " #Open" << endl;
+    if (api->arg().size() > 0) {
+      cout << __func__ << " open conventional hal with arg:"
+           << api->arg(0).string_value().message() << endl;
+      driver->OpenConventionalHal(api->arg(0).string_value().message().c_str());
+    } else {
+      cout << __func__ << " open conventional hal with no arg" << endl;
+      driver->OpenConventionalHal();
+    }
+    // return the return value from open;
+    if (api->return_type().has_type()) {
+      cout << __func__ << " return_type exists" << endl;
+      // TODO handle when the size > 1.
+      if (!strcmp(api->return_type().scalar_type().c_str(), "int32_t")) {
+        cout << __func__ << " return_type is int32_t" << endl;
+        api->mutable_return_type()->mutable_scalar_value()->set_int32_t(0);
+        cout << "result " << endl;
+        // todo handle more types;
+        google::protobuf::TextFormat::PrintToString(*api, &output);
+        return output;
+      }
+    }
+    cerr << __func__ << " return_type unknown" << endl;
+    google::protobuf::TextFormat::PrintToString(*api, &output);
+    return output;
+  }
+
+  void* result;
+  FunctionSpecificationMessage result_msg;
+  driver->FunctionCallBegin();
+  cout << __func__ << " Call Function " << api->name() << " parent_path("
+       << api->parent_path() << ")" << endl;
+  // For Hidl HAL, use CallFunction method.
+  if (call_msg->component_class() == HAL_HIDL) {
+    if (!driver->CallFunction(*api, callback_socket_name_, &result_msg)) {
+      cerr << __func__ << " Failed to call function: " << api->DebugString()
+           << endl;
+      return kErrorString;
+    }
+  } else {
+    if (!driver->Fuzz(api, &result, callback_socket_name_)) {
+      cerr << __func__ << " Failed to call function: " << api->DebugString()
+           << endl;
+      return kErrorString;
+    }
+  }
+  cout << __func__ << ": called function " << api->name() << endl;
+
+  // set coverage data.
+  driver->FunctionCallEnd(api);
+
+  if (call_msg->component_class() == HAL_HIDL) {
+    for (int index = 0; index < result_msg.return_type_hidl_size(); index++) {
+      auto* return_val = result_msg.mutable_return_type_hidl(index);
+      if (return_val->type() == TYPE_HIDL_INTERFACE &&
+          return_val->hidl_interface_pointer() != 0) {
+        string type_name = return_val->predefined_type();
+        uint64_t interface_pt = return_val->hidl_interface_pointer();
+        std::unique_ptr<DriverBase> driver;
+        ComponentSpecificationMessage spec_msg;
+        string package_name = GetPackageName(type_name);
+        float version = GetVersion(type_name);
+        string component_name = GetComponentName(type_name);
+        if (!hal_driver_loader_.FindComponentSpecification(
+                HAL_HIDL, package_name, version, component_name, 0, "",
+                &spec_msg)) {
+          cerr << __func__
+               << " Failed to load specification for gnerated interface :"
+               << type_name << endl;
+          return kErrorString;
+        }
+        string driver_lib_path = GetHidlHalDriverLibName(package_name, version);
+        // TODO(zhuoyao): figure out a way to get the service_name.
+        string hw_binder_service_name = "default";
+        driver.reset(hal_driver_loader_.GetDriver(driver_lib_path, spec_msg,
+                                                  hw_binder_service_name,
+                                                  interface_pt, true, "", ""));
+        int32_t driver_id =
+            RegisterDriver(std::move(driver), spec_msg, "", interface_pt);
+        return_val->set_hidl_interface_id(driver_id);
+      }
+    }
+    google::protobuf::TextFormat::PrintToString(result_msg, &output);
+    return output;
+  } else {
+    return ProcessFuncResultsForConventionalHal(api, result);
+  }
+  return kVoidString;
+}
+
+string VtsHalDriverManager::GetAttribute(FunctionCallMessage* call_msg) {
+  string output = "";
+  DriverBase* driver = GetDriverWithCallMsg(*call_msg);
+  if (!driver) {
+    cerr << "can't find driver for package: " << call_msg->package_name()
+         << " version: " << call_msg->component_type_version() << endl;
+    return kErrorString;
+  }
+
+  void* result;
+  FunctionSpecificationMessage* api = call_msg->mutable_api();
+  cout << __func__ << " Get Atrribute " << api->name() << " parent_path("
+       << api->parent_path() << ")" << endl;
+  if (!driver->GetAttribute(api, &result)) {
+    cerr << __func__ << " attribute not found - todo handle more explicitly"
+         << endl;
+    return kErrorString;
+  }
+  cout << __func__ << ": called" << endl;
+
+  if (call_msg->component_class() == HAL_HIDL) {
+    cout << __func__ << ": for a HIDL HAL" << endl;
+    api->mutable_return_type()->set_type(TYPE_STRING);
+    api->mutable_return_type()->mutable_string_value()->set_message(
+        *(string*)result);
+    api->mutable_return_type()->mutable_string_value()->set_length(
+        ((string*)result)->size());
+    free(result);
+    string* output = new string();
+    google::protobuf::TextFormat::PrintToString(*api, output);
+    return *output;
+  } else {
+    return ProcessFuncResultsForConventionalHal(api, result);
+  }
+  return kVoidString;
+}
+
+DriverId VtsHalDriverManager::RegisterDriver(
+    std::unique_ptr<DriverBase> driver,
+    const ComponentSpecificationMessage& spec_msg, const string& submodule_name,
+    const uint64_t interface_pt) {
+  DriverId driver_id =
+      FindDriverIdInternal(spec_msg, submodule_name, interface_pt, true);
+  if (driver_id == kInvalidDriverId) {
+    driver_id = hal_driver_map_.size();
+    hal_driver_map_.insert(
+        make_pair(driver_id, HalDriverInfo(spec_msg, submodule_name,
+                                           interface_pt, std::move(driver))));
+  } else {
+    cout << __func__ << " Driver already exists. ";
+  }
+
+  return driver_id;
+}
+
+DriverBase* VtsHalDriverManager::GetDriverById(const int32_t id) {
+  auto res = hal_driver_map_.find(id);
+  if (res == hal_driver_map_.end()) {
+    cerr << "Failed to find driver info with id: " << id << endl;
+    return nullptr;
+  }
+  cout << __func__ << " found driver info with id: " << id << endl;
+  return res->second.driver.get();
+}
+
+ComponentSpecificationMessage* VtsHalDriverManager::GetComponentSpecById(
+    const int32_t id) {
+  auto res = hal_driver_map_.find(id);
+  if (res == hal_driver_map_.end()) {
+    cerr << "Failed to find driver info with id: " << id << endl;
+    return nullptr;
+  }
+  cout << __func__ << " found driver info with id: " << id << endl;
+  return &(res->second.spec_msg);
+}
+
+DriverBase* VtsHalDriverManager::GetDriverForHidlHalInterface(
+    const string& package_name, const float version,
+    const string& interface_name, const string& hal_service_name) {
+  ComponentSpecificationMessage spec_msg;
+  spec_msg.set_component_class(HAL_HIDL);
+  spec_msg.set_package(package_name);
+  spec_msg.set_component_type_version(version);
+  spec_msg.set_component_name(interface_name);
+  int32_t driver_id = FindDriverIdInternal(spec_msg);
+  if (driver_id == kInvalidDriverId) {
+    string driver_lib_path = GetHidlHalDriverLibName(package_name, version);
+    driver_id =
+        LoadTargetComponent("", driver_lib_path, HAL_HIDL, 0, version,
+                            package_name, interface_name, hal_service_name, "");
+  }
+  return GetDriverById(driver_id);
+}
+
+bool VtsHalDriverManager::FindComponentSpecification(
+    const int component_class, const int component_type, const float version,
+    const string& submodule_name, const string& package_name,
+    const string& component_name, ComponentSpecificationMessage* spec_msg) {
+  return hal_driver_loader_.FindComponentSpecification(
+      component_class, package_name, version, component_name, component_type,
+      submodule_name, spec_msg);
+}
+
+ComponentSpecificationMessage*
+VtsHalDriverManager::GetComponentSpecification() {
+  if (hal_driver_map_.empty()) {
+    return nullptr;
+  } else {
+    return &(hal_driver_map_.find(0)->second.spec_msg);
+  }
+}
+
+DriverId VtsHalDriverManager::FindDriverIdInternal(
+    const ComponentSpecificationMessage& spec_msg, const string& submodule_name,
+    const uint64_t interface_pt, bool with_interface_pointer) {
+  if (!spec_msg.has_component_class()) {
+    cerr << __func__ << " Component class not specified. " << endl;
+    return kInvalidDriverId;
+  }
+  if (spec_msg.component_class() == HAL_HIDL) {
+    if (!spec_msg.has_package() || spec_msg.package().empty()) {
+      cerr << __func__ << " Package name is requried but not specified. "
+           << endl;
+      return kInvalidDriverId;
+    }
+    if (!spec_msg.has_component_type_version()) {
+      cerr << __func__ << " Package version is requried but not specified. "
+           << endl;
+      return kInvalidDriverId;
+    }
+    if (!spec_msg.has_component_name() || spec_msg.component_name().empty()) {
+      cerr << __func__ << " Component name is requried but not specified. "
+           << endl;
+      return kInvalidDriverId;
+    }
+  } else {
+    if (submodule_name.empty()) {
+      cerr << __func__ << " Submodule name is requried but not specified. "
+           << endl;
+      return kInvalidDriverId;
+    }
+  }
+  for (auto it = hal_driver_map_.begin(); it != hal_driver_map_.end(); ++it) {
+    ComponentSpecificationMessage cur_spec_msg = it->second.spec_msg;
+    if (cur_spec_msg.component_class() != spec_msg.component_class()) {
+      continue;
+    }
+    // If package name is specified, match package name.
+    if (spec_msg.has_package()) {
+      if (!cur_spec_msg.has_package() ||
+          cur_spec_msg.package() != spec_msg.package()) {
+        continue;
+      }
+    }
+    // If version is specified, match version.
+    if (spec_msg.has_component_type_version()) {
+      if (!cur_spec_msg.has_component_type_version() ||
+          cur_spec_msg.component_type_version() !=
+              spec_msg.component_type_version()) {
+        continue;
+      }
+    }
+    if (spec_msg.component_class() == HAL_HIDL) {
+      if (cur_spec_msg.component_name() != spec_msg.component_name()) {
+        continue;
+      }
+      if (with_interface_pointer &&
+          it->second.hidl_hal_proxy_pt != interface_pt) {
+        continue;
+      }
+      cout << __func__ << " Found hidl hal driver with id: " << it->first
+           << endl;
+      return it->first;
+    } else {
+      if ((!spec_msg.has_component_type() ||
+           cur_spec_msg.component_type() == spec_msg.component_type()) &&
+          it->second.submodule_name == submodule_name) {
+        cout << __func__
+             << " Found conventional hal driver with id: " << it->first << endl;
+        return it->first;
+      }
+    }
+  }
+  return kInvalidDriverId;
+}
+
+DriverBase* VtsHalDriverManager::GetDriverWithCallMsg(
+    const FunctionCallMessage& call_msg) {
+  DriverId driver_id = kInvalidDriverId;
+  // If call_mag contains driver_id, use that given driver id.
+  if (call_msg.has_hal_driver_id() &&
+      call_msg.hal_driver_id() != kInvalidDriverId) {
+    driver_id = call_msg.hal_driver_id();
+  } else {
+    // Otherwise, try to find a registed driver matches the given info. e.g.,
+    // submodule_name, package_name, version etc.
+    FunctionSpecificationMessage api = call_msg.api();
+    if (api.submodule_name().size() > 0) {
+      string submodule_name = api.submodule_name();
+      cout << __func__ << " submodule name " << submodule_name << endl;
+      DriverId driver_id = FindDriverIdWithSubModuleName(submodule_name);
+      if (driver_id != kInvalidDriverId) {
+        cout << __func__ << " call is for a submodule" << endl;
+      } else {
+        cerr << __func__ << " called an API of a non-loaded submodule." << endl;
+        return nullptr;
+      }
+    } else {
+      ComponentSpecificationMessage spec_msg;
+      spec_msg.set_component_class(call_msg.component_class());
+      spec_msg.set_package(call_msg.package_name());
+      spec_msg.set_component_type_version(
+          stof(call_msg.component_type_version()));
+      spec_msg.set_component_name(call_msg.component_name());
+      driver_id = FindDriverIdInternal(spec_msg);
+    }
+  }
+
+  if (driver_id == kInvalidDriverId) {
+    cerr << "can't find driver ID for package: " << call_msg.package_name()
+         << " version: " << call_msg.component_type_version() << endl;
+    return nullptr;
+  } else {
+    return GetDriverById(driver_id);
+  }
+}
+
+DriverId VtsHalDriverManager::FindDriverIdWithSubModuleName(
+    const string& submodule_name) {
+  ComponentSpecificationMessage spec_msg;
+  spec_msg.set_component_class(HAL_CONVENTIONAL);
+  return FindDriverIdInternal(spec_msg, submodule_name);
+}
+
+string VtsHalDriverManager::ProcessFuncResultsForConventionalHal(
+    FunctionSpecificationMessage* func_msg, void* result) {
+  string output = "";
+  if (func_msg->return_type().type() == TYPE_PREDEFINED) {
+    // TODO: actually handle this case.
+    if (result != NULL) {
+      // loads that interface spec and enqueues all functions.
+      cout << __func__ << " return type: " << func_msg->return_type().type()
+           << endl;
+    } else {
+      cout << __func__ << " return value = NULL" << endl;
+    }
+    cerr << __func__ << " todo: support aggregate" << endl;
+    google::protobuf::TextFormat::PrintToString(*func_msg, &output);
+    return output;
+  } else if (func_msg->return_type().type() == TYPE_SCALAR) {
+    // TODO handle when the size > 1.
+    // todo handle more types;
+    if (!strcmp(func_msg->return_type().scalar_type().c_str(), "int32_t")) {
+      func_msg->mutable_return_type()->mutable_scalar_value()->set_int32_t(
+          *((int*)(&result)));
+      google::protobuf::TextFormat::PrintToString(*func_msg, &output);
+      return output;
+    } else if (!strcmp(func_msg->return_type().scalar_type().c_str(),
+                       "uint32_t")) {
+      func_msg->mutable_return_type()->mutable_scalar_value()->set_uint32_t(
+          *((int*)(&result)));
+      google::protobuf::TextFormat::PrintToString(*func_msg, &output);
+      return output;
+    } else if (!strcmp(func_msg->return_type().scalar_type().c_str(),
+                       "int16_t")) {
+      func_msg->mutable_return_type()->mutable_scalar_value()->set_int16_t(
+          *((int*)(&result)));
+      google::protobuf::TextFormat::PrintToString(*func_msg, &output);
+      return output;
+    } else if (!strcmp(func_msg->return_type().scalar_type().c_str(),
+                       "uint16_t")) {
+      google::protobuf::TextFormat::PrintToString(*func_msg, &output);
+      return output;
+    }
+  } else if (func_msg->return_type().type() == TYPE_SUBMODULE) {
+    cerr << __func__ << "[driver:hal] return type TYPE_SUBMODULE" << endl;
+    if (result != NULL) {
+      // loads that interface spec and enqueues all functions.
+      cout << __func__ << " return type: " << func_msg->return_type().type()
+           << endl;
+    } else {
+      cout << __func__ << " return value = NULL" << endl;
+    }
+    // find a VTS spec for that module
+    string submodule_name = func_msg->return_type().predefined_type().substr(
+        0, func_msg->return_type().predefined_type().size() - 1);
+    ComponentSpecificationMessage submodule_iface_spec_msg;
+    DriverId driver_id = FindDriverIdWithSubModuleName(submodule_name);
+    if (driver_id != kInvalidDriverId) {
+      cout << __func__ << " submodule InterfaceSpecification already loaded"
+           << endl;
+      ComponentSpecificationMessage* spec_msg = GetComponentSpecById(driver_id);
+      func_msg->set_allocated_return_type_submodule_spec(spec_msg);
+    } else {
+      // TODO(zhuoyao): under the current assumption, driver_id = 0 means the
+      // Hal the initially loaded, need to change then when we support
+      // multi-hal testing.
+      ComponentSpecificationMessage* spec_msg = GetComponentSpecById(0);
+      if (hal_driver_loader_.FindComponentSpecification(
+              spec_msg->component_class(), spec_msg->package(),
+              spec_msg->component_type_version(), spec_msg->component_name(),
+              spec_msg->component_type(), submodule_name,
+              &submodule_iface_spec_msg)) {
+        cout << __func__ << " submodule InterfaceSpecification found" << endl;
+        func_msg->set_allocated_return_type_submodule_spec(
+            &submodule_iface_spec_msg);
+        std::unique_ptr<DriverBase> driver = nullptr;
+        driver.reset(hal_driver_loader_.GetDriverForSubModule(
+            default_driver_lib_name_, submodule_iface_spec_msg, result));
+        RegisterDriver(std::move(driver), submodule_iface_spec_msg,
+                       submodule_name, 0);
+      } else {
+        cerr << __func__ << " submodule InterfaceSpecification not found"
+             << endl;
+      }
+    }
+    google::protobuf::TextFormat::PrintToString(*func_msg, &output);
+    return output;
+  }
+  return kVoidString;
+}
+
+}  // namespace vts
+}  // namespace android
diff --git a/drivers/hal/common/fuzz_tester/FuzzerWrapper.cpp b/drivers/hal/common/fuzz_tester/FuzzerWrapper.cpp
deleted file mode 100644
index 5c27d8d..0000000
--- a/drivers/hal/common/fuzz_tester/FuzzerWrapper.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "fuzz_tester/FuzzerWrapper.h"
-
-#include <dlfcn.h>
-
-#include <iostream>
-#include <sstream>
-#include <string>
-
-#include "component_loader/DllLoader.h"
-#include "fuzz_tester/FuzzerBase.h"
-#include "utils/InterfaceSpecUtil.h"
-#include "utils/StringUtil.h"
-
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
-
-using namespace std;
-
-namespace android {
-namespace vts {
-
-FuzzerWrapper::FuzzerWrapper()
-    : function_name_prefix_chars_(NULL), fuzzer_base_(NULL) {}
-
-bool FuzzerWrapper::LoadInterfaceSpecificationLibrary(
-    const char* spec_dll_path) {
-  if (!spec_dll_path) {
-    cerr << __func__ << ":" << __LINE__ << " arg is NULL" << endl;
-    return false;
-  }
-  if (spec_dll_path_.size() > 0 &&
-      !strcmp(spec_dll_path, spec_dll_path_.c_str())) {
-    return true;
-  }
-  spec_dll_path_ = spec_dll_path;
-  if (!dll_loader_.Load(spec_dll_path_.c_str(), false)) return false;
-  cout << "DLL loaded " << spec_dll_path_ << endl;
-  return true;
-}
-
-FuzzerBase* FuzzerWrapper::GetFuzzer(
-    const vts::ComponentSpecificationMessage& message) {
-  cout << __func__ << ":" << __LINE__ << " entry" << endl;
-  if (spec_dll_path_.size() == 0) {
-    cerr << __func__ << ": spec_dll_path_ not set" << endl;
-    return NULL;
-  }
-
-  string function_name_prefix = GetFunctionNamePrefix(message);
-  const char* function_name_prefix_chars = function_name_prefix.c_str();
-  cout << __func__ << ": function name '" << function_name_prefix_chars
-       << "'" << endl;
-  if (function_name_prefix_chars_ && function_name_prefix_chars &&
-      !strcmp(function_name_prefix_chars, function_name_prefix_chars_)) {
-    return fuzzer_base_;
-  }
-
-  loader_function func =
-      dll_loader_.GetLoaderFunction(function_name_prefix_chars);
-  if (!func) {
-    cerr << __func__ << ": function not found." << endl;
-    return NULL;
-  }
-  cout << __func__ << ": function found; trying to call." << endl;
-  fuzzer_base_ = func();
-  function_name_prefix_chars_ =
-      (char*)malloc(strlen(function_name_prefix_chars) + 1);
-  strcpy(function_name_prefix_chars_, function_name_prefix_chars);
-  return fuzzer_base_;
-}
-
-FuzzerBase* FuzzerWrapper::GetFuzzer(const string& name,
-                                     const uint64_t interface_pt) const {
-  // Assumption: no shared library lookup is needed because that is handled
-  // the by the driver's linking dependency.
-  // Example: name (android::hardware::gnss::V1_0::IAGnssRil) converted to
-  // function name (vts_func_4_android_hardware_tests_bar_V1_0_IBar_with_arg)
-  stringstream prefix_ss;
-  string mutable_name = name;
-  ReplaceSubString(mutable_name, "::", "_");
-  prefix_ss << VTS_INTERFACE_SPECIFICATION_FUNCTION_NAME_PREFIX << HAL_HIDL
-            << mutable_name << "_with_arg";
-  string function_name_prefix = prefix_ss.str();
-  loader_function_with_arg func =
-      dll_loader_.GetLoaderFunctionWithArg(function_name_prefix.c_str());
-  if (!func) {
-    cerr << __func__ << ": function not found." << endl;
-    return NULL;
-  }
-  return func(interface_pt);
-}
-
-}  // namespace vts
-}  // namespace android
diff --git a/drivers/hal/common/include/binder/VtsFuzzerBinderService.h b/drivers/hal/common/include/binder/VtsFuzzerBinderService.h
index 3d0cb88..ad1c7b3 100644
--- a/drivers/hal/common/include/binder/VtsFuzzerBinderService.h
+++ b/drivers/hal/common/include/binder/VtsFuzzerBinderService.h
@@ -57,7 +57,7 @@
   virtual int32_t Status(int32_t type) = 0;
 
   // Requests to call the specified function using the provided arguments.
-  virtual const char* Call(const string& call_payload) = 0;
+  virtual string Call(const string& call_payload) = 0;
 
   virtual const char* GetFunctions() = 0;
 
@@ -73,7 +73,7 @@
   int32_t LoadHal(const string& path, int target_class, int target_type,
                   float target_version, const string& module_name);
   int32_t Status(int32_t type);
-  const char* Call(const string& call_payload);
+  string Call(const string& call_payload);
   const char* GetFunctions();
 };
 
diff --git a/drivers/hal/common/include/component_loader/DllLoader.h b/drivers/hal/common/include/component_loader/DllLoader.h
index 21ca3b1..79307e1 100644
--- a/drivers/hal/common/include/component_loader/DllLoader.h
+++ b/drivers/hal/common/include/component_loader/DllLoader.h
@@ -22,11 +22,11 @@
 namespace android {
 namespace vts {
 
-class FuzzerBase;
+class DriverBase;
 
 // Pointer type for a function in a loaded component.
-typedef FuzzerBase* (*loader_function)();
-typedef FuzzerBase* (*loader_function_with_arg)(uint64_t arg);
+typedef DriverBase* (*loader_function)();
+typedef DriverBase* (*loader_function_with_arg)(uint64_t arg);
 typedef void (*writeout_fn)();
 typedef void (*flush_fn)();
 
diff --git a/drivers/hal/common/include/component_loader/HalDriverLoader.h b/drivers/hal/common/include/component_loader/HalDriverLoader.h
new file mode 100644
index 0000000..94bd5bc
--- /dev/null
+++ b/drivers/hal/common/include/component_loader/HalDriverLoader.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __VTS_SYSFUZZER_COMMON_SPECPARSER_SPECBUILDER_H__
+#define __VTS_SYSFUZZER_COMMON_SPECPARSER_SPECBUILDER_H__
+
+#include <queue>
+#include <string>
+
+#include "component_loader/DllLoader.h"
+#include "driver_base/DriverBase.h"
+#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
+
+using namespace std;
+
+namespace android {
+namespace vts {
+// Builder of an interface specification.
+class HalDriverLoader {
+ public:
+  // Constructor where the first argument is the path of a dir which contains
+  // all available interface specification files.
+  HalDriverLoader(const string dir_path, int epoch_count,
+                  const string& callback_socket_name);
+
+  // Scans the dir and returns an component specification for a requested
+  // component.
+  bool FindComponentSpecification(const int component_class,
+                                  const string& package_name,
+                                  const float version,
+                                  const string& component_name,
+                                  const int component_type,
+                                  const string& submodule_name,
+                                  ComponentSpecificationMessage* spec_msg);
+
+  // Create driver for given component.
+  DriverBase* GetDriver(const string& driver_lib_path,
+                        const ComponentSpecificationMessage& spec_msg,
+                        const string& hw_binder_service_name,
+                        const uint64_t interface_pt,
+                        bool with_interface_pointer,
+                        const string& dll_file_name,
+                        const string& target_func_name);
+
+  // Create driver for conventioanl HAL submodule.
+  // TODO (zhuoyao): consider to deprecate this method.
+  DriverBase* GetDriverForSubModule(
+      const string& spec_lib_file_path,
+      const ComponentSpecificationMessage& spec_msg, void* object_pointer);
+
+  // Returns FuzzBase for a given interface specification, and adds all the
+  // found functions to the fuzzing job queue.
+  // TODO (zhuoyao): consider to deprecate this method.
+  DriverBase* GetFuzzerBaseAndAddAllFunctionsToQueue(
+      const char* driver_lib_path,
+      const ComponentSpecificationMessage& iface_spec_msg,
+      const char* dll_file_name, const char* hw_service_name);
+
+  // Main function for the VTS system fuzzer where dll_file_name is the path of
+  // a target component, spec_lib_file_path is the path of a specification
+  // library file, and the rest three arguments are the basic information of
+  // the target component.
+  // TODO (zhuoyao): consider to deprecate this method.
+  bool Process(const char* dll_file_name, const char* spec_lib_file_path,
+               int target_class, int target_type, float target_version,
+               const char* target_package, const char* target_component_name,
+               const char* hal_service_name);
+
+ private:
+  // Internal method to create driver for conventional HAL.
+  DriverBase* GetConventionalHalDriver(
+      const string& driver_lib_path,
+      const ComponentSpecificationMessage& spec_msg,
+      const string& dll_file_name, const string& target_func_name);
+
+  // Internal method to create driver for HIDL HAL.
+  DriverBase* GetHidlHalDriver(const string& driver_lib_path,
+                               const ComponentSpecificationMessage& spec_msg,
+                               const string& hal_service_name,
+                               const uint64_t interface_pt,
+                               bool with_interface_pt);
+
+  // Internal method to create driver for HIDL HAL with interface pointer.
+  DriverBase* LoadDriverWithInterfacePointer(
+      const string& driver_lib_path,
+      const ComponentSpecificationMessage& spec_msg,
+      const uint64_t interface_pt);
+
+  // Helper method to load a driver library with the given path.
+  DriverBase* LoadDriver(const string& driver_lib_path,
+                         const ComponentSpecificationMessage& spec_msg);
+
+  // A DLL Loader instance used to load the driver library.
+  DllLoader dll_loader_;
+  // the path of a dir which contains interface specification ASCII proto files.
+  const string dir_path_;
+  // the total number of epochs
+  const int epoch_count_;
+  // the server socket port # of the agent.
+  const string callback_socket_name_;
+  // fuzzing job queue. Used by Process method.
+  queue<pair<FunctionSpecificationMessage*, DriverBase*>> job_queue_;
+};
+
+}  // namespace vts
+}  // namespace android
+
+#endif  // __VTS_SYSFUZZER_COMMON_SPECPARSER_SPECBUILDER_H__
diff --git a/drivers/hal/common/include/fuzz_tester/FuzzerBase.h b/drivers/hal/common/include/driver_base/DriverBase.h
similarity index 87%
rename from drivers/hal/common/include/fuzz_tester/FuzzerBase.h
rename to drivers/hal/common/include/driver_base/DriverBase.h
index cb5a776..8e812b1 100644
--- a/drivers/hal/common/include/fuzz_tester/FuzzerBase.h
+++ b/drivers/hal/common/include/driver_base/DriverBase.h
@@ -26,10 +26,10 @@
 namespace android {
 namespace vts {
 
-class FuzzerBase {
+class DriverBase {
  public:
-  FuzzerBase(int target_class);
-  virtual ~FuzzerBase();
+  DriverBase(int target_class);
+  virtual ~DriverBase();
 
   // Loads a target component where the argument is the file path.
   // Returns true iff successful.
@@ -58,9 +58,9 @@
   };
 
   virtual bool CallFunction(
-            const vts::FunctionSpecificationMessage& /*func_msg*/,
-            const string& /*callback_socket_name*/,
-            vts::FunctionSpecificationMessage* /*result_msg*/) {
+      const vts::FunctionSpecificationMessage& /*func_msg*/,
+      const string& /*callback_socket_name*/,
+      vts::FunctionSpecificationMessage* /*result_msg*/) {
     return false;
   };
 
@@ -82,13 +82,12 @@
   bool FunctionCallEnd(FunctionSpecificationMessage* msg);
 
   // Scans all GCDA files under a given dir and adds to the message.
-  bool ScanAllGcdaFiles(
-      const string& basepath, FunctionSpecificationMessage* msg);
+  bool ScanAllGcdaFiles(const string& basepath,
+                        FunctionSpecificationMessage* msg);
 
  protected:
-  bool ReadGcdaFile(
-      const string& basepath, const string& filename,
-      FunctionSpecificationMessage* msg);
+  bool ReadGcdaFile(const string& basepath, const string& filename,
+                    FunctionSpecificationMessage* msg);
 
   // a pointer to a HAL data structure of the loaded component.
   struct hw_device_t* device_;
diff --git a/drivers/hal/common/include/fuzz_tester/FuzzerCallbackBase.h b/drivers/hal/common/include/driver_base/DriverCallbackBase.h
similarity index 83%
rename from drivers/hal/common/include/fuzz_tester/FuzzerCallbackBase.h
rename to drivers/hal/common/include/driver_base/DriverCallbackBase.h
index fdb0432..8a76262 100644
--- a/drivers/hal/common/include/fuzz_tester/FuzzerCallbackBase.h
+++ b/drivers/hal/common/include/driver_base/DriverCallbackBase.h
@@ -21,27 +21,26 @@
 
 #include <string>
 
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
 #include "test/vts/proto/AndroidSystemControlMessage.pb.h"
+#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
 
 using namespace std;
 
 namespace android {
 namespace vts {
 
-class FuzzerCallbackBase {
+class DriverCallbackBase {
  public:
-  FuzzerCallbackBase();
-  virtual ~FuzzerCallbackBase();
+  DriverCallbackBase();
+  virtual ~DriverCallbackBase();
 
   static bool Register(const VariableSpecificationMessage& message);
 
  protected:
   static const char* GetCallbackID(const string& name);
 
-  static void RpcCallToAgent(
-      const AndroidSystemCallbackRequestMessage& message,
-      const string& callback_socket_name);
+  static void RpcCallToAgent(const AndroidSystemCallbackRequestMessage& message,
+                             const string& callback_socket_name);
 };
 
 }  // namespace vts
diff --git a/drivers/hal/common/include/driver_manager/VtsHalDriverManager.h b/drivers/hal/common/include/driver_manager/VtsHalDriverManager.h
new file mode 100644
index 0000000..c09ac88
--- /dev/null
+++ b/drivers/hal/common/include/driver_manager/VtsHalDriverManager.h
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __VTS_DRIVER_HAL_VTSHALDRIVERMANAGER_H
+#define __VTS_DRIVER_HAL_VTSHALDRIVERMANAGER_H
+
+#include <map>
+#include <string>
+
+#include "component_loader/HalDriverLoader.h"
+#include "driver_base/DriverBase.h"
+#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
+
+using namespace std;
+using DriverId = int32_t;
+
+namespace android {
+namespace vts {
+
+class VtsHalDriverManager {
+ public:
+  // Constructor where the first argument is the path of a dir which contains
+  // all available interface specification files.
+  VtsHalDriverManager(const string& spec_dir, const int epoch_count,
+                      const string& callback_socket_name);
+
+  // Loads the driver library for the target HAL, creates the corresponding
+  // driver instance, assign it a driver id and registers the created driver
+  // instance in hal_driver_map_.
+  // Returns the generated driver id.
+  DriverId LoadTargetComponent(
+      const string& dll_file_name, const string& spec_lib_file_path,
+      const int component_class, const int component_type, const float version,
+      const string& package_name, const string& component_name,
+      const string& hw_binder_service_name, const string& submodule_name);
+
+  // Call the API specified in func_msg with the provided parameter using the
+  // the corresonding driver instance. If func_msg specified the driver_id,
+  // use the driver instance corresponds to driver_id, otherwise, use the
+  // default driver instance (with driver_id = 0).
+  // Returns a string which contians the return results (a text format of the
+  // returned protobuf).
+  // For error cases, returns string "error";
+  // TODO (zhuoyao): use FunctionCallMessage instead of
+  // FunctionSpecificationMessage which contains info such as component name and
+  // driver id.
+  string CallFunction(FunctionCallMessage* func_msg);
+
+  // Searches hal_driver_map_ for Hidl HAL driver instance with the given
+  // package name, version and component (interface) name. If found, returns
+  // the correponding driver instance, otherwise, creates a new driver instance
+  // with the given info, registers it in hal_driver_map_ and returns the
+  // generated driver instance. This is used by Vts replay test.
+  DriverBase* GetDriverForHidlHalInterface(const string& package_name,
+                                           const float version,
+                                           const string& interface_name,
+                                           const string& hal_service_name);
+
+  // Loads the specification message for component with given component info
+  // such as component_class etc. Used to server the ReadSpecification request
+  // from host.
+  // Returns true if load successfully, false otherwise.
+  bool FindComponentSpecification(const int component_class,
+                                  const int component_type, const float version,
+                                  const string& submodule_name,
+                                  const string& package_name,
+                                  const string& component_name,
+                                  ComponentSpecificationMessage* spec_msg);
+
+  // Returns the specification message for default driver. Used to serve the
+  // ListFunctions request from host.
+  // TODO (zhuoyao): needs to revisit this after supporting multi-hal testing.
+  ComponentSpecificationMessage* GetComponentSpecification();
+
+  // Used to serve the GetAttribute request from host. Only supported by
+  // conventional HAL.
+  // TODO (zhuoyao): consider deprecate this method.
+  string GetAttribute(FunctionCallMessage* func_msg);
+
+ private:
+  // Internal method to register a HAL driver in hal_driver_map_.
+  // Returns the driver id of registed driver.
+  DriverId RegisterDriver(std::unique_ptr<DriverBase> driver,
+                          const ComponentSpecificationMessage& spec_msg,
+                          const string& submodule_name,
+                          const uint64_t interface_pt);
+
+  // Internal method to get the HAL driver based on the driver id. Returns
+  // nullptr if no driver instance existes with given id.
+  DriverBase* GetDriverById(const int32_t id);
+
+  // Internal method to get the HAL driver based on FunctionCallMessage.
+  DriverBase* GetDriverWithCallMsg(const FunctionCallMessage& call_msg);
+
+  // Internal method to get the driver id based on submodule name
+  // (for conventional HAL only).
+  DriverId FindDriverIdWithSubModuleName(const string& submodule_name);
+
+  // Internal method to find the driver id based on component spec and
+  // (for Hidl HAL) address to the hidl proxy.
+  DriverId FindDriverIdInternal(const ComponentSpecificationMessage& spec_msg,
+                                const string& submodule_name = "",
+                                const uint64_t interface_pt = 0,
+                                bool with_interface_pointer = false);
+
+  // Internal method to get the component spec based on driver id.
+  ComponentSpecificationMessage* GetComponentSpecById(const int32_t id);
+
+  // Internal method to process function return results for conventional HAL.
+  string ProcessFuncResultsForConventionalHal(
+      FunctionSpecificationMessage* func_msg, void* result);
+
+  // ============== attributes ===================
+
+  // The server socket port # of the agent.
+  const string callback_socket_name_;
+  // A default name for the driver libary name, only used for conventional HAL.
+  string default_driver_lib_name_;
+  // A HalDriverLoader instance.
+  HalDriverLoader hal_driver_loader_;
+
+  // struct that store the driver instance and its corresponding meta info.
+  struct HalDriverInfo {
+    // Spcification for the HAL.
+    ComponentSpecificationMessage spec_msg;
+    // A submodule HAL name, used for conventional HAL only.
+    string submodule_name;
+    // Pointer to the HAL client proxy, used for HIDL HAL only.
+    uint64_t hidl_hal_proxy_pt;
+    // A HAL driver instance.
+    std::unique_ptr<DriverBase> driver;
+
+    // Constructor for halDriverInfo
+    HalDriverInfo(const ComponentSpecificationMessage& spec_msg,
+                  const string& submodule_name, const uint64_t interface_pt,
+                  std::unique_ptr<DriverBase> driver)
+        : spec_msg(spec_msg),
+          submodule_name(submodule_name),
+          hidl_hal_proxy_pt(interface_pt),
+          driver(std::move(driver)) {}
+  };
+  // map to keep all the active HAL driver instances and their corresponding
+  // meta info.
+  // TODO(zhuoyao): consider to use unordered_map for performance optimization.
+  map<DriverId, HalDriverInfo> hal_driver_map_;
+  // TODO(zhuoyao): use mutex to protect hal_driver_map_;
+};
+
+}  // namespace vts
+}  // namespace android
+#endif  //__VTS_DRIVER_HAL_VTSHALDRIVERMANAGER_H
diff --git a/drivers/hal/common/include/fuzz_tester/FuzzerWrapper.h b/drivers/hal/common/include/fuzz_tester/FuzzerWrapper.h
deleted file mode 100644
index 6b71da2..0000000
--- a/drivers/hal/common/include/fuzz_tester/FuzzerWrapper.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __VTS_SYSFUZZER_COMMON_FUZZER_WRAPPER_H__
-#define __VTS_SYSFUZZER_COMMON_FUZZER_WRAPPER_H__
-
-#include "component_loader/DllLoader.h"
-#include "fuzz_tester/FuzzerBase.h"
-
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
-
-using namespace std;
-
-namespace android {
-namespace vts {
-
-// Wrapper used to get the pointer to a FuzzerBase class which provides
-// APIs to conduct fuzz testing on a loaded component.
-class FuzzerWrapper {
- public:
-  explicit FuzzerWrapper();
-  virtual ~FuzzerWrapper() {}
-
-  // Loads a given component file.
-  bool LoadInterfaceSpecificationLibrary(const char* spec_dll_path);
-
-  // Returns the pointer to a FuzzerBase class of the loaded component where
-  // the class is designed to do the testing using the given interface
-  // specification message.
-  FuzzerBase* GetFuzzer(const vts::ComponentSpecificationMessage& message);
-
-  // Returns FuzzerBase of a nested interface specified by 'name' and its
-  // HIDL proxy interface pointer ('interface_pt').
-  FuzzerBase* GetFuzzer(const string& name, const uint64_t interface_pt) const;
-
- private:
-  // loaded file path.
-  string spec_dll_path_;
-
-  // DLL Loader class.
-  DllLoader dll_loader_;
-
-  // loaded function name;
-  char* function_name_prefix_chars_;
-
-  // loaded FuzzerBase;
-  FuzzerBase* fuzzer_base_;
-};
-
-}  // namespace vts
-}  // namespace android
-
-#endif  // __VTS_SYSFUZZER_COMMON_FUZZER_WRAPPER_H__
diff --git a/drivers/hal/common/include/specification_parser/InterfaceSpecificationParser.h b/drivers/hal/common/include/specification_parser/InterfaceSpecificationParser.h
deleted file mode 100644
index dbbe0e9..0000000
--- a/drivers/hal/common/include/specification_parser/InterfaceSpecificationParser.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __VTS_SYSFUZZER_COMMON_SPECPARSER_IFSPECPARSER_H__
-#define __VTS_SYSFUZZER_COMMON_SPECPARSER_IFSPECPARSER_H__
-
-#include <string>
-
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
-
-using namespace std;
-
-namespace android {
-namespace vts {
-
-// Main class to parse an interface specification from a file.
-class InterfaceSpecificationParser {
- public:
-  InterfaceSpecificationParser() {}
-
-  // Parses the given proto text file (1st arg). The parsed result is stored in
-  // the 2nd arg. Returns true iff successful.
-  static bool parse(const char* file_path,
-                    ComponentSpecificationMessage* is_message);
-};
-
-}  // namespace vts
-}  // namespace android
-
-#endif  // __VTS_SYSFUZZER_COMMON_SPECPARSER_IFSPECPARSER_H__
diff --git a/drivers/hal/common/include/specification_parser/SpecificationBuilder.h b/drivers/hal/common/include/specification_parser/SpecificationBuilder.h
deleted file mode 100644
index 3cd8baa..0000000
--- a/drivers/hal/common/include/specification_parser/SpecificationBuilder.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __VTS_SYSFUZZER_COMMON_SPECPARSER_SPECBUILDER_H__
-#define __VTS_SYSFUZZER_COMMON_SPECPARSER_SPECBUILDER_H__
-
-#include <map>
-#include <queue>
-#include <string>
-
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
-
-#include "fuzz_tester/FuzzerWrapper.h"
-
-using namespace std;
-
-#define DEFAULT_SPEC_DIR_PATH "/system/etc/"
-#define SPEC_FILE_EXT ".vts"
-
-namespace android {
-namespace vts {
-
-class FuzzerBase;
-class InterfaceSpecification;
-
-// Builder of an interface specification.
-class SpecificationBuilder {
- public:
-  // Constructor where the first argument is the path of a dir which contains
-  // all available interface specification files.
-  SpecificationBuilder(const string dir_path, int epoch_count,
-                       const string& callback_socket_name);
-
-  // scans the dir and returns an interface specification for a requested
-  // component.
-  vts::ComponentSpecificationMessage* FindComponentSpecification(
-      const int target_class, const int target_type, const float target_version,
-      const string submodule_name = "", const string package = "",
-      const string component_name = "");
-
-  vts::ComponentSpecificationMessage*
-      FindComponentSpecification(const string& component_name);
-
-  // Returns FuzzBase for a given interface specification, and adds all the
-  // found functions to the fuzzing job queue.
-  FuzzerBase* GetFuzzerBaseAndAddAllFunctionsToQueue(
-      const vts::ComponentSpecificationMessage& iface_spec_msg,
-      const char* dll_file_name);
-
-  const string& CallFunction(FunctionSpecificationMessage* func_msg);
-
-  const string& GetAttribute(FunctionSpecificationMessage* func_msg);
-
-  // Main function for the VTS system fuzzer where dll_file_name is the path of
-  // a target component, spec_lib_file_path is the path of a specification
-  // library file, and the rest three arguments are the basic information of
-  // the target component.
-  bool Process(const char* dll_file_name, const char* spec_lib_file_path,
-               int target_class, int target_type, float target_version,
-               const char* target_package, const char* target_component_name);
-
-  bool LoadTargetComponent(const char* dll_file_name,
-                           const char* spec_lib_file_path, int target_class,
-                           int target_type, float target_version,
-                           const char* target_package,
-                           const char* target_component_name,
-                           const char* hw_binder_service_name,
-                           const char* module_name);
-
-  FuzzerBase* GetFuzzerBase(
-      const ComponentSpecificationMessage& iface_spec_msg,
-      const char* dll_file_name, const char* target_func_name);
-
-  FuzzerBase* GetFuzzerBaseSubModule(
-      const vts::ComponentSpecificationMessage& iface_spec_msg,
-      void* object_pointer);
-
-  // Returns the loaded interface specification message.
-  ComponentSpecificationMessage* GetComponentSpecification() const;
-
- protected:
-  // Registers a HIDL interface (proxy) in a map.
-  int32_t RegisterHidlInterface(const string& name,
-                                const uint64_t interface_pt);
-
-  // Returns a pre-registered HIDL interface proxy object's pointer address.
-  uint64_t GetHidlInterfacePointer(const int32_t id) const;
-
-  // Returns FuzzerBase pointer of a pre-registered HIDL interface proxy.
-  FuzzerBase* GetHidlInterfaceFuzzerBase(const int32_t id) const;
-
-  // Creates and returns FuzzerBase pointer of a HIDL interface (proxy).
-  FuzzerBase* GetFuzzerBase(const string& name,
-                            const uint64_t interface_pt) const;
-
- private:
-  // A FuzzerWrapper instance.
-  FuzzerWrapper wrapper_;
-  // the path of a dir which contains interface specification ASCII proto files.
-  const string dir_path_;
-  // the total number of epochs
-  const int epoch_count_;
-  // fuzzing job queue.
-  queue<pair<FunctionSpecificationMessage*, FuzzerBase*>> job_queue_;
-  // Loaded interface specification message.
-  ComponentSpecificationMessage* if_spec_msg_;
-  // TODO: use unique_ptr
-  char* spec_lib_file_path_;
-  char* dll_file_name_;
-  char* module_name_;
-  // HW binder service name only used for HIDL HAL
-  char* hw_binder_service_name_;
-  // the server socket port # of the agent.
-  const string& callback_socket_name_;
-  // map for submodule interface specification messages.
-  map<string, ComponentSpecificationMessage*> submodule_if_spec_map_;
-  map<string, FuzzerBase*> submodule_fuzzerbase_map_;
-  // mapping from a nested interface ID to a tuple containing
-  // its interface name, FuzzerBase pointer, and HIDL proxy pointer.
-  map<int32_t, tuple<string, FuzzerBase*, uint64_t>> interface_map_;
-};
-
-}  // namespace vts
-}  // namespace android
-
-#endif  // __VTS_SYSFUZZER_COMMON_SPECPARSER_SPECBUILDER_H__
diff --git a/drivers/hal/common/include/utils/InterfaceSpecUtil.h b/drivers/hal/common/include/utils/InterfaceSpecUtil.h
index c0df0f2..56074d4 100644
--- a/drivers/hal/common/include/utils/InterfaceSpecUtil.h
+++ b/drivers/hal/common/include/utils/InterfaceSpecUtil.h
@@ -28,12 +28,32 @@
 namespace android {
 namespace vts {
 
+// Reads the given file and parse the file contents into a
+// ComponentSpecificationMessage.
+bool ParseInterfaceSpec(const char* file_path,
+                        ComponentSpecificationMessage* message);
+
 // Returns the function name prefix of a given interface specification.
 string GetFunctionNamePrefix(const ComponentSpecificationMessage& message);
 
 // Get HAL version string to be used to build a relevant dir path.
 string GetVersionString(float version, bool for_macro=false);
 
+// Get the driver library name for a given HIDL HAL.
+string GetHidlHalDriverLibName(const string& package_name, const float version);
+
+// Extract package name from full hidl type name
+// e.g. ::android::hardware::nfc::V1_0::INfc -> android.hardware.nfc
+string GetPackageName(const string& type_name);
+
+// Extract version from full hidl type name
+// e.g. ::android::hardware::nfc::V1_0::INfc -> 1.0
+float GetVersion(const string& type_name);
+
+// Extract component name from full hidl type name
+// e.g. ::android::hardware::nfc::V1_0::INfc -> INfc
+string GetComponentName(const string& type_name);
+
 }  // namespace vts
 }  // namespace android
 
diff --git a/drivers/hal/common/replayer/VtsHidlHalReplayer.cpp b/drivers/hal/common/replayer/VtsHidlHalReplayer.cpp
deleted file mode 100644
index 003c330..0000000
--- a/drivers/hal/common/replayer/VtsHidlHalReplayer.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "replayer/VtsHidlHalReplayer.h"
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <fstream>
-#include <iomanip>
-#include <iostream>
-#include <sstream>
-#include <string>
-
-#include <cutils/properties.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/text_format.h>
-
-#include "fuzz_tester/FuzzerBase.h"
-#include "fuzz_tester/FuzzerWrapper.h"
-#include "specification_parser/InterfaceSpecificationParser.h"
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
-#include "test/vts/proto/VtsProfilingMessage.pb.h"
-#include "utils/StringUtil.h"
-#include "utils/VtsProfilingUtil.h"
-
-using namespace std;
-
-namespace android {
-namespace vts {
-
-VtsHidlHalReplayer::VtsHidlHalReplayer(const string& spec_path,
-                                       const string& callback_socket_name)
-    : spec_path_(spec_path), callback_socket_name_(callback_socket_name) {}
-
-bool VtsHidlHalReplayer::LoadComponentSpecification(const string& package,
-    float version, const string& interface_name,
-    ComponentSpecificationMessage* message) {
-  if (spec_path_.empty()) {
-    cerr << __func__ << "spec file not specified. " << endl;
-    return false;
-  }
-  if (!message) {
-    cerr << __func__ << "message could not be NULL. " << endl;
-    return false;
-  }
-  string package_name = package;
-  ReplaceSubString(package_name, ".", "/");
-  stringstream stream;
-  stream << fixed << setprecision(1) << version;
-  string version_str = stream.str();
-  string spec_file = spec_path_ + '/' + package_name + '/'
-      + version_str + '/' + interface_name.substr(1) + ".vts";
-  cout << "spec_file: " << spec_file << endl;
-  if (InterfaceSpecificationParser::parse(spec_file.c_str(), message)) {
-    if (message->component_class() != HAL_HIDL) {
-      cerr << __func__ << ": only support Hidl Hal. " << endl;
-      return false;
-    }
-
-    if (message->package() != package
-        || message->component_type_version() != version
-        || message->component_name() != interface_name) {
-      cerr << __func__ << ": spec file mismatch. " << "expected package: "
-           << package << " version: " << version << " interface_name: "
-           << interface_name << ", actual: package: " << message->package()
-           << " version: " << message->component_type_version()
-           << " interface_name: " << message->component_name();
-      return false;
-    }
-  } else {
-    cerr << __func__ << ": can not parse spec: " << spec_file << endl;
-    return false;
-  }
-  return true;
-}
-
-bool VtsHidlHalReplayer::ReplayTrace(const string& spec_lib_file_path,
-    const string& trace_file, const string& hal_service_name) {
-  if (!wrapper_.LoadInterfaceSpecificationLibrary(spec_lib_file_path.c_str())) {
-    return false;
-  }
-
-  // Determine the binder/passthrough mode based on system property.
-  char get_sub_property[PROPERTY_VALUE_MAX];
-  bool get_stub = false; /* default is binderized */
-  if (property_get("vts.hidl.get_stub", get_sub_property, "") > 0) {
-    if (!strcmp(get_sub_property, "true") || !strcmp(get_sub_property, "True")
-        || !strcmp(get_sub_property, "1")) {
-      get_stub = true;
-    }
-  }
-
-  // Parse the trace file to get the sequence of function calls.
-  int fd =
-      open(trace_file.c_str(), O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
-  if (fd < 0) {
-    cerr << "Can not open trace file: " << trace_file
-         << "error: " << std::strerror(errno);
-    return false;
-  }
-
-  google::protobuf::io::FileInputStream input(fd);
-
-  // long record_num = 0;
-  string interface = "";
-  FuzzerBase* fuzzer = NULL;
-  VtsProfilingRecord call_msg;
-  VtsProfilingRecord expected_result_msg;
-  while (readOneDelimited(&call_msg, &input) &&
-         readOneDelimited(&expected_result_msg, &input)) {
-    if (call_msg.event() != InstrumentationEventType::SERVER_API_ENTRY &&
-        call_msg.event() != InstrumentationEventType::CLIENT_API_ENTRY &&
-        call_msg.event() != InstrumentationEventType::SYNC_CALLBACK_ENTRY &&
-        call_msg.event() != InstrumentationEventType::ASYNC_CALLBACK_ENTRY &&
-        call_msg.event() != InstrumentationEventType::PASSTHROUGH_ENTRY) {
-      cerr << "Expected a call message but got message with event: "
-           << call_msg.event();
-      continue;
-    }
-    if (expected_result_msg.event() !=
-            InstrumentationEventType::SERVER_API_EXIT &&
-        expected_result_msg.event() !=
-            InstrumentationEventType::CLIENT_API_EXIT &&
-        expected_result_msg.event() !=
-            InstrumentationEventType::SYNC_CALLBACK_EXIT &&
-        expected_result_msg.event() !=
-            InstrumentationEventType::ASYNC_CALLBACK_EXIT &&
-        expected_result_msg.event() !=
-            InstrumentationEventType::PASSTHROUGH_EXIT) {
-      cerr << "Expected a result message but got message with event: "
-           << call_msg.event();
-      continue;
-    }
-
-    cout << __func__ << ": replay function: " << call_msg.func_msg().name();
-
-    // Load spec file and get fuzzer.
-    if (interface != call_msg.interface()) {
-      interface = call_msg.interface();
-      ComponentSpecificationMessage interface_specification_message;
-      if (!LoadComponentSpecification(call_msg.package(), call_msg.version(),
-                                      call_msg.interface(),
-                                      &interface_specification_message)) {
-        cerr << __func__ << ": can not load component spec: " << spec_path_;
-        return false;
-      }
-      fuzzer = wrapper_.GetFuzzer(interface_specification_message);
-      if (!fuzzer) {
-        cerr << __func__ << ": couldn't get a fuzzer base class" << endl;
-        return false;
-      }
-
-      if (!fuzzer->GetService(get_stub, hal_service_name.c_str())) {
-        cerr << __func__ << ": couldn't get service: " << hal_service_name
-             << endl;
-        return false;
-      }
-    }
-
-    vts::FunctionSpecificationMessage result_msg;
-    if (!fuzzer->CallFunction(call_msg.func_msg(), callback_socket_name_,
-                              &result_msg)) {
-      cerr << __func__ << ": replay function fail." << endl;
-      return false;
-    }
-    if (!fuzzer->VerifyResults(expected_result_msg.func_msg(), result_msg)) {
-      // Verification is not strict, i.e. if fail, output error message and
-      // continue the process.
-      cerr << __func__ << ": verification fail." << endl;
-    }
-    call_msg.Clear();
-    expected_result_msg.Clear();
-  }
-  return true;
-}
-
-}  // namespace vts
-}  // namespace android
diff --git a/drivers/hal/common/specification_parser/InterfaceSpecificationParser.cpp b/drivers/hal/common/specification_parser/InterfaceSpecificationParser.cpp
deleted file mode 100644
index 96fd1ef..0000000
--- a/drivers/hal/common/specification_parser/InterfaceSpecificationParser.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "specification_parser/InterfaceSpecificationParser.h"
-
-#include <stdio.h>
-
-#include <fstream>
-#include <iostream>
-#include <sstream>
-#include <string>
-
-#include <google/protobuf/message.h>
-#include <google/protobuf/text_format.h>
-
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
-
-using namespace std;
-
-namespace android {
-namespace vts {
-
-bool InterfaceSpecificationParser::parse(
-    const char* file_path, ComponentSpecificationMessage* is_message) {
-  ifstream in_file(file_path);
-  stringstream str_stream;
-  if (!in_file.is_open()) {
-    cerr << "Unable to open file. " << file_path << endl;
-    return false;
-  }
-  str_stream << in_file.rdbuf();
-  in_file.close();
-  const string data = str_stream.str();
-
-  if (!google::protobuf::TextFormat::MergeFromString(data, is_message)) {
-    cerr << __FUNCTION__ << ": Can't parse a given proto file " << file_path
-         << "." << endl;
-    cerr << data << endl;
-    return false;
-  }
-  return true;
-}
-
-}  // namespace vts
-}  // namespace android
diff --git a/drivers/hal/common/specification_parser/SpecificationBuilder.cpp b/drivers/hal/common/specification_parser/SpecificationBuilder.cpp
deleted file mode 100644
index af97b0e..0000000
--- a/drivers/hal/common/specification_parser/SpecificationBuilder.cpp
+++ /dev/null
@@ -1,779 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "specification_parser/SpecificationBuilder.h"
-
-#include <dirent.h>
-
-#include <iomanip>
-#include <iostream>
-#include <queue>
-#include <string>
-#include <sstream>
-
-#include <cutils/properties.h>
-
-#include "fuzz_tester/FuzzerBase.h"
-#include "fuzz_tester/FuzzerWrapper.h"
-#include "specification_parser/InterfaceSpecificationParser.h"
-#include "utils/InterfaceSpecUtil.h"
-#include "utils/StringUtil.h"
-
-#include <google/protobuf/text_format.h>
-#include "test/vts/proto/ComponentSpecificationMessage.pb.h"
-
-namespace android {
-namespace vts {
-
-SpecificationBuilder::SpecificationBuilder(const string dir_path,
-                                           int epoch_count,
-                                           const string& callback_socket_name)
-    : dir_path_(dir_path),
-      epoch_count_(epoch_count),
-      if_spec_msg_(NULL),
-      module_name_(NULL),
-      hw_binder_service_name_(NULL),
-      callback_socket_name_(callback_socket_name) {}
-
-vts::ComponentSpecificationMessage*
-SpecificationBuilder::FindComponentSpecification(const int target_class,
-                                                 const int target_type,
-                                                 const float target_version,
-                                                 const string submodule_name,
-                                                 const string package,
-                                                 const string component_name) {
-  DIR* dir;
-  struct dirent* ent;
-  cerr << __func__ << ": component " << component_name << endl;
-
-  // Derive the package-specific dir which contains .vts files
-  string target_dir_path = dir_path_;
-  if (!endsWith(target_dir_path, "/")) {
-    target_dir_path += "/";
-  }
-  string target_subdir_path = package;
-  ReplaceSubString(target_subdir_path, ".", "/");
-  target_dir_path += target_subdir_path + "/";
-
-  stringstream stream;
-  stream << fixed << setprecision(1) << target_version;
-  target_dir_path += stream.str();
-
-  if (!(dir = opendir(target_dir_path.c_str()))) {
-    cerr << __func__ << ": Can't opendir " << target_dir_path << endl;
-    target_dir_path = "";
-    return NULL;
-  }
-
-  while ((ent = readdir(dir))) {
-    if (ent->d_type == DT_REG) {
-      if (string(ent->d_name).find(SPEC_FILE_EXT) != std::string::npos) {
-        cout << __func__ << ": Checking a file " << ent->d_name << endl;
-        const string file_path = target_dir_path + "/" + string(ent->d_name);
-        vts::ComponentSpecificationMessage* message =
-            new vts::ComponentSpecificationMessage();
-        if (InterfaceSpecificationParser::parse(file_path.c_str(), message)) {
-          if (message->component_class() != target_class) continue;
-
-          if (message->component_class() != HAL_HIDL) {
-            if (message->component_type() == target_type &&
-                message->component_type_version() == target_version) {
-              if (submodule_name.length() > 0) {
-                if (message->component_class() != HAL_CONVENTIONAL_SUBMODULE ||
-                    message->original_data_structure_name() != submodule_name) {
-                  continue;
-                }
-              }
-              closedir(dir);
-              return message;
-            }
-          } else {
-            if (message->package() == package &&
-                message->component_type_version() == target_version) {
-              if (component_name.length() > 0) {
-                if (message->component_name() != component_name) {
-                  continue;
-                }
-              }
-              closedir(dir);
-              return message;
-            }
-          }
-        }
-        delete message;
-      }
-    }
-  }
-  closedir(dir);
-  return NULL;
-}
-
-FuzzerBase* SpecificationBuilder::GetFuzzerBase(
-    const vts::ComponentSpecificationMessage& iface_spec_msg,
-    const char* dll_file_name, const char* /*target_func_name*/) {
-  cout << __func__ << ":" << __LINE__ << " " << "entry" << endl;
-  FuzzerBase* fuzzer = wrapper_.GetFuzzer(iface_spec_msg);
-  if (!fuzzer) {
-    cerr << __func__ << ": couldn't get a fuzzer base class" << endl;
-    return NULL;
-  }
-
-  // TODO: don't load multiple times. reuse FuzzerBase*.
-  cout << __func__ << ":" << __LINE__ << " " << "got fuzzer" << endl;
-  if (iface_spec_msg.component_class() == HAL_HIDL) {
-    char get_sub_property[PROPERTY_VALUE_MAX];
-    bool get_stub = false;  /* default is binderized */
-    if (property_get("vts.hidl.get_stub", get_sub_property, "") > 0) {
-      if (!strcmp(get_sub_property, "true") ||
-          !strcmp(get_sub_property, "True") ||
-          !strcmp(get_sub_property, "1")) {
-        get_stub = true;
-      }
-    }
-    const char* service_name;
-    if (hw_binder_service_name_ && strlen(hw_binder_service_name_) > 0) {
-      service_name = hw_binder_service_name_;
-    } else {
-      service_name = iface_spec_msg.package().substr(
-          iface_spec_msg.package().find_last_of(".") + 1).c_str();
-    }
-    if (!fuzzer->GetService(get_stub, service_name)) {
-      cerr << __FUNCTION__ << ": couldn't get service" << endl;
-      return NULL;
-    }
-  } else {
-    if (!fuzzer->LoadTargetComponent(dll_file_name)) {
-      cerr << __FUNCTION__ << ": couldn't load target component file, "
-           << dll_file_name << endl;
-      return NULL;
-    }
-  }
-  cout << __func__ << ":" << __LINE__ << " "
-       << "loaded target comp" << endl;
-
-  return fuzzer;
-  /*
-   * TODO: now always return the fuzzer. this change is due to the difficulty
-   * in checking nested apis although that's possible. need to check whether
-   * Fuzz() found the function, while still distinguishing the difference
-   * between that and defined but non-set api.
-  if (!strcmp(target_func_name, "#Open")) return fuzzer;
-
-  for (const vts::FunctionSpecificationMessage& func_msg : iface_spec_msg.api())
-  {
-    cout << "checking " << func_msg.name() << endl;
-    if (!strcmp(target_func_name, func_msg.name().c_str())) {
-      return fuzzer;
-    }
-  }
-  return NULL;
-  */
-}
-
-FuzzerBase* SpecificationBuilder::GetFuzzerBaseSubModule(
-    const vts::ComponentSpecificationMessage& iface_spec_msg,
-    void* object_pointer) {
-  cout << __func__ << ":" << __LINE__ << " "
-       << "entry object_pointer " << ((uint64_t)object_pointer) << endl;
-  FuzzerWrapper wrapper;
-  if (!wrapper.LoadInterfaceSpecificationLibrary(spec_lib_file_path_)) {
-    cerr << __func__ << " can't load specification lib, "
-         << spec_lib_file_path_ << endl;
-    return NULL;
-  }
-  FuzzerBase* fuzzer = wrapper.GetFuzzer(iface_spec_msg);
-  if (!fuzzer) {
-    cerr << __FUNCTION__ << ": couldn't get a fuzzer base class" << endl;
-    return NULL;
-  }
-
-  // TODO: don't load multiple times. reuse FuzzerBase*.
-  cout << __func__ << ":" << __LINE__ << " "
-       << "got fuzzer" << endl;
-  if (iface_spec_msg.component_class() == HAL_HIDL) {
-    cerr << __func__ << " HIDL not supported" << endl;
-    return NULL;
-  } else {
-    if (!fuzzer->SetTargetObject(object_pointer)) {
-      cerr << __FUNCTION__ << ": couldn't set target object" << endl;
-      return NULL;
-    }
-  }
-  cout << __func__ << ":" << __LINE__ << " "
-       << "loaded target comp" << endl;
-  return fuzzer;
-}
-
-FuzzerBase* SpecificationBuilder::GetFuzzerBaseAndAddAllFunctionsToQueue(
-    const vts::ComponentSpecificationMessage& iface_spec_msg,
-    const char* dll_file_name) {
-  FuzzerBase* fuzzer = wrapper_.GetFuzzer(iface_spec_msg);
-  if (!fuzzer) {
-    cerr << __FUNCTION__ << ": couldn't get a fuzzer base class" << endl;
-    return NULL;
-  }
-
-  if (iface_spec_msg.component_class() == HAL_HIDL) {
-    char get_sub_property[PROPERTY_VALUE_MAX];
-    bool get_stub = false; /* default is binderized */
-    if (property_get("vts.hidl.get_stub", get_sub_property, "") > 0) {
-      if (!strcmp(get_sub_property, "true") || !strcmp(get_sub_property, "True")
-          || !strcmp(get_sub_property, "1")) {
-        get_stub = true;
-      }
-    }
-    const char* service_name;
-    if (hw_binder_service_name_ && strlen(hw_binder_service_name_) > 0) {
-      service_name = hw_binder_service_name_;
-    } else {
-      service_name = iface_spec_msg.package().substr(
-          iface_spec_msg.package().find_last_of(".") + 1).c_str();
-    }
-    if (!fuzzer->GetService(get_stub, service_name)) {
-      cerr << __FUNCTION__ << ": couldn't get service" << endl;
-      return NULL;
-    }
-  } else {
-    if (!fuzzer->LoadTargetComponent(dll_file_name)) {
-      cerr << __FUNCTION__ << ": couldn't load target component file, "
-          << dll_file_name << endl;
-      return NULL;
-    }
-  }
-
-  for (const vts::FunctionSpecificationMessage& func_msg :
-       iface_spec_msg.interface().api()) {
-    cout << "Add a job " << func_msg.name() << endl;
-    FunctionSpecificationMessage* func_msg_copy = func_msg.New();
-    func_msg_copy->CopyFrom(func_msg);
-    job_queue_.push(make_pair(func_msg_copy, fuzzer));
-  }
-  return fuzzer;
-}
-
-bool SpecificationBuilder::LoadTargetComponent(
-    const char* dll_file_name, const char* spec_lib_file_path, int target_class,
-    int target_type, float target_version, const char* target_package,
-    const char* target_component_name,
-    const char* hw_binder_service_name, const char* module_name) {
-  cout << __func__ << " entry dll_file_name = " << dll_file_name << endl;
-  if_spec_msg_ =
-      FindComponentSpecification(target_class, target_type, target_version,
-                                 module_name, target_package,
-                                 target_component_name);
-  if (!if_spec_msg_) {
-    cerr << __func__ << ": no interface specification file found for "
-         << "class " << target_class << " type " << target_type << " version "
-         << target_version << endl;
-    return false;
-  }
-
-  if (target_class == HAL_HIDL) {
-    asprintf(&spec_lib_file_path_, "%s@%s-vts.driver.so", target_package,
-             GetVersionString(target_version).c_str());
-    cout << __func__ << " spec lib path " << spec_lib_file_path_ << endl;
-  } else {
-    spec_lib_file_path_ = (char*)malloc(strlen(spec_lib_file_path) + 1);
-    strcpy(spec_lib_file_path_, spec_lib_file_path);
-  }
-
-  dll_file_name_ = (char*)malloc(strlen(dll_file_name) + 1);
-  strcpy(dll_file_name_, dll_file_name);
-
-  string output;
-  if_spec_msg_->SerializeToString(&output);
-  cout << "loaded ifspec length " << output.length() << endl;
-
-  module_name_ = (char*)malloc(strlen(module_name) + 1);
-  strcpy(module_name_, module_name);
-  cout << __func__ << ":" << __LINE__ << " module_name " << module_name_
-       << endl;
-
-  if (hw_binder_service_name) {
-    hw_binder_service_name_ = (char*)malloc(strlen(hw_binder_service_name) + 1);
-    strcpy(hw_binder_service_name_, hw_binder_service_name);
-    cout << __func__ << ":" << __LINE__ << " hw_binder_service_name "
-         << hw_binder_service_name_ << endl;
-  }
-  return true;
-}
-
-const string empty_string = string();
-
-FuzzerBase* SpecificationBuilder::GetFuzzerBase(
-    const string& name, const uint64_t interface_pt) const {
-  return wrapper_.GetFuzzer(name, interface_pt);
-}
-
-int32_t SpecificationBuilder::RegisterHidlInterface(
-    const string& name, const uint64_t interface_pt) {
-  FuzzerBase* fuzz_base_pt;
-  int32_t max_id = 0;
-  for (auto it : interface_map_) {
-    if (get<0>(it.second) == name && get<2>(it.second) == interface_pt) {
-      return it.first;
-    }
-    if (it.first > max_id) {
-      max_id = it.first;
-    }
-  }
-  max_id++;
-  fuzz_base_pt = GetFuzzerBase(name, interface_pt);
-  interface_map_.insert(
-      make_pair(max_id, make_tuple(name, fuzz_base_pt, interface_pt)));
-  return max_id;
-}
-
-uint64_t SpecificationBuilder::GetHidlInterfacePointer(const int32_t id) const {
-  cout << __func__ << " *** id " << id << endl;
-  auto res = interface_map_.find(id);
-  if (res == interface_map_.end()) return 0;
-  return reinterpret_cast<uint64_t>(get<2>(res->second));
-}
-
-FuzzerBase* SpecificationBuilder::GetHidlInterfaceFuzzerBase(
-    const int32_t id) const {
-  cout << __func__ << " *** id " << id << endl;
-  auto res = interface_map_.find(id);
-  if (res == interface_map_.end()) return nullptr;
-  cout << __func__ << " *** id " << id << " found" << endl;
-  return reinterpret_cast<FuzzerBase*>(get<1>(res->second));
-}
-
-const string& SpecificationBuilder::CallFunction(
-    FunctionSpecificationMessage* func_msg) {
-  cout << __func__ << ":" << __LINE__ << " entry" << endl;
-  if (!wrapper_.LoadInterfaceSpecificationLibrary(spec_lib_file_path_)) {
-    cerr << __func__ << ":" << __LINE__ << " lib loading failed" << endl;
-    return empty_string;
-  }
-  cout << __func__ << ":" << __LINE__ << " "
-       << "loaded if_spec lib " << func_msg << endl;
-  cout << __func__ << " " << dll_file_name_ << " " << func_msg->name() << endl;
-
-  FuzzerBase* func_fuzzer;
-  if (func_msg->submodule_name().size() > 0) {
-    string submodule_name = func_msg->submodule_name();
-    cout << __func__ << " submodule name " << submodule_name << endl;
-    if (submodule_fuzzerbase_map_.find(submodule_name)
-        != submodule_fuzzerbase_map_.end()) {
-      cout << __func__ << " call is for a submodule" << endl;
-      func_fuzzer = submodule_fuzzerbase_map_[submodule_name];
-    } else {
-      cerr << __func__ << " called an API of a non-loaded submodule." << endl;
-      return empty_string;
-    }
-  } else {
-    if (func_msg->hidl_interface_id() == 0 ||
-        (if_spec_msg_ && if_spec_msg_->component_class() != HAL_HIDL)) {
-      func_fuzzer = GetFuzzerBase(*if_spec_msg_, dll_file_name_,
-                                  func_msg->name().c_str());
-    } else {
-      func_fuzzer = GetHidlInterfaceFuzzerBase(func_msg->hidl_interface_id());
-    }
-  }
-  cout << __func__ << ":" << __LINE__ << endl;
-  if (!func_fuzzer) {
-    cerr << "can't find FuzzerBase for '" << func_msg->name() << "' using '"
-         << dll_file_name_ << "'" << endl;
-    return empty_string;
-  }
-
-  if (func_msg->name() == "#Open") {
-    cout << __func__ << ":" << __LINE__ << " #Open" << endl;
-    if (func_msg->arg().size() > 0) {
-      cout << __func__ << " " << func_msg->arg(0).string_value().message()
-           << endl;
-      func_fuzzer->OpenConventionalHal(
-          func_msg->arg(0).string_value().message().c_str());
-    } else {
-      cout << __func__ << " no arg" << endl;
-      func_fuzzer->OpenConventionalHal();
-    }
-    cout << __func__ << " opened" << endl;
-    // return the return value from open;
-    if (func_msg->return_type().has_type()) {
-      cout << __func__ << " return_type exists" << endl;
-      // TODO handle when the size > 1.
-      if (!strcmp(func_msg->return_type().scalar_type().c_str(), "int32_t")) {
-        cout << __func__ << " return_type is int32_t" << endl;
-        func_msg->mutable_return_type()->mutable_scalar_value()->set_int32_t(0);
-        cout << "result " << endl;
-        // todo handle more types;
-        string* output = new string();
-        google::protobuf::TextFormat::PrintToString(*func_msg, output);
-        return *output;
-      }
-    }
-    cerr << __func__ << " return_type unknown" << endl;
-    string* output = new string();
-    google::protobuf::TextFormat::PrintToString(*func_msg, output);
-    return *output;
-  }
-  cout << __func__ << ":" << __LINE__ << endl;
-
-  void* result;
-  FunctionSpecificationMessage result_msg;
-  func_fuzzer->FunctionCallBegin();
-  cout << __func__ << " Call Function " << func_msg->name() << " parent_path("
-       << func_msg->parent_path() << ")" << endl;
-  // For Hidl HAL, use CallFunction method.
-  if (if_spec_msg_ && if_spec_msg_->component_class() == HAL_HIDL) {
-    if (!func_fuzzer->CallFunction(*func_msg, callback_socket_name_,
-                                   &result_msg)) {
-      cerr << __func__ << " function not found - todo handle more explicitly"
-           << endl;
-      return *(new string("error"));
-    }
-
-    for (int index = 0; index < result_msg.return_type_hidl_size(); index++) {
-      VariableSpecificationMessage* return_val =
-          result_msg.mutable_return_type_hidl(index);
-      if (return_val->hidl_interface_pointer() != 0) {
-        return_val->set_hidl_interface_id(
-            RegisterHidlInterface(return_val->predefined_type(),
-                                  return_val->hidl_interface_pointer()));
-      }
-    }
-  } else {
-    if (!func_fuzzer->Fuzz(func_msg, &result, callback_socket_name_)) {
-      cerr << __func__ << " function not found - todo handle more explicitly"
-           << endl;
-      return *(new string("error"));
-    }
-  }
-  cout << __func__ << ": called" << endl;
-
-  // set coverage data.
-  func_fuzzer->FunctionCallEnd(func_msg);
-
-  if (if_spec_msg_ && if_spec_msg_->component_class() == HAL_HIDL) {
-    string* output = new string();
-    google::protobuf::TextFormat::PrintToString(result_msg, output);
-    return *output;
-  } else {
-    if (func_msg->return_type().type() == TYPE_PREDEFINED) {
-      // TODO: actually handle this case.
-      if (result != NULL) {
-        // loads that interface spec and enqueues all functions.
-        cout << __func__ << " return type: " << func_msg->return_type().type()
-             << endl;
-      } else {
-        cout << __func__ << " return value = NULL" << endl;
-      }
-      cerr << __func__ << " todo: support aggregate" << endl;
-      string* output = new string();
-      google::protobuf::TextFormat::PrintToString(*func_msg, output);
-      return *output;
-    } else if (func_msg->return_type().type() == TYPE_SCALAR) {
-      // TODO handle when the size > 1.
-      if (!strcmp(func_msg->return_type().scalar_type().c_str(), "int32_t")) {
-        func_msg->mutable_return_type()->mutable_scalar_value()->set_int32_t(
-            *((int*)(&result)));
-        cout << "result " << endl;
-        // todo handle more types;
-        string* output = new string();
-        google::protobuf::TextFormat::PrintToString(*func_msg, output);
-        return *output;
-      }
-    } else if (func_msg->return_type().type() == TYPE_SUBMODULE) {
-      cerr << __func__ << "[driver:hal] return type TYPE_SUBMODULE" << endl;
-      if (result != NULL) {
-        // loads that interface spec and enqueues all functions.
-        cout << __func__ << " return type: " << func_msg->return_type().type()
-             << endl;
-      } else {
-        cout << __func__ << " return value = NULL" << endl;
-      }
-      // find a VTS spec for that module
-      string submodule_name = func_msg->return_type().predefined_type().substr(
-          0, func_msg->return_type().predefined_type().size() - 1);
-      vts::ComponentSpecificationMessage* submodule_iface_spec_msg;
-      if (submodule_if_spec_map_.find(submodule_name)
-          != submodule_if_spec_map_.end()) {
-        cout << __func__ << " submodule InterfaceSpecification already loaded"
-             << endl;
-        submodule_iface_spec_msg = submodule_if_spec_map_[submodule_name];
-        func_msg->set_allocated_return_type_submodule_spec(
-            submodule_iface_spec_msg);
-      } else {
-        submodule_iface_spec_msg =
-            FindComponentSpecification(
-                if_spec_msg_->component_class(), if_spec_msg_->component_type(),
-                if_spec_msg_->component_type_version(), submodule_name,
-                if_spec_msg_->package(), if_spec_msg_->component_name());
-        if (!submodule_iface_spec_msg) {
-          cerr << __func__ << " submodule InterfaceSpecification not found" << endl;
-        } else {
-          cout << __func__ << " submodule InterfaceSpecification found" << endl;
-          func_msg->set_allocated_return_type_submodule_spec(
-              submodule_iface_spec_msg);
-          FuzzerBase* func_fuzzer = GetFuzzerBaseSubModule(
-              *submodule_iface_spec_msg, result);
-          submodule_if_spec_map_[submodule_name] = submodule_iface_spec_msg;
-          submodule_fuzzerbase_map_[submodule_name] = func_fuzzer;
-        }
-      }
-      string* output = new string();
-      google::protobuf::TextFormat::PrintToString(*func_msg, output);
-      return *output;
-    }
-  }
-  return *(new string("void"));
-}
-
-const string& SpecificationBuilder::GetAttribute(
-    FunctionSpecificationMessage* func_msg) {
-  if (!wrapper_.LoadInterfaceSpecificationLibrary(spec_lib_file_path_)) {
-    return empty_string;
-  }
-  cout << __func__ << " "
-       << "loaded if_spec lib" << endl;
-  cout << __func__ << " " << dll_file_name_ << " " << func_msg->name() << endl;
-
-  FuzzerBase* func_fuzzer;
-  if (func_msg->submodule_name().size() > 0) {
-    string submodule_name = func_msg->submodule_name();
-    cout << __func__ << " submodule name " << submodule_name << endl;
-    if (submodule_fuzzerbase_map_.find(submodule_name)
-        != submodule_fuzzerbase_map_.end()) {
-      cout << __func__ << " call is for a submodule" << endl;
-      func_fuzzer = submodule_fuzzerbase_map_[submodule_name];
-    } else {
-      cerr << __func__ << " called an API of a non-loaded submodule." << endl;
-      return empty_string;
-    }
-  } else {
-    func_fuzzer = GetFuzzerBase(*if_spec_msg_, dll_file_name_,
-                                func_msg->name().c_str());
-  }
-  cout << __func__ << ":" << __LINE__ << endl;
-  if (!func_fuzzer) {
-    cerr << "can't find FuzzerBase for " << func_msg->name() << " using "
-         << dll_file_name_ << endl;
-    return empty_string;
-  }
-
-  void* result;
-  cout << __func__ << " Get Atrribute " << func_msg->name() << " parent_path("
-       << func_msg->parent_path() << ")" << endl;
-  if (!func_fuzzer->GetAttribute(func_msg, &result)) {
-    cerr << __func__ << " attribute not found - todo handle more explicitly"
-         << endl;
-    return *(new string("error"));
-  }
-  cout << __func__ << ": called" << endl;
-
-  if (if_spec_msg_ && if_spec_msg_->component_class() == HAL_HIDL) {
-    cout << __func__ << ": for a HIDL HAL" << endl;
-    func_msg->mutable_return_type()->set_type(TYPE_STRING);
-    func_msg->mutable_return_type()->mutable_string_value()->set_message(
-        *(string*)result);
-    func_msg->mutable_return_type()->mutable_string_value()->set_length(
-        ((string*)result)->size());
-    free(result);
-    string* output = new string();
-    google::protobuf::TextFormat::PrintToString(*func_msg, output);
-    return *output;
-  } else {
-    cout << __func__ << ": for a non-HIDL HAL" << endl;
-    if (func_msg->return_type().type() == TYPE_PREDEFINED) {
-      // TODO: actually handle this case.
-      if (result != NULL) {
-        // loads that interface spec and enqueues all functions.
-        cout << __func__ << " return type: " << func_msg->return_type().type()
-             << endl;
-      } else {
-        cout << __func__ << " return value = NULL" << endl;
-      }
-      cerr << __func__ << " todo: support aggregate" << endl;
-      string* output = new string();
-      google::protobuf::TextFormat::PrintToString(*func_msg, output);
-      return *output;
-    } else if (func_msg->return_type().type() == TYPE_SCALAR) {
-      // TODO handle when the size > 1.
-      if (!strcmp(func_msg->return_type().scalar_type().c_str(), "int32_t")) {
-        func_msg->mutable_return_type()->mutable_scalar_value()->set_int32_t(
-            *((int*)(&result)));
-        cout << "result " << endl;
-        // todo handle more types;
-        string* output = new string();
-        google::protobuf::TextFormat::PrintToString(*func_msg, output);
-        return *output;
-      } else if (!strcmp(func_msg->return_type().scalar_type().c_str(), "uint32_t")) {
-        func_msg->mutable_return_type()->mutable_scalar_value()->set_uint32_t(
-            *((int*)(&result)));
-        cout << "result " << endl;
-        // todo handle more types;
-        string* output = new string();
-        google::protobuf::TextFormat::PrintToString(*func_msg, output);
-        return *output;
-      } else if (!strcmp(func_msg->return_type().scalar_type().c_str(), "int16_t")) {
-        func_msg->mutable_return_type()->mutable_scalar_value()->set_int16_t(
-            *((int*)(&result)));
-        cout << "result " << endl;
-        // todo handle more types;
-        string* output = new string();
-        google::protobuf::TextFormat::PrintToString(*func_msg, output);
-        return *output;
-      } else if (!strcmp(func_msg->return_type().scalar_type().c_str(), "uint16_t")) {
-        func_msg->mutable_return_type()->mutable_scalar_value()->set_uint16_t(
-            *((int*)(&result)));
-        cout << "result " << endl;
-        // todo handle more types;
-        string* output = new string();
-        google::protobuf::TextFormat::PrintToString(*func_msg, output);
-        return *output;
-      }
-    } else if (func_msg->return_type().type() == TYPE_SUBMODULE) {
-      cerr << __func__ << "[driver:hal] return type TYPE_SUBMODULE" << endl;
-      if (result != NULL) {
-        // loads that interface spec and enqueues all functions.
-        cout << __func__ << " return type: " << func_msg->return_type().type()
-             << endl;
-      } else {
-        cout << __func__ << " return value = NULL" << endl;
-      }
-      // find a VTS spec for that module
-      string submodule_name = func_msg->return_type().predefined_type().substr(
-          0, func_msg->return_type().predefined_type().size() - 1);
-      vts::ComponentSpecificationMessage* submodule_iface_spec_msg;
-      if (submodule_if_spec_map_.find(submodule_name)
-          != submodule_if_spec_map_.end()) {
-        cout << __func__ << " submodule InterfaceSpecification already loaded"
-             << endl;
-        submodule_iface_spec_msg = submodule_if_spec_map_[submodule_name];
-        func_msg->set_allocated_return_type_submodule_spec(
-            submodule_iface_spec_msg);
-      } else {
-        submodule_iface_spec_msg =
-            FindComponentSpecification(
-                if_spec_msg_->component_class(), if_spec_msg_->component_type(),
-                if_spec_msg_->component_type_version(), submodule_name,
-                if_spec_msg_->package(), if_spec_msg_->component_name());
-        if (!submodule_iface_spec_msg) {
-          cerr << __func__ << " submodule InterfaceSpecification not found" << endl;
-        } else {
-          cout << __func__ << " submodule InterfaceSpecification found" << endl;
-          func_msg->set_allocated_return_type_submodule_spec(
-              submodule_iface_spec_msg);
-          FuzzerBase* func_fuzzer = GetFuzzerBaseSubModule(
-              *submodule_iface_spec_msg, result);
-          submodule_if_spec_map_[submodule_name] = submodule_iface_spec_msg;
-          submodule_fuzzerbase_map_[submodule_name] = func_fuzzer;
-        }
-      }
-      string* output = new string();
-      google::protobuf::TextFormat::PrintToString(*func_msg, output);
-      return *output;
-    }
-  }
-  return *(new string("void"));
-}
-
-bool SpecificationBuilder::Process(const char* dll_file_name,
-                                   const char* spec_lib_file_path,
-                                   int target_class, int target_type,
-                                   float target_version,
-                                   const char* target_package,
-                                   const char* target_component_name) {
-  vts::ComponentSpecificationMessage* interface_specification_message =
-      FindComponentSpecification(target_class, target_type, target_version,
-                                 "", target_package, target_component_name);
-  cout << "ifspec addr " << interface_specification_message << endl;
-
-  if (!interface_specification_message) {
-    cerr << __func__ << ": no interface specification file found for class "
-         << target_class << " type " << target_type << " version "
-         << target_version << endl;
-    return false;
-  }
-
-  if (!wrapper_.LoadInterfaceSpecificationLibrary(spec_lib_file_path)) {
-    return false;
-  }
-
-  if (!GetFuzzerBaseAndAddAllFunctionsToQueue(*interface_specification_message,
-                                              dll_file_name))
-    return false;
-
-  for (int i = 0; i < epoch_count_; i++) {
-    // by default, breath-first-searching is used.
-    if (job_queue_.empty()) {
-      cout << "no more job to process; stopping after epoch " << i << endl;
-      break;
-    }
-
-    pair<vts::FunctionSpecificationMessage*, FuzzerBase*> curr_job =
-        job_queue_.front();
-    job_queue_.pop();
-
-    vts::FunctionSpecificationMessage* func_msg = curr_job.first;
-    FuzzerBase* func_fuzzer = curr_job.second;
-
-    void* result;
-    FunctionSpecificationMessage result_msg;
-    cout << "Iteration " << (i + 1) << " Function " << func_msg->name() << endl;
-    // For Hidl HAL, use CallFunction method.
-    if (interface_specification_message->component_class() == HAL_HIDL) {
-      func_fuzzer->CallFunction(*func_msg, callback_socket_name_, &result_msg);
-    } else {
-      func_fuzzer->Fuzz(func_msg, &result, callback_socket_name_);
-    }
-    if (func_msg->return_type().type() == TYPE_PREDEFINED) {
-      if (result != NULL) {
-        // loads that interface spec and enqueues all functions.
-        cout << __FUNCTION__
-             << " return type: " << func_msg->return_type().predefined_type()
-             << endl;
-        // TODO: handle the case when size > 1
-        string submodule_name = func_msg->return_type().predefined_type();
-        while (!submodule_name.empty() &&
-               (std::isspace(submodule_name.back()) ||
-                submodule_name.back() == '*')) {
-          submodule_name.pop_back();
-        }
-        vts::ComponentSpecificationMessage* iface_spec_msg =
-            FindComponentSpecification(target_class, target_type,
-                                       target_version, submodule_name);
-        if (iface_spec_msg) {
-          cout << __FUNCTION__ << " submodule found - " << submodule_name
-               << endl;
-          if (!GetFuzzerBaseAndAddAllFunctionsToQueue(*iface_spec_msg,
-                                                      dll_file_name)) {
-            return false;
-          }
-        } else {
-          cout << __FUNCTION__ << " submodule not found - " << submodule_name
-               << endl;
-        }
-      } else {
-        cout << __FUNCTION__ << " return value = NULL" << endl;
-      }
-    }
-  }
-
-  return true;
-}
-
-vts::ComponentSpecificationMessage*
-SpecificationBuilder::GetComponentSpecification() const {
-  cout << "ifspec addr get " << if_spec_msg_ << endl;
-  return if_spec_msg_;
-}
-
-}  // namespace vts
-}  // namespace android
diff --git a/drivers/hal/common/utils/InterfaceSpecUtil.cpp b/drivers/hal/common/utils/InterfaceSpecUtil.cpp
index fba5a03..0690430 100644
--- a/drivers/hal/common/utils/InterfaceSpecUtil.cpp
+++ b/drivers/hal/common/utils/InterfaceSpecUtil.cpp
@@ -16,10 +16,15 @@
 
 #include "utils/InterfaceSpecUtil.h"
 
+#include <fstream>
 #include <iostream>
 #include <sstream>
 #include <string>
 
+#include <assert.h>
+#include <google/protobuf/message.h>
+#include <google/protobuf/text_format.h>
+
 #include "utils/StringUtil.h"
 #include "test/vts/proto/ComponentSpecificationMessage.pb.h"
 
@@ -28,6 +33,28 @@
 namespace android {
 namespace vts {
 
+bool ParseInterfaceSpec(const char* file_path,
+                        ComponentSpecificationMessage* message) {
+  ifstream in_file(file_path);
+  stringstream str_stream;
+  if (!in_file.is_open()) {
+    cerr << "Unable to open file. " << file_path << endl;
+    return false;
+  }
+  str_stream << in_file.rdbuf();
+  in_file.close();
+  const string data = str_stream.str();
+
+  message->Clear();
+  if (!google::protobuf::TextFormat::MergeFromString(data, message)) {
+    cerr << __FUNCTION__ << ": Can't parse a given proto file " << file_path
+         << "." << endl;
+    cerr << data << endl;
+    return false;
+  }
+  return true;
+}
+
 string GetFunctionNamePrefix(const ComponentSpecificationMessage& message) {
   stringstream prefix_ss;
   if (message.component_class() != HAL_HIDL) {
@@ -72,5 +99,34 @@
   return out.str();
 }
 
+string GetHidlHalDriverLibName(const string& package_name,
+                               const float version) {
+  return package_name + "@" + GetVersionString(version) + "-vts.driver.so";
+}
+
+string GetPackageName(const string& type_name) {
+  string str = type_name.substr(0, type_name.find('V') - strlen("::"));
+  if (str.find("::") == 0) {
+    str = str.substr(strlen("::"));
+  }
+  ReplaceSubString(str, "::", ".");
+  return str;
+}
+
+float GetVersion(const string& type_name) {
+  string str = type_name.substr(type_name.find('V') + 1);
+  string version_str = str.substr(0, str.find("::"));
+  string major_version = version_str.substr(0, version_str.find("_"));
+  string minor_version = version_str.substr(version_str.find("_") + 1);
+  // TODO(zhuoyao): handle the case when minor_version >= 10
+  assert(std::stof(minor_version) < 10.0);
+  return std::stof(major_version) + 0.1 * (std::stof(minor_version));
+}
+
+string GetComponentName(const string& type_name) {
+  string str = type_name.substr(type_name.find('V'));
+  return str.substr(str.find("::") + strlen("::"));
+}
+
 }  // namespace vts
 }  // namespace android
diff --git a/drivers/hal/framework/Android.mk b/drivers/hal/framework/Android.mk
deleted file mode 100644
index 9bf107d..0000000
--- a/drivers/hal/framework/Android.mk
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := vtssysfuzzer
-LOCAL_MODULE_STEM_64 := fuzzer64
-LOCAL_MODULE_STEM_32 := fuzzer32
-LOCAL_MODULE_TAGS := optional
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_SRC_FILES := \
-  VtsFuzzerMain.cpp \
-  BinderServer.cpp \
-  SocketServer.cpp \
-
-LOCAL_C_INCLUDES := \
-  bionic \
-  libcore \
-  device/google/gce/include \
-  external/protobuf/src \
-  frameworks/native/include \
-  system/core/include \
-  system/extras \
-  test/vts/drivers/hal/common \
-  test/vts/drivers/hal/framework \
-  test/vts/drivers/libdrivercomm \
-
-LOCAL_SHARED_LIBRARIES := \
-  libutils \
-  libcutils \
-  liblog \
-  libbinder \
-  libdl \
-  libandroid_runtime \
-  libvts_common \
-  libvts_drivercomm \
-  libvts_multidevice_proto \
-  libprotobuf-cpp-full \
-
-LOCAL_MULTILIB := both
-
-include $(BUILD_EXECUTABLE)
diff --git a/drivers/hal/framework/VtsFuzzerMain.cpp b/drivers/hal/framework/VtsFuzzerMain.cpp
deleted file mode 100644
index 6d42061..0000000
--- a/drivers/hal/framework/VtsFuzzerMain.cpp
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Example usage (for angler 64-bit devices):
- *  $ fuzzer --class=hal_conventional --type=light --version=1.0
- * /system/lib64/hw/lights.angler.so
- *  $ fuzzer --class=hal_conventional --type=gps --version=1.0
- * /system/lib64/hw/gps.msm8994.so
- *
- *  $ LD_LIBRARY_PATH=/data/local/tmp/64 ./fuzzer64 --class=hal --type=light \
- *    --version=1.0 --spec_dir=/data/local/tmp/spec \
- *    /data/local/tmp/64/hal/lights.vts.so
- *
- * Example usage (for GCE virtual devices):
- *  $ fuzzer --class=hal_conventional --type=light --version=1.0
- * /system/lib/hw/lights.gce_x86.so
- *  $ fuzzer --class=hal_conventional --type=gps --version=1.0
- * /system/lib/hw/gps.gce_x86.so
- */
-
-#include <getopt.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <algorithm>
-#include <iostream>
-#include <string>
-
-#include "binder/VtsFuzzerBinderService.h"
-#include "specification_parser/InterfaceSpecificationParser.h"
-#include "specification_parser/SpecificationBuilder.h"
-#include "replayer/VtsHidlHalReplayer.h"
-
-#include "BinderServer.h"
-#include "SocketServer.h"
-
-using namespace std;
-using namespace android;
-
-#define INTERFACE_SPEC_LIB_FILENAME "libvts_interfacespecification.so"
-#define PASSED_MARKER "[  PASSED  ]"
-
-// the default epoch count where an epoch is the time for a fuzz test run
-// (e.g., a function call).
-static const int kDefaultEpochCount = 100;
-
-// Dumps usage on stderr.
-static void usage() {
-  // TODO(zhuoyao): update the usage message.
-  fprintf(
-      stderr,
-      "Usage: fuzzer [options] <target HAL file path>\n"
-      "\n"
-      "Android fuzzer v0.1.  To fuzz Android system.\n"
-      "\n"
-      "Options:\n"
-      "--help\n"
-      "    Show this message.\n"
-      "\n"
-      "Recording continues until Ctrl-C is hit or the time limit is reached.\n"
-      "\n");
-}
-
-// Parses command args and kicks things off.
-int main(int argc, char* const argv[]) {
-  static const struct option longOptions[] = {
-      {"help", no_argument, NULL, 'h'},
-      {"class", required_argument, NULL, 'c'},
-      {"type", required_argument, NULL, 't'},
-      {"version", required_argument, NULL, 'v'},
-      {"epoch_count", required_argument, NULL, 'e'},
-      {"spec_dir", required_argument, NULL, 's'},
-      {"target_package", optional_argument, NULL, 'k'},
-      {"target_component_name", optional_argument, NULL, 'n'},
-#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
-      {"server_socket_path", optional_argument, NULL, 'f'},
-#else  // binder
-      {"service_name", required_argument, NULL, 'n'},
-#endif
-      {"server", optional_argument, NULL, 'd'},
-      {"callback_socket_name", optional_argument, NULL, 'p'},
-      // TODO(zhuoyao):make mode a required_argument to support different
-      // execution mode. e.g.: fuzzer/driver/replayer.
-      {"mode", optional_argument, NULL, 'm'},
-      {"trace_path", optional_argument, NULL, 'r'},
-      {"spec_path", optional_argument, NULL, 'a'},
-      {"hal_service_name", optional_argument, NULL, 'j'},
-      {NULL, 0, NULL, 0}};
-  int target_class;
-  int target_type;
-  float target_version = 1.0;
-  int epoch_count = kDefaultEpochCount;
-  string spec_dir_path(DEFAULT_SPEC_DIR_PATH);
-  bool server = false;
-#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
-  string server_socket_path;
-#else  // binder
-  string service_name(VTS_FUZZER_BINDER_SERVICE_NAME);
-#endif
-  string target_package;
-  string target_component_name;
-  string callback_socket_name;
-  string mode;
-  string trace_path;
-  string spec_path;
-  string hal_service_name = "default";
-
-  while (true) {
-    int optionIndex = 0;
-    int ic = getopt_long(argc, argv, "", longOptions, &optionIndex);
-    if (ic == -1) {
-      break;
-    }
-
-    switch (ic) {
-      case 'h':
-        usage();
-        return 0;
-      case 'c': {
-        string target_class_str = string(optarg);
-        transform(target_class_str.begin(), target_class_str.end(),
-                  target_class_str.begin(), ::tolower);
-        if (!strcmp(target_class_str.c_str(), "hal_conventional")) {
-          target_class = vts::HAL_CONVENTIONAL;
-        } else if (!strcmp(target_class_str.c_str(), "hal_hidl")) {
-          target_class = vts::HAL_HIDL;
-        } else {
-          target_class = 0;
-        }
-        break;
-      }
-      case 't': {
-        string target_type_str = string(optarg);
-        transform(target_type_str.begin(), target_type_str.end(),
-                  target_type_str.begin(), ::tolower);
-        if (!strcmp(target_type_str.c_str(), "camera")) {
-          target_type = vts::CAMERA;
-        } else if (!strcmp(target_type_str.c_str(), "gps")) {
-          target_type = vts::GPS;
-        } else if (!strcmp(target_type_str.c_str(), "audio")) {
-          target_type = vts::AUDIO;
-        } else if (!strcmp(target_type_str.c_str(), "light")) {
-          target_type = vts::LIGHT;
-        } else {
-          target_type = 0;
-        }
-        break;
-      }
-      case 'v':
-        target_version = atof(optarg);
-        break;
-      case 'p':
-        callback_socket_name = string(optarg);
-        break;
-      case 'e':
-        epoch_count = atoi(optarg);
-        if (epoch_count <= 0) {
-          fprintf(stderr, "epoch_count must be > 0");
-          return 2;
-        }
-        break;
-      case 's':
-        spec_dir_path = string(optarg);
-        break;
-#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
-      case 'f':
-        server_socket_path = string(optarg);
-        break;
-#else  // binder
-      case 'n':
-        service_name = string(optarg);
-        break;
-#endif
-      case 'd':
-        server = true;
-        break;
-      case 'k':
-        target_package = string(optarg);
-        break;
-      case 'n':
-        target_component_name = string(optarg);
-        break;
-      case 'm':
-        mode = string(optarg);
-        break;
-      case 'r':
-        trace_path = string(optarg);
-        break;
-      case 'a':
-        spec_path = string(optarg);
-        break;
-      case 'j':
-        hal_service_name = string(optarg);
-        break;
-      default:
-        if (ic != '?') {
-          fprintf(stderr, "getopt_long returned unexpected value 0x%x\n", ic);
-        }
-        return 2;
-    }
-  }
-
-  android::vts::SpecificationBuilder spec_builder(spec_dir_path, epoch_count,
-                                                  callback_socket_name);
-  if (!server) {
-    if (optind != argc - 1) {
-      fprintf(stderr, "Must specify output file (see --help).\n");
-      return 2;
-    }
-    bool success;
-    if (mode == "replay") {
-      android::vts::VtsHidlHalReplayer replayer(spec_path,
-                                                callback_socket_name);
-      success = replayer.ReplayTrace(argv[optind], trace_path,
-                                     hal_service_name);
-    } else {
-      success = spec_builder.Process(argv[optind],INTERFACE_SPEC_LIB_FILENAME,
-                                     target_class, target_type, target_version,
-                                     target_package.c_str(),
-                                     target_component_name.c_str());
-    }
-    cout << "Result: " << success << endl;
-    if (success) {
-      cout << endl << PASSED_MARKER << endl;
-    }
-  } else {
-#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
-    android::vts::StartSocketServer(server_socket_path, spec_builder,
-                                    INTERFACE_SPEC_LIB_FILENAME);
-#else  // binder
-    android::vts::StartBinderServer(service_name, spec_builder,
-                                    INTERFACE_SPEC_LIB_FILENAME);
-#endif
-  }
-  return 0;
-}
diff --git a/drivers/libprofiling/Android.bp b/drivers/hal/replayer/Android.bp
similarity index 62%
copy from drivers/libprofiling/Android.bp
copy to drivers/hal/replayer/Android.bp
index 25bca60..a90bfde 100644
--- a/drivers/libprofiling/Android.bp
+++ b/drivers/hal/replayer/Android.bp
@@ -1,5 +1,5 @@
 //
-// Copyright (C) 2016 The Android Open Source Project
+// Copyright (C) 2017 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -14,39 +14,33 @@
 // limitations under the License.
 //
 
-cc_library_shared {
-
-    name: "libvts_profiling",
-
-    srcs: ["VtsProfilingInterface.cpp"],
-
-    shared_libs: [
-        "libbase",
-        "libcutils",
-        "libhidlbase",
-        "libvts_common",
-        "libvts_multidevice_proto",
-        "libprotobuf-cpp-full",
-    ],
+cc_binary {
+    name: "vts_hal_replayer",
 
     cflags: [
-        "-Werror",
         "-Wall",
+        "-Werror",
     ],
 
-    export_include_dirs: ["."],
-}
+    compile_multilib: "both",
+    multilib: {
+        lib32: {
+            suffix: "32",
+        },
+        lib64: {
+            suffix: "64",
+        },
+    },
 
-cc_binary {
-    name: "vts_profiling_configure",
-
-    srcs: ["VtsProfilingConfigureMain.cpp"],
+    srcs: [
+        "VtsHidlHalReplayer.cpp",
+        "VtsHidlHalReplayerMain.cpp",
+    ],
 
     shared_libs: [
-        "libbase",
-        "libutils",
-        "libcutils",
-        "libhidlbase",
-        "libhidltransport",
+        "libprotobuf-cpp-full",
+        "libvts_common",
+        "libvts_multidevice_proto",
+        "libvts_profiling_utils",
     ],
 }
diff --git a/drivers/hal/replayer/VtsHidlHalReplayer.cpp b/drivers/hal/replayer/VtsHidlHalReplayer.cpp
new file mode 100644
index 0000000..ff3c613
--- /dev/null
+++ b/drivers/hal/replayer/VtsHidlHalReplayer.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "VtsHidlHalReplayer.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <fstream>
+#include <iostream>
+#include <string>
+
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/text_format.h>
+
+#include "VtsProfilingUtil.h"
+#include "driver_base/DriverBase.h"
+#include "utils/InterfaceSpecUtil.h"
+#include "utils/StringUtil.h"
+
+using namespace std;
+
+namespace android {
+namespace vts {
+
+bool VtsHidlHalReplayer::ReplayTrace(const string& trace_file,
+                                     const string& hal_service_name) {
+  // Parse the trace file to get the sequence of function calls.
+  int fd =
+      open(trace_file.c_str(), O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+  if (fd < 0) {
+    cerr << "Can not open trace file: " << trace_file
+         << "error: " << std::strerror(errno);
+    return false;
+  }
+
+  google::protobuf::io::FileInputStream input(fd);
+
+  VtsProfilingRecord call_msg;
+  VtsProfilingRecord expected_result_msg;
+  while (readOneDelimited(&call_msg, &input) &&
+         readOneDelimited(&expected_result_msg, &input)) {
+    if (call_msg.event() != InstrumentationEventType::SERVER_API_ENTRY &&
+        call_msg.event() != InstrumentationEventType::CLIENT_API_ENTRY &&
+        call_msg.event() != InstrumentationEventType::SYNC_CALLBACK_ENTRY &&
+        call_msg.event() != InstrumentationEventType::ASYNC_CALLBACK_ENTRY &&
+        call_msg.event() != InstrumentationEventType::PASSTHROUGH_ENTRY) {
+      cerr << "Expected a call message but got message with event: "
+           << call_msg.event();
+      continue;
+    }
+    if (expected_result_msg.event() !=
+            InstrumentationEventType::SERVER_API_EXIT &&
+        expected_result_msg.event() !=
+            InstrumentationEventType::CLIENT_API_EXIT &&
+        expected_result_msg.event() !=
+            InstrumentationEventType::SYNC_CALLBACK_EXIT &&
+        expected_result_msg.event() !=
+            InstrumentationEventType::ASYNC_CALLBACK_EXIT &&
+        expected_result_msg.event() !=
+            InstrumentationEventType::PASSTHROUGH_EXIT) {
+      cerr << "Expected a result message but got message with event: "
+           << call_msg.event();
+      continue;
+    }
+
+    cout << __func__ << ": replay function: " << call_msg.func_msg().name();
+
+    string package_name = call_msg.package();
+    float version = call_msg.version();
+    string interface_name = call_msg.interface();
+    DriverBase* driver = driver_manager_->GetDriverForHidlHalInterface(
+        package_name, version, interface_name, hal_service_name);
+    if (!driver) {
+      cerr << __func__ << ": couldn't get a driver base class" << endl;
+      return false;
+    }
+
+    vts::FunctionSpecificationMessage result_msg;
+    if (!driver->CallFunction(call_msg.func_msg(), "" /*callback_socket_name*/,
+                              &result_msg)) {
+      cerr << __func__ << ": replay function fail." << endl;
+      return false;
+    }
+    if (!driver->VerifyResults(expected_result_msg.func_msg(), result_msg)) {
+      // Verification is not strict, i.e. if fail, output error message and
+      // continue the process.
+      cerr << __func__ << ": verification fail." << endl;
+    }
+    call_msg.Clear();
+    expected_result_msg.Clear();
+  }
+  return true;
+}
+
+}  // namespace vts
+}  // namespace android
diff --git a/drivers/hal/common/include/replayer/VtsHidlHalReplayer.h b/drivers/hal/replayer/VtsHidlHalReplayer.h
similarity index 61%
rename from drivers/hal/common/include/replayer/VtsHidlHalReplayer.h
rename to drivers/hal/replayer/VtsHidlHalReplayer.h
index d12e1d1..b7a38e9 100644
--- a/drivers/hal/common/include/replayer/VtsHidlHalReplayer.h
+++ b/drivers/hal/replayer/VtsHidlHalReplayer.h
@@ -16,7 +16,7 @@
 #ifndef __VTS_SYSFUZZER_COMMON_REPLAYER_VTSHIDLHALREPLAYER_H__
 #define __VTS_SYSFUZZER_COMMON_REPLAYER_VTSHIDLHALREPLAYER_H__
 
-#include "fuzz_tester/FuzzerWrapper.h"
+#include "driver_manager/VtsHalDriverManager.h"
 #include "test/vts/proto/VtsProfilingMessage.pb.h"
 
 namespace android {
@@ -30,27 +30,16 @@
 // 3) Verify the return results of each API calls.
 class VtsHidlHalReplayer {
  public:
-  VtsHidlHalReplayer(const std::string& spec_path,
-      const std::string& callback_socket_name);
-
-  // Loads the given interface specification (.vts file) and parses it to
-  // ComponentSpecificationMessage.
-  bool LoadComponentSpecification(const std::string& package,
-                                  float version,
-                                  const std::string& interface_name,
-                                  ComponentSpecificationMessage* message);
+  VtsHidlHalReplayer(VtsHalDriverManager* driver_manager)
+      : driver_manager_(driver_manager) {}
 
   // Replays the API call sequence parsed from the trace file.
-  bool ReplayTrace(const std::string& spec_lib_file_path,
-      const std::string& trace_file, const std::string& hal_service_name);
+  bool ReplayTrace(const std::string& trace_file,
+                   const std::string& hal_service_name);
 
  private:
-  // A FuzzerWrapper instance.
-  FuzzerWrapper wrapper_;
-  // The interface specification ASCII proto file.
-  std::string spec_path_;
-  // The server socket port # of the agent.
-  std::string callback_socket_name_;
+  // Used to load the vts spec and driver library. Does not own.
+  VtsHalDriverManager* driver_manager_;
 };
 
 }  // namespace vts
diff --git a/drivers/hal/replayer/VtsHidlHalReplayerMain.cpp b/drivers/hal/replayer/VtsHidlHalReplayerMain.cpp
new file mode 100644
index 0000000..91fb88b
--- /dev/null
+++ b/drivers/hal/replayer/VtsHidlHalReplayerMain.cpp
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Example usage
+ *  $ vts_hal_replayer /data/local/tmp/hal-trace/nfc/V1_0/nfc.vts.trace
+ *  $ vts_hal_replayer --spec_dir_path /data/local/tmp/spec
+ *    --hal_service_name default
+ *    /data/local/tmp/hal-trace/nfc/V1_0/nfc.vts.trace
+ */
+
+#include <iostream>
+#include <string>
+
+#include <getopt.h>
+
+#include "VtsHidlHalReplayer.h"
+#include "driver_manager/VtsHalDriverManager.h"
+
+using namespace std;
+
+static constexpr const char* kDefaultSpecDirPath = "/data/local/tmp/spec/";
+static constexpr const char* kDefaultHalServiceName = "default";
+static constexpr const char* kPassedMarker = "[  PASSED  ]";
+static const int kDefaultEpochCount = 100;
+
+void ShowUsage() {
+  cout << "Usage: vts_hal_replayer [options] <trace file>\n"
+          "--spec_dir_path <path>:     Set path that store the vts spec files\n"
+          "--hal_service_name <name>:  Set the hal service name\n"
+          "--help:                     Show help\n";
+  exit(1);
+}
+
+int main(int argc, char** argv) {
+  const char* const short_opts = "h:d:n";
+  const option long_opts[] = {
+      {"help", no_argument, nullptr, 'h'},
+      {"spec_dir_path", optional_argument, nullptr, 'd'},
+      {"hal_service_name", optional_argument, nullptr, 'n'},
+      {nullptr, 0, nullptr, 0}};
+
+  string spec_dir_path = kDefaultSpecDirPath;
+  string hal_service_name = kDefaultHalServiceName;
+
+  while (true) {
+    int opt = getopt_long(argc, argv, short_opts, long_opts, nullptr);
+    if (opt == -1) {
+      break;
+    }
+
+    switch (opt) {
+      case 'h':
+      case '?':
+        ShowUsage();
+        return 0;
+      case 'd': {
+        spec_dir_path = string(optarg);
+        break;
+      }
+      case 'n': {
+        hal_service_name = string(optarg);
+        break;
+      }
+      default:
+        cerr << "getopt_long returned unexpected value " << opt << endl;
+        return 2;
+    }
+  }
+
+  if (optind != argc - 1) {
+    cerr << "Must specify the trace file (see --help).\n" << endl;
+    return 2;
+  }
+
+  string trace_path = argv[optind];
+
+  android::vts::VtsHalDriverManager driver_manager(spec_dir_path,
+                                                   kDefaultEpochCount, "");
+  android::vts::VtsHidlHalReplayer replayer(&driver_manager);
+  bool success = replayer.ReplayTrace(trace_path, hal_service_name);
+  if (success) {
+    cout << endl << kPassedMarker << endl;
+  }
+  return 0;
+}
diff --git a/drivers/libprofiling/Android.bp b/drivers/hal/server/Android.bp
similarity index 62%
copy from drivers/libprofiling/Android.bp
copy to drivers/hal/server/Android.bp
index 25bca60..514d92e 100644
--- a/drivers/libprofiling/Android.bp
+++ b/drivers/hal/server/Android.bp
@@ -1,5 +1,5 @@
 //
-// Copyright (C) 2016 The Android Open Source Project
+// Copyright (C) 2017 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -14,39 +14,34 @@
 // limitations under the License.
 //
 
-cc_library_shared {
-
-    name: "libvts_profiling",
-
-    srcs: ["VtsProfilingInterface.cpp"],
-
-    shared_libs: [
-        "libbase",
-        "libcutils",
-        "libhidlbase",
-        "libvts_common",
-        "libvts_multidevice_proto",
-        "libprotobuf-cpp-full",
-    ],
+cc_binary {
+    name: "vts_hal_driver",
 
     cflags: [
-        "-Werror",
         "-Wall",
+        "-Werror",
     ],
 
-    export_include_dirs: ["."],
-}
+    compile_multilib: "both",
+    multilib: {
+        lib32: {
+            suffix: "32",
+        },
+        lib64: {
+            suffix: "64",
+        },
+    },
 
-cc_binary {
-    name: "vts_profiling_configure",
-
-    srcs: ["VtsProfilingConfigureMain.cpp"],
+    srcs: [
+        "BinderServer.cpp",
+        "SocketServer.cpp",
+        "VtsHalDriverServerMain.cpp",
+    ],
 
     shared_libs: [
-        "libbase",
-        "libutils",
-        "libcutils",
-        "libhidlbase",
-        "libhidltransport",
+        "libprotobuf-cpp-full",
+        "libvts_common",
+        "libvts_drivercomm",
+        "libvts_multidevice_proto",
     ],
 }
diff --git a/drivers/hal/framework/BinderServer.cpp b/drivers/hal/server/BinderServer.cpp
similarity index 85%
rename from drivers/hal/framework/BinderServer.cpp
rename to drivers/hal/server/BinderServer.cpp
index 065b2c5..629d1fa 100644
--- a/drivers/hal/framework/BinderServer.cpp
+++ b/drivers/hal/server/BinderServer.cpp
@@ -37,7 +37,6 @@
 #include <binder/TextOutput.h>
 
 #include "binder/VtsFuzzerBinderService.h"
-#include "specification_parser/SpecificationBuilder.h"
 
 #include <google/protobuf/text_format.h>
 #include "test/vts/proto/ComponentSpecificationMessage.pb.h"
@@ -101,9 +100,9 @@
     }
     case CALL: {
       const char* arg = data.readCString();
-      const char* result = Call(arg);
+      const string& result = Call(arg);
 
-      ALOGD("BnVtsFuzzer::%s call(%s) = %i", __FUNCTION__, arg, result);
+      ALOGD("BnVtsFuzzer::%s call(%s) = %i", __FUNCTION__, arg, result.c_str());
       if (reply == NULL) {
         ALOGE("reply == NULL");
         abort();
@@ -111,7 +110,7 @@
 #ifdef VTS_FUZZER_BINDER_DEBUG
       alog << reply << endl;
 #endif
-      reply->writeCString(result);
+      reply->writeCString(result.c_str());
       break;
     }
     case GET_FUNCTIONS: {
@@ -135,18 +134,18 @@
 
 class VtsFuzzerServer : public BnVtsFuzzer {
  public:
-  VtsFuzzerServer(android::vts::SpecificationBuilder& spec_builder,
+  VtsFuzzerServer(android::vts::VtsHalDriverManager* driver_manager,
                   const char* lib_path)
-      : spec_builder_(spec_builder), lib_path_(lib_path) {}
+      : driver_manager_(driver_manager), lib_path_(lib_path) {}
 
   void Exit() { printf("VtsFuzzerServer::Exit\n"); }
 
   int32_t LoadHal(const string& path, int target_class, int target_type,
                   float target_version, const string& module_name) {
     printf("VtsFuzzerServer::LoadHal(%s)\n", path.c_str());
-    bool success = spec_builder_.LoadTargetComponent(
-        path.c_str(), lib_path_, target_class, target_type, target_version,
-        module_name.c_str());
+    bool success = driver_manager_->LoadTargetComponent(
+        path.c_str(), lib_path_, target_class, target_type, target_version, "",
+        "", "", module_name.c_str());
     cout << "Result: " << success << std::endl;
     if (success) {
       return 0;
@@ -160,18 +159,17 @@
     return 0;
   }
 
-  const char* Call(const string& arg) {
+  string Call(const string& arg) {
     printf("VtsFuzzerServer::Call(%s)\n", arg.c_str());
-    FunctionSpecificationMessage* func_msg = new FunctionSpecificationMessage();
-    google::protobuf::TextFormat::MergeFromString(arg, func_msg);
-    const string& result = spec_builder_.CallFunction(func_msg);
-    return result.c_str();
+    FunctionCallMessage* call_msg = new FunctionCallMessage();
+    google::protobuf::TextFormat::MergeFromString(arg, call_msg);
+    return driver_manager_->CallFunction(call_msg);
   }
 
   const char* GetFunctions() {
     printf("Get functions*");
     vts::ComponentSpecificationMessage* spec =
-        spec_builder_.GetComponentSpecification();
+        driver_manager_->GetComponentSpecification();
     if (!spec) {
       return NULL;
     }
@@ -187,16 +185,16 @@
   }
 
  private:
-  android::vts::SpecificationBuilder& spec_builder_;
+  android::vts::VtsHalDriverManager* driver_manager_;
   const char* lib_path_;
 };
 
 void StartBinderServer(const string& service_name,
-                       android::vts::SpecificationBuilder& spec_builder,
+                       android::vts::VtsHalDriverManager* driver_manager,
                        const char* lib_path) {
   defaultServiceManager()->addService(
       String16(service_name.c_str()),
-      new VtsFuzzerServer(spec_builder, lib_path));
+      new VtsFuzzerServer(driver_manager, lib_path));
   android::ProcessState::self()->startThreadPool();
   IPCThreadState::self()->joinThreadPool();
 }
diff --git a/drivers/hal/framework/BinderServer.h b/drivers/hal/server/BinderServer.h
similarity index 88%
rename from drivers/hal/framework/BinderServer.h
rename to drivers/hal/server/BinderServer.h
index de00916..9f7e180 100644
--- a/drivers/hal/framework/BinderServer.h
+++ b/drivers/hal/server/BinderServer.h
@@ -19,13 +19,13 @@
 #ifndef __VTS_DRIVER_HAL_BINDER_SERVER_
 #define __VTS_DRIVER_HAL_BINDER_SERVER_
 
-#include "specification_parser/SpecificationBuilder.h"
+#include "driver_manager/VtsHalDriverManager.h"
 
 namespace android {
 namespace vts {
 
 extern void StartBinderServer(const string& service_name,
-                              android::vts::SpecificationBuilder& spec_builder,
+                              android::vts::VtsHalDriverManager* driver_manager,
                               const char* lib_path);
 
 }  // namespace vts
diff --git a/drivers/hal/framework/SocketServer.cpp b/drivers/hal/server/SocketServer.cpp
similarity index 73%
rename from drivers/hal/framework/SocketServer.cpp
rename to drivers/hal/server/SocketServer.cpp
index 9c80499..8f7ba20 100644
--- a/drivers/hal/framework/SocketServer.cpp
+++ b/drivers/hal/server/SocketServer.cpp
@@ -46,21 +46,17 @@
 #include <string>
 
 #include <VtsDriverCommUtil.h>
-
 #include <google/protobuf/text_format.h>
-#include "test/vts/proto/VtsDriverControlMessage.pb.h"
-
-#include "binder/VtsFuzzerBinderService.h"
-#include "specification_parser/SpecificationBuilder.h"
 
 #include "test/vts/proto/ComponentSpecificationMessage.pb.h"
+#include "test/vts/proto/VtsDriverControlMessage.pb.h"
 
 using namespace std;
 
 namespace android {
 namespace vts {
 
-void VtsDriverHalSocketServer::Exit() { printf("VtsFuzzerServer::Exit\n"); }
+void VtsDriverHalSocketServer::Exit() { printf("VtsHalDriverServer::Exit\n"); }
 
 int32_t VtsDriverHalSocketServer::LoadHal(const string& path, int target_class,
                                           int target_type, float target_version,
@@ -68,69 +64,62 @@
                                           const string& target_component_name,
                                           const string& hw_binder_service_name,
                                           const string& module_name) {
-  printf("VtsFuzzerServer::LoadHal(%s)\n", path.c_str());
-  bool success = spec_builder_.LoadTargetComponent(
+  printf("VtsHalDriverServer::LoadHal(%s)\n", path.c_str());
+  int32_t driver_id = driver_manager_->LoadTargetComponent(
       path.c_str(), lib_path_, target_class, target_type, target_version,
       target_package.c_str(), target_component_name.c_str(),
-      hw_binder_service_name.c_str(),
-      module_name.c_str());
-  cout << "Result: " << success << std::endl;
-  if (success) {
-    return 0;
-  } else {
-    return -1;
-  }
+      hw_binder_service_name.c_str(), module_name.c_str());
+  cout << "Result: " << driver_id << std::endl;
+  return driver_id;
 }
 
 int32_t VtsDriverHalSocketServer::Status(int32_t type) {
-  printf("VtsFuzzerServer::Status(%i)\n", type);
+  printf("VtsHalDriverServer::Status(%i)\n", type);
   return 0;
 }
 
-const char* VtsDriverHalSocketServer::ReadSpecification(
+string VtsDriverHalSocketServer::ReadSpecification(
     const string& name, int target_class, int target_type, float target_version,
     const string& target_package) {
-  printf("VtsFuzzerServer::ReadSpecification(%s)\n", name.c_str());
-  ComponentSpecificationMessage* msg =
-      spec_builder_.FindComponentSpecification(
-          target_class, target_type, target_version,
-          "", target_package, name);
-  string* result = new string();
-  google::protobuf::TextFormat::PrintToString(*msg, result);
-  return result->c_str();
+  printf("VtsHalDriverServer::ReadSpecification(%s)\n", name.c_str());
+  ComponentSpecificationMessage msg;
+  driver_manager_->FindComponentSpecification(target_class, target_type,
+                                              target_version, "",
+                                              target_package, name, &msg);
+  string result;
+  google::protobuf::TextFormat::PrintToString(msg, &result);
+  return result;
 }
 
-const char* VtsDriverHalSocketServer::Call(const string& arg) {
-  cout << "VtsFuzzerServer::Call(" << arg << ")" << endl;
-  FunctionSpecificationMessage* func_msg = new FunctionSpecificationMessage();
-  cout << __func__ << ":" << __LINE__ << endl;
-  google::protobuf::TextFormat::MergeFromString(arg, func_msg);
-  cout << __func__ << ":" << __LINE__ << endl;
-  const string& result = spec_builder_.CallFunction(func_msg);
-  cout << __func__ << ":" << __LINE__ << endl;
-  return result.c_str();
+string VtsDriverHalSocketServer::Call(const string& arg) {
+  cout << "VtsHalDriverServer::Call(" << arg << ")" << endl;
+  FunctionCallMessage* call_msg = new FunctionCallMessage();
+  google::protobuf::TextFormat::MergeFromString(arg, call_msg);
+  const string& result = driver_manager_->CallFunction(call_msg);
+  cout << __func__ << ":" << __LINE__ << " result: " << result.c_str() << endl;
+  return result;
 }
 
-const char* VtsDriverHalSocketServer::GetAttribute(const string& arg) {
-  printf("%s(%s)\n", __func__, arg.c_str());
-  FunctionSpecificationMessage* func_msg = new FunctionSpecificationMessage();
-  google::protobuf::TextFormat::MergeFromString(arg, func_msg);
-  const string& result = spec_builder_.GetAttribute(func_msg);
-  printf("%s: done\n", __func__);
-  return result.c_str();
+string VtsDriverHalSocketServer::GetAttribute(const string& arg) {
+  cout << "VtsHalDriverServer::GetAttribute(" << arg << ")" << endl;
+  FunctionCallMessage* call_msg = new FunctionCallMessage();
+  google::protobuf::TextFormat::MergeFromString(arg, call_msg);
+  const string& result = driver_manager_->GetAttribute(call_msg);
+  cout << "VtsHalDriverServer::GetAttribute done" << endl;
+  return result;
 }
 
 string VtsDriverHalSocketServer::ListFunctions() const {
-  cout << "VtsFuzzerServer::" << __func__ << endl;
+  cout << "VtsHalDriverServer::" << __func__ << endl;
   vts::ComponentSpecificationMessage* spec =
-      spec_builder_.GetComponentSpecification();
+      driver_manager_->GetComponentSpecification();
   string output;
   if (!spec) {
     return output;
   }
-  cout << "VtsFuzzerServer::" << __func__ << " serialize" << endl;
+  cout << "VtsHalDriverServer::" << __func__ << " serialize" << endl;
   if (google::protobuf::TextFormat::PrintToString(*spec, &output)) {
-    cout << "VtsFuzzerServer::" << __func__ << " result length "
+    cout << "VtsHalDriverServer::" << __func__ << " result length "
          << output.length() << endl;
     return output;
   } else {
@@ -157,7 +146,7 @@
       break;
     }
     case LOAD_HAL: {
-      int32_t result = LoadHal(
+      int32_t driver_id = LoadHal(
           command_message.file_path(), command_message.target_class(),
           command_message.target_type(), command_message.target_version(),
           command_message.target_package(),
@@ -165,8 +154,12 @@
           command_message.hw_binder_service_name(),
           command_message.module_name());
       VtsDriverControlResponseMessage response_message;
-      response_message.set_response_code(VTS_DRIVER_RESPONSE_SUCCESS);
-      response_message.set_return_value(result);
+      if (driver_id == -1) {
+        response_message.set_response_code(VTS_DRIVER_RESPONSE_FAIL);
+      } else {
+        response_message.set_response_code(VTS_DRIVER_RESPONSE_SUCCESS);
+      }
+      response_message.set_return_value(driver_id);
       if (VtsSocketSendMessage(response_message)) return true;
       break;
     }
@@ -182,7 +175,7 @@
       if (command_message.has_driver_caller_uid()) {
         setuid(atoi(command_message.driver_caller_uid().c_str()));
       }
-      const char* result = Call(command_message.arg());
+      const string& result = Call(command_message.arg());
       VtsDriverControlResponseMessage response_message;
       response_message.set_response_code(VTS_DRIVER_RESPONSE_SUCCESS);
       response_message.set_return_message(result);
@@ -190,11 +183,9 @@
       break;
     }
     case VTS_DRIVER_COMMAND_READ_SPECIFICATION: {
-      const char* result = ReadSpecification(
-          command_message.module_name(),
-          command_message.target_class(),
-          command_message.target_type(),
-          command_message.target_version(),
+      const string& result = ReadSpecification(
+          command_message.module_name(), command_message.target_class(),
+          command_message.target_type(), command_message.target_version(),
           command_message.target_package());
       VtsDriverControlResponseMessage response_message;
       response_message.set_response_code(VTS_DRIVER_RESPONSE_SUCCESS);
@@ -203,7 +194,7 @@
       break;
     }
     case GET_ATTRIBUTE: {
-      const char* result = GetAttribute(command_message.arg());
+      const string& result = GetAttribute(command_message.arg());
       VtsDriverControlResponseMessage response_message;
       response_message.set_response_code(VTS_DRIVER_RESPONSE_SUCCESS);
       response_message.set_return_message(result);
@@ -231,7 +222,7 @@
 
 // Starts to run a UNIX socket server (foreground).
 int StartSocketServer(const string& socket_port_file,
-                      android::vts::SpecificationBuilder& spec_builder,
+                      VtsHalDriverManager* driver_manager,
                       const char* lib_path) {
   int sockfd;
   socklen_t clilen;
@@ -249,8 +240,8 @@
   serv_addr.sun_family = AF_UNIX;
   strcpy(serv_addr.sun_path, socket_port_file.c_str());
 
-  cout << "[driver:hal] trying to bind (port file: " << socket_port_file
-       << ")" << endl;
+  cout << "[driver:hal] trying to bind (port file: " << socket_port_file << ")"
+       << endl;
 
   if (::bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
     int error_save = errno;
@@ -277,7 +268,7 @@
       close(sockfd);
       cout << "[driver:hal] process for an agent - pid = " << getpid() << endl;
       VtsDriverHalSocketServer* server =
-          new VtsDriverHalSocketServer(spec_builder, lib_path);
+          new VtsDriverHalSocketServer(driver_manager, lib_path);
       server->SetSockfd(newsockfd);
       while (server->ProcessOneCommand())
         ;
diff --git a/drivers/hal/framework/SocketServer.h b/drivers/hal/server/SocketServer.h
similarity index 69%
rename from drivers/hal/framework/SocketServer.h
rename to drivers/hal/server/SocketServer.h
index 7826bc7..9e20a71 100644
--- a/drivers/hal/framework/SocketServer.h
+++ b/drivers/hal/server/SocketServer.h
@@ -21,16 +21,18 @@
 
 #include <VtsDriverCommUtil.h>
 
-#include "specification_parser/SpecificationBuilder.h"
+#include "driver_manager/VtsHalDriverManager.h"
 
 namespace android {
 namespace vts {
 
 class VtsDriverHalSocketServer : public VtsDriverCommUtil {
  public:
-  VtsDriverHalSocketServer(android::vts::SpecificationBuilder& spec_builder,
+  VtsDriverHalSocketServer(VtsHalDriverManager* driver_manager,
                            const char* lib_path)
-      : VtsDriverCommUtil(), spec_builder_(spec_builder), lib_path_(lib_path) {}
+      : VtsDriverCommUtil(),
+        driver_manager_(driver_manager),
+        lib_path_(lib_path) {}
 
   // Start a session to handle a new request.
   bool ProcessOneCommand();
@@ -38,26 +40,28 @@
  protected:
   void Exit();
 
+  // Load a Hal driver with the given info (package, version etc.),
+  // returns the loaded hal driver id if scuccess, -1 otherwise.
   int32_t LoadHal(const string& path, int target_class, int target_type,
                   float target_version, const string& target_package,
                   const string& target_component_name,
                   const string& hw_binder_service_name,
                   const string& module_name);
   int32_t Status(int32_t type);
-  const char* ReadSpecification(
-      const string& name, int target_class, int target_type,
-      float target_version, const string& target_package);
-  const char* Call(const string& arg);
-  const char* GetAttribute(const string& arg);
+  string ReadSpecification(const string& name, int target_class,
+                           int target_type, float target_version,
+                           const string& target_package);
+  string Call(const string& arg);
+  string GetAttribute(const string& arg);
   string ListFunctions() const;
 
  private:
-  android::vts::SpecificationBuilder& spec_builder_;
+  android::vts::VtsHalDriverManager* driver_manager_;
   const char* lib_path_;
 };
 
 extern int StartSocketServer(const string& socket_port_file,
-                             android::vts::SpecificationBuilder& spec_builder,
+                             VtsHalDriverManager* driver_manager,
                              const char* lib_path);
 
 }  // namespace vts
diff --git a/drivers/hal/server/VtsHalDriverServerMain.cpp b/drivers/hal/server/VtsHalDriverServerMain.cpp
new file mode 100644
index 0000000..de81e72
--- /dev/null
+++ b/drivers/hal/server/VtsHalDriverServerMain.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Example usage:
+ *  $ vts_hal_driver
+ *  $ vts_hal_driver --spec_dir_path /data/local/tmp/spec/
+ *    --callback_socket_name /data/local/tmp/vts_agent_callback
+ *    --server_socket_path /data/local/tmp/vts_tcp_server_port
+ */
+#include <iostream>
+#include <string>
+
+#include <getopt.h>
+
+#include "BinderServer.h"
+#include "SocketServer.h"
+#include "binder/VtsFuzzerBinderService.h"
+#include "driver_manager/VtsHalDriverManager.h"
+
+using namespace std;
+
+static constexpr const char* kDefaultSpecDirPath = "/data/local/tmp/spec/";
+static constexpr const char* kInterfaceSpecLibName =
+    "libvts_interfacespecification.so";
+static const int kDefaultEpochCount = 100;
+
+void ShowUsage() {
+  cout << "Usage: vts_hal_driver [options] <interface spce lib>\n"
+          "--spec_dir_path <path>:         Set path that store the vts spec "
+          "files\n"
+          "--callback_socket_name <name>:  Set the callback (agent) socket "
+          "name\n"
+          "--server_socket_path <path>:    Set the driver server socket path\n"
+          "--service_name <name>:          Set the binder service name\n"
+          "--help:                         Show help\n";
+  exit(1);
+}
+
+int main(int argc, char** argv) {
+  const char* const short_opts = "h:d:c:s:n";
+  const option long_opts[] = {
+      {"help", no_argument, nullptr, 'h'},
+      {"spec_dir_path", optional_argument, nullptr, 'd'},
+      {"callback_socket_name", optional_argument, nullptr, 'c'},
+#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
+      {"server_socket_path", optional_argument, NULL, 's'},
+#else  // binder
+      {"service_name", required_argument, NULL, 'n'},
+#endif
+      {nullptr, 0, nullptr, 0},
+  };
+
+  string spec_dir_path = kDefaultSpecDirPath;
+  string callback_socket_name = "";
+  string server_socket_path;
+  string service_name;
+
+  while (true) {
+    int opt = getopt_long(argc, argv, short_opts, long_opts, nullptr);
+    if (opt == -1) {
+      break;
+    }
+
+    switch (opt) {
+      case 'h':
+      case '?':
+        ShowUsage();
+        return 0;
+      case 'd': {
+        spec_dir_path = string(optarg);
+        break;
+      }
+      case 'c': {
+        callback_socket_name = string(optarg);
+        break;
+      }
+#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
+      case 's':
+        server_socket_path = string(optarg);
+        break;
+#else  // binder
+      case 'n':
+        service_name = string(optarg);
+        break;
+#endif
+      default:
+        cerr << "getopt_long returned unexpected value " << opt << endl;
+        return 2;
+    }
+  }
+
+  android::vts::VtsHalDriverManager driver_manager(
+      spec_dir_path, kDefaultEpochCount, callback_socket_name);
+
+#ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
+  android::vts::StartSocketServer(server_socket_path, &driver_manager,
+                                  kInterfaceSpecLibName);
+#else  // binder
+  android::vts::StartBinderServer(service_name, &driver_manager,
+                                  kInterfaceSpecLibName);
+#endif
+
+  return 0;
+}
diff --git a/harnesses/cloud_client/cloud_client.py b/harnesses/cloud_client/cloud_client.py
deleted file mode 100644
index e94b3bf..0000000
--- a/harnesses/cloud_client/cloud_client.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-import logging
-from google.cloud import pubsub
-from google.cloud.exceptions import NotFound
-from oauth2client.service_account import ServiceAccountCredentials
-from time import sleep
-
-from vts.harnesses.cloud_client import cloud_client_controller
-
-
-class CloudClient(object):
-    """Communicates with App Engine to receive and run VTS tests.
-
-    Attributes:
-        clientName: string, the name of the runner machine. This must be pre-
-                    enrolled with the PubSub service.
-        POLL_INTERVAL: int, the fequency at which pubsub service is polled (seconds)
-        MAX_MESSAGES: int, the maximum number of commands to receive at once
-    """
-
-    POLL_INTERVAL = 5
-    MAX_MESSAGES = 100
-
-    def __init__(self, clientName, oauth2_service_json, path_cmdfile=None):
-        """Inits the object with the client name and a PubSub subscription
-
-        Args:
-            clientName: the name of the client. Must be pre-enrolled with the
-                        PubSub service.
-            oauth2_service_json: path (string) to the service account JSON
-                                 keyfile.
-        """
-        self.clientName = clientName
-        credentials = ServiceAccountCredentials.from_json_keyfile_name(
-            oauth2_service_json)
-        self._client = pubsub.Client(credentials=credentials)
-        self._topic = self._client.topic(clientName)
-        self._sub = self._topic.subscription(clientName)
-        self._controller = cloud_client_controller.CloudClientController(
-            path_cmdfile)
-
-    def Pull(self):
-        """Fetches new messages from the PubSub subscription.
-
-        Receives and acknowledges the commands published to the client's
-        subscription.
-
-        Returns:
-            list of commands (strings) from PubSub subscription.
-        """
-        logging.info("Waiting for commands: %s", self.clientName)
-        results = self._sub.pull(
-            return_immediately=True, max_messages=self.MAX_MESSAGES)
-
-        if results:
-            logging.info("Commands received: %s", results)
-            self._sub.acknowledge([ack_id for ack_id, message in results])
-            return [message.data for ack_id, message in results]
-
-        return None
-
-    def Run(self):
-        """Indefinitely pulls and invokes new commands from the PubSub service.
-        """
-        try:
-            while True:
-                commands = self.Pull()
-                print(commands)
-                if not commands:
-                    sleep(self.POLL_INTERVAL)
-                else:
-                    self._controller.ExecuteTradeFedCommands(commands)
-        except NotFound as e:
-            logging.error("No subscription created for client %s",
-                          self.clientName)
diff --git a/harnesses/cloud_client/cloud_client_controller.py b/harnesses/cloud_client/cloud_client_controller.py
deleted file mode 100644
index fed07d6..0000000
--- a/harnesses/cloud_client/cloud_client_controller.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Copyright 2016 - The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import logging
-
-from vts.utils.python.common import cmd_utils
-
-
-class CloudClientController(object):
-    '''Controller class to interact with TradeFed.
-
-    Attributes:
-        path_cmdfile: string, path to TradeFed cmdfile
-    '''
-    DEFAULT_PATH_CMDFILE = 'cmdfile.txt'
-
-    def __init__(self, path_cmdfile=None):
-        if not path_cmdfile:
-            path_cmdfile = self.DEFAULT_PATH_CMDFILE
-        self._path_cmdfile = path_cmdfile
-
-    def ExecuteTfCommands(self, cmds):
-        '''Execute a TradeFed command or a list of TradeFed commands.
-
-        Args:
-            cmds: string or list of string, commands
-        '''
-        if not isinstance(cmds, list):
-            cmds = [cmds]
-
-        cmd = '\n'.join(cmds)
-
-        with open(self._path_cmdfile, 'w') as f:
-            f.write(cmd)
\ No newline at end of file
diff --git a/harnesses/tradefed/src/com/android/compatibility/common/tradefed/build/VtsCompatibilityInvocationHelper.java b/harnesses/tradefed/src/com/android/compatibility/common/tradefed/build/VtsCompatibilityInvocationHelper.java
index 4e445df..6cbf889 100644
--- a/harnesses/tradefed/src/com/android/compatibility/common/tradefed/build/VtsCompatibilityInvocationHelper.java
+++ b/harnesses/tradefed/src/com/android/compatibility/common/tradefed/build/VtsCompatibilityInvocationHelper.java
@@ -15,7 +15,7 @@
  */
 package com.android.compatibility.common.tradefed.build;
 
-import com.android.compatibility.SuiteInfo;
+import com.android.tradefed.testtype.suite.TestSuiteInfo;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -33,10 +33,12 @@
         if (mTestCasesDir == null) {
             String rootDirPath = null;
 
-            rootDirPath = System.getProperty(String.format("%s_ROOT", SuiteInfo.NAME), rootDirPath);
+            rootDirPath = System.getProperty(String.format("%s_ROOT",
+                    TestSuiteInfo.getInstance().getName()), rootDirPath);
             if (rootDirPath == null || rootDirPath.trim().equals("")) {
                 throw new IllegalArgumentException(
-                        String.format("Missing install path property %s_ROOT", SuiteInfo.NAME));
+                        String.format("Missing install path property %s_ROOT",
+                                TestSuiteInfo.getInstance().getName()));
             }
 
             File testCaseDir = new File(rootDirPath, "android-vts/testcases");
diff --git a/harnesses/tradefed/src/com/android/compatibility/common/tradefed/targetprep/HidlProfilerPreparer.java b/harnesses/tradefed/src/com/android/compatibility/common/tradefed/targetprep/HidlProfilerPreparer.java
index 46dc357..4ee9a0c 100644
--- a/harnesses/tradefed/src/com/android/compatibility/common/tradefed/targetprep/HidlProfilerPreparer.java
+++ b/harnesses/tradefed/src/com/android/compatibility/common/tradefed/targetprep/HidlProfilerPreparer.java
@@ -46,7 +46,7 @@
  * This is used when one wants to do such setup and cleanup operations in Java instead of the
  * VTS Python runner, Python test template, or Python test case.
  */
-@OptionClass(alias = "push-file")
+@OptionClass(alias = "hidl-profiler-preparer")
 public class HidlProfilerPreparer implements ITargetCleaner, IAbiReceiver {
     private static final String LOG_TAG = "HidlProfilerPreparer";
 
diff --git a/harnesses/tradefed/src/com/android/compatibility/common/util/ResultHandler.java b/harnesses/tradefed/src/com/android/compatibility/common/util/ResultHandler.java
deleted file mode 100644
index 75dccc5..0000000
--- a/harnesses/tradefed/src/com/android/compatibility/common/util/ResultHandler.java
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.compatibility.common.util;
-
-import com.android.compatibility.common.util.ChecksumReporter.ChecksumValidationException;
-
-import com.google.common.base.Strings;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-/**
- * Handles conversion of results to/from files.
- */
-public class ResultHandler {
-
-    private static final String ENCODING = "UTF-8";
-    private static final String TYPE = "org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer";
-    private static final String NS = null;
-    private static final String RESULT_FILE_VERSION = "5.0";
-    public static final String TEST_RESULT_FILE_NAME = "test_result.xml";
-    public static final String FAILURE_REPORT_NAME = "test_result_failures.html";
-    private static final String FAILURE_XSL_FILE_NAME = "vts_failures.xsl";
-
-    public static final String[] RESULT_RESOURCES = {
-        "vts_result.css",
-        "vts_result.xsd",
-        "vts_result.xsl",
-        "logo.png"
-    };
-
-    // XML constants
-    private static final String ABI_ATTR = "abi";
-    private static final String BUGREPORT_TAG = "BugReport";
-    private static final String BUILD_FINGERPRINT = "build_fingerprint";
-    private static final String BUILD_ID = "build_id";
-    private static final String BUILD_PRODUCT = "build_product";
-    private static final String BUILD_TAG = "Build";
-    private static final String CASE_TAG = "TestCase";
-    private static final String COMMAND_LINE_ARGS = "command_line_args";
-    private static final String DEVICES_ATTR = "devices";
-    private static final String DONE_ATTR = "done";
-    private static final String END_DISPLAY_TIME_ATTR = "end_display";
-    private static final String END_TIME_ATTR = "end";
-    private static final String FAILED_ATTR = "failed";
-    private static final String FAILURE_TAG = "Failure";
-    private static final String HOST_NAME_ATTR = "host_name";
-    private static final String JAVA_VENDOR_ATTR = "java_vendor";
-    private static final String JAVA_VERSION_ATTR = "java_version";
-    private static final String LOGCAT_TAG = "Logcat";
-    private static final String LOG_URL_ATTR = "log_url";
-    private static final String MESSAGE_ATTR = "message";
-    private static final String MODULE_TAG = "Module";
-    private static final String MODULES_DONE_ATTR = "modules_done";
-    private static final String MODULES_TOTAL_ATTR = "modules_total";
-    private static final String NAME_ATTR = "name";
-    private static final String OS_ARCH_ATTR = "os_arch";
-    private static final String OS_NAME_ATTR = "os_name";
-    private static final String OS_VERSION_ATTR = "os_version";
-    private static final String PASS_ATTR = "pass";
-    private static final String REPORT_VERSION_ATTR = "report_version";
-    private static final String REFERENCE_URL_ATTR = "reference_url";
-    private static final String RESULT_ATTR = "result";
-    private static final String RESULT_TAG = "Result";
-    private static final String RUNTIME_ATTR = "runtime";
-    private static final String SCREENSHOT_TAG = "Screenshot";
-    private static final String SKIPPED_ATTR = "skipped";
-    private static final String STACK_TAG = "StackTrace";
-    private static final String START_DISPLAY_TIME_ATTR = "start_display";
-    private static final String START_TIME_ATTR = "start";
-    private static final String SUITE_NAME_ATTR = "suite_name";
-    private static final String SUITE_PLAN_ATTR = "suite_plan";
-    private static final String SUITE_VERSION_ATTR = "suite_version";
-    private static final String SUITE_BUILD_ATTR = "suite_build_number";
-    private static final String SUMMARY_TAG = "Summary";
-    private static final String TEST_TAG = "Test";
-
-
-    /**
-     * Returns IInvocationResults that can be queried for general reporting information, but that
-     * do not store underlying module data. Useful for summarizing invocation history.
-     * @param resultsDir
-     * @param useChecksum
-     */
-    public static List<IInvocationResult> getLightResults(File resultsDir) {
-        List<IInvocationResult> results = new ArrayList<>();
-        List<File> files = getResultDirectories(resultsDir);
-        for (File resultDir : files) {
-            IInvocationResult result = getResultFromDir(resultDir, false);
-            if (result != null) {
-                results.add(new LightInvocationResult(result));
-                result = null; // ensure all references are removed to free memory
-            }
-        }
-        // Sort the table entries on each entry's timestamp.
-        Collections.sort(results,  (result1, result2) -> Long.compare(
-                result1.getStartTime(),
-                result2.getStartTime()));
-        return results;
-    }
-
-    /**
-     * @param resultDir
-     * @return an IInvocationResult for this result, or null upon error
-     */
-    public static IInvocationResult getResultFromDir(File resultDir) {
-        return getResultFromDir(resultDir, false);
-    }
-
-    /**
-     * @param resultDir
-     * @param useChecksum
-     * @return an IInvocationResult for this result, or null upon error
-     */
-    public static IInvocationResult getResultFromDir(File resultDir, Boolean useChecksum) {
-        try {
-            File resultFile = new File(resultDir, TEST_RESULT_FILE_NAME);
-            if (!resultFile.exists()) {
-                return null;
-            }
-            Boolean invocationUseChecksum = useChecksum;
-            IInvocationResult invocation = new InvocationResult();
-            invocation.setRetryDirectory(resultDir);
-            ChecksumReporter checksumReporter = null;
-            if (invocationUseChecksum) {
-                try {
-                    checksumReporter = ChecksumReporter.load(resultDir);
-                    invocation.setRetryChecksumStatus(RetryChecksumStatus.RetryWithChecksum);
-                } catch (ChecksumValidationException e) {
-                    // Unable to read checksum form previous execution
-                    invocation.setRetryChecksumStatus(RetryChecksumStatus.RetryWithoutChecksum);
-                    invocationUseChecksum = false;
-                }
-            }
-            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
-            XmlPullParser parser = factory.newPullParser();
-            parser.setInput(new FileReader(resultFile));
-
-            parser.nextTag();
-            parser.require(XmlPullParser.START_TAG, NS, RESULT_TAG);
-            invocation.setStartTime(Long.valueOf(
-                    parser.getAttributeValue(NS, START_TIME_ATTR)));
-            invocation.setTestPlan(parser.getAttributeValue(NS, SUITE_PLAN_ATTR));
-            invocation.setCommandLineArgs(parser.getAttributeValue(NS, COMMAND_LINE_ARGS));
-            String deviceList = parser.getAttributeValue(NS, DEVICES_ATTR);
-            for (String device : deviceList.split(",")) {
-                invocation.addDeviceSerial(device);
-            }
-
-            parser.nextTag();
-            parser.require(XmlPullParser.START_TAG, NS, BUILD_TAG);
-            invocation.addInvocationInfo(BUILD_ID, parser.getAttributeValue(NS, BUILD_ID));
-            invocation.addInvocationInfo(BUILD_PRODUCT, parser.getAttributeValue(NS,
-                    BUILD_PRODUCT));
-            invocation.setBuildFingerprint(parser.getAttributeValue(NS, BUILD_FINGERPRINT));
-
-            // TODO(stuartscott): may want to reload these incase the retry was done with
-            // --skip-device-info flag
-            parser.nextTag();
-            parser.require(XmlPullParser.END_TAG, NS, BUILD_TAG);
-            parser.nextTag();
-            parser.require(XmlPullParser.START_TAG, NS, SUMMARY_TAG);
-            parser.nextTag();
-            parser.require(XmlPullParser.END_TAG, NS, SUMMARY_TAG);
-            while (parser.nextTag() == XmlPullParser.START_TAG) {
-                parser.require(XmlPullParser.START_TAG, NS, MODULE_TAG);
-                String name = parser.getAttributeValue(NS, NAME_ATTR);
-                String abi = parser.getAttributeValue(NS, ABI_ATTR);
-                String moduleId = AbiUtils.createId(abi, name);
-                boolean done = Boolean.parseBoolean(parser.getAttributeValue(NS, DONE_ATTR));
-                IModuleResult module = invocation.getOrCreateModule(moduleId);
-                module.initializeDone(done);
-                long runtime = Long.parseLong(parser.getAttributeValue(NS, RUNTIME_ATTR));
-                module.addRuntime(runtime);
-                while (parser.nextTag() == XmlPullParser.START_TAG) {
-                    parser.require(XmlPullParser.START_TAG, NS, CASE_TAG);
-                    String caseName = parser.getAttributeValue(NS, NAME_ATTR);
-                    ICaseResult testCase = module.getOrCreateResult(caseName);
-                    while (parser.nextTag() == XmlPullParser.START_TAG) {
-                        parser.require(XmlPullParser.START_TAG, NS, TEST_TAG);
-                        String testName = parser.getAttributeValue(NS, NAME_ATTR);
-                        ITestResult test = testCase.getOrCreateResult(testName);
-                        String result = parser.getAttributeValue(NS, RESULT_ATTR);
-                        String skipped = parser.getAttributeValue(NS, SKIPPED_ATTR);
-                        if (skipped != null && Boolean.parseBoolean(skipped)) {
-                            // mark test passed and skipped
-                            test.skipped();
-                        } else {
-                            // only apply result status directly if test was not skipped
-                            test.setResultStatus(TestStatus.getStatus(result));
-                        }
-                        test.setRetry(true);
-                        while (parser.nextTag() == XmlPullParser.START_TAG) {
-                            if (parser.getName().equals(FAILURE_TAG)) {
-                                test.setMessage(parser.getAttributeValue(NS, MESSAGE_ATTR));
-                                if (parser.nextTag() == XmlPullParser.START_TAG) {
-                                    parser.require(XmlPullParser.START_TAG, NS, STACK_TAG);
-                                    test.setStackTrace(parser.nextText());
-                                    parser.require(XmlPullParser.END_TAG, NS, STACK_TAG);
-                                    parser.nextTag();
-                                }
-                                parser.require(XmlPullParser.END_TAG, NS, FAILURE_TAG);
-                            } else if (parser.getName().equals(BUGREPORT_TAG)) {
-                                test.setBugReport(parser.nextText());
-                                parser.require(XmlPullParser.END_TAG, NS, BUGREPORT_TAG);
-                            } else if (parser.getName().equals(LOGCAT_TAG)) {
-                                test.setLog(parser.nextText());
-                                parser.require(XmlPullParser.END_TAG, NS, LOGCAT_TAG);
-                            } else if (parser.getName().equals(SCREENSHOT_TAG)) {
-                                test.setScreenshot(parser.nextText());
-                                parser.require(XmlPullParser.END_TAG, NS, SCREENSHOT_TAG);
-                            } else {
-                                test.setReportLog(ReportLog.parse(parser));
-                            }
-                        }
-                        parser.require(XmlPullParser.END_TAG, NS, TEST_TAG);
-                        Boolean checksumMismatch = invocationUseChecksum
-                            && !checksumReporter.containsTestResult(
-                                test, module, invocation.getBuildFingerprint());
-                        if (checksumMismatch) {
-                            test.removeResult();
-                        }
-                    }
-                    parser.require(XmlPullParser.END_TAG, NS, CASE_TAG);
-                }
-                parser.require(XmlPullParser.END_TAG, NS, MODULE_TAG);
-                Boolean checksumMismatch = invocationUseChecksum
-                    && !checksumReporter.containsModuleResult(
-                            module, invocation.getBuildFingerprint());
-                if (checksumMismatch) {
-                    module.initializeDone(false);
-                }
-            }
-            parser.require(XmlPullParser.END_TAG, NS, RESULT_TAG);
-            return invocation;
-        } catch (XmlPullParserException | IOException e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-
-    /**
-     * @param result
-     * @param resultDir
-     * @param startTime
-     * @param referenceUrl A nullable string that can contain a URL to a related data
-     * @param logUrl A nullable string that can contain a URL to related log files
-     * @param commandLineArgs A string containing the arguments to the run command
-     * @return The result file created.
-     * @throws IOException
-     * @throws XmlPullParserException
-     */
-    public static File writeResults(String suiteName, String suiteVersion, String suitePlan,
-            String suiteBuild, IInvocationResult result, File resultDir,
-            long startTime, long endTime, String referenceUrl, String logUrl,
-            String commandLineArgs)
-                    throws IOException, XmlPullParserException {
-        int passed = result.countResults(TestStatus.PASS);
-        int failed = result.countResults(TestStatus.FAIL);
-        File resultFile = new File(resultDir, TEST_RESULT_FILE_NAME);
-        OutputStream stream = new FileOutputStream(resultFile);
-        XmlSerializer serializer = XmlPullParserFactory.newInstance(TYPE, null).newSerializer();
-        serializer.setOutput(stream, ENCODING);
-        serializer.startDocument(ENCODING, false);
-        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
-        serializer.processingInstruction(
-                "xml-stylesheet type=\"text/xsl\" href=\"vts_result.xsl\"");
-        serializer.startTag(NS, RESULT_TAG);
-        serializer.attribute(NS, START_TIME_ATTR, String.valueOf(startTime));
-        serializer.attribute(NS, END_TIME_ATTR, String.valueOf(endTime));
-        serializer.attribute(NS, START_DISPLAY_TIME_ATTR, toReadableDateString(startTime));
-        serializer.attribute(NS, END_DISPLAY_TIME_ATTR, toReadableDateString(endTime));
-
-        serializer.attribute(NS, SUITE_NAME_ATTR, suiteName);
-        serializer.attribute(NS, SUITE_VERSION_ATTR, suiteVersion);
-        serializer.attribute(NS, SUITE_PLAN_ATTR, suitePlan);
-        serializer.attribute(NS, SUITE_BUILD_ATTR, suiteBuild);
-        serializer.attribute(NS, REPORT_VERSION_ATTR, RESULT_FILE_VERSION);
-        serializer.attribute(NS, COMMAND_LINE_ARGS, nullToEmpty(commandLineArgs));
-
-        if (referenceUrl != null) {
-            serializer.attribute(NS, REFERENCE_URL_ATTR, referenceUrl);
-        }
-
-        if (logUrl != null) {
-            serializer.attribute(NS, LOG_URL_ATTR, logUrl);
-        }
-
-        // Device Info
-        Set<String> devices = result.getDeviceSerials();
-        StringBuilder deviceList = new StringBuilder();
-        boolean first = true;
-        for (String device : devices) {
-            if (first) {
-                first = false;
-            } else {
-                deviceList.append(",");
-            }
-            deviceList.append(device);
-        }
-        serializer.attribute(NS, DEVICES_ATTR, deviceList.toString());
-
-        // Host Info
-        String hostName = "";
-        try {
-            hostName = InetAddress.getLocalHost().getHostName();
-        } catch (UnknownHostException ignored) {}
-        serializer.attribute(NS, HOST_NAME_ATTR, hostName);
-        serializer.attribute(NS, OS_NAME_ATTR, System.getProperty("os.name"));
-        serializer.attribute(NS, OS_VERSION_ATTR, System.getProperty("os.version"));
-        serializer.attribute(NS, OS_ARCH_ATTR, System.getProperty("os.arch"));
-        serializer.attribute(NS, JAVA_VENDOR_ATTR, System.getProperty("java.vendor"));
-        serializer.attribute(NS, JAVA_VERSION_ATTR, System.getProperty("java.version"));
-
-        // Build Info
-        serializer.startTag(NS, BUILD_TAG);
-        for (Entry<String, String> entry : result.getInvocationInfo().entrySet()) {
-            serializer.attribute(NS, entry.getKey(), entry.getValue());
-            if (Strings.isNullOrEmpty(result.getBuildFingerprint()) &&
-                entry.getKey().equals(BUILD_FINGERPRINT)) {
-                result.setBuildFingerprint(entry.getValue());
-            }
-        }
-        serializer.endTag(NS, BUILD_TAG);
-
-        // Summary
-        serializer.startTag(NS, SUMMARY_TAG);
-        serializer.attribute(NS, PASS_ATTR, Integer.toString(passed));
-        serializer.attribute(NS, FAILED_ATTR, Integer.toString(failed));
-        serializer.attribute(NS, MODULES_DONE_ATTR,
-                Integer.toString(result.getModuleCompleteCount()));
-        serializer.attribute(NS, MODULES_TOTAL_ATTR,
-                Integer.toString(result.getModules().size()));
-        serializer.endTag(NS, SUMMARY_TAG);
-
-        // Results
-        for (IModuleResult module : result.getModules()) {
-            serializer.startTag(NS, MODULE_TAG);
-            serializer.attribute(NS, NAME_ATTR, module.getName());
-            serializer.attribute(NS, ABI_ATTR, module.getAbi());
-            serializer.attribute(NS, RUNTIME_ATTR, String.valueOf(module.getRuntime()));
-            serializer.attribute(NS, DONE_ATTR, Boolean.toString(module.isDone()));
-            serializer.attribute(NS, PASS_ATTR,
-                    Integer.toString(module.countResults(TestStatus.PASS)));
-            for (ICaseResult cr : module.getResults()) {
-                serializer.startTag(NS, CASE_TAG);
-                serializer.attribute(NS, NAME_ATTR, cr.getName());
-                for (ITestResult r : cr.getResults()) {
-                    TestStatus status = r.getResultStatus();
-                    if (status == null) {
-                        continue; // test was not executed, don't report
-                    }
-                    serializer.startTag(NS, TEST_TAG);
-                    serializer.attribute(NS, RESULT_ATTR, status.getValue());
-                    serializer.attribute(NS, NAME_ATTR, r.getName());
-                    if (r.isSkipped()) {
-                        serializer.attribute(NS, SKIPPED_ATTR, Boolean.toString(true));
-                    }
-                    String message = r.getMessage();
-                    if (message != null) {
-                        serializer.startTag(NS, FAILURE_TAG);
-                        serializer.attribute(NS, MESSAGE_ATTR, message);
-                        String stackTrace = r.getStackTrace();
-                        if (stackTrace != null) {
-                            serializer.startTag(NS, STACK_TAG);
-                            serializer.text(stackTrace);
-                            serializer.endTag(NS, STACK_TAG);
-                        }
-                        serializer.endTag(NS, FAILURE_TAG);
-                    }
-                    String bugreport = r.getBugReport();
-                    if (bugreport != null) {
-                        serializer.startTag(NS, BUGREPORT_TAG);
-                        serializer.text(bugreport);
-                        serializer.endTag(NS, BUGREPORT_TAG);
-                    }
-                    String logcat = r.getLog();
-                    if (logcat != null) {
-                        serializer.startTag(NS, LOGCAT_TAG);
-                        serializer.text(logcat);
-                        serializer.endTag(NS, LOGCAT_TAG);
-                    }
-                    String screenshot = r.getScreenshot();
-                    if (screenshot != null) {
-                        serializer.startTag(NS, SCREENSHOT_TAG);
-                        serializer.text(screenshot);
-                        serializer.endTag(NS, SCREENSHOT_TAG);
-                    }
-                    ReportLog report = r.getReportLog();
-                    if (report != null) {
-                        ReportLog.serialize(serializer, report);
-                    }
-                    serializer.endTag(NS, TEST_TAG);
-                }
-                serializer.endTag(NS, CASE_TAG);
-            }
-            serializer.endTag(NS, MODULE_TAG);
-        }
-        serializer.endDocument();
-        createChecksum(resultDir, result);
-        return resultFile;
-    }
-
-    /**
-     * Generate html report listing an failed tests
-     */
-    public static File createFailureReport(File inputXml) {
-        File failureReport = new File(inputXml.getParentFile(), FAILURE_REPORT_NAME);
-        try (InputStream xslStream = ResultHandler.class.getResourceAsStream(
-                String.format("/report/%s", FAILURE_XSL_FILE_NAME));
-             OutputStream outputStream = new FileOutputStream(failureReport)) {
-
-            Transformer transformer = TransformerFactory.newInstance().newTransformer(
-                    new StreamSource(xslStream));
-            transformer.transform(new StreamSource(inputXml), new StreamResult(outputStream));
-        } catch (IOException | TransformerException ignored) { }
-        return failureReport;
-    }
-
-    private static void createChecksum(File resultDir, IInvocationResult invocationResult) {
-        RetryChecksumStatus retryStatus = invocationResult.getRetryChecksumStatus();
-        switch (retryStatus) {
-            case NotRetry: case RetryWithChecksum:
-                // Do not disrupt the process if there is a problem generating checksum.
-                ChecksumReporter.tryCreateChecksum(resultDir, invocationResult);
-                break;
-            case RetryWithoutChecksum:
-                // If the previous run has an invalid checksum file,
-                // copy it into current results folder for future troubleshooting
-                File retryDirectory = invocationResult.getRetryDirectory();
-                Path retryChecksum = FileSystems.getDefault().getPath(
-                        retryDirectory.getAbsolutePath(), ChecksumReporter.NAME);
-                if (!retryChecksum.toFile().exists()) {
-                    // if no checksum file, check for a copy from a previous retry
-                    retryChecksum = FileSystems.getDefault().getPath(
-                            retryDirectory.getAbsolutePath(), ChecksumReporter.PREV_NAME);
-                }
-
-                if (retryChecksum.toFile().exists()) {
-                    File checksumCopy = new File(resultDir, ChecksumReporter.PREV_NAME);
-                    try (FileOutputStream stream = new FileOutputStream(checksumCopy)) {
-                        Files.copy(retryChecksum, stream);
-                    } catch (IOException e) {
-                        // Do not disrupt the process if there is a problem copying checksum
-                    }
-                }
-        }
-    }
-
-
-    /**
-     * Find the IInvocationResult for the given sessionId.
-     */
-    public static IInvocationResult findResult(File resultsDir, Integer sessionId)
-            throws FileNotFoundException {
-        return findResult(resultsDir, sessionId, true);
-    }
-
-    /**
-     * Find the IInvocationResult for the given sessionId.
-     */
-    private static IInvocationResult findResult(
-            File resultsDir, Integer sessionId, Boolean useChecksum) throws FileNotFoundException {
-        if (sessionId < 0) {
-            throw new IllegalArgumentException(
-                String.format("Invalid session id [%d] ", sessionId));
-        }
-        File resultDir = getResultDirectory(resultsDir, sessionId);
-        IInvocationResult result = getResultFromDir(resultDir, useChecksum);
-        if (result == null) {
-            throw new RuntimeException(String.format("Could not find session [%d]", sessionId));
-        }
-        return result;
-    }
-
-    /**
-     * Get the result directory for the given sessionId.
-     */
-    public static File getResultDirectory(File resultsDir, Integer sessionId) {
-        if (sessionId < 0) {
-            throw new IllegalArgumentException(
-                String.format("Invalid session id [%d] ", sessionId));
-        }
-        List<File> allResultDirs = getResultDirectories(resultsDir);
-        if (sessionId >= allResultDirs.size()) {
-            throw new IllegalArgumentException(String.format("Invalid session id [%d], results" +
-                    "directory contains only %d results", sessionId, allResultDirs.size()));
-        }
-        return allResultDirs.get(sessionId);
-    }
-
-    /**
-     * Get a list of child directories that contain test invocation results
-     * @param resultsDir the root test result directory
-     * @return
-     */
-    public static List<File> getResultDirectories(File resultsDir) {
-        List<File> directoryList = new ArrayList<>();
-        File[] files = resultsDir.listFiles();
-        if (files == null || files.length == 0) {
-            // No results, just return the empty list
-            return directoryList;
-        }
-        for (File resultDir : files) {
-            if (!resultDir.isDirectory()) {
-                continue;
-            }
-            // Only include if it contain results file
-            File resultFile = new File(resultDir, TEST_RESULT_FILE_NAME);
-            if (!resultFile.exists()) {
-                continue;
-            }
-            directoryList.add(resultDir);
-        }
-        Collections.sort(directoryList, (d1, d2) -> d1.getName().compareTo(d2.getName()));
-        return directoryList;
-    }
-
-    /**
-     * Return the given time as a {@link String} suitable for displaying.
-     * <p/>
-     * Example: Fri Aug 20 15:13:03 PDT 2010
-     *
-     * @param time the epoch time in ms since midnight Jan 1, 1970
-     */
-    static String toReadableDateString(long time) {
-        SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
-        return dateFormat.format(new Date(time));
-    }
-
-    /**
-     * When nullable is null, return an empty string. Otherwise, return the value in nullable.
-     */
-    private static String nullToEmpty(String nullable) {
-        return nullable == null ? "" : nullable;
-    }
-}
\ No newline at end of file
diff --git a/harnesses/tradefed/src/com/android/tradefed/targetprep/VtsPythonVirtualenvPreparer.java b/harnesses/tradefed/src/com/android/tradefed/targetprep/VtsPythonVirtualenvPreparer.java
index b0789ab..c339f73 100644
--- a/harnesses/tradefed/src/com/android/tradefed/targetprep/VtsPythonVirtualenvPreparer.java
+++ b/harnesses/tradefed/src/com/android/tradefed/targetprep/VtsPythonVirtualenvPreparer.java
@@ -41,6 +41,8 @@
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.NoSuchElementException;
@@ -270,20 +272,41 @@
         try {
             mVenvDir = buildInfo.getFile(VIRTUAL_ENV_PATH);
             if (mVenvDir == null) {
-                mVenvDir = FileUtil.createTempDir(buildInfo.getTestTag() + "-virtualenv");
+                mVenvDir = FileUtil.createTempDir(getMD5(buildInfo.getTestTag()) + "-virtualenv");
             }
             String virtualEnvPath = mVenvDir.getAbsolutePath();
-            mRunUtil.runTimedCmd(BASE_TIMEOUT, "virtualenv", virtualEnvPath);
+            CommandResult c = mRunUtil.runTimedCmd(BASE_TIMEOUT, "virtualenv", virtualEnvPath);
+            if (c.getStatus() != CommandStatus.SUCCESS) {
+                CLog.e(String.format("Failed to create virtualenv with : %s.", virtualEnvPath));
+                throw new TargetSetupError("Failed to create virtualenv");
+            }
             CLog.i(VIRTUAL_ENV_PATH + " = " + virtualEnvPath + "\n");
             buildInfo.setFile(VIRTUAL_ENV_PATH, new File(virtualEnvPath),
                               buildInfo.getBuildId());
             activate();
-        } catch (IOException e) {
+        } catch (IOException | RuntimeException e) {
             CLog.e("Failed to create temp directory for virtualenv");
             throw new TargetSetupError("Error creating virtualenv", e);
         }
     }
 
+    /**
+     * This method returns a MD5 hash string for the given string.
+     */
+    private String getMD5(String str) throws RuntimeException {
+        try {
+            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
+            byte[] array = md.digest(str.getBytes());
+            StringBuffer sb = new StringBuffer();
+            for (int i = 0; i < array.length; ++i) {
+                sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
+            }
+            return sb.toString();
+        } catch (java.security.NoSuchAlgorithmException e) {
+            throw new RuntimeException("Error generating MD5 hash.", e);
+        }
+    }
+
     protected void addDepModule(String module) {
         mDepModules.add(module);
     }
diff --git a/harnesses/tradefed/src/com/android/tradefed/targetprep/VtsTestPlanResultReporter.java b/harnesses/tradefed/src/com/android/tradefed/targetprep/VtsTestPlanResultReporter.java
index 1cac2e9..ece5c13 100644
--- a/harnesses/tradefed/src/com/android/tradefed/targetprep/VtsTestPlanResultReporter.java
+++ b/harnesses/tradefed/src/com/android/tradefed/targetprep/VtsTestPlanResultReporter.java
@@ -38,17 +38,12 @@
 import com.android.tradefed.util.FileUtil;
 import com.android.tradefed.util.IRunUtil;
 import com.android.tradefed.util.RunUtil;
+import com.android.tradefed.util.VtsDashboardUtil;
 import com.android.tradefed.util.VtsVendorConfigFileUtil;
 
 import com.android.vts.proto.VtsReportMessage.DashboardPostMessage;
 import com.android.vts.proto.VtsReportMessage.TestPlanReportMessage;
 
-import com.google.api.client.auth.oauth2.Credential;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
-import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.client.json.JsonFactory;
-
 /**
  * Uploads the VTS test plan execution result to the web DB using a RESTful API and
  * an OAuth2 credential kept in a json file.
@@ -59,6 +54,7 @@
     private static final String TEST_PLAN_EXECUTION_RESULT = "vts-test-plan-execution-result";
     private static final String TEST_PLAN_REPORT_FILE = "TEST_PLAN_REPORT_FILE";
     private static VtsVendorConfigFileUtil configReader = null;
+    private static VtsDashboardUtil dashboardUtil = null;
     private static final int BASE_TIMEOUT_MSECS = 1000 * 60;
     IRunUtil mRunUtil = new RunUtil();
 
@@ -96,6 +92,7 @@
                 VtsVendorConfigFileUtil.KEY_VENDOR_TEST_CONFIG_FILE_PATH, mVendorConfigFilePath);
         configReader = new VtsVendorConfigFileUtil();
         configReader.LoadVendorConfig(buildInfo);
+        dashboardUtil = new VtsDashboardUtil(configReader);
     }
 
     /**
@@ -125,84 +122,13 @@
             CLog.d(String.format("Can't read the test plan result file %s", repotFilePath));
             return;
         }
+        File reportDir = reportFile.getParentFile();
+        CLog.d(String.format("Delete report dir %s", reportDir.getAbsolutePath()));
+        FileUtil.recursiveDelete(reportDir);
         postMessage.addTestPlanReport(testPlanMessage);
         if (found) {
-            Upload(postMessage);
+            dashboardUtil.Upload(postMessage);
         }
     }
 
-    /*
-     * Returns an OAuth2 token string obtained using a service account json keyfile.
-     *
-     * Uses the service account keyfile located at config variable 'service_key_json_path'
-     * to request an OAuth2 token.
-     */
-    private String GetToken() {
-        String keyFilePath;
-        try {
-            keyFilePath = configReader.GetVendorConfigVariable("service_key_json_path");
-        } catch (NoSuchElementException e) {
-            return null;
-        }
-
-        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
-        Credential credential = null;
-        try {
-            List<String> listStrings = new LinkedList<String>();
-            listStrings.add(PLUS_ME);
-            credential = GoogleCredential.fromStream(new FileInputStream(keyFilePath))
-                                 .createScoped(listStrings);
-            credential.refreshToken();
-            return credential.getAccessToken();
-        } catch (FileNotFoundException e) {
-            CLog.e(String.format("Service key file %s doesn't exist.", keyFilePath));
-        } catch (IOException e) {
-            CLog.e(String.format("Can't read the service key file, %s", keyFilePath));
-        }
-        return null;
-    }
-
-    /*
-     * Uploads the given message to the web DB.
-     *
-     * @param message, DashboardPostMessage that keeps the result to upload.
-     */
-    private void Upload(DashboardPostMessage message) {
-        message.setAccessToken(GetToken());
-        try {
-            String commandTemplate = configReader.GetVendorConfigVariable("dashboard_post_command");
-            String filePath = WriteToTempFile(
-                    Base64.getEncoder().encodeToString(message.toByteArray()).getBytes());
-            commandTemplate = commandTemplate.replace("{path}", filePath);
-            commandTemplate = commandTemplate.replace("'", "");
-            CLog.i(String.format("Upload command: %s", commandTemplate));
-            CommandResult c =
-                    mRunUtil.runTimedCmd(BASE_TIMEOUT_MSECS * 3, commandTemplate.split(" "));
-            if (c == null || c.getStatus() != CommandStatus.SUCCESS) {
-                CLog.e("Uploading the test plan execution result to GAE DB faiied.");
-                CLog.e("Stdout: %s", c.getStdout());
-                CLog.e("Stderr: %s", c.getStderr());
-            }
-            FileUtil.deleteFile(new File(filePath));
-        } catch (NoSuchElementException e) {
-            CLog.e("dashboard_post_command unspecified in vendor config.");
-        } catch (IOException e) {
-            CLog.e("Couldn't write a proto message to a temp file.");
-        }
-    }
-
-    /*
-     * Simple wrapper to write data to a temp file.
-     *
-     * @param data, actual data to write to a file.
-     * @throws IOException
-     */
-    private String WriteToTempFile(byte[] data) throws IOException {
-        File tempFile = File.createTempFile("tempfile", ".tmp");
-        String filePath = tempFile.getAbsolutePath();
-        FileOutputStream out = new FileOutputStream(filePath);
-        out.write(data);
-        out.close();
-        return filePath;
-    }
 }
diff --git a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTest.java b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTest.java
index 7b2f041..0f220df 100644
--- a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTest.java
+++ b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTest.java
@@ -34,6 +34,7 @@
 import com.android.tradefed.util.JsonUtil;
 import com.android.tradefed.util.IRunUtil;
 import com.android.tradefed.util.RunUtil;
+import com.android.tradefed.util.VtsDashboardUtil;
 import com.android.tradefed.util.VtsVendorConfigFileUtil;
 import com.android.tradefed.testtype.IAbi;
 
@@ -93,6 +94,7 @@
     static final String CONFIG_FILE_EXTENSION = ".config";
     static final String INCLUDE_FILTER = "include_filter";
     static final String EXCLUDE_FILTER = "exclude_filter";
+    static final String EXCLUDE_OVER_INCLUDE = "exclude_over_include";
     static final String BINARY_TEST_SOURCE = "binary_test_source";
     static final String BINARY_TEST_WORKING_DIRECTORY = "binary_test_working_directory";
     static final String BINARY_TEST_ENVP = "binary_test_envp";
@@ -106,12 +108,14 @@
     static final String BINARY_TEST_TYPE_HAL_HIDL_GTEST = "hal_hidl_gtest";
     static final String BINARY_TEST_TYPE_HAL_HIDL_REPLAY_TEST = "hal_hidl_replay_test";
     static final String BINARY_TEST_TYPE_HOST_BINARY_TEST = "host_binary_test";
+    static final String BUG_REPORT_ON_FAILURE = "bug_report_on_failure";
     static final String ENABLE_COVERAGE = "enable_coverage";
     static final String ENABLE_PROFILING = "enable_profiling";
-    static final String GTEST_BATCH_MODE = "gtest_match_mode";
+    static final String GTEST_BATCH_MODE = "gtest_batch_mode";
     static final String SAVE_TRACE_FIEL_REMOTE = "save_trace_file_remote";
     static final String OUTPUT_COVERAGE_REPORT = "output_coverage_report";
     static final String GLOBAL_COVERAGE = "global_coverage";
+    static final String LTP_NUMBER_OF_THREADS = "ltp_number_of_threads";
     static final String NATIVE_SERVER_PROCESS_NAME = "native_server_process_name";
     static final String PASSTHROUGH_MODE = "passthrough_mode";
     static final String PRECONDITION_HWBINDER_SERVICE = "precondition_hwbinder_service";
@@ -122,6 +126,7 @@
     static final String ENABLE_SYSTRACE = "enable_systrace";
     static final String HAL_HIDL_REPLAY_TEST_TRACE_PATHS = "hal_hidl_replay_test_trace_paths";
     static final String HAL_HIDL_PACKAGE_NAME = "hal_hidl_package_name";
+    static final String REPORT_MESSAGE_FILE_NAME = "report_proto.msg";
     static final String SYSTRACE_PROCESS_NAME = "systrace_process_name";
     static final String TEMPLATE_BINARY_TEST_PATH = "vts/testcases/template/binary_test/binary_test";
     static final String TEMPLATE_GTEST_BINARY_TEST_PATH = "vts/testcases/template/gtest_binary_test/gtest_binary_test";
@@ -179,6 +184,12 @@
                     + "this can override precondition-lshal option.")
     private String mPreconditionVintf = null;
 
+    @Option(name = "precondition-vintf-override",
+            description = "If precondition-lshal is present and precondition-vintf is not, "
+                    + "set precondition-vintf to the value of precondition-lshal. "
+                    + "The test runner will find the HAL in manifest.xml instead of lshal.")
+    private boolean mPreconditionVintfOverride = false;
+
     @Option(name = "use-stdout-logs",
             description = "Flag that determines whether to use std:out to parse output.")
     private boolean mUseStdoutLogs = false;
@@ -191,6 +202,10 @@
             description = "The negative filter of the test names to run.")
     private Set<String> mExcludeFilters = new TreeSet<>();
 
+    @Option(name = "exclude-over-include",
+            description = "The negative filter of the test names to run.")
+    private boolean mExcludeOverInclude = false;
+
     @Option(name = "runtime-hint", description = "The hint about the test's runtime.",
             isTimeVal = true)
     private long mRuntimeHint = 60000;  // 1 minute
@@ -227,6 +242,11 @@
         + "available. Default is false")
     private boolean mPassthroughMode = false;
 
+    @Option(name = "ltp-number-of-threads",
+            description = "Number of threads to run the LTP test cases. "
+                    + "0 means using number of avaiable CPU threads.")
+    private int mLtpNumberOfThreads = -1;
+
     @Option(name = "skip-on-32bit-abi",
         description = "Whether to skip tests on 32bit ABI.")
     private boolean mSkipOn32BitAbi = false;
@@ -318,6 +338,12 @@
             description = "Set to stop all properly configured native servers during the testing.")
     private boolean mBinaryTestStopNativeServers = false;
 
+    @Option(name = "bug-report-on-failure",
+            description = "To catch bugreport zip file at the end of failed test cases. "
+                    + "If set to true, a report will be caught through adh shell command at the end of each failed "
+                    + "test cases.")
+    private boolean mBugReportOnFailure = false;
+
     @Option(name = "native-server-process-name",
             description = "Name of a native server process. The runner checks to make sure "
                     + "each specified native server process is not running after the framework stop.")
@@ -360,6 +386,8 @@
     // the path of a dir which contains the test data files.
     private String mTestCaseDataDir = "./";
 
+    private VtsVendorConfigFileUtil configReader = null;
+
     /**
      * @return the mRunUtil
      */
@@ -556,7 +584,7 @@
      */
     private void updateVtsRunnerTestConfig(JSONObject jsonObject)
             throws IOException, JSONException, RuntimeException {
-        VtsVendorConfigFileUtil configReader = new VtsVendorConfigFileUtil();
+        configReader = new VtsVendorConfigFileUtil();
         if (configReader.LoadVendorConfig(mBuildInfo)) {
             JSONObject vendorConfigJson = configReader.GetVendorConfigJson();
             if (vendorConfigJson != null) {
@@ -599,7 +627,7 @@
 
         JSONArray testBedArray = (JSONArray) jsonObject.get("test_bed");
         if (testBedArray.length() == 0) {
-            JSONObject device = new JSONObject();
+            JSONObject testBedItemObject = new JSONObject();
             String testName;
             if (mTestModuleName != null) {
                 testName = mTestModuleName;
@@ -616,12 +644,12 @@
                 }
             }
             CLog.logAndDisplay(LogLevel.INFO, "Setting test name as %s", testName);
-            device.put(NAME, testName);
-            device.put(ANDROIDDEVICE, deviceArray);
-            testBedArray.put(device);
+            testBedItemObject.put(NAME, testName);
+            testBedItemObject.put(ANDROIDDEVICE, deviceArray);
+            testBedArray.put(testBedItemObject);
         } else if (testBedArray.length() == 1) {
-            JSONObject device = (JSONObject) testBedArray.get(0);
-            device.put(ANDROIDDEVICE, deviceArray);
+            JSONObject testBedItemObject = (JSONObject) testBedArray.get(0);
+            testBedItemObject.put(ANDROIDDEVICE, deviceArray);
         } else {
             CLog.e("Multi-device not yet supported: %d devices requested",
                     testBedArray.length());
@@ -642,6 +670,12 @@
         CLog.i("Added include filter to test suite: %s", mIncludeFilters);
         suite.put(EXCLUDE_FILTER, new JSONArray(mExcludeFilters));
         CLog.i("Added exclude filter to test suite: %s", mExcludeFilters);
+
+        if (mExcludeOverInclude) {
+            jsonObject.put(EXCLUDE_OVER_INCLUDE, mExcludeOverInclude);
+            CLog.i("Added %s to the Json object", EXCLUDE_OVER_INCLUDE);
+        }
+
         jsonObject.put(TEST_SUITE, suite);
         CLog.i("Added %s to the Json object", TEST_SUITE);
 
@@ -654,10 +688,12 @@
             jsonObject.put(ABI_BITNESS, mAbi.getBitness());
             CLog.i("Added %s to the Json object", ABI_BITNESS);
         }
+
         if (mSkipOn32BitAbi) {
             jsonObject.put(SKIP_ON_32BIT_ABI, mSkipOn32BitAbi);
             CLog.i("Added %s to the Json object", SKIP_ON_32BIT_ABI);
         }
+
         if (mSkipOn64BitAbi) {
             jsonObject.put(SKIP_ON_64BIT_ABI, mSkipOn64BitAbi);
             CLog.i("Added %s to the Json object", SKIP_ON_64BIT_ABI);
@@ -665,6 +701,7 @@
             jsonObject.put(RUN_32BIT_ON_64BIT_ABI, mRun32bBitOn64BitAbi);
             CLog.i("Added %s to the Json object", RUN_32BIT_ON_64BIT_ABI);
         }
+
         if (mSkipIfThermalThrottling) {
             jsonObject.put(SKIP_IF_THERMAL_THROTTLING, mSkipIfThermalThrottling);
             CLog.i("Added %s to the Json object", SKIP_IF_THERMAL_THROTTLING);
@@ -674,36 +711,49 @@
             jsonObject.put(BINARY_TEST_SOURCE, new JSONArray(mBinaryTestSource));
             CLog.i("Added %s to the Json object", BINARY_TEST_SOURCE);
         }
+
         if (!mBinaryTestWorkingDirectory.isEmpty()) {
             jsonObject.put(BINARY_TEST_WORKING_DIRECTORY,
                     new JSONArray(mBinaryTestWorkingDirectory));
             CLog.i("Added %s to the Json object", BINARY_TEST_WORKING_DIRECTORY);
         }
+
         if (!mBinaryTestEnvp.isEmpty()) {
             jsonObject.put(BINARY_TEST_ENVP, new JSONArray(mBinaryTestEnvp));
             CLog.i("Added %s to the Json object", BINARY_TEST_ENVP);
         }
+
         if (!mBinaryTestArgs.isEmpty()) {
             jsonObject.put(BINARY_TEST_ARGS, new JSONArray(mBinaryTestArgs));
             CLog.i("Added %s to the Json object", BINARY_TEST_ARGS);
         }
+
         if (!mBinaryTestLdLibraryPath.isEmpty()) {
             jsonObject.put(BINARY_TEST_LD_LIBRARY_PATH,
                     new JSONArray(mBinaryTestLdLibraryPath));
             CLog.i("Added %s to the Json object", BINARY_TEST_LD_LIBRARY_PATH);
         }
+
+        if (mBugReportOnFailure) {
+            jsonObject.put(BUG_REPORT_ON_FAILURE, mBugReportOnFailure);
+            CLog.i("Added %s to the Json object", BUG_REPORT_ON_FAILURE);
+        }
+
         if (mEnableProfiling) {
             jsonObject.put(ENABLE_PROFILING, mEnableProfiling);
             CLog.i("Added %s to the Json object", ENABLE_PROFILING);
         }
+
         if (mSaveTraceFileRemote) {
             jsonObject.put(SAVE_TRACE_FIEL_REMOTE, mSaveTraceFileRemote);
             CLog.i("Added %s to the Json object", SAVE_TRACE_FIEL_REMOTE);
         }
+
         if (mEnableSystrace) {
             jsonObject.put(ENABLE_SYSTRACE, mEnableSystrace);
             CLog.i("Added %s to the Json object", ENABLE_SYSTRACE);
         }
+
         if (mEnableCoverage) {
             jsonObject.put(GLOBAL_COVERAGE, mGlobalCoverage);
             if (coverageBuild) {
@@ -713,6 +763,7 @@
                 CLog.i("Device build has coverage disabled");
             }
         }
+
         if (mOutputCoverageReport) {
             jsonObject.put(OUTPUT_COVERAGE_REPORT, mOutputCoverageReport);
             CLog.i("Added %s to the Json object", OUTPUT_COVERAGE_REPORT);
@@ -743,6 +794,16 @@
             CLog.i("Added %s to the Json object", PRECONDITION_VINTF);
         }
 
+        if (mPreconditionVintfOverride && mPreconditionLshal != null) {
+            if (mPreconditionVintf == null) {
+                jsonObject.put(PRECONDITION_VINTF, mPreconditionLshal);
+                CLog.i("Added %s to the Json object, overriding %s", PRECONDITION_VINTF,
+                        PRECONDITION_LSHAL);
+            } else {
+                CLog.w("Ignored precondition-vintf-override as precondition-vintf is present");
+            }
+        }
+
         if (!mBinaryTestProfilingLibraryPath.isEmpty()) {
             jsonObject.put(BINARY_TEST_PROFILING_LIBRARY_PATH,
                     new JSONArray(mBinaryTestProfilingLibraryPath));
@@ -789,6 +850,11 @@
             jsonObject.put(GTEST_BATCH_MODE, mGtestBatchMode);
             CLog.i("Added %s to the Json object", GTEST_BATCH_MODE);
         }
+
+        if (mLtpNumberOfThreads >= 0) {
+            jsonObject.put(LTP_NUMBER_OF_THREADS, mLtpNumberOfThreads);
+            CLog.i("Added %s to the Json object", LTP_NUMBER_OF_THREADS);
+        }
     }
 
     /**
@@ -944,6 +1010,32 @@
             }
         }
         printVtsLogs(vtsRunnerLogDir);
+
+        File reportMsg;
+        int waitCount = 0;
+        // Wait python process to finish for 3 minutes at most
+        while ((reportMsg = FileUtil.findFile(vtsRunnerLogDir, REPORT_MESSAGE_FILE_NAME)) == null
+                && waitCount < 180) {
+            try {
+                Thread.sleep(1000);
+            } catch (Exception e) {
+                System.out.println(e);
+            }
+            waitCount++;
+        }
+
+        CLog.i("Report message path: %s", reportMsg);
+
+        if (reportMsg == null) {
+            CLog.e("Cannot find report message proto file.");
+        } else if (reportMsg.length() > 0) {
+            CLog.i("Uploading report message. File size: %s", reportMsg.length());
+            VtsDashboardUtil dashboardUtil = new VtsDashboardUtil(configReader);
+            dashboardUtil.Upload(reportMsg.getAbsolutePath());
+        } else {
+            CLog.i("Result uploading is not enabled.");
+        }
+
         FileUtil.recursiveDelete(vtsRunnerLogDir);
         CLog.i("Deleted the runner log dir, %s.", vtsRunnerLogDir);
         if (jsonFilePath != null) {
diff --git a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
index f13af0d..3a2bb3a 100644
--- a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
+++ b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
@@ -15,6 +15,7 @@
  */
 package com.android.tradefed.testtype;
 
+import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.testrunner.ITestRunListener;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.log.LogUtil.CLog;
@@ -30,6 +31,7 @@
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -72,6 +74,7 @@
     static final String FAIL = "FAIL";
     static final String TIMEOUT = "TIMEOUT";
     static final String SKIP = "SKIP";
+    static final String ERROR = "ERROR";
     static final String END_PATTERN = "<==========";
     static final String BEGIN_PATTERN = "==========>";
 
@@ -79,6 +82,7 @@
     static final String RESULTS = "Results";
     static final String BEGIN_TIME = "Begin Time";
     static final String DETAILS = "Details";
+    static final String TABLES = "Tables";
     static final String END_TIME = "End Time";
     static final String TEST_CLASS = "Test Class";
     static final String TEST_NAME = "Test Name";
@@ -86,6 +90,8 @@
 
     // default message for test failure
     static final String UNKNOWN_ERROR = "Unknown error.";
+    static final String UNKNOWN_FAILURE = "Unknown failure.";
+    static final String UNKNOWN_TIMEOUT = "Unknown timeout.";
 
     // Enumeration for parser state.
     static enum ParserState {
@@ -327,6 +333,41 @@
         return true;
     }
 
+    private static void printJsonTable(String name, JSONArray table) throws JSONException {
+        ArrayList<Integer> columnLength = new ArrayList<Integer>();
+        for (int rowIndex = 0; rowIndex < table.length(); rowIndex++) {
+            JSONArray row = table.getJSONArray(rowIndex);
+            for (int colIndex = 0; colIndex < row.length(); colIndex++) {
+                if (columnLength.size() == colIndex) {
+                    columnLength.add(1);
+                }
+                if (!row.isNull(colIndex)) {
+                    int len = row.getString(colIndex).length();
+                    if (columnLength.get(colIndex) < len) {
+                        columnLength.set(colIndex, len);
+                    }
+                }
+            }
+        }
+        StringBuilder sb = new StringBuilder(name + "\n");
+        for (int rowIndex = 0; rowIndex < table.length(); rowIndex++) {
+            JSONArray row = table.getJSONArray(rowIndex);
+            for (int colIndex = 0; colIndex < row.length(); colIndex++) {
+                String cell = row.isNull(colIndex) ? "" : row.getString(colIndex);
+                if (colIndex > 0) {
+                    sb.append("  ");
+                }
+                int padLength = columnLength.get(colIndex) - cell.length();
+                for (int padCount = 0; padCount < padLength; padCount++) {
+                    sb.append(" ");
+                }
+                sb.append(cell);
+            }
+            sb.append("\n");
+        }
+        CLog.logAndDisplay(LogLevel.INFO, sb.toString());
+    }
+
     /**
      * This method parses the json object and summarizes the test result through listener.
      * @param object
@@ -352,7 +393,7 @@
                         results.length());
 
                 for (int index = 0; index < results.length(); index++) {
-                    JSONObject  resultObject = results.getJSONObject(index);
+                    JSONObject resultObject = results.getJSONObject(index);
                     String result = (String) resultObject.get(RESULT);
                     String testClass = (String) resultObject.get(TEST_CLASS);
                     String testName = (String) resultObject.get(TEST_NAME);
@@ -364,26 +405,46 @@
                     listener.testStarted(testIdentifier);
 
                     switch (result) {
+                        case ERROR:
+                            /* Error is reported by the VTS runner when an unexpected exception
+                               happened during test execution. It could be due to: a framework bug,
+                               an unhandled I/O, a TCP error, or a bug in test module or template
+                               execution code. Error thus does not necessarily indicate a test
+                               failure or a bug in device implementation. Since error is not yet
+                               recognized in TF, it is converted to FAIL. */
+                            listener.testFailed(
+                                    testIdentifier, details.isEmpty() ? UNKNOWN_ERROR : details);
                         case PASS :
                             listener.testEnded(testIdentifier, Collections.<String, String>emptyMap());
                             break;
                         case TIMEOUT :
-                            /* Timeout is not recognized in TF*/
+                            /* Timeout is not recognized in TF. Use FAIL instead. */
+                            listener.testFailed(
+                                    testIdentifier, details.isEmpty() ? UNKNOWN_TIMEOUT : details);
                             break;
                         case SKIP :
-                            /* Skip is not recognized in TF*/
+                            /* Skip is not recognized in TF */
                             break;
                         case FAIL:
+                            /* Indicates a test failure. */
                             listener.testFailed(
-                                    testIdentifier, details.isEmpty() ? UNKNOWN_ERROR : details);
+                                    testIdentifier, details.isEmpty() ? UNKNOWN_FAILURE : details);
                         default:
                             break;
                     }
+                    if (!resultObject.isNull(TABLES)) {
+                        JSONObject tables = resultObject.getJSONObject(TABLES);
+                        Iterator<String> iter = tables.keys();
+                        while (iter.hasNext()) {
+                            String key = iter.next();
+                            printJsonTable(key, tables.getJSONArray(key));
+                        }
+                    }
                 }
                 listener.testRunEnded(endTime - beginTime, Collections.<String, String>emptyMap());
             }
         } catch (JSONException e) {
-            CLog.e("Exception occurred %s :", e);
+            CLog.e("Exception occurred: %s", e);
         }
     }
 
diff --git a/harnesses/tradefed/src/com/android/tradefed/util/VtsDashboardUtil.java b/harnesses/tradefed/src/com/android/tradefed/util/VtsDashboardUtil.java
new file mode 100644
index 0000000..c6b3c79
--- /dev/null
+++ b/harnesses/tradefed/src/com/android/tradefed/util/VtsDashboardUtil.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tradefed.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Base64;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.NoSuchElementException;
+
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.config.Option;
+import com.android.tradefed.config.OptionClass;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.util.CommandResult;
+import com.android.tradefed.util.CommandStatus;
+import com.android.tradefed.util.FileUtil;
+import com.android.tradefed.util.IRunUtil;
+import com.android.tradefed.util.RunUtil;
+import com.android.tradefed.util.VtsVendorConfigFileUtil;
+
+import com.google.api.client.auth.oauth2.Credential;
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.client.json.JsonFactory;
+
+import com.android.vts.proto.VtsReportMessage.DashboardPostMessage;
+import com.android.vts.proto.VtsReportMessage.TestPlanReportMessage;
+
+/**
+ * Uploads the VTS test plan execution result to the web DB using a RESTful API and
+ * an OAuth2 credential kept in a json file.
+ */
+public class VtsDashboardUtil {
+    private static final String PLUS_ME = "https://www.googleapis.com/auth/plus.me";
+    private static final int BASE_TIMEOUT_MSECS = 1000 * 60;
+    private static VtsVendorConfigFileUtil mConfigReader;
+    IRunUtil mRunUtil = new RunUtil();
+
+    public VtsDashboardUtil(VtsVendorConfigFileUtil configReader) {
+        mConfigReader = configReader;
+    }
+
+    /*
+     * Returns an OAuth2 token string obtained using a service account json keyfile.
+     *
+     * Uses the service account keyfile located at config variable 'service_key_json_path'
+     * to request an OAuth2 token.
+     */
+    private String GetToken() {
+        String keyFilePath;
+        try {
+            keyFilePath = mConfigReader.GetVendorConfigVariable("service_key_json_path");
+        } catch (NoSuchElementException e) {
+            return null;
+        }
+
+        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
+        Credential credential = null;
+        try {
+            List<String> listStrings = new LinkedList<String>();
+            listStrings.add(PLUS_ME);
+            credential = GoogleCredential.fromStream(new FileInputStream(keyFilePath))
+                                 .createScoped(listStrings);
+            credential.refreshToken();
+            return credential.getAccessToken();
+        } catch (FileNotFoundException e) {
+            CLog.e(String.format("Service key file %s doesn't exist.", keyFilePath));
+        } catch (IOException e) {
+            CLog.e(String.format("Can't read the service key file, %s", keyFilePath));
+        }
+        return null;
+    }
+
+    /*
+     * Uploads the given message to the web DB.
+     *
+     * @param message, DashboardPostMessage that keeps the result to upload.
+     */
+    public void Upload(DashboardPostMessage message) {
+        message.setAccessToken(GetToken());
+        try {
+            String messageFilePath = WriteToTempFile(
+                    Base64.getEncoder().encodeToString(message.toByteArray()).getBytes());
+            Upload(messageFilePath);
+        } catch (IOException e) {
+            CLog.e("Couldn't write a proto message to a temp file.");
+        }
+    }
+
+    /*
+     * Uploads the given message file path to the web DB.
+     *
+     * @param message, DashboardPostMessage file path that keeps the result to upload.
+     */
+    public void Upload(String messageFilePath) {
+        try {
+            String commandTemplate =
+                    mConfigReader.GetVendorConfigVariable("dashboard_post_command");
+            commandTemplate = commandTemplate.replace("{path}", messageFilePath);
+            commandTemplate = commandTemplate.replace("'", "");
+            CLog.i(String.format("Upload command: %s", commandTemplate));
+            CommandResult c =
+                    mRunUtil.runTimedCmd(BASE_TIMEOUT_MSECS * 3, commandTemplate.split(" "));
+            if (c == null || c.getStatus() != CommandStatus.SUCCESS) {
+                CLog.e("Uploading the test plan execution result to GAE DB faiied.");
+                CLog.e("Stdout: %s", c.getStdout());
+                CLog.e("Stderr: %s", c.getStderr());
+            }
+            FileUtil.deleteFile(new File(messageFilePath));
+        } catch (NoSuchElementException e) {
+            CLog.e("dashboard_post_command unspecified in vendor config.");
+        }
+    }
+
+    /*
+     * Simple wrapper to write data to a temp file.
+     *
+     * @param data, actual data to write to a file.
+     * @throws IOException
+     */
+    private String WriteToTempFile(byte[] data) throws IOException {
+        File tempFile = File.createTempFile("tempfile", ".tmp");
+        String filePath = tempFile.getAbsolutePath();
+        FileOutputStream out = new FileOutputStream(filePath);
+        out.write(data);
+        out.close();
+        return filePath;
+    }
+}
diff --git a/harnesses/tradefed/tests/res/testtype/vts_multi_device_test_parser_output.txt b/harnesses/tradefed/tests/res/testtype/vts_multi_device_test_parser_output.txt
index d1d98fd..aa7c79a 100644
--- a/harnesses/tradefed/tests/res/testtype/vts_multi_device_test_parser_output.txt
+++ b/harnesses/tradefed/tests/res/testtype/vts_multi_device_test_parser_output.txt
@@ -1,7 +1,7 @@
 [VTS-Example] 07-01 08:54:59.495 INFO ==========> SampleLightFuzzTest <==========
 [VTS-Example] 07-01 08:55:01.215 INFO Exception occurred in command: killall vts_hal_agent > /dev/null 2&>1
-[VTS-Example] 07-01 08:55:01.258 INFO Exception occurred in command: killall fuzzer32 > /dev/null 2&>1
-[VTS-Example] 07-01 08:55:01.296 INFO Exception occurred in command: killall fuzzer64 > /dev/null 2&>1
+[VTS-Example] 07-01 08:55:01.258 INFO Exception occurred in command: killall vts_hal_driver32 > /dev/null 2&>1
+[VTS-Example] 07-01 08:55:01.296 INFO Exception occurred in command: killall vts_hal_driver64 > /dev/null 2&>1
 [VTS-Example] 07-01 08:55:02.299 INFO sending a command (type SET_HOST_INFO)
 [VTS-Example] 07-01 08:55:02.312 INFO resp 2 bytes
 [VTS-Example] 07-01 08:55:02.313 INFO TcpServer Thread-2 started (127.0.0.1:5365)
diff --git a/harnesses/tradefed/tests/res/testtype/vts_multi_device_test_parser_output_timeout.txt b/harnesses/tradefed/tests/res/testtype/vts_multi_device_test_parser_output_timeout.txt
index 5d249d4..a0adb80 100644
--- a/harnesses/tradefed/tests/res/testtype/vts_multi_device_test_parser_output_timeout.txt
+++ b/harnesses/tradefed/tests/res/testtype/vts_multi_device_test_parser_output_timeout.txt
@@ -1,7 +1,7 @@
 [VTS-Example] 07-01 08:54:59.495 INFO ==========> SampleLightFuzzTest <==========
 [VTS-Example] 07-01 08:55:01.215 INFO Exception occurred in command: killall vts_hal_agent > /dev/null 2&>1
-[VTS-Example] 07-01 08:55:01.258 INFO Exception occurred in command: killall fuzzer32 > /dev/null 2&>1
-[VTS-Example] 07-01 08:55:01.296 INFO Exception occurred in command: killall fuzzer64 > /dev/null 2&>1
+[VTS-Example] 07-01 08:55:01.258 INFO Exception occurred in command: killall vts_hal_driver32 > /dev/null 2&>1
+[VTS-Example] 07-01 08:55:01.296 INFO Exception occurred in command: killall vts_hal_driver64 > /dev/null 2&>1
 [VTS-Example] 07-01 08:55:02.299 INFO sending a command (type SET_HOST_INFO)
 [VTS-Example] 07-01 08:55:02.312 INFO resp 2 bytes
 [VTS-Example] 07-01 08:55:02.313 INFO TcpServer Thread-2 started (127.0.0.1:5365)
diff --git a/proto/ComponentSpecificationMessage.proto b/proto/ComponentSpecificationMessage.proto
index 41fd0f1..555245a 100644
--- a/proto/ComponentSpecificationMessage.proto
+++ b/proto/ComponentSpecificationMessage.proto
@@ -174,8 +174,26 @@
 
 // To specify an API call to an interface.
 message FunctionCallMessage {
-  // Name of the interface.
+  // Name of the interface. Not required if hal_driver_id is set.
+  // Currently only used by fuzzer.
   optional bytes hidl_interface_name = 1;
+
+  // HAL driver ID, if set (e.g., >0), use the given driver_id to get the
+  // corresponding driver instance; otherwise, create a new driver based
+  // on the component info (package, version etc.)
+  optional int32 hal_driver_id = 11 [default = -1];
+
+  // Component class, e.g., HIDL HAL or Conventional HAL.
+  optional ComponentClass component_class = 21;
+  // Component type, e.g., BLUETOOTH, used for Conventional HAL only.
+  optional ComponentType component_type = 22;
+  // Component version (e.g., 1.0).
+  optional bytes component_type_version = 23;
+  // Component name (e.g., INfc), used for HIDL HALs only.
+  optional bytes component_name = 24;
+  // Component package name (e.g., android.hardware.nfc).
+  optional bytes package_name = 25;
+
   // Specifies API function and inputs.
   optional FunctionSpecificationMessage api = 100;
 }
@@ -204,11 +222,17 @@
   // a list of arguments.
   repeated VariableSpecificationMessage arg = 21;
 
+  // hidl annotation fields {
+
   // a specification of the call flows of the function.
   repeated CallFlowSpecificationMessage callflow = 31;
+  // if true, will not be fuzz tested.
+  optional bool do_not_fuzz = 32 [default = false];
+
+  // } hidl annotation fields
 
   // whether it is a callback.
-  optional bool is_callback = 41;
+  optional bool is_callback = 41 [deprecated = true];
 
   // when it is a callback.
   optional FunctionPointerSpecificationMessage function_pointer = 42;
@@ -412,11 +436,11 @@
   optional int32 hidl_interface_id = 241;
 
   // for HIDL HAL, to specify an HIDL interface's client proxy object's
-  // pointer value. Passed from a FuzzerBase instance to the VTS HAL driver
+  // pointer value. Passed from a DriverBase instance to the VTS HAL driver
   // framework as a return value of its CallFunction() method. Another use
-  // case is when this variable is passed to a FuzzerBase instance from the
+  // case is when this variable is passed to a DriverBase instance from the
   // VTS HAL driver framework which can get this value from another
-  // (potentially nested or main) FuzzerBase instance.
+  // (potentially nested or main) DriverBase instance.
   optional uint64 hidl_interface_pointer = 242;
 
   // true if the argument is an input (valid only for the top-level message).
@@ -451,6 +475,9 @@
 
 // To specify an interface of a component
 message InterfaceSpecificationMessage {
+  // whether this interface is a HIDL callback.
+  optional bool is_hidl_callback = 101 [default = false];
+
   // a list of functions exposed by the component.
   repeated FunctionSpecificationMessage api = 2001;
 
diff --git a/proto/ComponentSpecificationMessage_pb2.py b/proto/ComponentSpecificationMessage_pb2.py
index 162ee12..edff528 100644
--- a/proto/ComponentSpecificationMessage_pb2.py
+++ b/proto/ComponentSpecificationMessage_pb2.py
@@ -14,7 +14,7 @@
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='ComponentSpecificationMessage.proto',
   package='android.vts',
-  serialized_pb='\n#ComponentSpecificationMessage.proto\x12\x0b\x61ndroid.vts\"e\n\x1c\x43\x61llFlowSpecificationMessage\x12\x14\n\x05\x65ntry\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04\x65xit\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x0c\n\x04next\x18\x0b \x03(\x0c\x12\x0c\n\x04prev\x18\x0c \x03(\x0c\"C\n NativeCodeCoverageRawDataMessage\x12\x11\n\tfile_path\x18\x01 \x01(\x0c\x12\x0c\n\x04gcda\x18\x0b \x01(\x0c\"j\n\x13\x46unctionCallMessage\x12\x1b\n\x13hidl_interface_name\x18\x01 \x01(\x0c\x12\x36\n\x03\x61pi\x18\x64 \x01(\x0b\x32).android.vts.FunctionSpecificationMessage\"\xbe\x05\n\x1c\x46unctionSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x16\n\x0esubmodule_name\x18\x02 \x01(\x0c\x12\x19\n\x11hidl_interface_id\x18\x03 \x01(\x05\x12>\n\x0breturn_type\x18\x0b \x01(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x43\n\x10return_type_hidl\x18\x0c \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12N\n\x1areturn_type_submodule_spec\x18\r \x01(\x0b\x32*.android.vts.ComponentSpecificationMessage\x12\x36\n\x03\x61rg\x18\x15 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12;\n\x08\x63\x61llflow\x18\x1f \x03(\x0b\x32).android.vts.CallFlowSpecificationMessage\x12\x13\n\x0bis_callback\x18) \x01(\x08\x12J\n\x10\x66unction_pointer\x18* \x01(\x0b\x32\x30.android.vts.FunctionPointerSpecificationMessage\x12\x16\n\x0eprofiling_data\x18\x65 \x03(\x02\x12 \n\x17processed_coverage_data\x18\xc9\x01 \x03(\r\x12I\n\x11raw_coverage_data\x18\xca\x01 \x03(\x0b\x32-.android.vts.NativeCodeCoverageRawDataMessage\x12\x14\n\x0bparent_path\x18\xad\x02 \x01(\x0c\x12\x17\n\x0esyscall_number\x18\x91\x03 \x01(\r\"\xf5\x02\n\x16ScalarDataValueMessage\x12\x0e\n\x06\x62ool_t\x18\x01 \x01(\x08\x12\x0e\n\x06int8_t\x18\x0b \x01(\x05\x12\x0f\n\x07uint8_t\x18\x0c \x01(\r\x12\x0c\n\x04\x63har\x18\r \x01(\x05\x12\r\n\x05uchar\x18\x0e \x01(\r\x12\x0f\n\x07int16_t\x18\x15 \x01(\x05\x12\x10\n\x08uint16_t\x18\x16 \x01(\r\x12\x0f\n\x07int32_t\x18\x1f \x01(\x05\x12\x10\n\x08uint32_t\x18  \x01(\r\x12\x0f\n\x07int64_t\x18) \x01(\x03\x12\x10\n\x08uint64_t\x18* \x01(\x04\x12\x0f\n\x07\x66loat_t\x18\x65 \x01(\x02\x12\x10\n\x08\x64ouble_t\x18\x66 \x01(\x01\x12\x10\n\x07pointer\x18\xc9\x01 \x01(\r\x12\x0f\n\x06opaque\x18\xca\x01 \x01(\r\x12\x15\n\x0cvoid_pointer\x18\xd3\x01 \x01(\r\x12\x15\n\x0c\x63har_pointer\x18\xd4\x01 \x01(\r\x12\x16\n\ruchar_pointer\x18\xd5\x01 \x01(\r\x12\x18\n\x0fpointer_pointer\x18\xfb\x01 \x01(\r\"\xd1\x01\n#FunctionPointerSpecificationMessage\x12\x15\n\rfunction_name\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x0b \x01(\r\x12\n\n\x02id\x18\x15 \x01(\x0c\x12\x36\n\x03\x61rg\x18\x65 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12>\n\x0breturn_type\x18o \x01(\x0b\x32).android.vts.VariableSpecificationMessage\"9\n\x16StringDataValueMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0e\n\x06length\x18\x0b \x01(\r\"z\n\x14\x45numDataValueMessage\x12\x12\n\nenumerator\x18\x01 \x03(\x0c\x12\x39\n\x0cscalar_value\x18\x02 \x03(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bscalar_type\x18\x03 \x01(\x0c\"8\n\x16MemoryDataValueMessage\x12\x0c\n\x04size\x18\x01 \x01(\x03\x12\x10\n\x08\x63ontents\x18\x02 \x01(\x0c\"\x93\x01\n\tFdMessage\x12!\n\x04type\x18\x01 \x01(\x0e\x32\x13.android.vts.FdType\x12\x0c\n\x04mode\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\x05\x12\x11\n\tfile_name\x18\x04 \x01(\x0c\x12\x33\n\x06memory\x18\x06 \x01(\x0b\x32#.android.vts.MemoryDataValueMessage\"\x85\x01\n\x16HandleDataValueMessage\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x0f\n\x07num_fds\x18\x02 \x01(\x05\x12\x10\n\x08num_ints\x18\x03 \x01(\x05\x12&\n\x06\x66\x64_val\x18\x04 \x03(\x0b\x32\x16.android.vts.FdMessage\x12\x0f\n\x07int_val\x18\x05 \x03(\x05\"\xc3\t\n\x1cVariableSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\'\n\x04type\x18\x02 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x39\n\x0cscalar_value\x18\x65 \x01(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bscalar_type\x18\x66 \x01(\x0c\x12\x39\n\x0cstring_value\x18o \x01(\x0b\x32#.android.vts.StringDataValueMessage\x12\x35\n\nenum_value\x18y \x01(\x0b\x32!.android.vts.EnumDataValueMessage\x12@\n\x0cvector_value\x18\x83\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x14\n\x0bvector_size\x18\x84\x01 \x01(\x05\x12@\n\x0cstruct_value\x18\x8d\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x14\n\x0bstruct_type\x18\x8e\x01 \x01(\x0c\x12>\n\nsub_struct\x18\x8f\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12?\n\x0bunion_value\x18\x97\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x13\n\nunion_type\x18\x98\x01 \x01(\x0c\x12=\n\tsub_union\x18\x99\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12=\n\tfmq_value\x18\xa1\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12=\n\tref_value\x18\xab\x01 \x01(\x0b\x32).android.vts.VariableSpecificationMessage\x12?\n\x11hidl_memory_value\x18\xac\x01 \x01(\x0b\x32#.android.vts.MemoryDataValueMessage\x12:\n\x0chandle_value\x18\xb5\x01 \x01(\x0b\x32#.android.vts.HandleDataValueMessage\x12\x18\n\x0fpredefined_type\x18\xc9\x01 \x01(\x0c\x12K\n\x10\x66unction_pointer\x18\xdd\x01 \x03(\x0b\x32\x30.android.vts.FunctionPointerSpecificationMessage\x12\x1b\n\x12hidl_callback_type\x18\xe7\x01 \x01(\x0c\x12\x1a\n\x11hidl_interface_id\x18\xf1\x01 \x01(\x05\x12\x1f\n\x16hidl_interface_pointer\x18\xf2\x01 \x01(\x04\x12\x17\n\x08is_input\x18\xad\x02 \x01(\x08:\x04true\x12\x19\n\tis_output\x18\xae\x02 \x01(\x08:\x05\x66\x61lse\x12\x18\n\x08is_const\x18\xaf\x02 \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0bis_callback\x18\xb0\x02 \x01(\x08:\x05\x66\x61lse\"\xfb\x01\n\x1aStructSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x19\n\nis_pointer\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x37\n\x03\x61pi\x18\xe9\x07 \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12<\n\nsub_struct\x18\xd1\x0f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd5\x01\n\x1dInterfaceSpecificationMessage\x12\x37\n\x03\x61pi\x18\xd1\x0f \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12<\n\nsub_struct\x18\xa1\x1f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage\"\xca\x03\n\x1d\x43omponentSpecificationMessage\x12\x34\n\x0f\x63omponent_class\x18\x01 \x01(\x0e\x32\x1b.android.vts.ComponentClass\x12\x32\n\x0e\x63omponent_type\x18\x02 \x01(\x0e\x32\x1a.android.vts.ComponentType\x12!\n\x16\x63omponent_type_version\x18\x03 \x01(\x02:\x01\x31\x12\x16\n\x0e\x63omponent_name\x18\x04 \x01(\x0c\x12,\n\x0btarget_arch\x18\x05 \x01(\x0e\x32\x17.android.vts.TargetArch\x12\x0f\n\x07package\x18\x0b \x01(\x0c\x12\x0e\n\x06import\x18\x0c \x03(\x0c\x12%\n\x1coriginal_data_structure_name\x18\xe9\x07 \x01(\x0c\x12\x0f\n\x06header\x18\xea\x07 \x03(\x0c\x12>\n\tinterface\x18\xd1\x0f \x01(\x0b\x32*.android.vts.InterfaceSpecificationMessage\x12=\n\tattribute\x18\xb5\x10 \x03(\x0b\x32).android.vts.VariableSpecificationMessage*\xc9\x01\n\x0e\x43omponentClass\x12\x11\n\rUNKNOWN_CLASS\x10\x00\x12\x14\n\x10HAL_CONVENTIONAL\x10\x01\x12\x1e\n\x1aHAL_CONVENTIONAL_SUBMODULE\x10\x02\x12\x0e\n\nHAL_LEGACY\x10\x03\x12\x0c\n\x08HAL_HIDL\x10\x04\x12!\n\x1dHAL_HIDL_WRAPPED_CONVENTIONAL\x10\x05\x12\x0e\n\nLIB_SHARED\x10\x0b\x12\n\n\x06KERNEL\x10\x15\x12\x11\n\rKERNEL_MODULE\x10\x16*\xa8\x03\n\rComponentType\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\t\n\x05\x41UDIO\x10\x01\x12\n\n\x06\x43\x41MERA\x10\x02\x12\x07\n\x03GPS\x10\x03\x12\t\n\x05LIGHT\x10\x04\x12\x08\n\x04WIFI\x10\x05\x12\n\n\x06MOBILE\x10\x06\x12\r\n\tBLUETOOTH\x10\x07\x12\x07\n\x03NFC\x10\x08\x12\t\n\x05POWER\x10\t\x12\x0c\n\x08MEMTRACK\x10\n\x12\x07\n\x03\x42\x46P\x10\x0b\x12\x0c\n\x08VIBRATOR\x10\x0c\x12\x0b\n\x07THERMAL\x10\r\x12\x0c\n\x08TV_INPUT\x10\x0e\x12\n\n\x06TV_CEC\x10\x0f\x12\x0b\n\x07SENSORS\x10\x10\x12\x0b\n\x07VEHICLE\x10\x11\x12\x06\n\x02VR\x10\x12\x12\x16\n\x12GRAPHICS_ALLOCATOR\x10\x13\x12\x13\n\x0fGRAPHICS_MAPPER\x10\x14\x12\t\n\x05RADIO\x10\x15\x12\x0e\n\nCONTEXTHUB\x10\x16\x12\x15\n\x11GRAPHICS_COMPOSER\x10\x17\x12\r\n\tMEDIA_OMX\x10\x18\x12\x10\n\x0b\x42IONIC_LIBM\x10\xe9\x07\x12\x10\n\x0b\x42IONIC_LIBC\x10\xea\x07\x12\x13\n\x0eVNDK_LIBCUTILS\x10\xcd\x08\x12\x0c\n\x07SYSCALL\x10\xd1\x0f*\x9e\x03\n\x0cVariableType\x12\x19\n\x15UNKNOWN_VARIABLE_TYPE\x10\x00\x12\x13\n\x0fTYPE_PREDEFINED\x10\x01\x12\x0f\n\x0bTYPE_SCALAR\x10\x02\x12\x0f\n\x0bTYPE_STRING\x10\x03\x12\r\n\tTYPE_ENUM\x10\x04\x12\x0e\n\nTYPE_ARRAY\x10\x05\x12\x0f\n\x0bTYPE_VECTOR\x10\x06\x12\x0f\n\x0bTYPE_STRUCT\x10\x07\x12\x19\n\x15TYPE_FUNCTION_POINTER\x10\x08\x12\r\n\tTYPE_VOID\x10\t\x12\x16\n\x12TYPE_HIDL_CALLBACK\x10\n\x12\x12\n\x0eTYPE_SUBMODULE\x10\x0b\x12\x0e\n\nTYPE_UNION\x10\x0c\x12\x17\n\x13TYPE_HIDL_INTERFACE\x10\r\x12\x0f\n\x0bTYPE_HANDLE\x10\x0e\x12\r\n\tTYPE_MASK\x10\x0f\x12\x14\n\x10TYPE_HIDL_MEMORY\x10\x10\x12\x10\n\x0cTYPE_POINTER\x10\x11\x12\x11\n\rTYPE_FMQ_SYNC\x10\x12\x12\x13\n\x0fTYPE_FMQ_UNSYNC\x10\x13\x12\x0c\n\x08TYPE_REF\x10\x14*Q\n\nTargetArch\x12\x17\n\x13UNKNOWN_TARGET_ARCH\x10\x00\x12\x13\n\x0fTARGET_ARCH_ARM\x10\x01\x12\x15\n\x11TARGET_ARCH_ARM64\x10\x02*b\n\x06\x46\x64Type\x12\r\n\tFILE_TYPE\x10\x01\x12\x0c\n\x08\x44IR_TYPE\x10\x02\x12\x0c\n\x08\x44\x45V_TYPE\x10\x03\x12\r\n\tPIPE_TYPE\x10\x04\x12\x0f\n\x0bSOCKET_TYPE\x10\x05\x12\r\n\tLINK_TYPE\x10\x06\x42\x39\n\x15\x63om.android.vts.protoB VtsComponentSpecificationMessage')
+  serialized_pb='\n#ComponentSpecificationMessage.proto\x12\x0b\x61ndroid.vts\"e\n\x1c\x43\x61llFlowSpecificationMessage\x12\x14\n\x05\x65ntry\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04\x65xit\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x0c\n\x04next\x18\x0b \x03(\x0c\x12\x0c\n\x04prev\x18\x0c \x03(\x0c\"C\n NativeCodeCoverageRawDataMessage\x12\x11\n\tfile_path\x18\x01 \x01(\x0c\x12\x0c\n\x04gcda\x18\x0b \x01(\x0c\"\xbd\x02\n\x13\x46unctionCallMessage\x12\x1b\n\x13hidl_interface_name\x18\x01 \x01(\x0c\x12\x19\n\rhal_driver_id\x18\x0b \x01(\x05:\x02-1\x12\x34\n\x0f\x63omponent_class\x18\x15 \x01(\x0e\x32\x1b.android.vts.ComponentClass\x12\x32\n\x0e\x63omponent_type\x18\x16 \x01(\x0e\x32\x1a.android.vts.ComponentType\x12\x1e\n\x16\x63omponent_type_version\x18\x17 \x01(\x0c\x12\x16\n\x0e\x63omponent_name\x18\x18 \x01(\x0c\x12\x14\n\x0cpackage_name\x18\x19 \x01(\x0c\x12\x36\n\x03\x61pi\x18\x64 \x01(\x0b\x32).android.vts.FunctionSpecificationMessage\"\xde\x05\n\x1c\x46unctionSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x16\n\x0esubmodule_name\x18\x02 \x01(\x0c\x12\x19\n\x11hidl_interface_id\x18\x03 \x01(\x05\x12>\n\x0breturn_type\x18\x0b \x01(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x43\n\x10return_type_hidl\x18\x0c \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12N\n\x1areturn_type_submodule_spec\x18\r \x01(\x0b\x32*.android.vts.ComponentSpecificationMessage\x12\x36\n\x03\x61rg\x18\x15 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12;\n\x08\x63\x61llflow\x18\x1f \x03(\x0b\x32).android.vts.CallFlowSpecificationMessage\x12\x1a\n\x0b\x64o_not_fuzz\x18  \x01(\x08:\x05\x66\x61lse\x12\x17\n\x0bis_callback\x18) \x01(\x08\x42\x02\x18\x01\x12J\n\x10\x66unction_pointer\x18* \x01(\x0b\x32\x30.android.vts.FunctionPointerSpecificationMessage\x12\x16\n\x0eprofiling_data\x18\x65 \x03(\x02\x12 \n\x17processed_coverage_data\x18\xc9\x01 \x03(\r\x12I\n\x11raw_coverage_data\x18\xca\x01 \x03(\x0b\x32-.android.vts.NativeCodeCoverageRawDataMessage\x12\x14\n\x0bparent_path\x18\xad\x02 \x01(\x0c\x12\x17\n\x0esyscall_number\x18\x91\x03 \x01(\r\"\xf5\x02\n\x16ScalarDataValueMessage\x12\x0e\n\x06\x62ool_t\x18\x01 \x01(\x08\x12\x0e\n\x06int8_t\x18\x0b \x01(\x05\x12\x0f\n\x07uint8_t\x18\x0c \x01(\r\x12\x0c\n\x04\x63har\x18\r \x01(\x05\x12\r\n\x05uchar\x18\x0e \x01(\r\x12\x0f\n\x07int16_t\x18\x15 \x01(\x05\x12\x10\n\x08uint16_t\x18\x16 \x01(\r\x12\x0f\n\x07int32_t\x18\x1f \x01(\x05\x12\x10\n\x08uint32_t\x18  \x01(\r\x12\x0f\n\x07int64_t\x18) \x01(\x03\x12\x10\n\x08uint64_t\x18* \x01(\x04\x12\x0f\n\x07\x66loat_t\x18\x65 \x01(\x02\x12\x10\n\x08\x64ouble_t\x18\x66 \x01(\x01\x12\x10\n\x07pointer\x18\xc9\x01 \x01(\r\x12\x0f\n\x06opaque\x18\xca\x01 \x01(\r\x12\x15\n\x0cvoid_pointer\x18\xd3\x01 \x01(\r\x12\x15\n\x0c\x63har_pointer\x18\xd4\x01 \x01(\r\x12\x16\n\ruchar_pointer\x18\xd5\x01 \x01(\r\x12\x18\n\x0fpointer_pointer\x18\xfb\x01 \x01(\r\"\xd1\x01\n#FunctionPointerSpecificationMessage\x12\x15\n\rfunction_name\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x0b \x01(\r\x12\n\n\x02id\x18\x15 \x01(\x0c\x12\x36\n\x03\x61rg\x18\x65 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12>\n\x0breturn_type\x18o \x01(\x0b\x32).android.vts.VariableSpecificationMessage\"9\n\x16StringDataValueMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0e\n\x06length\x18\x0b \x01(\r\"z\n\x14\x45numDataValueMessage\x12\x12\n\nenumerator\x18\x01 \x03(\x0c\x12\x39\n\x0cscalar_value\x18\x02 \x03(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bscalar_type\x18\x03 \x01(\x0c\"8\n\x16MemoryDataValueMessage\x12\x0c\n\x04size\x18\x01 \x01(\x03\x12\x10\n\x08\x63ontents\x18\x02 \x01(\x0c\"\x93\x01\n\tFdMessage\x12!\n\x04type\x18\x01 \x01(\x0e\x32\x13.android.vts.FdType\x12\x0c\n\x04mode\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\x05\x12\x11\n\tfile_name\x18\x04 \x01(\x0c\x12\x33\n\x06memory\x18\x06 \x01(\x0b\x32#.android.vts.MemoryDataValueMessage\"\x85\x01\n\x16HandleDataValueMessage\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x0f\n\x07num_fds\x18\x02 \x01(\x05\x12\x10\n\x08num_ints\x18\x03 \x01(\x05\x12&\n\x06\x66\x64_val\x18\x04 \x03(\x0b\x32\x16.android.vts.FdMessage\x12\x0f\n\x07int_val\x18\x05 \x03(\x05\"\xc3\t\n\x1cVariableSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\'\n\x04type\x18\x02 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x39\n\x0cscalar_value\x18\x65 \x01(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bscalar_type\x18\x66 \x01(\x0c\x12\x39\n\x0cstring_value\x18o \x01(\x0b\x32#.android.vts.StringDataValueMessage\x12\x35\n\nenum_value\x18y \x01(\x0b\x32!.android.vts.EnumDataValueMessage\x12@\n\x0cvector_value\x18\x83\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x14\n\x0bvector_size\x18\x84\x01 \x01(\x05\x12@\n\x0cstruct_value\x18\x8d\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x14\n\x0bstruct_type\x18\x8e\x01 \x01(\x0c\x12>\n\nsub_struct\x18\x8f\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12?\n\x0bunion_value\x18\x97\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x13\n\nunion_type\x18\x98\x01 \x01(\x0c\x12=\n\tsub_union\x18\x99\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12=\n\tfmq_value\x18\xa1\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12=\n\tref_value\x18\xab\x01 \x01(\x0b\x32).android.vts.VariableSpecificationMessage\x12?\n\x11hidl_memory_value\x18\xac\x01 \x01(\x0b\x32#.android.vts.MemoryDataValueMessage\x12:\n\x0chandle_value\x18\xb5\x01 \x01(\x0b\x32#.android.vts.HandleDataValueMessage\x12\x18\n\x0fpredefined_type\x18\xc9\x01 \x01(\x0c\x12K\n\x10\x66unction_pointer\x18\xdd\x01 \x03(\x0b\x32\x30.android.vts.FunctionPointerSpecificationMessage\x12\x1b\n\x12hidl_callback_type\x18\xe7\x01 \x01(\x0c\x12\x1a\n\x11hidl_interface_id\x18\xf1\x01 \x01(\x05\x12\x1f\n\x16hidl_interface_pointer\x18\xf2\x01 \x01(\x04\x12\x17\n\x08is_input\x18\xad\x02 \x01(\x08:\x04true\x12\x19\n\tis_output\x18\xae\x02 \x01(\x08:\x05\x66\x61lse\x12\x18\n\x08is_const\x18\xaf\x02 \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0bis_callback\x18\xb0\x02 \x01(\x08:\x05\x66\x61lse\"\xfb\x01\n\x1aStructSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x19\n\nis_pointer\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x37\n\x03\x61pi\x18\xe9\x07 \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12<\n\nsub_struct\x18\xd1\x0f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xf6\x01\n\x1dInterfaceSpecificationMessage\x12\x1f\n\x10is_hidl_callback\x18\x65 \x01(\x08:\x05\x66\x61lse\x12\x37\n\x03\x61pi\x18\xd1\x0f \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12<\n\nsub_struct\x18\xa1\x1f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage\"\xca\x03\n\x1d\x43omponentSpecificationMessage\x12\x34\n\x0f\x63omponent_class\x18\x01 \x01(\x0e\x32\x1b.android.vts.ComponentClass\x12\x32\n\x0e\x63omponent_type\x18\x02 \x01(\x0e\x32\x1a.android.vts.ComponentType\x12!\n\x16\x63omponent_type_version\x18\x03 \x01(\x02:\x01\x31\x12\x16\n\x0e\x63omponent_name\x18\x04 \x01(\x0c\x12,\n\x0btarget_arch\x18\x05 \x01(\x0e\x32\x17.android.vts.TargetArch\x12\x0f\n\x07package\x18\x0b \x01(\x0c\x12\x0e\n\x06import\x18\x0c \x03(\x0c\x12%\n\x1coriginal_data_structure_name\x18\xe9\x07 \x01(\x0c\x12\x0f\n\x06header\x18\xea\x07 \x03(\x0c\x12>\n\tinterface\x18\xd1\x0f \x01(\x0b\x32*.android.vts.InterfaceSpecificationMessage\x12=\n\tattribute\x18\xb5\x10 \x03(\x0b\x32).android.vts.VariableSpecificationMessage*\xc9\x01\n\x0e\x43omponentClass\x12\x11\n\rUNKNOWN_CLASS\x10\x00\x12\x14\n\x10HAL_CONVENTIONAL\x10\x01\x12\x1e\n\x1aHAL_CONVENTIONAL_SUBMODULE\x10\x02\x12\x0e\n\nHAL_LEGACY\x10\x03\x12\x0c\n\x08HAL_HIDL\x10\x04\x12!\n\x1dHAL_HIDL_WRAPPED_CONVENTIONAL\x10\x05\x12\x0e\n\nLIB_SHARED\x10\x0b\x12\n\n\x06KERNEL\x10\x15\x12\x11\n\rKERNEL_MODULE\x10\x16*\xa8\x03\n\rComponentType\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\t\n\x05\x41UDIO\x10\x01\x12\n\n\x06\x43\x41MERA\x10\x02\x12\x07\n\x03GPS\x10\x03\x12\t\n\x05LIGHT\x10\x04\x12\x08\n\x04WIFI\x10\x05\x12\n\n\x06MOBILE\x10\x06\x12\r\n\tBLUETOOTH\x10\x07\x12\x07\n\x03NFC\x10\x08\x12\t\n\x05POWER\x10\t\x12\x0c\n\x08MEMTRACK\x10\n\x12\x07\n\x03\x42\x46P\x10\x0b\x12\x0c\n\x08VIBRATOR\x10\x0c\x12\x0b\n\x07THERMAL\x10\r\x12\x0c\n\x08TV_INPUT\x10\x0e\x12\n\n\x06TV_CEC\x10\x0f\x12\x0b\n\x07SENSORS\x10\x10\x12\x0b\n\x07VEHICLE\x10\x11\x12\x06\n\x02VR\x10\x12\x12\x16\n\x12GRAPHICS_ALLOCATOR\x10\x13\x12\x13\n\x0fGRAPHICS_MAPPER\x10\x14\x12\t\n\x05RADIO\x10\x15\x12\x0e\n\nCONTEXTHUB\x10\x16\x12\x15\n\x11GRAPHICS_COMPOSER\x10\x17\x12\r\n\tMEDIA_OMX\x10\x18\x12\x10\n\x0b\x42IONIC_LIBM\x10\xe9\x07\x12\x10\n\x0b\x42IONIC_LIBC\x10\xea\x07\x12\x13\n\x0eVNDK_LIBCUTILS\x10\xcd\x08\x12\x0c\n\x07SYSCALL\x10\xd1\x0f*\x9e\x03\n\x0cVariableType\x12\x19\n\x15UNKNOWN_VARIABLE_TYPE\x10\x00\x12\x13\n\x0fTYPE_PREDEFINED\x10\x01\x12\x0f\n\x0bTYPE_SCALAR\x10\x02\x12\x0f\n\x0bTYPE_STRING\x10\x03\x12\r\n\tTYPE_ENUM\x10\x04\x12\x0e\n\nTYPE_ARRAY\x10\x05\x12\x0f\n\x0bTYPE_VECTOR\x10\x06\x12\x0f\n\x0bTYPE_STRUCT\x10\x07\x12\x19\n\x15TYPE_FUNCTION_POINTER\x10\x08\x12\r\n\tTYPE_VOID\x10\t\x12\x16\n\x12TYPE_HIDL_CALLBACK\x10\n\x12\x12\n\x0eTYPE_SUBMODULE\x10\x0b\x12\x0e\n\nTYPE_UNION\x10\x0c\x12\x17\n\x13TYPE_HIDL_INTERFACE\x10\r\x12\x0f\n\x0bTYPE_HANDLE\x10\x0e\x12\r\n\tTYPE_MASK\x10\x0f\x12\x14\n\x10TYPE_HIDL_MEMORY\x10\x10\x12\x10\n\x0cTYPE_POINTER\x10\x11\x12\x11\n\rTYPE_FMQ_SYNC\x10\x12\x12\x13\n\x0fTYPE_FMQ_UNSYNC\x10\x13\x12\x0c\n\x08TYPE_REF\x10\x14*Q\n\nTargetArch\x12\x17\n\x13UNKNOWN_TARGET_ARCH\x10\x00\x12\x13\n\x0fTARGET_ARCH_ARM\x10\x01\x12\x15\n\x11TARGET_ARCH_ARM64\x10\x02*b\n\x06\x46\x64Type\x12\r\n\tFILE_TYPE\x10\x01\x12\x0c\n\x08\x44IR_TYPE\x10\x02\x12\x0c\n\x08\x44\x45V_TYPE\x10\x03\x12\r\n\tPIPE_TYPE\x10\x04\x12\x0f\n\x0bSOCKET_TYPE\x10\x05\x12\r\n\tLINK_TYPE\x10\x06\x42\x39\n\x15\x63om.android.vts.protoB VtsComponentSpecificationMessage')
 
 _COMPONENTCLASS = _descriptor.EnumDescriptor(
   name='ComponentClass',
@@ -61,8 +61,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=4306,
-  serialized_end=4507,
+  serialized_start=4583,
+  serialized_end=4784,
 )
 
 ComponentClass = enum_type_wrapper.EnumTypeWrapper(_COMPONENTCLASS)
@@ -191,8 +191,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=4510,
-  serialized_end=4934,
+  serialized_start=4787,
+  serialized_end=5211,
 )
 
 ComponentType = enum_type_wrapper.EnumTypeWrapper(_COMPONENTTYPE)
@@ -289,8 +289,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=4937,
-  serialized_end=5351,
+  serialized_start=5214,
+  serialized_end=5628,
 )
 
 VariableType = enum_type_wrapper.EnumTypeWrapper(_VARIABLETYPE)
@@ -315,8 +315,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=5353,
-  serialized_end=5434,
+  serialized_start=5630,
+  serialized_end=5711,
 )
 
 TargetArch = enum_type_wrapper.EnumTypeWrapper(_TARGETARCH)
@@ -353,8 +353,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=5436,
-  serialized_end=5534,
+  serialized_start=5713,
+  serialized_end=5811,
 )
 
 FdType = enum_type_wrapper.EnumTypeWrapper(_FDTYPE)
@@ -528,7 +528,49 @@
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='api', full_name='android.vts.FunctionCallMessage.api', index=1,
+      name='hal_driver_id', full_name='android.vts.FunctionCallMessage.hal_driver_id', index=1,
+      number=11, type=5, cpp_type=1, label=1,
+      has_default_value=True, default_value=-1,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='component_class', full_name='android.vts.FunctionCallMessage.component_class', index=2,
+      number=21, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='component_type', full_name='android.vts.FunctionCallMessage.component_type', index=3,
+      number=22, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='component_type_version', full_name='android.vts.FunctionCallMessage.component_type_version', index=4,
+      number=23, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value="",
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='component_name', full_name='android.vts.FunctionCallMessage.component_name', index=5,
+      number=24, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value="",
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='package_name', full_name='android.vts.FunctionCallMessage.package_name', index=6,
+      number=25, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value="",
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='api', full_name='android.vts.FunctionCallMessage.api', index=7,
       number=100, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -543,8 +585,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=224,
-  serialized_end=330,
+  serialized_start=225,
+  serialized_end=542,
 )
 
 
@@ -612,49 +654,56 @@
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='is_callback', full_name='android.vts.FunctionSpecificationMessage.is_callback', index=8,
-      number=41, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
+      name='do_not_fuzz', full_name='android.vts.FunctionSpecificationMessage.do_not_fuzz', index=8,
+      number=32, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='function_pointer', full_name='android.vts.FunctionSpecificationMessage.function_pointer', index=9,
+      name='is_callback', full_name='android.vts.FunctionSpecificationMessage.is_callback', index=9,
+      number=41, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\030\001')),
+    _descriptor.FieldDescriptor(
+      name='function_pointer', full_name='android.vts.FunctionSpecificationMessage.function_pointer', index=10,
       number=42, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='profiling_data', full_name='android.vts.FunctionSpecificationMessage.profiling_data', index=10,
+      name='profiling_data', full_name='android.vts.FunctionSpecificationMessage.profiling_data', index=11,
       number=101, type=2, cpp_type=6, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='processed_coverage_data', full_name='android.vts.FunctionSpecificationMessage.processed_coverage_data', index=11,
+      name='processed_coverage_data', full_name='android.vts.FunctionSpecificationMessage.processed_coverage_data', index=12,
       number=201, type=13, cpp_type=3, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='raw_coverage_data', full_name='android.vts.FunctionSpecificationMessage.raw_coverage_data', index=12,
+      name='raw_coverage_data', full_name='android.vts.FunctionSpecificationMessage.raw_coverage_data', index=13,
       number=202, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='parent_path', full_name='android.vts.FunctionSpecificationMessage.parent_path', index=13,
+      name='parent_path', full_name='android.vts.FunctionSpecificationMessage.parent_path', index=14,
       number=301, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value="",
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='syscall_number', full_name='android.vts.FunctionSpecificationMessage.syscall_number', index=14,
+      name='syscall_number', full_name='android.vts.FunctionSpecificationMessage.syscall_number', index=15,
       number=401, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -669,8 +718,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=333,
-  serialized_end=1035,
+  serialized_start=545,
+  serialized_end=1279,
 )
 
 
@@ -823,8 +872,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1038,
-  serialized_end=1411,
+  serialized_start=1282,
+  serialized_end=1655,
 )
 
 
@@ -879,8 +928,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1414,
-  serialized_end=1623,
+  serialized_start=1658,
+  serialized_end=1867,
 )
 
 
@@ -914,8 +963,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1625,
-  serialized_end=1682,
+  serialized_start=1869,
+  serialized_end=1926,
 )
 
 
@@ -956,8 +1005,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1684,
-  serialized_end=1806,
+  serialized_start=1928,
+  serialized_end=2050,
 )
 
 
@@ -991,8 +1040,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1808,
-  serialized_end=1864,
+  serialized_start=2052,
+  serialized_end=2108,
 )
 
 
@@ -1047,8 +1096,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1867,
-  serialized_end=2014,
+  serialized_start=2111,
+  serialized_end=2258,
 )
 
 
@@ -1103,8 +1152,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=2017,
-  serialized_end=2150,
+  serialized_start=2261,
+  serialized_end=2394,
 )
 
 
@@ -1313,8 +1362,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=2153,
-  serialized_end=3372,
+  serialized_start=2397,
+  serialized_end=3616,
 )
 
 
@@ -1369,8 +1418,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=3375,
-  serialized_end=3626,
+  serialized_start=3619,
+  serialized_end=3870,
 )
 
 
@@ -1382,21 +1431,28 @@
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='api', full_name='android.vts.InterfaceSpecificationMessage.api', index=0,
+      name='is_hidl_callback', full_name='android.vts.InterfaceSpecificationMessage.is_hidl_callback', index=0,
+      number=101, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='api', full_name='android.vts.InterfaceSpecificationMessage.api', index=1,
       number=2001, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='attribute', full_name='android.vts.InterfaceSpecificationMessage.attribute', index=1,
+      name='attribute', full_name='android.vts.InterfaceSpecificationMessage.attribute', index=2,
       number=3001, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='sub_struct', full_name='android.vts.InterfaceSpecificationMessage.sub_struct', index=2,
+      name='sub_struct', full_name='android.vts.InterfaceSpecificationMessage.sub_struct', index=3,
       number=4001, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -1411,8 +1467,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=3629,
-  serialized_end=3842,
+  serialized_start=3873,
+  serialized_end=4119,
 )
 
 
@@ -1509,10 +1565,12 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=3845,
-  serialized_end=4303,
+  serialized_start=4122,
+  serialized_end=4580,
 )
 
+_FUNCTIONCALLMESSAGE.fields_by_name['component_class'].enum_type = _COMPONENTCLASS
+_FUNCTIONCALLMESSAGE.fields_by_name['component_type'].enum_type = _COMPONENTTYPE
 _FUNCTIONCALLMESSAGE.fields_by_name['api'].message_type = _FUNCTIONSPECIFICATIONMESSAGE
 _FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['return_type'].message_type = _VARIABLESPECIFICATIONMESSAGE
 _FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['return_type_hidl'].message_type = _VARIABLESPECIFICATIONMESSAGE
@@ -1661,4 +1719,6 @@
 
 DESCRIPTOR.has_options = True
 DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n\025com.android.vts.protoB VtsComponentSpecificationMessage')
+_FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['is_callback'].has_options = True
+_FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['is_callback']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\030\001')
 # @@protoc_insertion_point(module_scope)
diff --git a/proto/ExecutionSpecificationMessage.proto b/proto/ExecutionSpecificationMessage.proto
index 7f8f51f..615c105 100644
--- a/proto/ExecutionSpecificationMessage.proto
+++ b/proto/ExecutionSpecificationMessage.proto
@@ -24,4 +24,6 @@
 message ExecutionSpecificationMessage {
   // Lists API calls.
   repeated FunctionCallMessage function_call = 1;
+  // Used to ensure that garbage bytes cannot be accidentally parsed.
+  optional bool valid = 1000;
 }
diff --git a/runners/host/base_test.py b/runners/host/base_test.py
index af0a3bc..3d07dc3 100644
--- a/runners/host/base_test.py
+++ b/runners/host/base_test.py
@@ -16,17 +16,19 @@
 
 import logging
 import os
+import re
 
 from vts.proto import VtsReportMessage_pb2 as ReportMsg
 from vts.runners.host import asserts
+from vts.runners.host import const
 from vts.runners.host import errors
 from vts.runners.host import keys
 from vts.runners.host import logger
 from vts.runners.host import records
 from vts.runners.host import signals
 from vts.runners.host import utils
-from vts.runners.host import const
 from vts.utils.python.controllers import android_device
+from vts.utils.python.common import filter_utils
 from vts.utils.python.common import list_utils
 from vts.utils.python.coverage import coverage_utils
 from vts.utils.python.profiling import profiling_utils
@@ -40,6 +42,10 @@
 RESULT_LINE_TEMPLATE = TEST_CASE_TOKEN + " %s %s"
 STR_TEST = "test"
 STR_GENERATE = "generate"
+_REPORT_MESSAGE_FILE_NAME = "report_proto.msg"
+_BUG_REPORT_FILE_PREFIX = "bugreport"
+_BUG_REPORT_FILE_EXTENSION = ".zip"
+_ANDROID_DEVICES = '_android_devices'
 
 
 class BaseTestClass(object):
@@ -59,9 +65,9 @@
              name.
         results: A records.TestResult object for aggregating test results from
                  the execution of test cases.
-        currentTestName: A string that's the name of the test case currently
-                           being executed. If no test is executing, this should
-                           be None.
+        _current_record: A records.TestResultRecord object for the test case
+                         currently being executed. If no test is running, this
+                         should be None.
         include_filer: A list of string, each representing a test case name to
                        include.
         exclude_filer: A list of string, each representing a test case name to
@@ -73,8 +79,10 @@
         profiling: ProfilingFeature, object storing profiling feature util for test run
         _skip_all_testcases: A boolean, can be set by a subclass in
                              setUpClass() to skip all test cases.
+        _bug_report_on_failure: bool, whether to catch bug report at the end
+                                of failed test cases.
+        test_filter: Filter object to filter test names.
     """
-
     TAG = None
 
     def __init__(self, configs):
@@ -85,7 +93,7 @@
         for name, value in configs.items():
             setattr(self, name, value)
         self.results = records.TestResult()
-        self.currentTestName = None
+        self._current_record = None
 
         # Setup test filters
         self.include_filter = self.getUserParam(
@@ -101,12 +109,26 @@
             ],
             default_value=[])
 
-        self.include_filter = self.ExpandFilterBitness(
-            list_utils.ExpandItemDelimiters(
-                list_utils.ItemsToStr(self.include_filter), ','))
-        self.exclude_filter = self.ExpandFilterBitness(
-            list_utils.ExpandItemDelimiters(
-                list_utils.ItemsToStr(self.exclude_filter), ','))
+        # TODO(yuexima): remove include_filter and exclude_filter from class attributes
+        # after confirming all modules no longer have reference to them
+        self.include_filter = list_utils.ExpandItemDelimiters(
+            list_utils.ItemsToStr(self.include_filter), ',')
+        self.exclude_filter = list_utils.ExpandItemDelimiters(
+            list_utils.ItemsToStr(self.exclude_filter), ',')
+        exclude_over_include = self.getUserParam(
+            keys.ConfigKeys.KEY_EXCLUDE_OVER_INCLUDE, default_value=None)
+        self.test_module_name = self.getUserParam(keys.ConfigKeys.KEY_TESTBED_NAME,
+                                             default_value=None)
+        self.test_filter = filter_utils.Filter(
+            self.include_filter,
+            self.exclude_filter,
+            enable_regex=True,
+            exclude_over_include=exclude_over_include,
+            enable_negative_pattern=True,
+            enable_module_name_prefix_matching=True,
+            module_name=self.test_module_name)
+        self.test_filter.ExpandBitness()
+        logging.info('Test filter: %s' % self.test_filter)
 
         # TODO: get abi information differently for multi-device support.
         # Set other optional parameters
@@ -130,13 +152,21 @@
         self.log_uploading = log_uploading_utils.LogUploadingFeature(
             self.user_params, web=self.web)
         self._skip_all_testcases = False
+        self._bug_report_on_failure = self.getUserParam(
+            keys.ConfigKeys.IKEY_BUG_REPORT_ON_FAILURE, default_value=False)
 
     @property
     def android_devices(self):
-        """returns a list of AndroidDevice objects"""
-        if not hasattr(self, '_android_devices'):
-            self._android_devices = self.registerController(android_device)
-        return self._android_devices
+        """Returns a list of AndroidDevice objects"""
+        if not hasattr(self, _ANDROID_DEVICES):
+            setattr(self, _ANDROID_DEVICES,
+                    self.registerController(android_device))
+        return getattr(self, _ANDROID_DEVICES)
+
+    @android_devices.setter
+    def android_devices(self, devices):
+        """Set the list of AndroidDevice objects"""
+        setattr(self, _ANDROID_DEVICES, devices)
 
     def __enter__(self):
         return self
@@ -265,7 +295,20 @@
         if self.log_uploading.enabled:
             self.log_uploading.UploadLogs()
         if self.web.enabled:
-            self.web.Upload(self.results.requested, self.results.executed)
+            message_b = self.web.GenerateReportMessage(self.results.requested,
+                                                       self.results.executed)
+        else:
+            message_b = ''
+
+        report_proto_path = os.path.join(logging.log_path,
+                                         _REPORT_MESSAGE_FILE_NAME)
+
+        if message_b:
+            logging.info('Result proto message path: %s', report_proto_path)
+
+        with open(report_proto_path, "wb") as f:
+            f.write(message_b)
+
         return ret
 
     def tearDownClass(self):
@@ -276,11 +319,16 @@
         """
         pass
 
-    def _testEntry(self, test_name):
-        """Internal function to be called upon entry of a test case."""
-        self.currentTestName = test_name
+    def _testEntry(self, test_record):
+        """Internal function to be called upon entry of a test case.
+
+        Args:
+            test_record: The TestResultRecord object for the test case going to
+                         be executed.
+        """
+        self._current_record = test_record
         if self.web.enabled:
-            self.web.AddTestReport(test_name)
+            self.web.AddTestReport(test_record.test_name)
 
     def _setUp(self, test_name):
         """Proxy function to guarantee the base implementation of setUp is
@@ -301,9 +349,9 @@
         Implementation is optional.
         """
 
-    def _testExit(self, test_name):
+    def _testExit(self):
         """Internal function to be called upon exit of a test."""
-        self.currentTestName = None
+        self._current_record = None
 
     def _tearDown(self, test_name):
         """Proxy function to guarantee the base implementation of tearDown
@@ -320,21 +368,19 @@
         Implementation is optional.
         """
 
-    def _onFail(self, record):
+    def _onFail(self):
         """Proxy function to guarantee the base implementation of onFail is
         called.
-
-        Args:
-            record: The records.TestResultRecord object for the failed test
-                    case.
         """
-        test_name = record.test_name
+        record = self._current_record
         logging.error(record.details)
         begin_time = logger.epochToLogLineTimestamp(record.begin_time)
-        logging.info(RESULT_LINE_TEMPLATE, test_name, record.result)
+        logging.info(RESULT_LINE_TEMPLATE, record.test_name, record.result)
         if self.web.enabled:
             self.web.SetTestResult(ReportMsg.TEST_CASE_RESULT_FAIL)
-        self.onFail(test_name, begin_time)
+        self.onFail(record.test_name, begin_time)
+        if self._bug_report_on_failure:
+            self.CatchBugReport('%s-%s' % (self.TAG, record.test_name))
 
     def onFail(self, test_name, begin_time):
         """A function that is executed upon a test case failure.
@@ -346,14 +392,11 @@
             begin_time: Logline format timestamp taken when the test started.
         """
 
-    def _onPass(self, record):
+    def _onPass(self):
         """Proxy function to guarantee the base implementation of onPass is
         called.
-
-        Args:
-            record: The records.TestResultRecord object for the passed test
-                    case.
         """
+        record = self._current_record
         test_name = record.test_name
         begin_time = logger.epochToLogLineTimestamp(record.begin_time)
         msg = record.details
@@ -374,14 +417,11 @@
             begin_time: Logline format timestamp taken when the test started.
         """
 
-    def _onSkip(self, record):
+    def _onSkip(self):
         """Proxy function to guarantee the base implementation of onSkip is
         called.
-
-        Args:
-            record: The records.TestResultRecord object for the skipped test
-                    case.
         """
+        record = self._current_record
         test_name = record.test_name
         begin_time = logger.epochToLogLineTimestamp(record.begin_time)
         logging.info(RESULT_LINE_TEMPLATE, test_name, record.result)
@@ -400,14 +440,11 @@
             begin_time: Logline format timestamp taken when the test started.
         """
 
-    def _onSilent(self, record):
+    def _onSilent(self):
         """Proxy function to guarantee the base implementation of onSilent is
         called.
-
-        Args:
-            record: The records.TestResultRecord object for the skipped test
-                    case.
         """
+        record = self._current_record
         test_name = record.test_name
         begin_time = logger.epochToLogLineTimestamp(record.begin_time)
         if self.web.enabled:
@@ -424,20 +461,19 @@
             begin_time: Logline format timestamp taken when the test started.
         """
 
-    def _onException(self, record):
+    def _onException(self):
         """Proxy function to guarantee the base implementation of onException
         is called.
-
-        Args:
-            record: The records.TestResultRecord object for the failed test
-                    case.
         """
+        record = self._current_record
         test_name = record.test_name
         logging.exception(record.details)
         begin_time = logger.epochToLogLineTimestamp(record.begin_time)
         if self.web.enabled:
             self.web.SetTestResult(ReportMsg.TEST_CASE_RESULT_EXCEPTION)
         self.onException(test_name, begin_time)
+        if self._bug_report_on_failure:
+            self.CatchBugReport('%s-%s' % (self.TAG, record.test_name))
 
     def onException(self, test_name, begin_time):
         """A function that is executed upon an unhandled exception from a test
@@ -450,7 +486,7 @@
             begin_time: Logline format timestamp taken when the test started.
         """
 
-    def _exec_procedure_func(self, func, tr_record):
+    def _exec_procedure_func(self, func):
         """Executes a procedure function like onPass, onFail etc.
 
         This function will alternate the 'Result' of the test's record if
@@ -461,42 +497,34 @@
 
         Args:
             func: The procedure function to be executed.
-            tr_record: The TestResultRecord object associated with the test
-                       case executed.
         """
+        record = self._current_record
+        if record is None:
+            logging.error("Cannot execute %s. No record for current test.",
+                          func.__name__)
+            return
         try:
-            func(tr_record)
+            func()
         except signals.TestAbortAll:
             raise
         except Exception as e:
             logging.exception("Exception happened when executing %s for %s.",
-                              func.__name__, self.currentTestName)
-            tr_record.addError(func.__name__, e)
+                              func.__name__, record.test_name)
+            record.addError(func.__name__, e)
 
-    def ExpandFilterBitness(self, input_list):
-        '''Expand filter items with bitness suffix.
+    def addTableToResult(self, name, rows):
+        """Adds a table to current test record.
 
-        If a filter item contains bitness suffix, only test name with that tag will be included
-        in output.
-        Otherwise, both 32bit and 64bit suffix will be paired to the test name in output
-        list.
+        A subclass can call this method to add a table to _current_record when
+        running test cases.
 
         Args:
-            input_list: list of string, the list to expand
+            name: String, the table name.
+            rows: A 2-dimensional list which contains the data.
+        """
+        self._current_record.addTable(name, rows)
 
-        Returns:
-            A list of string
-        '''
-        result = []
-        for item in input_list:
-            result.append(str(item))
-            if (not item.endswith(const.SUFFIX_32BIT) and
-                    not item.endswith(const.SUFFIX_64BIT)):
-                result.append("%s_%s" % (item, const.SUFFIX_32BIT))
-                result.append("%s_%s" % (item, const.SUFFIX_64BIT))
-        return list_utils.DeduplicateKeepOrder(result)
-
-    def filterOneTest(self, test_name):
+    def filterOneTest(self, test_name, test_filter=None):
         """Check test filters for a test name.
 
         The first layer of filter is user defined test filters:
@@ -519,26 +547,43 @@
 
         Args:
             test_name: string, name of a test
+            test_filter: Filter object, test filter
 
         Raises:
             signals.TestSilent if a test should not be executed
             signals.TestSkip if a test should be logged but not be executed
         """
-        if self.include_filter:
-            if test_name not in self.include_filter:
-                msg = "Test case '%s' not in include filter %s." % (
-                    test_name, self.include_filter)
-                logging.info(msg)
-                raise signals.TestSilent(msg)
-        elif test_name in self.exclude_filter:
-            msg = "Test case '%s' in exclude filter %s." % (
-                test_name, self.exclude_filter)
-            logging.info(msg)
-            raise signals.TestSilent(msg)
+        self._filterOneTestThroughTestFilter(test_name, test_filter)
+        self._filterOneTestThroughAbiBitness(test_name)
+
+    def _filterOneTestThroughTestFilter(self, test_name, test_filter=None):
+        """Check test filter for the given test name.
+
+        Args:
+            test_name: string, name of a test
+
+        Raises:
+            signals.TestSilent if a test should not be executed
+            signals.TestSkip if a test should be logged but not be executed
+        """
+        if not test_filter:
+            test_filter = self.test_filter
+
+        if not test_filter.Filter(test_name):
+            raise signals.TestSilent("Test case '%s' did not pass filters.")
 
         if self._skip_all_testcases:
             raise signals.TestSkip("All test cases skipped.")
 
+    def _filterOneTestThroughAbiBitness(self, test_name):
+        """Check test filter for the given test name.
+
+        Args:
+            test_name: string, name of a test
+
+        Raises:
+            signals.TestSilent if a test should not be executed
+        """
         asserts.skipIf(
             self.abi_bitness and
             ((self.skip_on_32bit_abi is True) and self.abi_bitness == "32") or
@@ -568,8 +613,9 @@
         tr_record.testBegin()
         logging.info("%s %s", TEST_CASE_TOKEN, test_name)
         verdict = None
+        finished = False
         try:
-            ret = self._testEntry(test_name)
+            ret = self._testEntry(tr_record)
             asserts.assertTrue(ret is not False,
                                "Setup test entry for %s failed." % test_name)
             self.filterOneTest(test_name)
@@ -582,50 +628,67 @@
                     verdict = test_func(*args, **kwargs)
                 else:
                     verdict = test_func()
+                finished = True
             finally:
                 self._tearDown(test_name)
         except (signals.TestFailure, AssertionError) as e:
             tr_record.testFail(e)
-            self._exec_procedure_func(self._onFail, tr_record)
+            self._exec_procedure_func(self._onFail)
+            finished = True
         except signals.TestSkip as e:
             # Test skipped.
             tr_record.testSkip(e)
-            self._exec_procedure_func(self._onSkip, tr_record)
+            self._exec_procedure_func(self._onSkip)
+            finished = True
         except (signals.TestAbortClass, signals.TestAbortAll) as e:
             # Abort signals, pass along.
             tr_record.testFail(e)
+            finished = True
             raise e
         except signals.TestPass as e:
             # Explicit test pass.
             tr_record.testPass(e)
-            self._exec_procedure_func(self._onPass, tr_record)
+            self._exec_procedure_func(self._onPass)
+            finished = True
         except signals.TestSilent as e:
             # Suppress test reporting.
             is_silenced = True
-            self._exec_procedure_func(self._onSilent, tr_record)
-            self.results.requested.remove(test_name)
+            self._exec_procedure_func(self._onSilent)
+            self.results.removeRecord(tr_record)
+            finished = True
         except Exception as e:
             # Exception happened during test.
             logging.exception(e)
             tr_record.testError(e)
-            self._exec_procedure_func(self._onException, tr_record)
-            self._exec_procedure_func(self._onFail, tr_record)
+            self._exec_procedure_func(self._onException)
+            self._exec_procedure_func(self._onFail)
+            finished = True
         else:
             # Keep supporting return False for now.
             # TODO(angli): Deprecate return False support.
             if verdict or (verdict is None):
                 # Test passed.
                 tr_record.testPass()
-                self._exec_procedure_func(self._onPass, tr_record)
+                self._exec_procedure_func(self._onPass)
                 return
             # Test failed because it didn't return True.
             # This should be removed eventually.
             tr_record.testFail()
-            self._exec_procedure_func(self._onFail, tr_record)
+            self._exec_procedure_func(self._onFail)
+            finished = True
         finally:
+            if not finished:
+                for device in self.android_devices:
+                    device.shell.enabled = False
+
+                logging.error('Test timed out.')
+                tr_record.testError()
+                self._exec_procedure_func(self._onException)
+                self._exec_procedure_func(self._onFail)
+
             if not is_silenced:
                 self.results.addRecord(tr_record)
-            self._testExit(test_name)
+            self._testExit()
 
     def runGeneratedTests(self,
                           test_func,
@@ -671,7 +734,9 @@
                     logging.exception(("Failed to get test name from "
                                        "test_func. Fall back to default %s"),
                                       test_name)
-            self.results.requested.append(test_name)
+
+            tr_record = records.TestResultRecord(test_name, self.TAG)
+            self.results.requested.append(tr_record)
             if len(test_name) > utils.MAX_FILENAME_LEN:
                 test_name = test_name[:utils.MAX_FILENAME_LEN]
             previous_success_cnt = len(self.results.passed)
@@ -778,8 +843,8 @@
                 # No test case specified by user, execute all in the test class
                 test_names = self._get_all_test_names()
         self.results.requested = [
-            test_name for test_name in test_names
-            if test_name.startswith(STR_TEST)
+            records.TestResultRecord(test_name, self.TAG)
+            for test_name in test_names if test_name.startswith(STR_TEST)
         ]
         tests = self._get_test_funcs(test_names)
         # Setup for the class.
@@ -835,3 +900,23 @@
         This function should clean up objects initialized in the constructor by
         user.
         """
+
+    def CatchBugReport(self, prefix=''):
+        """Get device bugreport through adb command.
+
+        Args:
+            prefix: string, file name prefix. Usually in format of
+                    <test_module>-<test_case>
+        """
+        if prefix:
+            prefix = re.sub('[^\w\-_\. ]', '_', prefix) + '_'
+
+        for i in range(len(self.android_devices)):
+            device = self.android_devices[i]
+            bug_report_file_name = prefix + _BUG_REPORT_FILE_PREFIX + str(
+                i) + _BUG_REPORT_FILE_EXTENSION
+            bug_report_file_path = os.path.join(logging.log_path,
+                                                bug_report_file_name)
+
+            logging.info('Catching bugreport %s' % bug_report_file_path)
+            device.adb.bugreport(bug_report_file_path)
diff --git a/runners/host/keys.py b/runners/host/keys.py
index 4782545..e58982e 100644
--- a/runners/host/keys.py
+++ b/runners/host/keys.py
@@ -34,6 +34,7 @@
     # Keys in test suite
     KEY_INCLUDE_FILTER = "include_filter"
     KEY_EXCLUDE_FILTER = "exclude_filter"
+    KEY_EXCLUDE_OVER_INCLUDE = "exclude_over_include"
 
     # Keys for binary tests
     IKEY_BINARY_TEST_SOURCE = "binary_test_source"
@@ -60,6 +61,8 @@
     IKEY_BUILD = "build"
     IKEY_DATA_FILE_PATH = "data_file_path"
 
+    IKEY_BUG_REPORT_ON_FAILURE = "bug_report_on_failure"
+
     # sub fields of test_bed
     IKEY_ANDROID_DEVICE = "AndroidDevice"
     IKEY_PRODUCT_TYPE = "product_type"
diff --git a/runners/host/records.py b/runners/host/records.py
index d1251d2..bdee67a 100644
--- a/runners/host/records.py
+++ b/runners/host/records.py
@@ -17,10 +17,12 @@
 """
 
 import json
+import logging
 import pprint
 
 from vts.runners.host import signals
 from vts.runners.host import utils
+from vts.utils.python.common import list_utils
 
 
 class TestResultEnums(object):
@@ -39,6 +41,7 @@
     RECORD_EXTRAS = "Extras"
     RECORD_EXTRA_ERRORS = "Extra Errors"
     RECORD_DETAILS = "Details"
+    RECORD_TABLES = "Tables"
     TEST_RESULT_PASS = "PASS"
     TEST_RESULT_FAIL = "FAIL"
     TEST_RESULT_SKIP = "SKIP"
@@ -52,10 +55,11 @@
         test_name: A string representing the name of the test case.
         begin_time: Epoch timestamp of when the test case started.
         end_time: Epoch timestamp of when the test case ended.
-        self.uid: Unique identifier of a test case.
-        self.result: Test result, PASS/FAIL/SKIP.
-        self.extras: User defined extra information of the test result.
-        self.details: A string explaining the details of the test case.
+        uid: Unique identifier of a test case.
+        result: Test result, PASS/FAIL/SKIP.
+        extras: User defined extra information of the test result.
+        details: A string explaining the details of the test case.
+        tables: A dict of 2-dimensional lists containing tabular results.
     """
 
     def __init__(self, t_name, t_class=None):
@@ -68,6 +72,7 @@
         self.extras = None
         self.details = None
         self.extra_errors = {}
+        self.tables = {}
 
     def testBegin(self):
         """Call this when the test case it records begins execution.
@@ -143,6 +148,17 @@
         self.result = TestResultEnums.TEST_RESULT_ERROR
         self.extra_errors[tag] = str(e)
 
+    def addTable(self, name, rows):
+        """Add a table as part of the test result.
+
+        Args:
+            name: The table name.
+            rows: A 2-dimensional list which contains the data.
+        """
+        if name in self.tables:
+            logging.warning("Overwrite table %s" % name)
+        self.tables[name] = rows
+
     def __str__(self):
         d = self.getDict()
         l = ["%s = %s" % (k, v) for k, v in d.items()]
@@ -170,6 +186,7 @@
         d[TestResultEnums.RECORD_EXTRAS] = self.extras
         d[TestResultEnums.RECORD_DETAILS] = self.details
         d[TestResultEnums.RECORD_EXTRA_ERRORS] = self.extra_errors
+        d[TestResultEnums.RECORD_TABLES] = self.tables
         return d
 
     def jsonString(self):
@@ -195,8 +212,7 @@
     This class is essentially a container of TestResultRecord objects.
 
     Attributes:
-        self.requested: A list of strings, each is the name of a test requested
-            by user.
+        self.requested: A list of records for tests requested by user.
         self.failed: A list of records for tests failed.
         self.executed: A list of records for tests that were actually executed.
         self.passed: A list of records for tests passed.
@@ -232,6 +248,7 @@
         if not isinstance(r, TestResult):
             raise TypeError("Operand %s of type %s is not a TestResult." %
                             (r, type(r)))
+        r.reportNonExecutedRecord()
         sum_result = TestResult()
         for name in sum_result.__dict__:
             if name.startswith("_test_module"):
@@ -262,8 +279,53 @@
                 setattr(sum_result, name, l_value + r_value)
         return sum_result
 
+    def reportNonExecutedRecord(self):
+        """Check and report any requested tests that did not finish.
+
+        Adds a test record to self.error list iff it is in requested list but not
+        self.executed result list.
+        """
+        for requested in self.requested:
+            found = False
+
+            for executed in self.executed:
+                if (requested.test_name == executed.test_name and
+                        requested.test_class == executed.test_class):
+                    found = True
+                    break
+
+            if not found:
+                requested.testBegin()
+                requested.testError()
+                self.error.append(requested)
+
+    def removeRecord(self, record):
+        """Remove a test record from test results.
+
+        Records will be ed using test_name and test_class attribute.
+        All entries that match the provided record in all result lists will
+        be removed after calling this method.
+
+        Args:
+            record: A test record object to add.
+        """
+        lists = [
+            self.requested, self.failed, self.executed, self.passed,
+            self.skipped, self.error
+        ]
+
+        for l in lists:
+            indexToRemove = []
+            for idx in range(len(l)):
+                if (l[idx].test_name == record.test_name and
+                        l[idx].test_class == record.test_class):
+                    indexToRemove.append(idx)
+
+            for idx in reversed(indexToRemove):
+                del l[idx]
+
     def addRecord(self, record):
-        """Adds a test record to test result.
+        """Adds a test record to test results.
 
         A record is considered executed once it's added to the test result.
 
@@ -328,8 +390,11 @@
         Returns:
             A json-format string representing the test results.
         """
+        records = list_utils.MergeUniqueKeepOrder(
+            self.executed, self.failed, self.passed, self.skipped, self.error)
+        executed = [record.getDict() for record in records]
+
         d = {}
-        executed = [record.getDict() for record in self.executed]
         d["Results"] = executed
         d["Summary"] = self.summaryDict()
         d["TestModule"] = self.testModuleDict()
diff --git a/runners/host/tcp_client/vts_tcp_client.py b/runners/host/tcp_client/vts_tcp_client.py
index 0e99685..03f8fc1 100755
--- a/runners/host/tcp_client/vts_tcp_client.py
+++ b/runners/host/tcp_client/vts_tcp_client.py
@@ -34,15 +34,17 @@
 _DEFAULT_SOCKET_TIMEOUT_SECS = 1800
 _SOCKET_CONN_TIMEOUT_SECS = 60
 _SOCKET_CONN_RETRY_NUMBER = 5
-COMMAND_TYPE_NAME = {1: "LIST_HALS",
-                     2: "SET_HOST_INFO",
-                     101: "CHECK_DRIVER_SERVICE",
-                     102: "LAUNCH_DRIVER_SERVICE",
-                     103: "VTS_AGENT_COMMAND_READ_SPECIFICATION",
-                     201: "LIST_APIS",
-                     202: "CALL_API",
-                     203: "VTS_AGENT_COMMAND_GET_ATTRIBUTE",
-                     301: "VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND"}
+COMMAND_TYPE_NAME = {
+    1: "LIST_HALS",
+    2: "SET_HOST_INFO",
+    101: "CHECK_DRIVER_SERVICE",
+    102: "LAUNCH_DRIVER_SERVICE",
+    103: "VTS_AGENT_COMMAND_READ_SPECIFICATION",
+    201: "LIST_APIS",
+    202: "CALL_API",
+    203: "VTS_AGENT_COMMAND_GET_ATTRIBUTE",
+    301: "VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND"
+}
 
 
 class VtsTcpClient(object):
@@ -59,8 +61,11 @@
         self.channel = None
         self._mode = mode
 
-    def Connect(self, ip=TARGET_IP, command_port=TARGET_PORT,
-                callback_port=None, retry=_SOCKET_CONN_RETRY_NUMBER):
+    def Connect(self,
+                ip=TARGET_IP,
+                command_port=TARGET_PORT,
+                callback_port=None,
+                retry=_SOCKET_CONN_RETRY_NUMBER):
         """Connects to a target device.
 
         Args:
@@ -98,8 +103,8 @@
         self.channel = self.connection.makefile(mode="brw")
 
         if callback_port is not None:
-            self.SendCommand(SysMsg_pb2.SET_HOST_INFO,
-                             callback_port=callback_port)
+            self.SendCommand(
+                SysMsg_pb2.SET_HOST_INFO, callback_port=callback_port)
             resp = self.RecvResponse()
             if (resp.response_code != SysMsg_pb2.SUCCESS):
                 return False
@@ -126,14 +131,20 @@
 
     def CheckDriverService(self, service_name):
         """RPC to CHECK_DRIVER_SERVICE."""
-        self.SendCommand(SysMsg_pb2.CHECK_DRIVER_SERVICE,
-                         service_name=service_name)
+        self.SendCommand(
+            SysMsg_pb2.CHECK_DRIVER_SERVICE, service_name=service_name)
         resp = self.RecvResponse()
         return (resp.response_code == SysMsg_pb2.SUCCESS)
 
-    def LaunchDriverService(self, driver_type, service_name, bits,
-                            file_path=None, target_class=None, target_type=None,
-                            target_version=None, target_package=None,
+    def LaunchDriverService(self,
+                            driver_type,
+                            service_name,
+                            bits,
+                            file_path=None,
+                            target_class=None,
+                            target_type=None,
+                            target_version=None,
+                            target_package=None,
                             target_component_name=None,
                             hw_binder_service_name=None):
         """RPC to LAUNCH_DRIVER_SERVICE."""
@@ -141,20 +152,29 @@
         logging.info("file_path: %s", file_path)
         logging.info("bits: %s", bits)
         logging.info("driver_type: %s", driver_type)
-        self.SendCommand(SysMsg_pb2.LAUNCH_DRIVER_SERVICE,
-                         driver_type=driver_type,
-                         service_name=service_name,
-                         bits=bits,
-                         file_path=file_path,
-                         target_class=target_class,
-                         target_type=target_type,
-                         target_version=target_version,
-                         target_package=target_package,
-                         target_component_name=target_component_name,
-                         hw_binder_service_name=hw_binder_service_name)
+        self.SendCommand(
+            SysMsg_pb2.LAUNCH_DRIVER_SERVICE,
+            driver_type=driver_type,
+            service_name=service_name,
+            bits=bits,
+            file_path=file_path,
+            target_class=target_class,
+            target_type=target_type,
+            target_version=target_version,
+            target_package=target_package,
+            target_component_name=target_component_name,
+            hw_binder_service_name=hw_binder_service_name)
         resp = self.RecvResponse()
         logging.info("resp for LAUNCH_DRIVER_SERVICE: %s", resp)
-        return (resp.response_code == SysMsg_pb2.SUCCESS)
+        if driver_type == SysMsg_pb2.VTS_DRIVER_TYPE_HAL_HIDL \
+                or driver_type == SysMsg_pb2.VTS_DRIVER_TYPE_HAL_CONVENTIONAL \
+                or driver_type == SysMsg_pb2.VTS_DRIVER_TYPE_HAL_LEGACY:
+            if resp.response_code == SysMsg_pb2.SUCCESS:
+                return int(resp.result)
+            else:
+                return -1
+        else:
+            return (resp.response_code == SysMsg_pb2.SUCCESS)
 
     def ListApis(self):
         """RPC to LIST_APIS."""
@@ -182,30 +202,29 @@
         if var_spec_msg.type == CompSpecMsg_pb2.TYPE_SCALAR:
             scalar_type = getattr(var_spec_msg, "scalar_type", "")
             if scalar_type:
-                return getattr(
-                    var_spec_msg.scalar_value, scalar_type)
+                return getattr(var_spec_msg.scalar_value, scalar_type)
         elif var_spec_msg.type == CompSpecMsg_pb2.TYPE_ENUM:
             scalar_type = getattr(var_spec_msg, "scalar_type", "")
             if scalar_type:
-                return getattr(
-                    var_spec_msg.scalar_value, scalar_type)
+                return getattr(var_spec_msg.scalar_value, scalar_type)
             else:
                 return var_spec_msg.scalar_value.int32_t
         elif var_spec_msg.type == CompSpecMsg_pb2.TYPE_STRING:
             if hasattr(var_spec_msg, "string_value"):
-                return getattr(
-                    var_spec_msg.string_value, "message", "")
+                return getattr(var_spec_msg.string_value, "message", "")
             raise errors.VtsMalformedProtoStringError()
         elif var_spec_msg.type == CompSpecMsg_pb2.TYPE_STRUCT:
             result = {}
             index = 1
             for struct_value in var_spec_msg.struct_value:
                 if len(struct_value.name) > 0:
-                    result[struct_value.name] = self.GetPythonDataOfVariableSpecMsg(
-                        struct_value)
+                    result[struct_value.
+                           name] = self.GetPythonDataOfVariableSpecMsg(
+                               struct_value)
                 else:
-                    result["attribute%d" % index] = self.GetPythonDataOfVariableSpecMsg(
-                        struct_value)
+                    result["attribute%d" %
+                           index] = self.GetPythonDataOfVariableSpecMsg(
+                               struct_value)
                 index += 1
             return result
         elif var_spec_msg.type == CompSpecMsg_pb2.TYPE_UNION:
@@ -213,25 +232,28 @@
             index = 1
             for union_value in var_spec_msg.union_value:
                 if len(union_value.name) > 0:
-                    result[union_value.name] = self.GetPythonDataOfVariableSpecMsg(
-                        union_value)
+                    result[union_value.
+                           name] = self.GetPythonDataOfVariableSpecMsg(
+                               union_value)
                 else:
-                    result["attribute%d" % index] = self.GetPythonDataOfVariableSpecMsg(
-                        union_value)
+                    result["attribute%d" %
+                           index] = self.GetPythonDataOfVariableSpecMsg(
+                               union_value)
                 index += 1
             return result
         elif (var_spec_msg.type == CompSpecMsg_pb2.TYPE_VECTOR or
               var_spec_msg.type == CompSpecMsg_pb2.TYPE_ARRAY):
             result = []
             for vector_value in var_spec_msg.vector_value:
-                result.append(self.GetPythonDataOfVariableSpecMsg(vector_value))
+                result.append(
+                    self.GetPythonDataOfVariableSpecMsg(vector_value))
             return result
         elif (var_spec_msg.type == CompSpecMsg_pb2.TYPE_HIDL_INTERFACE):
-            logging.info("Val of hidl interface is not fully supported yet.")
-            return ""
+            logging.debug("var_spec_msg: %s", var_spec_msg)
+            return var_spec_msg
 
-        raise errors.VtsUnsupportedTypeError(
-            "unsupported type %s" % var_spec_msg.type)
+        raise errors.VtsUnsupportedTypeError("unsupported type %s" %
+                                             var_spec_msg.type)
 
     def CallApi(self, arg, caller_uid=None):
         """RPC to CALL_API."""
@@ -252,7 +274,7 @@
                 logging.info("returned a submodule spec")
                 logging.info("spec: %s", result.return_type_submodule_spec)
                 return mirror_object.MirrorObject(
-                     self, result.return_type_submodule_spec, None)
+                    self, result.return_type_submodule_spec, None)
 
             logging.info("result: %s", result.return_type_hidl)
             if len(result.return_type_hidl) == 1:
@@ -261,8 +283,8 @@
             elif len(result.return_type_hidl) > 1:
                 result_value = []
                 for return_type_hidl in result.return_type_hidl:
-                    result_value.append(self.GetPythonDataOfVariableSpecMsg(
-                        return_type_hidl))
+                    result_value.append(
+                        self.GetPythonDataOfVariableSpecMsg(return_type_hidl))
             else:  # For non-HIDL return value
                 if hasattr(result, "return_type"):
                     result_value = result
@@ -297,9 +319,8 @@
             if result.return_type.type == CompSpecMsg_pb2.TYPE_SUBMODULE:
                 logging.info("returned a submodule spec")
                 logging.info("spec: %s", result.return_type_submodule_spec)
-                return mirror_object.MirrorObject(self,
-                                           result.return_type_submodule_spec,
-                                           None)
+                return mirror_object.MirrorObject(
+                    self, result.return_type_submodule_spec, None)
             elif result.return_type.type == CompSpecMsg_pb2.TYPE_SCALAR:
                 return getattr(result.return_type.scalar_value,
                                result.return_type.scalar_type)
@@ -309,8 +330,43 @@
         raise errors.VtsTcpCommunicationError(
             "RPC Error, response code for %s is %s" % (arg, resp_code))
 
-    def ExecuteShellCommand(self, command):
-        """RPC to VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND."""
+    def ExecuteShellCommand(self, command, no_except=False):
+        """RPC to VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND.
+
+        Args:
+            command: string or list of string, command to execute on device
+            no_except: bool, whether to throw exceptions. If set to True,
+                       when exception happens, return code will be -1 and
+                       str(err) will be in stderr. Result will maintain the
+                       same length as with input command.
+
+        Returns:
+            dictionary of list, command results that contains stdout,
+            stderr, and exit_code.
+        """
+        if not no_except:
+            return self.__ExecuteShellCommand(command)
+
+        try:
+            return self.__ExecuteShellCommand(command)
+        except Exception as e:
+            logging.exception(e)
+            return {
+                const.STDOUT: [""] * len(command),
+                const.STDERR: [str(e)] * len(command),
+                const.EXIT_CODE: [-1] * len(command)
+            }
+
+    def __ExecuteShellCommand(self, command):
+        """RPC to VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND.
+
+        Args:
+            command: string or list of string, command to execute on device
+
+        Returns:
+            dictionary of list, command results that contains stdout,
+            stderr, and exit_code.
+        """
         self.SendCommand(
             SysMsg_pb2.VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND,
             shell_command=command)
@@ -325,16 +381,18 @@
         if not resp:
             logging.error("resp is: %s.", resp)
         elif resp.response_code != SysMsg_pb2.SUCCESS:
-            logging.error("resp response code is not success: %s.", resp.response_code)
+            logging.error("resp response code is not success: %s.",
+                          resp.response_code)
         else:
             stdout = resp.stdout
             stderr = resp.stderr
             exit_code = resp.exit_code
 
-        return {const.STDOUT: stdout,
-                const.STDERR: stderr,
-                const.EXIT_CODE: exit_code,
-                }
+        return {
+            const.STDOUT: stdout,
+            const.STDERR: stderr,
+            const.EXIT_CODE: exit_code
+        }
 
     def Ping(self):
         """RPC to send a PING request.
@@ -349,8 +407,13 @@
             return True
         return False
 
-    def ReadSpecification(self, interface_name, target_class, target_type,
-                          target_version, target_package, recursive = False):
+    def ReadSpecification(self,
+                          interface_name,
+                          target_class,
+                          target_type,
+                          target_version,
+                          target_package,
+                          recursive=False):
         """RPC to VTS_AGENT_COMMAND_READ_SPECIFICATION.
 
         Args:
@@ -368,8 +431,7 @@
         resp = self.RecvResponse(retries=2)
         logging.info("resp for VTS_AGENT_COMMAND_EXECUTE_READ_INTERFACE: %s",
                      resp)
-        logging.info("proto: %s",
-                     resp.result)
+        logging.info("proto: %s", resp.result)
         result = CompSpecMsg_pb2.ComponentSpecificationMessage()
         if resp.result == "error":
             raise errors.VtsTcpCommunicationError(
@@ -382,11 +444,15 @@
 
         if recursive and hasattr(result, "import"):
             for imported_interface in getattr(result, "import"):
+                if imported_interface == "android.hidl.base@1.0::types":
+                    logging.warn("import android.hidl.base@1.0::types skipped")
+                    continue
                 imported_result = self.ReadSpecification(
                     imported_interface.split("::")[1],
                     # TODO(yim): derive target_class and
                     # target_type from package path or remove them
-                    msg.component_class if target_class is None else target_class,
+                    msg.component_class
+                    if target_class is None else target_class,
                     msg.component_type if target_type is None else target_type,
                     float(imported_interface.split("@")[1].split("::")[0]),
                     imported_interface.split("@")[0])
@@ -506,8 +572,8 @@
                 data = self.channel.read(length)
                 response_msg = SysMsg_pb2.AndroidSystemControlResponseMessage()
                 response_msg.ParseFromString(data)
-                logging.debug("Response %s", "success"
-                              if response_msg.response_code == SysMsg_pb2.SUCCESS
+                logging.debug("Response %s", "success" if
+                              response_msg.response_code == SysMsg_pb2.SUCCESS
                               else "fail")
                 return response_msg
             except socket.timeout as e:
diff --git a/runners/host/test_runner.py b/runners/host/test_runner.py
index 0d0048d..907222c 100644
--- a/runners/host/test_runner.py
+++ b/runners/host/test_runner.py
@@ -96,6 +96,9 @@
         except IndexError:
             logging.error("No valid config file found.")
             sys.exit(1)
+        except Exception as e:
+            logging.error("Unexpected exception")
+            logging.exception(e)
 
     test_identifiers = [(test_cls_name, None)]
 
@@ -121,6 +124,9 @@
             tr.runTestClass(test_class, None)
         except KeyboardInterrupt as e:
             logging.exception("Aborted by timeout or ctrl+C: %s", e)
+        except Exception as e:
+            logging.error("Unexpected exception")
+            logging.exception(e)
         finally:
             sig_timer.cancel()
             tr.stop()
@@ -137,24 +143,26 @@
     report results.
 
     Attributes:
-        self.test_run_info: A dictionary containing the information needed by
-                            test classes for this test run, including params,
-                            controllers, and other objects. All of these will
-                            be passed to test classes.
-        self.test_configs: A dictionary that is the original test configuration
-                           passed in by user.
-        self.id: A string that is the unique identifier of this test run.
-        self.log_path: A string representing the path of the dir under which
-                       all logs from this test run should be written.
-        self.controller_registry: A dictionary that holds the controller
-                                  objects used in a test run.
-        self.controller_destructors: A dictionary that holds the controller
-                                     distructors. Keys are controllers' names.
-        self.run_list: A list of tuples specifying what tests to run.
-        self.results: The test result object used to record the results of
-                      this test run.
-        self.running: A boolean signifies whether this test run is ongoing or
-                      not.
+        test_run_info: A dictionary containing the information needed by
+                       test classes for this test run, including params,
+                       controllers, and other objects. All of these will
+                       be passed to test classes.
+        test_configs: A dictionary that is the original test configuration
+                      passed in by user.
+        id: A string that is the unique identifier of this test run.
+        log_path: A string representing the path of the dir under which
+                  all logs from this test run should be written.
+        controller_registry: A dictionary that holds the controller
+                             objects used in a test run.
+        controller_destructors: A dictionary that holds the controller
+                                distructors. Keys are controllers' names.
+        run_list: A list of tuples specifying what tests to run.
+        results: The test result object used to record the results of
+                 this test run.
+        running: A boolean signifies whether this test run is ongoing or
+                 not.
+        test_cls_instances: list of test class instances that were executed
+                            or scheduled to be executed.
     """
 
     def __init__(self, test_configs, run_list):
@@ -177,6 +185,7 @@
         self.run_list = run_list
         self.results = records.TestResult()
         self.running = False
+        self.test_cls_instances = []
 
     def __enter__(self):
         return self
@@ -315,8 +324,8 @@
             raise ControllerError(("Controller module %s did not return a list"
                                    " of objects, abort.") % module_ref_name)
         self.controller_registry[module_ref_name] = objects
-        logging.debug("Found %d objects for controller %s", len(objects),
-                      module_config_name)
+        logging.debug("Found %d objects for controller %s",
+                      len(objects), module_config_name)
         destroy_func = module.destroy
         self.controller_destructors[module_ref_name] = destroy_func
         return objects
@@ -373,10 +382,10 @@
         self.running = True
         with test_cls(self.test_run_info) as test_cls_instance:
             try:
+                if test_cls_instance not in self.test_cls_instances:
+                    self.test_cls_instances.append(test_cls_instance)
                 cls_result = test_cls_instance.run(test_cases)
-                self.results += cls_result
             except signals.TestAbortAll as e:
-                self.results += e.results
                 raise e
 
     def run(self):
@@ -423,6 +432,9 @@
                         ("Abort all subsequent test classes. Reason: "
                          "%s"), e)
                     raise
+        except Exception as e:
+            logging.error("Unexpected exception")
+            logging.exception(e)
         finally:
             self.unregisterControllers()
 
@@ -433,6 +445,10 @@
         This function concludes a test run and writes out a test report.
         """
         if self.running:
+
+            for test_cls_instance in self.test_cls_instances:
+                self.results += test_cls_instance.results
+
             msg = "\nSummary for test run %s: %s\n" % (self.id,
                                                        self.results.summary())
             self._writeResultsJsonString()
diff --git a/runners/target/vts_hal_hidl_target/Android.bp b/runners/target/vts_hal_hidl_target/Android.bp
index c570060..8fa0675 100644
--- a/runners/target/vts_hal_hidl_target/Android.bp
+++ b/runners/target/vts_hal_hidl_target/Android.bp
@@ -18,7 +18,8 @@
     name: "VtsHalHidlTargetTestBase",
     srcs : [
         "VtsHalHidlTargetTestBase.cpp",
-        "VtsHalHidlTargetCallbackBase.cpp"
+        "VtsHalHidlTargetCallbackBase.cpp",
+        "VtsHalHidlTargetTestEnvBase.cpp"
     ],
 
     shared_libs: [
diff --git a/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestBase.cpp b/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestBase.cpp
index 6755719..f07026e 100644
--- a/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestBase.cpp
+++ b/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestBase.cpp
@@ -22,7 +22,7 @@
 
 namespace testing {
 
-std::string VtsHalHidlTargetTestBase::PropertyGet(const char* name) {
+string VtsHalHidlTargetTestBase::PropertyGet(const char* name) {
   char value[PROP_VALUE_MAX] = {0};
   __system_property_get(name, value);
   return value;
diff --git a/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestBase.h b/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestBase.h
index 6eca94b..2be71c3 100644
--- a/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestBase.h
+++ b/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestBase.h
@@ -21,6 +21,7 @@
 #include <hidl/HidlSupport.h>
 #include <utils/Log.h>
 #include <utils/RefBase.h>
+#include <VtsHalHidlTargetTestEnvBase.h>
 
 #define VTS_HAL_HIDL_GET_STUB "VTS_HAL_HIDL_GET_STUB"
 
@@ -107,7 +108,17 @@
     return T::getService(serviceName, VtsHalHidlTargetTestBase::VtsGetStub());
   }
 
- private:
+  /*
+   * Call interface's getService with the service name stored in the test
+   * environment and use passthrough mode if set from host.
+   */
+  template <class T>
+  static sp <T> getService(VtsHalHidlTargetTestEnvBase* testEnv) {
+    return T::getService(testEnv->getServiceName<T>(),
+                         VtsHalHidlTargetTestBase::VtsGetStub());
+  }
+
+private:
   /*
    * Decide bool val for getStub option. Will read environment variable set
    * from host. If environment variable is not set, return will default to
diff --git a/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestEnvBase.cpp b/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestEnvBase.cpp
new file mode 100644
index 0000000..dbef84f
--- /dev/null
+++ b/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestEnvBase.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "VtsHalHidlTargetTestEnvBase"
+
+#include "VtsHalHidlTargetTestEnvBase.h"
+
+#include <string>
+
+#include <utils/Log.h>
+
+static constexpr const char* kListFlag = "--list_registered_services";
+static constexpr const char* kServceInstanceFlag = "--hal_service_instance";
+
+using namespace std;
+
+namespace testing {
+
+void VtsHalHidlTargetTestEnvBase::SetUp() {
+  if (!inited_) {
+    ALOGE("Environment not inited, did you forget to call init()?");
+    abort();
+  }
+  // Register services used in the test.
+  registerTestServices();
+  // For a dummy run which just print the registered hal services.
+  if (listService_) {
+    listRegisteredServices();
+    exit(0);
+  }
+  // Call the customized setup process.
+  HidlSetUp();
+}
+
+void VtsHalHidlTargetTestEnvBase::TearDown() {
+  // Call the customized teardown process.
+  HidlTearDown();
+}
+
+void VtsHalHidlTargetTestEnvBase::init(int* argc, char** argv) {
+  if (inited_) return;
+  for (int i = 1; i < *argc; i++) {
+    if (parseVtsTestOption(argv[i])) {
+      // Shift the remainder of the argv list left by one.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed an element.
+      i--;
+    }
+  }
+  inited_ = true;
+}
+
+bool VtsHalHidlTargetTestEnvBase::parseVtsTestOption(const char* arg) {
+  // str and flag must not be NULL.
+  if (arg == NULL) return false;
+
+  if (strncmp(arg, kListFlag, strlen(kListFlag)) == 0) {
+    listService_ = true;
+    return true;
+  }
+
+  if (strncmp(arg, kServceInstanceFlag, strlen(kServceInstanceFlag)) == 0) {
+    // value is the past after "--hal_service_instance="
+    const char* value = arg + strlen(kServceInstanceFlag) + 1;
+    addHalServiceInstance(string(value));
+    return true;
+  }
+  return false;
+}
+
+void VtsHalHidlTargetTestEnvBase::addHalServiceInstance(
+    string halServiceInstance) {
+  // hal_service_instance follows the format:
+  // package@version::interface/service_name e.g.:
+  // android.hardware.vibrator@1.0::IVibrator/default
+  string instance_name =
+      halServiceInstance.substr(0, halServiceInstance.find('/'));
+  string service_name =
+      halServiceInstance.substr(halServiceInstance.find('/') + 1);
+  // Fail the process if trying to pass multiple service names for the same
+  // service instance.
+  if (halServiceInstances_.find(instance_name) != halServiceInstances_.end()) {
+    ALOGE("Exisitng instance %s with name %s", instance_name.c_str(),
+          halServiceInstances_[instance_name].c_str());
+    abort();
+  }
+  halServiceInstances_[instance_name] = service_name;
+}
+
+string VtsHalHidlTargetTestEnvBase::getServiceName(string instanceName) {
+  if (halServiceInstances_.find(instanceName) != halServiceInstances_.end()) {
+    return halServiceInstances_[instanceName];
+  }
+  // Could not find the instance.
+  return "";
+}
+
+void VtsHalHidlTargetTestEnvBase::registerTestService(string FQName) {
+  registeredHalServices_.insert(FQName);
+}
+
+void VtsHalHidlTargetTestEnvBase::listRegisteredServices() {
+  for (string service : registeredHalServices_) {
+    printf("hal_service: %s\n", service.c_str());
+  }
+}
+
+}  // namespace testing
diff --git a/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestEnvBase.h b/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestEnvBase.h
new file mode 100644
index 0000000..4333195
--- /dev/null
+++ b/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestEnvBase.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __VTS_HAL_HIDL_TARGET_TEST_ENV_BASE_H
+#define __VTS_HAL_HIDL_TARGET_TEST_ENV_BASE_H
+
+#include <gtest/gtest.h>
+
+using namespace std;
+
+namespace testing {
+
+// A class for test environment setup
+class VtsHalHidlTargetTestEnvBase : public ::testing::Environment {
+ public:
+  VtsHalHidlTargetTestEnvBase() {}
+
+  /*
+   * SetUp process, should not be overridden by the test.
+   */
+  void SetUp() final;
+
+  /*
+   * TearDown process, should not be overridden by the test.
+   */
+  void TearDown() final;
+
+  /*
+   * Test should override this method for any custom setup process.
+   */
+  virtual void HidlSetUp() {}
+
+  /*
+   * Test should override this method for any custom teardown process.
+   */
+  virtual void HidlTearDown() {}
+
+  /*
+   * Test should override this method to register hal services used in the test.
+   */
+  virtual void registerTestServices() {}
+
+  /* Parses the command line argument, extracts the vts reserved flags and
+   * leaves other options untouched.
+   * Must be called when the test environment is created is registered.
+   */
+  void init(int* argc, char** argv);
+
+  /*
+   * Adds a hal sevice identified into registeredHalServices_.
+   */
+  template <class T>
+  void registerTestService() {
+    registerTestService(T::descriptor);
+  }
+
+  /*
+   * Gets the service name for a hal instance. Returns empty string if the hal
+   * instance is unkonwn (not in hal_instances_).
+   */
+  template <class T>
+  string getServiceName() {
+    return getServiceName(T::descriptor);
+  }
+
+ private:
+  /*
+   * Parses VTS specific flags, currently support two flags:
+   * --list_registered_services to print all registered service.
+   * --hal_service_instance to pass a running service instance. e.g.
+   * --hal_service_instance=android.hardware.vibrator@1.0::IVibrator/default
+   * It is possible to have mulitple --hal_service_instance options passed if
+   * mutliple hal service is used in the test.
+   * Returns true if successfully pased the given arg, false if arg is null or
+   * unknown flag.
+   */
+  bool parseVtsTestOption(const char* arg);
+
+  /*
+   * Prints all registered sercives.
+   */
+  void listRegisteredServices();
+
+  /*
+   * Internal method to get the service name for a hal instance.
+   */
+  string getServiceName(string instanceName);
+
+  /*
+   * Internal method to register a HAL sevice identified with the FQName.
+   */
+  void registerTestService(string FQName);
+
+  /*
+   * Internal method to add a hal service instance.
+   */
+  void addHalServiceInstance(string halServiceInstance);
+
+  // Map of hal instances with their correpoding service names.
+  map<string, string> halServiceInstances_;
+  // Set of all hal services used in the test.
+  set<string> registeredHalServices_;
+  // Flag to print registered hal services and exit the process.
+  bool listService_ = false;
+  // Flag whether init is called.
+  bool inited_ = false;
+};
+
+}  // namespace testing
+
+#endif  // __VTS_HAL_HIDL_TARGET_TEST_ENV_BASE_H
diff --git a/script/build-java.sh b/script/build-java.sh
index b7c5faa..2fd6378 100755
--- a/script/build-java.sh
+++ b/script/build-java.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,7 +14,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-pushd ${ANDROID_BUILD_TOP}/test/vts
-protoc -I=proto --java_out=web/dashboard/src/main/java proto/VtsReportMessage.proto
+pushd ${ANDROID_BUILD_TOP}/test
+protoc --proto_path=vts --java_out=vti/dashboard/src/main/java vts/proto/VtsReportMessage.proto
 popd
-
diff --git a/script/build-python.sh b/script/build-python.sh
index b6f8b30..f0ea2af 100755
--- a/script/build-python.sh
+++ b/script/build-python.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/script/create-image.sh b/script/create-image.sh
index 1b8c047..9f4d0f2 100755
--- a/script/create-image.sh
+++ b/script/create-image.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/script/create-test-project.py b/script/create-test-project.py
index 98cad8f..471dbe0 100755
--- a/script/create-test-project.py
+++ b/script/create-test-project.py
@@ -150,9 +150,7 @@
         target = os.path.join(self.test_dir, ANDROID_MK_FILE_NAME)
         with open(target, 'w') as f:
             print 'Creating %s' % target
-            f.write(
-                LICENSE_STATEMENT_POUND.format(
-                    year=self.current_year))
+            f.write(LICENSE_STATEMENT_POUND.format(year=self.current_year))
             f.write('\n')
             f.write(
                 ANDROID_MK_TEMPLATE.format(
@@ -166,8 +164,7 @@
                 print 'Creating %s' % target
                 with open(target, 'w') as f:
                     f.write(
-                        LICENSE_STATEMENT_POUND.format(
-                            year=self.current_year))
+                        LICENSE_STATEMENT_POUND.format(year=self.current_year))
                     f.write(ANDROID_MK_CALL_SUB)
             path = os.path.dirname(path)
 
@@ -177,14 +174,13 @@
         with open(target, 'w') as f:
             print 'Creating %s' % target
             f.write(XML_HEADER)
-            f.write(
-                LICENSE_STATEMENT_XML.format(year=self.current_year))
+            f.write(LICENSE_STATEMENT_XML.format(year=self.current_year))
             f.write(
                 ANDROID_TEST_XML_TEMPLATE.format(
                     test_name=self.test_name,
                     test_type=self.test_type,
-                    test_path_under_vts=self.test_dir[len(
-                        os.path.join(self.build_top, VTS_PATH)) + 1:],
+                    test_path_under_vts=self.test_dir[
+                        len(os.path.join(self.build_top, VTS_PATH)) + 1:],
                     test_case_file_without_extension=self.test_name))
 
     def CreateTestCasePy(self):
@@ -193,13 +189,9 @@
         with open(target, 'w') as f:
             print 'Creating %s' % target
             f.write(PY_HEADER)
-            f.write(
-                LICENSE_STATEMENT_POUND.format(
-                    year=self.current_year))
+            f.write(LICENSE_STATEMENT_POUND.format(year=self.current_year))
             f.write('\n')
-            f.write(
-                TEST_CASE_PY_TEMPLATE.format(
-                    test_name=self.test_name))
+            f.write(TEST_CASE_PY_TEMPLATE.format(test_name=self.test_name))
 
 
 def main():
@@ -300,28 +292,26 @@
 from vts.runners.host import base_test
 from vts.runners.host import const
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
+
 
 
 class {test_name}(base_test.BaseTestClass):
     """Two hello world test cases which use the shell driver."""
 
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
+        self.dut = self.android_devices[0]
+        self.shell = self.dut.shell
 
     def testEcho1(self):
         """A simple testcase which sends a command."""
-        self.dut.shell.InvokeTerminal("my_shell1")  # creates a remote shell instance.
-        results = self.dut.shell.my_shell1.Execute("echo hello_world")  # runs a shell command.
+        results = self.shell.Execute("echo hello_world")  # runs a shell command.
         logging.info(str(results[const.STDOUT]))  # prints the stdout
         asserts.assertEqual(results[const.STDOUT][0].strip(), "hello_world")  # checks the stdout
         asserts.assertEqual(results[const.EXIT_CODE][0], 0)  # checks the exit code
 
     def testEcho2(self):
         """A simple testcase which sends two commands."""
-        self.dut.shell.InvokeTerminal("my_shell2")
-        my_shell = getattr(self.dut.shell, "my_shell2")
-        results = my_shell.Execute(["echo hello", "echo world"])
+        results = self.shell.Execute(["echo hello", "echo world"])
         logging.info(str(results[const.STDOUT]))
         asserts.assertEqual(len(results[const.STDOUT]), 2)  # check the number of processed commands
         asserts.assertEqual(results[const.STDOUT][0].strip(), "hello")
diff --git a/script/download-pypi-packages.sh b/script/download-pypi-packages.sh
index 3e22d96..8c3c938 100644
--- a/script/download-pypi-packages.sh
+++ b/script/download-pypi-packages.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/script/pypi-packages-local.sh b/script/pypi-packages-local.sh
new file mode 100644
index 0000000..d9a112f
--- /dev/null
+++ b/script/pypi-packages-local.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+if [ -z "$ANDROID_BUILD_TOP" ]; then
+  echo "Please run the lunch command first."
+else
+  echo "Downloading PyPI packages"
+  sudo pip install -r $ANDROID_BUILD_TOP/test/vts/script/pip_requirements.txt
+  sudo pip install matplotlib # TODO(jaeshin): b/38371975, downloaded separately in download-pypi-packages.sh
+fi
diff --git a/script/run-gce.sh b/script/run-gce.sh
index 161e9d7..a52c59d 100755
--- a/script/run-gce.sh
+++ b/script/run-gce.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/script/run-local.sh b/script/run-local.sh
index 53d0667..5b331c8 100755
--- a/script/run-local.sh
+++ b/script/run-local.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/script/run-unittest.sh b/script/run-unittest.sh
index 6a314a4..8f81c25 100755
--- a/script/run-unittest.sh
+++ b/script/run-unittest.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/script/run_cts_with_profiling.sh b/script/run_cts_with_profiling.sh
index 8c886e8..d64158c 100755
--- a/script/run_cts_with_profiling.sh
+++ b/script/run_cts_with_profiling.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/script/setup-gce.sh b/script/setup-gce.sh
index 5a2089e..8c64de2 100755
--- a/script/setup-gce.sh
+++ b/script/setup-gce.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,8 +15,8 @@
 # limitations under the License.
 
 adb root
-adb push ${ANDROID_BUILD_TOP}/out/target/product/gce_x86/system/bin/fuzzer /data/local/tmp/fuzzer
+adb push ${ANDROID_BUILD_TOP}/out/target/product/gce_x86/system/bin/vts_hal_driver /data/local/tmp/vts_hal_driver
 adb push ${ANDROID_BUILD_TOP}/out/target/product/gce_x86/system/bin/vts_hal_agent /data/local/tmp/vts_hal_agent
-adb shell chmod 755 /data/local/tmp/fuzzer
+adb shell chmod 755 /data/local/tmp/vts_hal_driver
 adb shell chmod 755 /data/local/tmp/vts_hal_agent
 adb shell /data/local/tmp/vts_hal_agent
diff --git a/script/setup-local.sh b/script/setup-local.sh
index 04aa251..ee4cda4 100755
--- a/script/setup-local.sh
+++ b/script/setup-local.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -21,8 +21,8 @@
   adb root
   adb shell mkdir -p /data/local/tmp/32
   adb shell mkdir -p /data/local/tmp/64
-  adb push ${ANDROID_BUILD_TOP}/out/target/product/${DEVICE}/system/bin/fuzzer32 /data/local/tmp/32/
-  adb push ${ANDROID_BUILD_TOP}/out/target/product/${DEVICE}/system/bin/fuzzer64 /data/local/tmp/64/
+  adb push ${ANDROID_BUILD_TOP}/out/target/product/${DEVICE}/system/bin/vts_hal_driver32 /data/local/tmp/32/
+  adb push ${ANDROID_BUILD_TOP}/out/target/product/${DEVICE}/system/bin/vts_hal_driver64 /data/local/tmp/64/
   adb push ${ANDROID_BUILD_TOP}/out/target/product/${DEVICE}/system/bin/vts_shell_driver32 /data/local/tmp/32/
   adb push ${ANDROID_BUILD_TOP}/out/target/product/${DEVICE}/system/bin/vts_shell_driver64 /data/local/tmp/64/
   adb push ${ANDROID_BUILD_TOP}/out/target/product/${DEVICE}/system/bin/vts_hal_agent32 /data/local/tmp/32/
@@ -93,8 +93,8 @@
   # asan
   adb push ${ANDROID_BUILD_TOP}/prebuilts/clang/host/linux-x86/clang-2812033/lib64/clang/3.8/lib/linux/libclang_rt.asan-aarch64-android.so /data/local/tmp/libclang_rt.asan-aarch64-android.so
 
-  adb shell chmod 755 /data/local/tmp/32/fuzzer32
-  adb shell chmod 755 /data/local/tmp/64/fuzzer64
+  adb shell chmod 755 /data/local/tmp/32/vts_hal_driver32
+  adb shell chmod 755 /data/local/tmp/64/vts_hal_driver64
   adb shell chmod 755 /data/local/tmp/32/vts_shell_driver32
   adb shell chmod 755 /data/local/tmp/64/vts_shell_driver64
   adb shell chmod 755 /data/local/tmp/32/vts_hal_agent32
diff --git a/script/setup.sh b/script/setup.sh
index d9a1555..7ca29e8 100755
--- a/script/setup.sh
+++ b/script/setup.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2016 Google Inc. All Rights Reserved.
+# Copyright 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -28,27 +28,7 @@
 sudo apt-get -y install python3-pip
 sudo apt-get -y install python-virtualenv
 
-echo "Install Python modules for VTS Runner"
-sudo pip install future
-sudo pip install futures
-sudo pip install enum
-sudo pip install protobuf
-sudo pip install setuptools
-sudo pip install requests
-sudo pip install httplib2
-sudo pip install oauth2client
-sudo pip install google-api-python-client
-sudo pip install google-cloud-pubsub
-
-echo "Install packages for Kernel tests"
-sudo pip install parse
-sudo pip install ply
-
 echo "Install packages for Camera ITS tests"
 sudo apt-get -y install python-tk
-sudo pip install numpy
-sudo pip install scipy
-sudo pip install matplotlib
 sudo apt-get -y install libjpeg-dev
 sudo apt-get -y install libtiff-dev
-sudo pip install Pillow
diff --git a/script/start-agent.sh b/script/start-agent.sh
index 47fe7b8..01ccb80 100755
--- a/script/start-agent.sh
+++ b/script/start-agent.sh
@@ -1,14 +1,14 @@
 #!/bin/bash
 adb shell chmod 755 /data/local/tmp/32/vts_shell_driver32
 adb shell chmod 755 /data/local/tmp/64/vts_shell_driver64
-adb shell killall fuzzer32 > /dev/null 2&>1
-adb shell killall fuzzer64 > /dev/null 2&>1
+adb shell killall vts_hal_driver32 > /dev/null 2&>1
+adb shell killall vts_hal_driver64 > /dev/null 2&>1
 adb shell killall vts_shell_driver32 > /dev/null 2&>1
 adb shell killall vts_shell_driver64 > /dev/null 2&>1
 adb shell rm -f /data/local/tmp/vts_driver_*
 adb shell rm -f /data/local/tmp/vts_agent_callback*
-adb shell LD_LIBRARY_PATH=/data/local/tmp/64 /data/local/tmp/64/vts_hal_agent64 /data/local/tmp/32/fuzzer32 /data/local/tmp/64/fuzzer64 /data/local/tmp/spec /data/local/tmp/32/vts_shell_driver32 /data/local/tmp/64/vts_shell_driver64
+adb shell LD_LIBRARY_PATH=/data/local/tmp/64 /data/local/tmp/64/vts_hal_agent64 /data/local/tmp/32/vts_hal_driver32 /data/local/tmp/64/vts_hal_driver64 /data/local/tmp/spec /data/local/tmp/32/vts_shell_driver32 /data/local/tmp/64/vts_shell_driver64
 # to run using nohup
 # adb shell LD_LIBRARY_PATH=/data/local/tmp nohup /data/local/tmp/vts_hal_agent
-# /data/local/tmp/fuzzer32 /data/local/tmp/fuzzer64 /data/local/tmp/spec
+# /data/local/tmp/vts_hal_driver32 /data/local/tmp/vts_hal_driver64 /data/local/tmp/spec
 # ASAN_OPTIONS=coverage=1 for ASAN
diff --git a/specification/Android.mk b/specification/Android.mk
index 8241a96..7bcd075 100644
--- a/specification/Android.mk
+++ b/specification/Android.mk
@@ -60,6 +60,7 @@
   libprotobuf-cpp-full \
 
 vtslib_interfacespec_static_libraries := \
+  libbluetooth-types
 
 include $(CLEAR_VARS)
 
diff --git a/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1bt_interface_t.vts b/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1bt_interface_t.vts
index ee4b7ab..c2c694b 100644
--- a/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1bt_interface_t.vts
+++ b/specification/hal/conventional/bluetooth/1.0/BluetoothHalV1bt_interface_t.vts
@@ -58,7 +58,7 @@
       }
       arg: {
         type: TYPE_PREDEFINED
-        predefined_type: "bt_bdaddr_t*"
+        predefined_type: "RawAddress*"
       }
       arg: {
         type: TYPE_SCALAR
@@ -94,7 +94,7 @@
       function_name: "pin_request_cb"
       arg: {
         type: TYPE_PREDEFINED
-        predefined_type: "bt_bdaddr_t*"
+        predefined_type: "RawAddress*"
       }
       arg: {
         type: TYPE_PREDEFINED
@@ -114,7 +114,7 @@
       function_name: "ssp_request_cb"
       arg: {
         type: TYPE_PREDEFINED
-        predefined_type: "bt_bdaddr_t*"
+        predefined_type: "RawAddress*"
       }
       arg: {
         type: TYPE_PREDEFINED
@@ -142,7 +142,7 @@
       }
       arg: {
         type: TYPE_PREDEFINED
-        predefined_type: "bt_bdaddr_t*"
+        predefined_type: "RawAddress*"
       }
       arg: {
         type: TYPE_PREDEFINED
@@ -158,7 +158,7 @@
       }
       arg: {
         type: TYPE_PREDEFINED
-        predefined_type: "bt_bdaddr_t*"
+        predefined_type: "RawAddress*"
       }
       arg: {
         type: TYPE_PREDEFINED
diff --git a/testcases/codelab/hello_world/VtsCodelabHelloWorldTest.py b/testcases/codelab/hello_world/VtsCodelabHelloWorldTest.py
index b5a6af2..58dc0e5 100644
--- a/testcases/codelab/hello_world/VtsCodelabHelloWorldTest.py
+++ b/testcases/codelab/hello_world/VtsCodelabHelloWorldTest.py
@@ -32,19 +32,20 @@
 
     def testEcho1(self):
         """A simple testcase which sends a command."""
-        results = self.shell.Execute("echo hello_world")  # runs a shell command.
+        results = self.shell.Execute(
+            "echo hello_world")  # runs a shell command.
         logging.info(str(results[const.STDOUT]))  # prints the stdout
-        asserts.assertEqual(results[const.STDOUT][0].strip(), "hello_world")  # checks the stdout
-        asserts.assertEqual(results[const.EXIT_CODE][0], 0)  # checks the exit code
+        asserts.assertEqual(results[const.STDOUT][0].strip(),
+                            "hello_world")  # checks the stdout
+        asserts.assertEqual(results[const.EXIT_CODE][0],
+                            0)  # checks the exit code
 
     def testEcho2(self):
         """A simple testcase which sends two commands."""
-        terminal_session_name = "my_shell2"
-        self.dut.shell.InvokeTerminal(terminal_session_name)
-        my_shell = getattr(self.dut.shell, terminal_session_name)
-        results = my_shell.Execute(["echo hello", "echo world"])
+        results = self.shell.Execute(["echo hello", "echo world"])
         logging.info(str(results[const.STDOUT]))
-        asserts.assertEqual(len(results[const.STDOUT]), 2)  # check the number of processed commands
+        asserts.assertEqual(len(results[const.STDOUT]),
+                            2)  # check the number of processed commands
         asserts.assertEqual(results[const.STDOUT][0].strip(), "hello")
         asserts.assertEqual(results[const.STDOUT][1].strip(), "world")
         asserts.assertEqual(results[const.EXIT_CODE][0], 0)
diff --git a/testcases/framework_test/SampleSl4aTest.py b/testcases/framework_test/SampleSl4aTest.py
index 0b1133e..0416ae0 100644
--- a/testcases/framework_test/SampleSl4aTest.py
+++ b/testcases/framework_test/SampleSl4aTest.py
@@ -19,14 +19,13 @@
 
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
 
 
 class SampleSl4aTest(base_test.BaseTestClass):
     """An example showing making SL4A calls in VTS."""
 
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
+        self.dut = self.android_devices[0]
 
     def testToast(self):
         """A sample test controlling Android device with sl4a. This will make a
@@ -34,5 +33,6 @@
         logging.info("A toast message should show up on the devce's screen.")
         self.dut.sl4a.makeToast("Hello World!")
 
+
 if __name__ == "__main__":
     test_runner.main()
diff --git a/testcases/fuzz/hal_gps/vts_fuzz.xml b/testcases/fuzz/hal_gps/vts_fuzz.xml
index 3d93643..b5a6839 100644
--- a/testcases/fuzz/hal_gps/vts_fuzz.xml
+++ b/testcases/fuzz/hal_gps/vts_fuzz.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/testcases/fuzz/hal_light/conventional/LightFuzzTest.py b/testcases/fuzz/hal_light/conventional/LightFuzzTest.py
index cccaf4c..b7b0159 100644
--- a/testcases/fuzz/hal_light/conventional/LightFuzzTest.py
+++ b/testcases/fuzz/hal_light/conventional/LightFuzzTest.py
@@ -20,7 +20,7 @@
 
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
+
 from vts.utils.python.fuzzer import GenePool
 
 
@@ -30,17 +30,19 @@
     def setUpClass(self):
         required_params = ["gene_pool_size", "iteartion_count"]
         self.getUserParams(required_params)
-        self.dut = self.registerController(android_device)[0]
-        self.dut.hal.InitConventionalHal(target_type="light",
-                                         target_basepaths=["/system/lib64/hw"],
-                                         target_version=1.0,
-                                         bits=64,
-                                         target_package="hal.conventional.light")
+        self.dut = self.android_devices[0]
+        self.dut.hal.InitConventionalHal(
+            target_type="light",
+            target_basepaths=["/system/lib64/hw"],
+            target_version=1.0,
+            bits=64,
+            target_package="hal.conventional.light")
         self.dut.hal.light.OpenConventionalHal("backlight")
-        module_name = random.choice(
-            [self.dut.hal.light.LIGHT_ID_BACKLIGHT,
-             self.dut.hal.light.LIGHT_ID_NOTIFICATIONS,
-             self.dut.hal.light.LIGHT_ID_ATTENTION])
+        module_name = random.choice([
+            self.dut.hal.light.LIGHT_ID_BACKLIGHT,
+            self.dut.hal.light.LIGHT_ID_NOTIFICATIONS,
+            self.dut.hal.light.LIGHT_ID_ATTENTION
+        ])
 
         # TODO: broken on bullhead
         #   self.dut.hal.light.LIGHT_ID_KEYBOARD
@@ -93,16 +95,18 @@
                 logging.debug("Gene %d", index)
                 result = self.dut.hal.light.set_light(None, gene)
                 if len(result.processed_coverage_data) > 0:
-                    logging.info("coverage: %s", result.processed_coverage_data)
+                    logging.info("coverage: %s",
+                                 result.processed_coverage_data)
                     gene_coverage = []
                     for coverage_data in result.processed_coverage_data:
                         gene_coverage.append(coverage_data)
                     coverages.append(gene_coverage)
                 index += 1
             evolution = GenePool.Evolution()
-            genes = evolution.Evolve(genes,
-                                     self.dut.hal.light.light_state_t_fuzz,
-                                     coverages=coverages)
+            genes = evolution.Evolve(
+                genes,
+                self.dut.hal.light.light_state_t_fuzz,
+                coverages=coverages)
 
 
 if __name__ == "__main__":
diff --git a/testcases/fuzz/hal_light/conventional_standalone/StandaloneLightFuzzTest.py b/testcases/fuzz/hal_light/conventional_standalone/StandaloneLightFuzzTest.py
index a7981bf..9eaea2c 100644
--- a/testcases/fuzz/hal_light/conventional_standalone/StandaloneLightFuzzTest.py
+++ b/testcases/fuzz/hal_light/conventional_standalone/StandaloneLightFuzzTest.py
@@ -22,7 +22,7 @@
 
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
+
 from vts.utils.python.fuzzer import GenePool
 
 
@@ -32,17 +32,19 @@
     def setUpClass(self):
         required_params = ["gene_pool_size", "iteartion_count"]
         self.getUserParams(required_params)
-        self.dut = self.registerController(android_device)[0]
-        self.dut.hal.InitConventionalHal(target_type="light",
-                                         target_basepaths=["/system/lib64/hw"],
-                                         target_version=1.0,
-                                         bits=64,
-                                         target_package="hal.conventional.light")
+        self.dut = self.android_devices[0]
+        self.dut.hal.InitConventionalHal(
+            target_type="light",
+            target_basepaths=["/system/lib64/hw"],
+            target_version=1.0,
+            bits=64,
+            target_package="hal.conventional.light")
         self.dut.hal.light.OpenConventionalHal("backlight")
-        module_name = random.choice(
-            [self.dut.hal.light.LIGHT_ID_BACKLIGHT,
-             self.dut.hal.light.LIGHT_ID_NOTIFICATIONS,
-             self.dut.hal.light.LIGHT_ID_ATTENTION])
+        module_name = random.choice([
+            self.dut.hal.light.LIGHT_ID_BACKLIGHT,
+            self.dut.hal.light.LIGHT_ID_NOTIFICATIONS,
+            self.dut.hal.light.LIGHT_ID_ATTENTION
+        ])
 
         if self.coverage.enabled:
             self.coverage.LoadArtifacts()
@@ -101,7 +103,8 @@
                 result = self.dut.hal.light.set_light(None, gene)
                 if len(result.processed_coverage_data) > 0:
                     gene_coverage = []
-                    logging.info("coverage: %s", result.processed_coverage_data)
+                    logging.info("coverage: %s",
+                                 result.processed_coverage_data)
                     for processed_coverage_data in result.processed_coverage_data:
                         gene_coverage.append(processed_coverage_data)
                     coverages.append(gene_coverage)
@@ -111,12 +114,14 @@
                                      coverage_msg.file_path)
                         logging.info("coverage gcda len %d bytes",
                                      len(coverage_msg.gcda))
-                        last_coverage_data[coverage_msg.file_path] = coverage_msg.gcda
+                        last_coverage_data[
+                            coverage_msg.file_path] = coverage_msg.gcda
                 index += 1
             evolution = GenePool.Evolution()
-            genes = evolution.Evolve(genes,
-                                     self.dut.hal.light.light_state_t_fuzz,
-                                     coverages=coverages)
+            genes = evolution.Evolve(
+                genes,
+                self.dut.hal.light.light_state_t_fuzz,
+                coverages=coverages)
 
         if self.coverage.enabled:
             self.coverage.SetCoverageData(last_coverage_data)
diff --git a/testcases/fuzz/hal_light/target/vts_fuzz.xml b/testcases/fuzz/hal_light/target/vts_fuzz.xml
index 35b3267..cbe365c 100644
--- a/testcases/fuzz/hal_light/target/vts_fuzz.xml
+++ b/testcases/fuzz/hal_light/target/vts_fuzz.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/testcases/fuzz/lib_bionic/LibBionicLibmFuzzTest.py b/testcases/fuzz/lib_bionic/LibBionicLibmFuzzTest.py
index bc04bde..7242394 100644
--- a/testcases/fuzz/lib_bionic/LibBionicLibmFuzzTest.py
+++ b/testcases/fuzz/lib_bionic/LibBionicLibmFuzzTest.py
@@ -19,21 +19,21 @@
 
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
 
 
 class LibBionicLibmFuzzTest(base_test.BaseTestClass):
     """A fuzz testcase for a libm shared library of bionic."""
 
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
-        self.dut.lib.InitSharedLib(target_type="bionic_libm",
-                                   target_basepaths=["/system/lib64"],
-                                   target_version=1.0,
-                                   target_filename="libm.so",
-                                   bits=64,
-                                   handler_name="libm",
-                                   target_package="lib.ndk.bionic")
+        self.dut = self.android_devices[0]
+        self.dut.lib.InitSharedLib(
+            target_type="bionic_libm",
+            target_basepaths=["/system/lib64"],
+            target_version=1.0,
+            target_filename="libm.so",
+            bits=64,
+            handler_name="libm",
+            target_package="lib.ndk.bionic")
 
     def testFabs(self):
         """A simple testcase which just calls the fabs function."""
diff --git a/testcases/fuzz/lib_bionic/LibBionicLibmFuzzTest.xml b/testcases/fuzz/lib_bionic/LibBionicLibmFuzzTest.xml
index ab58c5f..fd2de7d 100644
--- a/testcases/fuzz/lib_bionic/LibBionicLibmFuzzTest.xml
+++ b/testcases/fuzz/lib_bionic/LibBionicLibmFuzzTest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/testcases/host/camera/conventional/2_1/SampleCameraV2Test.py b/testcases/host/camera/conventional/2_1/SampleCameraV2Test.py
index e1a5e73..a9b0087 100644
--- a/testcases/host/camera/conventional/2_1/SampleCameraV2Test.py
+++ b/testcases/host/camera/conventional/2_1/SampleCameraV2Test.py
@@ -21,7 +21,6 @@
 from vts.runners.host import asserts
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
 
 
 class SampleCameraV2Test(base_test.BaseTestClass):
@@ -32,12 +31,13 @@
     MAX_RETRIES = 5
 
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
-        self.dut.hal.InitConventionalHal(target_type="camera",
-                                         target_version=2.1,
-                                         target_basepaths=["/system/lib/hw"],
-                                         bits=32,
-                                         target_package="hal.conventional.camera")
+        self.dut = self.android_devices[0]
+        self.dut.hal.InitConventionalHal(
+            target_type="camera",
+            target_version=2.1,
+            target_basepaths=["/system/lib/hw"],
+            bits=32,
+            target_package="hal.conventional.camera")
 
     def setUp(self):
         self.call_count_camera_device_status_change = 0
@@ -45,7 +45,8 @@
 
     def testCameraNormal(self):
         """A simple testcase which just emulates a normal usage pattern."""
-        version = self.dut.hal.camera.common.GetAttributeValue("module_api_version")
+        version = self.dut.hal.camera.common.GetAttributeValue(
+            "module_api_version")
         logging.info("version: %s", hex(version))
         if version != self.VERSION_2_1 and version != self.VERSION_2_4:
             asserts.skip("HAL version %s is neither v2.1 nor v2.4" % version)
@@ -63,22 +64,28 @@
         def camera_device_status_change(callbacks, camera_id, new_status):
             self.call_count_camera_device_status_change += 1
             logging.info("camera_device_status_change")
-            logging.info("camera_device_status_change: camera_id = %s", camera_id)
-            logging.info("camera_device_status_change: new_status = %s", new_status)
-            logging.info("camera_device_status_change: callbacks = %s", callbacks)
+            logging.info("camera_device_status_change: camera_id = %s",
+                         camera_id)
+            logging.info("camera_device_status_change: new_status = %s",
+                         new_status)
+            logging.info("camera_device_status_change: callbacks = %s",
+                         callbacks)
 
         def torch_mode_status_change(callbacks, camera_id, new_status):
-            self.profiling.StopHostProfiling("callback_latency_torch_mode_status_change")
+            self.profiling.StopHostProfiling(
+                "callback_latency_torch_mode_status_change")
             self.call_count_torch_mode_status_change += 1
             logging.info("torch_mode_status_change")
             logging.info("torch_mode_status_change: camera_id = %s", camera_id)
-            logging.info("torch_mode_status_change: new_status = %s", new_status)
+            logging.info("torch_mode_status_change: new_status = %s",
+                         new_status)
             logging.info("torch_mode_status_change: callbacks = %s", callbacks)
 
         my_callback = self.dut.hal.camera.camera_module_callbacks_t(
             camera_device_status_change, torch_mode_status_change)
         self.dut.hal.camera.set_callbacks(my_callback)
-        self.profiling.StartHostProfiling("callback_latency_torch_mode_status_change")
+        self.profiling.StartHostProfiling(
+            "callback_latency_torch_mode_status_change")
         self.dut.hal.camera.common.methods.open()  # note args are skipped
         retries = 0
         while (self.call_count_torch_mode_status_change < 1 and
diff --git a/testcases/host/camera/conventional/3_4/SampleCameraV3Test.py b/testcases/host/camera/conventional/3_4/SampleCameraV3Test.py
index a5d12cb..eaa54e9 100644
--- a/testcases/host/camera/conventional/3_4/SampleCameraV3Test.py
+++ b/testcases/host/camera/conventional/3_4/SampleCameraV3Test.py
@@ -21,7 +21,6 @@
 from vts.runners.host import asserts
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
 
 
 class SampleCameraV3Test(base_test.BaseTestClass):
@@ -31,12 +30,13 @@
     MAX_RETRIES = 3
 
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
-        self.dut.hal.InitConventionalHal(target_type="camera",
-                                         target_version=3.4,
-                                         target_basepaths=["/system/lib/hw"],
-                                         bits=32,
-                                         target_package="hal.conventional.camera")
+        self.dut = self.android_devices[0]
+        self.dut.hal.InitConventionalHal(
+            target_type="camera",
+            target_version=3.4,
+            target_basepaths=["/system/lib/hw"],
+            bits=32,
+            target_package="hal.conventional.camera")
 
     def setUp(self):
         self.call_count_camera_device_status_change = 0
@@ -49,7 +49,8 @@
         if version != self.VERSION_3_4:
             asserts.skip("HAL version != v3.4")
 
-        self.dut.hal.camera.common.module.methods.open()  # note args are skipped
+        self.dut.hal.camera.common.module.methods.open(
+        )  # note args are skipped
 
         ops = self.dut.hal.camera.GetAttributeValue("ops")
         logging.info("ops: %s", ops)
diff --git a/testcases/host/camera_its/CameraITSTest.py b/testcases/host/camera_its/CameraITSTest.py
index 791a5e9..b69b423 100644
--- a/testcases/host/camera_its/CameraITSTest.py
+++ b/testcases/host/camera_its/CameraITSTest.py
@@ -26,7 +26,6 @@
 from vts.runners.host import base_test
 from vts.runners.host import const
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
 
 
 class CameraITSTest(base_test.BaseTestClass):
@@ -39,11 +38,11 @@
     def setUpClass(self):
         """Setup ITS running python environment and check for required python modules
         """
-        self.dut = self.registerController(android_device)[0]
+        self.dut = self.android_devices[0]
         self.device_arg = "device=%s" % (self.dut.serial)
         # data_file_path is unicode so convert it to ascii
-        self.its_path = str(os.path.abspath(os.path.join(
-            self.data_file_path, 'CameraITS')))
+        self.its_path = str(
+            os.path.abspath(os.path.join(self.data_file_path, 'CameraITS')))
         logging.info("cwd: %s", os.getcwd())
         logging.info("its_path: %s", self.its_path)
         self.out_path = logging.log_path
@@ -52,10 +51,9 @@
         # If tradefed switches to python3, then we will be checking modules in python3 while ITS
         # scripts should be ran in 2.7.
         if sys.version_info[:2] != (2, 7):
-            logging.warning(
-                "Python version %s found; "
-                "CameraITSTest only tested with Python 2.7." % (
-                    str(sys.version_info[:3])))
+            logging.warning("Python version %s found; "
+                            "CameraITSTest only tested with Python 2.7." %
+                            (str(sys.version_info[:3])))
         logging.info("===============================")
         logging.info("Python path is: %s" % (sys.executable))
         logging.info("PYTHONPATH env is: " + os.environ["PYTHONPATH"])
@@ -76,8 +74,10 @@
         from matplotlib import pylab
         logging.info("pylab path is " + inspect.getfile(pylab))
         logging.info("===============================")
-        modules = ["numpy", "PIL", "Image", "matplotlib", "pylab",
-                   "scipy.stats", "scipy.spatial"]
+        modules = [
+            "numpy", "PIL", "Image", "matplotlib", "pylab", "scipy.stats",
+            "scipy.spatial"
+        ]
         for m in modules:
             try:
                 if m == "Image":
@@ -88,7 +88,8 @@
                 else:
                     exec ("import " + m)
             except ImportError as e:
-                asserts.fail("Cannot import python module %s: %s" % (m, str(e)))
+                asserts.fail("Cannot import python module %s: %s" % (m,
+                                                                     str(e)))
 
         # Add ITS module path to path
         its_path = os.path.join(self.its_path, "pymodules")
@@ -105,8 +106,9 @@
             testpath: string, format tests/[scenename]/[testname].py
         """
         testname = re.split("/|\.", testpath)[-2]
-        cmd = ['python', os.path.join(self.its_path, testpath),
-               self.device_arg]
+        cmd = [
+            'python', os.path.join(self.its_path, testpath), self.device_arg
+        ]
         outdir = self.out_path
         outpath = os.path.join(outdir, testname + "_stdout.txt")
         errpath = os.path.join(outdir, testname + "_stderr.txt")
@@ -133,9 +135,11 @@
             scnee: one of ITS test scene name.
         """
         its_path = self.its_path
-        paths = [os.path.join("tests", scene, s)
-                 for s in os.listdir(os.path.join(its_path, "tests", scene))
-                 if s[-3:] == ".py" and s[:4] == "test"]
+        paths = [
+            os.path.join("tests", scene, s)
+            for s in os.listdir(os.path.join(its_path, "tests", scene))
+            if s[-3:] == ".py" and s[:4] == "test"
+        ]
         paths.sort()
         return paths
 
diff --git a/testcases/host/light/conventional/SampleLightTest.py b/testcases/host/light/conventional/SampleLightTest.py
index afe1bc2..75b183b 100644
--- a/testcases/host/light/conventional/SampleLightTest.py
+++ b/testcases/host/light/conventional/SampleLightTest.py
@@ -19,19 +19,19 @@
 
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
 
 
 class SampleLightTest(base_test.BaseTestClass):
     """A sample testcase for the legacy lights HAL."""
 
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
-        self.dut.hal.InitConventionalHal(target_type="light",
-                                         target_basepaths=["/data/local/tmp/64/hw"],
-                                         target_version=1.0,
-                                         bits=64,
-                                         target_package="hal.conventional.light")
+        self.dut = self.android_devices[0]
+        self.dut.hal.InitConventionalHal(
+            target_type="light",
+            target_basepaths=["/data/local/tmp/64/hw"],
+            target_version=1.0,
+            bits=64,
+            target_package="hal.conventional.light")
         self.dut.hal.light.OpenConventionalHal("backlight")
 
     def testTurnOnBackgroundLight(self):
diff --git a/testcases/host/reboot/RebootRootRemountTest/RebootRootRemountTest.py b/testcases/host/reboot/RebootRootRemountTest/RebootRootRemountTest.py
index f76e443..99c27aa 100644
--- a/testcases/host/reboot/RebootRootRemountTest/RebootRootRemountTest.py
+++ b/testcases/host/reboot/RebootRootRemountTest/RebootRootRemountTest.py
@@ -22,7 +22,6 @@
 from vts.runners.host import test_runner
 from vts.runners.host import utils
 from vts.utils.python.controllers import adb
-from vts.utils.python.controllers import android_device
 
 
 class RebootRootRemountTest(base_test.BaseTestClass):
@@ -33,8 +32,9 @@
         verity: boolean, True if verity was enabled before test,
             False otherwise.
     """
+
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
+        self.dut = self.android_devices[0]
         self.verity = self.dut.verityEnabled
 
     def testRebootRootRemount(self):
@@ -70,7 +70,8 @@
                 asserts.fail("Reboot failed after re-enabling verity.")
 
         asserts.assertEqual(self.verity, self.dut.verityEnabled,
-            "Verity state was successfully restored.")
+                            "Verity state was successfully restored.")
+
 
 if __name__ == "__main__":
     test_runner.main()
diff --git a/testcases/host/reboot/RebootTest/RebootTest.py b/testcases/host/reboot/RebootTest/RebootTest.py
index a670d37..9b36918 100644
--- a/testcases/host/reboot/RebootTest/RebootTest.py
+++ b/testcases/host/reboot/RebootTest/RebootTest.py
@@ -19,7 +19,6 @@
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
 from vts.runners.host import utils
-from vts.utils.python.controllers import android_device
 
 
 class RebootTest(base_test.BaseTestClass):
@@ -28,8 +27,9 @@
     Attributes:
         dut: AndroidDevice, the device under test as config
     """
+
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
+        self.dut = self.android_devices[0]
 
     def testReboot(self):
         """Tests if device is still responsive after reboot."""
diff --git a/testcases/system/libc/LibcTest.py b/testcases/system/libc/LibcTest.py
index 00e5654..5316238 100644
--- a/testcases/system/libc/LibcTest.py
+++ b/testcases/system/libc/LibcTest.py
@@ -20,7 +20,7 @@
 from vts.runners.host import asserts
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
+
 from vts.runners.host import const
 
 
@@ -28,14 +28,15 @@
     """A basic test of the libc API."""
 
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
-        self.dut.lib.InitSharedLib(target_type="bionic_libc",
-                                   target_basepaths=["/system/lib64"],
-                                   target_version=1.0,
-                                   target_filename="libc.so",
-                                   bits=64,
-                                   handler_name="libc",
-                                   target_package="lib.ndk.bionic")
+        self.dut = self.android_devices[0]
+        self.dut.lib.InitSharedLib(
+            target_type="bionic_libc",
+            target_basepaths=["/system/lib64"],
+            target_version=1.0,
+            target_filename="libc.so",
+            bits=64,
+            handler_name="libc",
+            target_package="lib.ndk.bionic")
 
     def testOpenCloseLocalSocketStream(self):
         """Tests open and close socket operations for local communication.
@@ -127,5 +128,6 @@
         asserts.assertNotEqual(result.return_type.scalar_value.int32_t, -1,
                                "libc.close: unable to close socket.")
 
+
 if __name__ == "__main__":
     test_runner.main()
diff --git a/testcases/system/qtaguid/sample/SampleQtaguidTest.py b/testcases/system/qtaguid/sample/SampleQtaguidTest.py
index 086454a..988c377 100644
--- a/testcases/system/qtaguid/sample/SampleQtaguidTest.py
+++ b/testcases/system/qtaguid/sample/SampleQtaguidTest.py
@@ -19,21 +19,21 @@
 
 from vts.runners.host import base_test
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
 
 
 class SampleQtaguidTest(base_test.BaseTestClass):
     """A sample testcase for the libcutil's qtaguid module."""
 
     def setUpClass(self):
-        self.dut = self.registerController(android_device)[0]
-        self.dut.lib.InitSharedLib(target_type="vndk_libcutils",
-                                   target_basepaths=["/system/lib64"],
-                                   target_version=1.0,
-                                   target_filename="libcutils.so",
-                                   bits=64,
-                                   handler_name="libcutils",
-                                   target_packege="lib.ndk.bionic")
+        self.dut = self.android_devices[0]
+        self.dut.lib.InitSharedLib(
+            target_type="vndk_libcutils",
+            target_basepaths=["/system/lib64"],
+            target_version=1.0,
+            target_filename="libcutils.so",
+            bits=64,
+            handler_name="libcutils",
+            target_packege="lib.ndk.bionic")
 
     def testCall(self):
         """A simple testcase which just calls a function."""
diff --git a/testcases/template/binary_test/binary_test.py b/testcases/template/binary_test/binary_test.py
index b015527..dcc1d14 100644
--- a/testcases/template/binary_test/binary_test.py
+++ b/testcases/template/binary_test/binary_test.py
@@ -24,7 +24,6 @@
 from vts.runners.host import const
 from vts.runners.host import keys
 from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
 from vts.utils.python.common import list_utils
 from vts.utils.python.os import path_utils
 from vts.utils.python.precondition import precondition_utils
@@ -110,8 +109,10 @@
             for token in self.binary_test_envp:
                 tag = ''
                 path = token
-                if self.TAG_DELIMITER in token:
-                    tag, path = token.split(self.TAG_DELIMITER)
+                split = token.find(self.TAG_DELIMITER)
+                if split >= 0:
+                    tag, arg = token[:split], token[
+                        split + len(self.TAG_DELIMITER):]
                 if tag in self.envp:
                     self.envp[tag] += ' %s' % path
                 else:
@@ -123,8 +124,10 @@
             for token in self.binary_test_args:
                 tag = ''
                 arg = token
-                if self.TAG_DELIMITER in token:
-                    tag, arg = token.split(self.TAG_DELIMITER)
+                split = token.find(self.TAG_DELIMITER)
+                if split >= 0:
+                    tag, arg = token[:split], token[
+                        split + len(self.TAG_DELIMITER):]
                 if tag in self.args:
                     self.args[tag] += ' %s' % arg
                 else:
@@ -163,11 +166,8 @@
                     tag, path = token.split(self.TAG_DELIMITER)
                 self.profiling_library_path[tag] = path
 
-        if not hasattr(self, "_dut"):
-            self._dut = self.registerController(android_device)[0]
-
-        self._dut.shell.InvokeTerminal("one", int(self.abi_bitness))
-        self.shell = self._dut.shell.one
+        self._dut = self.android_devices[0]
+        self.shell = self._dut.shell
 
         if self.coverage.enabled and self.coverage.global_coverage:
             self.coverage.LoadArtifacts()
@@ -177,7 +177,7 @@
         self.shell.Execute("setenforce 0")  # SELinux permissive mode
 
         if not precondition_utils.CanRunHidlHalTest(self, self._dut,
-                                                    self._dut.shell.one):
+                                                    self.shell):
             self._skip_all_testcases = True
 
         self.testcases = []
@@ -196,12 +196,13 @@
         if getattr(self, keys.ConfigKeys.IKEY_BINARY_TEST_DISABLE_FRAMEWORK,
                    False):
             # Stop Android runtime to reduce interference.
+            logging.debug("Stops the Android framework.")
             self._dut.stop()
             stop_requested = True
 
         if getattr(self, keys.ConfigKeys.IKEY_BINARY_TEST_STOP_NATIVE_SERVERS,
                    False):
-            # Stops all (properly configured) native servers.
+            logging.debug("Stops all properly configured native servers.")
             results = self._dut.setProp(self.SYSPROP_VTS_NATIVE_SERVER, "1")
             stop_requested = True
 
@@ -256,6 +257,9 @@
                 else:
                     self.testcases.append(testcase)
 
+        if type(self.testcases) is not list or len(self.testcases) == 0:
+            asserts.fail("No test case is found or generated.")
+
     def PutTag(self, name, tag):
         '''Put tag on name and return the resulting string.
 
@@ -297,12 +301,13 @@
         '''Perform clean-up tasks'''
         if getattr(self, keys.ConfigKeys.IKEY_BINARY_TEST_STOP_NATIVE_SERVERS,
                    False):
-            # Restarts all (properly configured) native servers.
+            logging.debug("Restarts all properly configured native servers.")
             results = self._dut.setProp(self.SYSPROP_VTS_NATIVE_SERVER, "0")
 
         # Restart Android runtime.
         if getattr(self, keys.ConfigKeys.IKEY_BINARY_TEST_DISABLE_FRAMEWORK,
                    False):
+            logging.debug("Starts the Android framework.")
             self._dut.start()
 
         # Retrieve coverage if applicable
@@ -319,7 +324,7 @@
         sources = set(filter(bool, sources))
         paths = [dst for src, dst, tag in sources if src and dst]
         cmd = ['rm -rf %s' % dst for dst in paths]
-        cmd_results = self.shell.Execute(cmd)
+        cmd_results = self.shell.Execute(cmd, no_except=True)
         if not cmd_results or any(cmd_results[const.EXIT_CODE]):
             logging.warning('Failed to clean up test class: %s', cmd_results)
 
@@ -329,7 +334,7 @@
         dirs = list(dir_set)
         dirs.sort(lambda x, y: cmp(len(y), len(x)))
         cmd = ['rmdir %s' % d for d in dirs]
-        cmd_results = self.shell.Execute(cmd)
+        cmd_results = self.shell.Execute(cmd, no_except=True)
         if not cmd_results or any(cmd_results[const.EXIT_CODE]):
             logging.warning('Failed to remove: %s', cmd_results)
 
diff --git a/testcases/template/gtest_binary_test/gtest_binary_test.py b/testcases/template/gtest_binary_test/gtest_binary_test.py
index c919130..dfad91a 100644
--- a/testcases/template/gtest_binary_test/gtest_binary_test.py
+++ b/testcases/template/gtest_binary_test/gtest_binary_test.py
@@ -60,7 +60,7 @@
             tag: string, a tag that will be appended to the end of test name
 
         Returns:
-            A list of GtestTestCase objects.
+            A list of GtestTestCase objects on success; an empty list otherwise.
             In non-batch mode, each object respresents a test case in the
             gtest binary located at the provided path. Usually there are more
             than one object returned.
@@ -78,9 +78,9 @@
         ld_library_path = self.ld_library_path[
             tag] if tag in self.ld_library_path else None
         profiling_library_path = self.profiling_library_path[
-            tag] if tag in self.ld_library_path else None
+            tag] if tag in self.profiling_library_path else None
 
-        args += " --gtest_list_tests"
+        gtest_list_args = args + " --gtest_list_tests"
         list_test_case = binary_test_case.BinaryTestCase(
             'gtest_list_tests',
             path,
@@ -91,14 +91,16 @@
             ld_library_path,
             profiling_library_path,
             envp=envp,
-            args=args)
+            args=gtest_list_args)
         cmd = ['chmod 755 %s' % path, list_test_case.GetRunCommand()]
         cmd_results = self.shell.Execute(cmd)
+        test_cases = []
         if any(cmd_results[const.EXIT_CODE]
                ):  # gtest binary doesn't exist or is corrupted
-            logging.error('Failed to list test cases from binary %s' % path)
-
-        test_cases = []
+            logging.error(
+                'Failed to list test cases from %s. Command: %s, Result: %s.' %
+                (path, cmd, cmd_results))
+            return test_cases
 
         test_suite = ''
         for line in cmd_results[const.STDOUT][1].split('\n'):
@@ -109,7 +111,8 @@
                 test_name = line.split('#')[0].strip()
                 test_case = gtest_test_case.GtestTestCase(
                     test_suite, test_name, path, tag, self.PutTag,
-                    working_directory, ld_library_path, profiling_library_path)
+                    working_directory, ld_library_path, profiling_library_path,
+                    envp=envp, args=args)
                 logging.info('Gtest test case: %s' % test_case)
                 test_cases.append(test_case)
             else:  # Test suite name
@@ -176,7 +179,8 @@
                 for line in stdout.split('\n'):
                     logging.info(line)
 
-        asserts.assertFalse(command_results[const.EXIT_CODE][1],
+        asserts.assertFalse(
+            command_results[const.EXIT_CODE][1],
             'Failed to show Gtest XML output: %s' % command_results)
 
         root = xml.etree.ElementTree.fromstring(xml_str)
diff --git a/testcases/template/hal_hidl_gtest/hal_hidl_gtest.py b/testcases/template/hal_hidl_gtest/hal_hidl_gtest.py
index 820f162..554b919 100644
--- a/testcases/template/hal_hidl_gtest/hal_hidl_gtest.py
+++ b/testcases/template/hal_hidl_gtest/hal_hidl_gtest.py
@@ -14,13 +14,14 @@
 # limitations under the License.
 #
 
+import copy
 import logging
 
 from vts.runners.host import const
 from vts.runners.host import keys
 from vts.runners.host import test_runner
 from vts.testcases.template.gtest_binary_test import gtest_binary_test
-from vts.utils.python.controllers import android_device
+from vts.testcases.template.gtest_binary_test import gtest_test_case
 from vts.utils.python.cpu import cpu_frequency_scaling
 
 
@@ -44,8 +45,8 @@
         self.getUserParams(opt_param_names=opt_params)
 
         self._skip_if_thermal_throttling = self.getUserParam(
-                keys.ConfigKeys.IKEY_SKIP_IF_THERMAL_THROTTLING,
-                default_value=False)
+            keys.ConfigKeys.IKEY_SKIP_IF_THERMAL_THROTTLING,
+            default_value=False)
 
         if not self._skip_all_testcases:
             logging.info("Disable CPU frequency scaling")
@@ -72,6 +73,107 @@
         if passthrough_opt or self.coverage.enabled:
             self._EnablePassthroughMode()
 
+    # @Override
+    def CreateTestCase(self, path, tag=''):
+        '''Create a list of GtestTestCase objects from a binary path.
+
+        Support testing against different service names by first executing a
+        dummpy test case which lists all the registered hal services. Then
+        query the service name(s) for each registered service with lshal.
+        For each service name, create a new test case each with the service
+        name as an additional argument.
+
+        Args:
+            path: string, absolute path of a gtest binary on device
+            tag: string, a tag that will be appended to the end of test name
+
+        Returns:
+            A list of GtestTestCase objects.
+        '''
+        initial_test_cases = super(HidlHalGTest, self).CreateTestCase(path,
+                                                                      tag)
+        if not initial_test_cases:
+            return initial_test_cases
+        # first, run one test with --list_registered_services.
+        list_service_test_case = copy.copy(initial_test_cases[0])
+        list_service_test_case.args += " --list_registered_services"
+        results = self.shell.Execute(list_service_test_case.GetRunCommand())
+        if (results[const.EXIT_CODE][0]):
+            logging.error('Failed to list test cases from binary %s',
+                          list_service_test_case.path)
+        # parse the results to get the registered service list.
+        registered_services = []
+        for line in results[const.STDOUT][0].split('\n'):
+            line = str(line)
+            if line.startswith('hal_service: '):
+                service = line[len('hal_service: '):]
+                registered_services.append(service)
+
+        # If no service registered, return the initial test cases directly.
+        if not registered_services:
+            return initial_test_cases
+
+        # find the correponding service name(s) for each registered service and
+        # store the mapping in dict service_instances.
+        service_instances = {}
+        for service in registered_services:
+            cmd = '"lshal -i | grep -o %s/.* | sort -u"' % service
+            out = str(self._dut.adb.shell(cmd)).split()
+            service_names = map(lambda x: x[x.find('/') + 1:], out)
+            logging.info("registered service: %s with name: %s" %
+                         (service, ' '.join(service_names)))
+            service_instances[service] = service_names
+
+        # get all the combination of service instances.
+        service_instance_combinations = self._GetServiceInstancesCombinations(
+            registered_services, service_instances)
+
+        new_test_cases = []
+        for test_case in initial_test_cases:
+            for instance_combination in service_instance_combinations:
+                new_test_case = copy.copy(test_case)
+                for instance in instance_combination:
+                    new_test_case.args += " --hal_service_instance=" + instance
+                    new_test_case.tag = instance[instance.find(
+                        '/'):] + new_test_case.tag
+                new_test_cases.append(new_test_case)
+        return new_test_cases
+
+    @classmethod
+    def _GetServiceInstancesCombinations(self, services, service_instances):
+        '''Create all combinations of instances for all services.
+
+        Args:
+            services: list, all services used in the test. e.g. [s1, s2]
+            service_instances: dictionary, mapping of each service and the
+                               corresponding service name(s).
+                               e.g. {"s1": ["n1"], "s2": ["n2", "n3"]}
+
+        Returns:
+            A list of all service instance combinations.
+            e.g. [[s1/n1, s2/n2], [s1/n1, s2/n3]]
+        '''
+
+        service_instance_combinations = []
+        if not services:
+            return service_instance_combinations
+        service = services.pop()
+        pre_instance_combs = self._GetServiceInstancesCombinations(
+            services, service_instances)
+        if service not in service_instances:
+            return pre_instance_combs
+        for name in service_instances[service]:
+            if not pre_instance_combs:
+                new_instance_comb = [service + '/' + name]
+                service_instance_combinations.append(new_instance_comb)
+            else:
+                for instance_comb in pre_instance_combs:
+                    new_instance_comb = [service + '/' + name]
+                    new_instance_comb.extend(instance_comb)
+                    service_instance_combinations.append(new_instance_comb)
+
+        return service_instance_combinations
+
     def _EnablePassthroughMode(self):
         """Enable passthrough mode by setting getStub to true.
 
@@ -94,21 +196,20 @@
         super(HidlHalGTest, self).setUp()
 
         if (self._skip_if_thermal_throttling and
-            getattr(self, "_cpu_freq", None)):
+                getattr(self, "_cpu_freq", None)):
             self._cpu_freq.SkipIfThermalThrottling(retry_delay_secs=30)
 
     def tearDown(self):
         """Skips the test case if there is thermal throttling."""
         if (self._skip_if_thermal_throttling and
-            getattr(self, "_cpu_freq", None)):
+                getattr(self, "_cpu_freq", None)):
             self._cpu_freq.SkipIfThermalThrottling()
 
         super(HidlHalGTest, self).tearDown()
 
     def tearDownClass(self):
         """Turns off CPU frequency scaling."""
-        if (not self._skip_all_testcases and
-            getattr(self, "_cpu_freq", None)):
+        if (not self._skip_all_testcases and getattr(self, "_cpu_freq", None)):
             logging.info("Enable CPU frequency scaling")
             self._cpu_freq.EnableCpuScaling()
 
diff --git a/testcases/template/hal_hidl_gtest/hal_hidl_gtest_unittest.py b/testcases/template/hal_hidl_gtest/hal_hidl_gtest_unittest.py
new file mode 100644
index 0000000..bde230e
--- /dev/null
+++ b/testcases/template/hal_hidl_gtest/hal_hidl_gtest_unittest.py
@@ -0,0 +1,54 @@
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import unittest
+
+from vts.testcases.template.hal_hidl_gtest import hal_hidl_gtest
+
+class HidlHalGTestUnitTest(unittest.TestCase):
+    """Tests for hal hidl gtest template"""
+
+    def testGetServiceInstancesCombinations(self):
+        """Test the function to get service instance combinations"""
+
+        comb1 = hal_hidl_gtest.HidlHalGTest._GetServiceInstancesCombinations(
+            [], {})
+        self.assertEquals(0, len(comb1))
+        comb2 = hal_hidl_gtest.HidlHalGTest._GetServiceInstancesCombinations(
+            ["s1"], {})
+        self.assertEquals(0, len(comb2))
+        comb3 = hal_hidl_gtest.HidlHalGTest._GetServiceInstancesCombinations(
+            ["s1"], {"s1": ["n1"]})
+        self.assertEqual([["s1/n1"]], comb3)
+        comb4 = hal_hidl_gtest.HidlHalGTest._GetServiceInstancesCombinations(
+            ["s1"], {"s1": ["n1", "n2"]})
+        self.assertEqual([["s1/n1"], ["s1/n2"]], comb4)
+        comb5 = hal_hidl_gtest.HidlHalGTest._GetServiceInstancesCombinations(
+            ["s1", "s2"], {"s1": ["n1", "n2"]})
+        self.assertEqual([["s1/n1"], ["s1/n2"]], comb5)
+        comb6 = hal_hidl_gtest.HidlHalGTest._GetServiceInstancesCombinations(
+            ["s1", "s2"], {"s1": ["n1", "n2"],
+                           "s2": ["n3"]})
+        self.assertEqual([["s2/n3", "s1/n1"], ["s2/n3", "s1/n2"]], comb6)
+        comb7 = hal_hidl_gtest.HidlHalGTest._GetServiceInstancesCombinations(
+            ["s1", "s2"], {"s1": ["n1", "n2"],
+                           "s2": ["n3", "n4"]})
+        self.assertEqual([["s2/n3", "s1/n1"], ["s2/n3", "s1/n2"],
+                          ["s2/n4", "s1/n1"], ["s2/n4", "s1/n2"]], comb7)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/testcases/template/hal_hidl_replay_test/hal_hidl_replay_test.py b/testcases/template/hal_hidl_replay_test/hal_hidl_replay_test.py
index 6e431c3..99f6cff 100644
--- a/testcases/template/hal_hidl_replay_test/hal_hidl_replay_test.py
+++ b/testcases/template/hal_hidl_replay_test/hal_hidl_replay_test.py
@@ -23,7 +23,7 @@
 from vts.testcases.template.binary_test import binary_test
 from vts.testcases.template.hal_hidl_replay_test import hal_hidl_replay_test_case
 from vts.utils.python.common import vintf_utils
-from vts.utils.python.controllers import android_device
+
 from vts.utils.python.os import path_utils
 
 
@@ -83,14 +83,11 @@
         self.trace_paths = map(str, self.hal_hidl_replay_test_trace_paths)
 
         target_package, target_version = self.hal_hidl_package_name.split("@")
-        custom_ld_library_path = path_utils.JoinTargetPath(self.DEVICE_TMP_DIR,
-                                                           self.abi_bitness)
+        custom_ld_library_path = path_utils.JoinTargetPath(
+            self.DEVICE_TMP_DIR, self.abi_bitness)
         driver_binary_path = path_utils.JoinTargetPath(
             self.DEVICE_TMP_DIR, self.abi_bitness,
-            "fuzzer%s" % self.abi_bitness)
-        target_vts_driver_file_path = path_utils.JoinTargetPath(
-            self.DEVICE_TMP_DIR, self.abi_bitness,
-            "%s@%s-vts.driver.so" % (target_package, target_version))
+            "vts_hal_replayer%s" % self.abi_bitness)
 
         if not self._skip_all_testcases:
             service_names = self.getServiceName()
@@ -108,7 +105,6 @@
                     test_name += "_" + service_name
                 test_case = hal_hidl_replay_test_case.HalHidlReplayTestCase(
                     trace_path,
-                    target_vts_driver_file_path,
                     service_name,
                     test_suite,
                     test_name,
@@ -124,8 +120,8 @@
                 trace_file_name = str(os.path.basename(trace_path))
                 target_trace_path = path_utils.JoinTargetPath(
                     self.DEVICE_TMP_DIR, "vts_replay_trace", trace_file_name)
-                cmd_results = self.shell.Execute("rm -f %s" %
-                                                 target_trace_path)
+                cmd_results = self.shell.Execute(
+                    "rm -f %s" % target_trace_path)
                 if not cmd_results or any(cmd_results[const.EXIT_CODE]):
                     logging.warning("Failed to remove: %s", cmd_results)
 
diff --git a/testcases/template/hal_hidl_replay_test/hal_hidl_replay_test_case.py b/testcases/template/hal_hidl_replay_test/hal_hidl_replay_test_case.py
index cf67409..fc86760 100644
--- a/testcases/template/hal_hidl_replay_test/hal_hidl_replay_test_case.py
+++ b/testcases/template/hal_hidl_replay_test/hal_hidl_replay_test_case.py
@@ -32,11 +32,10 @@
 
     DEVICE_VTS_SPEC_FILE_PATH = "/data/local/tmp/spec"
 
-    def __init__(self, trace_path, target_vts_driver_file_path, service_name,
+    def __init__(self, trace_path, service_name,
                  *args, **kwargs):
         super(HalHidlReplayTestCase, self).__init__(*args, **kwargs)
         self._trace_path = trace_path
-        self._target_vts_driver_file_path = target_vts_driver_file_path
         self._service_name = service_name
 
     # @Override
@@ -49,12 +48,10 @@
 
         cmd = ("LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH "
                "%s "
-               "--mode=replay "
-               "--trace_path=%s "
-               "--spec_path=%s "
+               "--spec_dir_path=%s "
                "--hal_service_name=%s "
-               "%s" % (self.ld_library_path, self.path, self._trace_path,
+               "%s" % (self.ld_library_path, self.path,
                        self.DEVICE_VTS_SPEC_FILE_PATH, self._service_name,
-                       self._target_vts_driver_file_path))
+                       self._trace_path))
 
         return cmd
diff --git a/testcases/template/llvmfuzzer_test/llvmfuzzer_test.py b/testcases/template/llvmfuzzer_test/llvmfuzzer_test.py
index 7a92ad6..2440a4c 100644
--- a/testcases/template/llvmfuzzer_test/llvmfuzzer_test.py
+++ b/testcases/template/llvmfuzzer_test/llvmfuzzer_test.py
@@ -23,12 +23,13 @@
 from vts.runners.host import keys
 from vts.runners.host import test_runner
 from vts.utils.python.controllers import adb
-from vts.utils.python.controllers import android_device
+
 from vts.utils.python.common import list_utils
 from vts.utils.python.os import path_utils
 
 from vts.testcases.template.llvmfuzzer_test import llvmfuzzer_test_config as config
 
+
 class LLVMFuzzerTest(base_test.BaseTestClass):
     """Runs fuzzer tests on target.
 
@@ -36,6 +37,7 @@
         _dut: AndroidDevice, the device under test as config
         _testcases: string list, list of testcases to run
     """
+
     def setUpClass(self):
         """Creates a remote shell instance, and copies data files."""
         required_params = [
@@ -48,9 +50,9 @@
 
         logging.info("Testcases: %s", self._testcases)
         logging.info("%s: %s", keys.ConfigKeys.IKEY_DATA_FILE_PATH,
-            self.data_file_path)
+                     self.data_file_path)
         logging.info("%s: %s", config.ConfigKeys.FUZZER_CONFIGS,
-            self.fuzzer_configs)
+                     self.fuzzer_configs)
 
         self._dut = self.registerController(android_device, False)[0]
         self._dut.adb.shell("mkdir %s -p" % config.FUZZER_TEST_DIR)
@@ -65,7 +67,8 @@
         Args:
             testcase: string, path to executable fuzzer.
         """
-        push_src = os.path.join(self.data_file_path, config.FUZZER_SRC_DIR, testcase)
+        push_src = os.path.join(self.data_file_path, config.FUZZER_SRC_DIR,
+                                testcase)
         self._dut.adb.push("%s %s" % (push_src, config.FUZZER_TEST_DIR))
         logging.info("Adb pushed: %s", testcase)
 
@@ -78,6 +81,7 @@
         Returns:
             string, command line flags for fuzzer executable.
         """
+
         def _SerializeVTSFuzzerParams(params):
             """Creates VTS command line flags for fuzzer executable.
 
@@ -114,7 +118,6 @@
             """
             return " ".join(["-%s=%s" % (k, v) for k, v in params.items()])
 
-
         vts_fuzzer_params = fuzzer_config.get("vts_fuzzer_params", {})
 
         llvmfuzzer_params = config.FUZZER_PARAMS.copy()
@@ -136,8 +139,8 @@
             string, path to corpus directory on the target.
         """
         corpus = fuzzer_config.get("corpus", [])
-        corpus_dir = path_utils.JoinTargetPath(
-            config.FUZZER_TEST_DIR, "%s_corpus" % fuzzer)
+        corpus_dir = path_utils.JoinTargetPath(config.FUZZER_TEST_DIR,
+                                               "%s_corpus" % fuzzer)
 
         self._dut.adb.shell("mkdir %s -p" % corpus_dir)
         for idx, corpus_entry in enumerate(corpus):
@@ -171,8 +174,9 @@
         ld_path = "LD_LIBRARY_PATH=/data/local/tmp/64:/data/local/tmp/32:$LD_LIBRARY_PATH"
         test_cmd = "./%s" % fuzzer
 
-        fuzz_cmd = "%s && %s %s %s %s > /dev/null" % (
-            cd_cmd, ld_path, test_cmd, corpus_dir, test_flags)
+        fuzz_cmd = "%s && %s %s %s %s > /dev/null" % (cd_cmd, ld_path,
+                                                      test_cmd, corpus_dir,
+                                                      test_flags)
         logging.info("Executing: %s", fuzz_cmd)
         # TODO(trong): vts shell doesn't handle timeouts properly, change this after it does.
         try:
@@ -213,7 +217,8 @@
         for offset in xrange(0, len(output), 2):
             crash_report += "\\x%s" % output[offset:offset + 2]
 
-        logging.info('FUZZER_TEST_CRASH_REPORT for %s: "%s"', fuzzer, crash_report)
+        logging.info('FUZZER_TEST_CRASH_REPORT for %s: "%s"', fuzzer,
+                     crash_report)
 
     # TODO(trong): differentiate between crashes and sanitizer rule violations.
     def AssertTestResult(self, fuzzer, result):
diff --git a/harnesses/cloud_client/__init__.py b/testcases/vts_selftest/__init__.py
similarity index 100%
rename from harnesses/cloud_client/__init__.py
rename to testcases/vts_selftest/__init__.py
diff --git a/harnesses/cloud_client/__init__.py b/testcases/vts_selftest/test_framework/__init__.py
similarity index 100%
copy from harnesses/cloud_client/__init__.py
copy to testcases/vts_selftest/test_framework/__init__.py
diff --git a/runners/host/tcp_server/Android.mk b/testcases/vts_selftest/test_framework/base_test/Android.mk
similarity index 61%
rename from runners/host/tcp_server/Android.mk
rename to testcases/vts_selftest/test_framework/base_test/Android.mk
index cfce96a..7bfa47a 100644
--- a/runners/host/tcp_server/Android.mk
+++ b/testcases/vts_selftest/test_framework/base_test/Android.mk
@@ -1,20 +1,21 @@
-# Copyright 2016 - The Android Open Source Project
+#
+# Copyright (C) 2017 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
 #
-#     http://www.apache.org/licenses/LICENSE-2.0
+#      http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+#
+LOCAL_PATH := $(call my-dir)
 
-the_py_script = vts_tcp_server_test.py
-PRIVATE_PY_SCRIPT := $(the_py_script)
-
-default:
-	@echo "Running unit test for : $(PRIVATE_PY_SCRIPT)"
-	python $(PRIVATE_PY_SCRIPT)
+include $(CLEAR_VARS)
+LOCAL_MODULE := VtsSelfTestBaseTest
+VTS_CONFIG_SRC_DIR := testcases/vts_selftest/test_framework/base_test
+include test/vts/tools/build/Android.host_config.mk
diff --git a/testcases/vts_selftest/test_framework/base_test/AndroidTest.xml b/testcases/vts_selftest/test_framework/base_test/AndroidTest.xml
new file mode 100644
index 0000000..5a8192b
--- /dev/null
+++ b/testcases/vts_selftest/test_framework/base_test/AndroidTest.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Config for VTS Framework Integration Test Case">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HostDrivenTest.push" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer">
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="VtsSelfTestBaseTest"/>
+        <option name="test-case-path" value="vts/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTest" />
+    </test>
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="VtsSelfTestBaseTestFilterInclude"/>
+        <option name="test-case-path" value="vts/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterInclude" />
+        <option name="include-filter" value="suite1.test1"/>
+        <option name="include-filter" value="suite1.test2_32bit"/>
+        <option name="include-filter" value="r(suite2\..*)"/>
+        <option name="include-filter" value="VtsSelfTestBaseTestFilterInclude.suite3.test1"/>
+    </test>
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="VtsSelfTestBaseTestFilterExclude"/>
+        <option name="test-case-path" value="vts/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterExclude" />
+        <option name="exclude-filter" value="suite1.test1"/>
+        <option name="exclude-filter" value="suite1.test2_32bit"/>
+        <option name="exclude-filter" value="r(suite2\..*2_.*)"/>
+        <option name="exclude-filter" value="r(*)"/>
+        <option name="include-filter" value="-suite3.test1"/>
+        <option name="include-filter" value="-r(suite3\..*_32bit)"/>
+    </test>
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="VtsSelfTestBaseTestFilterIncludeExclude"/>
+        <option name="test-case-path" value="vts/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterIncludeExclude" />
+        <option name="include-filter" value="r(.*_32bit)"/>
+        <option name="include-filter" value="\r(fake.regex)"/>
+        <option name="exclude-filter" value="suite1.test1"/>
+    </test>
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="VtsSelfTestBaseTestFilterExcludeInclude"/>
+        <option name="test-case-path" value="vts/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterExcludeInclude" />
+        <option name="include-filter" value="r(.*_32bit)"/>
+        <option name="include-filter" value="suite1.test1_64bit"/>
+        <option name="exclude-filter" value="suite1.test1"/>
+        <option name="exclude-over-include" value="true"/>
+    </test>
+</configuration>
diff --git a/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTest.py b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTest.py
new file mode 100644
index 0000000..50c7899
--- /dev/null
+++ b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTest.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+
+from vts.runners.host import asserts
+from vts.runners.host import base_test
+from vts.runners.host import const
+from vts.runners.host import test_runner
+
+
+def AssertShellCommandSuccess(command_results, num_of_commands):
+    '''Check shell command result with assertions.
+
+    Given a shell command output, this command checks several things:
+    1. result is not None
+    2. result is not empty
+    3. number of results is consistant with number of commands
+    4. there is no error message on STDERR
+    5. return code of commands are all 0
+
+    Args:
+        command_results: dict, shell command results
+        num_of_commands: int, number of commands
+    '''
+    asserts.assertTrue(command_results is not None,
+                       'command result cannot be None')
+    asserts.assertEqual(len(command_results), 3, 'command result is empty')
+    for item in command_results:
+        asserts.assertEqual(
+            len(command_results[item]), num_of_commands,
+            'number of command result is not %s: %s' % (num_of_commands,
+                                                        command_results))
+    asserts.assertFalse(
+        any(command_results[const.STDERR]),
+        'received error message from stderr: %s' % command_results)
+    asserts.assertFalse(
+        any(command_results[const.EXIT_CODE]),
+        'received non zero return code: %s' % command_results)
+
+
+class VtsSelfTestBaseTest(base_test.BaseTestClass):
+    '''Two hello world test cases which use the shell driver.'''
+
+    def setUpClass(self):
+        self.dut = self.android_devices[0]
+        self.shell = self.dut.shell
+
+    def testShellEcho1(self):
+        '''A simple testcase which sends a command.'''
+        results = self.shell.Execute(
+            "echo hello_world")  # runs a shell command.
+        AssertShellCommandSuccess(results, 1)
+        logging.info(str(results[const.STDOUT]))  # prints the stdout
+        asserts.assertEqual(results[const.STDOUT][0].strip(),
+                            "hello_world")  # checks the stdout
+
+    def testShellEcho2(self):
+        '''A simple testcase which sends two commands.'''
+        results = self.shell.Execute(['echo hello', 'echo world'])
+        AssertShellCommandSuccess(results, 2)
+        logging.info(str(results[const.STDOUT]))
+        asserts.assertEqual(results[const.STDOUT][0].strip(), 'hello')
+        asserts.assertEqual(results[const.STDOUT][1].strip(), 'world')
+
+    def testDeviceTotalMem(self):
+        '''Test AndroidDevice class total_memory getter function'''
+        asserts.assertTrue(self.dut.total_memory > 0,
+                           'Failed to get device memory info.')
+
+
+if __name__ == "__main__":
+    test_runner.main()
diff --git a/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilter.py b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilter.py
new file mode 100644
index 0000000..5d53ee9
--- /dev/null
+++ b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilter.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+
+from vts.runners.host import asserts
+from vts.runners.host import base_test
+from vts.runners.host import signals
+from vts.utils.python.common import filter_utils
+
+
+class VtsSelfTestBaseTestFilter(base_test.BaseTestClass):
+    '''Base class for filter tests.
+
+    Attributes:
+        SHOULD_PASS_FILTER: list of string, test names that should pass
+                            the internal test filter configured by user
+        SHOULD_NOT_PASS_FILTER: list of string, test names that should not pass
+                                the internal test filter configured by user
+    '''
+    SHOULD_PASS_FILTER = []
+    SHOULD_NOT_PASS_FILTER = []
+
+    # Override
+    def setUpClass(self):
+        self.dut = self.android_devices[0]
+        self.shell = self.dut.shell
+
+    # Override
+    def filterOneTest(self, test_name, test_filter=None):
+        '''Filter a test case using the give test name.'''
+        pass
+
+    def CheckPassFilter(self, name):
+        '''Check whether test filter accept a give name.
+
+        Args:
+            name: string, test name
+
+        Returns:
+            bool, True if accept, False otherwise
+        '''
+        try:
+            super(VtsSelfTestBaseTestFilter,
+                  self)._filterOneTestThroughTestFilter(name)
+        except signals.TestSilent:
+            return False
+        else:
+            return True
+
+    def generatePassFilterTests(self):
+        '''Generate test cases for filter passing test names.'''
+        logging.info('generating tests for SHOULD_PASS_FILTER: %s',
+                     self.SHOULD_PASS_FILTER)
+        self.runGeneratedTests(
+            test_func=lambda x: asserts.assertTrue(self.CheckPassFilter(x), 'Filter should accept test name: %s' % x),
+            settings=self.SHOULD_PASS_FILTER,
+            name_func=lambda x: 'filter_accept_%s' % x)
+
+    def generateNonPassFilterTests(self):
+        '''Generate test cases for filter non passing test names.'''
+        logging.info('generating tests for SHOULD_NOT_PASS_FILTER: %s',
+                     self.SHOULD_NOT_PASS_FILTER)
+        self.runGeneratedTests(
+            test_func=lambda x: asserts.assertFalse(self.CheckPassFilter(x), 'Filter should not accept test name: %s' % x),
+            settings=self.SHOULD_NOT_PASS_FILTER,
+            name_func=lambda x: 'filter_not_accept_%s' % x)
diff --git a/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterExclude.py b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterExclude.py
new file mode 100644
index 0000000..a346eee
--- /dev/null
+++ b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterExclude.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+
+from vts.runners.host import test_runner
+from vts.testcases.vts_selftest.test_framework.base_test import VtsSelfTestBaseTestFilter
+
+
+class VtsSelfTestBaseTestFilterExclude(
+        VtsSelfTestBaseTestFilter.VtsSelfTestBaseTestFilter):
+    '''Filter test class for exclude filter.
+
+    Attributes:
+        SHOULD_PASS_FILTER: list of string, test names that should pass
+                            the internal test filter configured by user
+        SHOULD_NOT_PASS_FILTER: list of string, test names that should pass
+                                the internal test filter configured by user
+    '''
+
+    SHOULD_PASS_FILTER = [
+        'suite1.test1_16bit',
+        'suite1.test2',
+        'suite1.test2_64bit',
+        'suite2.test1_32bit',
+        'suite2.test1_64bit',
+        'suite3.test2_64bit',
+    ]
+
+    SHOULD_NOT_PASS_FILTER = [
+        'suite1.test1',
+        'suite1.test2_32bit',
+        'suite2.test2_32bit',
+        'suite2.test2_64bit',
+        'suite3.test1',
+        'suite3.test1_32bit',
+        'suite3.test1_64bit',
+        'suite3.test2_32bit',
+    ]
+
+
+if __name__ == "__main__":
+    test_runner.main()
diff --git a/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterExcludeInclude.py b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterExcludeInclude.py
new file mode 100644
index 0000000..301e498
--- /dev/null
+++ b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterExcludeInclude.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+
+from vts.runners.host import test_runner
+from vts.testcases.vts_selftest.test_framework.base_test import VtsSelfTestBaseTestFilter
+
+
+class VtsSelfTestBaseTestFilterExcludeInclude(
+        VtsSelfTestBaseTestFilter.VtsSelfTestBaseTestFilter):
+    '''Filter test class for include and exclude filter overlapping.
+
+    Attributes:
+        SHOULD_PASS_FILTER: list of string, test names that should pass
+                            the internal test filter configured by user
+        SHOULD_NOT_PASS_FILTER: list of string, test names that should pass
+                                the internal test filter configured by user
+    '''
+
+    SHOULD_PASS_FILTER = [
+        'any_except_suite1.test1_32bit',
+    ]
+
+    SHOULD_NOT_PASS_FILTER = [
+        'suite1.test1',
+        'suite1.test1_32bit',
+        'suite1.test1_64bit',
+        'any_64bit',
+        'any.other',
+    ]
+
+
+if __name__ == "__main__":
+    test_runner.main()
diff --git a/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterInclude.py b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterInclude.py
new file mode 100644
index 0000000..3198fba
--- /dev/null
+++ b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterInclude.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+
+from vts.runners.host import test_runner
+from vts.testcases.vts_selftest.test_framework.base_test import VtsSelfTestBaseTestFilter
+
+
+class VtsSelfTestBaseTestFilterInclude(
+        VtsSelfTestBaseTestFilter.VtsSelfTestBaseTestFilter):
+    '''Filter test class for include filter.
+
+    Attributes:
+        SHOULD_PASS_FILTER: list of string, test names that should pass
+                            the internal test filter configured by user
+        SHOULD_NOT_PASS_FILTER: list of string, test names that should pass
+                                the internal test filter configured by user
+    '''
+
+    SHOULD_PASS_FILTER = [
+        'suite1.test1',
+        'suite1.test1_32bit',
+        'suite1.test1_64bit',
+        'suite1.test2_32bit',
+        'suite2.any_matching_regex',
+        'suite3.test1',
+    ]
+
+    SHOULD_NOT_PASS_FILTER = [
+        'suite1.test2',
+        'suite2_any',
+        'any.other',
+        'suite3.test2',
+    ]
+
+
+if __name__ == "__main__":
+    test_runner.main()
diff --git a/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterIncludeExclude.py b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterIncludeExclude.py
new file mode 100644
index 0000000..4b5354a
--- /dev/null
+++ b/testcases/vts_selftest/test_framework/base_test/VtsSelfTestBaseTestFilterIncludeExclude.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+
+from vts.runners.host import test_runner
+from vts.testcases.vts_selftest.test_framework.base_test import VtsSelfTestBaseTestFilter
+
+
+class VtsSelfTestBaseTestFilterIncludeExclude(
+        VtsSelfTestBaseTestFilter.VtsSelfTestBaseTestFilter):
+    '''Filter test class for include and exclude filter overlapping.
+
+    Attributes:
+        SHOULD_PASS_FILTER: list of string, test names that should pass
+                            the internal test filter configured by user
+        SHOULD_NOT_PASS_FILTER: list of string, test names that should pass
+                                the internal test filter configured by user
+    '''
+
+    SHOULD_PASS_FILTER = [
+        'suite1.test1_32bit',
+        'any_32bit',
+        'r(fake.regex)',
+    ]
+
+    SHOULD_NOT_PASS_FILTER = [
+        'suite1.test1',
+        'suite1.test1_64bit',
+        'any.other',
+    ]
+
+
+if __name__ == "__main__":
+    test_runner.main()
diff --git a/harnesses/cloud_client/__init__.py b/testcases/vts_selftest/test_framework/base_test/__init__.py
similarity index 100%
copy from harnesses/cloud_client/__init__.py
copy to testcases/vts_selftest/test_framework/base_test/__init__.py
diff --git a/tools/build/tasks/list/vts_bin_package_list.mk b/tools/build/tasks/list/vts_bin_package_list.mk
index 04ee73a..de2baac 100644
--- a/tools/build/tasks/list/vts_bin_package_list.mk
+++ b/tools/build/tasks/list/vts_bin_package_list.mk
@@ -15,6 +15,7 @@
 
 vts_bin_packages := \
   vts_hal_agent \
-  vtssysfuzzer \
+  vts_hal_driver \
+  vts_hal_replayer \
   vts_shell_driver \
   vts_profiling_configure \
diff --git a/tools/build/tasks/list/vts_func_fuzzer_package_list.mk b/tools/build/tasks/list/vts_func_fuzzer_package_list.mk
index 7f274b1..28c91f4 100644
--- a/tools/build/tasks/list/vts_func_fuzzer_package_list.mk
+++ b/tools/build/tasks/list/vts_func_fuzzer_package_list.mk
@@ -39,7 +39,6 @@
   android.hardware.automotive.evs@1.0-vts.func_fuzzer.EvsDisplay \
   android.hardware.automotive.evs@1.0-vts.func_fuzzer.EvsEnumerator \
   android.hardware.automotive.vehicle@2.0-vts.func_fuzzer.Vehicle \
-  android.hardware.automotive.vehicle@2.1-vts.func_fuzzer.Vehicle \
   android.hardware.benchmarks.msgq@1.0-vts.func_fuzzer.BenchmarkMsgQ \
   android.hardware.biometrics.fingerprint@2.1-vts.func_fuzzer.BiometricsFingerprint \
   android.hardware.bluetooth@1.0-vts.func_fuzzer.BluetoothHci \
diff --git a/tools/build/tasks/list/vts_lib_package_list.mk b/tools/build/tasks/list/vts_lib_package_list.mk
index 8ba0171..31b9bf3 100644
--- a/tools/build/tasks/list/vts_lib_package_list.mk
+++ b/tools/build/tasks/list/vts_lib_package_list.mk
@@ -22,4 +22,5 @@
   libvts_measurement \
   libvts_multidevice_proto \
   libvts_profiling \
+  libvts_profiling_utils \
   libprotobuf-cpp-full \
diff --git a/tools/build/tasks/list/vts_test_host_lib_package_list.mk b/tools/build/tasks/list/vts_test_host_lib_package_list.mk
index 78265db..e2eee0e 100644
--- a/tools/build/tasks/list/vts_test_host_lib_package_list.mk
+++ b/tools/build/tasks/list/vts_test_host_lib_package_list.mk
@@ -4,7 +4,7 @@
     libcutils \
     liblog \
     libprotobuf-cpp-full \
-    libvts_common \
     libvts_multidevice_proto \
+    libvts_profiling_utils \
     libvts_traceprocessor \
     libz-host \
\ No newline at end of file
diff --git a/tools/build/tasks/list/vts_test_lib_hidl_package_list.mk b/tools/build/tasks/list/vts_test_lib_hidl_package_list.mk
index 41d6426..c31d0e6 100644
--- a/tools/build/tasks/list/vts_test_lib_hidl_package_list.mk
+++ b/tools/build/tasks/list/vts_test_lib_hidl_package_list.mk
@@ -22,7 +22,6 @@
   android.hardware.audio.effect@2.0-vts.driver \
   android.hardware.automotive.evs@1.0-vts.driver \
   android.hardware.automotive.vehicle@2.0-vts.driver \
-  android.hardware.automotive.vehicle@2.1-vts.driver \
   android.hardware.biometrics.fingerprint@2.1-vts.driver \
   android.hardware.bluetooth@1.0-vts.driver \
   android.hardware.boot@1.0-vts.driver \
@@ -50,6 +49,7 @@
   android.hardware.media@1.0-vts.driver \
   android.hardware.media.omx@1.0-vts.driver \
   android.hardware.memtrack@1.0-vts.driver \
+  android.hardware.neuralnetworks@1.0-vts.driver \
   android.hardware.nfc@1.0-vts.driver \
   android.hardware.oemlock@1.0-vts.driver \
   android.hardware.power@1.0-vts.driver \
@@ -61,6 +61,7 @@
   android.hardware.sensors@1.0-vts.driver \
   android.hardware.soundtrigger@2.0-vts.driver \
   android.hardware.thermal@1.0-vts.driver \
+  android.hardware.thermal@1.1-vts.driver \
   android.hardware.tv.cec@1.0-vts.driver \
   android.hardware.tv.input@1.0-vts.driver \
   android.hardware.usb@1.0-vts.driver \
@@ -76,7 +77,6 @@
   android.hardware.audio.common@2.0-vts.profiler \
   android.hardware.audio.effect@2.0-vts.profiler \
   android.hardware.automotive.vehicle@2.0-vts.profiler \
-  android.hardware.automotive.vehicle@2.1-vts.profiler \
   android.hardware.biometrics.fingerprint@2.1-vts.profiler \
   android.hardware.bluetooth@1.0-vts.profiler \
   android.hardware.boot@1.0-vts.profiler \
@@ -105,6 +105,7 @@
   android.hardware.media@1.0-vts.profiler \
   android.hardware.media.omx@1.0-vts.profiler \
   android.hardware.memtrack@1.0-vts.profiler \
+  android.hardware.neuralnetworks@1.0-vts.profiler \
   android.hardware.nfc@1.0-vts.profiler \
   android.hardware.oemlock@1.0-vts.profiler \
   android.hardware.power@1.0-vts.profiler \
@@ -118,6 +119,7 @@
   android.hardware.tetheroffload.config@1.0-vts.profiler \
   android.hardware.tetheroffload.control@1.0-vts.profiler \
   android.hardware.thermal@1.0-vts.profiler \
+  android.hardware.thermal@1.1-vts.profiler \
   android.hardware.tv.cec@1.0-vts.profiler \
   android.hardware.tv.input@1.0-vts.profiler \
   android.hardware.usb@1.0-vts.profiler \
@@ -138,9 +140,11 @@
   VtsHalBootV1_0TargetTest \
   VtsHalBroadcastradioV1_0TargetTest \
   VtsHalCameraProviderV2_4TargetTest \
+  VtsHalCasV1_0TargetTest \
   VtsHalConfigstoreV1_0TargetTest \
   VtsHalContexthubV1_0TargetTest \
   VtsHalDrmV1_0TargetTest \
+  VtsHalDumpstateV1_0TargetTest \
   VtsHalGatekeeperV1_0TargetTest \
   VtsHalGnssV1_0TargetTest \
   VtsHalGraphicsComposerV2_1TargetTest \
@@ -155,6 +159,7 @@
   VtsHalMediaOmxV1_0TargetVideoEncTest \
   VtsHalMediaOmxV1_0TargetVideoDecTest \
   VtsHalMemtrackV1_0TargetTest \
+  VtsHalNeuralnetworksV1_0TargetTest \
   VtsHalNfcV1_0TargetTest \
   VtsHalOemLockV1_0TargetTest \
   VtsHalPowerV1_0TargetTest \
@@ -168,6 +173,7 @@
   VtsHalTetheroffloadConfigV1_0TargetTest \
   VtsHalTetheroffloadControlV1_0TargetTest \
   VtsHalThermalV1_0TargetTest \
+  VtsHalThermalV1_1TargetTest \
   thermal_hidl_stress_test \
   VtsHalTvInputV1_0TargetTest \
   VtsHalUsbV1_0TargetTest \
diff --git a/tools/build/tasks/list/vts_test_lib_package_list.mk b/tools/build/tasks/list/vts_test_lib_package_list.mk
index 8ae4f3d..5cb7365 100644
--- a/tools/build/tasks/list/vts_test_lib_package_list.mk
+++ b/tools/build/tasks/list/vts_test_lib_package_list.mk
@@ -123,6 +123,13 @@
     libnstest_root \
     libnstest_public \
     libnstest_public_internal \
+    ld_preload_test_helper \
+    ld_preload_test_helper_lib1 \
+    ld_preload_test_helper_lib2 \
+    ld_config_test_helper \
+    ld_config_test_helper_lib1 \
+    ld_config_test_helper_lib2 \
+    ld_config_test_helper_lib3
 
 # for drm tests
 vts_test_lib_packages += \
diff --git a/tools/build/tasks/vts_package.mk b/tools/build/tasks/vts_package.mk
index eb9866a..3fc9912 100644
--- a/tools/build/tasks/vts_package.mk
+++ b/tools/build/tasks/vts_package.mk
@@ -30,7 +30,6 @@
 include $(LOCAL_PATH)/list/vts_test_hidl_hal_hash_list.mk
 -include external/linux-kselftest/android/kselftest_test_list.mk
 -include external/ltp/android/ltp_package_list.mk
--include vendor/google_vts/tools/build/tasks/list/vts_apk_package_list_vendor.mk
 
 VTS_OUT_ROOT := $(HOST_OUT)/vts
 VTS_TESTCASES_OUT := $(HOST_OUT)/vts/android-vts/testcases
@@ -101,14 +100,6 @@
 $(foreach f,$(target_trace_files),\
     test/vts-testcase/hal-trace/$(f):$(VTS_TESTCASES_OUT)/hal-hidl-trace/test/vts-testcase/hal-trace/$(f))
 
-target_prebuilt_apk_modules := \
-    $(vts_prebuilt_apk_packages) \
-
-target_prebuilt_apk_copy_pairs :=
-$(foreach m,$(target_prebuilt_apk_modules),\
-  $(if $(wildcard $(m)),\
-    $(eval target_prebuilt_apk_copy_pairs += $(m):$(VTS_TESTCASES_OUT)/prebuilt-apk/$(m))))
-
 target_hal_hash_modules := \
     $(vts_test_hidl_hal_hash_list) \
 
@@ -140,8 +131,7 @@
 
 host_additional_deps_copy_pairs := \
   test/vts/tools/vts-tradefed/etc/vts-tradefed_win.bat:$(VTS_TOOLS_OUT)/vts-tradefed_win.bat \
-  $(foreach d,$(ADDITIONAL_VTS_JARS),\
-    $(d):$(VTS_TOOLS_OUT)/$(notdir $(d)))
+  test/vts/tools/vts-tradefed/CtsDynamicConfig.xml:$(VTS_TESTCASES_OUT)/cts.dynamic
 
 # Packaging rule for host-side Python logic, configs, and data files
 
@@ -207,7 +197,6 @@
   $(call copy-many-files,$(target_spec_copy_pairs)) \
   $(call copy-many-files,$(target_trace_copy_pairs)) \
   $(call copy-many-files,$(target_hostdriven_copy_pairs)) \
-  $(call copy-many-files,$(target_prebuilt_apk_copy_pairs)) \
   $(call copy-many-files,$(target_hal_hash_copy_pairs)) \
   $(call copy-many-files,$(host_additional_deps_copy_pairs)) \
   $(call copy-many-files,$(host_framework_copy_pairs)) \
@@ -218,26 +207,4 @@
   $(call copy-many-files,$(performance_test_res_copy_pairs)) \
   $(call copy-many-files,$(audio_test_res_copy_pairs)) \
 
-# vendor-specific host logic
-vendor_testcase_files := \
-  $(call find-files-in-subdirs,vendor/google_vts/testcases,"*.py" -and -type f,.) \
-  $(call find-files-in-subdirs,vendor/google_vts/testcases,"*.config" -and -type f,.) \
-  $(call find-files-in-subdirs,vendor/google_vts/testcases,"*.push" -and -type f,.) \
-
-vendor_testcase_copy_pairs := \
-  $(foreach f,$(vendor_testcase_files),\
-    vendor/google_vts/testcases/$(f):$(VTS_TESTCASES_OUT)/vts/testcases/$(f))
-
-vendor_tf_files :=
-ifeq ($(BUILD_GOOGLE_VTS), true)
-  vendor_tf_files += \
-    $(HOST_OUT_JAVA_LIBRARIES)/google-tradefed-vts-prebuilt.jar
-endif
-
-vendor_tf_copy_pairs := \
-  $(foreach f,$(vendor_tf_files),\
-    $(f):$(VTS_OUT_ROOT)/android-vts/tools/$(notdir $(f)))
-
-$(compatibility_zip): \
-  $(call copy-many-files,$(vendor_testcase_copy_pairs)) \
-  $(call copy-many-files,$(vendor_tf_copy_pairs))
+-include vendor/google_vts/tools/build/vts_package_vendor.mk
diff --git a/tools/vts-tradefed/Android.mk b/tools/vts-tradefed/Android.mk
index 2131071..fee304e 100644
--- a/tools/vts-tradefed/Android.mk
+++ b/tools/vts-tradefed/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2016 Google Inc.
+# Copyright (C) 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -16,22 +16,21 @@
 
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under, ../../../../cts/common/host-side/tradefed/src)
 LOCAL_SRC_FILES += $(call all-java-files-under, ../../harnesses/tradefed/src)
 
 LOCAL_JAVA_RESOURCE_DIRS := res
-LOCAL_JAVA_RESOURCE_DIRS += ../../../../cts/common/host-side/tradefed/res
 
 LOCAL_SUITE_BUILD_NUMBER := $(BUILD_NUMBER_FROM_FILE)
 LOCAL_SUITE_TARGET_ARCH := $(TARGET_ARCH)
 LOCAL_SUITE_NAME := VTS
 LOCAL_SUITE_FULLNAME := "Vendor Test Suite"
-LOCAL_SUITE_VERSION := 8.0
+LOCAL_SUITE_VERSION := 8.1
 LOCAL_STATIC_JAVA_LIBRARIES := \
     libvts_protos_host \
 
 LOCAL_STATIC_JAVA_LIBRARIES += \
     google-api-java-client-min-repackaged \
+    cts-tradefed-harness
 
 LOCAL_JAR_MANIFEST := MANIFEST.mf
 
diff --git a/tools/vts-tradefed/res/config/basic-reporters.xml b/tools/vts-tradefed/CtsDynamicConfig.xml
similarity index 71%
rename from tools/vts-tradefed/res/config/basic-reporters.xml
rename to tools/vts-tradefed/CtsDynamicConfig.xml
index 25b5cdc..ffcf17c 100644
--- a/tools/vts-tradefed/res/config/basic-reporters.xml
+++ b/tools/vts-tradefed/CtsDynamicConfig.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2015 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -13,5 +12,9 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<configuration description="Configuration with basic VTS reporters" >
-</configuration>
+
+<dynamicConfig>
+    <entry key="media_files_url">
+         <value>https://dl.google.com/dl/android/cts/android-cts-media-1.3.zip</value>
+    </entry>
+</dynamicConfig>
diff --git a/tools/vts-tradefed/etc/Android.mk b/tools/vts-tradefed/etc/Android.mk
index db1d7ec..aa3cc16 100644
--- a/tools/vts-tradefed/etc/Android.mk
+++ b/tools/vts-tradefed/etc/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2016 Google Inc.
+# Copyright (C) 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/etc/vts-gce-tradefed b/tools/vts-tradefed/etc/vts-gce-tradefed
index 90ef6ae..318d7d2 100755
--- a/tools/vts-tradefed/etc/vts-gce-tradefed
+++ b/tools/vts-tradefed/etc/vts-gce-tradefed
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (C) 2016 Google Inc.
+# Copyright (C) 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/etc/vts-tradefed b/tools/vts-tradefed/etc/vts-tradefed
index 273cb50..ee14f15 100755
--- a/tools/vts-tradefed/etc/vts-tradefed
+++ b/tools/vts-tradefed/etc/vts-tradefed
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (C) 2016 Google Inc.
+# Copyright (C) 2016 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/etc/vts-tradefed_win.bat b/tools/vts-tradefed/etc/vts-tradefed_win.bat
index 8851735..6aac664 100644
--- a/tools/vts-tradefed/etc/vts-tradefed_win.bat
+++ b/tools/vts-tradefed/etc/vts-tradefed_win.bat
@@ -1,4 +1,4 @@
-:: Copyright (C) 2017 Google Inc.

+:: Copyright (C) 2017 The Android Open Source Project

 ::

 :: Licensed under the Apache License, Version 2.0 (the "License");

 :: you may not use this file except in compliance with the License.

@@ -104,9 +104,7 @@
 :: skip loading shared libraries for host-side executables

 

 :: include any host-side test jars

-for %%F in ("%VTS_ROOT%\android-vts\testcases\*.jar") do (

-    set JAR_PATH=!JAR_PATH!;%%F

-)

+set JAR_PATH=%JAR_PATH%;%VTS_ROOT%\android-vts\testcases\*

 echo JAR_PATH=%JAR_PATH%

 

 cd %VTS_ROOT%/android-vts/testcases

diff --git a/tools/vts-tradefed/res/config/cts-on-gsi.xml b/tools/vts-tradefed/res/config/cts-on-gsi.xml
new file mode 100644
index 0000000..30010c2
--- /dev/null
+++ b/tools/vts-tradefed/res/config/cts-on-gsi.xml
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Runs a subset of CTS tests using a general system image (GSI)">
+
+    <include name="cts-common" />
+
+    <option name="plan" value="cts-on-gsi" />
+
+    <option name="compatibility:primary-abi-only" value="true" />
+
+    <!-- Tell all AndroidJUnitTests to exclude certain annotations -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+
+    <!-- Tell all HostTests to exclude certain annotations -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+
+    <!-- Radio system of a general system image is not checked -->
+    <option name="compatibility:exclude-filter" value="CtsTelephonyTestCases" />
+    <option name="compatibility:exclude-filter" value="CtsTelephony2TestCases" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.SystemFeaturesTest#testLocationFeatures" />
+    <option name="compatibility:exclude-filter" value="CtsIncidentHostTestCases com.android.server.cts.PackageIncidentTest#testPackageServiceDump" />
+
+    <!-- Exclude telephony related testcases -->
+    <option name="compatibility:exclude-filter" value="CtsCarrierApiTestCases android.carrierapi.cts.CarrierApiTest#testGetIccAuthentication" />
+    <option name="compatibility:exclude-filter" value="CtsCarrierApiTestCases android.carrierapi.cts.CarrierApiTest#testHasCarrierPrivileges" />
+    <option name="compatibility:exclude-filter" value="CtsCarrierApiTestCases android.carrierapi.cts.CarrierApiTest#testSendDialerSpecialCode" />
+    <option name="compatibility:exclude-filter" value="CtsJobSchedulerTestCases android.jobscheduler.cts.ConnectivityConstraintTest#testConnectivityConstraintExecutes_metered" />
+    <option name="compatibility:exclude-filter" value="CtsNetTestCasesLegacyApi22 android.net.cts.legacy.api22.ConnectivityManagerLegacyTest#testStartUsingNetworkFeature_enableHipri" />
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.NoReceiveSmsPermissionTest#testAppSpecificSmsToken" />
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.NoReceiveSmsPermissionTest#testReceiveTextMessage" />
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.NoSystemFunctionPermissionTest#testSendSms" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTest android.security.cts.SELinuxHostTest#testNoExemptionsForBinderInVendorBan" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTest android.security.cts.SELinuxHostTest#testNoExemptionsForSocketsBetweenCoreAndVendorBan" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTest android.security.cts.SELinuxHostTest#testNoExemptionsForVendorExecutingCore" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testAppDetails" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testAppSummary" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testCallback" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testDeviceSummary" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testTagDetails" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testUidDetails" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testUserSummary" />
+
+    <!-- Exclude not applicable testcases-->
+    <option name="compatibility:exclude-filter" value="CtsSignatureTestCases" />
+    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.UsbDebuggingTest#testUsbDebugging" />
+
+    <!--
+        Exclude Webkit related testcases
+        TODO(jaekyun@): b/63600240, Webkit related testcases will be revived when the RRO packaging logic is revised so that we can selectively compose a RRO from overlays.
+    -->
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases" />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.EphemeralTest#testWebViewLoads" />
+    <option name="compatibility:exclude-filter" value="CtsAssistTestCases android.assist.cts.WebViewTest#testWebView" />
+    <option name="compatibility:exclude-filter" value="CtsHostsideWebViewTests com.android.cts.webkit.WebViewHostSideStartupTest#testCookieManager" />
+    <option name="compatibility:exclude-filter" value="CtsHostsideWebViewTests com.android.cts.webkit.WebViewHostSideStartupTest#testStrictMode" />
+    <option name="compatibility:exclude-filter" value="CtsHostsideWebViewTests com.android.cts.webkit.WebViewHostSideStartupTest#testWebViewVersionApi" />
+    <option name="compatibility:exclude-filter" value="CtsHostsideWebViewTests com.android.cts.webkit.WebViewHostSideStartupTest#testWebViewVersionApiOnUiThread" />
+    <option name="compatibility:exclude-filter" value="CtsTextTestCases android.text.cts.EmojiTest#testEmojiGlyph" />
+    <option name="compatibility:exclude-filter" value="CtsTextTestCases android.text.util.cts.LinkifyTest#testAddLinks_doesNotAddLinksForUrlWithoutProtocolAndWithoutKnownTld" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.PathClippingTests#testWebViewClipWithCircle" />
+    <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.TextViewTest#testAccessAutoLinkMask" />
+    <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.TextViewTest#testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText" />
+    <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.TextViewTest#testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText" />
+    <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.TextViewTest#testAppend_addsLinksEvenWhenThereAreUrlsSetBefore" />
+    <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.TextViewTest#testAppend_addsLinksWhenAutoLinkIsEnabled" />
+    <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.TextViewTest#testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled" />
+    <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.TextViewTest#testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks" />
+    <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.TextViewTest#testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled" />
+
+    <!--
+        Exclude testcases failing on AOSP Pixel system.img
+        TODO(jaeshin@): b/63302562, Track future fixes to AOSP Pixel system.img and revive these testcases accordingly.
+    -->
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.EphemeralTest#testExposedSystemActivities" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceCommand" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceSearchHandsFree" />
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.PrivappPermissionsTest#testPrivappPermissionsEnforcement" />
+    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp8Other0Qual1920x1080" />
+
+    <!--
+        Exclude Verity tese cases, because we need to disable Verity to test with GSI
+    -->
+    <option name="compatibility:exclude-filter" value="CtsKeystoreTestCases android.keystore.cts.KeyAttestationTest#testEcAttestation" />
+    <option name="compatibility:exclude-filter" value="CtsKeystoreTestCases android.keystore.cts.KeyAttestationTest#testRsaAttestation" />
+
+    <!-- Explicitly include CTS test modules  -->
+    <option name="compatibility:include-filter" value="CtsAadbHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsAbiOverrideHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsAccelerationTestCases" />
+    <option name="compatibility:include-filter" value="CtsAccessibilityServiceTestCases" />
+    <option name="compatibility:include-filter" value="CtsAccessibilityTestCases" />
+    <option name="compatibility:include-filter" value="CtsAccountManagerTestCases" />
+    <option name="compatibility:include-filter" value="CtsAdminPackageInstallerTestCases" />
+    <option name="compatibility:include-filter" value="CtsAdminTestCases" />
+    <option name="compatibility:include-filter" value="CtsAlarmClockTestCases" />
+    <option name="compatibility:include-filter" value="CtsAndroidAppTestCases" />
+    <option name="compatibility:include-filter" value="CtsAnimationTestCases" />
+    <option name="compatibility:include-filter" value="CtsAppSecurityHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsAppTestCases" />
+    <option name="compatibility:include-filter" value="CtsAppUsageHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsAppWidgetTestCases" />
+    <option name="compatibility:include-filter" value="CtsAslrMallocTestCases" />
+    <option name="compatibility:include-filter" value="CtsAssistTestCases" />
+    <option name="compatibility:include-filter" value="CtsAtraceHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsAutoFillServiceTestCases" />
+    <option name="compatibility:include-filter" value="CtsBackgroundRestrictionsTestCases" />
+    <option name="compatibility:include-filter" value="CtsBackupHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsBackupTestCases" />
+    <option name="compatibility:include-filter" value="CtsBionicTestCases" />
+    <option name="compatibility:include-filter" value="CtsBluetoothTestCases" />
+    <option name="compatibility:include-filter" value="CtsBootStatsTestCases" />
+    <option name="compatibility:include-filter" value="CtsCalendarcommon2TestCases" />
+    <option name="compatibility:include-filter" value="CtsCameraApi25TestCases" />
+    <option name="compatibility:include-filter" value="CtsCameraTestCases" />
+    <option name="compatibility:include-filter" value="CtsCarTestCases" />
+    <option name="compatibility:include-filter" value="CtsCarrierApiTestCases" />
+    <option name="compatibility:include-filter" value="CtsColorModeTestCases" />
+    <option name="compatibility:include-filter" value="CtsCompilationTestCases" />
+    <option name="compatibility:include-filter" value="CtsContactsProviderWipe" />
+    <option name="compatibility:include-filter" value="CtsContentTestCases" />
+    <option name="compatibility:include-filter" value="CtsCppToolsTestCases" />
+    <option name="compatibility:include-filter" value="CtsDatabaseTestCases" />
+    <option name="compatibility:include-filter" value="CtsDebugTestCases" />
+    <option name="compatibility:include-filter" value="CtsDeqpTestCases" />
+    <option name="compatibility:include-filter" value="CtsDevicePolicyManagerTestCases" />
+    <option name="compatibility:include-filter" value="CtsDisplayTestCases" />
+    <option name="compatibility:include-filter" value="CtsDpiTestCases" />
+    <option name="compatibility:include-filter" value="CtsDpiTestCases2" />
+    <option name="compatibility:include-filter" value="CtsDramTestCases" />
+    <option name="compatibility:include-filter" value="CtsDreamsTestCases" />
+    <option name="compatibility:include-filter" value="CtsDrmTestCases" />
+    <option name="compatibility:include-filter" value="CtsDumpsysHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsEdiHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsEffectTestCases" />
+    <option name="compatibility:include-filter" value="CtsExternalServiceTestCases" />
+    <option name="compatibility:include-filter" value="CtsExternalSourcesTestCases" />
+    <option name="compatibility:include-filter" value="CtsFileSystemTestCases" />
+    <option name="compatibility:include-filter" value="CtsFragmentTestCases" />
+    <option name="compatibility:include-filter" value="CtsGestureTestCases" />
+    <option name="compatibility:include-filter" value="CtsGraphicsTestCases" />
+    <option name="compatibility:include-filter" value="CtsHardwareTestCases" />
+    <option name="compatibility:include-filter" value="CtsHostTzDataTests" />
+    <option name="compatibility:include-filter" value="CtsHostsideNetworkTests" />
+    <option name="compatibility:include-filter" value="CtsHostsideNumberBlockingTestCases" />
+    <option name="compatibility:include-filter" value="CtsHostsideTvTests" />
+    <option name="compatibility:include-filter" value="CtsHostsideWebViewTests" />
+    <option name="compatibility:include-filter" value="CtsIcuTestCases" />
+    <option name="compatibility:include-filter" value="CtsIncidentHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsIncidentTestCases" />
+    <option name="compatibility:include-filter" value="CtsInputMethodServiceHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsInputMethodTestCases" />
+    <option name="compatibility:include-filter" value="CtsIntentSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsJankDeviceTestCases" />
+    <option name="compatibility:include-filter" value="CtsJdwpSecurityHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJdwpTestCases" />
+    <option name="compatibility:include-filter" value="CtsJniTestCases" />
+    <option name="compatibility:include-filter" value="CtsJobSchedulerTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiAttachingHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRedefineClassesHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest902HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest903HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest904HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest905HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest906HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest907HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest908HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest910HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest911HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest912HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest913HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest914HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest915HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest917HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest918HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest919HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest920HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest922HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest923HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest924HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest926HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest927HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest928HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest930HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest931HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest932HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest940HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest942HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest944HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest945HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest947HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest951HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest982HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest984HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest985HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest986HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiTaggingHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiTrackingHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsKernelConfigTestCases" />
+    <option name="compatibility:include-filter" value="CtsKeystoreTestCases" />
+    <option name="compatibility:include-filter" value="CtsLeanbackJankTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreFileIOTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreJavaUtilCollectionsTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreJsr166TestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreLegacy22TestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreOjTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreOkHttpTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreWycheproofBCTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreWycheproofConscryptTestCases" />
+    <option name="compatibility:include-filter" value="CtsLiblogTestCases" />
+    <option name="compatibility:include-filter" value="CtsLocation2TestCases" />
+    <option name="compatibility:include-filter" value="CtsLocationTestCases" />
+    <option name="compatibility:include-filter" value="CtsLogdTestCases" />
+    <option name="compatibility:include-filter" value="CtsMediaBitstreamsTestCases" />
+    <option name="compatibility:include-filter" value="CtsMediaHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsMediaStressTestCases" />
+    <option name="compatibility:include-filter" value="CtsMediaTestCases" />
+    <option name="compatibility:include-filter" value="CtsMidiTestCases" />
+    <option name="compatibility:include-filter" value="CtsMonkeyTestCases" />
+    <option name="compatibility:include-filter" value="CtsMultiUserHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsMultiUserTestCases" />
+    <option name="compatibility:include-filter" value="CtsNativeHardwareTestCases" />
+    <option name="compatibility:include-filter" value="CtsNativeMediaAAudioTestCases" />
+    <option name="compatibility:include-filter" value="CtsNativeMediaSlTestCases" />
+    <option name="compatibility:include-filter" value="CtsNativeMediaXaTestCases" />
+    <option name="compatibility:include-filter" value="CtsNativeNetTestCases" />
+    <option name="compatibility:include-filter" value="CtsNdefTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigAttributeTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigBasicDebugDisabledTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigBasicDebugEnabledTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigBasicDomainConfigTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigCleartextTrafficTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigDownloadManagerTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigInvalidPinTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigNestedDomainConfigTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecConfigResourcesSrcTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecPolicyUsesCleartextTrafficFalseTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecPolicyUsesCleartextTrafficTrueTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetSecPolicyUsesCleartextTrafficUnspecifiedTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetTestCasesLegacyApi22" />
+    <option name="compatibility:include-filter" value="CtsNetTestCasesLegacyPermission22" />
+    <option name="compatibility:include-filter" value="CtsOpenGLTestCases" />
+    <option name="compatibility:include-filter" value="CtsOpenGlPerf2TestCases" />
+    <option name="compatibility:include-filter" value="CtsOpenGlPerfTestCases" />
+    <option name="compatibility:include-filter" value="CtsOsHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsOsTestCases" />
+    <option name="compatibility:include-filter" value="CtsPdfTestCases" />
+    <option name="compatibility:include-filter" value="CtsPermission2TestCases" />
+    <option name="compatibility:include-filter" value="CtsPermissionTestCases" />
+    <option name="compatibility:include-filter" value="CtsPreference2TestCases" />
+    <option name="compatibility:include-filter" value="CtsPreferenceTestCases" />
+    <option name="compatibility:include-filter" value="CtsPrintTestCases" />
+    <option name="compatibility:include-filter" value="CtsProtoTestCases" />
+    <option name="compatibility:include-filter" value="CtsProviderTestCases" />
+    <option name="compatibility:include-filter" value="CtsRenderscriptLegacyTestCases" />
+    <option name="compatibility:include-filter" value="CtsRenderscriptTestCases" />
+    <option name="compatibility:include-filter" value="CtsRsBlasTestCases" />
+    <option name="compatibility:include-filter" value="CtsRsCppTestCases" />
+    <option name="compatibility:include-filter" value="CtsSampleDeviceTestCases" />
+    <option name="compatibility:include-filter" value="CtsSampleHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsSaxTestCases" />
+    <option name="compatibility:include-filter" value="CtsSecurityHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsSecurityTestCases" />
+    <option name="compatibility:include-filter" value="CtsSelinuxTargetSdk2TestCases" />
+    <option name="compatibility:include-filter" value="CtsSelinuxTargetSdkTestCases" />
+    <option name="compatibility:include-filter" value="CtsSensorTestCases" />
+    <option name="compatibility:include-filter" value="CtsServicesHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsShortcutHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsShortcutManagerTestCases" />
+    <option name="compatibility:include-filter" value="CtsSimpleCpuTestCases" />
+    <option name="compatibility:include-filter" value="CtsSimpleperfTestCases" />
+    <option name="compatibility:include-filter" value="CtsSpeechTestCases" />
+    <option name="compatibility:include-filter" value="CtsSustainedPerformanceHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsSyncContentHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsSystemIntentTestCases" />
+    <option name="compatibility:include-filter" value="CtsSystemUiHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsSystemUiTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases2" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases3" />
+    <option name="compatibility:include-filter" value="CtsTelephony2TestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephonyTestCases" />
+    <option name="compatibility:include-filter" value="CtsTextTestCases" />
+    <option name="compatibility:include-filter" value="CtsThemeDeviceTestCases" />
+    <option name="compatibility:include-filter" value="CtsThemeHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsToastLegacyTestCases" />
+    <option name="compatibility:include-filter" value="CtsToastTestCases" />
+    <option name="compatibility:include-filter" value="CtsTransitionTestCases" />
+    <option name="compatibility:include-filter" value="CtsTrustedVoiceHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsTvProviderTestCases" />
+    <option name="compatibility:include-filter" value="CtsTvTestCases" />
+    <option name="compatibility:include-filter" value="CtsUiAutomationTestCases" />
+    <option name="compatibility:include-filter" value="CtsUiDeviceTestCases" />
+    <option name="compatibility:include-filter" value="CtsUiHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsUiRenderingTestCases" />
+    <option name="compatibility:include-filter" value="CtsUidIsolationTestCases" />
+    <option name="compatibility:include-filter" value="CtsUsageStatsTestCases" />
+    <option name="compatibility:include-filter" value="CtsUsbTests" />
+    <option name="compatibility:include-filter" value="CtsUtilTestCases" />
+    <option name="compatibility:include-filter" value="CtsVideoTestCases" />
+    <option name="compatibility:include-filter" value="CtsViewTestCases" />
+    <option name="compatibility:include-filter" value="CtsVmTestCases" />
+    <option name="compatibility:include-filter" value="CtsVoiceInteractionTestCases" />
+    <option name="compatibility:include-filter" value="CtsVoiceSettingsTestCases" />
+    <option name="compatibility:include-filter" value="CtsVrTestCases" />
+    <option name="compatibility:include-filter" value="CtsWebkitTestCases" />
+    <option name="compatibility:include-filter" value="CtsWidgetTestCases" />
+    <option name="compatibility:include-filter" value="CtsWindowManagerHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsWrapNoWrapTestCases" />
+    <option name="compatibility:include-filter" value="CtsWrapWrapDebugMallocDebugTestCases" />
+    <option name="compatibility:include-filter" value="CtsWrapWrapDebugTestCases" />
+    <option name="compatibility:include-filter" value="CtsWrapWrapNoDebugTestCases" />
+
+    <!-- Exclude test cases for b/64488375
+    -->
+
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceCommand" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceSearchHandsFree" />
+
+    <option name="compatibility:exclude-filter" value="CtsJobSchedulerTestCases android.jobscheduler.cts.ConnectivityConstraintTest#testConnectivityConstraintExecutes_metered" />
+
+    <option name="compatibility:exclude-filter" value="CtsNetTestCasesLegacyApi22 android.net.cts.legacy.api22.ConnectivityManagerLegacyTest#testStartUsingNetworkFeature_enableHipri" />
+
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.NoSystemFunctionPermissionTest#testSendSms" />
+
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.NoReceiveSmsPermissionTest#testAppSpecificSmsToken" />
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.NoReceiveSmsPermissionTest#testReceiveTextMessage" />
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.PrivappPermissionsTest#testPrivappPermissionsEnforcement" />
+
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.signature.cts.IntentTest#shouldNotFindUnexpectedIntents" />
+
+    <option name="compatibility:exclude-filter" value="CtsTextTestCases android.text.cts.EmojiTest#testEmojiGlyph" />
+    <option name="compatibility:exclude-filter" value="CtsTextTestCases android.text.util.cts.LinkifyTest#testAddLinks_doesNotAddLinksForUrlWithoutProtocolAndWithoutKnownTld" />
+
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.PathClippingTests#testWebViewClipWithCircle" />
+
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewClientTest#testOnUnhandledKeyEvent" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewTest#testFindAll" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewTest#testFindNext" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewTest#testFlingScroll" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewTest#testGetContentHeight" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewTest#testGetHitTestResult" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewTest#testPageScroll" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewTest#testRequestFocusNodeHref" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases android.webkit.cts.WebViewTest#testRequestImageRef" />
+
+</configuration>
diff --git a/tools/vts-tradefed/res/config/cts-vendor-interface.xml b/tools/vts-tradefed/res/config/cts-vendor-interface.xml
new file mode 100644
index 0000000..73ec49b
--- /dev/null
+++ b/tools/vts-tradefed/res/config/cts-vendor-interface.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Runs a subset of CTS tests that can heavily exercise HALs">
+
+    <include name="cts" />
+
+    <option name="plan" value="cts-vendor-interface" />
+
+    <!-- Include test modules -->
+    <option name="compatibility:include-filter" value="CtsAadbHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsAccessibilityServiceTestCases" />
+    <option name="compatibility:include-filter" value="CtsAccountManagerTestCases" />
+    <option name="compatibility:include-filter" value="CtsAnimationTestCases" />
+    <option name="compatibility:include-filter" value="CtsAppTestCases" />
+    <option name="compatibility:include-filter" value="CtsAtraceHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsAutoFillServiceTestCases" />
+    <option name="compatibility:include-filter" value="CtsCameraTestCases" />
+    <option name="compatibility:include-filter" value="CtsContentTestCases" />
+    <option name="compatibility:include-filter" value="CtsDeqpTestCases" />
+    <option name="compatibility:include-filter" value="CtsFragmentTestCases" />
+    <option name="compatibility:include-filter" value="CtsGraphicsTestCases" />
+    <option name="compatibility:include-filter" value="CtsHostsideNetworkTests" />
+    <option name="compatibility:include-filter" value="CtsIcuTestCases" />
+    <option name="compatibility:include-filter" value="CtsKeystoreTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreJavaUtilCollectionsTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreOjTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreTestCases" />
+    <option name="compatibility:include-filter" value="CtsLocationTestCases" />
+    <option name="compatibility:include-filter" value="CtsMediaStressTestCases" />
+    <option name="compatibility:include-filter" value="CtsMidiTestCases" />
+    <option name="compatibility:include-filter" value="CtsMonkeyTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetTestCases" />
+    <option name="compatibility:include-filter" value="CtsOsTestCases" />
+    <option name="compatibility:include-filter" value="CtsPdfTestCases" />
+    <option name="compatibility:include-filter" value="CtsPreference2TestCases" />
+    <option name="compatibility:include-filter" value="CtsPrintTestCases" />
+    <option name="compatibility:include-filter" value="CtsProviderTestCases" />
+    <option name="compatibility:include-filter" value="CtsRsBlasTestCases" />
+    <option name="compatibility:include-filter" value="CtsSecurityHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsSecurityTestCases" />
+    <option name="compatibility:include-filter" value="CtsSensorTestCases" />
+    <option name="compatibility:include-filter" value="CtsShortcutHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsSustainedPerformanceHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephonyTestCases" />
+    <option name="compatibility:include-filter" value="CtsTextTestCases" />
+    <option name="compatibility:include-filter" value="CtsUiRenderingTestCases" />
+    <option name="compatibility:include-filter" value="CtsViewTestCases" />
+    <option name="compatibility:include-filter" value="CtsWebkitTestCases" />
+    <option name="compatibility:include-filter" value="CtsWidgetTestCases" />
+    <option name="compatibility:include-filter" value="CtsWindowManagerHostTestCases" />
+
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:com.android.compatibility.common.util.VendorInterfaceTest" />
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:include-annotation:com.android.compatibility.common.util.VendorInterfaceTest" />
+
+</configuration>
diff --git a/tools/vts-tradefed/res/config/vts-base.xml b/tools/vts-tradefed/res/config/vts-base.xml
index 37b33f9..506062f 100644
--- a/tools/vts-tradefed/res/config/vts-base.xml
+++ b/tools/vts-tradefed/res/config/vts-base.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 Google Inc.
+<!-- Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-camera-its.xml b/tools/vts-tradefed/res/config/vts-camera-its.xml
index e166038..fa40f6e 100644
--- a/tools/vts-tradefed/res/config/vts-camera-its.xml
+++ b/tools/vts-tradefed/res/config/vts-camera-its.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-codelab.xml b/tools/vts-tradefed/res/config/vts-codelab.xml
index 94e55df..a838a98 100644
--- a/tools/vts-tradefed/res/config/vts-codelab.xml
+++ b/tools/vts-tradefed/res/config/vts-codelab.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-fuzz.xml b/tools/vts-tradefed/res/config/vts-fuzz.xml
index eb58251..2bcdc3a 100644
--- a/tools/vts-tradefed/res/config/vts-fuzz.xml
+++ b/tools/vts-tradefed/res/config/vts-fuzz.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-gce.xml b/tools/vts-tradefed/res/config/vts-gce.xml
index 712ac36..0c912a2 100644
--- a/tools/vts-tradefed/res/config/vts-gce.xml
+++ b/tools/vts-tradefed/res/config/vts-gce.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-hal-auto.xml b/tools/vts-tradefed/res/config/vts-hal-auto.xml
new file mode 100644
index 0000000..fb45101
--- /dev/null
+++ b/tools/vts-tradefed/res/config/vts-hal-auto.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="VTS Serving Plan for HALs - Auto">
+    <include name="vts-base" />
+    <option name="plan" value="vts" />
+    <option name="test-tag" value="vts" />
+    <option name="vts-plan-result:plan-name" value="vts-hal-auto" />
+
+    <option name="compatibility:include-filter" value="VtsHalBroadcastradioV1_1TargetTest" />
+    <option name="compatibility:include-filter" value="VtsHalEvsV1_0Target" />
+    <option name="compatibility:include-filter" value="VtsHalAutomotiveVehicleV2_0Host" />
+    <option name="compatibility:include-filter" value="VtsHalAutomotiveVehicleV2_1Host" />
+
+</configuration>
diff --git a/tools/vts-tradefed/res/config/vts-hal-profiling-passthrough.xml b/tools/vts-tradefed/res/config/vts-hal-profiling-passthrough.xml
index a623376..f15f23a 100644
--- a/tools/vts-tradefed/res/config/vts-hal-profiling-passthrough.xml
+++ b/tools/vts-tradefed/res/config/vts-hal-profiling-passthrough.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 Google Inc.
+<!-- Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -24,38 +24,23 @@
   <!--  Include all profiling tests -->
   <option name="compatibility:include-filter" value="VtsHalAudioV2_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalAudioEffectV2_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalBiometricsFingerprintV2_1TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalBootV1_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalBroadcastradioV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalBluetoothV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalBootV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalCameraProviderV2_4TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalConfigstoreV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalContexthubV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalDrmV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalGatekeeperV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalGnssV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalGraphicsComposerV2_1TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalGraphicsMapperV2_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalIrV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalKeymasterV3_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalLightV2_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalMemtrackV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalNfcV1_0HostProfiling" />
   <option name="compatibility:include-filter" value="VtsHalNfcV1_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalPowerV1_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalPowerV1_1TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalRadioV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalRenderscriptV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalSensorsV1_0HostProfiling" />
   <option name="compatibility:include-filter" value="VtsHalSensorsV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalSoundtriggerV2_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalThermalV1_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalUsbV1_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalVibratorV1_0HostProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalVibratorV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalVrV1_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalWifiV1_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalWifiV1_1TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalWifiNanV1_0TargetProfiling" />
-  <option name="compatibility:include-filter" value="VtsHalWifiSupplicantV1_0TargetProfiling" />
 </configuration>
diff --git a/tools/vts-tradefed/res/config/vts-hal-profiling-tv.xml b/tools/vts-tradefed/res/config/vts-hal-profiling-tv.xml
index 4a9e3e6..0a88655 100644
--- a/tools/vts-tradefed/res/config/vts-hal-profiling-tv.xml
+++ b/tools/vts-tradefed/res/config/vts-hal-profiling-tv.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 Google Inc.
+<!-- Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-hal-profiling.xml b/tools/vts-tradefed/res/config/vts-hal-profiling.xml
index af67a94..3b529d0 100644
--- a/tools/vts-tradefed/res/config/vts-hal-profiling.xml
+++ b/tools/vts-tradefed/res/config/vts-hal-profiling.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -19,7 +19,46 @@
   <option name="test-tag" value="vts-star" />
   <option name="vts-plan-result:plan-name" value="vts-hal-profiling" />
 
+  <option name="compatibility:include-filter" value="VtsHalAudioV2_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalAudioEffectV2_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalBiometricsFingerprintV2_1TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalBootV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalBroadcastradioV1_0TargetProfiling" />
   <option name="compatibility:include-filter" value="VtsHalBluetoothV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalCameraProviderV2_4TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalConfigstoreV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalConfigstoreV1_1TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalContexthubV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalDrmV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalGatekeeperV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalGnssV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalGraphicsComposerV2_1TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalGraphicsMapperV2_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalHealthV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalIrV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalKeymasterV3_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalLightV2_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalMemtrackV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalNfcV1_0HostProfiling" />
   <option name="compatibility:include-filter" value="VtsHalNfcV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalOemHookV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalOemLockV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalPowerV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalPowerV1_1TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalRadioV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalRenderscriptV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalSensorsV1_0HostProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalSensorsV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalSoundtriggerV2_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalThermalV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalUsbV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalVibratorV1_0HostProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalVibratorV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalVrV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalWeaverV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalWifiV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalWifiV1_1TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalWifiNanV1_0TargetProfiling" />
+  <option name="compatibility:include-filter" value="VtsHalWifiSupplicantV1_0TargetProfiling" />
 
-</configuration>
\ No newline at end of file
+</configuration>
diff --git a/tools/vts-tradefed/res/config/vts-hal-tv.xml b/tools/vts-tradefed/res/config/vts-hal-tv.xml
index 09a9632..88c0e25 100644
--- a/tools/vts-tradefed/res/config/vts-hal-tv.xml
+++ b/tools/vts-tradefed/res/config/vts-hal-tv.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 Google Inc.
+<!-- Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-hal.xml b/tools/vts-tradefed/res/config/vts-hal.xml
index 60f0799..9ad8653 100644
--- a/tools/vts-tradefed/res/config/vts-hal.xml
+++ b/tools/vts-tradefed/res/config/vts-hal.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -22,8 +22,12 @@
   <option name="compatibility:test-arg" value="com.android.tradefed.testtype.VtsMultiDeviceTest:gtest-batch-mode:true" />
   <option name="compatibility:include-filter" value="VtsHalBluetoothV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalBootV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalDumpstateV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalIrV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalNfcV1_0HostBinderize" />
+  <option name="compatibility:include-filter" value="VtsHalNfcV1_0HostPassthrough" />
   <option name="compatibility:include-filter" value="VtsHalNfcV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalRadioV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalRadioV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalRadioV1_1Target" />
   <option name="compatibility:include-filter" value="VtsHalRenderscriptV1_0Target" />
@@ -39,10 +43,12 @@
   <option name="compatibility:include-filter" value="VtsHalBiometricsFingerprintV2_1Target" />
   <option name="compatibility:include-filter" value="VtsHalBroadcastradioV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalCameraProviderV2_4Target" />
+  <option name="compatibility:include-filter" value="VtsHalCasV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalConfigstoreV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalContexthubV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalDrmV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalGatekeeperV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalGnssV1_0HostBinderize" />
   <option name="compatibility:include-filter" value="VtsHalGnssV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalGraphicsComposerV2_1Target" />
   <option name="compatibility:include-filter" value="VtsHalGraphicsMapperV2_0Target" />
@@ -50,19 +56,25 @@
   <option name="compatibility:include-filter" value="VtsHalKeymasterV3_0Target" />
   <option name="compatibility:include-filter" value="VtsHalLightV2_0Target" />
   <option name="compatibility:include-filter" value="VtsHalMemtrackV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalMediaOmxStoreV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalMediaOmxV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalOemHookV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalOemLockV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalPowerV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalPowerV1_1Target" />
+  <option name="compatibility:include-filter" value="VtsHalSensorsV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalSensorsV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalSoundtriggerV2_0Target" />
   <option name="compatibility:include-filter" value="VtsHalTetherOffloadConfigV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalTetherOffloadControlV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalThermalV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalThermalV1_1Target" />
   <option name="compatibility:include-filter" value="VtsHalUsbV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalUsbV1_1Target" />
+  <option name="compatibility:include-filter" value="VtsHalVibratorV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalVibratorV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalVibratorV1_1Target" />
+  <option name="compatibility:include-filter" value="VtsHalVrV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalVrV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalWeaverV1_0Target" />
 
diff --git a/tools/vts-tradefed/res/config/vts-host.xml b/tools/vts-tradefed/res/config/vts-host.xml
index 3f66aef..a3121c4 100644
--- a/tools/vts-tradefed/res/config/vts-host.xml
+++ b/tools/vts-tradefed/res/config/vts-host.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -25,14 +25,17 @@
   <option name="compatibility:include-filter" value="SampleCameraV3Test" />
 
   <!-- For HIDL HALs -->
+  <option name="compatibility:include-filter" value="VtsHalContexthubV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalGnssV1_0HostBinderize" />
+  <option name="compatibility:include-filter" value="VtsHalMediaOmxV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalNfcV1_0HostBinderize" />
   <option name="compatibility:include-filter" value="VtsHalNfcV1_0HostPassthrough" />
-  <option name="compatibility:include-filter" value="VtsHalAutomotiveVehicleV2_0HostTest" />
-  <option name="compatibility:include-filter" value="VtsHalTvCecV1_0HostTest" />
-  <option name="compatibility:include-filter" value="VtsHalContexthubV1_0HostTest" />
-  <option name="compatibility:include-filter" value="VtsHalRadioV1_0HostTest" />
-  <option name="compatibility:include-filter" value="VtsHalSensorsV1_0HostTest" />
-  <option name="compatibility:include-filter" value="VtsHalVibratorV1_0HostTest" />
+  <option name="compatibility:include-filter" value="VtsHalOemHookV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalRadioV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalSensorsV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalVibratorV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalVrV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalWifiV1_0Host" />
 
   <!-- For shell-based tests -->
   <option name="compatibility:include-filter" value="SampleShellTest" />
diff --git a/tools/vts-tradefed/res/config/vts-kernel.xml b/tools/vts-tradefed/res/config/vts-kernel.xml
index bc4ea2d..a6272a5 100644
--- a/tools/vts-tradefed/res/config/vts-kernel.xml
+++ b/tools/vts-tradefed/res/config/vts-kernel.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@
   <option name="compatibility:include-filter" value="VtsKernelConfig" />
   <option name="compatibility:include-filter" value="VtsKernelHwBinder" />
   <option name="compatibility:include-filter" value="VtsKernelLibcutilsTest" />
+  <option name="compatibility:include-filter" value="VtsKernelNetdTest" />
   <option name="compatibility:include-filter" value="VtsKernelSelinuxFileApi" />
   <option name="compatibility:include-filter" value="VtsKernelTunTest" />
   <option name="compatibility:include-filter" value="VtsQtaguidTest" />
diff --git a/tools/vts-tradefed/res/config/vts-performance-systrace.xml b/tools/vts-tradefed/res/config/vts-performance-systrace.xml
index db2c6d3..7eaea6c 100644
--- a/tools/vts-tradefed/res/config/vts-performance-systrace.xml
+++ b/tools/vts-tradefed/res/config/vts-performance-systrace.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 Google Inc.
+<!-- Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-performance.xml b/tools/vts-tradefed/res/config/vts-performance.xml
index 8631787..4b58566 100644
--- a/tools/vts-tradefed/res/config/vts-performance.xml
+++ b/tools/vts-tradefed/res/config/vts-performance.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-presubmit.xml b/tools/vts-tradefed/res/config/vts-presubmit.xml
index cd4cc53..35d0bfb 100644
--- a/tools/vts-tradefed/res/config/vts-presubmit.xml
+++ b/tools/vts-tradefed/res/config/vts-presubmit.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-security.xml b/tools/vts-tradefed/res/config/vts-security.xml
index 3dc8c35..2fa4bff 100644
--- a/tools/vts-tradefed/res/config/vts-security.xml
+++ b/tools/vts-tradefed/res/config/vts-security.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/basic-reporters.xml b/tools/vts-tradefed/res/config/vts-selftest.xml
similarity index 60%
copy from tools/vts-tradefed/res/config/basic-reporters.xml
copy to tools/vts-tradefed/res/config/vts-selftest.xml
index 25b5cdc..b9479a5 100644
--- a/tools/vts-tradefed/res/config/basic-reporters.xml
+++ b/tools/vts-tradefed/res/config/vts-selftest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -13,5 +13,13 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<configuration description="Configuration with basic VTS reporters" >
+<configuration description="VTS Self Test Plan">
+  <include name="vts-base" />
+  <option name="plan" value="vts" />
+  <option name="test-tag" value="vts" />
+  <option name="vts-plan-result:plan-name" value="vts" />
+  <option name="compatibility:primary-abi-only" value="true" />
+
+  <option name="compatibility:include-filter" value="VtsSelfTestBaseTest" />
+
 </configuration>
diff --git a/tools/vts-tradefed/res/config/vts-staging-fuzz.xml b/tools/vts-tradefed/res/config/vts-staging-fuzz.xml
index f086a1e..409ca7a 100644
--- a/tools/vts-tradefed/res/config/vts-staging-fuzz.xml
+++ b/tools/vts-tradefed/res/config/vts-staging-fuzz.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-staging-kernel.xml b/tools/vts-tradefed/res/config/vts-staging-kernel.xml
index 058410d..c746f6e 100644
--- a/tools/vts-tradefed/res/config/vts-staging-kernel.xml
+++ b/tools/vts-tradefed/res/config/vts-staging-kernel.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 Google Inc.
+<!-- Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -22,6 +22,5 @@
   <option name="compatibility:include-filter" value="SecurityPoCKernelTestStaging" />
   <option name="compatibility:include-filter" value="VtsKernelLinuxKselftestStaging" />
   <option name="compatibility:include-filter" value="VtsKernelLtpStaging" />
-  <option name="compatibility:include-filter" value="VtsKernelNetdTest" />
 
 </configuration>
diff --git a/tools/vts-tradefed/res/config/vts-staging-presubmit.xml b/tools/vts-tradefed/res/config/vts-staging-presubmit.xml
index aa95e1a..34ea87e 100644
--- a/tools/vts-tradefed/res/config/vts-staging-presubmit.xml
+++ b/tools/vts-tradefed/res/config/vts-staging-presubmit.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts-vndk.xml b/tools/vts-tradefed/res/config/vts-vndk.xml
index 976d009..b0acee0 100644
--- a/tools/vts-tradefed/res/config/vts-vndk.xml
+++ b/tools/vts-tradefed/res/config/vts-vndk.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 Google Inc.
+<!-- Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tools/vts-tradefed/res/config/vts.xml b/tools/vts-tradefed/res/config/vts.xml
index fc8936e..ab45798 100644
--- a/tools/vts-tradefed/res/config/vts.xml
+++ b/tools/vts-tradefed/res/config/vts.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016-2017 Google Inc.
+<!-- Copyright (C) 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
   <option name="test-tag" value="vts" />
   <option name="vts-plan-result:plan-name" value="vts" />
 
+  <option name="compatibility:test-arg" value="com.android.tradefed.testtype.VtsMultiDeviceTest:precondition-vintf-override:true" />
+
   <!-- For Treble-specific validations -->
   <option name="compatibility:include-filter" value="VtsTreblePlatformVersionTest" />
   <option name="compatibility:include-filter" value="VtsTrebleVintfTest" />
@@ -26,6 +28,7 @@
   <!-- From vts-hal-hidl.xml -->
   <option name="compatibility:include-filter" value="VtsHalBluetoothV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalBootV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalDumpstateV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalIrV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalNfcV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalRadioV1_0Target" />
@@ -43,6 +46,7 @@
   <option name="compatibility:include-filter" value="VtsHalBiometricsFingerprintV2_1Target" />
   <option name="compatibility:include-filter" value="VtsHalBroadcastradioV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalCameraProviderV2_4Target" />
+  <option name="compatibility:include-filter" value="VtsHalCasV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalConfigstoreV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalContexthubV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalDrmV1_0Target" />
@@ -54,7 +58,9 @@
   <option name="compatibility:include-filter" value="VtsHalKeymasterV3_0Target" />
   <option name="compatibility:include-filter" value="VtsHalLightV2_0Target" />
   <option name="compatibility:include-filter" value="VtsHalMemtrackV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalMediaOmxStoreV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalMediaOmxV1_0Host" />
+  <option name="compatibility:include-filter" value="VtsHalOemHookV1_0Host" />
   <option name="compatibility:include-filter" value="VtsHalOemLockV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalPowerV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalPowerV1_1Target" />
@@ -63,6 +69,7 @@
   <option name="compatibility:include-filter" value="VtsHalTetherOffloadConfigV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalTetherOffloadControlV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalThermalV1_0Target" />
+  <option name="compatibility:include-filter" value="VtsHalThermalV1_1Target" />
   <option name="compatibility:include-filter" value="VtsHalUsbV1_0Target" />
   <option name="compatibility:include-filter" value="VtsHalUsbV1_1Target" />
   <option name="compatibility:include-filter" value="VtsHalVibratorV1_0Target" />
@@ -81,6 +88,7 @@
   <option name="compatibility:include-filter" value="VtsKernelConfig" />
   <option name="compatibility:include-filter" value="VtsKernelHwBinder" />
   <option name="compatibility:include-filter" value="VtsKernelLibcutilsTest" />
+  <option name="compatibility:include-filter" value="VtsKernelNetdTest" />
   <option name="compatibility:include-filter" value="VtsKernelSelinuxFileApi" />
   <option name="compatibility:include-filter" value="VtsKernelTunTest" />
   <option name="compatibility:include-filter" value="VtsQtaguidTest" />
diff --git a/tools/vts-tradefed/res/push_groups/VtsDriverHal.push b/tools/vts-tradefed/res/push_groups/VtsDriverHal.push
index a0f4f7c..01591cf 100644
--- a/tools/vts-tradefed/res/push_groups/VtsDriverHal.push
+++ b/tools/vts-tradefed/res/push_groups/VtsDriverHal.push
@@ -9,5 +9,11 @@
 DATA/lib/libvts_interfacespecification.so->/data/local/tmp/32/libvts_interfacespecification.so
 DATA/lib64/libvts_interfacespecification.so->/data/local/tmp/64/libvts_interfacespecification.so
 
-DATA/bin/fuzzer32->/data/local/tmp/32/fuzzer32
-DATA/bin/fuzzer64->/data/local/tmp/64/fuzzer64
\ No newline at end of file
+DATA/lib/libvts_profiling_utils.so->/data/local/tmp/32/libvts_profiling_utils.so
+DATA/lib64/libvts_profiling_utils.so->/data/local/tmp/64/libvts_profiling_utils.so
+
+DATA/bin/vts_hal_driver32->/data/local/tmp/32/vts_hal_driver32
+DATA/bin/vts_hal_driver64->/data/local/tmp/64/vts_hal_driver64
+
+DATA/bin/vts_hal_replayer32->/data/local/tmp/32/vts_hal_replayer32
+DATA/bin/vts_hal_replayer64->/data/local/tmp/64/vts_hal_replayer64
\ No newline at end of file
diff --git a/tools/vts-tradefed/res/push_groups/VtsProfilerHal.push b/tools/vts-tradefed/res/push_groups/VtsProfilerHal.push
index c649c3f..b31cd81 100644
--- a/tools/vts-tradefed/res/push_groups/VtsProfilerHal.push
+++ b/tools/vts-tradefed/res/push_groups/VtsProfilerHal.push
@@ -1,2 +1,5 @@
+DATA/lib/libvts_profiling_utils.so->/data/local/tmp/32/libvts_profiling_utils.so
+DATA/lib64/libvts_profiling_utils.so->/data/local/tmp/64/libvts_profiling_utils.so
+
 DATA/lib/libvts_profiling.so->/data/local/tmp/32/libvts_profiling.so
 DATA/lib64/libvts_profiling.so->/data/local/tmp/64/libvts_profiling.so
\ No newline at end of file
diff --git a/tools/vts-tradefed/res/report/vts_failures.xsl b/tools/vts-tradefed/res/report/vts_failures.xsl
deleted file mode 100644
index 286a453..0000000
--- a/tools/vts-tradefed/res/report/vts_failures.xsl
+++ /dev/null
@@ -1,289 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>
-<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
-
-    <xsl:template match="/">
-
-        <html>
-            <head>
-                <title>Test Report</title>
-                <style type="text/css">
-                    @import "vts_result.css";
-                </style>
-            </head>
-            <body>
-                <div>
-                    <table class="title">
-                        <tr>
-                            <td align="left"><img src="logo.png"/></td>
-                        </tr>
-                    </table>
-                </div>
-
-                <div>
-                    <table class="summary">
-                        <tr>
-                            <th colspan="2">Summary</th>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Suite / Plan</td>
-                            <td>
-                                <xsl:value-of select="Result/@suite_name"/> / <xsl:value-of select="Result/@suite_plan"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Suite / Build</td>
-                            <td>
-                                <xsl:value-of select="Result/@suite_version"/> / <xsl:value-of select="Result/@suite_build_number"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Host Info</td>
-                            <td>
-                                Result/@start
-                                <xsl:value-of select="Result/@host_name"/>
-                                (<xsl:value-of select="Result/@os_name"/> - <xsl:value-of select="Result/@os_version"/>)
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Start time / End Time</td>
-                            <td>
-                                <xsl:value-of select="Result/@start_display"/> /
-                                <xsl:value-of select="Result/@end_display"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Tests Passed</td>
-                            <td>
-                                <xsl:value-of select="Result/Summary/@pass"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Tests Failed</td>
-                            <td>
-                                <xsl:value-of select="Result/Summary/@failed"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Modules Done</td>
-                            <td>
-                                <xsl:value-of select="Result/Summary/@modules_done"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Modules Total</td>
-                            <td>
-                                <xsl:value-of select="Result/Summary/@modules_total"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Fingerprint</td>
-                            <td>
-                                <xsl:value-of select="Result/Build/@build_fingerprint"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Security Patch</td>
-                            <td>
-                                <xsl:value-of select="Result/Build/@build_version_security_patch"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Release (SDK)</td>
-                            <td>
-                                <xsl:value-of select="Result/Build/@build_version_release"/> (<xsl:value-of select="Result/Build/@build_version_sdk"/>)
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">ABIs</td>
-                            <td>
-                                <xsl:value-of select="Result/Build/@build_abis"/>
-                            </td>
-                        </tr>
-                    </table>
-                </div>
-
-                <!-- High level summary of test execution -->
-                <br/>
-                <div>
-                    <table class="testsummary">
-                        <tr>
-                            <th>Module</th>
-                            <th>Passed</th>
-                            <th>Failed</th>
-                            <th>Total Tests</th>
-                            <th>Done</th>
-                        </tr>
-                        <xsl:for-each select="Result/Module">
-                            <tr>
-                                <td>
-                                    <xsl:if test="count(TestCase/Test[@result = 'fail']) &gt; 0">
-                                        <xsl:variable name="href"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></xsl:variable>
-                                        <a href="#{$href}"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></a>
-                                    </xsl:if>
-                                    <xsl:if test="count(TestCase/Test[@result = 'fail']) &lt; 1">
-                                        <xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/>
-                                    </xsl:if>
-                                </td>
-                                <td>
-                                    <xsl:value-of select="@pass"/>
-                                </td>
-                                <td>
-                                    <xsl:value-of select="count(TestCase/Test[@result = 'fail'])"/>
-                                </td>
-                                <td>
-                                    <xsl:value-of select="count(TestCase/Test[@result = 'fail']) + @pass"/>
-                                </td>
-                                <td>
-                                    <xsl:value-of select="@done"/>
-                                </td>
-                            </tr>
-                        </xsl:for-each> <!-- end Module -->
-                    </table>
-                </div>
-
-                <br/>
-                <xsl:call-template name="detailedTestReport">
-                    <xsl:with-param name="resultFilter" select="'fail'" />
-                </xsl:call-template>
-
-                <br/>
-                <xsl:call-template name="incompleteModules" />
-
-            </body>
-        </html>
-    </xsl:template>
-
-    <xsl:template name="detailedTestReport">
-        <xsl:param name="resultFilter" />
-        <div>
-            <xsl:for-each select="Result/Module">
-                <xsl:if test="$resultFilter=''
-                        or count(TestCase/Test[@result=$resultFilter]) &gt; 0">
-
-                    <table class="testdetails">
-                        <tr>
-                            <td class="module" colspan="3">
-                                <xsl:variable name="href"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></xsl:variable>
-                                <a name="{$href}"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></a>
-                            </td>
-                        </tr>
-
-                        <tr>
-                            <th width="30%">Test</th>
-                            <th width="5%">Result</th>
-                            <th>Details</th>
-                        </tr>
-
-                        <xsl:for-each select="TestCase">
-                            <xsl:variable name="TestCase" select="."/>
-                            <!-- test -->
-                            <xsl:for-each select="Test">
-                                <xsl:if test="$resultFilter='' or @result=$resultFilter">
-                                    <tr>
-                                        <td class="testname"> <xsl:value-of select="$TestCase/@name"/>#<xsl:value-of select="@name"/></td>
-
-                                        <!-- test results -->
-                                        <xsl:if test="@result='pass'">
-                                            <td class="pass">
-                                                <div style="text-align: center; margin-left:auto; margin-right:auto;">
-                                                    <xsl:value-of select="@result"/>
-                                                </div>
-                                            </td>
-                                            <td class="failuredetails"/>
-                                        </xsl:if>
-
-                                        <xsl:if test="@result='fail'">
-                                            <td class="failed">
-                                                <div style="text-align: center; margin-left:auto; margin-right:auto;">
-                                                    <xsl:value-of select="@result"/>
-                                                </div>
-                                            </td>
-                                            <td class="failuredetails">
-                                                <div class="details">
-                                                    <xsl:value-of select="Failure/@message"/>
-                                                </div>
-                                            </td>
-                                        </xsl:if>
-
-                                        <xsl:if test="@result='not_executed'">
-                                            <td class="not_executed">
-                                                <div style="text-align: center; margin-left:auto; margin-right:auto;">
-                                                    <xsl:value-of select="@result"/>
-                                                </div>
-                                            </td>
-                                            <td class="failuredetails"></td>
-                                        </xsl:if>
-                                    </tr> <!-- finished with a row -->
-                                </xsl:if>
-                            </xsl:for-each> <!-- end test -->
-                        </xsl:for-each>
-                    </table>
-                </xsl:if>
-            </xsl:for-each> <!-- end test Module -->
-        </div>
-    </xsl:template>
-
-    <xsl:template name="incompleteModules">
-        <xsl:if test="not(Result/Summary/@modules_done = Result/Summary/@modules_total)">
-            <div>
-                <table class="incompletemodules">
-                    <tr>
-                        <th>Incomplete Modules</th>
-                    </tr>
-                    <xsl:for-each select="Result/Module">
-                        <xsl:if test="@done='false'">
-                            <tr>
-                                <td>
-                                    <xsl:variable name="href"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></xsl:variable>
-                                    <a name="{$href}"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></a>
-                                </td>
-                            </tr>
-                        </xsl:if>
-                    </xsl:for-each> <!-- end test Module -->
-                </table>
-            </div>
-        </xsl:if>
-    </xsl:template>
-
-    <!-- Take a delimited string and insert line breaks after a some number of elements. -->
-    <xsl:template name="formatDelimitedString">
-        <xsl:param name="string" />
-        <xsl:param name="numTokensPerRow" select="10" />
-        <xsl:param name="tokenIndex" select="1" />
-        <xsl:if test="$string">
-            <!-- Requires the last element to also have a delimiter after it. -->
-            <xsl:variable name="token" select="substring-before($string, ';')" />
-            <xsl:value-of select="$token" />
-            <xsl:text>&#160;</xsl:text>
-
-            <xsl:if test="$tokenIndex mod $numTokensPerRow = 0">
-                <br />
-            </xsl:if>
-
-            <xsl:call-template name="formatDelimitedString">
-                <xsl:with-param name="string" select="substring-after($string, ';')" />
-                <xsl:with-param name="numTokensPerRow" select="$numTokensPerRow" />
-                <xsl:with-param name="tokenIndex" select="$tokenIndex + 1" />
-            </xsl:call-template>
-        </xsl:if>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/tools/vts-tradefed/res/report/vts_result.css b/tools/vts-tradefed/res/report/vts_result.css
deleted file mode 100644
index 03032ed..0000000
--- a/tools/vts-tradefed/res/report/vts_result.css
+++ /dev/null
@@ -1,183 +0,0 @@
-/* Copyright (C) 2015 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-*/
-
-body {
-    font-family:arial,sans-serif;
-    color:#000;
-    font-size:13px;
-    color:#333;
-    padding:10;
-    margin:10;
-}
-
-/* Report logo and device name */
-table.title {
-    padding:5px;
-    border-width: 0px;
-    margin-left:auto;
-    margin-right:auto;
-    vertical-align:middle;
-}
-
-table.summary {
-    background-color: rgb(212, 233, 169);
-    border-collapse:collapse;
-    border: 0px solid #A5C639;
-    margin-left:auto;
-    margin-right:auto;
-}
-
-table.summary th {
-    background-color: #A5C639;
-    font-size: 1.2em;
-    padding: 0.5em;
-}
-
-table.summary td {
-    border-width: 0px 0px 0px 0px;
-    border-color: gray;
-    border-style: inset;
-    font-size: 1em;
-    padding: 0.5em;
-    vertical-align: top;
-}
-
-table.testsummary {
-    background-color: rgb(212, 233, 169);
-    border-collapse:collapse;
-    margin-left:auto;
-    margin-right:auto;
-}
-
-table.testsummary th {
-    background-color: #A5C639;
-    border: 1px outset gray;
-    padding: 0.5em;
-}
-
-table.testsummary td {
-    border: 1px outset #A5C639;
-    padding: 0.5em;
-    text-align: center;
-}
-
-table.testdetails {
-    background-color: rgb(212, 233, 169);
-    border-collapse:collapse;
-    border-width:1;
-    border-color: #A5C639;
-    margin-left:auto;
-    margin-right:auto;
-    margin-bottom: 2em;
-    vertical-align: top;
-    width: 95%;
-}
-
-table.testdetails th {
-    background-color: #A5C639;
-    border-width: 1px;
-    border-color: gray;
-    border-style: outset;
-    height: 2em;
-    padding: 0.2em;
-}
-
-table.testdetails td {
-    border-width: 1px;
-    border-color: #A5C639;
-    border-style: outset;
-    text-align: left;
-    vertical-align: top;
-    padding: 0.2em;
-}
-
-table.testdetails td.module {
-    background-color: white;
-    border: 0px;
-    font-weight: bold;
-}
-
-table.incompletemodules {
-    background-color: rgb(212, 233, 169);
-    border-collapse:collapse;
-    margin-left:auto;
-    margin-right:auto;
-}
-
-table.incompletemodules th {
-    background-color: #A5C639;
-    border: 1px outset gray;
-    padding: 0.5em;
-}
-
-table.incompletemodules td {
-    border: 1px outset #A5C639;
-    padding: 0.5em;
-    text-align: center;
-}
-
-/* Test cell details */
-td.failed {
-    background-color: #FA5858;
-    font-weight:bold;
-    vertical-align: top;
-    text-align: center;
-}
-
-td.failuredetails {
-    text-align: left;
-}
-
-td.pass {
-    text-align: center;
-    margin-left:auto;
-    margin-right:auto;
-}
-
-td.not_executed {
-    background-color: #A5C639;
-    vertical-align: top;
-    text-align: center;
-}
-
-td.testname {
-    border-width: 1px;
-    border-color: #A5C639;
-    border-style: outset;
-    text-align: left;
-    vertical-align: top;
-    padding:1;
-    overflow:hidden;
-}
-
-td.testcase {
-    border-width: 1px;
-    border-color: #A5C639;
-    border-style: outset;
-    text-align: left;
-    vertical-align: top;
-    padding:1;
-    overflow:hidden;
-    font-weight:bold;
-}
-
-div.details {
-    white-space: pre-wrap;       /* css-3 */
-    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
-    white-space: -pre-wrap;      /* Opera 4-6 */
-    white-space: -o-pre-wrap;    /* Opera 7 */
-    word-wrap: break-word;       /* Internet Explorer 5.5+ */
-    overflow:auto;
-}
diff --git a/tools/vts-tradefed/res/report/vts_result.xsd b/tools/vts-tradefed/res/report/vts_result.xsd
deleted file mode 100644
index 95bae85..0000000
--- a/tools/vts-tradefed/res/report/vts_result.xsd
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-           targetNamespace="http://compatibility.android.com/compatibility_result/1.15"
-           xmlns="http://compatibility.android.com/compatibility_result/1.15"
-           elementFormDefault="qualified">
-
-  <xs:element name="Result">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element name="Summary" type="summaryType"/>
-        <xs:element name="Module" type="moduleType" minOccurs="1" maxOccurs="unbounded"/>
-      </xs:sequence>
-      <xs:attribute name="start" type="xs:string"/>
-      <xs:attribute name="end" type="xs:string"/>
-      <xs:attribute name="plan" type="xs:string"/>
-      <xs:attribute name="suite_name" type="xs:string"/>
-      <xs:attribute name="suite_version" type="xs:string"/>
-    </xs:complexType>
-  </xs:element>
-
-  <xs:complexType name="summaryType">
-    <xs:attribute name="failed" type="xs:integer"/>
-    <xs:attribute name="pass" type="xs:integer"/>
-  </xs:complexType>
-
-  <xs:complexType name="moduleType">
-    <xs:sequence>
-      <xs:element name="Test" type="testType" minOccurs="1" maxOccurs="unbounded" />
-    </xs:sequence>
-    <xs:attribute name="name" type="xs:string" use="required"/>
-    <xs:attribute name="abi" type="xs:string"/>
-  </xs:complexType>
-
-  <xs:simpleType name="unitType">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="none"/>
-      <xs:enumeration value="ms"/>
-      <xs:enumeration value="fps"/>
-      <xs:enumeration value="ops"/>
-      <xs:enumeration value="kbps"/>
-      <xs:enumeration value="mbps"/>
-      <xs:enumeration value="byte"/>
-      <xs:enumeration value="count"/>
-      <xs:enumeration value="score"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="scoreTypeType">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="higher-better"/>
-      <xs:enumeration value="lower-better"/>
-      <xs:enumeration value="neutral"/>
-      <xs:enumeration value="warning"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:complexType name="testType">
-    <xs:sequence>
-      <xs:element name="Failure" minOccurs="0" maxOccurs="1">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="StackTrace" type="xs:string" minOccurs="0" maxOccurs="1"/>
-          </xs:sequence>
-          <xs:attribute name="message" type="xs:string"/>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="Summary" minOccurs="0" maxOccurs="1">
-        <xs:complexType>
-          <xs:simpleContent>
-            <xs:extension base="xs:decimal">
-              <xs:attribute name="message" type="xs:string" use="required" />
-              <xs:attribute name="scoreType" type="scoreTypeType" use="required" />
-              <xs:attribute name="unit" type="unitType" use="required" />
-              <xs:attribute name="target" type="xs:decimal" />
-            </xs:extension>
-          </xs:simpleContent>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="Details" minOccurs="0" maxOccurs="1">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="ValueArray" minOccurs="0" maxOccurs="unbounded">
-              <xs:complexType>
-                <xs:sequence>
-                  <xs:element name="Value" type="xs:decimal" minOccurs="0" maxOccurs="unbounded" />
-                </xs:sequence>
-                <xs:attribute name="source" type="xs:string" use="required" />
-                <xs:attribute name="message" type="xs:string" use="required" />
-                <xs:attribute name="scoreType" type="scoreTypeType" use="required" />
-                <xs:attribute name="unit" type="unitType" use="required" />
-              </xs:complexType>
-            </xs:element>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-    </xs:sequence>
-    <xs:attribute name="name" type="xs:string" use="required"/>
-    <xs:attribute name="result" type="resultType" use="required"/>
-    <xs:attribute name="start" type="xs:string"/>
-    <xs:attribute name="end" type="xs:string"/>
-  </xs:complexType>
-
-  <xs:simpleType name="resultType">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="pass"/>
-      <xs:enumeration value="fail"/>
-    </xs:restriction>
-  </xs:simpleType>
-</xs:schema>
diff --git a/tools/vts-tradefed/res/report/vts_result.xsl b/tools/vts-tradefed/res/report/vts_result.xsl
deleted file mode 100644
index c4c607f..0000000
--- a/tools/vts-tradefed/res/report/vts_result.xsl
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>
-<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
-
-    <xsl:template match="/">
-
-        <html>
-            <head>
-                <title>Test Report</title>
-                <style type="text/css">
-                    @import "vts_result.css";
-                </style>
-            </head>
-            <body>
-                <div>
-                    <table class="title">
-                        <tr>
-                            <td align="left"><img src="logo.png"/></td>
-                        </tr>
-                    </table>
-                </div>
-
-                <div>
-                    <table class="summary">
-                        <tr>
-                            <th colspan="2">Summary</th>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Suite / Plan</td>
-                            <td>
-                                <xsl:value-of select="Result/@suite_name"/> / <xsl:value-of select="Result/@suite_plan"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Suite / Build</td>
-                            <td>
-                                <xsl:value-of select="Result/@suite_version"/> / <xsl:value-of select="Result/@suite_build_number"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Host Info</td>
-                            <td>
-                                Result/@start
-                                <xsl:value-of select="Result/@host_name"/>
-                                (<xsl:value-of select="Result/@os_name"/> - <xsl:value-of select="Result/@os_version"/>)
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Start time / End Time</td>
-                            <td>
-                                <xsl:value-of select="Result/@start_display"/> /
-                                <xsl:value-of select="Result/@end_display"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Tests Passed</td>
-                            <td>
-                                <xsl:value-of select="Result/Summary/@pass"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Tests Failed</td>
-                            <td>
-                                <xsl:value-of select="Result/Summary/@failed"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Modules Done</td>
-                            <td>
-                                <xsl:value-of select="Result/Summary/@modules_done"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Modules Total</td>
-                            <td>
-                                <xsl:value-of select="Result/Summary/@modules_total"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Fingerprint</td>
-                            <td>
-                                <xsl:value-of select="Result/Build/@build_fingerprint"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Security Patch</td>
-                            <td>
-                                <xsl:value-of select="Result/Build/@build_version_security_patch"/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">Release (SDK)</td>
-                            <td>
-                                <xsl:value-of select="Result/Build/@build_version_release"/> (<xsl:value-of select="Result/Build/@build_version_sdk"/>)
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="rowtitle">ABIs</td>
-                            <td>
-                                <xsl:value-of select="Result/Build/@build_abis"/>
-                            </td>
-                        </tr>
-                    </table>
-                </div>
-
-                <!-- High level summary of test execution -->
-                <br/>
-                <div>
-                    <table class="testsummary">
-                        <tr>
-                            <th>Module</th>
-                            <th>Passed</th>
-                            <th>Failed</th>
-                            <th>Total Tests</th>
-                            <th>Done</th>
-                        </tr>
-                        <xsl:for-each select="Result/Module">
-                            <tr>
-                                <td>
-                                    <xsl:variable name="href"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></xsl:variable>
-                                    <a href="#{$href}"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></a>
-                                </td>
-                                <td>
-                                    <xsl:value-of select="count(TestCase/Test[@result = 'pass'])"/>
-                                </td>
-                                <td>
-                                    <xsl:value-of select="count(TestCase/Test[@result = 'fail'])"/>
-                                </td>
-                                <td>
-                                    <xsl:value-of select="count(TestCase/Test)"/>
-                                </td>
-                                <td>
-                                    <xsl:value-of select="@done"/>
-                                </td>
-                            </tr>
-                        </xsl:for-each> <!-- end Module -->
-                    </table>
-                </div>
-
-                <xsl:call-template name="filteredResultTestReport">
-                    <xsl:with-param name="header" select="'Failed Tests'" />
-                    <xsl:with-param name="resultFilter" select="'fail'" />
-                </xsl:call-template>
-
-                <xsl:call-template name="filteredResultTestReport">
-                    <xsl:with-param name="header" select="'Not Executed Tests'" />
-                    <xsl:with-param name="resultFilter" select="'not_executed'" />
-                </xsl:call-template>
-
-                <br/>
-                <xsl:call-template name="detailedTestReport" />
-
-            </body>
-        </html>
-    </xsl:template>
-
-    <xsl:template name="filteredResultTestReport">
-        <xsl:param name="header" />
-        <xsl:param name="resultFilter" />
-        <xsl:variable name="numMatching" select="count(Result/Module/TestCase/Test[@result=$resultFilter])" />
-        <xsl:if test="$numMatching &gt; 0">
-            <h2 align="center"><xsl:value-of select="$header" /> (<xsl:value-of select="$numMatching"/>)</h2>
-            <xsl:call-template name="detailedTestReport">
-                <xsl:with-param name="resultFilter" select="$resultFilter"/>
-                <xsl:with-param name="fullStackTrace" select="true()"/>
-            </xsl:call-template>
-        </xsl:if>
-    </xsl:template>
-
-    <xsl:template name="detailedTestReport">
-        <xsl:param name="resultFilter" />
-        <xsl:param name="fullStackTrace" />
-        <div>
-            <xsl:for-each select="Result/Module">
-                <xsl:if test="$resultFilter=''
-                        or count(TestCase/Test[@result=$resultFilter]) &gt; 0">
-
-                    <table class="testdetails">
-                        <tr>
-                            <td class="module" colspan="3">
-                                <xsl:variable name="href"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></xsl:variable>
-                                <a name="{$href}"><xsl:value-of select="@abi"/>&#xA0;<xsl:value-of select="@name"/></a>
-                            </td>
-                        </tr>
-
-                        <tr>
-                            <th width="30%">Test</th>
-                            <th width="5%">Result</th>
-                            <th>Details</th>
-                        </tr>
-
-                        <xsl:for-each select="TestCase">
-                            <xsl:variable name="TestCase" select="."/>
-                            <!-- test -->
-                            <xsl:for-each select="Test">
-                                <xsl:if test="$resultFilter='' or @result=$resultFilter">
-                                    <tr>
-                                        <td class="testname"> <xsl:value-of select="$TestCase/@name"/>#<xsl:value-of select="@name"/></td>
-
-                                        <!-- test results -->
-                                        <xsl:if test="@result='pass'">
-                                            <td class="pass">
-                                                <div style="text-align: center; margin-left:auto; margin-right:auto;">
-                                                    <xsl:value-of select="@result"/>
-                                                </div>
-                                            </td>
-                                            <td class="failuredetails"/>
-                                        </xsl:if>
-
-                                        <xsl:if test="@result='fail'">
-                                            <td class="failed">
-                                                <div style="text-align: center; margin-left:auto; margin-right:auto;">
-                                                    <xsl:value-of select="@result"/>
-                                                </div>
-                                            </td>
-                                            <td class="failuredetails">
-                                                <div class="details">
-                                                    <xsl:choose>
-                                                        <xsl:when test="$fullStackTrace=true()">
-                                                            <xsl:value-of select="Failure/StackTrace" />
-                                                        </xsl:when>
-                                                        <xsl:otherwise>
-                                                            <xsl:value-of select="Failure/@message"/>
-                                                        </xsl:otherwise>
-                                                    </xsl:choose>
-                                                </div>
-                                            </td>
-                                        </xsl:if>
-
-                                        <xsl:if test="@result='not_executed'">
-                                            <td class="not_executed">
-                                                <div style="text-align: center; margin-left:auto; margin-right:auto;">
-                                                    <xsl:value-of select="@result"/>
-                                                </div>
-                                            </td>
-                                            <td class="failuredetails"></td>
-                                        </xsl:if>
-                                    </tr> <!-- finished with a row -->
-                                </xsl:if>
-                            </xsl:for-each> <!-- end test -->
-                        </xsl:for-each>
-                    </table>
-                </xsl:if>
-            </xsl:for-each> <!-- end test Module -->
-        </div>
-    </xsl:template>
-
-    <!-- Take a delimited string and insert line breaks after a some number of elements. -->
-    <xsl:template name="formatDelimitedString">
-        <xsl:param name="string" />
-        <xsl:param name="numTokensPerRow" select="10" />
-        <xsl:param name="tokenIndex" select="1" />
-        <xsl:if test="$string">
-            <!-- Requires the last element to also have a delimiter after it. -->
-            <xsl:variable name="token" select="substring-before($string, ';')" />
-            <xsl:value-of select="$token" />
-            <xsl:text>&#160;</xsl:text>
-
-            <xsl:if test="$tokenIndex mod $numTokensPerRow = 0">
-                <br />
-            </xsl:if>
-
-            <xsl:call-template name="formatDelimitedString">
-                <xsl:with-param name="string" select="substring-after($string, ';')" />
-                <xsl:with-param name="numTokensPerRow" select="$numTokensPerRow" />
-                <xsl:with-param name="tokenIndex" select="$tokenIndex + 1" />
-            </xsl:call-template>
-        </xsl:if>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/utils/native/Android.bp b/utils/native/Android.bp
index 2f0e29e..17ea6af 100644
--- a/utils/native/Android.bp
+++ b/utils/native/Android.bp
@@ -13,5 +13,6 @@
 // limitations under the License.
 
 subdirs = [
+     "libprofiling",
      "trace_processor",
 ]
\ No newline at end of file
diff --git a/drivers/libprofiling/Android.bp b/utils/native/libprofiling/Android.bp
similarity index 75%
rename from drivers/libprofiling/Android.bp
rename to utils/native/libprofiling/Android.bp
index 25bca60..a1da4af 100644
--- a/drivers/libprofiling/Android.bp
+++ b/utils/native/libprofiling/Android.bp
@@ -1,5 +1,5 @@
 //
-// Copyright (C) 2016 The Android Open Source Project
+// Copyright (C) 2017 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,6 +16,25 @@
 
 cc_library_shared {
 
+    name: "libvts_profiling_utils",
+    host_supported: true,
+
+    srcs: ["VtsProfilingUtil.cpp"],
+
+    shared_libs: [
+        "libprotobuf-cpp-full",
+    ],
+
+    cflags: [
+        "-Werror",
+        "-Wall",
+    ],
+
+    export_include_dirs: ["."],
+}
+
+cc_library_shared {
+
     name: "libvts_profiling",
 
     srcs: ["VtsProfilingInterface.cpp"],
@@ -24,9 +43,9 @@
         "libbase",
         "libcutils",
         "libhidlbase",
-        "libvts_common",
-        "libvts_multidevice_proto",
         "libprotobuf-cpp-full",
+        "libvts_multidevice_proto",
+        "libvts_profiling_utils",
     ],
 
     cflags: [
diff --git a/drivers/libprofiling/VtsProfilingConfigureMain.cpp b/utils/native/libprofiling/VtsProfilingConfigureMain.cpp
similarity index 92%
rename from drivers/libprofiling/VtsProfilingConfigureMain.cpp
rename to utils/native/libprofiling/VtsProfilingConfigureMain.cpp
index 8f31a04..8694b11 100644
--- a/drivers/libprofiling/VtsProfilingConfigureMain.cpp
+++ b/utils/native/libprofiling/VtsProfilingConfigureMain.cpp
@@ -13,10 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <iostream>
 #include <android/hidl/manager/1.0/IServiceManager.h>
 #include <cutils/properties.h>
 #include <hidl/ServiceManagement.h>
+#include <iostream>
 
 using namespace std;
 using namespace android;
@@ -38,16 +38,15 @@
   auto listRet = sm->list([&](const auto &interfaces) {
     for (const string &fqInstanceName : interfaces) {
       string::size_type n = fqInstanceName.find("/");
-      if (n == std::string::npos || fqInstanceName.size() == n+1) continue;
+      if (n == std::string::npos || fqInstanceName.size() == n + 1) continue;
 
       hidl_string fqInterfaceName = fqInstanceName.substr(0, n);
-      hidl_string instanceName = fqInstanceName.substr(
-          n+1, std::string::npos);
+      hidl_string instanceName =
+          fqInstanceName.substr(n + 1, std::string::npos);
       Return<sp<IBase>> interfaceRet = sm->get(fqInterfaceName, instanceName);
       if (!interfaceRet.isOk()) {
         fprintf(stderr, "failed to get service %s: %s\n",
-                fqInstanceName.c_str(),
-                interfaceRet.description().c_str());
+                fqInstanceName.c_str(), interfaceRet.description().c_str());
         continue;
       }
       sp<IBase> interface = interfaceRet;
@@ -89,7 +88,7 @@
 // Usage examples:
 //   To enable, <binary> enable <lib path>
 //   To disable, <binary> disable clear
-int main(int argc, char* argv[]) {
+int main(int argc, char *argv[]) {
   bool enable_profiling = false;
   if (argc >= 2) {
     if (!strcmp(argv[1], "enable")) {
diff --git a/drivers/libprofiling/VtsProfilingInterface.cpp b/utils/native/libprofiling/VtsProfilingInterface.cpp
similarity index 92%
rename from drivers/libprofiling/VtsProfilingInterface.cpp
rename to utils/native/libprofiling/VtsProfilingInterface.cpp
index 9c60170..ff59af9 100644
--- a/drivers/libprofiling/VtsProfilingInterface.cpp
+++ b/utils/native/libprofiling/VtsProfilingInterface.cpp
@@ -23,9 +23,9 @@
 #include <android-base/logging.h>
 #include <google/protobuf/text_format.h>
 
+#include "VtsProfilingUtil.h"
 #include "test/vts/proto/VtsDriverControlMessage.pb.h"
 #include "test/vts/proto/VtsProfilingMessage.pb.h"
-#include "utils/VtsProfilingUtil.h"
 
 using namespace std;
 
@@ -39,8 +39,7 @@
 VtsProfilingInterface::VtsProfilingInterface(const string& trace_file_path)
     : trace_file_path_(trace_file_path),
       trace_output_(nullptr),
-      initialized_(false) {
-}
+      initialized_(false) {}
 
 VtsProfilingInterface::~VtsProfilingInterface() {
   if (trace_output_) {
@@ -71,9 +70,9 @@
   property_get("ro.serialno", device_id, "unknown_device");
   property_get("ro.build.product", product_name, "unknown_product");
 
-  string file_path = trace_file_path_ + "_" + string(product_name) + "_"
-      + string(device_id) + "_" + string(build_number) + "_"
-      + to_string(NanoTime()) + ".vts.trace";
+  string file_path = trace_file_path_ + "_" + string(product_name) + "_" +
+                     string(device_id) + "_" + string(build_number) + "_" +
+                     to_string(NanoTime()) + ".vts.trace";
 
   LOG(INFO) << "Creating new profiler instance with file path: " << file_path;
   int fd = open(file_path.c_str(), O_RDWR | O_CREAT | O_EXCL,
@@ -99,7 +98,7 @@
   // Build the VTSProfilingRecord and print it to string.
   VtsProfilingRecord record;
   record.set_timestamp(NanoTime());
-  record.set_event((InstrumentationEventType)static_cast<int>(event));
+  record.set_event((InstrumentationEventType) static_cast<int>(event));
   record.set_package(package);
   record.set_version(stof(version));
   record.set_interface(interface);
diff --git a/drivers/libprofiling/VtsProfilingInterface.h b/utils/native/libprofiling/VtsProfilingInterface.h
similarity index 93%
rename from drivers/libprofiling/VtsProfilingInterface.h
rename to utils/native/libprofiling/VtsProfilingInterface.h
index 8c2742c..3e877bc 100644
--- a/drivers/libprofiling/VtsProfilingInterface.h
+++ b/utils/native/libprofiling/VtsProfilingInterface.h
@@ -51,7 +51,8 @@
   static VtsProfilingInterface& getInstance(const string& trace_file_path);
 
   // returns true if the given message is added to the tracing queue.
-  bool AddTraceEvent(android::hardware::details::HidlInstrumentor::InstrumentationEvent event,
+  bool AddTraceEvent(
+      android::hardware::details::HidlInstrumentor::InstrumentationEvent event,
       const char* package, const char* version, const char* interface,
       const FunctionSpecificationMessage& message);
 
@@ -62,7 +63,7 @@
   Mutex mutex_;  // Mutex used to synchronize the writing to the trace file.
   bool initialized_;
 
-  DISALLOW_COPY_AND_ASSIGN (VtsProfilingInterface);
+  DISALLOW_COPY_AND_ASSIGN(VtsProfilingInterface);
 };
 
 }  // namespace vts
diff --git a/drivers/hal/common/utils/VtsProfilingUtil.cpp b/utils/native/libprofiling/VtsProfilingUtil.cpp
similarity index 98%
rename from drivers/hal/common/utils/VtsProfilingUtil.cpp
rename to utils/native/libprofiling/VtsProfilingUtil.cpp
index e9b957c..bc13050 100644
--- a/drivers/hal/common/utils/VtsProfilingUtil.cpp
+++ b/utils/native/libprofiling/VtsProfilingUtil.cpp
@@ -13,10 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#include "VtsProfilingUtil.h"
+
 #include <stdint.h>
 
 #include "google/protobuf/io/coded_stream.h"
-#include "utils/VtsProfilingUtil.h"
 
 namespace android {
 namespace vts {
diff --git a/drivers/hal/common/include/utils/VtsProfilingUtil.h b/utils/native/libprofiling/VtsProfilingUtil.h
similarity index 100%
rename from drivers/hal/common/include/utils/VtsProfilingUtil.h
rename to utils/native/libprofiling/VtsProfilingUtil.h
diff --git a/utils/native/trace_processor/Android.bp b/utils/native/trace_processor/Android.bp
index f75cb65..f051f78 100644
--- a/utils/native/trace_processor/Android.bp
+++ b/utils/native/trace_processor/Android.bp
@@ -23,8 +23,8 @@
         "libbase",
         "libcutils",
         "libprotobuf-cpp-full",
-        "libvts_common",
         "libvts_multidevice_proto",
+        "libvts_profiling_utils",
     ],
     cflags: [
         "-Wall",
diff --git a/utils/native/trace_processor/VtsTraceProcessor.cpp b/utils/native/trace_processor/VtsTraceProcessor.cpp
index 3894bae..aae654c 100644
--- a/utils/native/trace_processor/VtsTraceProcessor.cpp
+++ b/utils/native/trace_processor/VtsTraceProcessor.cpp
@@ -29,7 +29,7 @@
 #include <test/vts/proto/ComponentSpecificationMessage.pb.h>
 #include <test/vts/proto/VtsReportMessage.pb.h>
 
-#include "utils/VtsProfilingUtil.h"
+#include "VtsProfilingUtil.h"
 
 using namespace std;
 using google::protobuf::TextFormat;
diff --git a/utils/python/archive/Android.mk b/utils/python/archive/Android.mk
index 640fde6..619537b 100644
--- a/utils/python/archive/Android.mk
+++ b/utils/python/archive/Android.mk
@@ -12,33 +12,20 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-PARSER := parser_test.py
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
 
-GCNO_PARSER := gcno_parser_test.py
+LOCAL_MODULE := vts_archive_test
+LOCAL_MODULE_CLASS := FAKE
+LOCAL_IS_HOST_MODULE := true
 
-GCDA_PARSER := gcda_parser_test.py
+include $(BUILD_SYSTEM)/base_rules.mk
 
-ARC_SUMMARY := arc_summary_test.py
+py_scripts := \
+  $(LOCAL_PATH)/archive_parser_test.py
 
-FUNCTION_SUMMARY := function_summary_test.py
-
-COVERAGE_REPORT := coverage_report_test.py
-
-default:
-	@echo "Running unit test for : $(PARSER)"
-	python $(PARSER)
-
-	@echo "Running unit test for : $(GCNO_PARSER)"
-	python $(GCNO_PARSER)
-
-	@echo "Running unit test for : $(GCDA_PARSER)"
-	python $(GCDA_PARSER)
-
-	@echo "Running unit test for : $(ARC_SUMMARY)"
-	python $(ARC_SUMMARY)
-
-	@echo "Running unit test for : $(FUNCTION_SUMMARY)"
-	python $(FUNCTION_SUMMARY)
-
-	@echo "Running unit test for : $(COVERAGE_REPORT)"
-	python $(COVERAGE_REPORT)
+$(LOCAL_BUILT_MODULE): PRIVATE_PY_SCRIPTS := $(py_scripts)
+$(LOCAL_BUILT_MODULE): $(py_scripts)
+	@echo "Regression test (build time): $(PRIVATE_MODULE)"
+	$(foreach py, $(PRIVATE_PY_SCRIPTS), (PYTHONPATH=$$PYTHONPATH:test python $(py)) &&) true
+	$(hide) touch $@
diff --git a/utils/python/common/filter_utils.py b/utils/python/common/filter_utils.py
new file mode 100644
index 0000000..750f7b2
--- /dev/null
+++ b/utils/python/common/filter_utils.py
@@ -0,0 +1,370 @@
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+import re
+from sre_constants import error as regex_error
+
+from vts.runners.host import const
+from vts.utils.python.common import list_utils
+
+REGEX_PREFIX = 'r('
+REGEX_SUFFIX = ')'
+REGEX_PREFIX_ESCAPE = '\\r('
+NEGATIVE_PATTERN_PREFIX = '-'
+_INCLUDE_FILTER = '_include_filter'
+_EXCLUDE_FILTER = '_exclude_filter'
+DEFAULT_EXCLUDE_OVER_INCLUDE = False
+_MODULE_NAME_PATTERN = '{module}.{test}'
+
+
+def ExpandBitness(input_list):
+    '''Expand filter items with bitness suffix.
+
+    If a filter item contains bitness suffix, only test name with that tag
+    will be included in output.
+    Otherwise, both 32bit and 64bit suffix will be paired to the test name
+    in output list.
+
+    Args:
+        input_list: list of string, the list to expand
+
+    Returns:
+        A list of string
+    '''
+    result = []
+    for item in input_list:
+        result.append(str(item))
+        if (not item.endswith(const.SUFFIX_32BIT) and
+                not item.endswith(const.SUFFIX_64BIT)):
+            result.append("%s_%s" % (item, const.SUFFIX_32BIT))
+            result.append("%s_%s" % (item, const.SUFFIX_64BIT))
+    return list_utils.DeduplicateKeepOrder(result)
+
+
+def SplitFilterList(input_list):
+    '''Split filter items into exact and regex lists.
+
+    To specify a regex filter, the syntax is:
+      'r(suite.test)' for regex matching of 'suite.test', where '.' means
+          one of any char.
+    See Filter class docstring for details.
+
+    Args:
+        input_list: list of string, the list to split
+
+    Returns:
+        A tuple of lists: two lists where the first one is exact matching
+                          list and second one is regex list where the wrapping
+                          syntax 'r(..)' is removed.
+    '''
+    exact = []
+    regex = []
+    for item in input_list:
+        if item.startswith(REGEX_PREFIX) and item.endswith(REGEX_SUFFIX):
+            regex_item = item[len(REGEX_PREFIX):-len(REGEX_SUFFIX)]
+            try:
+                re.compile(regex_item)
+                regex.append(regex_item)
+            except regex_error:
+                logging.error('Invalid regex %s, ignored. Please refer to '
+                              'python re syntax documentation.' % regex_item)
+        elif item.startswith(REGEX_PREFIX_ESCAPE) and item.endswith(
+                REGEX_SUFFIX):
+            exact.append(REGEX_PREFIX + item[len(REGEX_PREFIX_ESCAPE):])
+        else:
+            exact.append(item)
+
+    return (exact, regex)
+
+
+def SplitNegativePattern(input_list):
+    '''Split negative items out from an input filter list.
+
+    Items starting with the negative sign will be moved to the second returning
+    list.
+
+    Args:
+        input_list: list of string, the list to split
+
+    Returns:
+        A tuple of lists: two lists where the first one is positive patterns
+                          and second one is negative items whose negative sign
+                          is removed.
+    '''
+    positive = []
+    negative = []
+    for item in input_list:
+        if item.startswith(NEGATIVE_PATTERN_PREFIX):
+            negative.append(item[len(NEGATIVE_PATTERN_PREFIX):])
+        else:
+            positive.append(item)
+    return (positive, negative)
+
+
+def InRegexList(item, regex_list):
+    '''Checks whether a given string matches an item in the given regex list.
+
+    Args:
+        item: string, given string
+        regex_list: regex list
+
+    Returns:
+        bool, True if there is a match; False otherwise.
+    '''
+    for regex in regex_list:
+        p = re.compile(regex)
+        m = p.match(item)
+        if m and m.start() == 0 and m.end() == len(item):
+            return True
+
+    return False
+
+
+class Filter(object):
+    '''A class to hold test filter rules and filter test names.
+
+    Regex matching is supported. Regex syntax is python re package syntax.
+    To specify a regex filter, the syntax is:
+      'suite.test' for exact matching
+      'r(suite.test)' for regex matching of 'suite.test', where '.' means
+          one of any char.
+      '\r(suite.test)' for exact matching of name 'r(suite.test)', where
+          '\r' is a two char string ('\\r' in code).
+      Since test name is not expected to start with backslash, the exact
+      string matching of name '\r(suite.test)' is not supported here.
+
+    Negative pattern is supported. If a test name starts with the negative
+    sign in include_filter, the negative sign will be removed and item will
+    be moved from include_filter to exclude_filter. Negative sign should
+    be added before regex prefix, i.e., '-r(negative.pattern)'
+
+    Attributes:
+        enable_regex: bool, whether regex is enabled.
+        include_filter: list of string, input include filter
+        exclude_filter: list of string, input exclude filter
+        include_filter_exact: list of string, exact include filter
+        include_filter_regex: list of string, exact include filter
+        exclude_filter_exact: list of string, exact exclude filter
+        exclude_filter_regex: list of string, exact exclude filter
+        exclude_over_include: bool, False for include over exclude;
+                              True for exclude over include.
+        enable_native_pattern: bool, whether to enable negative pattern
+                               processing in include_filter
+        enable_module_name_prefix_matching: bool, whether to perform auto
+                                            module name prefix matching
+        module_name: string, test module name for auto module name prefix
+                     matching
+    '''
+    include_filter_exact = []
+    include_filter_regex = []
+    exclude_filter_exact = []
+    exclude_filter_regex = []
+
+    def __init__(self,
+                 include_filter=[],
+                 exclude_filter=[],
+                 enable_regex=False,
+                 exclude_over_include=None,
+                 enable_negative_pattern=True,
+                 enable_module_name_prefix_matching=False,
+                 module_name=None):
+        self.enable_regex = enable_regex
+
+        self.enable_negative_pattern = enable_negative_pattern
+        if self.enable_negative_pattern:
+            include_filter, include_filter_negative = SplitNegativePattern(
+                include_filter)
+            exclude_filter.extend(include_filter_negative)
+        self.include_filter = include_filter
+        self.exclude_filter = exclude_filter
+        if exclude_over_include is None:
+            exclude_over_include = DEFAULT_EXCLUDE_OVER_INCLUDE
+        self.exclude_over_include = exclude_over_include
+        self.enable_module_name_prefix_matching = enable_module_name_prefix_matching
+        self.module_name = module_name
+
+    def ExpandBitness(self):
+        '''Expand bitness from filter.
+
+        Items in the filter that doesn't contain bitness suffix will be expended
+        to 3 items, 2 of which ending with bitness. This method is safe if
+        called multiple times. Regex items will not be expanded
+        '''
+        self.include_filter_exact = ExpandBitness(self.include_filter_exact)
+        self.exclude_filter_exact = ExpandBitness(self.exclude_filter_exact)
+
+    def Filter(self, item):
+        '''Filter a given string using the internal filters.
+
+        Rule:
+            If include_filter is empty, only exclude_filter is checked
+            for non-passing. Otherwise, only include_filter is checked
+            (include_filter overrides exclude_filter).
+
+        Args:
+            item: string, the string for filter check
+
+        Returns:
+            bool. True if it passed the filter; False otherwise
+        '''
+        if not self.exclude_over_include:
+            return (self.IsInIncludeFilter(item) if self.include_filter else
+                    not self.IsInExcludeFilter(item))
+
+        if self.IsInExcludeFilter(item):
+            return False
+
+        if self.include_filter:
+            return self.IsInIncludeFilter(item)
+
+    def IsInIncludeFilter(self, item):
+        '''Check if item is in include filter.
+
+        If enable_module_name_prefix_matching is set to True, module name
+        added to item as prefix will also be check from the include filter.
+
+        Args:
+            item: string, item to check filter
+
+        Returns:
+            bool, True if in include filter.
+        '''
+        return self._ModuleNamePrefixMatchingCheck(item,
+                                                   self._IsInIncludeFilter)
+
+    def IsInExcludeFilter(self, item):
+        '''Check if item is in exclude filter.
+
+        If enable_module_name_prefix_matching is set to True, module name
+        added to item as prefix will also be check from the exclude filter.
+
+        Args:
+            item: string, item to check filter
+
+        Returns:
+            bool, True if in exclude filter.
+        '''
+        return self._ModuleNamePrefixMatchingCheck(item,
+                                                   self._IsInExcludeFilter)
+
+    def _ModuleNamePrefixMatchingCheck(self, item, check_function):
+        '''Check item from filter after appending module name as prefix.
+
+        This function will first check whether enable_module_name_prefix_matching
+        is True and module_name is not empty. Then, the check_function will
+        be applied to the item. If the result is False and
+        enable_module_name_prefix_matching is True, module name will be added
+        as the prefix to the item, in format of '<module_name>.<item>', and
+        call the check_function again with the new resulting name.
+
+        This is mainly used for retry command where test module name are
+        automatically added to test case name.
+
+        Args:
+            item: string, test name for checking.
+            check_function: function to check item in filters.
+
+        Return:
+            bool, True if item pass the filter from the given check_function.
+        '''
+        res = check_function(item)
+
+        if (not res and self.enable_module_name_prefix_matching and
+                self.module_name):
+            res = check_function(
+                _MODULE_NAME_PATTERN.format(
+                    module=self.module_name, test=item))
+
+        return res
+
+    def _IsInIncludeFilter(self, item):
+        '''Internal function to check if item is in include filter.
+
+        Args:
+            item: string, item to check filter
+
+        Returns:
+            bool, True if in include filter.
+        '''
+        return item in self.include_filter_exact or InRegexList(
+            item, self.include_filter_regex)
+
+    def _IsInExcludeFilter(self, item):
+        '''Internal function to check if item is in exclude filter.
+
+        Args:
+            item: string, item to check filter
+
+        Returns:
+            bool, True if in exclude filter.
+        '''
+        return item in self.exclude_filter_exact or InRegexList(
+            item, self.exclude_filter_regex)
+
+    @property
+    def include_filter(self):
+        '''Getter method for include_filter'''
+        return getattr(self, _INCLUDE_FILTER, [])
+
+    @include_filter.setter
+    def include_filter(self, include_filter):
+        '''Setter method for include_filter'''
+        setattr(self, _INCLUDE_FILTER, include_filter)
+        if self.enable_regex:
+            self.include_filter_exact, self.include_filter_regex = SplitFilterList(
+                include_filter)
+        else:
+            self.include_filter_exact = include_filter
+
+    @property
+    def exclude_filter(self):
+        '''Getter method for exclude_filter'''
+        return getattr(self, _EXCLUDE_FILTER, [])
+
+    @exclude_filter.setter
+    def exclude_filter(self, exclude_filter):
+        '''Setter method for exclude_filter'''
+        setattr(self, _EXCLUDE_FILTER, exclude_filter)
+        if self.enable_regex:
+            self.exclude_filter_exact, self.exclude_filter_regex = SplitFilterList(
+                exclude_filter)
+        else:
+            self.exclude_filter_exact = exclude_filter
+
+    def __str__(self):
+        return ('Filter:\nenable_regex: {enable_regex}\n'
+                'enable_negative_pattern: {enable_negative_pattern}\n'
+                'enable_module_name_prefix_matching: '
+                '{enable_module_name_prefix_matching}\n'
+                'module_name: {module_name}\n'
+                'include_filter: {include_filter}\n'
+                'exclude_filter: {exclude_filter}\n'
+                'include_filter_exact: {include_filter_exact}\n'
+                'include_filter_regex: {include_filter_regex}\n'
+                'exclude_filter_exact: {exclude_filter_exact}\n'
+                'exclude_filter_regex: {exclude_filter_regex}'.format(
+                    enable_regex=self.enable_regex,
+                    enable_negative_pattern=self.enable_negative_pattern,
+                    enable_module_name_prefix_matching=
+                    self.enable_module_name_prefix_matching,
+                    module_name=self.module_name,
+                    include_filter=self.include_filter,
+                    exclude_filter=self.exclude_filter,
+                    include_filter_exact=self.include_filter_exact,
+                    include_filter_regex=self.include_filter_regex,
+                    exclude_filter_exact=self.exclude_filter_exact,
+                    exclude_filter_regex=self.exclude_filter_regex))
diff --git a/utils/python/common/list_utils.py b/utils/python/common/list_utils.py
index 10694d5..8bdce9d 100644
--- a/utils/python/common/list_utils.py
+++ b/utils/python/common/list_utils.py
@@ -15,6 +15,9 @@
 #
 
 import itertools
+import os
+
+DEFAULT_COMMENT_CHAR = '#'
 
 
 def ItemsToStr(input_list):
@@ -67,13 +70,155 @@
 
 
 def DeduplicateKeepOrder(input):
-    '''Remove duplicate items from a sequence while keeping the item order
+    '''Remove duplicate items from a sequence while keeping the item order.
 
     Args:
         input: a sequence that might have duplicated items.
 
     Returns:
-        A deduplicated list where item order is kept
+        A deduplicated list where item order is kept.
+    '''
+    return MergeUniqueKeepOrder(input)
+
+
+def MergeUniqueKeepOrder(*lists):
+    '''Merge two list, remove duplicate items, and order.
+
+    Args:
+        lists: any number of lists
+
+    Returns:
+        A merged list where items are unique and original order is kept.
     '''
     seen = set()
-    return [x for x in input if not (x in seen or seen.add(x))]
+    return [
+        x for x in itertools.chain(*lists) if not (x in seen or seen.add(x))
+    ]
+
+
+def LoadListFromCommentedTextFile(file_path,
+                                  to_str=True,
+                                  to_strip=True,
+                                  exclude_empty_line=True,
+                                  exclude_comment_line=True,
+                                  exclude_trailing_comment=True,
+                                  remove_duplicates=False,
+                                  remove_line_breaks=True,
+                                  comment_char=DEFAULT_COMMENT_CHAR):
+    '''Read commented text file into a list of lines.
+
+        Comments or empty lines will be excluded by default.
+
+        Args:
+            file_path: string, path to file
+            to_str: bool, whether to convert lines to string in result list.
+                    Default value is True.
+            to_strip: bool, whether to strip lines in result list.
+                      Default value is True.
+            exclude_empty_line: bool, whether to exclude empty items in result list
+                                Default value is True.
+            exclude_comment_line: bool, whether to exclude lines that only contains comments.
+                                  If a line starts with spaces and ends with comments it
+                                  will still be excluded even if to_trim is False.
+                                  Default value is True.
+            exclude_trailing_comment: bool, whether to remove trailing comments
+                                      from result items.
+                                      Default value is True.
+            remove_duplicates: bool, whether to remove duplicate items in output list.
+                               Default value is False.
+            remove_line_breaks: bool, whether to remove trailing trailing
+                                new line characters from result items.
+                                Default value is True.
+            comment_char: string, character to denote comment.
+                          Default value is pound (#).
+
+        Returns:
+            a list of string. None if file does not exist.
+        '''
+    if not os.path.isfile(file_path):
+        logging.error('The path provided is not a file or does not exist: %s',
+                      file_path)
+        return None
+
+    with open(file_path, 'r') as f:
+        return LoadListFromCommentedText(
+            f.read(),
+            to_str,
+            to_strip,
+            exclude_empty_line,
+            exclude_comment_line,
+            exclude_trailing_comment,
+            remove_duplicates,
+            remove_line_breaks,
+            comment_char=DEFAULT_COMMENT_CHAR)
+
+
+def LoadListFromCommentedText(text,
+                              to_str=True,
+                              to_strip=True,
+                              exclude_empty_line=True,
+                              exclude_comment_line=True,
+                              exclude_trailing_comment=True,
+                              remove_duplicates=False,
+                              remove_line_breaks=True,
+                              comment_char=DEFAULT_COMMENT_CHAR):
+    '''Read commented text into a list of lines.
+
+        Comments or empty lines will be excluded by default.
+
+        Args:
+            text: string, text to parse
+            to_str: bool, whether to convert lines to string in result list.
+                    Default value is True.
+            to_strip: bool, whether to strip lines in result list.
+                      Default value is True.
+            exclude_empty_line: bool, whether to exclude empty items in result list
+                                Default value is True.
+            exclude_comment_line: bool, whether to exclude lines that only contains comments.
+                                  If a line starts with spaces and ends with comments it
+                                  will still be excluded even if to_trim is False.
+                                  Default value is True.
+            exclude_trailing_comment: bool, whether to remove trailing comments
+                                      from result items.
+                                      Default value is True.
+            remove_duplicates: bool, whether to remove duplicate items in output list.
+                               Default value is False.
+            remove_line_breaks: bool, whether to remove trailing trailing
+                                new line characters from result items.
+                                Default value is True.
+            comment_char: string, character to denote comment.
+                          Default value is pound (#).
+
+        Returns:
+            a list of string.
+        '''
+    lines = text.splitlines(not remove_line_breaks)
+
+    if to_str:
+        lines = map(str, lines)
+
+    if exclude_trailing_comment:
+
+        def RemoveComment(line):
+            idx = line.find(comment_char)
+            if idx < 0:
+                return line
+            else:
+                return line[:idx]
+
+        lines = map(RemoveComment, lines)
+
+    if to_strip:
+        lines = map(lambda line: line.strip(), lines)
+
+    if exclude_comment_line:
+        lines = filter(lambda line: not line.strip().startswith(comment_char),
+                       lines)
+
+    if exclude_empty_line:
+        lines = filter(bool, lines)
+
+    if remove_duplicates:
+        lines = DeduplicateKeepOrder(lines)
+
+    return lines
diff --git a/utils/python/common/vintf_utils.py b/utils/python/common/vintf_utils.py
index 5eff51a..abcf4c3 100644
--- a/utils/python/common/vintf_utils.py
+++ b/utils/python/common/vintf_utils.py
@@ -104,6 +104,9 @@
     passthrough_hals = dict()
 
     for xml_hal in xml_root:
+        if xml_hal.tag != 'hal':
+            logging.debug('vintf has a non-hal child with tag: %s', xml_hal.tag)
+            continue
         hal_name = None
         hal_transport = None
         hal_version = None
diff --git a/utils/python/controllers/android_device.py b/utils/python/controllers/android_device.py
index 270a3d3..6b0f099 100644
--- a/utils/python/controllers/android_device.py
+++ b/utils/python/controllers/android_device.py
@@ -510,7 +510,7 @@
             raise AndroidDeviceError(("Android device %s already has an adb "
                                       "logcat thread going on. Cannot start "
                                       "another one.") % self.serial)
-        f_name = "adblog,%s,%s.txt" % (self.model, self.serial)
+        f_name = "adblog_%s_%s.txt" % (self.model, self.serial)
         utils.create_dir(self.log_path)
         logcat_file_path = os.path.join(self.log_path, f_name)
         try:
@@ -729,15 +729,16 @@
             "rm -f /data/local/tmp/vts_agent_callback*"
         ]
         kill_commands = ["killall vts_hal_agent32", "killall vts_hal_agent64",
-                         "killall fuzzer32", "killall fuzzer64",
+                         "killall vts_hal_driver32",
+                         "killall vts_hal_driver64",
                          "killall vts_shell_driver32",
                          "killall vts_shell_driver64"]
         cleanup_commands.extend(kill_commands)
         chmod_commands = [
             "chmod 755 %s/32/vts_hal_agent32" % DEFAULT_AGENT_BASE_DIR,
             "chmod 755 %s/64/vts_hal_agent64" % DEFAULT_AGENT_BASE_DIR,
-            "chmod 755 %s/32/fuzzer32" % DEFAULT_AGENT_BASE_DIR,
-            "chmod 755 %s/64/fuzzer64" % DEFAULT_AGENT_BASE_DIR,
+            "chmod 755 %s/32/vts_hal_driver32" % DEFAULT_AGENT_BASE_DIR,
+            "chmod 755 %s/64/vts_hal_driver64" % DEFAULT_AGENT_BASE_DIR,
             "chmod 755 %s/32/vts_shell_driver32" % DEFAULT_AGENT_BASE_DIR,
             "chmod 755 %s/64/vts_shell_driver64" % DEFAULT_AGENT_BASE_DIR
         ]
@@ -757,7 +758,7 @@
             cmd = (
                 'adb -s {s} shell LD_LIBRARY_PATH={path}/{bitness} '
                 '{path}/{bitness}/vts_hal_agent{bitness}'
-                ' {path}/32/fuzzer32 {path}/64/fuzzer64 {path}/spec'
+                ' {path}/32/vts_hal_driver32 {path}/64/vts_hal_driver64 {path}/spec'
                 ' {path}/32/vts_shell_driver32 {path}/64/vts_shell_driver64 >> {log} 2>&1'
             ).format(s=self.serial,
                      bitness=bitness,
diff --git a/utils/python/file/file_utils.py b/utils/python/file/target_file_utils.py
similarity index 84%
rename from utils/python/file/file_utils.py
rename to utils/python/file/target_file_utils.py
index a442382..a9e91c9 100644
--- a/utils/python/file/file_utils.py
+++ b/utils/python/file/target_file_utils.py
@@ -22,6 +22,7 @@
 _WRITE_PERMISSION = 2
 _EXECUTE_PERMISSION = 1
 
+
 def Exists(filepath, shell):
     """Determines if a file exists.
 
@@ -30,7 +31,8 @@
         shell: an instance of the VTS shell
 
     Returns:
-        True if the file exists, False otherwise"""
+        True if the file exists, False otherwise
+    """
     cmd = "ls %s" % filepath
     results = shell.Execute(cmd)
     if results[const.EXIT_CODE][0] != 0:
@@ -39,6 +41,7 @@
     out_str = str(results[const.STDOUT][0]).strip()
     return out_str.find(filepath) == 0
 
+
 def FindFiles(shell, path, name_pattern):
     """Searches a path for files on device.
 
@@ -65,6 +68,7 @@
     stdout = str(results[const.STDOUT][0])
     return stdout.strip().split("\n")
 
+
 def ReadFileContent(filepath, shell):
     """Read the content of a file and perform assertions.
 
@@ -76,11 +80,11 @@
         string, content of file
 
     Raises:
-        IOError if the file does not exist."""
+        IOError if the file does not exist.
+    """
     cmd = "cat %s" % filepath
     results = shell.Execute(cmd)
-    logging.info("%s: Shell command '%s' results: %s", filepath, cmd,
-                 results)
+    logging.info("%s: Shell command '%s' results: %s", filepath, cmd, results)
 
     # checks the exit code
     if results[const.EXIT_CODE][0] != 0:
@@ -88,6 +92,7 @@
 
     return results[const.STDOUT][0]
 
+
 def GetPermission(path, shell):
     """Read the file permission bits of a path.
 
@@ -103,8 +108,7 @@
     """
     cmd = "stat -c %%a %s" % path
     results = shell.Execute(cmd)
-    logging.info("%s: Shell command '%s' results: %s", path, cmd,
-                 results)
+    logging.info("%s: Shell command '%s' results: %s", path, cmd, results)
 
     # checks the exit code
     if results[const.EXIT_CODE][0] != 0:
@@ -112,10 +116,11 @@
 
     accessBits = results[const.STDOUT][0].strip()
     if len(accessBits) != 3:
-        raise IOError("%s: Wrong number of access bits (%s)" %
-                      (path, accessBits))
+        raise IOError("%s: Wrong number of access bits (%s)" % (path,
+                                                                accessBits))
     return accessBits
 
+
 def _HasPermission(permission_bits, groupIndex, permission):
     """Determines if the permission bits grant a permission to a group.
 
@@ -130,7 +135,8 @@
         True if the group(s) has read permission.
 
     Raises:
-        ValueError if the group or permission bits are invalid"""
+        ValueError if the group or permission bits are invalid
+    """
     if groupIndex >= _PERMISSION_GROUPS:
         raise ValueError("Invalid group: %s" % str(groupIndex))
 
@@ -154,6 +160,7 @@
     # Return true if no group lacks the permission
     return True
 
+
 def IsReadable(permission_bits):
     """Determines if the permission bits grant read permission to any group.
 
@@ -164,9 +171,13 @@
         True if any group has read permission.
 
     Raises:
-        ValueError if the group or permission bits are invalid"""
-    return any([_HasPermission(permission_bits, i, _READ_PERMISSION) for i in
-                range(_PERMISSION_GROUPS)])
+        ValueError if the group or permission bits are invalid
+    """
+    return any([
+        _HasPermission(permission_bits, i, _READ_PERMISSION)
+        for i in range(_PERMISSION_GROUPS)
+    ])
+
 
 def IsWritable(permission_bits):
     """Determines if the permission bits grant write permission to any group.
@@ -178,9 +189,13 @@
         True if any group has write permission.
 
     Raises:
-        ValueError if the group or permission bits are invalid"""
-    return any([_HasPermission(permission_bits, i, _WRITE_PERMISSION) for i in
-                range(_PERMISSION_GROUPS)])
+        ValueError if the group or permission bits are invalid
+    """
+    return any([
+        _HasPermission(permission_bits, i, _WRITE_PERMISSION)
+        for i in range(_PERMISSION_GROUPS)
+    ])
+
 
 def IsExecutable(permission_bits):
     """Determines if the permission bits grant execute permission to any group.
@@ -192,9 +207,13 @@
         True if any group has execute permission.
 
     Raises:
-        ValueError if the group or permission bits are invalid"""
-    return any([_HasPermission(permission_bits, i, _EXECUTE_PERMISSION) for i in
-                range(_PERMISSION_GROUPS)])
+        ValueError if the group or permission bits are invalid
+    """
+    return any([
+        _HasPermission(permission_bits, i, _EXECUTE_PERMISSION)
+        for i in range(_PERMISSION_GROUPS)
+    ])
+
 
 def IsReadOnly(permission_bits):
     """Determines if the permission bits grant read-only permission.
@@ -209,9 +228,11 @@
         True if any group has read permission, none have write.
 
     Raises:
-        ValueError if the group or permission bits are invalid"""
+        ValueError if the group or permission bits are invalid
+    """
     return IsReadable(permission_bits) and not IsWritable(permission_bits)
 
+
 def IsWriteOnly(permission_bits):
     """Determines if the permission bits grant write-only permission.
 
@@ -225,9 +246,11 @@
         True if any group has write permission, none have read.
 
     Raises:
-        ValueError if the group or permission bits are invalid"""
+        ValueError if the group or permission bits are invalid
+    """
     return IsWritable(permission_bits) and not IsReadable(permission_bits)
 
+
 def IsReadWrite(permission_bits):
     """Determines if the permission bits grant read/write permissions.
 
@@ -241,9 +264,11 @@
         True if read and write permissions are granted to any group(s).
 
     Raises:
-        ValueError if the group or permission bits are invalid"""
+        ValueError if the group or permission bits are invalid
+    """
     return IsReadable(permission_bits) and IsWritable(permission_bits)
 
+
 def assertPermissionsAndExistence(shell, path, check_permission):
     """Asserts that the specified path exists and has the correct permission.
 
@@ -253,14 +278,11 @@
                           format and returns True if the permissions are
                           correct, False otherwise.
     """
-    asserts.assertTrue(
-        Exists(path, shell),
-        "%s: File does not exist." % path)
+    asserts.assertTrue(Exists(path, shell), "%s: File does not exist." % path)
     try:
         permission = GetPermission(path, shell)
         asserts.assertTrue(
             check_permission(permission),
-            "%s: File has invalid permissions (%s)" %
-            (path, permission))
+            "%s: File has invalid permissions (%s)" % (path, permission))
     except (ValueError, IOError) as e:
         asserts.fail("Failed to assert permissions: %s" % str(e))
diff --git a/utils/python/library/elf_consts.py b/utils/python/library/elf_consts.py
index 1b42efb..ead4771 100644
--- a/utils/python/library/elf_consts.py
+++ b/utils/python/library/elf_consts.py
@@ -24,6 +24,8 @@
 BITNESS_64 = 2
 # Section type
 SHT_DYNAMIC = 6
+# Section index
+SHN_UNDEFINED = 0
 # Tag in dynamic section
 DT_NULL = 0
 DT_NEEDED = 1
@@ -31,6 +33,8 @@
 # Section name
 DYNSYM = ".dynsym"
 DYNSTR = ".dynstr"
+# Type in symbol table
+SYMBOL_NOTYPE = 0
 # Binding in symbol table
 SYMBOL_BINDING_GLOBAL = 1
 SYMBOL_BINDING_WEAK = 2
@@ -53,6 +57,7 @@
     # Offset from symbol table entry
     SYMBOL_NAME = 0x00
     SYMBOL_INFO = 0x0c
+    SYMBOL_SECTION_INDEX = 0x0e
 
 
 class ElfOffsets64(object):
@@ -72,3 +77,4 @@
     # Offset from symbol table entry
     SYMBOL_NAME = 0x00
     SYMBOL_INFO = 0x04
+    SYMBOL_SECTION_INDEX = 0x06
diff --git a/utils/python/library/elf_parser.py b/utils/python/library/elf_parser.py
index 45fe96d..72d939d 100644
--- a/utils/python/library/elf_parser.py
+++ b/utils/python/library/elf_parser.py
@@ -103,7 +103,8 @@
 
     def Close(self):
         """Closes the ELF file."""
-        self._file.close()
+        if hasattr(self, "_file"):
+            self._file.close()
 
     def _SeekRead(self, offset, read_size):
         """Reads a byte string at specific offset in the file.
@@ -284,9 +285,15 @@
         for offset in range(
                 dynsym.offset, dynsym.offset + dynsym.size, dynsym.entry_size):
             sym_info = self._SeekRead8(offset + self._offsets.SYMBOL_INFO)
+            if (sym_info & 0xf) == elf_consts.SYMBOL_NOTYPE:
+                continue
             if sym_info >> 4 not in (elf_consts.SYMBOL_BINDING_GLOBAL,
                                      elf_consts.SYMBOL_BINDING_WEAK):
                 continue
+            sym_sh_index = self._SeekRead16(
+                    offset + self._offsets.SYMBOL_SECTION_INDEX)
+            if sym_sh_index == elf_consts.SHN_UNDEFINED:
+                continue
             name_offset = self._SeekRead32(offset + self._offsets.SYMBOL_NAME)
             sym_names.append(self._SeekReadString(dynstr.offset + name_offset))
         return sym_names
diff --git a/utils/python/mirror/hal_mirror.py b/utils/python/mirror/hal_mirror.py
index b5a9ae1..da4ab7f 100644
--- a/utils/python/mirror/hal_mirror.py
+++ b/utils/python/mirror/hal_mirror.py
@@ -25,44 +25,49 @@
 from vts.runners.host.tcp_server import callback_server
 from vts.utils.python.mirror import mirror_object
 
-COMPONENT_CLASS_DICT = {"hal_conventional": 1,
-                        "hal_conventional_submodule": 2,
-                        "hal_legacy": 3,
-                        "hal_hidl": 4,
-                        "hal_hidl_wrapped_conventional": 5,
-                        "lib_shared": 11}
+COMPONENT_CLASS_DICT = {
+    "hal_conventional": 1,
+    "hal_conventional_submodule": 2,
+    "hal_legacy": 3,
+    "hal_hidl": 4,
+    "hal_hidl_wrapped_conventional": 5,
+    "lib_shared": 11
+}
 
-COMPONENT_TYPE_DICT = {"audio": 1,
-                       "camera": 2,
-                       "gps": 3,
-                       "gnss": 3,
-                       "light": 4,
-                       "wifi": 5,
-                       "mobile": 6,
-                       "bluetooth": 7,
-                       "nfc": 8,
-                       "vibrator": 12,
-                       "thermal": 13,
-                       "tv_input": 14,
-                       "tv_cec": 15,
-                       "sensors": 16,
-                       "vehicle": 17,
-                       "vr": 18,
-                       "graphics_allocator": 19,
-                       "graphics_mapper": 20,
-                       "radio": 21,
-                       "contexthub": 22,
-                       "graphics_composer": 23,
-                       "media_omx": 24,
-                       "bionic_libm": 1001,
-                       "bionic_libc": 1002,
-                       "vndk_libcutils": 1101}
+COMPONENT_TYPE_DICT = {
+    "audio": 1,
+    "camera": 2,
+    "gps": 3,
+    "gnss": 3,
+    "light": 4,
+    "wifi": 5,
+    "mobile": 6,
+    "bluetooth": 7,
+    "nfc": 8,
+    "vibrator": 12,
+    "thermal": 13,
+    "tv_input": 14,
+    "tv_cec": 15,
+    "sensors": 16,
+    "vehicle": 17,
+    "vr": 18,
+    "graphics_allocator": 19,
+    "graphics_mapper": 20,
+    "radio": 21,
+    "contexthub": 22,
+    "graphics_composer": 23,
+    "media_omx": 24,
+    "bionic_libm": 1001,
+    "bionic_libc": 1002,
+    "vndk_libcutils": 1101
+}
 
 VTS_CALLBACK_SERVER_TARGET_SIDE_PORT = 5010
 
 _DEFAULT_TARGET_BASE_PATHS = ["/system/lib64/hw"]
 _DEFAULT_HWBINDER_SERVICE = "default"
 
+
 class HalMirror(object):
     """The class that acts as the mirror to an Android device's HAL layer.
 
@@ -125,13 +130,14 @@
                           by default.
             bits: integer, processor architecture indicator: 32 or 64.
         """
-        self._CreateMirrorObject("hal_conventional",
-                                 target_type,
-                                 target_version,
-                                 target_package=target_package,
-                                 target_basepaths=target_basepaths,
-                                 handler_name=handler_name,
-                                 bits=bits)
+        self._CreateMirrorObject(
+            "hal_conventional",
+            target_type,
+            target_version,
+            target_package=target_package,
+            target_basepaths=target_basepaths,
+            handler_name=handler_name,
+            bits=bits)
 
     def InitLegacyHal(self,
                       target_type,
@@ -153,12 +159,13 @@
                           by default.
             bits: integer, processor architecture indicator: 32 or 64.
         """
-        self._CreateMirrorObject("hal_legacy",
-                                 target_type,
-                                 target_version,
-                                 target_basepaths=target_basepaths,
-                                 handler_name=handler_name,
-                                 bits=bits)
+        self._CreateMirrorObject(
+            "hal_legacy",
+            target_type,
+            target_version,
+            target_basepaths=target_basepaths,
+            handler_name=handler_name,
+            bits=bits)
 
     def InitHidlHal(self,
                     target_type,
@@ -185,15 +192,16 @@
             hw_binder_service_name: string, the name of a HW binder service.
             bits: integer, processor architecture indicator: 32 or 64.
         """
-        self._CreateMirrorObject("hal_hidl",
-                                 target_type,
-                                 target_version,
-                                 target_package=target_package,
-                                 target_component_name=target_component_name,
-                                 target_basepaths=target_basepaths,
-                                 handler_name=handler_name,
-                                 hw_binder_service_name=hw_binder_service_name,
-                                 bits=bits)
+        self._CreateMirrorObject(
+            "hal_hidl",
+            target_type,
+            target_version,
+            target_package=target_package,
+            target_component_name=target_component_name,
+            target_basepaths=target_basepaths,
+            handler_name=handler_name,
+            hw_binder_service_name=hw_binder_service_name,
+            bits=bits)
 
     def RemoveHal(self, handler_name):
         self._hal_level_mirrors[handler_name].CleanUp()
@@ -250,8 +258,9 @@
                                               bits)
         self._StartCallbackServer()
         self._client = vts_tcp_client.VtsTcpClient()
-        self._client.Connect(command_port=self._host_command_port,
-                             callback_port=self._host_callback_port)
+        self._client.Connect(
+            command_port=self._host_command_port,
+            callback_port=self._host_callback_port)
         if not handler_name:
             handler_name = target_type
         service_name = "vts_driver_%s" % handler_name
@@ -293,7 +302,7 @@
             "hal_hidl": ASysCtrlMsg.VTS_DRIVER_TYPE_HAL_HIDL
         }.get(target_class)
 
-        launched = self._client.LaunchDriverService(
+        driver_id = self._client.LaunchDriverService(
             driver_type=driver_type,
             service_name=service_name,
             bits=bits,
@@ -305,7 +314,7 @@
             target_component_name=target_component_name,
             hw_binder_service_name=hw_binder_service_name)
 
-        if not launched:
+        if driver_id == -1:
             raise errors.ComponentLoadingError(
                 "Failed to launch driver service %s from file path %s" %
                 (target_type, target_filename))
@@ -315,19 +324,19 @@
         if not found_api_spec:
             raise errors.ComponentLoadingError("No API found for %s" %
                                                service_name)
-        logging.debug("Found %d APIs for %s:\n%s", len(found_api_spec),
-                      service_name, found_api_spec)
+        logging.debug("Found %d APIs for %s:\n%s",
+                      len(found_api_spec), service_name, found_api_spec)
         if_spec_msg = CompSpecMsg.ComponentSpecificationMessage()
         text_format.Merge(found_api_spec, if_spec_msg)
 
         # Instantiate a MirrorObject and return it.
-        hal_mirror = mirror_object.MirrorObject(self._client, if_spec_msg,
-                                                self._callback_server)
+        hal_mirror = mirror_object.MirrorObject(
+            self._client, if_spec_msg, self._callback_server, driver_id)
         self._hal_level_mirrors[handler_name] = hal_mirror
 
     def __getattr__(self, name):
         return self._hal_level_mirrors[name]
 
     def Ping(self):
-      """Returns true iff pinging the agent is successful, False otherwise."""
-      return self._client.Ping()
+        """Returns true iff pinging the agent is successful, False otherwise."""
+        return self._client.Ping()
diff --git a/utils/python/mirror/mirror_object.py b/utils/python/mirror/mirror_object.py
index bfd3222..65c3f29 100644
--- a/utils/python/mirror/mirror_object.py
+++ b/utils/python/mirror/mirror_object.py
@@ -30,6 +30,7 @@
 INTERFACE = "interface"
 API = "api"
 
+
 class MirrorObjectError(Exception):
     """Raised when there is a general error in manipulating a mirror object."""
     pass
@@ -54,12 +55,16 @@
         __caller_uid: string, the caller's UID if not None.
     """
 
-    def __init__(self, client, msg, callback_server, interface_id=None,
+    def __init__(self,
+                 client,
+                 msg,
+                 callback_server,
+                 hal_driver_id=None,
                  parent_path=None):
         self._client = client
         self._if_spec_msg = msg
         self._callback_server = callback_server
-        self._interface_id = interface_id
+        self._hal_driver_id = hal_driver_id
         self._parent_path = parent_path
         self._last_raw_code_coverage_data = None
         self.__caller_uid = None
@@ -86,20 +91,22 @@
         Args:
             module_name: string, the name of a module to load.
         """
-        func_msg = CompSpecMsg.FunctionSpecificationMessage()
-        func_msg.name = "#Open"
-        logging.debug("remote call %s", func_msg.name)
+        call_msg = CompSpecMsg.FunctionCallMessage()
+        if self._hal_driver_id is not None:
+            call_msg.hal_driver_id = self._hal_driver_id
+        call_msg.component_class = CompSpecMsg.HAL_CONVENTIONAL
+        call_msg.api.name = "#Open"
         if module_name:
-            arg = func_msg.arg.add()
+            arg = call_msg.api.arg.add()
             arg.type = CompSpecMsg.TYPE_STRING
             arg.string_value.message = module_name
 
-            func_msg.return_type.type == CompSpecMsg.TYPE_SCALAR
-            func_msg.return_type.scalar_type = "int32_t"
-        logging.debug("final msg %s", func_msg)
+            call_msg.api.return_type.type == CompSpecMsg.TYPE_SCALAR
+            call_msg.api.return_type.scalar_type = "int32_t"
+        logging.debug("final msg %s", call_msg)
 
-        result = self._client.CallApi(text_format.MessageToString(func_msg),
-                                      self.__caller_uid)
+        result = self._client.CallApi(
+            text_format.MessageToString(call_msg), self.__caller_uid)
         logging.debug(result)
         return result
 
@@ -120,13 +127,15 @@
         Returns:
             FunctionSpecificationMessage which contains the value.
         """
+
         def RemoteCallToGetAttribute(*args, **kwargs):
             """Makes a remote call and retrieves an attribute."""
             func_msg = self.GetAttribute(attribute_name)
             if not func_msg:
                 raise MirrorObjectError("attribute %s unknown", func_msg)
 
-            logging.debug("remote call %s.%s", self._parent_path, attribute_name)
+            logging.debug("remote call %s.%s", self._parent_path,
+                          attribute_name)
             logging.info("remote call %s%s", attribute_name, args)
             if self._parent_path:
                 func_msg.parent_path = self._parent_path
@@ -135,8 +144,8 @@
                               CompSpecMsg.ComponentSpecificationMessage):
                     logging.info("component_class %s",
                                  self._if_spec_msg.component_class)
-                    if (self._if_spec_msg.component_class
-                        == CompSpecMsg.HAL_CONVENTIONAL_SUBMODULE):
+                    if (self._if_spec_msg.component_class ==
+                            CompSpecMsg.HAL_CONVENTIONAL_SUBMODULE):
                         submodule_name = self._if_spec_msg.original_data_structure_name
                         if submodule_name.endswith("*"):
                             submodule_name = submodule_name[:-1]
@@ -169,11 +178,8 @@
 
         msg = self._if_spec_msg
         specification = self._client.ReadSpecification(
-            interface_name,
-            msg.component_class,
-            msg.component_type,
-            msg.component_type_version,
-            msg.package)
+            interface_name, msg.component_class, msg.component_type,
+            msg.component_type_version, msg.package)
         logging.info("specification: %s", specification)
         interface = getattr(specification, INTERFACE, None)
         apis = getattr(interface, API, [])
@@ -182,12 +188,14 @@
             if api.name in kwargs:
                 function_pointer = kwargs[api.name]
             else:
+
                 def dummy(*args):
                     """Dummy implementation for any callback function."""
                     logging.info("Entering dummy implementation"
                                  " for callback function: %s", api.name)
                     for arg_index in range(len(args)):
                         logging.info("arg%s: %s", arg_index, args[arg_index])
+
                 function_pointer = dummy
             func_pt_msg = var_msg.function_pointer.add()
             func_pt_msg.function_name = api.name
@@ -195,9 +203,12 @@
 
         return var_msg
 
-    def GetHidlTypeInterface(self, interface_name,
-                             target_class=None, target_type=None,
-                             version=None, package=None):
+    def GetHidlTypeInterface(self,
+                             interface_name,
+                             target_class=None,
+                             target_type=None,
+                             version=None,
+                             package=None):
         """Gets HIDL type interface's host-side mirror.
 
         Args:
@@ -226,9 +237,13 @@
         logging.info("result %s", result)
         return mirror_object_for_types.MirrorObjectForTypes(result)
 
-    def GetHidlNestedInterface(self, interface_name, interface_id,
-                               target_class=None, target_type=None,
-                               version=None, package=None):
+    def GetHidlNestedInterface(self,
+                               interface_name,
+                               hal_driver_id,
+                               target_class=None,
+                               target_type=None,
+                               version=None,
+                               package=None):
         """Gets HIDL type interface's host-side mirror.
 
         Args:
@@ -264,8 +279,7 @@
 
         # Instantiate a MirrorObject and return it.
         hal_mirror = MirrorObject(
-            self._client, if_spec_msg, None,
-            interface_id=interface_id)
+            self._client, if_spec_msg, None, hal_driver_id=hal_driver_id)
         return hal_mirror
 
     def CleanUp(self):
@@ -285,14 +299,16 @@
         # handle reserved methods first.
         if api_name == "notifySyspropsChanged":
             func_msg = CompSpecMsg.FunctionSpecificationMessage()
-            func_msg.name =  api_name
+            func_msg.name = api_name
             return func_msg
-        if isinstance(self._if_spec_msg, CompSpecMsg.ComponentSpecificationMessage):
+        if isinstance(self._if_spec_msg,
+                      CompSpecMsg.ComponentSpecificationMessage):
             if len(self._if_spec_msg.interface.api) > 0:
                 for api in self._if_spec_msg.interface.api:
                     if api.name == api_name:
                         return copy.copy(api)
-        elif isinstance(self._if_spec_msg, CompSpecMsg.StructSpecificationMessage):
+        elif isinstance(self._if_spec_msg,
+                        CompSpecMsg.StructSpecificationMessage):
             if len(self._if_spec_msg.api) > 0:
                 for api in self._if_spec_msg.api:
                     logging.info("api %s", api)
@@ -313,8 +329,8 @@
     def GetAttribute(self, attribute_name):
         """Returns the Message.
         """
-        logging.debug("GetAttribute %s for %s",
-                      attribute_name, self._if_spec_msg)
+        logging.debug("GetAttribute %s for %s", attribute_name,
+                      self._if_spec_msg)
         if self._if_spec_msg.attribute:
             for attribute in self._if_spec_msg.attribute:
                 if attribute.name == attribute_name:
@@ -329,7 +345,7 @@
                     logging.info("GetAttribute request: %s", func_msg)
                     return copy.copy(func_msg)
         if (self._if_spec_msg.interface and
-            self._if_spec_msg.interface.attribute):
+                self._if_spec_msg.interface.attribute):
             for attribute in self._if_spec_msg.interface.attribute:
                 if attribute.name == attribute_name:
                     func_msg = CompSpecMsg.FunctionSpecificationMessage()
@@ -353,13 +369,15 @@
         Returns:
             StructSpecificationMessage if found, None otherwise
         """
-        if isinstance(self._if_spec_msg, CompSpecMsg.ComponentSpecificationMessage):
+        if isinstance(self._if_spec_msg,
+                      CompSpecMsg.ComponentSpecificationMessage):
             if (self._if_spec_msg.interface and
-                self._if_spec_msg.interface.sub_struct):
+                    self._if_spec_msg.interface.sub_struct):
                 for sub_struct in self._if_spec_msg.interface.sub_struct:
                     if sub_struct.name == sub_struct_name:
                         return copy.copy(sub_struct)
-        elif isinstance(self._if_spec_msg, CompSpecMsg.StructSpecificationMessage):
+        elif isinstance(self._if_spec_msg,
+                        CompSpecMsg.StructSpecificationMessage):
             if len(self._if_spec_msg.sub_struct) > 0:
                 for sub_struct in self._if_spec_msg.sub_struct:
                     if sub_struct.name == sub_struct_name:
@@ -381,7 +399,7 @@
                     if not attribute.is_const and attribute.name == type_name:
                         return copy.copy(attribute)
             if (self._if_spec_msg.interface and
-                self._if_spec_msg.interface.attribute):
+                    self._if_spec_msg.interface.attribute):
                 for attribute in self._if_spec_msg.interface.attribute:
                     if not attribute.is_const and attribute.name == type_name:
                         return copy.copy(attribute)
@@ -406,7 +424,7 @@
                     if attribute.is_const and attribute.name == type_name:
                         return copy.copy(attribute)
                     elif attribute.type == CompSpecMsg.TYPE_ENUM:
-                      for enumerator in attribute.enum_value.enumerator:
+                        for enumerator in attribute.enum_value.enumerator:
                             if enumerator == type_name:
                                 return copy.copy(attribute)
             if self._if_spec_msg.interface and self._if_spec_msg.interface.attribute:
@@ -449,15 +467,15 @@
             if ((arg_msg.type == CompSpecMsg.TYPE_SCALAR and
                  (arg_msg.scalar_type == "char_pointer" or
                   arg_msg.scalar_type == "uchar_pointer")) or
-                arg_msg.type == CompSpecMsg.TYPE_STRING):
+                    arg_msg.type == CompSpecMsg.TYPE_STRING):
                 arg_msg.string_value.message = value_msg
                 arg_msg.string_value.length = len(value_msg)
             else:
-                raise MirrorObjectError(
-                    "unsupported type %s for str" % arg_msg)
+                raise MirrorObjectError("unsupported type %s for str" %
+                                        arg_msg)
         elif isinstance(value_msg, list):
             if (arg_msg.type == CompSpecMsg.TYPE_VECTOR or
-                arg_msg.type == CompSpecMsg.TYPE_ARRAY):
+                    arg_msg.type == CompSpecMsg.TYPE_ARRAY):
                 first = True
                 for list_element in value_msg:
                     if first:
@@ -470,8 +488,8 @@
                 raise MirrorObjectError(
                     "unsupported arg_msg type %s for list" % arg_msg.type)
         else:
-            raise MirrorObjectError(
-                "unsupported value type %s" % type(value_msg))
+            raise MirrorObjectError("unsupported value type %s" %
+                                    type(value_msg))
 
     # TODO: Guard against calls to this function after self.CleanUp is called.
     def __getattr__(self, api_name, *args, **kwargs):
@@ -482,6 +500,7 @@
             *args: a list of arguments
             **kwargs: a dict for the arg name and value pairs
         """
+
         def RemoteCall(*args, **kwargs):
             """Dynamically calls a remote API and returns the result value."""
             func_msg = self.GetApi(api_name)
@@ -502,44 +521,48 @@
                 # TODO: use kwargs
                 for arg in func_msg.arg:
                     # TODO: handle other
-                    if (arg.type == CompSpecMsg.TYPE_SCALAR
-                        and arg.scalar_type == "pointer"):
+                    if (arg.type == CompSpecMsg.TYPE_SCALAR and
+                            arg.scalar_type == "pointer"):
                         arg.scalar_value.pointer = 0
                 logging.debug(func_msg)
 
             if self._parent_path:
                 func_msg.parent_path = self._parent_path
 
-            if self._interface_id is not None:
-                func_msg.hidl_interface_id = self._interface_id
-
-            if isinstance(self._if_spec_msg, CompSpecMsg.ComponentSpecificationMessage):
+            call_msg = CompSpecMsg.FunctionCallMessage()
+            if isinstance(self._if_spec_msg,
+                          CompSpecMsg.ComponentSpecificationMessage):
                 if self._if_spec_msg.component_class:
                     logging.info("component_class %s",
                                  self._if_spec_msg.component_class)
+                    call_msg.component_class = self._if_spec_msg.component_class
                     if self._if_spec_msg.component_class == CompSpecMsg.HAL_CONVENTIONAL_SUBMODULE:
                         submodule_name = self._if_spec_msg.original_data_structure_name
                         if submodule_name.endswith("*"):
                             submodule_name = submodule_name[:-1]
                         func_msg.submodule_name = submodule_name
-            result = self._client.CallApi(text_format.MessageToString(func_msg),
-                                          self.__caller_uid)
+            if self._hal_driver_id is not None:
+                call_msg.hal_driver_id = self._hal_driver_id
+            call_msg.api.CopyFrom(func_msg)
+            result = self._client.CallApi(
+                text_format.MessageToString(call_msg), self.__caller_uid)
             logging.debug(result)
             if (isinstance(result, tuple) and len(result) == 2 and
-                isinstance(result[1], dict) and "coverage" in result[1]):
+                    isinstance(result[1], dict) and "coverage" in result[1]):
                 self._last_raw_code_coverage_data = result[1]["coverage"]
                 result = result[0]
 
-            if (result and isinstance(result, CompSpecMsg.VariableSpecificationMessage)
-                and result.type == CompSpecMsg.TYPE_HIDL_INTERFACE):
+            if (result and isinstance(
+                    result, CompSpecMsg.VariableSpecificationMessage) and
+                    result.type == CompSpecMsg.TYPE_HIDL_INTERFACE):
                 if result.hidl_interface_id <= -1:
                     return None
-                nested_interface_id = result.hidl_interface_id
+                hal_driver_id = result.hidl_interface_id
                 nested_interface_name = result.predefined_type.split("::")[-1]
                 logging.debug("Nested interface name: %s",
                               nested_interface_name)
                 nested_interface = self.GetHidlNestedInterface(
-                    nested_interface_name, nested_interface_id)
+                    nested_interface_name, hal_driver_id)
                 return nested_interface
             return result
 
@@ -552,12 +575,12 @@
             logging.debug("MESSAGE %s", api_name)
             if arg_msg.type == CompSpecMsg.TYPE_STRUCT:
                 for struct_value in arg_msg.struct_value:
-                    logging.debug("for %s %s",
-                                  struct_value.name, struct_value.scalar_type)
+                    logging.debug("matching struct %s %s", struct_value.name,
+                                  struct_value.scalar_type)
                     for given_name, given_value in kwargs.iteritems():
-                        logging.debug("check %s %s", struct_value.name, given_name)
                         if given_name == struct_value.name:
-                            logging.debug("match type=%s", struct_value.scalar_type)
+                            logging.debug("matched type=%s",
+                                          struct_value.scalar_type)
                             if struct_value.type == CompSpecMsg.TYPE_SCALAR:
                                 if struct_value.scalar_type == "uint32_t":
                                     struct_value.scalar_value.uint32_t = given_value
@@ -565,32 +588,40 @@
                                     struct_value.scalar_value.int32_t = given_value
                                 else:
                                     raise MirrorObjectError(
-                                        "support %s" % struct_value.scalar_type)
-                            continue
-            elif arg_msg.type == CompSpecMsg.TYPE_FUNCTION_POINTER:
-                for fp_value in arg_msg.function_pointer:
-                    logging.debug("for %s", fp_value.function_name)
-                    for given_name, given_value in kwargs.iteritems():
-                          logging.debug("check %s %s", fp_value.function_name, given_name)
-                          if given_name == fp_value.function_name:
-                              fp_value.id = self.GetFunctionPointerID(given_value)
-                              break
+                                        "support %s" %
+                                        struct_value.scalar_type)
+                            break
 
-            if arg_msg.type == CompSpecMsg.TYPE_STRUCT:
-                for struct_value, given_value in zip(arg_msg.struct_value, args):
-                    logging.debug("arg match type=%s", struct_value.scalar_type)
+                for struct_value, given_value in zip(arg_msg.struct_value,
+                                                     args):
                     if struct_value.type == CompSpecMsg.TYPE_SCALAR:
+                        logging.debug("matched arg type=%s",
+                                      struct_value.scalar_type)
                         if struct_value.scalar_type == "uint32_t":
                             struct_value.scalar_value.uint32_t = given_value
                         elif struct_value.scalar_type == "int32_t":
                             struct_value.scalar_value.int32_t = given_value
                         else:
                             raise MirrorObjectError("support %s" % p_type)
+
             elif arg_msg.type == CompSpecMsg.TYPE_FUNCTION_POINTER:
-                for fp_value, given_value in zip(arg_msg.function_pointer, args):
+                for fp_value in arg_msg.function_pointer:
+                    logging.debug("matching function %s",
+                                  fp_value.function_name)
+                    for given_name, given_value in kwargs.iteritems():
+                        if given_name == fp_value.function_name:
+                            logging.debug("matched function %s %s",
+                                          fp_value.function_name, given_name)
+                            fp_value.id = self.GetFunctionPointerID(
+                                given_value)
+                            break
+
+                for fp_value, given_value in zip(arg_msg.function_pointer,
+                                                 args):
                     logging.debug("for %s", fp_value.function_name)
                     fp_value.id = self.GetFunctionPointerID(given_value)
                     logging.debug("fp %s", fp_value)
+
             logging.debug("generated %s", arg_msg)
             return arg_msg
 
@@ -605,7 +636,8 @@
                 for struct_value in arg_msg.struct_value:
                     if count == index:
                         if struct_value.scalar_type == "uint32_t":
-                            struct_value.scalar_value.uint32_t ^= FuzzerUtils.mask_uint32_t()
+                            struct_value.scalar_value.uint32_t ^= FuzzerUtils.mask_uint32_t(
+                            )
                         elif struct_value.scalar_type == "int32_t":
                             mask = FuzzerUtils.mask_int32_t()
                             if mask == (1 << 31):
@@ -614,14 +646,14 @@
                             else:
                                 struct_value.scalar_value.int32_t ^= mask
                         else:
-                            raise MirrorObjectError(
-                                "support %s" % struct_value.scalar_type)
+                            raise MirrorObjectError("support %s" %
+                                                    struct_value.scalar_type)
                         break
                     count += 1
                 logging.debug("fuzzed %s", arg_msg)
             else:
-                raise MirrorObjectError(
-                    "unsupported fuzz message type %s." % arg_msg.type)
+                raise MirrorObjectError("unsupported fuzz message type %s." %
+                                        arg_msg.type)
             return arg_msg
 
         def ConstGenerator():
@@ -631,11 +663,11 @@
                 raise MirrorObjectError("const %s unknown" % arg_msg)
             logging.debug("check %s", api_name)
             if arg_msg.type == CompSpecMsg.TYPE_SCALAR:
-                ret_v = getattr(arg_msg.scalar_value, arg_msg.scalar_type, None)
+                ret_v = getattr(arg_msg.scalar_value, arg_msg.scalar_type,
+                                None)
                 if ret_v is None:
-                    raise MirrorObjectError(
-                        "No value found for type %s in %s." %
-                        (arg_msg.scalar_type, api_name))
+                    raise MirrorObjectError("No value found for type %s in %s."
+                                            % (arg_msg.scalar_type, api_name))
                 return ret_v
             elif arg_msg.type == CompSpecMsg.TYPE_STRING:
                 return arg_msg.string_value.message
@@ -644,8 +676,8 @@
                         arg_msg.enum_value.enumerator,
                         arg_msg.enum_value.scalar_value):
                     if enumerator == api_name:
-                      return getattr(scalar_value,
-                                     arg_msg.enum_value.scalar_type)
+                        return getattr(scalar_value,
+                                       arg_msg.enum_value.scalar_type)
             raise MirrorObjectError("const %s not found" % api_name)
 
         # handle APIs.
@@ -661,9 +693,11 @@
                 parent_name = "%s.%s" % (self._parent_path, api_name)
             else:
                 parent_name = api_name
-            return MirrorObject(self._client, struct_msg,
-                                self._callback_server,
-                                parent_path=parent_name)
+            return MirrorObject(
+                self._client,
+                struct_msg,
+                self._callback_server,
+                parent_path=parent_name)
 
         # handle attributes.
         fuzz = False
diff --git a/utils/python/mirror/shell_mirror.py b/utils/python/mirror/shell_mirror.py
index ffd98b2..75f3da6 100644
--- a/utils/python/mirror/shell_mirror.py
+++ b/utils/python/mirror/shell_mirror.py
@@ -32,11 +32,13 @@
         _host_command_port: int, the host-side port for command-response
                             sessions.
         _shell_mirrors: dict, key is instance name, value is mirror object.
+        enabled: bool, whether remote shell feature is enabled for the device.
     """
 
     def __init__(self, host_command_port):
         self._shell_mirrors = {}
         self._host_command_port = host_command_port
+        self.enabled = True
 
     def __del__(self):
         for instance_name in self._shell_mirrors:
@@ -66,7 +68,8 @@
         if not instance_name:
             raise error.ComponentLoadingError("instance_name is None")
         if bits not in [32, 64]:
-            raise error.ComponentLoadingError("Invalid value for bits: %s" % bits)
+            raise error.ComponentLoadingError(
+                "Invalid value for bits: %s" % bits)
 
         client = vts_tcp_client.VtsTcpClient()
         client.Connect(command_port=self._host_command_port)
@@ -85,7 +88,25 @@
         self._shell_mirrors[instance_name] = mirror_object
 
     def __getattr__(self, name):
-        return self._shell_mirrors[name]
+        """Get shell sessions through attribute.
+
+        When a session is retrieved here, the 'enabled' flag of the shell mirror
+        object is checked and synchronized with shell mirror.
+
+        Args:
+            name: string, session name
+
+        Returns:
+            ShellMirrorObject, a remote shell session.
+
+        Raises:
+            KeyError when attribute does not exist.
+        """
+        res = self._shell_mirrors[name]
+
+        if res.enabled != self.enabled:
+            res.enabled = self.enabled
+        return res
 
     @property
     def default(self):
@@ -95,6 +116,6 @@
             self.InvokeTerminal(name)
         return getattr(self, name)
 
-    def Execute(self, command):
+    def Execute(self, command, no_except=False):
         """Execute a shell command with default shell terminal"""
-        return self.default.Execute(command)
+        return self.default.Execute(command, no_except)
diff --git a/utils/python/mirror/shell_mirror_object.py b/utils/python/mirror/shell_mirror_object.py
index bcbf398..0d7f895 100644
--- a/utils/python/mirror/shell_mirror_object.py
+++ b/utils/python/mirror/shell_mirror_object.py
@@ -14,20 +14,42 @@
 # limitations under the License.
 #
 
+from vts.runners.host import const
+
 
 class ShellMirrorObject(object):
-    """The class that mirrors a shell on the native side.
+    '''The class that mirrors a shell on the native side.
 
     Attributes:
         _client: the TCP client instance.
-    """
+        enabled: bool, whether RPC shell feature is enabled for the device.
+    '''
 
     def __init__(self, client):
         self._client = client
+        self.enabled = True
 
-    def Execute(self, command):
-        result = self._client.ExecuteShellCommand(command)
-        return result
+    def Execute(self, command, no_except=False):
+        '''Execute remote shell commands on device.
+
+        Args:
+            command: string or a list of string, shell commands to execute on
+                     device.
+            no_except: bool, if set to True, no exception will be thrown and
+                       error code will be -1 with error message on stderr.
+
+        Returns:
+            A dictionary containing shell command execution results
+        '''
+        if not self.enabled:
+            # TODO(yuexima): use adb shell instead when RPC is disabled
+            return {
+                const.STDOUT: [""] * len(command),
+                const.STDERR:
+                ["VTS remote shell has been disabled."] * len(command),
+                const.EXIT_CODE: [-2] * len(command)
+            }
+        return self._client.ExecuteShellCommand(command, no_except)
 
     def CleanUp(self):
         self._client.Disconnect()
diff --git a/utils/python/performance/benchmark_parser.py b/utils/python/performance/benchmark_parser.py
index 1803a5e..e837838 100644
--- a/utils/python/performance/benchmark_parser.py
+++ b/utils/python/performance/benchmark_parser.py
@@ -47,7 +47,9 @@
 
     _BENCHMARKS = "benchmarks"
     _NAME = "name"
+    _ITERATIONS = "iterations"
     _REAL_TIME = "real_time"
+    _CPU_TIME = "cpu_time"
 
     def __init__(self, json_string):
         """Converts the JSON string to internal data structure.
@@ -58,7 +60,7 @@
         json_obj = json.loads(json_string)
         self._benchmarks = json_obj[self._BENCHMARKS]
 
-    def getArguments(self):
+    def GetArguments(self):
         """Returns the "name" properties with function names stripped.
 
         Returns:
@@ -70,10 +72,23 @@
             args.append(name[1].encode("utf-8") if len(name) >= 2 else "")
         return args
 
-    def getRealTime(self):
+    def GetRealTime(self):
         """Returns the "real_time" properties.
 
         Returns:
             A list of integers.
         """
         return [x[self._REAL_TIME] for x in self._benchmarks]
+
+    def ToTable(self):
+        """Returns the benchmarks in a table.
+
+        Returns:
+            A 2-dimensional list. The first row contains the column names. The
+            following rows are the benchmarks.
+        """
+        table = [[self._NAME, self._REAL_TIME, self._CPU_TIME,
+                  self._ITERATIONS]]
+        for record in self._benchmarks:
+            table.append([record[x] for x in table[0]])
+        return table
diff --git a/utils/python/reporting/log_uploading_utils.py b/utils/python/reporting/log_uploading_utils.py
index 1c5c794..934bc9f 100644
--- a/utils/python/reporting/log_uploading_utils.py
+++ b/utils/python/reporting/log_uploading_utils.py
@@ -44,7 +44,7 @@
     ]
 
     def __init__(self, user_params, web=None):
-        """Initializes the systrace feature.
+        """Initializes the log uploading feature.
 
         Args:
             user_params: A dictionary from parameter name (String) to parameter value.
@@ -80,8 +80,14 @@
             self, keys.ConfigKeys.KEY_TESTBED_NAME, ''),
                                        self.web.report_msg.start_timestamp)
 
+        def path_filter(path):
+            '''filter to exclude proto files in log uploading'''
+            return not path.endswith('_proto.msg')
+
         urls = self._report_file_util.SaveReportsFromDirectory(
-            source_dir=logging.log_path, file_name_prefix=file_name_prefix)
+            source_dir=logging.log_path,
+            file_name_prefix=file_name_prefix,
+            file_path_filters=path_filter)
 
         if urls is None:
             logging.error('Error happened when saving logs.')
diff --git a/utils/python/reporting/report_file_utils.py b/utils/python/reporting/report_file_utils.py
index b42851f..437fa8a 100644
--- a/utils/python/reporting/report_file_utils.py
+++ b/utils/python/reporting/report_file_utils.py
@@ -19,10 +19,12 @@
 import os
 import shutil
 
+
 def NotNoneStr(item):
     '''Convert a veriable to string only if it is not None'''
     return str(item) if item is not None else None
 
+
 class ReportFileUtil(object):
     '''Utility class for report file saving.
 
@@ -151,7 +153,10 @@
         except IOError as e:
             logging.exception(e)
 
-    def SaveReportsFromDirectory(self, source_dir=None, file_name_prefix=None):
+    def SaveReportsFromDirectory(self,
+                                 source_dir=None,
+                                 file_name_prefix=None,
+                                 file_path_filters=None):
         '''Save report files from source directory to destination.
 
         Args:
@@ -159,6 +164,8 @@
                         if None, class attribute source_dir will be used.
                         Default is None.
             file_name_prefix: string, prefix added to destination file name
+            file_path_filter: function, a functions that return True (pass) or
+                              False (reject) given original file path.
 
         Returns:
             A list of string, containing destination URLs of saved report files.
@@ -183,6 +190,9 @@
                         root_dir=source_dir,
                         file_name_prefix=file_name_prefix)
 
+                    if file_path_filters and not file_path_filters(src_path):
+                        continue
+
                     #TODO(yuexima): handle duplicated destination file names
                     self._PushReportFile(src_path, dest_path)
                     urls.append(url)
diff --git a/utils/python/web/dashboard_rest_client.py b/utils/python/web/dashboard_rest_client.py
index 8f2be9d..617a4af 100644
--- a/utils/python/web/dashboard_rest_client.py
+++ b/utils/python/web/dashboard_rest_client.py
@@ -71,10 +71,8 @@
         """
         return str(self.auth_token.get_access_token().access_token)
 
-    def PostData(self, post_message):
-        """Post data to the dashboard database.
-
-        Puts data into the dashboard database using its proto REST endpoint.
+    def AddAuthToken(self, post_message):
+        """Add OAuth2 token to the dashboard message.
 
         Args:
             post_message: DashboardPostMessage, The data to post.
@@ -87,6 +85,18 @@
             return False
 
         post_message.access_token = token
+
+    def PostData(self, post_message):
+        """Post data to the dashboard database.
+
+        Puts data into the dashboard database using its proto REST endpoint.
+
+        Args:
+            post_message: DashboardPostMessage, The data to post.
+
+        Returns:
+            True if successful, False otherwise
+        """
         post_bytes = base64.b64encode(post_message.SerializeToString())
 
         with tempfile.NamedTemporaryFile(delete=False) as file:
diff --git a/utils/python/web/web_utils.py b/utils/python/web/web_utils.py
index 654da25..43f2433 100644
--- a/utils/python/web/web_utils.py
+++ b/utils/python/web/web_utils.py
@@ -14,6 +14,7 @@
 # limitations under the License.
 #
 
+import base64
 import getpass
 import logging
 import os
@@ -42,10 +43,8 @@
     _REQUIRED_PARAMS = [
         keys.ConfigKeys.IKEY_DASHBOARD_POST_COMMAND,
         keys.ConfigKeys.IKEY_SERVICE_JSON_PATH,
-        keys.ConfigKeys.KEY_TESTBED_NAME,
-        keys.ConfigKeys.IKEY_BUILD,
-        keys.ConfigKeys.IKEY_ANDROID_DEVICE,
-        keys.ConfigKeys.IKEY_ABI_NAME,
+        keys.ConfigKeys.KEY_TESTBED_NAME, keys.ConfigKeys.IKEY_BUILD,
+        keys.ConfigKeys.IKEY_ANDROID_DEVICE, keys.ConfigKeys.IKEY_ABI_NAME,
         keys.ConfigKeys.IKEY_ABI_BITNESS
     ]
     _OPTIONAL_PARAMS = []
@@ -68,7 +67,8 @@
 
         # Initialize the dashboard client
         post_cmd = getattr(self, keys.ConfigKeys.IKEY_DASHBOARD_POST_COMMAND)
-        service_json_path = str(getattr(self, keys.ConfigKeys.IKEY_SERVICE_JSON_PATH))
+        service_json_path = str(
+            getattr(self, keys.ConfigKeys.IKEY_SERVICE_JSON_PATH))
         self.rest_client = dashboard_rest_client.DashboardRestClient(
             post_cmd, service_json_path)
         if not self.rest_client.Initialize():
@@ -369,17 +369,21 @@
         """
         return self.report_msg.test, self.report_msg.start_timestamp
 
-    def Upload(self, requested, executed):
+    def GenerateReportMessage(self, requested, executed):
         """Uploads the result to the web service.
 
         Requires the feature to be enabled; no-op otherwise.
 
         Args:
-            requested: list, A list of test case names requested to run
-            executed: list, A list of test case names that were executed
+            requested: list, A list of test case records requested to run
+            executed: list, A list of test case records that were executed
+
+        Returns:
+            binary string, serialized report message.
+            None if web is not enabled.
         """
         if not self.enabled:
-            return
+            return None
 
         # Handle case when runner fails, tests aren't executed
         if (executed and executed[-1].test_name == "setup_class"):
@@ -391,7 +395,7 @@
 
         for test in requested[start_index:]:
             msg = self.report_msg.test_case.add()
-            msg.name = test
+            msg.name = test.test_name
             msg.start_timestamp = feature_utils.GetTimestamp()
             msg.end_timestamp = msg.start_timestamp
             msg.test_result = ReportMsg.TEST_CASE_RESULT_FAIL
@@ -406,14 +410,21 @@
         logging.info("_tearDownClass hook: start (username: %s)",
                      getpass.getuser())
 
-        if len(self.report_msg.test_case) > 0:
-            post_msg = ReportMsg.DashboardPostMessage()
-            post_msg.test_report.extend([self.report_msg])
-
-            # Post new data to the dashboard
-            self.rest_client.PostData(post_msg)
-
-            logging.info("_tearDownClass hook: status upload time stamp %s",
-                         str(self.report_msg.start_timestamp))
-        else:
+        if len(self.report_msg.test_case) == 0:
             logging.info("_tearDownClass hook: skip uploading (no test case)")
+            return ''
+
+        post_msg = ReportMsg.DashboardPostMessage()
+        post_msg.test_report.extend([self.report_msg])
+
+        self.rest_client.AddAuthToken(post_msg)
+
+        message_b = base64.b64encode(post_msg.SerializeToString())
+
+        logging.info('Result proto message generated. size: %s',
+                     len(message_b))
+
+        logging.info("_tearDownClass hook: status upload time stamp %s",
+                     str(self.report_msg.start_timestamp))
+
+        return message_b
diff --git a/web/.gitignore b/web/.gitignore
deleted file mode 100644
index 1ff0378..0000000
--- a/web/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.metadata
diff --git a/web/dashboard/.gitignore b/web/dashboard/.gitignore
deleted file mode 100644
index 76b065e..0000000
--- a/web/dashboard/.gitignore
+++ /dev/null
@@ -1,45 +0,0 @@
-# Google App Engine generated folder
-appengine-generated/
-
-# Java
-*.class
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.ear
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-
-# maven
-target/
-pom.xml.tag
-pom.xml.releaseBackup
-pom.xml.versionsBackup
-pom.xml.next
-release.properties
-dependency-reduced-pom.xml
-buildNumber.properties
-
-service-account.json
-
-# intellij
-.idea/
-*.iml
-
-# Eclipse files
-.project
-.classpath
-.settings
-
-# vim
-[._]*.s[a-w][a-z]
-[._]s[a-w][a-z]
-Session.vim
-.netrwhist
-*~
-tags
diff --git a/web/dashboard/README.md b/web/dashboard/README.md
deleted file mode 100644
index d95eada..0000000
--- a/web/dashboard/README.md
+++ /dev/null
@@ -1,151 +0,0 @@
-# VTS Dashboard
-
-## Introduction
-
-The VTS Dashboard displays the summarized results of the Multi Device Tests along with graphs.
-
-## Installation
-
-### Steps to run locally:
-
-1. Google App Engine uses Java 8. Install Java 8 before running running locally:
-   'sudo apt install openjdk-8-jdk'
-
-   To use java 8:
-   Copy the following lines in ~/.bashrc :
-
-```
-    function setup_jdk() {
-      # Remove the current JDK from PATH
-      if [ -n "$JAVA_HOME" ] ; then
-        PATH=${PATH/$JAVA_HOME\/bin:/}
-      fi
-      export JAVA_HOME=$1
-      export PATH=$JAVA_HOME/bin:$PATH
-    }
-
-    function use_java8() {
-    #  setup_jdk /usr/java/jre1.8.0_73
-      setup_jdk /usr/lib/jvm/java-8-openjdk-amd64
-    }
-
-    Then from cmd:
-    $ use_java8
-```
-
-2. Maven is used for build. Install Maven 3.3.9:
-   Download maven from:
-   https://maven.apache.org/download.cgi
-
-   Steps to Install Maven:
-   1) Unzip the Binary tar:
-      tar -zxf apache-maven-3.3.3-bin.tar.gz
-
-   2) Move the application directory to /usr/local
-      sudo cp -R apache-maven-3.3.3 /usr/local
-
-   3) Make a soft link in /usr/bin for universal access of mvn
-      sudo ln -s /usr/local/apache-maven-3.3.3/bin/mvn /usr/bin/mvn
-
-   4) Verify maven installation:
-      $ mvn -v
-
-      The output should resemble this:
-
-      Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T08:41:47-08:00)
-      Maven home: /opt/apache-maven-3.3.9
-      Java version: 1.8.0_45-internal, vendor: Oracle Corporation
-      Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
-      Default locale: en_US, platform encoding: UTF-8
-      OS name: "linux", version: "3.13.0-88-generic", arch: "amd64", family: "unix"
-
-3. Install Google Cloud SDK. Follow the instructions listed on official source:
-   https://cloud.google.com/sdk/docs/quickstart-linux
-
-   The default location where the application searches for a google-cloud-sdk is:
-   /usr/local/share/google/google-cloud-sdk
-
-   Therefore move the extracted folder to this location: /usr/local/share/google/
-
-   Otherwise, to have a custom location, specify the location of
-   google-cloud-sdk in /vts/web/dashboard/appengine/servlet/pom.xml by putting the configuration:
-
-```
-   <configuration>
-     <gcloud_directory>PATH/TO/GCLOUD_DIRECTORY</gcloud_directory>
-   </configuration>
-```
-   within the 'com.google.appengine' plugin tag :
-
-## To run GAE on local machine:
-
-$ cd web/dashboard/appengine/servlet
-$ mvn clean gcloud:run
-
-## To deploy to Google App Engine
-
-$ cd web/dashboard/appengine/servlet
-$ mvn clean gcloud:deploy
-
-visit https://<YOUR-PROJECT-NAME>.appspot.com
-
-## Monitoring
-
-The following steps list how to create a monitoring service for the VTS Dashboard.
-
-### Create a Stackdriver account
-
-1. Go to Google Cloud Platform Console:
-   http://console.developers.google.com
-
-2. In the Google Cloud Platform Console, select Stackdriver > Monitoring.
-   If your project is not in a Stackdriver account you'll see a message to
-   create a new project.
-
-3. Click Create new Stackdriver account and then Continue.
-
-4. With your project shown, click Create account.
-
-5. In the page, "Add Google Cloud Platform projects to monitor", click Continue to skip ahead.
-
-6. In the page, "Monitor AWS accounts", click Done to skip ahead.
-
-7. In a few seconds you see the following message:
-   "Finished Initial collection"
-   Click Launch Monitoring.
-
-8. In the page, "Get reports by email", click No reports and Continue.
-
-9. You will see your Stackdriver account dashboard.
-   Close the "Welcome to Stackdriver" banner if you don't need it.
-
-### Steps to create an uptime check and an alerting policy
-
-1. Go to Stack Monitoring console:
-   https://app.google.stackdriver.com/
-
-2. Go to Alerting > Uptime Checks in the top menu and then click Add Uptime Check.
-   You see the New Uptime Check panel.
-
-3. Fill in the following fields for the uptime check:
-
-    Check type: HTTP
-    Resource Type: Instance
-    Applies To: Single, lamp-1-vm
-    Leave the other fields with their default values.
-
-4. Click Test to verify your uptime check is working.
-
-5. Click Save. After you click on save you'll see a panel to
-   'Create Alerting Policy'
-
-6. Fill out the configuration for notifications and click save policy.
-
-### Test the check and alert
-
-This procedure can take up to fifteen minutes.
-
-To test the check and alert, go to the VM Instances page, select your instance, and click Stop from the top menu.
-You'll have to wait up to five minutes for the next uptime check to fail. The alert and notification don't happen until the next failure occurs.
-
-To correct the "problem," return to the VM Instances page, select your instance, and click Start from the top menu.
diff --git a/web/dashboard/pom.xml b/web/dashboard/pom.xml
deleted file mode 100644
index d5bc0ff..0000000
--- a/web/dashboard/pom.xml
+++ /dev/null
@@ -1,187 +0,0 @@
-<!--
-  Copyright 2016 Google Inc.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <packaging>war</packaging>
-  <version>1.0-SNAPSHOT</version>
-  <groupId>com.android.vts</groupId>
-  <artifactId>vts-dashboard</artifactId>
-
-  <properties>
-    <appengine.clientID></appengine.clientID>
-    <appengine.serviceClientID></appengine.serviceClientID>
-    <appengine.senderEmail></appengine.senderEmail>
-    <appengine.emailDomain></appengine.emailDomain>
-    <appengine.defaultEmail></appengine.defaultEmail>
-    <gerrit.uri></gerrit.uri>
-    <gerrit.scope></gerrit.scope>
-    <analytics.id></analytics.id>
-
-    <maven.compiler.target>1.7</maven.compiler.target>
-    <maven.compiler.source>1.7</maven.compiler.source>
-    <maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
-
-    <failOnMissingWebXml>false</failOnMissingWebXml>
-  </properties>
-
-
-  <dependencies>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <version>2.5</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>jsp-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-      <version>2.6</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-math3</artifactId>
-      <version>3.6.1</version>
-    </dependency>
-
-    <dependency>
-        <groupId>commons-codec</groupId>
-        <artifactId>commons-codec</artifactId>
-        <version>1.9</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.cloud</groupId>
-      <artifactId>google-cloud</artifactId>
-      <version>0.8.0</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.code.gson</groupId>
-      <artifactId>gson</artifactId>
-      <version>2.7</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <version>2.8.6</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.api-client</groupId>
-      <artifactId>google-api-client</artifactId>
-      <version>1.22.0</version>
-      <exclusions>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava-jdk5</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.appengine</groupId>
-      <artifactId>appengine-api-1.0-sdk</artifactId>
-      <version>1.9.50</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.apis</groupId>
-      <artifactId>google-api-services-oauth2</artifactId>
-      <version>v1-rev131-1.22.0</version>
-    </dependency>
-
-    <!-- Test Dependencies -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.12</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.appengine</groupId>
-      <artifactId>appengine-testing</artifactId>
-      <version>1.9.50</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-        <groupId>com.google.appengine</groupId>
-        <artifactId>appengine-api-stubs</artifactId>
-        <version>1.9.50</version>
-        <scope>test</scope>
-    </dependency>
-    <dependency>
-        <groupId>com.google.appengine</groupId>
-        <artifactId>appengine-tools-sdk</artifactId>
-        <version>1.9.50</version>
-        <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-
-
-  <build>
-    <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-war-plugin</artifactId>
-        <version>2.6</version>
-        <configuration>
-          <archiveClasses>true</archiveClasses>
-          <failOnMissingWebXml>false</failOnMissingWebXml>
-          <webResources>
-            <resource>
-              <directory>${basedir}/src/main/webapp/WEB-INF</directory>
-              <filtering>true</filtering>
-              <targetPath>WEB-INF</targetPath>
-            </resource>
-          </webResources>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <version>3.3</version>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.7</source>
-          <target>1.7</target>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>com.google.appengine</groupId>
-        <artifactId>appengine-maven-plugin</artifactId>
-        <version>1.9.51</version>
-      </plugin>
-
-    </plugins>
-  </build>
-</project>
diff --git a/web/dashboard/src/main/java/com/android/vts/api/BigtableLegacyJsonServlet.java b/web/dashboard/src/main/java/com/android/vts/api/BigtableLegacyJsonServlet.java
deleted file mode 100644
index d2b4a61..0000000
--- a/web/dashboard/src/main/java/com/android/vts/api/BigtableLegacyJsonServlet.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.proto.VtsReportMessage.TestReportMessage;
-import com.android.vts.util.DatastoreHelper;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson.JacksonFactory;
-import com.google.api.services.oauth2.Oauth2;
-import com.google.api.services.oauth2.model.Tokeninfo;
-import com.google.protobuf.InvalidProtocolBufferException;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.codec.binary.Base64;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/** REST endpoint for posting data JSON to the Dashboard. */
-@Deprecated
-public class BigtableLegacyJsonServlet extends HttpServlet {
-    private static final String SERVICE_CLIENT_ID = System.getProperty("SERVICE_CLIENT_ID");
-    private static final String SERVICE_NAME = "VTS Dashboard";
-    private static final Logger logger =
-            Logger.getLogger(BigtableLegacyJsonServlet.class.getName());
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        // Retrieve the params
-        String payload = new String();
-        JSONObject payloadJson;
-        try {
-            String line = null;
-            BufferedReader reader = request.getReader();
-            while ((line = reader.readLine()) != null) {
-                payload += line;
-            }
-            payloadJson = new JSONObject(payload);
-        } catch (IOException | JSONException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            logger.log(Level.WARNING, "Invalid JSON: " + payload);
-            return;
-        }
-
-        // Verify service account access token.
-        boolean authorized = false;
-        if (payloadJson.has("accessToken")) {
-            String accessToken = payloadJson.getString("accessToken").trim();
-            GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
-            Oauth2 oauth2 =
-                    new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
-                            .setApplicationName(SERVICE_NAME)
-                            .build();
-            Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute();
-            if (tokenInfo.getIssuedTo().equals(SERVICE_CLIENT_ID)) {
-                authorized = true;
-            }
-        }
-
-        if (!authorized) {
-            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-            return;
-        }
-
-        // Parse the desired action and execute the command
-        try {
-            if (payloadJson.has("verb")) {
-                switch (payloadJson.getString("verb")) {
-                    case "createTable":
-                        logger.log(Level.INFO, "Deprecated verb: createTable.");
-                        break;
-                    case "insertRow":
-                        insertData(payloadJson);
-                        break;
-                    default:
-                        logger.log(Level.WARNING,
-                                "Invalid Datastore REST verb: " + payloadJson.getString("verb"));
-                        throw new IOException("Unsupported POST verb.");
-                }
-            }
-        } catch (IOException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-
-    /**
-     * Inserts a data into the Cloud Datastore
-     *
-     * @param payloadJson The JSON object representing the row to be inserted. Of the form: {
-     *     (deprecated) 'tableName' : 'table', (deprecated) 'rowKey' : 'row', (deprecated) 'family'
-     * :
-     *     'family', (deprecated) 'qualifier' : 'qualifier', 'value' : 'value' }
-     * @throws IOException
-     */
-    private void insertData(JSONObject payloadJson) throws IOException {
-        if (!payloadJson.has("value")) {
-            logger.log(Level.WARNING, "Missing attributes for datastore api insertRow().");
-            return;
-        }
-        try {
-            byte[] value = Base64.decodeBase64(payloadJson.getString("value"));
-            TestReportMessage testReportMessage = TestReportMessage.parseFrom(value);
-            DatastoreHelper.insertTestReport(testReportMessage);
-        } catch (InvalidProtocolBufferException e) {
-            logger.log(Level.WARNING, "Invalid report posted to dashboard.");
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/api/DatastoreRestServlet.java b/web/dashboard/src/main/java/com/android/vts/api/DatastoreRestServlet.java
deleted file mode 100644
index 761c292..0000000
--- a/web/dashboard/src/main/java/com/android/vts/api/DatastoreRestServlet.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.proto.VtsReportMessage.DashboardPostMessage;
-import com.android.vts.proto.VtsReportMessage.TestPlanReportMessage;
-import com.android.vts.proto.VtsReportMessage.TestReportMessage;
-import com.android.vts.util.DatastoreHelper;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson.JacksonFactory;
-import com.google.api.services.oauth2.Oauth2;
-import com.google.api.services.oauth2.model.Tokeninfo;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.codec.binary.Base64;
-
-/** REST endpoint for posting data to the Dashboard. */
-public class DatastoreRestServlet extends HttpServlet {
-    private static final String SERVICE_CLIENT_ID = System.getProperty("SERVICE_CLIENT_ID");
-    private static final String SERVICE_NAME = "VTS Dashboard";
-    private static final Logger logger = Logger.getLogger(DatastoreRestServlet.class.getName());
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        // Retrieve the params
-        String payload = new String();
-        DashboardPostMessage postMessage;
-        try {
-            String line = null;
-            BufferedReader reader = request.getReader();
-            while ((line = reader.readLine()) != null) {
-                payload += line;
-            }
-            byte[] value = Base64.decodeBase64(payload);
-            postMessage = DashboardPostMessage.parseFrom(value);
-        } catch (IOException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            logger.log(Level.WARNING, "Invalid proto: " + payload);
-            return;
-        }
-
-        // Verify service account access token.
-        boolean authorized = false;
-        if (postMessage.hasAccessToken()) {
-            String accessToken = postMessage.getAccessToken();
-            GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
-            Oauth2 oauth2 =
-                    new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
-                            .setApplicationName(SERVICE_NAME)
-                            .build();
-            Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute();
-            if (tokenInfo.getIssuedTo().equals(SERVICE_CLIENT_ID)) {
-                authorized = true;
-            }
-        }
-
-        if (!authorized) {
-            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-            return;
-        }
-
-        for (TestReportMessage testReportMessage : postMessage.getTestReportList()) {
-            DatastoreHelper.insertTestReport(testReportMessage);
-        }
-
-        for (TestPlanReportMessage planReportMessage : postMessage.getTestPlanReportList()) {
-            DatastoreHelper.insertTestPlanReport(planReportMessage);
-        }
-
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/api/TestRunRestServlet.java b/web/dashboard/src/main/java/com/android/vts/api/TestRunRestServlet.java
deleted file mode 100644
index ac84a3b..0000000
--- a/web/dashboard/src/main/java/com/android/vts/api/TestRunRestServlet.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.util.TestRunDetails;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.gson.Gson;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to fetch test case results. */
-public class TestRunRestServlet extends HttpServlet {
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        String test = request.getParameter("test");
-        String timeString = request.getParameter("timestamp");
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        long timestamp;
-        try {
-            timestamp = Long.parseLong(timeString);
-            if (timestamp <= 0)
-                throw new NumberFormatException();
-            timestamp = timestamp > 0 ? timestamp : null;
-        } catch (NumberFormatException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, test);
-        Key testRunKey = KeyFactory.createKey(testKey, TestRunEntity.KIND, timestamp);
-        TestRunEntity testRunEntity;
-        try {
-            Entity testRun = datastore.get(testRunKey);
-            testRunEntity = TestRunEntity.fromEntity(testRun);
-            if (testRunEntity == null) {
-                throw new EntityNotFoundException(testRunKey);
-            }
-        } catch (EntityNotFoundException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        TestRunDetails details = new TestRunDetails();
-        List<Key> gets = new ArrayList<>();
-        for (long testCaseId : testRunEntity.testCaseIds) {
-            gets.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
-        }
-        Map<Key, Entity> entityMap = datastore.get(gets);
-        for (Key key : entityMap.keySet()) {
-            TestCaseRunEntity testCaseRun = TestCaseRunEntity.fromEntity(entityMap.get(key));
-            if (testCaseRun == null) {
-                continue;
-            }
-            details.addTestCase(testCaseRun);
-        }
-        response.setContentType("application/json");
-        PrintWriter writer = response.getWriter();
-        writer.print(new Gson().toJson(details.toJson()));
-        writer.flush();
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java b/web/dashboard/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java
deleted file mode 100644
index f863051..0000000
--- a/web/dashboard/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.UserFavoriteEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Transaction;
-import com.google.appengine.api.datastore.Query.CompositeFilterOperator;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserService;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to add or remove subscriptions. */
-public class UserFavoriteRestServlet extends HttpServlet {
-    protected static final Logger logger =
-            Logger.getLogger(UserFavoriteRestServlet.class.getName());
-
-    /**
-     * Add a test to the user's favorites.
-     */
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        UserService userService = UserServiceFactory.getUserService();
-        User currentUser = userService.getCurrentUser();
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        // Retrieve the added tests from the request.
-        String test = request.getPathInfo();
-        if (test == null) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        if (test.startsWith("/")) {
-            test = test.substring(1);
-        }
-        Key addedTestKey = KeyFactory.createKey(TestEntity.KIND, test);
-        // Filter the tests that exist from the set of tests to add
-        try {
-            datastore.get(addedTestKey);
-        } catch (EntityNotFoundException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-
-        Filter userFilter =
-                new FilterPredicate(UserFavoriteEntity.USER, FilterOperator.EQUAL, currentUser);
-        Filter testFilter = new FilterPredicate(
-                UserFavoriteEntity.TEST_KEY, FilterOperator.EQUAL, addedTestKey);
-        Query q = new Query(UserFavoriteEntity.KIND)
-                          .setFilter(CompositeFilterOperator.and(userFilter, testFilter))
-                          .setKeysOnly();
-
-        Key favoriteKey = null;
-
-        Transaction txn = datastore.beginTransaction();
-        try {
-            for (Entity e : datastore.prepare(q).asIterable()) {
-                favoriteKey = e.getKey();
-                break;
-            }
-            if (favoriteKey == null) {
-                UserFavoriteEntity favorite = new UserFavoriteEntity(currentUser, addedTestKey);
-                Entity entity = favorite.toEntity();
-                datastore.put(entity);
-                favoriteKey = entity.getKey();
-            }
-            txn.commit();
-        } finally {
-            if (txn.isActive()) {
-                logger.log(Level.WARNING,
-                        "Transaction rollback forced for favorite creation: " + test);
-                txn.rollback();
-            }
-        }
-
-        response.setContentType("application/json");
-        PrintWriter writer = response.getWriter();
-        JsonObject json = new JsonObject();
-        json.add("key", new JsonPrimitive(KeyFactory.keyToString(favoriteKey)));
-        writer.print(new Gson().toJson(json));
-        writer.flush();
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-
-    /**
-     * Remove a test from the user's favorites.
-     */
-    @Override
-    public void doDelete(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String stringKey = request.getPathInfo();
-        if (stringKey == null) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        if (stringKey.startsWith("/")) {
-            stringKey = stringKey.substring(1);
-        }
-        datastore.delete(KeyFactory.stringToKey(stringKey));
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/CoverageEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/CoverageEntity.java
deleted file mode 100644
index a0f8cca..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/CoverageEntity.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.proto.VtsReportMessage.CoverageReportMessage;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Object describing coverage data gathered for a file. */
-public class CoverageEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(CoverageEntity.class.getName());
-
-    public static final String KIND = "Coverage";
-
-    // Property keys
-    public static final String GROUP = "group";
-    public static final String COVERED_LINE_COUNT = "coveredCount";
-    public static final String TOTAL_LINE_COUNT = "totalCount";
-    public static final String FILE_PATH = "filePath";
-    public static final String PROJECT_NAME = "projectName";
-    public static final String PROJECT_VERSION = "projectVersion";
-    public static final String LINE_COVERAGE = "lineCoverage";
-
-    private final Key parentKey;
-
-    public final String group;
-    public final long coveredLineCount;
-    public final long totalLineCount;
-    public final String filePath;
-    public final String projectName;
-    public final String projectVersion;
-    public final List<Long> lineCoverage;
-
-    /**
-     * Create a CoverageEntity object for a file.
-     *
-     * @param parentKey The key to the parent TestRunEntity object in the database.
-     * @param group The group within the test run describing the coverage.
-     * @param coveredLineCount The total number of covered lines in the file.
-     * @param totalLineCount The total number of uncovered executable lines in the file.
-     * @param filePath The path to the file.
-     * @param projectName The name of the git project.
-     * @param projectVersion The commit hash of the project at the time the test was executed.
-     * @param lineCoverage List of coverage counts per executable line in the file.
-     */
-    public CoverageEntity(Key parentKey, String group, long coveredLineCount, long totalLineCount,
-            String filePath, String projectName, String projectVersion, List<Long> lineCoverage) {
-        this.parentKey = parentKey;
-        this.group = group;
-        this.coveredLineCount = coveredLineCount;
-        this.totalLineCount = totalLineCount;
-        this.filePath = filePath;
-        this.projectName = projectName;
-        this.projectVersion = projectVersion;
-        this.lineCoverage = lineCoverage;
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity coverageEntity = new Entity(KIND, parentKey);
-        coverageEntity.setProperty(GROUP, group);
-        coverageEntity.setUnindexedProperty(COVERED_LINE_COUNT, coveredLineCount);
-        coverageEntity.setUnindexedProperty(TOTAL_LINE_COUNT, totalLineCount);
-        coverageEntity.setProperty(FILE_PATH, filePath);
-        coverageEntity.setUnindexedProperty(PROJECT_NAME, projectName);
-        coverageEntity.setUnindexedProperty(PROJECT_VERSION, projectVersion);
-        if (lineCoverage != null && lineCoverage.size() > 0) {
-            coverageEntity.setUnindexedProperty(LINE_COVERAGE, lineCoverage);
-        }
-        return coverageEntity;
-    }
-
-    /**
-     * Convert an Entity object to a CoverageEntity.
-     *
-     * @param e The entity to process.
-     * @return CoverageEntity object with the properties from e, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static CoverageEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || !e.hasProperty(GROUP) || !e.hasProperty(COVERED_LINE_COUNT)
-                || !e.hasProperty(TOTAL_LINE_COUNT) || !e.hasProperty(FILE_PATH)
-                || !e.hasProperty(PROJECT_NAME) || !e.hasProperty(PROJECT_VERSION)) {
-            logger.log(Level.WARNING, "Missing coverage attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            String group = (String) e.getProperty(GROUP);
-            long coveredLineCount = (long) e.getProperty(COVERED_LINE_COUNT);
-            long totalLineCount = (long) e.getProperty(TOTAL_LINE_COUNT);
-            String filePath = (String) e.getProperty(FILE_PATH);
-            String projectName = (String) e.getProperty(PROJECT_NAME);
-            String projectVersion = (String) e.getProperty(PROJECT_VERSION);
-            List<Long> lineCoverage;
-            if (e.hasProperty(LINE_COVERAGE)) {
-                lineCoverage = (List<Long>) e.getProperty(LINE_COVERAGE);
-            } else {
-                lineCoverage = new ArrayList<>();
-            }
-            return new CoverageEntity(e.getKey().getParent(), group, coveredLineCount,
-                    totalLineCount, filePath, projectName, projectVersion, lineCoverage);
-        } catch (ClassCastException exception) {
-            // Invalid contents or null values
-            logger.log(Level.WARNING, "Error parsing coverage entity.", exception);
-        }
-        return null;
-    }
-
-    /**
-     * Convert a coverage report to a CoverageEntity.
-     *
-     * @param parentKey The ancestor key for the coverage entity.
-     * @param group The group to display the coverage report with.
-     * @param coverage The coverage report containing coverage data.
-     * @return The CoverageEntity for the coverage report message, or null if not compatible.
-     */
-    public static CoverageEntity fromCoverageReport(
-            Key parentKey, String group, CoverageReportMessage coverage) {
-        if (!coverage.hasFilePath() || !coverage.hasProjectName() || !coverage.hasRevision()
-                || !coverage.hasTotalLineCount() || !coverage.hasCoveredLineCount()) {
-            return null; // invalid coverage report;
-        }
-        long coveredLineCount = coverage.getCoveredLineCount();
-        long totalLineCount = coverage.getTotalLineCount();
-        String filePath = coverage.getFilePath().toStringUtf8();
-        String projectName = coverage.getProjectName().toStringUtf8();
-        String projectVersion = coverage.getRevision().toStringUtf8();
-        List<Long> lineCoverage = null;
-        if (coverage.getLineCoverageVectorCount() > 0) {
-            lineCoverage = new ArrayList<>();
-            for (int count : coverage.getLineCoverageVectorList()) {
-                lineCoverage.add((long) count);
-            }
-        }
-        return new CoverageEntity(parentKey, group, coveredLineCount, totalLineCount, filePath,
-                projectName, projectVersion, lineCoverage);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/DashboardEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/DashboardEntity.java
deleted file mode 100644
index 402a1e5..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/DashboardEntity.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-
-/** Interface for interacting with VTS Dashboard entities in Cloud Datastore. */
-public interface DashboardEntity {
-    /**
-     * Serialize the DashboardEntity to an Entity object.
-     *
-     * @return Entity object representing the properties defined in the DashboardEntity.
-     */
-    public Entity toEntity();
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/DeviceInfoEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/DeviceInfoEntity.java
deleted file mode 100644
index ad4e83b..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/DeviceInfoEntity.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Class describing a device used for a test run. */
-public class DeviceInfoEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(DeviceInfoEntity.class.getName());
-
-    public static final String KIND = "DeviceInfo";
-
-    // Property keys
-    public static final String BRANCH = "branch";
-    public static final String PRODUCT = "product";
-    public static final String BUILD_FLAVOR = "buildFlavor";
-    public static final String BUILD_ID = "buildId";
-    public static final String ABI_BITNESS = "abiBitness";
-    public static final String ABI_NAME = "abiName";
-
-    private final Key parentKey;
-
-    public final String branch;
-    public final String product;
-    public final String buildFlavor;
-    public final String buildId;
-    public final String abiBitness;
-    public final String abiName;
-
-    /**
-     * Create a DeviceInfoEntity object.
-     *
-     * @param parentKey The key for the parent entity in the database.
-     * @param branch The build branch.
-     * @param product The device product.
-     * @param buildFlavor The device build flavor.
-     * @param buildID The device build ID.
-     * @param abiBitness The abi bitness of the device.
-     * @param abiName The name of the abi.
-     */
-    public DeviceInfoEntity(Key parentKey, String branch, String product, String buildFlavor,
-            String buildID, String abiBitness, String abiName) {
-        this.parentKey = parentKey;
-        this.branch = branch;
-        this.product = product;
-        this.buildFlavor = buildFlavor;
-        this.buildId = buildID;
-        this.abiBitness = abiBitness;
-        this.abiName = abiName;
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity deviceEntity = new Entity(KIND, this.parentKey);
-        deviceEntity.setProperty(BRANCH, this.branch.toLowerCase());
-        deviceEntity.setProperty(PRODUCT, this.product.toLowerCase());
-        deviceEntity.setProperty(BUILD_FLAVOR, this.buildFlavor.toLowerCase());
-        deviceEntity.setProperty(BUILD_ID, this.buildId.toLowerCase());
-        if (this.abiBitness != null && this.abiName != null) {
-            deviceEntity.setUnindexedProperty(ABI_BITNESS, this.abiBitness.toLowerCase());
-            deviceEntity.setUnindexedProperty(ABI_NAME, this.abiName.toLowerCase());
-        }
-
-        return deviceEntity;
-    }
-
-    /**
-     * Convert an Entity object to a DeviceInfoEntity.
-     *
-     * @param e The entity to process.
-     * @return DeviceInfoEntity object with the properties from e, or null if incompatible.
-     */
-    public static DeviceInfoEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || !e.hasProperty(BRANCH) || !e.hasProperty(PRODUCT)
-                || !e.hasProperty(BUILD_FLAVOR) || !e.hasProperty(BUILD_ID)
-                || !e.hasProperty(ABI_BITNESS) || !e.hasProperty(ABI_NAME)) {
-            logger.log(Level.WARNING, "Missing device info attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            Key parentKey = e.getKey().getParent();
-            String branch = (String) e.getProperty(BRANCH);
-            String product = (String) e.getProperty(PRODUCT);
-            String buildFlavor = (String) e.getProperty(BUILD_FLAVOR);
-            String buildId = (String) e.getProperty(BUILD_ID);
-            String abiBitness = null;
-            String abiName = null;
-            if (e.hasProperty(ABI_BITNESS) && e.hasProperty(ABI_NAME)) {
-                abiBitness = (String) e.getProperty(ABI_BITNESS);
-                abiName = (String) e.getProperty(ABI_NAME);
-            }
-            return new DeviceInfoEntity(
-                    parentKey, branch, product, buildFlavor, buildId, abiBitness, abiName);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing device info entity.", exception);
-        }
-        return null;
-    }
-
-    /**
-     * Convert a device info message to a DeviceInfoEntity.
-     *
-     * @param parentKey The ancestor key for the device entity.
-     * @param device The device info report describing the target Android device.
-     * @return The DeviceInfoEntity for the target device, or null if incompatible
-     */
-    public static DeviceInfoEntity fromDeviceInfoMessage(
-            Key parentKey, AndroidDeviceInfoMessage device) {
-        if (!device.hasBuildAlias() || !device.hasBuildFlavor() || !device.hasProductVariant()
-                || !device.hasBuildId()) {
-            return null;
-        }
-        String branch = device.getBuildAlias().toStringUtf8();
-        String buildFlavor = device.getBuildFlavor().toStringUtf8();
-        String product = device.getProductVariant().toStringUtf8();
-        String buildId = device.getBuildId().toStringUtf8();
-        String abiBitness = device.getAbiBitness().toStringUtf8();
-        String abiName = device.getAbiName().toStringUtf8();
-        return new DeviceInfoEntity(
-                parentKey, branch, product, buildFlavor, buildId, abiBitness, abiName);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof DeviceInfoEntity)) {
-            return false;
-        }
-        DeviceInfoEntity device2 = (DeviceInfoEntity) obj;
-        if (!this.branch.equals(device2.branch) || !this.product.equals(device2.product)
-                || !this.buildFlavor.equals(device2.buildFlavor)
-                || !this.buildId.equals(device2.buildId)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        String deviceId = this.branch + this.product + this.buildFlavor + this.buildId;
-        return deviceId.hashCode();
-    }
-
-    /**
-     * Create a copy of the device info under a near parent.
-     * @param parentKey The new parent key.
-     * @return A copy of the DeviceInfoEntity with the specified parent.
-     */
-    public DeviceInfoEntity copyWithParent(Key parentKey) {
-        return new DeviceInfoEntity(parentKey, this.branch, this.product, this.buildFlavor,
-                this.buildId, this.abiBitness, this.abiName);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/ProfilingPointRunEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/ProfilingPointRunEntity.java
deleted file mode 100644
index 1f205ed..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/ProfilingPointRunEntity.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.proto.VtsReportMessage.ProfilingReportMessage;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingType;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.protobuf.ByteString;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Entity describing a profiling point execution. */
-public class ProfilingPointRunEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(
-            ProfilingPointRunEntity.class.getName());
-
-    public static final String KIND = "ProfilingPointRun";
-
-    // Property keys
-    public static final String TYPE = "type";
-    public static final String REGRESSION_MODE = "regressionMode";
-    public static final String LABELS = "labels";
-    public static final String VALUES = "values";
-    public static final String X_LABEL = "xLabel";
-    public static final String Y_LABEL = "yLabel";
-
-    private final Key parentKey;
-
-    public final String name;
-    public final VtsProfilingType type;
-    public final VtsProfilingRegressionMode regressionMode;
-    public final List<String> labels;
-    public final List<Long> values;
-    public final String xLabel;
-    public final String yLabel;
-
-    /**
-     * Create a ProfilingPointRunEntity object.
-     *
-     * @param parentKey The Key object for the parent TestRunEntity in the database.
-     * @param name The name of the profiling point.
-     * @param type The (number) type of the profiling point data.
-     * @param regressionMode The (number) mode to use for detecting regression.
-     * @param labels List of data labels, or null if the data is unlabeled.
-     * @param values List of data values.
-     * @param xLabel The x axis label.
-     * @param yLabel The y axis label.
-     */
-    public ProfilingPointRunEntity(Key parentKey, String name, int type, int regressionMode,
-            List<String> labels, List<Long> values, String xLabel, String yLabel) {
-        this.parentKey = parentKey;
-        this.name = name;
-        this.type = VtsProfilingType.valueOf(type);
-        this.regressionMode = VtsProfilingRegressionMode.valueOf(regressionMode);
-        this.labels = labels == null ? null : new ArrayList<>(labels);
-        this.values = new ArrayList<>(values);
-        this.xLabel = xLabel;
-        this.yLabel = yLabel;
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity profilingRun = new Entity(KIND, this.name, this.parentKey);
-        profilingRun.setUnindexedProperty(TYPE, this.type.getNumber());
-        profilingRun.setUnindexedProperty(REGRESSION_MODE, this.regressionMode.getNumber());
-        if (this.labels != null) {
-            profilingRun.setUnindexedProperty(LABELS, this.labels);
-        }
-        profilingRun.setUnindexedProperty(VALUES, this.values);
-        profilingRun.setUnindexedProperty(X_LABEL, this.xLabel);
-        profilingRun.setUnindexedProperty(Y_LABEL, this.yLabel);
-
-        return profilingRun;
-    }
-
-    /**
-     * Convert an Entity object to a ProflilingPointRunEntity.
-     *
-     * @param e The entity to process.
-     * @return ProfilingPointRunEntity object with the properties from e, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static ProfilingPointRunEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || e.getKey().getName() == null || !e.hasProperty(TYPE)
-                || !e.hasProperty(REGRESSION_MODE) || !e.hasProperty(VALUES)
-                || !e.hasProperty(X_LABEL) || !e.hasProperty(Y_LABEL)) {
-            logger.log(
-                    Level.WARNING, "Missing profiling point attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            Key parentKey = e.getParent();
-            String name = e.getKey().getName();
-            int type = (int) (long) e.getProperty(TYPE);
-            int regressionMode = (int) (long) e.getProperty(REGRESSION_MODE);
-            List<Long> values = (List<Long>) e.getProperty(VALUES);
-            String xLabel = (String) e.getProperty(X_LABEL);
-            String yLabel = (String) e.getProperty(Y_LABEL);
-            List<String> labels = null;
-            if (e.hasProperty(LABELS)) {
-                labels = (List<String>) e.getProperty(LABELS);
-            }
-            return new ProfilingPointRunEntity(
-                    parentKey, name, type, regressionMode, labels, values, xLabel, yLabel);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing profiling point run entity.", exception);
-        }
-        return null;
-    }
-
-    /**
-     * Convert a coverage report to a CoverageEntity.
-     *
-     * @param parentKey The ancestor key for the coverage entity.
-     * @param profilingReport The profiling report containing profiling data.
-     * @return The ProfilingPointRunEntity for the profiling report message, or null if incompatible
-     */
-    public static ProfilingPointRunEntity fromProfilingReport(
-            Key parentKey, ProfilingReportMessage profilingReport) {
-        if (!profilingReport.hasName() || !profilingReport.hasType()
-                || profilingReport.getType() == VtsProfilingType.UNKNOWN_VTS_PROFILING_TYPE
-                || !profilingReport.hasRegressionMode() || !profilingReport.hasXAxisLabel()
-                || !profilingReport.hasYAxisLabel()) {
-            return null; // invalid profiling report;
-        }
-        String name = profilingReport.getName().toStringUtf8();
-        VtsProfilingType type = profilingReport.getType();
-        VtsProfilingRegressionMode regressionMode = profilingReport.getRegressionMode();
-        String xLabel = profilingReport.getXAxisLabel().toStringUtf8();
-        String yLabel = profilingReport.getYAxisLabel().toStringUtf8();
-        List<Long> values;
-        List<String> labels = null;
-        switch (type) {
-            case VTS_PROFILING_TYPE_TIMESTAMP:
-                if (!profilingReport.hasStartTimestamp() || !profilingReport.hasEndTimestamp()
-                        || profilingReport.getEndTimestamp()
-                                < profilingReport.getStartTimestamp()) {
-                    return null; // missing timestamp
-                }
-                long value =
-                        profilingReport.getEndTimestamp() - profilingReport.getStartTimestamp();
-                values = new ArrayList<>();
-                values.add(value);
-                break;
-            case VTS_PROFILING_TYPE_LABELED_VECTOR:
-                if (profilingReport.getValueCount() != profilingReport.getLabelCount()) {
-                    return null; // jagged data
-                }
-                labels = new ArrayList<>();
-                for (ByteString label : profilingReport.getLabelList()) {
-                    labels.add(label.toStringUtf8());
-                }
-                values = profilingReport.getValueList();
-                break;
-            case VTS_PROFILING_TYPE_UNLABELED_VECTOR:
-                values = profilingReport.getValueList();
-                break;
-            default: // should never happen
-                return null;
-        }
-        return new ProfilingPointRunEntity(parentKey, name, type.getNumber(),
-                regressionMode.getNumber(), labels, values, xLabel, yLabel);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/TestCaseRunEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/TestCaseRunEntity.java
deleted file mode 100644
index 02fac2d..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/TestCaseRunEntity.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Entity describing the execution of a test case. */
-public class TestCaseRunEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestCaseRunEntity.class.getName());
-
-    public static final String KIND = "TestCaseRun";
-
-    // Property keys
-    public static final String TEST_CASE_NAME = "testCaseName";
-    public static final String RESULT = "result";
-    public static final String TEST_CASE_NAMES = "testCaseNames";
-    public static final String RESULTS = "results";
-    public static final String SYSTRACE_URL = "systraceUrl";
-
-    // Maximum number of test cases in the entity.
-    private static final int SIZE_LIMIT = 500;
-
-    public final Key key;
-    public final List<TestCase> testCases;
-    private String systraceUrl;
-
-    /**
-     * Class describing an individual test case run.
-     */
-    public static class TestCase {
-        public final long parentId;
-        public final int offset;
-        public final String name;
-        public final int result;
-
-        /**
-         * Create a test case run.
-         * @param parentId The ID of the TestCaseRunEntity containing the test case.
-         * @param offset The offset of the TestCase into the TestCaseRunEntity.
-         * @param name The name of the test case.
-         * @param result The result of the test case.
-         */
-        public TestCase(long parentId, int offset, String name, int result) {
-            this.parentId = parentId;
-            this.offset = offset;
-            this.name = name;
-            this.result = result;
-        }
-    }
-
-    /**
-     * Create a TestCaseRunEntity with the specified key.
-     * @param key The key to use for the entity in Cloud Datastore.
-     */
-    public TestCaseRunEntity(Key key) {
-        this.key = key;
-        this.testCases = new ArrayList<>();
-        this.systraceUrl = null;
-    }
-
-    /**
-     * Determine if the TestCaseRunEntity is full.
-     * @return True if the entity is full, false otherwise.
-     */
-    public boolean isFull() {
-        return this.testCases.size() >= SIZE_LIMIT;
-    }
-
-    /**
-     * Set the systrace url.
-     * @param url The systrace url, or null.
-     */
-    public void setSystraceUrl(String url) {
-        this.systraceUrl = url;
-    }
-
-    /**
-     * Get the systrace url.
-     * returns The systrace url, or null.
-     */
-    public String getSystraceUrl() {
-        return this.systraceUrl;
-    }
-
-    /**
-     * Add a test case to the test case run entity.
-     * @param name The name of the test case.
-     * @param result The result of the test case.
-     * @return true if added, false otherwise.
-     */
-    public boolean addTestCase(String name, int result) {
-        if (isFull())
-            return false;
-        long parentId = this.key.getId();
-        this.testCases.add(new TestCase(parentId, this.testCases.size(), name, result));
-        return true;
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity testCaseRunEntity = new Entity(key);
-        if (this.testCases.size() > 0) {
-            List<String> testCaseNames = new ArrayList<>();
-            List<Integer> results = new ArrayList<>();
-            for (TestCase testCase : this.testCases) {
-                testCaseNames.add(testCase.name);
-                results.add(testCase.result);
-            }
-            testCaseRunEntity.setUnindexedProperty(TEST_CASE_NAMES, testCaseNames);
-            testCaseRunEntity.setUnindexedProperty(RESULTS, results);
-        }
-        if (systraceUrl != null) {
-            testCaseRunEntity.setUnindexedProperty(SYSTRACE_URL, this.systraceUrl);
-        }
-
-        return testCaseRunEntity;
-    }
-
-    /**
-     * Convert an Entity object to a TestCaseRunEntity.
-     *
-     * @param e The entity to process.
-     * @return TestCaseRunEntity object with the properties from e, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestCaseRunEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)) {
-            logger.log(Level.WARNING, "Wrong kind: " + e.getKey());
-            return null;
-        }
-        try {
-            TestCaseRunEntity testCaseRun = new TestCaseRunEntity(e.getKey());
-            if (e.hasProperty(TEST_CASE_NAMES) && e.hasProperty(RESULTS)) {
-                List<String> testCaseNames = (List<String>) e.getProperty(TEST_CASE_NAMES);
-                List<Long> results = (List<Long>) e.getProperty(RESULTS);
-                if (testCaseNames.size() == results.size()) {
-                    for (int i = 0; i < testCaseNames.size(); i++) {
-                        testCaseRun.addTestCase(testCaseNames.get(i), results.get(i).intValue());
-                    }
-                }
-            }
-            if (e.hasProperty(TEST_CASE_NAME) && e.hasProperty(RESULT)) {
-                testCaseRun.addTestCase(
-                        (String) e.getProperty(TEST_CASE_NAME), (int) (long) e.getProperty(RESULT));
-            }
-            if (e.hasProperty(SYSTRACE_URL)) {
-                String systraceUrl = (String) e.getProperty(SYSTRACE_URL);
-                testCaseRun.setSystraceUrl(systraceUrl);
-            }
-            return testCaseRun;
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing test case run entity.", exception);
-        }
-        return null;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/TestEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/TestEntity.java
deleted file mode 100644
index a5664f4..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/TestEntity.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.entity.TestCaseRunEntity.TestCase;
-import com.google.appengine.api.datastore.Entity;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Entity describing test metadata. */
-public class TestEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestEntity.class.getName());
-
-    public static final String KIND = "Test";
-
-    // Property keys
-    public static final String PASS_COUNT = "passCount";
-    public static final String FAIL_COUNT = "failCount";
-    public static final String UPDATED_TIMESTAMP = "updatedTimestamp";
-
-    protected static final String FAILING_IDS = "failingTestcaseIds";
-    protected static final String FAILING_OFFSETS = "failingTestcaseOffsets";
-
-    public final String testName;
-    public final int passCount;
-    public final int failCount;
-    public final long timestamp;
-    public final List<TestCaseReference> failingTestCases;
-
-    /**
-     * Object representing a reference to a test case.
-     */
-    public static class TestCaseReference {
-        public final long parentId;
-        public final int offset;
-
-        /**
-         * Create a test case reference.
-         * @param parentId The ID of the TestCaseRunEntity containing the test case.
-         * @param offset The offset of the test case into the TestCaseRunEntity.
-         */
-        public TestCaseReference(long parentId, int offset) {
-            this.parentId = parentId;
-            this.offset = offset;
-        }
-
-        /**
-         * Create a test case reference.
-         * @param testCase The TestCase to reference.
-         */
-        public TestCaseReference(TestCase testCase) {
-            this(testCase.parentId, testCase.offset);
-        }
-    }
-
-    /**
-     * Create a TestEntity object with status metadata.
-     *
-     * @param testName The name of the test.
-     * @param timestamp The timestamp indicating the most recent test run event in the test state.
-     * @param passCount The number of tests passing up to the timestamp specified.
-     * @param failCount The number of tests failing up to the timestamp specified.
-     * @param failingTestCases The TestCaseReferences of the last observed failing test cases.
-     */
-    public TestEntity(String testName, long timestamp, int passCount, int failCount,
-            List<TestCaseReference> failingTestCases) {
-        this.testName = testName;
-        this.timestamp = timestamp;
-        this.passCount = passCount;
-        this.failCount = failCount;
-        this.failingTestCases = failingTestCases;
-    }
-
-    /**
-     * Create a TestEntity object without metadata.
-     *
-     * @param testName The name of the test.
-     */
-    public TestEntity(String testName) {
-        this(testName, 0, -1, -1, new ArrayList<TestCaseReference>());
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity testEntity = new Entity(KIND, this.testName);
-        if (this.timestamp >= 0 && this.passCount >= 0 && this.failCount >= 0) {
-            testEntity.setProperty(UPDATED_TIMESTAMP, this.timestamp);
-            testEntity.setProperty(PASS_COUNT, this.passCount);
-            testEntity.setProperty(FAIL_COUNT, this.failCount);
-            if (this.failingTestCases.size() > 0) {
-                List<Long> failingTestcaseIds = new ArrayList<>();
-                List<Integer> failingTestcaseOffsets = new ArrayList<>();
-                for (TestCaseReference testCase : this.failingTestCases) {
-                    failingTestcaseIds.add(testCase.parentId);
-                    failingTestcaseOffsets.add(testCase.offset);
-                }
-                testEntity.setUnindexedProperty(FAILING_IDS, failingTestcaseIds);
-                testEntity.setUnindexedProperty(FAILING_OFFSETS, failingTestcaseOffsets);
-            }
-        }
-        return testEntity;
-    }
-
-    /**
-     * Convert an Entity object to a TestEntity.
-     *
-     * @param e The entity to process.
-     * @return TestEntity object with the properties from e processed, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || e.getKey().getName() == null) {
-            logger.log(Level.WARNING, "Missing test attributes in entity: " + e.toString());
-            return null;
-        }
-        String testName = e.getKey().getName();
-        long timestamp = 0;
-        int passCount = -1;
-        int failCount = -1;
-        List<TestCaseReference> failingTestCases = new ArrayList<>();
-        try {
-            if (e.hasProperty(UPDATED_TIMESTAMP)) {
-                timestamp = (long) e.getProperty(UPDATED_TIMESTAMP);
-            }
-            if (e.hasProperty(PASS_COUNT)) {
-                passCount = ((Long) e.getProperty(PASS_COUNT)).intValue();
-            }
-            if (e.hasProperty(FAIL_COUNT)) {
-                failCount = ((Long) e.getProperty(FAIL_COUNT)).intValue();
-            }
-            if (e.hasProperty(FAILING_IDS) && e.hasProperty(FAILING_OFFSETS)) {
-                List<Long> ids = (List<Long>) e.getProperty(FAILING_IDS);
-                List<Long> offsets = (List<Long>) e.getProperty(FAILING_OFFSETS);
-                if (ids.size() == offsets.size()) {
-                    for (int i = 0; i < ids.size(); i++) {
-                        failingTestCases.add(
-                                new TestCaseReference(ids.get(i), offsets.get(i).intValue()));
-                    }
-                }
-            }
-        } catch (ClassCastException exception) {
-            // Invalid contents or null values
-            logger.log(Level.WARNING, "Error parsing test entity.", exception);
-        }
-        return new TestEntity(testName, timestamp, passCount, failCount, failingTestCases);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/TestPlanEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/TestPlanEntity.java
deleted file mode 100644
index 82d7e5e..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/TestPlanEntity.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Entity describing test plan metadata. */
-public class TestPlanEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestPlanEntity.class.getName());
-
-    public static final String KIND = "TestPlan";
-
-    // Property keys
-    public static final String TEST_PLAN_NAME = "testPlanName";
-
-    public final String testPlanName;
-
-    /**
-     * Create a TestPlanEntity object.
-     *
-     * @param testPlanName The name of the test plan.
-     */
-    public TestPlanEntity(String testPlanName) {
-        this.testPlanName = testPlanName;
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity planEntity = new Entity(KIND, this.testPlanName);
-        return planEntity;
-    }
-
-    /**
-     * Convert an Entity object to a TestEntity.
-     *
-     * @param e The entity to process.
-     * @return TestEntity object with the properties from e processed, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestPlanEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || e.getKey().getName() == null
-                || !e.hasProperty(TEST_PLAN_NAME)) {
-            logger.log(Level.WARNING, "Missing test plan attributes in entity: " + e.toString());
-            return null;
-        }
-        String testPlanName = e.getKey().getName();
-        return new TestPlanEntity(testPlanName);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/TestPlanRunEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/TestPlanRunEntity.java
deleted file mode 100644
index 2b12597..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/TestPlanRunEntity.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.entity.TestRunEntity.TestRunType;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Entity describing test plan run information. */
-public class TestPlanRunEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestPlanRunEntity.class.getName());
-
-    public static final String KIND = "TestPlanRun";
-
-    // Property keys
-    public static final String TEST_PLAN_NAME = "testPlanName";
-    public static final String TYPE = "type";
-    public static final String START_TIMESTAMP = "startTimestamp";
-    public static final String TEST_BUILD_ID = "testBuildId";
-    public static final String PASS_COUNT = "passCount";
-    public static final String FAIL_COUNT = "failCount";
-    public static final String TEST_RUNS = "testRuns";
-
-    public final Key key;
-    public final String testPlanName;
-    public final TestRunType type;
-    public final long startTimestamp;
-    public final String testBuildId;
-    public final long passCount;
-    public final long failCount;
-    public final List<Key> testRuns;
-
-    /**
-     * Create a TestPlanRunEntity object describing a test plan run.
-     *
-     * @param parentKey The key for the parent entity in the database.
-     * @param type The test run type (e.g. presubmit, postsubmit, other)
-     * @param startTimestamp The time in microseconds when the test run started.
-     * @param testBuildId The build ID of the VTS test build.
-     * @param passCount The number of passing test cases in the run.
-     * @param failCount The number of failing test cases in the run.
-     * @param testRuns A list of keys to the TestRunEntity objects for the plan run run.
-     */
-    public TestPlanRunEntity(Key parentKey, String testPlanName, TestRunType type,
-            long startTimestamp, String testBuildId, long passCount, long failCount,
-            List<Key> testRuns) {
-        this.key = KeyFactory.createKey(parentKey, KIND, startTimestamp);
-        this.testPlanName = testPlanName;
-        this.type = type;
-        this.startTimestamp = startTimestamp;
-        this.testBuildId = testBuildId;
-        this.passCount = passCount;
-        this.failCount = failCount;
-        this.testRuns = testRuns;
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity planRun = new Entity(this.key);
-        planRun.setProperty(TEST_PLAN_NAME, this.testPlanName);
-        planRun.setProperty(TYPE, this.type.getNumber());
-        planRun.setProperty(START_TIMESTAMP, this.startTimestamp);
-        planRun.setProperty(TEST_BUILD_ID, this.testBuildId.toLowerCase());
-        planRun.setProperty(PASS_COUNT, this.passCount);
-        planRun.setProperty(FAIL_COUNT, this.failCount);
-        if (this.testRuns != null && this.testRuns.size() > 0) {
-            planRun.setUnindexedProperty(TEST_RUNS, this.testRuns);
-        }
-        return planRun;
-    }
-
-    /**
-     * Convert an Entity object to a TestPlanRunEntity.
-     *
-     * @param e The entity to process.
-     * @return TestPlanRunEntity object with the properties from e processed, or null if
-     * incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestPlanRunEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || !e.hasProperty(TEST_PLAN_NAME) || !e.hasProperty(TYPE)
-                || !e.hasProperty(START_TIMESTAMP) || !e.hasProperty(TEST_BUILD_ID)
-                || !e.hasProperty(PASS_COUNT) || !e.hasProperty(FAIL_COUNT)
-                || !e.hasProperty(TEST_RUNS)) {
-            logger.log(Level.WARNING, "Missing test run attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            String testPlanName = (String) e.getProperty(TEST_PLAN_NAME);
-            TestRunType type = TestRunType.fromNumber((int) (long) e.getProperty(TYPE));
-            long startTimestamp = (long) e.getProperty(START_TIMESTAMP);
-            String testBuildId = (String) e.getProperty(TEST_BUILD_ID);
-            long passCount = (long) e.getProperty(PASS_COUNT);
-            long failCount = (long) e.getProperty(FAIL_COUNT);
-            List<Key> testRuns = (List<Key>) e.getProperty(TEST_RUNS);
-            return new TestPlanRunEntity(e.getKey().getParent(), testPlanName, type, startTimestamp,
-                    testBuildId, passCount, failCount, testRuns);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing test plan run entity.", exception);
-        }
-        return null;
-    }
-
-    public JsonObject toJson() {
-        JsonObject json = new JsonObject();
-        json.add(TEST_PLAN_NAME, new JsonPrimitive(this.testPlanName));
-        json.add(TEST_BUILD_ID, new JsonPrimitive(this.testBuildId));
-        json.add(PASS_COUNT, new JsonPrimitive(this.passCount));
-        json.add(FAIL_COUNT, new JsonPrimitive(this.failCount));
-        json.add(START_TIMESTAMP, new JsonPrimitive(this.startTimestamp));
-        return json;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/TestRunEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/TestRunEntity.java
deleted file mode 100644
index ab2b39f..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/TestRunEntity.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.util.UrlUtil;
-import com.android.vts.util.UrlUtil.LinkDisplay;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Entity describing test run information. */
-public class TestRunEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestRunEntity.class.getName());
-
-    /** Enum for classifying test run types. */
-    public enum TestRunType {
-        OTHER(0),
-        PRESUBMIT(1),
-        POSTSUBMIT(2);
-
-        private final int value;
-
-        private TestRunType(int value) {
-            this.value = value;
-        }
-
-        /**
-         * Get the ordinal representation of the type.
-         *
-         * @return The value associated with the test run type.
-         */
-        public int getNumber() {
-            return value;
-        }
-
-        /**
-         * Convert an ordinal value to a TestRunType.
-         *
-         * @param value The orginal value to parse.
-         * @return a TestRunType value.
-         */
-        public static TestRunType fromNumber(int value) {
-            if (value == 1) {
-                return TestRunType.PRESUBMIT;
-            } else if (value == 2) {
-                return TestRunType.POSTSUBMIT;
-            } else {
-                return TestRunType.OTHER;
-            }
-        }
-
-        /**
-         * Determine the test run type based on the build ID.
-         *
-         * Postsubmit runs are expected to have integer build IDs, while presubmit runs are integers
-         * prefixed by the character P. All other runs (e.g. local builds) are classified as OTHER.
-         *
-         * @param buildId The build ID.
-         * @return the TestRunType.
-         */
-        public static TestRunType fromBuildId(String buildId) {
-            try {
-                Integer.parseInt(buildId);
-                return TestRunType.POSTSUBMIT;
-            } catch (NumberFormatException e) {
-                // Not an integer
-            }
-            if (Character.toLowerCase(buildId.charAt(0)) == 'p') {
-                try {
-                    Integer.parseInt(buildId.substring(1));
-                    return TestRunType.PRESUBMIT;
-                } catch (NumberFormatException e) {
-                    // Not an integer
-                }
-            }
-            return TestRunType.OTHER;
-        }
-    }
-
-    public static final String KIND = "TestRun";
-
-    // Property keys
-    public static final String TEST_NAME = "testName";
-    public static final String TYPE = "type";
-    public static final String START_TIMESTAMP = "startTimestamp";
-    public static final String END_TIMESTAMP = "endTimestamp";
-    public static final String TEST_BUILD_ID = "testBuildId";
-    public static final String HOST_NAME = "hostName";
-    public static final String PASS_COUNT = "passCount";
-    public static final String FAIL_COUNT = "failCount";
-    public static final String TEST_CASE_IDS = "testCaseIds";
-    public static final String LOG_LINKS = "logLinks";
-    public static final String TOTAL_LINE_COUNT = "totalLineCount";
-    public static final String COVERED_LINE_COUNT = "coveredLineCount";
-
-    public final Key key;
-    public final TestRunType type;
-    public final long startTimestamp;
-    public final long endTimestamp;
-    public final String testBuildId;
-    public final String hostName;
-    public final long passCount;
-    public final long failCount;
-    public final long coveredLineCount;
-    public final long totalLineCount;
-    public final List<Long> testCaseIds;
-    public final List<String> logLinks;
-
-    /**
-     * Create a TestRunEntity object describing a test run.
-     *
-     * @param parentKey The key to the parent TestEntity.
-     * @param type The test run type (e.g. presubmit, postsubmit, other)
-     * @param startTimestamp The time in microseconds when the test run started.
-     * @param endTimestamp The time in microseconds when the test run ended.
-     * @param testBuildId The build ID of the VTS test build.
-     * @param hostName The name of host machine.
-     * @param passCount The number of passing test cases in the run.
-     * @param failCount The number of failing test cases in the run.
-     * @param testCaseIds A list of key IDs to the TestCaseRunEntity objects for the test run.
-     * @param logLinks A list of links to log files for the test run, or null if there aren't any.
-     * @param coveredLineCount The number of lines covered by the test run.
-     * @param totalLineCount The total number of executable lines by the test in the test run.
-     */
-    public TestRunEntity(Key parentKey, TestRunType type, long startTimestamp, long endTimestamp,
-            String testBuildId, String hostName, long passCount, long failCount,
-            List<Long> testCaseIds, List<String> logLinks, long coveredLineCount,
-            long totalLineCount) {
-        this.key = KeyFactory.createKey(parentKey, KIND, startTimestamp);
-        this.type = type;
-        this.startTimestamp = startTimestamp;
-        this.endTimestamp = endTimestamp;
-        this.testBuildId = testBuildId;
-        this.hostName = hostName;
-        this.passCount = passCount;
-        this.failCount = failCount;
-        this.testCaseIds = testCaseIds;
-        this.logLinks = logLinks;
-        this.coveredLineCount = coveredLineCount;
-        this.totalLineCount = totalLineCount;
-    }
-
-    /**
-     * Create a TestRunEntity object describing a test run.
-     *
-     * @param parentKey The key to the parent TestEntity.
-     * @param type The test run type (e.g. presubmit, postsubmit, other)
-     * @param startTimestamp The time in microseconds when the test run started.
-     * @param endTimestamp The time in microseconds when the test run ended.
-     * @param testBuildId The build ID of the VTS test build.
-     * @param hostName The name of host machine.
-     * @param passCount The number of passing test cases in the run.
-     * @param failCount The number of failing test cases in the run.
-     * @param testCaseIds A list of key IDs to the TestCaseRunEntity objects for the test run.
-     * @param logLinks A list of links to log files for the test run, or null if there aren't any.
-     */
-    public TestRunEntity(Key parentKey, TestRunType type, long startTimestamp, long endTimestamp,
-            String testBuildId, String hostName, long passCount, long failCount,
-            List<Long> testCaseIds, List<String> logLinks) {
-        this(parentKey, type, startTimestamp, endTimestamp, testBuildId, hostName, passCount,
-                failCount, testCaseIds, logLinks, 0, 0);
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity testRunEntity = new Entity(this.key);
-        testRunEntity.setProperty(TEST_NAME, this.key.getParent().getName());
-        testRunEntity.setProperty(TYPE, this.type.getNumber());
-        testRunEntity.setProperty(START_TIMESTAMP, this.startTimestamp);
-        testRunEntity.setUnindexedProperty(END_TIMESTAMP, this.endTimestamp);
-        testRunEntity.setProperty(TEST_BUILD_ID, this.testBuildId.toLowerCase());
-        testRunEntity.setProperty(HOST_NAME, this.hostName.toLowerCase());
-        testRunEntity.setProperty(PASS_COUNT, this.passCount);
-        testRunEntity.setProperty(FAIL_COUNT, this.failCount);
-        testRunEntity.setUnindexedProperty(TEST_CASE_IDS, this.testCaseIds);
-        if (this.totalLineCount > 0 && this.coveredLineCount >= 0) {
-            testRunEntity.setProperty(COVERED_LINE_COUNT, this.coveredLineCount);
-            testRunEntity.setProperty(TOTAL_LINE_COUNT, this.totalLineCount);
-        }
-        if (this.logLinks != null && this.logLinks.size() > 0) {
-            testRunEntity.setUnindexedProperty(LOG_LINKS, this.logLinks);
-        }
-        return testRunEntity;
-    }
-
-    /**
-     * Convert an Entity object to a TestRunEntity.
-     *
-     * @param e The entity to process.
-     * @return TestRunEntity object with the properties from e processed, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestRunEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || !e.hasProperty(TYPE) || !e.hasProperty(START_TIMESTAMP)
-                || !e.hasProperty(END_TIMESTAMP) || !e.hasProperty(TEST_BUILD_ID)
-                || !e.hasProperty(HOST_NAME) || !e.hasProperty(PASS_COUNT)
-                || !e.hasProperty(FAIL_COUNT) || !e.hasProperty(TEST_CASE_IDS)) {
-            logger.log(Level.WARNING, "Missing test run attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            TestRunType type = TestRunType.fromNumber((int) (long) e.getProperty(TYPE));
-            long startTimestamp = (long) e.getProperty(START_TIMESTAMP);
-            long endTimestamp = (long) e.getProperty(END_TIMESTAMP);
-            String testBuildId = (String) e.getProperty(TEST_BUILD_ID);
-            String hostName = (String) e.getProperty(HOST_NAME);
-            long passCount = (long) e.getProperty(PASS_COUNT);
-            long failCount = (long) e.getProperty(FAIL_COUNT);
-            List<Long> testCaseIds = (List<Long>) e.getProperty(TEST_CASE_IDS);
-            List<String> logLinks = null;
-            long coveredLineCount = 0;
-            long totalLineCount = 0;
-            if (e.hasProperty(TOTAL_LINE_COUNT) && e.hasProperty(COVERED_LINE_COUNT)) {
-                coveredLineCount = (long) e.getProperty(COVERED_LINE_COUNT);
-                totalLineCount = (long) e.getProperty(TOTAL_LINE_COUNT);
-            }
-            if (e.hasProperty(LOG_LINKS)) {
-                logLinks = (List<String>) e.getProperty(LOG_LINKS);
-            }
-            return new TestRunEntity(e.getKey().getParent(), type, startTimestamp, endTimestamp,
-                    testBuildId, hostName, passCount, failCount, testCaseIds, logLinks,
-                    coveredLineCount, totalLineCount);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing test run entity.", exception);
-        }
-        return null;
-    }
-
-    public JsonObject toJson() {
-        JsonObject json = new JsonObject();
-        json.add(TEST_NAME, new JsonPrimitive(this.key.getParent().getName()));
-        json.add(TEST_BUILD_ID, new JsonPrimitive(this.testBuildId));
-        json.add(HOST_NAME, new JsonPrimitive(this.hostName));
-        json.add(PASS_COUNT, new JsonPrimitive(this.passCount));
-        json.add(FAIL_COUNT, new JsonPrimitive(this.failCount));
-        json.add(START_TIMESTAMP, new JsonPrimitive(this.startTimestamp));
-        json.add(END_TIMESTAMP, new JsonPrimitive(this.endTimestamp));
-        if (this.totalLineCount > 0 && this.coveredLineCount >= 0) {
-            json.add(COVERED_LINE_COUNT, new JsonPrimitive(this.coveredLineCount));
-            json.add(TOTAL_LINE_COUNT, new JsonPrimitive(this.totalLineCount));
-        }
-        if (this.logLinks != null && this.logLinks.size() > 0) {
-            List<JsonElement> links = new ArrayList<>();
-            for (String rawUrl : this.logLinks) {
-                LinkDisplay validatedLink = UrlUtil.processUrl(rawUrl);
-                if (validatedLink == null) {
-                    logger.log(Level.WARNING, "Invalid logging URL : " + rawUrl);
-                    continue;
-                }
-                String[] logInfo = new String[] {validatedLink.name, validatedLink.url};
-                links.add(new Gson().toJsonTree(logInfo));
-            }
-            if (links.size() > 0) {
-                json.add(LOG_LINKS, new Gson().toJsonTree(links));
-            }
-        }
-        return json;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/entity/UserFavoriteEntity.java b/web/dashboard/src/main/java/com/android/vts/entity/UserFavoriteEntity.java
deleted file mode 100644
index a2820a6..0000000
--- a/web/dashboard/src/main/java/com/android/vts/entity/UserFavoriteEntity.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.users.User;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Entity describing subscriptions between a user and a test. */
-public class UserFavoriteEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(UserFavoriteEntity.class.getName());
-
-    public static final String KIND = "UserFavorite";
-
-    // Property keys
-    public static final String USER = "user";
-    public static final String TEST_KEY = "testKey";
-
-    public final User user;
-    public final Key testKey;
-
-    /**
-     * Create a user favorite relationship.
-     *
-     * @param user The User object for the subscribing user.
-     * @param testKey The key of the TestEntity object describing the test.
-     */
-    public UserFavoriteEntity(User user, Key testKey) {
-        this.user = user;
-        this.testKey = testKey;
-    }
-
-    @Override
-    public Entity toEntity() {
-        Entity favoriteEntity = new Entity(KIND);
-        favoriteEntity.setProperty(USER, this.user);
-        favoriteEntity.setProperty(TEST_KEY, this.testKey);
-        return favoriteEntity;
-    }
-
-    /**
-     * Convert an Entity object to a UserFavoriteEntity.
-     *
-     * @param e The entity to process.
-     * @return UserFavoriteEntity object with the properties from e, or null if incompatible.
-     */
-    public static UserFavoriteEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || !e.hasProperty(USER) || !e.hasProperty(TEST_KEY)) {
-            logger.log(
-                    Level.WARNING, "Missing user favorite attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            User user = (User) e.getProperty(USER);
-            Key testKey = (Key) e.getProperty(TEST_KEY);
-            return new UserFavoriteEntity(user, testKey);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing user favorite entity.", exception);
-        }
-        return null;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/proto/VtsReportMessage.java b/web/dashboard/src/main/java/com/android/vts/proto/VtsReportMessage.java
deleted file mode 100644
index c92288b..0000000
--- a/web/dashboard/src/main/java/com/android/vts/proto/VtsReportMessage.java
+++ /dev/null
@@ -1,18978 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: VtsReportMessage.proto
-
-package com.android.vts.proto;
-
-public final class VtsReportMessage {
-  private VtsReportMessage() {}
-  public static void registerAllExtensions(
-      com.google.protobuf.ExtensionRegistry registry) {
-  }
-  /**
-   * Protobuf enum {@code android.vts.TestCaseResult}
-   *
-   * <pre>
-   * To specify test case execution result.
-   * </pre>
-   */
-  public enum TestCaseResult
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKNOWN_RESULT = 0;</code>
-     */
-    UNKNOWN_RESULT(0, 0),
-    /**
-     * <code>TEST_CASE_RESULT_PASS = 1;</code>
-     */
-    TEST_CASE_RESULT_PASS(1, 1),
-    /**
-     * <code>TEST_CASE_RESULT_FAIL = 2;</code>
-     */
-    TEST_CASE_RESULT_FAIL(2, 2),
-    /**
-     * <code>TEST_CASE_RESULT_SKIP = 3;</code>
-     */
-    TEST_CASE_RESULT_SKIP(3, 3),
-    /**
-     * <code>TEST_CASE_RESULT_EXCEPTION = 4;</code>
-     */
-    TEST_CASE_RESULT_EXCEPTION(4, 4),
-    /**
-     * <code>TEST_CASE_RESULT_TIMEOUT = 5;</code>
-     */
-    TEST_CASE_RESULT_TIMEOUT(5, 5),
-    ;
-
-    /**
-     * <code>UNKNOWN_RESULT = 0;</code>
-     */
-    public static final int UNKNOWN_RESULT_VALUE = 0;
-    /**
-     * <code>TEST_CASE_RESULT_PASS = 1;</code>
-     */
-    public static final int TEST_CASE_RESULT_PASS_VALUE = 1;
-    /**
-     * <code>TEST_CASE_RESULT_FAIL = 2;</code>
-     */
-    public static final int TEST_CASE_RESULT_FAIL_VALUE = 2;
-    /**
-     * <code>TEST_CASE_RESULT_SKIP = 3;</code>
-     */
-    public static final int TEST_CASE_RESULT_SKIP_VALUE = 3;
-    /**
-     * <code>TEST_CASE_RESULT_EXCEPTION = 4;</code>
-     */
-    public static final int TEST_CASE_RESULT_EXCEPTION_VALUE = 4;
-    /**
-     * <code>TEST_CASE_RESULT_TIMEOUT = 5;</code>
-     */
-    public static final int TEST_CASE_RESULT_TIMEOUT_VALUE = 5;
-
-
-    public final int getNumber() { return value; }
-
-    public static TestCaseResult valueOf(int value) {
-      switch (value) {
-        case 0: return UNKNOWN_RESULT;
-        case 1: return TEST_CASE_RESULT_PASS;
-        case 2: return TEST_CASE_RESULT_FAIL;
-        case 3: return TEST_CASE_RESULT_SKIP;
-        case 4: return TEST_CASE_RESULT_EXCEPTION;
-        case 5: return TEST_CASE_RESULT_TIMEOUT;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<TestCaseResult>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static com.google.protobuf.Internal.EnumLiteMap<TestCaseResult>
-        internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<TestCaseResult>() {
-            public TestCaseResult findValueByNumber(int number) {
-              return TestCaseResult.valueOf(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.getDescriptor().getEnumTypes().get(0);
-    }
-
-    private static final TestCaseResult[] VALUES = values();
-
-    public static TestCaseResult valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int index;
-    private final int value;
-
-    private TestCaseResult(int index, int value) {
-      this.index = index;
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:android.vts.TestCaseResult)
-  }
-
-  /**
-   * Protobuf enum {@code android.vts.VtsTestType}
-   *
-   * <pre>
-   * To specify the VTS test type.
-   * </pre>
-   */
-  public enum VtsTestType
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKNOWN_VTS_TESTTYPE = 0;</code>
-     */
-    UNKNOWN_VTS_TESTTYPE(0, 0),
-    /**
-     * <code>VTS_HOST_DRIVEN_STRUCTURAL = 1;</code>
-     */
-    VTS_HOST_DRIVEN_STRUCTURAL(1, 1),
-    /**
-     * <code>VTS_HOST_DRIVEN_FUZZING = 2;</code>
-     */
-    VTS_HOST_DRIVEN_FUZZING(2, 2),
-    /**
-     * <code>VTS_TARGET_SIDE_GTEST = 3;</code>
-     */
-    VTS_TARGET_SIDE_GTEST(3, 3),
-    /**
-     * <code>VTS_TARGET_SIDE_FUZZING = 4;</code>
-     */
-    VTS_TARGET_SIDE_FUZZING(4, 4),
-    ;
-
-    /**
-     * <code>UNKNOWN_VTS_TESTTYPE = 0;</code>
-     */
-    public static final int UNKNOWN_VTS_TESTTYPE_VALUE = 0;
-    /**
-     * <code>VTS_HOST_DRIVEN_STRUCTURAL = 1;</code>
-     */
-    public static final int VTS_HOST_DRIVEN_STRUCTURAL_VALUE = 1;
-    /**
-     * <code>VTS_HOST_DRIVEN_FUZZING = 2;</code>
-     */
-    public static final int VTS_HOST_DRIVEN_FUZZING_VALUE = 2;
-    /**
-     * <code>VTS_TARGET_SIDE_GTEST = 3;</code>
-     */
-    public static final int VTS_TARGET_SIDE_GTEST_VALUE = 3;
-    /**
-     * <code>VTS_TARGET_SIDE_FUZZING = 4;</code>
-     */
-    public static final int VTS_TARGET_SIDE_FUZZING_VALUE = 4;
-
-
-    public final int getNumber() { return value; }
-
-    public static VtsTestType valueOf(int value) {
-      switch (value) {
-        case 0: return UNKNOWN_VTS_TESTTYPE;
-        case 1: return VTS_HOST_DRIVEN_STRUCTURAL;
-        case 2: return VTS_HOST_DRIVEN_FUZZING;
-        case 3: return VTS_TARGET_SIDE_GTEST;
-        case 4: return VTS_TARGET_SIDE_FUZZING;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<VtsTestType>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static com.google.protobuf.Internal.EnumLiteMap<VtsTestType>
-        internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<VtsTestType>() {
-            public VtsTestType findValueByNumber(int number) {
-              return VtsTestType.valueOf(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.getDescriptor().getEnumTypes().get(1);
-    }
-
-    private static final VtsTestType[] VALUES = values();
-
-    public static VtsTestType valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int index;
-    private final int value;
-
-    private VtsTestType(int index, int value) {
-      this.index = index;
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:android.vts.VtsTestType)
-  }
-
-  /**
-   * Protobuf enum {@code android.vts.VtsProfilingRegressionMode}
-   */
-  public enum VtsProfilingRegressionMode
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKNOWN_REGRESSION_MODE = 0;</code>
-     */
-    UNKNOWN_REGRESSION_MODE(0, 0),
-    /**
-     * <code>VTS_REGRESSION_MODE_DISABLED = 1;</code>
-     *
-     * <pre>
-     * disable analysis
-     * </pre>
-     */
-    VTS_REGRESSION_MODE_DISABLED(1, 1),
-    /**
-     * <code>VTS_REGRESSION_MODE_INCREASING = 2;</code>
-     *
-     * <pre>
-     * interpret increases in values as regression
-     * </pre>
-     */
-    VTS_REGRESSION_MODE_INCREASING(2, 2),
-    /**
-     * <code>VTS_REGRESSION_MODE_DECREASING = 3;</code>
-     *
-     * <pre>
-     * interpret decreases in values as regression
-     * </pre>
-     */
-    VTS_REGRESSION_MODE_DECREASING(3, 3),
-    ;
-
-    /**
-     * <code>UNKNOWN_REGRESSION_MODE = 0;</code>
-     */
-    public static final int UNKNOWN_REGRESSION_MODE_VALUE = 0;
-    /**
-     * <code>VTS_REGRESSION_MODE_DISABLED = 1;</code>
-     *
-     * <pre>
-     * disable analysis
-     * </pre>
-     */
-    public static final int VTS_REGRESSION_MODE_DISABLED_VALUE = 1;
-    /**
-     * <code>VTS_REGRESSION_MODE_INCREASING = 2;</code>
-     *
-     * <pre>
-     * interpret increases in values as regression
-     * </pre>
-     */
-    public static final int VTS_REGRESSION_MODE_INCREASING_VALUE = 2;
-    /**
-     * <code>VTS_REGRESSION_MODE_DECREASING = 3;</code>
-     *
-     * <pre>
-     * interpret decreases in values as regression
-     * </pre>
-     */
-    public static final int VTS_REGRESSION_MODE_DECREASING_VALUE = 3;
-
-
-    public final int getNumber() { return value; }
-
-    public static VtsProfilingRegressionMode valueOf(int value) {
-      switch (value) {
-        case 0: return UNKNOWN_REGRESSION_MODE;
-        case 1: return VTS_REGRESSION_MODE_DISABLED;
-        case 2: return VTS_REGRESSION_MODE_INCREASING;
-        case 3: return VTS_REGRESSION_MODE_DECREASING;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<VtsProfilingRegressionMode>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static com.google.protobuf.Internal.EnumLiteMap<VtsProfilingRegressionMode>
-        internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<VtsProfilingRegressionMode>() {
-            public VtsProfilingRegressionMode findValueByNumber(int number) {
-              return VtsProfilingRegressionMode.valueOf(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.getDescriptor().getEnumTypes().get(2);
-    }
-
-    private static final VtsProfilingRegressionMode[] VALUES = values();
-
-    public static VtsProfilingRegressionMode valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int index;
-    private final int value;
-
-    private VtsProfilingRegressionMode(int index, int value) {
-      this.index = index;
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:android.vts.VtsProfilingRegressionMode)
-  }
-
-  /**
-   * Protobuf enum {@code android.vts.VtsProfilingType}
-   */
-  public enum VtsProfilingType
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKNOWN_VTS_PROFILING_TYPE = 0;</code>
-     */
-    UNKNOWN_VTS_PROFILING_TYPE(0, 0),
-    /**
-     * <code>VTS_PROFILING_TYPE_TIMESTAMP = 1;</code>
-     *
-     * <pre>
-     * for one sample which measures the time between two profiling points.
-     * </pre>
-     */
-    VTS_PROFILING_TYPE_TIMESTAMP(1, 1),
-    /**
-     * <code>VTS_PROFILING_TYPE_LABELED_VECTOR = 2;</code>
-     *
-     * <pre>
-     * for multiple single-type samples with labels.
-     * </pre>
-     */
-    VTS_PROFILING_TYPE_LABELED_VECTOR(2, 2),
-    /**
-     * <code>VTS_PROFILING_TYPE_UNLABELED_VECTOR = 3;</code>
-     *
-     * <pre>
-     * for multiple single-type samples without labels.
-     * </pre>
-     */
-    VTS_PROFILING_TYPE_UNLABELED_VECTOR(3, 3),
-    ;
-
-    /**
-     * <code>UNKNOWN_VTS_PROFILING_TYPE = 0;</code>
-     */
-    public static final int UNKNOWN_VTS_PROFILING_TYPE_VALUE = 0;
-    /**
-     * <code>VTS_PROFILING_TYPE_TIMESTAMP = 1;</code>
-     *
-     * <pre>
-     * for one sample which measures the time between two profiling points.
-     * </pre>
-     */
-    public static final int VTS_PROFILING_TYPE_TIMESTAMP_VALUE = 1;
-    /**
-     * <code>VTS_PROFILING_TYPE_LABELED_VECTOR = 2;</code>
-     *
-     * <pre>
-     * for multiple single-type samples with labels.
-     * </pre>
-     */
-    public static final int VTS_PROFILING_TYPE_LABELED_VECTOR_VALUE = 2;
-    /**
-     * <code>VTS_PROFILING_TYPE_UNLABELED_VECTOR = 3;</code>
-     *
-     * <pre>
-     * for multiple single-type samples without labels.
-     * </pre>
-     */
-    public static final int VTS_PROFILING_TYPE_UNLABELED_VECTOR_VALUE = 3;
-
-
-    public final int getNumber() { return value; }
-
-    public static VtsProfilingType valueOf(int value) {
-      switch (value) {
-        case 0: return UNKNOWN_VTS_PROFILING_TYPE;
-        case 1: return VTS_PROFILING_TYPE_TIMESTAMP;
-        case 2: return VTS_PROFILING_TYPE_LABELED_VECTOR;
-        case 3: return VTS_PROFILING_TYPE_UNLABELED_VECTOR;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<VtsProfilingType>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static com.google.protobuf.Internal.EnumLiteMap<VtsProfilingType>
-        internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<VtsProfilingType>() {
-            public VtsProfilingType findValueByNumber(int number) {
-              return VtsProfilingType.valueOf(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.getDescriptor().getEnumTypes().get(3);
-    }
-
-    private static final VtsProfilingType[] VALUES = values();
-
-    public static VtsProfilingType valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int index;
-    private final int value;
-
-    private VtsProfilingType(int index, int value) {
-      this.index = index;
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:android.vts.VtsProfilingType)
-  }
-
-  public interface AndroidDeviceInfoMessageOrBuilder
-      extends com.google.protobuf.MessageOrBuilder {
-
-    // optional bytes product_type = 1;
-    /**
-     * <code>optional bytes product_type = 1;</code>
-     *
-     * <pre>
-     * product type (e.g., bullhead).
-     * </pre>
-     */
-    boolean hasProductType();
-    /**
-     * <code>optional bytes product_type = 1;</code>
-     *
-     * <pre>
-     * product type (e.g., bullhead).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getProductType();
-
-    // optional bytes product_variant = 2;
-    /**
-     * <code>optional bytes product_variant = 2;</code>
-     *
-     * <pre>
-     * product type variant (e.g., still bullhead or another name).
-     * </pre>
-     */
-    boolean hasProductVariant();
-    /**
-     * <code>optional bytes product_variant = 2;</code>
-     *
-     * <pre>
-     * product type variant (e.g., still bullhead or another name).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getProductVariant();
-
-    // optional bytes build_flavor = 11;
-    /**
-     * <code>optional bytes build_flavor = 11;</code>
-     *
-     * <pre>
-     * build type (e.g., userdebug).
-     * </pre>
-     */
-    boolean hasBuildFlavor();
-    /**
-     * <code>optional bytes build_flavor = 11;</code>
-     *
-     * <pre>
-     * build type (e.g., userdebug).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getBuildFlavor();
-
-    // optional bytes build_id = 12;
-    /**
-     * <code>optional bytes build_id = 12;</code>
-     *
-     * <pre>
-     * Android Build ID.
-     * </pre>
-     */
-    boolean hasBuildId();
-    /**
-     * <code>optional bytes build_id = 12;</code>
-     *
-     * <pre>
-     * Android Build ID.
-     * </pre>
-     */
-    com.google.protobuf.ByteString getBuildId();
-
-    // optional bytes branch = 21;
-    /**
-     * <code>optional bytes branch = 21;</code>
-     *
-     * <pre>
-     * branch name (e.g., master or nyc-dev).
-     * </pre>
-     */
-    boolean hasBranch();
-    /**
-     * <code>optional bytes branch = 21;</code>
-     *
-     * <pre>
-     * branch name (e.g., master or nyc-dev).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getBranch();
-
-    // optional bytes build_alias = 22;
-    /**
-     * <code>optional bytes build_alias = 22;</code>
-     *
-     * <pre>
-     * build alias implies the branch name.
-     * </pre>
-     */
-    boolean hasBuildAlias();
-    /**
-     * <code>optional bytes build_alias = 22;</code>
-     *
-     * <pre>
-     * build alias implies the branch name.
-     * </pre>
-     */
-    com.google.protobuf.ByteString getBuildAlias();
-
-    // optional bytes api_level = 31;
-    /**
-     * <code>optional bytes api_level = 31;</code>
-     *
-     * <pre>
-     * API level
-     * </pre>
-     */
-    boolean hasApiLevel();
-    /**
-     * <code>optional bytes api_level = 31;</code>
-     *
-     * <pre>
-     * API level
-     * </pre>
-     */
-    com.google.protobuf.ByteString getApiLevel();
-
-    // optional bytes abi_name = 51;
-    /**
-     * <code>optional bytes abi_name = 51;</code>
-     *
-     * <pre>
-     * ABI name that is current in use for the test
-     * </pre>
-     */
-    boolean hasAbiName();
-    /**
-     * <code>optional bytes abi_name = 51;</code>
-     *
-     * <pre>
-     * ABI name that is current in use for the test
-     * </pre>
-     */
-    com.google.protobuf.ByteString getAbiName();
-
-    // optional bytes abi_bitness = 52;
-    /**
-     * <code>optional bytes abi_bitness = 52;</code>
-     *
-     * <pre>
-     * ABI bitness that is current in use for the test. Example: '32', '64',
-     * </pre>
-     */
-    boolean hasAbiBitness();
-    /**
-     * <code>optional bytes abi_bitness = 52;</code>
-     *
-     * <pre>
-     * ABI bitness that is current in use for the test. Example: '32', '64',
-     * </pre>
-     */
-    com.google.protobuf.ByteString getAbiBitness();
-
-    // optional bytes serial = 101;
-    /**
-     * <code>optional bytes serial = 101;</code>
-     *
-     * <pre>
-     * Device USB serial number
-     * </pre>
-     */
-    boolean hasSerial();
-    /**
-     * <code>optional bytes serial = 101;</code>
-     *
-     * <pre>
-     * Device USB serial number
-     * </pre>
-     */
-    com.google.protobuf.ByteString getSerial();
-  }
-  /**
-   * Protobuf type {@code android.vts.AndroidDeviceInfoMessage}
-   *
-   * <pre>
-   * To specify a call flow event.
-   * </pre>
-   */
-  public static final class AndroidDeviceInfoMessage extends
-      com.google.protobuf.GeneratedMessage
-      implements AndroidDeviceInfoMessageOrBuilder {
-    // Use AndroidDeviceInfoMessage.newBuilder() to construct.
-    private AndroidDeviceInfoMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-      super(builder);
-      this.unknownFields = builder.getUnknownFields();
-    }
-    private AndroidDeviceInfoMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
-
-    private static final AndroidDeviceInfoMessage defaultInstance;
-    public static AndroidDeviceInfoMessage getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public AndroidDeviceInfoMessage getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-    private final com.google.protobuf.UnknownFieldSet unknownFields;
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-        getUnknownFields() {
-      return this.unknownFields;
-    }
-    private AndroidDeviceInfoMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      initFields();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              productType_ = input.readBytes();
-              break;
-            }
-            case 18: {
-              bitField0_ |= 0x00000002;
-              productVariant_ = input.readBytes();
-              break;
-            }
-            case 90: {
-              bitField0_ |= 0x00000004;
-              buildFlavor_ = input.readBytes();
-              break;
-            }
-            case 98: {
-              bitField0_ |= 0x00000008;
-              buildId_ = input.readBytes();
-              break;
-            }
-            case 170: {
-              bitField0_ |= 0x00000010;
-              branch_ = input.readBytes();
-              break;
-            }
-            case 178: {
-              bitField0_ |= 0x00000020;
-              buildAlias_ = input.readBytes();
-              break;
-            }
-            case 250: {
-              bitField0_ |= 0x00000040;
-              apiLevel_ = input.readBytes();
-              break;
-            }
-            case 410: {
-              bitField0_ |= 0x00000080;
-              abiName_ = input.readBytes();
-              break;
-            }
-            case 418: {
-              bitField0_ |= 0x00000100;
-              abiBitness_ = input.readBytes();
-              break;
-            }
-            case 810: {
-              bitField0_ |= 0x00000200;
-              serial_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.class, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder.class);
-    }
-
-    public static com.google.protobuf.Parser<AndroidDeviceInfoMessage> PARSER =
-        new com.google.protobuf.AbstractParser<AndroidDeviceInfoMessage>() {
-      public AndroidDeviceInfoMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new AndroidDeviceInfoMessage(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<AndroidDeviceInfoMessage> getParserForType() {
-      return PARSER;
-    }
-
-    private int bitField0_;
-    // optional bytes product_type = 1;
-    public static final int PRODUCT_TYPE_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString productType_;
-    /**
-     * <code>optional bytes product_type = 1;</code>
-     *
-     * <pre>
-     * product type (e.g., bullhead).
-     * </pre>
-     */
-    public boolean hasProductType() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <code>optional bytes product_type = 1;</code>
-     *
-     * <pre>
-     * product type (e.g., bullhead).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getProductType() {
-      return productType_;
-    }
-
-    // optional bytes product_variant = 2;
-    public static final int PRODUCT_VARIANT_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString productVariant_;
-    /**
-     * <code>optional bytes product_variant = 2;</code>
-     *
-     * <pre>
-     * product type variant (e.g., still bullhead or another name).
-     * </pre>
-     */
-    public boolean hasProductVariant() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <code>optional bytes product_variant = 2;</code>
-     *
-     * <pre>
-     * product type variant (e.g., still bullhead or another name).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getProductVariant() {
-      return productVariant_;
-    }
-
-    // optional bytes build_flavor = 11;
-    public static final int BUILD_FLAVOR_FIELD_NUMBER = 11;
-    private com.google.protobuf.ByteString buildFlavor_;
-    /**
-     * <code>optional bytes build_flavor = 11;</code>
-     *
-     * <pre>
-     * build type (e.g., userdebug).
-     * </pre>
-     */
-    public boolean hasBuildFlavor() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <code>optional bytes build_flavor = 11;</code>
-     *
-     * <pre>
-     * build type (e.g., userdebug).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getBuildFlavor() {
-      return buildFlavor_;
-    }
-
-    // optional bytes build_id = 12;
-    public static final int BUILD_ID_FIELD_NUMBER = 12;
-    private com.google.protobuf.ByteString buildId_;
-    /**
-     * <code>optional bytes build_id = 12;</code>
-     *
-     * <pre>
-     * Android Build ID.
-     * </pre>
-     */
-    public boolean hasBuildId() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <code>optional bytes build_id = 12;</code>
-     *
-     * <pre>
-     * Android Build ID.
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getBuildId() {
-      return buildId_;
-    }
-
-    // optional bytes branch = 21;
-    public static final int BRANCH_FIELD_NUMBER = 21;
-    private com.google.protobuf.ByteString branch_;
-    /**
-     * <code>optional bytes branch = 21;</code>
-     *
-     * <pre>
-     * branch name (e.g., master or nyc-dev).
-     * </pre>
-     */
-    public boolean hasBranch() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <code>optional bytes branch = 21;</code>
-     *
-     * <pre>
-     * branch name (e.g., master or nyc-dev).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getBranch() {
-      return branch_;
-    }
-
-    // optional bytes build_alias = 22;
-    public static final int BUILD_ALIAS_FIELD_NUMBER = 22;
-    private com.google.protobuf.ByteString buildAlias_;
-    /**
-     * <code>optional bytes build_alias = 22;</code>
-     *
-     * <pre>
-     * build alias implies the branch name.
-     * </pre>
-     */
-    public boolean hasBuildAlias() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
-    }
-    /**
-     * <code>optional bytes build_alias = 22;</code>
-     *
-     * <pre>
-     * build alias implies the branch name.
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getBuildAlias() {
-      return buildAlias_;
-    }
-
-    // optional bytes api_level = 31;
-    public static final int API_LEVEL_FIELD_NUMBER = 31;
-    private com.google.protobuf.ByteString apiLevel_;
-    /**
-     * <code>optional bytes api_level = 31;</code>
-     *
-     * <pre>
-     * API level
-     * </pre>
-     */
-    public boolean hasApiLevel() {
-      return ((bitField0_ & 0x00000040) == 0x00000040);
-    }
-    /**
-     * <code>optional bytes api_level = 31;</code>
-     *
-     * <pre>
-     * API level
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getApiLevel() {
-      return apiLevel_;
-    }
-
-    // optional bytes abi_name = 51;
-    public static final int ABI_NAME_FIELD_NUMBER = 51;
-    private com.google.protobuf.ByteString abiName_;
-    /**
-     * <code>optional bytes abi_name = 51;</code>
-     *
-     * <pre>
-     * ABI name that is current in use for the test
-     * </pre>
-     */
-    public boolean hasAbiName() {
-      return ((bitField0_ & 0x00000080) == 0x00000080);
-    }
-    /**
-     * <code>optional bytes abi_name = 51;</code>
-     *
-     * <pre>
-     * ABI name that is current in use for the test
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getAbiName() {
-      return abiName_;
-    }
-
-    // optional bytes abi_bitness = 52;
-    public static final int ABI_BITNESS_FIELD_NUMBER = 52;
-    private com.google.protobuf.ByteString abiBitness_;
-    /**
-     * <code>optional bytes abi_bitness = 52;</code>
-     *
-     * <pre>
-     * ABI bitness that is current in use for the test. Example: '32', '64',
-     * </pre>
-     */
-    public boolean hasAbiBitness() {
-      return ((bitField0_ & 0x00000100) == 0x00000100);
-    }
-    /**
-     * <code>optional bytes abi_bitness = 52;</code>
-     *
-     * <pre>
-     * ABI bitness that is current in use for the test. Example: '32', '64',
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getAbiBitness() {
-      return abiBitness_;
-    }
-
-    // optional bytes serial = 101;
-    public static final int SERIAL_FIELD_NUMBER = 101;
-    private com.google.protobuf.ByteString serial_;
-    /**
-     * <code>optional bytes serial = 101;</code>
-     *
-     * <pre>
-     * Device USB serial number
-     * </pre>
-     */
-    public boolean hasSerial() {
-      return ((bitField0_ & 0x00000200) == 0x00000200);
-    }
-    /**
-     * <code>optional bytes serial = 101;</code>
-     *
-     * <pre>
-     * Device USB serial number
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getSerial() {
-      return serial_;
-    }
-
-    private void initFields() {
-      productType_ = com.google.protobuf.ByteString.EMPTY;
-      productVariant_ = com.google.protobuf.ByteString.EMPTY;
-      buildFlavor_ = com.google.protobuf.ByteString.EMPTY;
-      buildId_ = com.google.protobuf.ByteString.EMPTY;
-      branch_ = com.google.protobuf.ByteString.EMPTY;
-      buildAlias_ = com.google.protobuf.ByteString.EMPTY;
-      apiLevel_ = com.google.protobuf.ByteString.EMPTY;
-      abiName_ = com.google.protobuf.ByteString.EMPTY;
-      abiBitness_ = com.google.protobuf.ByteString.EMPTY;
-      serial_ = com.google.protobuf.ByteString.EMPTY;
-    }
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized != -1) return isInitialized == 1;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, productType_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(2, productVariant_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(11, buildFlavor_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeBytes(12, buildId_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeBytes(21, branch_);
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        output.writeBytes(22, buildAlias_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        output.writeBytes(31, apiLevel_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        output.writeBytes(51, abiName_);
-      }
-      if (((bitField0_ & 0x00000100) == 0x00000100)) {
-        output.writeBytes(52, abiBitness_);
-      }
-      if (((bitField0_ & 0x00000200) == 0x00000200)) {
-        output.writeBytes(101, serial_);
-      }
-      getUnknownFields().writeTo(output);
-    }
-
-    private int memoizedSerializedSize = -1;
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, productType_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, productVariant_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(11, buildFlavor_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(12, buildId_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(21, branch_);
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(22, buildAlias_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(31, apiLevel_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(51, abiName_);
-      }
-      if (((bitField0_ & 0x00000100) == 0x00000100)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(52, abiBitness_);
-      }
-      if (((bitField0_ & 0x00000200) == 0x00000200)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(101, serial_);
-      }
-      size += getUnknownFields().getSerializedSize();
-      memoizedSerializedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    protected java.lang.Object writeReplace()
-        throws java.io.ObjectStreamException {
-      return super.writeReplace();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-
-    public static Builder newBuilder() { return Builder.create(); }
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() { return newBuilder(this); }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code android.vts.AndroidDeviceInfoMessage}
-     *
-     * <pre>
-     * To specify a call flow event.
-     * </pre>
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessage.Builder<Builder>
-       implements com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.class, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-        }
-      }
-      private static Builder create() {
-        return new Builder();
-      }
-
-      public Builder clear() {
-        super.clear();
-        productType_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        productVariant_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        buildFlavor_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        buildId_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        branch_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        buildAlias_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000020);
-        apiLevel_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000040);
-        abiName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000080);
-        abiBitness_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000100);
-        serial_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000200);
-        return this;
-      }
-
-      public Builder clone() {
-        return create().mergeFrom(buildPartial());
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage build() {
-        com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage result = new com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.productType_ = productType_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.productVariant_ = productVariant_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.buildFlavor_ = buildFlavor_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.buildId_ = buildId_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.branch_ = branch_;
-        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
-          to_bitField0_ |= 0x00000020;
-        }
-        result.buildAlias_ = buildAlias_;
-        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
-          to_bitField0_ |= 0x00000040;
-        }
-        result.apiLevel_ = apiLevel_;
-        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
-          to_bitField0_ |= 0x00000080;
-        }
-        result.abiName_ = abiName_;
-        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
-          to_bitField0_ |= 0x00000100;
-        }
-        result.abiBitness_ = abiBitness_;
-        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
-          to_bitField0_ |= 0x00000200;
-        }
-        result.serial_ = serial_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.getDefaultInstance()) return this;
-        if (other.hasProductType()) {
-          setProductType(other.getProductType());
-        }
-        if (other.hasProductVariant()) {
-          setProductVariant(other.getProductVariant());
-        }
-        if (other.hasBuildFlavor()) {
-          setBuildFlavor(other.getBuildFlavor());
-        }
-        if (other.hasBuildId()) {
-          setBuildId(other.getBuildId());
-        }
-        if (other.hasBranch()) {
-          setBranch(other.getBranch());
-        }
-        if (other.hasBuildAlias()) {
-          setBuildAlias(other.getBuildAlias());
-        }
-        if (other.hasApiLevel()) {
-          setApiLevel(other.getApiLevel());
-        }
-        if (other.hasAbiName()) {
-          setAbiName(other.getAbiName());
-        }
-        if (other.hasAbiBitness()) {
-          setAbiBitness(other.getAbiBitness());
-        }
-        if (other.hasSerial()) {
-          setSerial(other.getSerial());
-        }
-        this.mergeUnknownFields(other.getUnknownFields());
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage) e.getUnfinishedMessage();
-          throw e;
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      // optional bytes product_type = 1;
-      private com.google.protobuf.ByteString productType_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes product_type = 1;</code>
-       *
-       * <pre>
-       * product type (e.g., bullhead).
-       * </pre>
-       */
-      public boolean hasProductType() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes product_type = 1;</code>
-       *
-       * <pre>
-       * product type (e.g., bullhead).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getProductType() {
-        return productType_;
-      }
-      /**
-       * <code>optional bytes product_type = 1;</code>
-       *
-       * <pre>
-       * product type (e.g., bullhead).
-       * </pre>
-       */
-      public Builder setProductType(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        productType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes product_type = 1;</code>
-       *
-       * <pre>
-       * product type (e.g., bullhead).
-       * </pre>
-       */
-      public Builder clearProductType() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        productType_ = getDefaultInstance().getProductType();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes product_variant = 2;
-      private com.google.protobuf.ByteString productVariant_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes product_variant = 2;</code>
-       *
-       * <pre>
-       * product type variant (e.g., still bullhead or another name).
-       * </pre>
-       */
-      public boolean hasProductVariant() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional bytes product_variant = 2;</code>
-       *
-       * <pre>
-       * product type variant (e.g., still bullhead or another name).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getProductVariant() {
-        return productVariant_;
-      }
-      /**
-       * <code>optional bytes product_variant = 2;</code>
-       *
-       * <pre>
-       * product type variant (e.g., still bullhead or another name).
-       * </pre>
-       */
-      public Builder setProductVariant(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        productVariant_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes product_variant = 2;</code>
-       *
-       * <pre>
-       * product type variant (e.g., still bullhead or another name).
-       * </pre>
-       */
-      public Builder clearProductVariant() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        productVariant_ = getDefaultInstance().getProductVariant();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes build_flavor = 11;
-      private com.google.protobuf.ByteString buildFlavor_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes build_flavor = 11;</code>
-       *
-       * <pre>
-       * build type (e.g., userdebug).
-       * </pre>
-       */
-      public boolean hasBuildFlavor() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional bytes build_flavor = 11;</code>
-       *
-       * <pre>
-       * build type (e.g., userdebug).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getBuildFlavor() {
-        return buildFlavor_;
-      }
-      /**
-       * <code>optional bytes build_flavor = 11;</code>
-       *
-       * <pre>
-       * build type (e.g., userdebug).
-       * </pre>
-       */
-      public Builder setBuildFlavor(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        buildFlavor_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes build_flavor = 11;</code>
-       *
-       * <pre>
-       * build type (e.g., userdebug).
-       * </pre>
-       */
-      public Builder clearBuildFlavor() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        buildFlavor_ = getDefaultInstance().getBuildFlavor();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes build_id = 12;
-      private com.google.protobuf.ByteString buildId_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes build_id = 12;</code>
-       *
-       * <pre>
-       * Android Build ID.
-       * </pre>
-       */
-      public boolean hasBuildId() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <code>optional bytes build_id = 12;</code>
-       *
-       * <pre>
-       * Android Build ID.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getBuildId() {
-        return buildId_;
-      }
-      /**
-       * <code>optional bytes build_id = 12;</code>
-       *
-       * <pre>
-       * Android Build ID.
-       * </pre>
-       */
-      public Builder setBuildId(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000008;
-        buildId_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes build_id = 12;</code>
-       *
-       * <pre>
-       * Android Build ID.
-       * </pre>
-       */
-      public Builder clearBuildId() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        buildId_ = getDefaultInstance().getBuildId();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes branch = 21;
-      private com.google.protobuf.ByteString branch_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes branch = 21;</code>
-       *
-       * <pre>
-       * branch name (e.g., master or nyc-dev).
-       * </pre>
-       */
-      public boolean hasBranch() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <code>optional bytes branch = 21;</code>
-       *
-       * <pre>
-       * branch name (e.g., master or nyc-dev).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getBranch() {
-        return branch_;
-      }
-      /**
-       * <code>optional bytes branch = 21;</code>
-       *
-       * <pre>
-       * branch name (e.g., master or nyc-dev).
-       * </pre>
-       */
-      public Builder setBranch(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000010;
-        branch_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes branch = 21;</code>
-       *
-       * <pre>
-       * branch name (e.g., master or nyc-dev).
-       * </pre>
-       */
-      public Builder clearBranch() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        branch_ = getDefaultInstance().getBranch();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes build_alias = 22;
-      private com.google.protobuf.ByteString buildAlias_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes build_alias = 22;</code>
-       *
-       * <pre>
-       * build alias implies the branch name.
-       * </pre>
-       */
-      public boolean hasBuildAlias() {
-        return ((bitField0_ & 0x00000020) == 0x00000020);
-      }
-      /**
-       * <code>optional bytes build_alias = 22;</code>
-       *
-       * <pre>
-       * build alias implies the branch name.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getBuildAlias() {
-        return buildAlias_;
-      }
-      /**
-       * <code>optional bytes build_alias = 22;</code>
-       *
-       * <pre>
-       * build alias implies the branch name.
-       * </pre>
-       */
-      public Builder setBuildAlias(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000020;
-        buildAlias_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes build_alias = 22;</code>
-       *
-       * <pre>
-       * build alias implies the branch name.
-       * </pre>
-       */
-      public Builder clearBuildAlias() {
-        bitField0_ = (bitField0_ & ~0x00000020);
-        buildAlias_ = getDefaultInstance().getBuildAlias();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes api_level = 31;
-      private com.google.protobuf.ByteString apiLevel_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes api_level = 31;</code>
-       *
-       * <pre>
-       * API level
-       * </pre>
-       */
-      public boolean hasApiLevel() {
-        return ((bitField0_ & 0x00000040) == 0x00000040);
-      }
-      /**
-       * <code>optional bytes api_level = 31;</code>
-       *
-       * <pre>
-       * API level
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getApiLevel() {
-        return apiLevel_;
-      }
-      /**
-       * <code>optional bytes api_level = 31;</code>
-       *
-       * <pre>
-       * API level
-       * </pre>
-       */
-      public Builder setApiLevel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000040;
-        apiLevel_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes api_level = 31;</code>
-       *
-       * <pre>
-       * API level
-       * </pre>
-       */
-      public Builder clearApiLevel() {
-        bitField0_ = (bitField0_ & ~0x00000040);
-        apiLevel_ = getDefaultInstance().getApiLevel();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes abi_name = 51;
-      private com.google.protobuf.ByteString abiName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes abi_name = 51;</code>
-       *
-       * <pre>
-       * ABI name that is current in use for the test
-       * </pre>
-       */
-      public boolean hasAbiName() {
-        return ((bitField0_ & 0x00000080) == 0x00000080);
-      }
-      /**
-       * <code>optional bytes abi_name = 51;</code>
-       *
-       * <pre>
-       * ABI name that is current in use for the test
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getAbiName() {
-        return abiName_;
-      }
-      /**
-       * <code>optional bytes abi_name = 51;</code>
-       *
-       * <pre>
-       * ABI name that is current in use for the test
-       * </pre>
-       */
-      public Builder setAbiName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000080;
-        abiName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes abi_name = 51;</code>
-       *
-       * <pre>
-       * ABI name that is current in use for the test
-       * </pre>
-       */
-      public Builder clearAbiName() {
-        bitField0_ = (bitField0_ & ~0x00000080);
-        abiName_ = getDefaultInstance().getAbiName();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes abi_bitness = 52;
-      private com.google.protobuf.ByteString abiBitness_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes abi_bitness = 52;</code>
-       *
-       * <pre>
-       * ABI bitness that is current in use for the test. Example: '32', '64',
-       * </pre>
-       */
-      public boolean hasAbiBitness() {
-        return ((bitField0_ & 0x00000100) == 0x00000100);
-      }
-      /**
-       * <code>optional bytes abi_bitness = 52;</code>
-       *
-       * <pre>
-       * ABI bitness that is current in use for the test. Example: '32', '64',
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getAbiBitness() {
-        return abiBitness_;
-      }
-      /**
-       * <code>optional bytes abi_bitness = 52;</code>
-       *
-       * <pre>
-       * ABI bitness that is current in use for the test. Example: '32', '64',
-       * </pre>
-       */
-      public Builder setAbiBitness(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000100;
-        abiBitness_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes abi_bitness = 52;</code>
-       *
-       * <pre>
-       * ABI bitness that is current in use for the test. Example: '32', '64',
-       * </pre>
-       */
-      public Builder clearAbiBitness() {
-        bitField0_ = (bitField0_ & ~0x00000100);
-        abiBitness_ = getDefaultInstance().getAbiBitness();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes serial = 101;
-      private com.google.protobuf.ByteString serial_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes serial = 101;</code>
-       *
-       * <pre>
-       * Device USB serial number
-       * </pre>
-       */
-      public boolean hasSerial() {
-        return ((bitField0_ & 0x00000200) == 0x00000200);
-      }
-      /**
-       * <code>optional bytes serial = 101;</code>
-       *
-       * <pre>
-       * Device USB serial number
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getSerial() {
-        return serial_;
-      }
-      /**
-       * <code>optional bytes serial = 101;</code>
-       *
-       * <pre>
-       * Device USB serial number
-       * </pre>
-       */
-      public Builder setSerial(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000200;
-        serial_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes serial = 101;</code>
-       *
-       * <pre>
-       * Device USB serial number
-       * </pre>
-       */
-      public Builder clearSerial() {
-        bitField0_ = (bitField0_ & ~0x00000200);
-        serial_ = getDefaultInstance().getSerial();
-        onChanged();
-        return this;
-      }
-
-      // @@protoc_insertion_point(builder_scope:android.vts.AndroidDeviceInfoMessage)
-    }
-
-    static {
-      defaultInstance = new AndroidDeviceInfoMessage(true);
-      defaultInstance.initFields();
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.AndroidDeviceInfoMessage)
-  }
-
-  public interface AndroidBuildInfoOrBuilder
-      extends com.google.protobuf.MessageOrBuilder {
-
-    // optional bytes id = 1;
-    /**
-     * <code>optional bytes id = 1;</code>
-     *
-     * <pre>
-     * build ID.
-     * </pre>
-     */
-    boolean hasId();
-    /**
-     * <code>optional bytes id = 1;</code>
-     *
-     * <pre>
-     * build ID.
-     * </pre>
-     */
-    com.google.protobuf.ByteString getId();
-
-    // optional bytes name = 11;
-    /**
-     * <code>optional bytes name = 11;</code>
-     *
-     * <pre>
-     * device name (e.g., bullhead).
-     * </pre>
-     */
-    boolean hasName();
-    /**
-     * <code>optional bytes name = 11;</code>
-     *
-     * <pre>
-     * device name (e.g., bullhead).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getName();
-
-    // optional bytes build_type = 12;
-    /**
-     * <code>optional bytes build_type = 12;</code>
-     *
-     * <pre>
-     * build type (e.g., userdebug)
-     * </pre>
-     */
-    boolean hasBuildType();
-    /**
-     * <code>optional bytes build_type = 12;</code>
-     *
-     * <pre>
-     * build type (e.g., userdebug)
-     * </pre>
-     */
-    com.google.protobuf.ByteString getBuildType();
-
-    // optional bytes branch = 13;
-    /**
-     * <code>optional bytes branch = 13;</code>
-     *
-     * <pre>
-     * branch name (e.g., master or nyc-dev)
-     * </pre>
-     */
-    boolean hasBranch();
-    /**
-     * <code>optional bytes branch = 13;</code>
-     *
-     * <pre>
-     * branch name (e.g., master or nyc-dev)
-     * </pre>
-     */
-    com.google.protobuf.ByteString getBranch();
-
-    // optional bytes build_summary = 21;
-    /**
-     * <code>optional bytes build_summary = 21;</code>
-     *
-     * <pre>
-     * indicates the latest commit information of each branch (e.g., xml format).
-     * </pre>
-     */
-    boolean hasBuildSummary();
-    /**
-     * <code>optional bytes build_summary = 21;</code>
-     *
-     * <pre>
-     * indicates the latest commit information of each branch (e.g., xml format).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getBuildSummary();
-  }
-  /**
-   * Protobuf type {@code android.vts.AndroidBuildInfo}
-   *
-   * <pre>
-   * To specify build info.
-   * </pre>
-   */
-  public static final class AndroidBuildInfo extends
-      com.google.protobuf.GeneratedMessage
-      implements AndroidBuildInfoOrBuilder {
-    // Use AndroidBuildInfo.newBuilder() to construct.
-    private AndroidBuildInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-      super(builder);
-      this.unknownFields = builder.getUnknownFields();
-    }
-    private AndroidBuildInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
-
-    private static final AndroidBuildInfo defaultInstance;
-    public static AndroidBuildInfo getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public AndroidBuildInfo getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-    private final com.google.protobuf.UnknownFieldSet unknownFields;
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-        getUnknownFields() {
-      return this.unknownFields;
-    }
-    private AndroidBuildInfo(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      initFields();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              id_ = input.readBytes();
-              break;
-            }
-            case 90: {
-              bitField0_ |= 0x00000002;
-              name_ = input.readBytes();
-              break;
-            }
-            case 98: {
-              bitField0_ |= 0x00000004;
-              buildType_ = input.readBytes();
-              break;
-            }
-            case 106: {
-              bitField0_ |= 0x00000008;
-              branch_ = input.readBytes();
-              break;
-            }
-            case 170: {
-              bitField0_ |= 0x00000010;
-              buildSummary_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.class, com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder.class);
-    }
-
-    public static com.google.protobuf.Parser<AndroidBuildInfo> PARSER =
-        new com.google.protobuf.AbstractParser<AndroidBuildInfo>() {
-      public AndroidBuildInfo parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new AndroidBuildInfo(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<AndroidBuildInfo> getParserForType() {
-      return PARSER;
-    }
-
-    private int bitField0_;
-    // optional bytes id = 1;
-    public static final int ID_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString id_;
-    /**
-     * <code>optional bytes id = 1;</code>
-     *
-     * <pre>
-     * build ID.
-     * </pre>
-     */
-    public boolean hasId() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <code>optional bytes id = 1;</code>
-     *
-     * <pre>
-     * build ID.
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getId() {
-      return id_;
-    }
-
-    // optional bytes name = 11;
-    public static final int NAME_FIELD_NUMBER = 11;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <code>optional bytes name = 11;</code>
-     *
-     * <pre>
-     * device name (e.g., bullhead).
-     * </pre>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <code>optional bytes name = 11;</code>
-     *
-     * <pre>
-     * device name (e.g., bullhead).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    // optional bytes build_type = 12;
-    public static final int BUILD_TYPE_FIELD_NUMBER = 12;
-    private com.google.protobuf.ByteString buildType_;
-    /**
-     * <code>optional bytes build_type = 12;</code>
-     *
-     * <pre>
-     * build type (e.g., userdebug)
-     * </pre>
-     */
-    public boolean hasBuildType() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <code>optional bytes build_type = 12;</code>
-     *
-     * <pre>
-     * build type (e.g., userdebug)
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getBuildType() {
-      return buildType_;
-    }
-
-    // optional bytes branch = 13;
-    public static final int BRANCH_FIELD_NUMBER = 13;
-    private com.google.protobuf.ByteString branch_;
-    /**
-     * <code>optional bytes branch = 13;</code>
-     *
-     * <pre>
-     * branch name (e.g., master or nyc-dev)
-     * </pre>
-     */
-    public boolean hasBranch() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <code>optional bytes branch = 13;</code>
-     *
-     * <pre>
-     * branch name (e.g., master or nyc-dev)
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getBranch() {
-      return branch_;
-    }
-
-    // optional bytes build_summary = 21;
-    public static final int BUILD_SUMMARY_FIELD_NUMBER = 21;
-    private com.google.protobuf.ByteString buildSummary_;
-    /**
-     * <code>optional bytes build_summary = 21;</code>
-     *
-     * <pre>
-     * indicates the latest commit information of each branch (e.g., xml format).
-     * </pre>
-     */
-    public boolean hasBuildSummary() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <code>optional bytes build_summary = 21;</code>
-     *
-     * <pre>
-     * indicates the latest commit information of each branch (e.g., xml format).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getBuildSummary() {
-      return buildSummary_;
-    }
-
-    private void initFields() {
-      id_ = com.google.protobuf.ByteString.EMPTY;
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      buildType_ = com.google.protobuf.ByteString.EMPTY;
-      branch_ = com.google.protobuf.ByteString.EMPTY;
-      buildSummary_ = com.google.protobuf.ByteString.EMPTY;
-    }
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized != -1) return isInitialized == 1;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, id_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(11, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(12, buildType_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeBytes(13, branch_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeBytes(21, buildSummary_);
-      }
-      getUnknownFields().writeTo(output);
-    }
-
-    private int memoizedSerializedSize = -1;
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, id_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(11, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(12, buildType_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(13, branch_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(21, buildSummary_);
-      }
-      size += getUnknownFields().getSerializedSize();
-      memoizedSerializedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    protected java.lang.Object writeReplace()
-        throws java.io.ObjectStreamException {
-      return super.writeReplace();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-
-    public static Builder newBuilder() { return Builder.create(); }
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.AndroidBuildInfo prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() { return newBuilder(this); }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code android.vts.AndroidBuildInfo}
-     *
-     * <pre>
-     * To specify build info.
-     * </pre>
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessage.Builder<Builder>
-       implements com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.class, com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-        }
-      }
-      private static Builder create() {
-        return new Builder();
-      }
-
-      public Builder clear() {
-        super.clear();
-        id_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        buildType_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        branch_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        buildSummary_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        return this;
-      }
-
-      public Builder clone() {
-        return create().mergeFrom(buildPartial());
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo build() {
-        com.android.vts.proto.VtsReportMessage.AndroidBuildInfo result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo buildPartial() {
-        com.android.vts.proto.VtsReportMessage.AndroidBuildInfo result = new com.android.vts.proto.VtsReportMessage.AndroidBuildInfo(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.id_ = id_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.buildType_ = buildType_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.branch_ = branch_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.buildSummary_ = buildSummary_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.AndroidBuildInfo) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.AndroidBuildInfo)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.AndroidBuildInfo other) {
-        if (other == com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance()) return this;
-        if (other.hasId()) {
-          setId(other.getId());
-        }
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasBuildType()) {
-          setBuildType(other.getBuildType());
-        }
-        if (other.hasBranch()) {
-          setBranch(other.getBranch());
-        }
-        if (other.hasBuildSummary()) {
-          setBuildSummary(other.getBuildSummary());
-        }
-        this.mergeUnknownFields(other.getUnknownFields());
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.AndroidBuildInfo) e.getUnfinishedMessage();
-          throw e;
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      // optional bytes id = 1;
-      private com.google.protobuf.ByteString id_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes id = 1;</code>
-       *
-       * <pre>
-       * build ID.
-       * </pre>
-       */
-      public boolean hasId() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes id = 1;</code>
-       *
-       * <pre>
-       * build ID.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getId() {
-        return id_;
-      }
-      /**
-       * <code>optional bytes id = 1;</code>
-       *
-       * <pre>
-       * build ID.
-       * </pre>
-       */
-      public Builder setId(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        id_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes id = 1;</code>
-       *
-       * <pre>
-       * build ID.
-       * </pre>
-       */
-      public Builder clearId() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        id_ = getDefaultInstance().getId();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes name = 11;
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes name = 11;</code>
-       *
-       * <pre>
-       * device name (e.g., bullhead).
-       * </pre>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional bytes name = 11;</code>
-       *
-       * <pre>
-       * device name (e.g., bullhead).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <code>optional bytes name = 11;</code>
-       *
-       * <pre>
-       * device name (e.g., bullhead).
-       * </pre>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes name = 11;</code>
-       *
-       * <pre>
-       * device name (e.g., bullhead).
-       * </pre>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes build_type = 12;
-      private com.google.protobuf.ByteString buildType_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes build_type = 12;</code>
-       *
-       * <pre>
-       * build type (e.g., userdebug)
-       * </pre>
-       */
-      public boolean hasBuildType() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional bytes build_type = 12;</code>
-       *
-       * <pre>
-       * build type (e.g., userdebug)
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getBuildType() {
-        return buildType_;
-      }
-      /**
-       * <code>optional bytes build_type = 12;</code>
-       *
-       * <pre>
-       * build type (e.g., userdebug)
-       * </pre>
-       */
-      public Builder setBuildType(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        buildType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes build_type = 12;</code>
-       *
-       * <pre>
-       * build type (e.g., userdebug)
-       * </pre>
-       */
-      public Builder clearBuildType() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        buildType_ = getDefaultInstance().getBuildType();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes branch = 13;
-      private com.google.protobuf.ByteString branch_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes branch = 13;</code>
-       *
-       * <pre>
-       * branch name (e.g., master or nyc-dev)
-       * </pre>
-       */
-      public boolean hasBranch() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <code>optional bytes branch = 13;</code>
-       *
-       * <pre>
-       * branch name (e.g., master or nyc-dev)
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getBranch() {
-        return branch_;
-      }
-      /**
-       * <code>optional bytes branch = 13;</code>
-       *
-       * <pre>
-       * branch name (e.g., master or nyc-dev)
-       * </pre>
-       */
-      public Builder setBranch(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000008;
-        branch_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes branch = 13;</code>
-       *
-       * <pre>
-       * branch name (e.g., master or nyc-dev)
-       * </pre>
-       */
-      public Builder clearBranch() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        branch_ = getDefaultInstance().getBranch();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes build_summary = 21;
-      private com.google.protobuf.ByteString buildSummary_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes build_summary = 21;</code>
-       *
-       * <pre>
-       * indicates the latest commit information of each branch (e.g., xml format).
-       * </pre>
-       */
-      public boolean hasBuildSummary() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <code>optional bytes build_summary = 21;</code>
-       *
-       * <pre>
-       * indicates the latest commit information of each branch (e.g., xml format).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getBuildSummary() {
-        return buildSummary_;
-      }
-      /**
-       * <code>optional bytes build_summary = 21;</code>
-       *
-       * <pre>
-       * indicates the latest commit information of each branch (e.g., xml format).
-       * </pre>
-       */
-      public Builder setBuildSummary(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000010;
-        buildSummary_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes build_summary = 21;</code>
-       *
-       * <pre>
-       * indicates the latest commit information of each branch (e.g., xml format).
-       * </pre>
-       */
-      public Builder clearBuildSummary() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        buildSummary_ = getDefaultInstance().getBuildSummary();
-        onChanged();
-        return this;
-      }
-
-      // @@protoc_insertion_point(builder_scope:android.vts.AndroidBuildInfo)
-    }
-
-    static {
-      defaultInstance = new AndroidBuildInfo(true);
-      defaultInstance.initFields();
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.AndroidBuildInfo)
-  }
-
-  public interface VtsHostInfoOrBuilder
-      extends com.google.protobuf.MessageOrBuilder {
-
-    // optional bytes hostname = 1;
-    /**
-     * <code>optional bytes hostname = 1;</code>
-     *
-     * <pre>
-     * the host name (i.e., full domain name).
-     * </pre>
-     */
-    boolean hasHostname();
-    /**
-     * <code>optional bytes hostname = 1;</code>
-     *
-     * <pre>
-     * the host name (i.e., full domain name).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getHostname();
-  }
-  /**
-   * Protobuf type {@code android.vts.VtsHostInfo}
-   *
-   * <pre>
-   * To specify the information about a host node.
-   * </pre>
-   */
-  public static final class VtsHostInfo extends
-      com.google.protobuf.GeneratedMessage
-      implements VtsHostInfoOrBuilder {
-    // Use VtsHostInfo.newBuilder() to construct.
-    private VtsHostInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-      super(builder);
-      this.unknownFields = builder.getUnknownFields();
-    }
-    private VtsHostInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
-
-    private static final VtsHostInfo defaultInstance;
-    public static VtsHostInfo getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public VtsHostInfo getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-    private final com.google.protobuf.UnknownFieldSet unknownFields;
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-        getUnknownFields() {
-      return this.unknownFields;
-    }
-    private VtsHostInfo(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      initFields();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              hostname_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.VtsHostInfo.class, com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder.class);
-    }
-
-    public static com.google.protobuf.Parser<VtsHostInfo> PARSER =
-        new com.google.protobuf.AbstractParser<VtsHostInfo>() {
-      public VtsHostInfo parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new VtsHostInfo(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<VtsHostInfo> getParserForType() {
-      return PARSER;
-    }
-
-    private int bitField0_;
-    // optional bytes hostname = 1;
-    public static final int HOSTNAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString hostname_;
-    /**
-     * <code>optional bytes hostname = 1;</code>
-     *
-     * <pre>
-     * the host name (i.e., full domain name).
-     * </pre>
-     */
-    public boolean hasHostname() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <code>optional bytes hostname = 1;</code>
-     *
-     * <pre>
-     * the host name (i.e., full domain name).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getHostname() {
-      return hostname_;
-    }
-
-    private void initFields() {
-      hostname_ = com.google.protobuf.ByteString.EMPTY;
-    }
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized != -1) return isInitialized == 1;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, hostname_);
-      }
-      getUnknownFields().writeTo(output);
-    }
-
-    private int memoizedSerializedSize = -1;
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, hostname_);
-      }
-      size += getUnknownFields().getSerializedSize();
-      memoizedSerializedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    protected java.lang.Object writeReplace()
-        throws java.io.ObjectStreamException {
-      return super.writeReplace();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-
-    public static Builder newBuilder() { return Builder.create(); }
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.VtsHostInfo prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() { return newBuilder(this); }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code android.vts.VtsHostInfo}
-     *
-     * <pre>
-     * To specify the information about a host node.
-     * </pre>
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessage.Builder<Builder>
-       implements com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.VtsHostInfo.class, com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.VtsHostInfo.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-        }
-      }
-      private static Builder create() {
-        return new Builder();
-      }
-
-      public Builder clear() {
-        super.clear();
-        hostname_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        return this;
-      }
-
-      public Builder clone() {
-        return create().mergeFrom(buildPartial());
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo build() {
-        com.android.vts.proto.VtsReportMessage.VtsHostInfo result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo buildPartial() {
-        com.android.vts.proto.VtsReportMessage.VtsHostInfo result = new com.android.vts.proto.VtsReportMessage.VtsHostInfo(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.hostname_ = hostname_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.VtsHostInfo) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.VtsHostInfo)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.VtsHostInfo other) {
-        if (other == com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance()) return this;
-        if (other.hasHostname()) {
-          setHostname(other.getHostname());
-        }
-        this.mergeUnknownFields(other.getUnknownFields());
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.VtsHostInfo parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.VtsHostInfo) e.getUnfinishedMessage();
-          throw e;
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      // optional bytes hostname = 1;
-      private com.google.protobuf.ByteString hostname_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes hostname = 1;</code>
-       *
-       * <pre>
-       * the host name (i.e., full domain name).
-       * </pre>
-       */
-      public boolean hasHostname() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes hostname = 1;</code>
-       *
-       * <pre>
-       * the host name (i.e., full domain name).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getHostname() {
-        return hostname_;
-      }
-      /**
-       * <code>optional bytes hostname = 1;</code>
-       *
-       * <pre>
-       * the host name (i.e., full domain name).
-       * </pre>
-       */
-      public Builder setHostname(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        hostname_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes hostname = 1;</code>
-       *
-       * <pre>
-       * the host name (i.e., full domain name).
-       * </pre>
-       */
-      public Builder clearHostname() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        hostname_ = getDefaultInstance().getHostname();
-        onChanged();
-        return this;
-      }
-
-      // @@protoc_insertion_point(builder_scope:android.vts.VtsHostInfo)
-    }
-
-    static {
-      defaultInstance = new VtsHostInfo(true);
-      defaultInstance.initFields();
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.VtsHostInfo)
-  }
-
-  public interface TestCaseReportMessageOrBuilder
-      extends com.google.protobuf.MessageOrBuilder {
-
-    // optional bytes name = 1;
-    /**
-     * <code>optional bytes name = 1;</code>
-     *
-     * <pre>
-     * the test case name.
-     * </pre>
-     */
-    boolean hasName();
-    /**
-     * <code>optional bytes name = 1;</code>
-     *
-     * <pre>
-     * the test case name.
-     * </pre>
-     */
-    com.google.protobuf.ByteString getName();
-
-    // optional .android.vts.TestCaseResult test_result = 11;
-    /**
-     * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-     *
-     * <pre>
-     * the test result.
-     * </pre>
-     */
-    boolean hasTestResult();
-    /**
-     * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-     *
-     * <pre>
-     * the test result.
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.TestCaseResult getTestResult();
-
-    // optional int64 start_timestamp = 21;
-    /**
-     * <code>optional int64 start_timestamp = 21;</code>
-     *
-     * <pre>
-     * execution start and end time stamp.
-     * </pre>
-     */
-    boolean hasStartTimestamp();
-    /**
-     * <code>optional int64 start_timestamp = 21;</code>
-     *
-     * <pre>
-     * execution start and end time stamp.
-     * </pre>
-     */
-    long getStartTimestamp();
-
-    // optional int64 end_timestamp = 22;
-    /**
-     * <code>optional int64 end_timestamp = 22;</code>
-     */
-    boolean hasEndTimestamp();
-    /**
-     * <code>optional int64 end_timestamp = 22;</code>
-     */
-    long getEndTimestamp();
-
-    // repeated .android.vts.CoverageReportMessage coverage = 31;
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> 
-        getCoverageList();
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index);
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    int getCoverageCount();
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-        getCoverageOrBuilderList();
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-        int index);
-
-    // repeated .android.vts.ProfilingReportMessage profiling = 41;
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> 
-        getProfilingList();
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index);
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    int getProfilingCount();
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-        getProfilingOrBuilderList();
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-        int index);
-
-    // repeated .android.vts.SystraceReportMessage systrace = 42;
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> 
-        getSystraceList();
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index);
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    int getSystraceCount();
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-        getSystraceOrBuilderList();
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-        int index);
-
-    // repeated .android.vts.LogMessage log = 101;
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> 
-        getLogList();
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index);
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    int getLogCount();
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-        getLogOrBuilderList();
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-        int index);
-  }
-  /**
-   * Protobuf type {@code android.vts.TestCaseReportMessage}
-   *
-   * <pre>
-   * To specify a test case execution report.
-   * </pre>
-   */
-  public static final class TestCaseReportMessage extends
-      com.google.protobuf.GeneratedMessage
-      implements TestCaseReportMessageOrBuilder {
-    // Use TestCaseReportMessage.newBuilder() to construct.
-    private TestCaseReportMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-      super(builder);
-      this.unknownFields = builder.getUnknownFields();
-    }
-    private TestCaseReportMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
-
-    private static final TestCaseReportMessage defaultInstance;
-    public static TestCaseReportMessage getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public TestCaseReportMessage getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-    private final com.google.protobuf.UnknownFieldSet unknownFields;
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-        getUnknownFields() {
-      return this.unknownFields;
-    }
-    private TestCaseReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      initFields();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              name_ = input.readBytes();
-              break;
-            }
-            case 88: {
-              int rawValue = input.readEnum();
-              com.android.vts.proto.VtsReportMessage.TestCaseResult value = com.android.vts.proto.VtsReportMessage.TestCaseResult.valueOf(rawValue);
-              if (value == null) {
-                unknownFields.mergeVarintField(11, rawValue);
-              } else {
-                bitField0_ |= 0x00000002;
-                testResult_ = value;
-              }
-              break;
-            }
-            case 168: {
-              bitField0_ |= 0x00000004;
-              startTimestamp_ = input.readInt64();
-              break;
-            }
-            case 176: {
-              bitField0_ |= 0x00000008;
-              endTimestamp_ = input.readInt64();
-              break;
-            }
-            case 250: {
-              if (!((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
-                coverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>();
-                mutable_bitField0_ |= 0x00000010;
-              }
-              coverage_.add(input.readMessage(com.android.vts.proto.VtsReportMessage.CoverageReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 330: {
-              if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-                profiling_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>();
-                mutable_bitField0_ |= 0x00000020;
-              }
-              profiling_.add(input.readMessage(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 338: {
-              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
-                systrace_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>();
-                mutable_bitField0_ |= 0x00000040;
-              }
-              systrace_.add(input.readMessage(com.android.vts.proto.VtsReportMessage.SystraceReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 810: {
-              if (!((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
-                log_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.LogMessage>();
-                mutable_bitField0_ |= 0x00000080;
-              }
-              log_.add(input.readMessage(com.android.vts.proto.VtsReportMessage.LogMessage.PARSER, extensionRegistry));
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
-          coverage_ = java.util.Collections.unmodifiableList(coverage_);
-        }
-        if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-          profiling_ = java.util.Collections.unmodifiableList(profiling_);
-        }
-        if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
-          systrace_ = java.util.Collections.unmodifiableList(systrace_);
-        }
-        if (((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
-          log_ = java.util.Collections.unmodifiableList(log_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.class, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder.class);
-    }
-
-    public static com.google.protobuf.Parser<TestCaseReportMessage> PARSER =
-        new com.google.protobuf.AbstractParser<TestCaseReportMessage>() {
-      public TestCaseReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new TestCaseReportMessage(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<TestCaseReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    private int bitField0_;
-    // optional bytes name = 1;
-    public static final int NAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <code>optional bytes name = 1;</code>
-     *
-     * <pre>
-     * the test case name.
-     * </pre>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <code>optional bytes name = 1;</code>
-     *
-     * <pre>
-     * the test case name.
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    // optional .android.vts.TestCaseResult test_result = 11;
-    public static final int TEST_RESULT_FIELD_NUMBER = 11;
-    private com.android.vts.proto.VtsReportMessage.TestCaseResult testResult_;
-    /**
-     * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-     *
-     * <pre>
-     * the test result.
-     * </pre>
-     */
-    public boolean hasTestResult() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-     *
-     * <pre>
-     * the test result.
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.TestCaseResult getTestResult() {
-      return testResult_;
-    }
-
-    // optional int64 start_timestamp = 21;
-    public static final int START_TIMESTAMP_FIELD_NUMBER = 21;
-    private long startTimestamp_;
-    /**
-     * <code>optional int64 start_timestamp = 21;</code>
-     *
-     * <pre>
-     * execution start and end time stamp.
-     * </pre>
-     */
-    public boolean hasStartTimestamp() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <code>optional int64 start_timestamp = 21;</code>
-     *
-     * <pre>
-     * execution start and end time stamp.
-     * </pre>
-     */
-    public long getStartTimestamp() {
-      return startTimestamp_;
-    }
-
-    // optional int64 end_timestamp = 22;
-    public static final int END_TIMESTAMP_FIELD_NUMBER = 22;
-    private long endTimestamp_;
-    /**
-     * <code>optional int64 end_timestamp = 22;</code>
-     */
-    public boolean hasEndTimestamp() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <code>optional int64 end_timestamp = 22;</code>
-     */
-    public long getEndTimestamp() {
-      return endTimestamp_;
-    }
-
-    // repeated .android.vts.CoverageReportMessage coverage = 31;
-    public static final int COVERAGE_FIELD_NUMBER = 31;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> coverage_;
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> getCoverageList() {
-      return coverage_;
-    }
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-        getCoverageOrBuilderList() {
-      return coverage_;
-    }
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    public int getCoverageCount() {
-      return coverage_.size();
-    }
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
-      return coverage_.get(index);
-    }
-    /**
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     *
-     * <pre>
-     * coverage report per file
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-        int index) {
-      return coverage_.get(index);
-    }
-
-    // repeated .android.vts.ProfilingReportMessage profiling = 41;
-    public static final int PROFILING_FIELD_NUMBER = 41;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> profiling_;
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> getProfilingList() {
-      return profiling_;
-    }
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-        getProfilingOrBuilderList() {
-      return profiling_;
-    }
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    public int getProfilingCount() {
-      return profiling_.size();
-    }
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index) {
-      return profiling_.get(index);
-    }
-    /**
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     *
-     * <pre>
-     * profiling reports
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-        int index) {
-      return profiling_.get(index);
-    }
-
-    // repeated .android.vts.SystraceReportMessage systrace = 42;
-    public static final int SYSTRACE_FIELD_NUMBER = 42;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> systrace_;
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> getSystraceList() {
-      return systrace_;
-    }
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-        getSystraceOrBuilderList() {
-      return systrace_;
-    }
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    public int getSystraceCount() {
-      return systrace_.size();
-    }
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index) {
-      return systrace_.get(index);
-    }
-    /**
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-     *
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-        int index) {
-      return systrace_.get(index);
-    }
-
-    // repeated .android.vts.LogMessage log = 101;
-    public static final int LOG_FIELD_NUMBER = 101;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> log_;
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList() {
-      return log_;
-    }
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-        getLogOrBuilderList() {
-      return log_;
-    }
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    public int getLogCount() {
-      return log_.size();
-    }
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index) {
-      return log_.get(index);
-    }
-    /**
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     *
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     */
-    public com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-        int index) {
-      return log_.get(index);
-    }
-
-    private void initFields() {
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      testResult_ = com.android.vts.proto.VtsReportMessage.TestCaseResult.UNKNOWN_RESULT;
-      startTimestamp_ = 0L;
-      endTimestamp_ = 0L;
-      coverage_ = java.util.Collections.emptyList();
-      profiling_ = java.util.Collections.emptyList();
-      systrace_ = java.util.Collections.emptyList();
-      log_ = java.util.Collections.emptyList();
-    }
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized != -1) return isInitialized == 1;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, name_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeEnum(11, testResult_.getNumber());
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeInt64(21, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeInt64(22, endTimestamp_);
-      }
-      for (int i = 0; i < coverage_.size(); i++) {
-        output.writeMessage(31, coverage_.get(i));
-      }
-      for (int i = 0; i < profiling_.size(); i++) {
-        output.writeMessage(41, profiling_.get(i));
-      }
-      for (int i = 0; i < systrace_.size(); i++) {
-        output.writeMessage(42, systrace_.get(i));
-      }
-      for (int i = 0; i < log_.size(); i++) {
-        output.writeMessage(101, log_.get(i));
-      }
-      getUnknownFields().writeTo(output);
-    }
-
-    private int memoizedSerializedSize = -1;
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, name_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(11, testResult_.getNumber());
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(21, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(22, endTimestamp_);
-      }
-      for (int i = 0; i < coverage_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(31, coverage_.get(i));
-      }
-      for (int i = 0; i < profiling_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(41, profiling_.get(i));
-      }
-      for (int i = 0; i < systrace_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(42, systrace_.get(i));
-      }
-      for (int i = 0; i < log_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(101, log_.get(i));
-      }
-      size += getUnknownFields().getSerializedSize();
-      memoizedSerializedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    protected java.lang.Object writeReplace()
-        throws java.io.ObjectStreamException {
-      return super.writeReplace();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-
-    public static Builder newBuilder() { return Builder.create(); }
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.TestCaseReportMessage prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() { return newBuilder(this); }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code android.vts.TestCaseReportMessage}
-     *
-     * <pre>
-     * To specify a test case execution report.
-     * </pre>
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessage.Builder<Builder>
-       implements com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.class, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-          getCoverageFieldBuilder();
-          getProfilingFieldBuilder();
-          getSystraceFieldBuilder();
-          getLogFieldBuilder();
-        }
-      }
-      private static Builder create() {
-        return new Builder();
-      }
-
-      public Builder clear() {
-        super.clear();
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        testResult_ = com.android.vts.proto.VtsReportMessage.TestCaseResult.UNKNOWN_RESULT;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        startTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        endTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        if (coverageBuilder_ == null) {
-          coverage_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000010);
-        } else {
-          coverageBuilder_.clear();
-        }
-        if (profilingBuilder_ == null) {
-          profiling_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000020);
-        } else {
-          profilingBuilder_.clear();
-        }
-        if (systraceBuilder_ == null) {
-          systrace_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000040);
-        } else {
-          systraceBuilder_.clear();
-        }
-        if (logBuilder_ == null) {
-          log_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000080);
-        } else {
-          logBuilder_.clear();
-        }
-        return this;
-      }
-
-      public Builder clone() {
-        return create().mergeFrom(buildPartial());
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.TestCaseReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.TestCaseReportMessage result = new com.android.vts.proto.VtsReportMessage.TestCaseReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.testResult_ = testResult_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.startTimestamp_ = startTimestamp_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.endTimestamp_ = endTimestamp_;
-        if (coverageBuilder_ == null) {
-          if (((bitField0_ & 0x00000010) == 0x00000010)) {
-            coverage_ = java.util.Collections.unmodifiableList(coverage_);
-            bitField0_ = (bitField0_ & ~0x00000010);
-          }
-          result.coverage_ = coverage_;
-        } else {
-          result.coverage_ = coverageBuilder_.build();
-        }
-        if (profilingBuilder_ == null) {
-          if (((bitField0_ & 0x00000020) == 0x00000020)) {
-            profiling_ = java.util.Collections.unmodifiableList(profiling_);
-            bitField0_ = (bitField0_ & ~0x00000020);
-          }
-          result.profiling_ = profiling_;
-        } else {
-          result.profiling_ = profilingBuilder_.build();
-        }
-        if (systraceBuilder_ == null) {
-          if (((bitField0_ & 0x00000040) == 0x00000040)) {
-            systrace_ = java.util.Collections.unmodifiableList(systrace_);
-            bitField0_ = (bitField0_ & ~0x00000040);
-          }
-          result.systrace_ = systrace_;
-        } else {
-          result.systrace_ = systraceBuilder_.build();
-        }
-        if (logBuilder_ == null) {
-          if (((bitField0_ & 0x00000080) == 0x00000080)) {
-            log_ = java.util.Collections.unmodifiableList(log_);
-            bitField0_ = (bitField0_ & ~0x00000080);
-          }
-          result.log_ = log_;
-        } else {
-          result.log_ = logBuilder_.build();
-        }
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.TestCaseReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.TestCaseReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.TestCaseReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.getDefaultInstance()) return this;
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasTestResult()) {
-          setTestResult(other.getTestResult());
-        }
-        if (other.hasStartTimestamp()) {
-          setStartTimestamp(other.getStartTimestamp());
-        }
-        if (other.hasEndTimestamp()) {
-          setEndTimestamp(other.getEndTimestamp());
-        }
-        if (coverageBuilder_ == null) {
-          if (!other.coverage_.isEmpty()) {
-            if (coverage_.isEmpty()) {
-              coverage_ = other.coverage_;
-              bitField0_ = (bitField0_ & ~0x00000010);
-            } else {
-              ensureCoverageIsMutable();
-              coverage_.addAll(other.coverage_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.coverage_.isEmpty()) {
-            if (coverageBuilder_.isEmpty()) {
-              coverageBuilder_.dispose();
-              coverageBuilder_ = null;
-              coverage_ = other.coverage_;
-              bitField0_ = (bitField0_ & ~0x00000010);
-              coverageBuilder_ = 
-                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
-                   getCoverageFieldBuilder() : null;
-            } else {
-              coverageBuilder_.addAllMessages(other.coverage_);
-            }
-          }
-        }
-        if (profilingBuilder_ == null) {
-          if (!other.profiling_.isEmpty()) {
-            if (profiling_.isEmpty()) {
-              profiling_ = other.profiling_;
-              bitField0_ = (bitField0_ & ~0x00000020);
-            } else {
-              ensureProfilingIsMutable();
-              profiling_.addAll(other.profiling_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.profiling_.isEmpty()) {
-            if (profilingBuilder_.isEmpty()) {
-              profilingBuilder_.dispose();
-              profilingBuilder_ = null;
-              profiling_ = other.profiling_;
-              bitField0_ = (bitField0_ & ~0x00000020);
-              profilingBuilder_ = 
-                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
-                   getProfilingFieldBuilder() : null;
-            } else {
-              profilingBuilder_.addAllMessages(other.profiling_);
-            }
-          }
-        }
-        if (systraceBuilder_ == null) {
-          if (!other.systrace_.isEmpty()) {
-            if (systrace_.isEmpty()) {
-              systrace_ = other.systrace_;
-              bitField0_ = (bitField0_ & ~0x00000040);
-            } else {
-              ensureSystraceIsMutable();
-              systrace_.addAll(other.systrace_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.systrace_.isEmpty()) {
-            if (systraceBuilder_.isEmpty()) {
-              systraceBuilder_.dispose();
-              systraceBuilder_ = null;
-              systrace_ = other.systrace_;
-              bitField0_ = (bitField0_ & ~0x00000040);
-              systraceBuilder_ = 
-                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
-                   getSystraceFieldBuilder() : null;
-            } else {
-              systraceBuilder_.addAllMessages(other.systrace_);
-            }
-          }
-        }
-        if (logBuilder_ == null) {
-          if (!other.log_.isEmpty()) {
-            if (log_.isEmpty()) {
-              log_ = other.log_;
-              bitField0_ = (bitField0_ & ~0x00000080);
-            } else {
-              ensureLogIsMutable();
-              log_.addAll(other.log_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.log_.isEmpty()) {
-            if (logBuilder_.isEmpty()) {
-              logBuilder_.dispose();
-              logBuilder_ = null;
-              log_ = other.log_;
-              bitField0_ = (bitField0_ & ~0x00000080);
-              logBuilder_ = 
-                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
-                   getLogFieldBuilder() : null;
-            } else {
-              logBuilder_.addAllMessages(other.log_);
-            }
-          }
-        }
-        this.mergeUnknownFields(other.getUnknownFields());
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.TestCaseReportMessage) e.getUnfinishedMessage();
-          throw e;
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      // optional bytes name = 1;
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes name = 1;</code>
-       *
-       * <pre>
-       * the test case name.
-       * </pre>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes name = 1;</code>
-       *
-       * <pre>
-       * the test case name.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <code>optional bytes name = 1;</code>
-       *
-       * <pre>
-       * the test case name.
-       * </pre>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes name = 1;</code>
-       *
-       * <pre>
-       * the test case name.
-       * </pre>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      // optional .android.vts.TestCaseResult test_result = 11;
-      private com.android.vts.proto.VtsReportMessage.TestCaseResult testResult_ = com.android.vts.proto.VtsReportMessage.TestCaseResult.UNKNOWN_RESULT;
-      /**
-       * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-       *
-       * <pre>
-       * the test result.
-       * </pre>
-       */
-      public boolean hasTestResult() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-       *
-       * <pre>
-       * the test result.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseResult getTestResult() {
-        return testResult_;
-      }
-      /**
-       * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-       *
-       * <pre>
-       * the test result.
-       * </pre>
-       */
-      public Builder setTestResult(com.android.vts.proto.VtsReportMessage.TestCaseResult value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        bitField0_ |= 0x00000002;
-        testResult_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-       *
-       * <pre>
-       * the test result.
-       * </pre>
-       */
-      public Builder clearTestResult() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        testResult_ = com.android.vts.proto.VtsReportMessage.TestCaseResult.UNKNOWN_RESULT;
-        onChanged();
-        return this;
-      }
-
-      // optional int64 start_timestamp = 21;
-      private long startTimestamp_ ;
-      /**
-       * <code>optional int64 start_timestamp = 21;</code>
-       *
-       * <pre>
-       * execution start and end time stamp.
-       * </pre>
-       */
-      public boolean hasStartTimestamp() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional int64 start_timestamp = 21;</code>
-       *
-       * <pre>
-       * execution start and end time stamp.
-       * </pre>
-       */
-      public long getStartTimestamp() {
-        return startTimestamp_;
-      }
-      /**
-       * <code>optional int64 start_timestamp = 21;</code>
-       *
-       * <pre>
-       * execution start and end time stamp.
-       * </pre>
-       */
-      public Builder setStartTimestamp(long value) {
-        bitField0_ |= 0x00000004;
-        startTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 start_timestamp = 21;</code>
-       *
-       * <pre>
-       * execution start and end time stamp.
-       * </pre>
-       */
-      public Builder clearStartTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        startTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      // optional int64 end_timestamp = 22;
-      private long endTimestamp_ ;
-      /**
-       * <code>optional int64 end_timestamp = 22;</code>
-       */
-      public boolean hasEndTimestamp() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <code>optional int64 end_timestamp = 22;</code>
-       */
-      public long getEndTimestamp() {
-        return endTimestamp_;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 22;</code>
-       */
-      public Builder setEndTimestamp(long value) {
-        bitField0_ |= 0x00000008;
-        endTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 22;</code>
-       */
-      public Builder clearEndTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        endTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      // repeated .android.vts.CoverageReportMessage coverage = 31;
-      private java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> coverage_ =
-        java.util.Collections.emptyList();
-      private void ensureCoverageIsMutable() {
-        if (!((bitField0_ & 0x00000010) == 0x00000010)) {
-          coverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>(coverage_);
-          bitField0_ |= 0x00000010;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilder<
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> coverageBuilder_;
-
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> getCoverageList() {
-        if (coverageBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(coverage_);
-        } else {
-          return coverageBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public int getCoverageCount() {
-        if (coverageBuilder_ == null) {
-          return coverage_.size();
-        } else {
-          return coverageBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
-        if (coverageBuilder_ == null) {
-          return coverage_.get(index);
-        } else {
-          return coverageBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder setCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.set(index, value);
-          onChanged();
-        } else {
-          coverageBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder setCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder addCoverage(com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.add(value);
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder addCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.add(index, value);
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder addCoverage(
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.add(builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder addCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder addAllCoverage(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessage> values) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          super.addAll(values, coverage_);
-          onChanged();
-        } else {
-          coverageBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder clearCoverage() {
-        if (coverageBuilder_ == null) {
-          coverage_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000010);
-          onChanged();
-        } else {
-          coverageBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public Builder removeCoverage(int index) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.remove(index);
-          onChanged();
-        } else {
-          coverageBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder getCoverageBuilder(
-          int index) {
-        return getCoverageFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-          int index) {
-        if (coverageBuilder_ == null) {
-          return coverage_.get(index);  } else {
-          return coverageBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-           getCoverageOrBuilderList() {
-        if (coverageBuilder_ != null) {
-          return coverageBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(coverage_);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder addCoverageBuilder() {
-        return getCoverageFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder addCoverageBuilder(
-          int index) {
-        return getCoverageFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       *
-       * <pre>
-       * coverage report per file
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder> 
-           getCoverageBuilderList() {
-        return getCoverageFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilder<
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-          getCoverageFieldBuilder() {
-        if (coverageBuilder_ == null) {
-          coverageBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder>(
-                  coverage_,
-                  ((bitField0_ & 0x00000010) == 0x00000010),
-                  getParentForChildren(),
-                  isClean());
-          coverage_ = null;
-        }
-        return coverageBuilder_;
-      }
-
-      // repeated .android.vts.ProfilingReportMessage profiling = 41;
-      private java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> profiling_ =
-        java.util.Collections.emptyList();
-      private void ensureProfilingIsMutable() {
-        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
-          profiling_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>(profiling_);
-          bitField0_ |= 0x00000020;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilder<
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> profilingBuilder_;
-
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> getProfilingList() {
-        if (profilingBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(profiling_);
-        } else {
-          return profilingBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public int getProfilingCount() {
-        if (profilingBuilder_ == null) {
-          return profiling_.size();
-        } else {
-          return profilingBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index) {
-        if (profilingBuilder_ == null) {
-          return profiling_.get(index);
-        } else {
-          return profilingBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder setProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.set(index, value);
-          onChanged();
-        } else {
-          profilingBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder setProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder addProfiling(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.add(value);
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder addProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.add(index, value);
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder addProfiling(
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.add(builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder addProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder addAllProfiling(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> values) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          super.addAll(values, profiling_);
-          onChanged();
-        } else {
-          profilingBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder clearProfiling() {
-        if (profilingBuilder_ == null) {
-          profiling_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000020);
-          onChanged();
-        } else {
-          profilingBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public Builder removeProfiling(int index) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.remove(index);
-          onChanged();
-        } else {
-          profilingBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder getProfilingBuilder(
-          int index) {
-        return getProfilingFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-          int index) {
-        if (profilingBuilder_ == null) {
-          return profiling_.get(index);  } else {
-          return profilingBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-           getProfilingOrBuilderList() {
-        if (profilingBuilder_ != null) {
-          return profilingBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(profiling_);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder addProfilingBuilder() {
-        return getProfilingFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder addProfilingBuilder(
-          int index) {
-        return getProfilingFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       *
-       * <pre>
-       * profiling reports
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder> 
-           getProfilingBuilderList() {
-        return getProfilingFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilder<
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-          getProfilingFieldBuilder() {
-        if (profilingBuilder_ == null) {
-          profilingBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder>(
-                  profiling_,
-                  ((bitField0_ & 0x00000020) == 0x00000020),
-                  getParentForChildren(),
-                  isClean());
-          profiling_ = null;
-        }
-        return profilingBuilder_;
-      }
-
-      // repeated .android.vts.SystraceReportMessage systrace = 42;
-      private java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> systrace_ =
-        java.util.Collections.emptyList();
-      private void ensureSystraceIsMutable() {
-        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
-          systrace_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>(systrace_);
-          bitField0_ |= 0x00000040;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilder<
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> systraceBuilder_;
-
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> getSystraceList() {
-        if (systraceBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(systrace_);
-        } else {
-          return systraceBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public int getSystraceCount() {
-        if (systraceBuilder_ == null) {
-          return systrace_.size();
-        } else {
-          return systraceBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index) {
-        if (systraceBuilder_ == null) {
-          return systrace_.get(index);
-        } else {
-          return systraceBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder setSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.set(index, value);
-          onChanged();
-        } else {
-          systraceBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder setSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder addSystrace(com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.add(value);
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder addSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.add(index, value);
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder addSystrace(
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.add(builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder addSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder addAllSystrace(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessage> values) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          super.addAll(values, systrace_);
-          onChanged();
-        } else {
-          systraceBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder clearSystrace() {
-        if (systraceBuilder_ == null) {
-          systrace_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000040);
-          onChanged();
-        } else {
-          systraceBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public Builder removeSystrace(int index) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.remove(index);
-          onChanged();
-        } else {
-          systraceBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder getSystraceBuilder(
-          int index) {
-        return getSystraceFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-          int index) {
-        if (systraceBuilder_ == null) {
-          return systrace_.get(index);  } else {
-          return systraceBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-           getSystraceOrBuilderList() {
-        if (systraceBuilder_ != null) {
-          return systraceBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(systrace_);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder addSystraceBuilder() {
-        return getSystraceFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder addSystraceBuilder(
-          int index) {
-        return getSystraceFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42;</code>
-       *
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder> 
-           getSystraceBuilderList() {
-        return getSystraceFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilder<
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-          getSystraceFieldBuilder() {
-        if (systraceBuilder_ == null) {
-          systraceBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder>(
-                  systrace_,
-                  ((bitField0_ & 0x00000040) == 0x00000040),
-                  getParentForChildren(),
-                  isClean());
-          systrace_ = null;
-        }
-        return systraceBuilder_;
-      }
-
-      // repeated .android.vts.LogMessage log = 101;
-      private java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> log_ =
-        java.util.Collections.emptyList();
-      private void ensureLogIsMutable() {
-        if (!((bitField0_ & 0x00000080) == 0x00000080)) {
-          log_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.LogMessage>(log_);
-          bitField0_ |= 0x00000080;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilder<
-          com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> logBuilder_;
-
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList() {
-        if (logBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(log_);
-        } else {
-          return logBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public int getLogCount() {
-        if (logBuilder_ == null) {
-          return log_.size();
-        } else {
-          return logBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index) {
-        if (logBuilder_ == null) {
-          return log_.get(index);
-        } else {
-          return logBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder setLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.set(index, value);
-          onChanged();
-        } else {
-          logBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder setLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder addLog(com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.add(value);
-          onChanged();
-        } else {
-          logBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder addLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.add(index, value);
-          onChanged();
-        } else {
-          logBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder addLog(
-          com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.add(builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder addLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder addAllLog(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.LogMessage> values) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          super.addAll(values, log_);
-          onChanged();
-        } else {
-          logBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder clearLog() {
-        if (logBuilder_ == null) {
-          log_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000080);
-          onChanged();
-        } else {
-          logBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public Builder removeLog(int index) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.remove(index);
-          onChanged();
-        } else {
-          logBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder getLogBuilder(
-          int index) {
-        return getLogFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-          int index) {
-        if (logBuilder_ == null) {
-          return log_.get(index);  } else {
-          return logBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-           getLogOrBuilderList() {
-        if (logBuilder_ != null) {
-          return logBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(log_);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder addLogBuilder() {
-        return getLogFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder addLogBuilder(
-          int index) {
-        return getLogFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       *
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage.Builder> 
-           getLogBuilderList() {
-        return getLogFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilder<
-          com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-          getLogFieldBuilder() {
-        if (logBuilder_ == null) {
-          logBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder>(
-                  log_,
-                  ((bitField0_ & 0x00000080) == 0x00000080),
-                  getParentForChildren(),
-                  isClean());
-          log_ = null;
-        }
-        return logBuilder_;
-      }
-
-      // @@protoc_insertion_point(builder_scope:android.vts.TestCaseReportMessage)
-    }
-
-    static {
-      defaultInstance = new TestCaseReportMessage(true);
-      defaultInstance.initFields();
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.TestCaseReportMessage)
-  }
-
-  public interface ProfilingReportMessageOrBuilder
-      extends com.google.protobuf.MessageOrBuilder {
-
-    // optional bytes name = 1;
-    /**
-     * <code>optional bytes name = 1;</code>
-     *
-     * <pre>
-     * the instrumentation point name.
-     * </pre>
-     */
-    boolean hasName();
-    /**
-     * <code>optional bytes name = 1;</code>
-     *
-     * <pre>
-     * the instrumentation point name.
-     * </pre>
-     */
-    com.google.protobuf.ByteString getName();
-
-    // optional .android.vts.VtsProfilingType type = 2;
-    /**
-     * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-     */
-    boolean hasType();
-    /**
-     * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.VtsProfilingType getType();
-
-    // optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;
-    /**
-     * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-     */
-    boolean hasRegressionMode();
-    /**
-     * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode getRegressionMode();
-
-    // optional int64 start_timestamp = 11;
-    /**
-     * <code>optional int64 start_timestamp = 11;</code>
-     *
-     * <pre>
-     * profiling start and end time stamp (for performance).
-     * </pre>
-     */
-    boolean hasStartTimestamp();
-    /**
-     * <code>optional int64 start_timestamp = 11;</code>
-     *
-     * <pre>
-     * profiling start and end time stamp (for performance).
-     * </pre>
-     */
-    long getStartTimestamp();
-
-    // optional int64 end_timestamp = 12;
-    /**
-     * <code>optional int64 end_timestamp = 12;</code>
-     */
-    boolean hasEndTimestamp();
-    /**
-     * <code>optional int64 end_timestamp = 12;</code>
-     */
-    long getEndTimestamp();
-
-    // repeated bytes label = 21;
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    java.util.List<com.google.protobuf.ByteString> getLabelList();
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    int getLabelCount();
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    com.google.protobuf.ByteString getLabel(int index);
-
-    // repeated int64 value = 22;
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    java.util.List<java.lang.Long> getValueList();
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    int getValueCount();
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    long getValue(int index);
-
-    // optional bytes x_axis_label = 31;
-    /**
-     * <code>optional bytes x_axis_label = 31;</code>
-     *
-     * <pre>
-     * x-axis and y-axis title labels when displaying the data as a graph
-     * </pre>
-     */
-    boolean hasXAxisLabel();
-    /**
-     * <code>optional bytes x_axis_label = 31;</code>
-     *
-     * <pre>
-     * x-axis and y-axis title labels when displaying the data as a graph
-     * </pre>
-     */
-    com.google.protobuf.ByteString getXAxisLabel();
-
-    // optional bytes y_axis_label = 32;
-    /**
-     * <code>optional bytes y_axis_label = 32;</code>
-     */
-    boolean hasYAxisLabel();
-    /**
-     * <code>optional bytes y_axis_label = 32;</code>
-     */
-    com.google.protobuf.ByteString getYAxisLabel();
-
-    // repeated bytes options = 41;
-    /**
-     * <code>repeated bytes options = 41;</code>
-     *
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     */
-    java.util.List<com.google.protobuf.ByteString> getOptionsList();
-    /**
-     * <code>repeated bytes options = 41;</code>
-     *
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     */
-    int getOptionsCount();
-    /**
-     * <code>repeated bytes options = 41;</code>
-     *
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getOptions(int index);
-  }
-  /**
-   * Protobuf type {@code android.vts.ProfilingReportMessage}
-   *
-   * <pre>
-   * To specify a profiling report.
-   * </pre>
-   */
-  public static final class ProfilingReportMessage extends
-      com.google.protobuf.GeneratedMessage
-      implements ProfilingReportMessageOrBuilder {
-    // Use ProfilingReportMessage.newBuilder() to construct.
-    private ProfilingReportMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-      super(builder);
-      this.unknownFields = builder.getUnknownFields();
-    }
-    private ProfilingReportMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
-
-    private static final ProfilingReportMessage defaultInstance;
-    public static ProfilingReportMessage getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public ProfilingReportMessage getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-    private final com.google.protobuf.UnknownFieldSet unknownFields;
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-        getUnknownFields() {
-      return this.unknownFields;
-    }
-    private ProfilingReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      initFields();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              name_ = input.readBytes();
-              break;
-            }
-            case 16: {
-              int rawValue = input.readEnum();
-              com.android.vts.proto.VtsReportMessage.VtsProfilingType value = com.android.vts.proto.VtsReportMessage.VtsProfilingType.valueOf(rawValue);
-              if (value == null) {
-                unknownFields.mergeVarintField(2, rawValue);
-              } else {
-                bitField0_ |= 0x00000002;
-                type_ = value;
-              }
-              break;
-            }
-            case 24: {
-              int rawValue = input.readEnum();
-              com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode value = com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.valueOf(rawValue);
-              if (value == null) {
-                unknownFields.mergeVarintField(3, rawValue);
-              } else {
-                bitField0_ |= 0x00000004;
-                regressionMode_ = value;
-              }
-              break;
-            }
-            case 88: {
-              bitField0_ |= 0x00000008;
-              startTimestamp_ = input.readInt64();
-              break;
-            }
-            case 96: {
-              bitField0_ |= 0x00000010;
-              endTimestamp_ = input.readInt64();
-              break;
-            }
-            case 170: {
-              if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-                label_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000020;
-              }
-              label_.add(input.readBytes());
-              break;
-            }
-            case 176: {
-              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
-                value_ = new java.util.ArrayList<java.lang.Long>();
-                mutable_bitField0_ |= 0x00000040;
-              }
-              value_.add(input.readInt64());
-              break;
-            }
-            case 178: {
-              int length = input.readRawVarint32();
-              int limit = input.pushLimit(length);
-              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040) && input.getBytesUntilLimit() > 0) {
-                value_ = new java.util.ArrayList<java.lang.Long>();
-                mutable_bitField0_ |= 0x00000040;
-              }
-              while (input.getBytesUntilLimit() > 0) {
-                value_.add(input.readInt64());
-              }
-              input.popLimit(limit);
-              break;
-            }
-            case 250: {
-              bitField0_ |= 0x00000020;
-              xAxisLabel_ = input.readBytes();
-              break;
-            }
-            case 258: {
-              bitField0_ |= 0x00000040;
-              yAxisLabel_ = input.readBytes();
-              break;
-            }
-            case 330: {
-              if (!((mutable_bitField0_ & 0x00000200) == 0x00000200)) {
-                options_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000200;
-              }
-              options_.add(input.readBytes());
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-          label_ = java.util.Collections.unmodifiableList(label_);
-        }
-        if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
-          value_ = java.util.Collections.unmodifiableList(value_);
-        }
-        if (((mutable_bitField0_ & 0x00000200) == 0x00000200)) {
-          options_ = java.util.Collections.unmodifiableList(options_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.class, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder.class);
-    }
-
-    public static com.google.protobuf.Parser<ProfilingReportMessage> PARSER =
-        new com.google.protobuf.AbstractParser<ProfilingReportMessage>() {
-      public ProfilingReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ProfilingReportMessage(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ProfilingReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    private int bitField0_;
-    // optional bytes name = 1;
-    public static final int NAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <code>optional bytes name = 1;</code>
-     *
-     * <pre>
-     * the instrumentation point name.
-     * </pre>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <code>optional bytes name = 1;</code>
-     *
-     * <pre>
-     * the instrumentation point name.
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    // optional .android.vts.VtsProfilingType type = 2;
-    public static final int TYPE_FIELD_NUMBER = 2;
-    private com.android.vts.proto.VtsReportMessage.VtsProfilingType type_;
-    /**
-     * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-     */
-    public boolean hasType() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.VtsProfilingType getType() {
-      return type_;
-    }
-
-    // optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;
-    public static final int REGRESSION_MODE_FIELD_NUMBER = 3;
-    private com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode regressionMode_;
-    /**
-     * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-     */
-    public boolean hasRegressionMode() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode getRegressionMode() {
-      return regressionMode_;
-    }
-
-    // optional int64 start_timestamp = 11;
-    public static final int START_TIMESTAMP_FIELD_NUMBER = 11;
-    private long startTimestamp_;
-    /**
-     * <code>optional int64 start_timestamp = 11;</code>
-     *
-     * <pre>
-     * profiling start and end time stamp (for performance).
-     * </pre>
-     */
-    public boolean hasStartTimestamp() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <code>optional int64 start_timestamp = 11;</code>
-     *
-     * <pre>
-     * profiling start and end time stamp (for performance).
-     * </pre>
-     */
-    public long getStartTimestamp() {
-      return startTimestamp_;
-    }
-
-    // optional int64 end_timestamp = 12;
-    public static final int END_TIMESTAMP_FIELD_NUMBER = 12;
-    private long endTimestamp_;
-    /**
-     * <code>optional int64 end_timestamp = 12;</code>
-     */
-    public boolean hasEndTimestamp() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <code>optional int64 end_timestamp = 12;</code>
-     */
-    public long getEndTimestamp() {
-      return endTimestamp_;
-    }
-
-    // repeated bytes label = 21;
-    public static final int LABEL_FIELD_NUMBER = 21;
-    private java.util.List<com.google.protobuf.ByteString> label_;
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getLabelList() {
-      return label_;
-    }
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    public int getLabelCount() {
-      return label_.size();
-    }
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    public com.google.protobuf.ByteString getLabel(int index) {
-      return label_.get(index);
-    }
-
-    // repeated int64 value = 22;
-    public static final int VALUE_FIELD_NUMBER = 22;
-    private java.util.List<java.lang.Long> value_;
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    public java.util.List<java.lang.Long>
-        getValueList() {
-      return value_;
-    }
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    public int getValueCount() {
-      return value_.size();
-    }
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    public long getValue(int index) {
-      return value_.get(index);
-    }
-
-    // optional bytes x_axis_label = 31;
-    public static final int X_AXIS_LABEL_FIELD_NUMBER = 31;
-    private com.google.protobuf.ByteString xAxisLabel_;
-    /**
-     * <code>optional bytes x_axis_label = 31;</code>
-     *
-     * <pre>
-     * x-axis and y-axis title labels when displaying the data as a graph
-     * </pre>
-     */
-    public boolean hasXAxisLabel() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
-    }
-    /**
-     * <code>optional bytes x_axis_label = 31;</code>
-     *
-     * <pre>
-     * x-axis and y-axis title labels when displaying the data as a graph
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getXAxisLabel() {
-      return xAxisLabel_;
-    }
-
-    // optional bytes y_axis_label = 32;
-    public static final int Y_AXIS_LABEL_FIELD_NUMBER = 32;
-    private com.google.protobuf.ByteString yAxisLabel_;
-    /**
-     * <code>optional bytes y_axis_label = 32;</code>
-     */
-    public boolean hasYAxisLabel() {
-      return ((bitField0_ & 0x00000040) == 0x00000040);
-    }
-    /**
-     * <code>optional bytes y_axis_label = 32;</code>
-     */
-    public com.google.protobuf.ByteString getYAxisLabel() {
-      return yAxisLabel_;
-    }
-
-    // repeated bytes options = 41;
-    public static final int OPTIONS_FIELD_NUMBER = 41;
-    private java.util.List<com.google.protobuf.ByteString> options_;
-    /**
-     * <code>repeated bytes options = 41;</code>
-     *
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getOptionsList() {
-      return options_;
-    }
-    /**
-     * <code>repeated bytes options = 41;</code>
-     *
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     */
-    public int getOptionsCount() {
-      return options_.size();
-    }
-    /**
-     * <code>repeated bytes options = 41;</code>
-     *
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getOptions(int index) {
-      return options_.get(index);
-    }
-
-    private void initFields() {
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      type_ = com.android.vts.proto.VtsReportMessage.VtsProfilingType.UNKNOWN_VTS_PROFILING_TYPE;
-      regressionMode_ = com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE;
-      startTimestamp_ = 0L;
-      endTimestamp_ = 0L;
-      label_ = java.util.Collections.emptyList();
-      value_ = java.util.Collections.emptyList();
-      xAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-      yAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-      options_ = java.util.Collections.emptyList();
-    }
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized != -1) return isInitialized == 1;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, name_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeEnum(2, type_.getNumber());
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeEnum(3, regressionMode_.getNumber());
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeInt64(11, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeInt64(12, endTimestamp_);
-      }
-      for (int i = 0; i < label_.size(); i++) {
-        output.writeBytes(21, label_.get(i));
-      }
-      for (int i = 0; i < value_.size(); i++) {
-        output.writeInt64(22, value_.get(i));
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        output.writeBytes(31, xAxisLabel_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        output.writeBytes(32, yAxisLabel_);
-      }
-      for (int i = 0; i < options_.size(); i++) {
-        output.writeBytes(41, options_.get(i));
-      }
-      getUnknownFields().writeTo(output);
-    }
-
-    private int memoizedSerializedSize = -1;
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, name_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(2, type_.getNumber());
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(3, regressionMode_.getNumber());
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(11, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(12, endTimestamp_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < label_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(label_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getLabelList().size();
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < value_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeInt64SizeNoTag(value_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getValueList().size();
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(31, xAxisLabel_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(32, yAxisLabel_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < options_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(options_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getOptionsList().size();
-      }
-      size += getUnknownFields().getSerializedSize();
-      memoizedSerializedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    protected java.lang.Object writeReplace()
-        throws java.io.ObjectStreamException {
-      return super.writeReplace();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-
-    public static Builder newBuilder() { return Builder.create(); }
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() { return newBuilder(this); }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code android.vts.ProfilingReportMessage}
-     *
-     * <pre>
-     * To specify a profiling report.
-     * </pre>
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessage.Builder<Builder>
-       implements com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.class, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-        }
-      }
-      private static Builder create() {
-        return new Builder();
-      }
-
-      public Builder clear() {
-        super.clear();
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        type_ = com.android.vts.proto.VtsReportMessage.VtsProfilingType.UNKNOWN_VTS_PROFILING_TYPE;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        regressionMode_ = com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        startTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        endTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        label_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000020);
-        value_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000040);
-        xAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000080);
-        yAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000100);
-        options_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000200);
-        return this;
-      }
-
-      public Builder clone() {
-        return create().mergeFrom(buildPartial());
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.ProfilingReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.ProfilingReportMessage result = new com.android.vts.proto.VtsReportMessage.ProfilingReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.type_ = type_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.regressionMode_ = regressionMode_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.startTimestamp_ = startTimestamp_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.endTimestamp_ = endTimestamp_;
-        if (((bitField0_ & 0x00000020) == 0x00000020)) {
-          label_ = java.util.Collections.unmodifiableList(label_);
-          bitField0_ = (bitField0_ & ~0x00000020);
-        }
-        result.label_ = label_;
-        if (((bitField0_ & 0x00000040) == 0x00000040)) {
-          value_ = java.util.Collections.unmodifiableList(value_);
-          bitField0_ = (bitField0_ & ~0x00000040);
-        }
-        result.value_ = value_;
-        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
-          to_bitField0_ |= 0x00000020;
-        }
-        result.xAxisLabel_ = xAxisLabel_;
-        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
-          to_bitField0_ |= 0x00000040;
-        }
-        result.yAxisLabel_ = yAxisLabel_;
-        if (((bitField0_ & 0x00000200) == 0x00000200)) {
-          options_ = java.util.Collections.unmodifiableList(options_);
-          bitField0_ = (bitField0_ & ~0x00000200);
-        }
-        result.options_ = options_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.ProfilingReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.ProfilingReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance()) return this;
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasType()) {
-          setType(other.getType());
-        }
-        if (other.hasRegressionMode()) {
-          setRegressionMode(other.getRegressionMode());
-        }
-        if (other.hasStartTimestamp()) {
-          setStartTimestamp(other.getStartTimestamp());
-        }
-        if (other.hasEndTimestamp()) {
-          setEndTimestamp(other.getEndTimestamp());
-        }
-        if (!other.label_.isEmpty()) {
-          if (label_.isEmpty()) {
-            label_ = other.label_;
-            bitField0_ = (bitField0_ & ~0x00000020);
-          } else {
-            ensureLabelIsMutable();
-            label_.addAll(other.label_);
-          }
-          onChanged();
-        }
-        if (!other.value_.isEmpty()) {
-          if (value_.isEmpty()) {
-            value_ = other.value_;
-            bitField0_ = (bitField0_ & ~0x00000040);
-          } else {
-            ensureValueIsMutable();
-            value_.addAll(other.value_);
-          }
-          onChanged();
-        }
-        if (other.hasXAxisLabel()) {
-          setXAxisLabel(other.getXAxisLabel());
-        }
-        if (other.hasYAxisLabel()) {
-          setYAxisLabel(other.getYAxisLabel());
-        }
-        if (!other.options_.isEmpty()) {
-          if (options_.isEmpty()) {
-            options_ = other.options_;
-            bitField0_ = (bitField0_ & ~0x00000200);
-          } else {
-            ensureOptionsIsMutable();
-            options_.addAll(other.options_);
-          }
-          onChanged();
-        }
-        this.mergeUnknownFields(other.getUnknownFields());
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.ProfilingReportMessage) e.getUnfinishedMessage();
-          throw e;
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      // optional bytes name = 1;
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes name = 1;</code>
-       *
-       * <pre>
-       * the instrumentation point name.
-       * </pre>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes name = 1;</code>
-       *
-       * <pre>
-       * the instrumentation point name.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <code>optional bytes name = 1;</code>
-       *
-       * <pre>
-       * the instrumentation point name.
-       * </pre>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes name = 1;</code>
-       *
-       * <pre>
-       * the instrumentation point name.
-       * </pre>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      // optional .android.vts.VtsProfilingType type = 2;
-      private com.android.vts.proto.VtsReportMessage.VtsProfilingType type_ = com.android.vts.proto.VtsReportMessage.VtsProfilingType.UNKNOWN_VTS_PROFILING_TYPE;
-      /**
-       * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-       */
-      public boolean hasType() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsProfilingType getType() {
-        return type_;
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-       */
-      public Builder setType(com.android.vts.proto.VtsReportMessage.VtsProfilingType value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        bitField0_ |= 0x00000002;
-        type_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-       */
-      public Builder clearType() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        type_ = com.android.vts.proto.VtsReportMessage.VtsProfilingType.UNKNOWN_VTS_PROFILING_TYPE;
-        onChanged();
-        return this;
-      }
-
-      // optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;
-      private com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode regressionMode_ = com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE;
-      /**
-       * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-       */
-      public boolean hasRegressionMode() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode getRegressionMode() {
-        return regressionMode_;
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-       */
-      public Builder setRegressionMode(com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        bitField0_ |= 0x00000004;
-        regressionMode_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-       */
-      public Builder clearRegressionMode() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        regressionMode_ = com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE;
-        onChanged();
-        return this;
-      }
-
-      // optional int64 start_timestamp = 11;
-      private long startTimestamp_ ;
-      /**
-       * <code>optional int64 start_timestamp = 11;</code>
-       *
-       * <pre>
-       * profiling start and end time stamp (for performance).
-       * </pre>
-       */
-      public boolean hasStartTimestamp() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <code>optional int64 start_timestamp = 11;</code>
-       *
-       * <pre>
-       * profiling start and end time stamp (for performance).
-       * </pre>
-       */
-      public long getStartTimestamp() {
-        return startTimestamp_;
-      }
-      /**
-       * <code>optional int64 start_timestamp = 11;</code>
-       *
-       * <pre>
-       * profiling start and end time stamp (for performance).
-       * </pre>
-       */
-      public Builder setStartTimestamp(long value) {
-        bitField0_ |= 0x00000008;
-        startTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 start_timestamp = 11;</code>
-       *
-       * <pre>
-       * profiling start and end time stamp (for performance).
-       * </pre>
-       */
-      public Builder clearStartTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        startTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      // optional int64 end_timestamp = 12;
-      private long endTimestamp_ ;
-      /**
-       * <code>optional int64 end_timestamp = 12;</code>
-       */
-      public boolean hasEndTimestamp() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <code>optional int64 end_timestamp = 12;</code>
-       */
-      public long getEndTimestamp() {
-        return endTimestamp_;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 12;</code>
-       */
-      public Builder setEndTimestamp(long value) {
-        bitField0_ |= 0x00000010;
-        endTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 12;</code>
-       */
-      public Builder clearEndTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        endTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      // repeated bytes label = 21;
-      private java.util.List<com.google.protobuf.ByteString> label_ = java.util.Collections.emptyList();
-      private void ensureLabelIsMutable() {
-        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
-          label_ = new java.util.ArrayList<com.google.protobuf.ByteString>(label_);
-          bitField0_ |= 0x00000020;
-         }
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getLabelList() {
-        return java.util.Collections.unmodifiableList(label_);
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public int getLabelCount() {
-        return label_.size();
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public com.google.protobuf.ByteString getLabel(int index) {
-        return label_.get(index);
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public Builder setLabel(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureLabelIsMutable();
-        label_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public Builder addLabel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureLabelIsMutable();
-        label_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public Builder addAllLabel(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureLabelIsMutable();
-        super.addAll(values, label_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public Builder clearLabel() {
-        label_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000020);
-        onChanged();
-        return this;
-      }
-
-      // repeated int64 value = 22;
-      private java.util.List<java.lang.Long> value_ = java.util.Collections.emptyList();
-      private void ensureValueIsMutable() {
-        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
-          value_ = new java.util.ArrayList<java.lang.Long>(value_);
-          bitField0_ |= 0x00000040;
-         }
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public java.util.List<java.lang.Long>
-          getValueList() {
-        return java.util.Collections.unmodifiableList(value_);
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public int getValueCount() {
-        return value_.size();
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public long getValue(int index) {
-        return value_.get(index);
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public Builder setValue(
-          int index, long value) {
-        ensureValueIsMutable();
-        value_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public Builder addValue(long value) {
-        ensureValueIsMutable();
-        value_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public Builder addAllValue(
-          java.lang.Iterable<? extends java.lang.Long> values) {
-        ensureValueIsMutable();
-        super.addAll(values, value_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public Builder clearValue() {
-        value_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000040);
-        onChanged();
-        return this;
-      }
-
-      // optional bytes x_axis_label = 31;
-      private com.google.protobuf.ByteString xAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes x_axis_label = 31;</code>
-       *
-       * <pre>
-       * x-axis and y-axis title labels when displaying the data as a graph
-       * </pre>
-       */
-      public boolean hasXAxisLabel() {
-        return ((bitField0_ & 0x00000080) == 0x00000080);
-      }
-      /**
-       * <code>optional bytes x_axis_label = 31;</code>
-       *
-       * <pre>
-       * x-axis and y-axis title labels when displaying the data as a graph
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getXAxisLabel() {
-        return xAxisLabel_;
-      }
-      /**
-       * <code>optional bytes x_axis_label = 31;</code>
-       *
-       * <pre>
-       * x-axis and y-axis title labels when displaying the data as a graph
-       * </pre>
-       */
-      public Builder setXAxisLabel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000080;
-        xAxisLabel_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes x_axis_label = 31;</code>
-       *
-       * <pre>
-       * x-axis and y-axis title labels when displaying the data as a graph
-       * </pre>
-       */
-      public Builder clearXAxisLabel() {
-        bitField0_ = (bitField0_ & ~0x00000080);
-        xAxisLabel_ = getDefaultInstance().getXAxisLabel();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes y_axis_label = 32;
-      private com.google.protobuf.ByteString yAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes y_axis_label = 32;</code>
-       */
-      public boolean hasYAxisLabel() {
-        return ((bitField0_ & 0x00000100) == 0x00000100);
-      }
-      /**
-       * <code>optional bytes y_axis_label = 32;</code>
-       */
-      public com.google.protobuf.ByteString getYAxisLabel() {
-        return yAxisLabel_;
-      }
-      /**
-       * <code>optional bytes y_axis_label = 32;</code>
-       */
-      public Builder setYAxisLabel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000100;
-        yAxisLabel_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes y_axis_label = 32;</code>
-       */
-      public Builder clearYAxisLabel() {
-        bitField0_ = (bitField0_ & ~0x00000100);
-        yAxisLabel_ = getDefaultInstance().getYAxisLabel();
-        onChanged();
-        return this;
-      }
-
-      // repeated bytes options = 41;
-      private java.util.List<com.google.protobuf.ByteString> options_ = java.util.Collections.emptyList();
-      private void ensureOptionsIsMutable() {
-        if (!((bitField0_ & 0x00000200) == 0x00000200)) {
-          options_ = new java.util.ArrayList<com.google.protobuf.ByteString>(options_);
-          bitField0_ |= 0x00000200;
-         }
-      }
-      /**
-       * <code>repeated bytes options = 41;</code>
-       *
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getOptionsList() {
-        return java.util.Collections.unmodifiableList(options_);
-      }
-      /**
-       * <code>repeated bytes options = 41;</code>
-       *
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       */
-      public int getOptionsCount() {
-        return options_.size();
-      }
-      /**
-       * <code>repeated bytes options = 41;</code>
-       *
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getOptions(int index) {
-        return options_.get(index);
-      }
-      /**
-       * <code>repeated bytes options = 41;</code>
-       *
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       */
-      public Builder setOptions(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureOptionsIsMutable();
-        options_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes options = 41;</code>
-       *
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       */
-      public Builder addOptions(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureOptionsIsMutable();
-        options_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes options = 41;</code>
-       *
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       */
-      public Builder addAllOptions(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureOptionsIsMutable();
-        super.addAll(values, options_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes options = 41;</code>
-       *
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       */
-      public Builder clearOptions() {
-        options_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000200);
-        onChanged();
-        return this;
-      }
-
-      // @@protoc_insertion_point(builder_scope:android.vts.ProfilingReportMessage)
-    }
-
-    static {
-      defaultInstance = new ProfilingReportMessage(true);
-      defaultInstance.initFields();
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.ProfilingReportMessage)
-  }
-
-  public interface SystraceReportMessageOrBuilder
-      extends com.google.protobuf.MessageOrBuilder {
-
-    // optional bytes process_name = 1;
-    /**
-     * <code>optional bytes process_name = 1;</code>
-     *
-     * <pre>
-     * the target process name used by systrace
-     * </pre>
-     */
-    boolean hasProcessName();
-    /**
-     * <code>optional bytes process_name = 1;</code>
-     *
-     * <pre>
-     * the target process name used by systrace
-     * </pre>
-     */
-    com.google.protobuf.ByteString getProcessName();
-
-    // repeated bytes html = 11;
-    /**
-     * <code>repeated bytes html = 11;</code>
-     *
-     * <pre>
-     * the produced html report
-     * </pre>
-     */
-    java.util.List<com.google.protobuf.ByteString> getHtmlList();
-    /**
-     * <code>repeated bytes html = 11;</code>
-     *
-     * <pre>
-     * the produced html report
-     * </pre>
-     */
-    int getHtmlCount();
-    /**
-     * <code>repeated bytes html = 11;</code>
-     *
-     * <pre>
-     * the produced html report
-     * </pre>
-     */
-    com.google.protobuf.ByteString getHtml(int index);
-
-    // repeated bytes url = 21;
-    /**
-     * <code>repeated bytes url = 21;</code>
-     *
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     */
-    java.util.List<com.google.protobuf.ByteString> getUrlList();
-    /**
-     * <code>repeated bytes url = 21;</code>
-     *
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     */
-    int getUrlCount();
-    /**
-     * <code>repeated bytes url = 21;</code>
-     *
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     */
-    com.google.protobuf.ByteString getUrl(int index);
-  }
-  /**
-   * Protobuf type {@code android.vts.SystraceReportMessage}
-   *
-   * <pre>
-   * To specify a systrace report.
-   * </pre>
-   */
-  public static final class SystraceReportMessage extends
-      com.google.protobuf.GeneratedMessage
-      implements SystraceReportMessageOrBuilder {
-    // Use SystraceReportMessage.newBuilder() to construct.
-    private SystraceReportMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-      super(builder);
-      this.unknownFields = builder.getUnknownFields();
-    }
-    private SystraceReportMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
-
-    private static final SystraceReportMessage defaultInstance;
-    public static SystraceReportMessage getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public SystraceReportMessage getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-    private final com.google.protobuf.UnknownFieldSet unknownFields;
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-        getUnknownFields() {
-      return this.unknownFields;
-    }
-    private SystraceReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      initFields();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              processName_ = input.readBytes();
-              break;
-            }
-            case 90: {
-              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                html_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              html_.add(input.readBytes());
-              break;
-            }
-            case 170: {
-              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-                url_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000004;
-              }
-              url_.add(input.readBytes());
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-          html_ = java.util.Collections.unmodifiableList(html_);
-        }
-        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-          url_ = java.util.Collections.unmodifiableList(url_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.SystraceReportMessage.class, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder.class);
-    }
-
-    public static com.google.protobuf.Parser<SystraceReportMessage> PARSER =
-        new com.google.protobuf.AbstractParser<SystraceReportMessage>() {
-      public SystraceReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SystraceReportMessage(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<SystraceReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    private int bitField0_;
-    // optional bytes process_name = 1;
-    public static final int PROCESS_NAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString processName_;
-    /**
-     * <code>optional bytes process_name = 1;</code>
-     *
-     * <pre>
-     * the target process name used by systrace
-     * </pre>
-     */
-    public boolean hasProcessName() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <code>optional bytes process_name = 1;</code>
-     *
-     * <pre>
-     * the target process name used by systrace
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getProcessName() {
-      return processName_;
-    }
-
-    // repeated bytes html = 11;
-    public static final int HTML_FIELD_NUMBER = 11;
-    private java.util.List<com.google.protobuf.ByteString> html_;
-    /**
-     * <code>repeated bytes html = 11;</code>
-     *
-     * <pre>
-     * the produced html report
-     * </pre>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getHtmlList() {
-      return html_;
-    }
-    /**
-     * <code>repeated bytes html = 11;</code>
-     *
-     * <pre>
-     * the produced html report
-     * </pre>
-     */
-    public int getHtmlCount() {
-      return html_.size();
-    }
-    /**
-     * <code>repeated bytes html = 11;</code>
-     *
-     * <pre>
-     * the produced html report
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getHtml(int index) {
-      return html_.get(index);
-    }
-
-    // repeated bytes url = 21;
-    public static final int URL_FIELD_NUMBER = 21;
-    private java.util.List<com.google.protobuf.ByteString> url_;
-    /**
-     * <code>repeated bytes url = 21;</code>
-     *
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getUrlList() {
-      return url_;
-    }
-    /**
-     * <code>repeated bytes url = 21;</code>
-     *
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     */
-    public int getUrlCount() {
-      return url_.size();
-    }
-    /**
-     * <code>repeated bytes url = 21;</code>
-     *
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getUrl(int index) {
-      return url_.get(index);
-    }
-
-    private void initFields() {
-      processName_ = com.google.protobuf.ByteString.EMPTY;
-      html_ = java.util.Collections.emptyList();
-      url_ = java.util.Collections.emptyList();
-    }
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized != -1) return isInitialized == 1;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, processName_);
-      }
-      for (int i = 0; i < html_.size(); i++) {
-        output.writeBytes(11, html_.get(i));
-      }
-      for (int i = 0; i < url_.size(); i++) {
-        output.writeBytes(21, url_.get(i));
-      }
-      getUnknownFields().writeTo(output);
-    }
-
-    private int memoizedSerializedSize = -1;
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, processName_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < html_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(html_.get(i));
-        }
-        size += dataSize;
-        size += 1 * getHtmlList().size();
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < url_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(url_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getUrlList().size();
-      }
-      size += getUnknownFields().getSerializedSize();
-      memoizedSerializedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    protected java.lang.Object writeReplace()
-        throws java.io.ObjectStreamException {
-      return super.writeReplace();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-
-    public static Builder newBuilder() { return Builder.create(); }
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.SystraceReportMessage prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() { return newBuilder(this); }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code android.vts.SystraceReportMessage}
-     *
-     * <pre>
-     * To specify a systrace report.
-     * </pre>
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessage.Builder<Builder>
-       implements com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.SystraceReportMessage.class, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.SystraceReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-        }
-      }
-      private static Builder create() {
-        return new Builder();
-      }
-
-      public Builder clear() {
-        super.clear();
-        processName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        html_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000002);
-        url_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000004);
-        return this;
-      }
-
-      public Builder clone() {
-        return create().mergeFrom(buildPartial());
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.SystraceReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.SystraceReportMessage result = new com.android.vts.proto.VtsReportMessage.SystraceReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.processName_ = processName_;
-        if (((bitField0_ & 0x00000002) == 0x00000002)) {
-          html_ = java.util.Collections.unmodifiableList(html_);
-          bitField0_ = (bitField0_ & ~0x00000002);
-        }
-        result.html_ = html_;
-        if (((bitField0_ & 0x00000004) == 0x00000004)) {
-          url_ = java.util.Collections.unmodifiableList(url_);
-          bitField0_ = (bitField0_ & ~0x00000004);
-        }
-        result.url_ = url_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.SystraceReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.SystraceReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.SystraceReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance()) return this;
-        if (other.hasProcessName()) {
-          setProcessName(other.getProcessName());
-        }
-        if (!other.html_.isEmpty()) {
-          if (html_.isEmpty()) {
-            html_ = other.html_;
-            bitField0_ = (bitField0_ & ~0x00000002);
-          } else {
-            ensureHtmlIsMutable();
-            html_.addAll(other.html_);
-          }
-          onChanged();
-        }
-        if (!other.url_.isEmpty()) {
-          if (url_.isEmpty()) {
-            url_ = other.url_;
-            bitField0_ = (bitField0_ & ~0x00000004);
-          } else {
-            ensureUrlIsMutable();
-            url_.addAll(other.url_);
-          }
-          onChanged();
-        }
-        this.mergeUnknownFields(other.getUnknownFields());
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.SystraceReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.SystraceReportMessage) e.getUnfinishedMessage();
-          throw e;
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      // optional bytes process_name = 1;
-      private com.google.protobuf.ByteString processName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes process_name = 1;</code>
-       *
-       * <pre>
-       * the target process name used by systrace
-       * </pre>
-       */
-      public boolean hasProcessName() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes process_name = 1;</code>
-       *
-       * <pre>
-       * the target process name used by systrace
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getProcessName() {
-        return processName_;
-      }
-      /**
-       * <code>optional bytes process_name = 1;</code>
-       *
-       * <pre>
-       * the target process name used by systrace
-       * </pre>
-       */
-      public Builder setProcessName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        processName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes process_name = 1;</code>
-       *
-       * <pre>
-       * the target process name used by systrace
-       * </pre>
-       */
-      public Builder clearProcessName() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        processName_ = getDefaultInstance().getProcessName();
-        onChanged();
-        return this;
-      }
-
-      // repeated bytes html = 11;
-      private java.util.List<com.google.protobuf.ByteString> html_ = java.util.Collections.emptyList();
-      private void ensureHtmlIsMutable() {
-        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
-          html_ = new java.util.ArrayList<com.google.protobuf.ByteString>(html_);
-          bitField0_ |= 0x00000002;
-         }
-      }
-      /**
-       * <code>repeated bytes html = 11;</code>
-       *
-       * <pre>
-       * the produced html report
-       * </pre>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getHtmlList() {
-        return java.util.Collections.unmodifiableList(html_);
-      }
-      /**
-       * <code>repeated bytes html = 11;</code>
-       *
-       * <pre>
-       * the produced html report
-       * </pre>
-       */
-      public int getHtmlCount() {
-        return html_.size();
-      }
-      /**
-       * <code>repeated bytes html = 11;</code>
-       *
-       * <pre>
-       * the produced html report
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getHtml(int index) {
-        return html_.get(index);
-      }
-      /**
-       * <code>repeated bytes html = 11;</code>
-       *
-       * <pre>
-       * the produced html report
-       * </pre>
-       */
-      public Builder setHtml(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureHtmlIsMutable();
-        html_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes html = 11;</code>
-       *
-       * <pre>
-       * the produced html report
-       * </pre>
-       */
-      public Builder addHtml(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureHtmlIsMutable();
-        html_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes html = 11;</code>
-       *
-       * <pre>
-       * the produced html report
-       * </pre>
-       */
-      public Builder addAllHtml(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureHtmlIsMutable();
-        super.addAll(values, html_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes html = 11;</code>
-       *
-       * <pre>
-       * the produced html report
-       * </pre>
-       */
-      public Builder clearHtml() {
-        html_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000002);
-        onChanged();
-        return this;
-      }
-
-      // repeated bytes url = 21;
-      private java.util.List<com.google.protobuf.ByteString> url_ = java.util.Collections.emptyList();
-      private void ensureUrlIsMutable() {
-        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
-          url_ = new java.util.ArrayList<com.google.protobuf.ByteString>(url_);
-          bitField0_ |= 0x00000004;
-         }
-      }
-      /**
-       * <code>repeated bytes url = 21;</code>
-       *
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getUrlList() {
-        return java.util.Collections.unmodifiableList(url_);
-      }
-      /**
-       * <code>repeated bytes url = 21;</code>
-       *
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       */
-      public int getUrlCount() {
-        return url_.size();
-      }
-      /**
-       * <code>repeated bytes url = 21;</code>
-       *
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getUrl(int index) {
-        return url_.get(index);
-      }
-      /**
-       * <code>repeated bytes url = 21;</code>
-       *
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       */
-      public Builder setUrl(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureUrlIsMutable();
-        url_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes url = 21;</code>
-       *
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       */
-      public Builder addUrl(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureUrlIsMutable();
-        url_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes url = 21;</code>
-       *
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       */
-      public Builder addAllUrl(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureUrlIsMutable();
-        super.addAll(values, url_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes url = 21;</code>
-       *
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       */
-      public Builder clearUrl() {
-        url_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000004);
-        onChanged();
-        return this;
-      }
-
-      // @@protoc_insertion_point(builder_scope:android.vts.SystraceReportMessage)
-    }
-
-    static {
-      defaultInstance = new SystraceReportMessage(true);
-      defaultInstance.initFields();
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.SystraceReportMessage)
-  }
-
-  public interface CoverageReportMessageOrBuilder
-      extends com.google.protobuf.MessageOrBuilder {
-
-    // optional bytes file_path = 11;
-    /**
-     * <code>optional bytes file_path = 11;</code>
-     *
-     * <pre>
-     * the path to the source file from the project root.
-     * </pre>
-     */
-    boolean hasFilePath();
-    /**
-     * <code>optional bytes file_path = 11;</code>
-     *
-     * <pre>
-     * the path to the source file from the project root.
-     * </pre>
-     */
-    com.google.protobuf.ByteString getFilePath();
-
-    // optional bytes project_name = 12;
-    /**
-     * <code>optional bytes project_name = 12;</code>
-     *
-     * <pre>
-     * the name of the project where the file can be found
-     * </pre>
-     */
-    boolean hasProjectName();
-    /**
-     * <code>optional bytes project_name = 12;</code>
-     *
-     * <pre>
-     * the name of the project where the file can be found
-     * </pre>
-     */
-    com.google.protobuf.ByteString getProjectName();
-
-    // optional bytes revision = 13;
-    /**
-     * <code>optional bytes revision = 13;</code>
-     *
-     * <pre>
-     * the commit ID identifying the code revision
-     * </pre>
-     */
-    boolean hasRevision();
-    /**
-     * <code>optional bytes revision = 13;</code>
-     *
-     * <pre>
-     * the commit ID identifying the code revision
-     * </pre>
-     */
-    com.google.protobuf.ByteString getRevision();
-
-    // repeated int32 line_coverage_vector = 23;
-    /**
-     * <code>repeated int32 line_coverage_vector = 23;</code>
-     *
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     */
-    java.util.List<java.lang.Integer> getLineCoverageVectorList();
-    /**
-     * <code>repeated int32 line_coverage_vector = 23;</code>
-     *
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     */
-    int getLineCoverageVectorCount();
-    /**
-     * <code>repeated int32 line_coverage_vector = 23;</code>
-     *
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     */
-    int getLineCoverageVector(int index);
-
-    // optional int32 total_line_count = 101;
-    /**
-     * <code>optional int32 total_line_count = 101;</code>
-     *
-     * <pre>
-     * the number of source code lines that are instrumented for code coverage
-     * measurement.
-     * </pre>
-     */
-    boolean hasTotalLineCount();
-    /**
-     * <code>optional int32 total_line_count = 101;</code>
-     *
-     * <pre>
-     * the number of source code lines that are instrumented for code coverage
-     * measurement.
-     * </pre>
-     */
-    int getTotalLineCount();
-
-    // optional int32 covered_line_count = 102;
-    /**
-     * <code>optional int32 covered_line_count = 102;</code>
-     *
-     * <pre>
-     * the number of source code lines that are executed.
-     * </pre>
-     */
-    boolean hasCoveredLineCount();
-    /**
-     * <code>optional int32 covered_line_count = 102;</code>
-     *
-     * <pre>
-     * the number of source code lines that are executed.
-     * </pre>
-     */
-    int getCoveredLineCount();
-
-    // optional bytes dir_path = 1 [deprecated = true];
-    /**
-     * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * the directory path of a source file.
-     * </pre>
-     */
-    @java.lang.Deprecated boolean hasDirPath();
-    /**
-     * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * the directory path of a source file.
-     * </pre>
-     */
-    @java.lang.Deprecated com.google.protobuf.ByteString getDirPath();
-
-    // optional bytes file_name = 2 [deprecated = true];
-    /**
-     * <code>optional bytes file_name = 2 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * the name of the source file.
-     * </pre>
-     */
-    @java.lang.Deprecated boolean hasFileName();
-    /**
-     * <code>optional bytes file_name = 2 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * the name of the source file.
-     * </pre>
-     */
-    @java.lang.Deprecated com.google.protobuf.ByteString getFileName();
-
-    // optional bytes html = 3 [deprecated = true];
-    /**
-     * <code>optional bytes html = 3 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * produced html report.
-     * </pre>
-     */
-    @java.lang.Deprecated boolean hasHtml();
-    /**
-     * <code>optional bytes html = 3 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * produced html report.
-     * </pre>
-     */
-    @java.lang.Deprecated com.google.protobuf.ByteString getHtml();
-  }
-  /**
-   * Protobuf type {@code android.vts.CoverageReportMessage}
-   *
-   * <pre>
-   * To specify a coverage report.
-   * </pre>
-   */
-  public static final class CoverageReportMessage extends
-      com.google.protobuf.GeneratedMessage
-      implements CoverageReportMessageOrBuilder {
-    // Use CoverageReportMessage.newBuilder() to construct.
-    private CoverageReportMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-      super(builder);
-      this.unknownFields = builder.getUnknownFields();
-    }
-    private CoverageReportMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
-
-    private static final CoverageReportMessage defaultInstance;
-    public static CoverageReportMessage getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public CoverageReportMessage getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-    private final com.google.protobuf.UnknownFieldSet unknownFields;
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-        getUnknownFields() {
-      return this.unknownFields;
-    }
-    private CoverageReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      initFields();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000020;
-              dirPath_ = input.readBytes();
-              break;
-            }
-            case 18: {
-              bitField0_ |= 0x00000040;
-              fileName_ = input.readBytes();
-              break;
-            }
-            case 26: {
-              bitField0_ |= 0x00000080;
-              html_ = input.readBytes();
-              break;
-            }
-            case 90: {
-              bitField0_ |= 0x00000001;
-              filePath_ = input.readBytes();
-              break;
-            }
-            case 98: {
-              bitField0_ |= 0x00000002;
-              projectName_ = input.readBytes();
-              break;
-            }
-            case 106: {
-              bitField0_ |= 0x00000004;
-              revision_ = input.readBytes();
-              break;
-            }
-            case 184: {
-              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-                lineCoverageVector_ = new java.util.ArrayList<java.lang.Integer>();
-                mutable_bitField0_ |= 0x00000008;
-              }
-              lineCoverageVector_.add(input.readInt32());
-              break;
-            }
-            case 186: {
-              int length = input.readRawVarint32();
-              int limit = input.pushLimit(length);
-              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008) && input.getBytesUntilLimit() > 0) {
-                lineCoverageVector_ = new java.util.ArrayList<java.lang.Integer>();
-                mutable_bitField0_ |= 0x00000008;
-              }
-              while (input.getBytesUntilLimit() > 0) {
-                lineCoverageVector_.add(input.readInt32());
-              }
-              input.popLimit(limit);
-              break;
-            }
-            case 808: {
-              bitField0_ |= 0x00000008;
-              totalLineCount_ = input.readInt32();
-              break;
-            }
-            case 816: {
-              bitField0_ |= 0x00000010;
-              coveredLineCount_ = input.readInt32();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-          lineCoverageVector_ = java.util.Collections.unmodifiableList(lineCoverageVector_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.CoverageReportMessage.class, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder.class);
-    }
-
-    public static com.google.protobuf.Parser<CoverageReportMessage> PARSER =
-        new com.google.protobuf.AbstractParser<CoverageReportMessage>() {
-      public CoverageReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new CoverageReportMessage(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<CoverageReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    private int bitField0_;
-    // optional bytes file_path = 11;
-    public static final int FILE_PATH_FIELD_NUMBER = 11;
-    private com.google.protobuf.ByteString filePath_;
-    /**
-     * <code>optional bytes file_path = 11;</code>
-     *
-     * <pre>
-     * the path to the source file from the project root.
-     * </pre>
-     */
-    public boolean hasFilePath() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <code>optional bytes file_path = 11;</code>
-     *
-     * <pre>
-     * the path to the source file from the project root.
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getFilePath() {
-      return filePath_;
-    }
-
-    // optional bytes project_name = 12;
-    public static final int PROJECT_NAME_FIELD_NUMBER = 12;
-    private com.google.protobuf.ByteString projectName_;
-    /**
-     * <code>optional bytes project_name = 12;</code>
-     *
-     * <pre>
-     * the name of the project where the file can be found
-     * </pre>
-     */
-    public boolean hasProjectName() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <code>optional bytes project_name = 12;</code>
-     *
-     * <pre>
-     * the name of the project where the file can be found
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getProjectName() {
-      return projectName_;
-    }
-
-    // optional bytes revision = 13;
-    public static final int REVISION_FIELD_NUMBER = 13;
-    private com.google.protobuf.ByteString revision_;
-    /**
-     * <code>optional bytes revision = 13;</code>
-     *
-     * <pre>
-     * the commit ID identifying the code revision
-     * </pre>
-     */
-    public boolean hasRevision() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <code>optional bytes revision = 13;</code>
-     *
-     * <pre>
-     * the commit ID identifying the code revision
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getRevision() {
-      return revision_;
-    }
-
-    // repeated int32 line_coverage_vector = 23;
-    public static final int LINE_COVERAGE_VECTOR_FIELD_NUMBER = 23;
-    private java.util.List<java.lang.Integer> lineCoverageVector_;
-    /**
-     * <code>repeated int32 line_coverage_vector = 23;</code>
-     *
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     */
-    public java.util.List<java.lang.Integer>
-        getLineCoverageVectorList() {
-      return lineCoverageVector_;
-    }
-    /**
-     * <code>repeated int32 line_coverage_vector = 23;</code>
-     *
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     */
-    public int getLineCoverageVectorCount() {
-      return lineCoverageVector_.size();
-    }
-    /**
-     * <code>repeated int32 line_coverage_vector = 23;</code>
-     *
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     */
-    public int getLineCoverageVector(int index) {
-      return lineCoverageVector_.get(index);
-    }
-
-    // optional int32 total_line_count = 101;
-    public static final int TOTAL_LINE_COUNT_FIELD_NUMBER = 101;
-    private int totalLineCount_;
-    /**
-     * <code>optional int32 total_line_count = 101;</code>
-     *
-     * <pre>
-     * the number of source code lines that are instrumented for code coverage
-     * measurement.
-     * </pre>
-     */
-    public boolean hasTotalLineCount() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <code>optional int32 total_line_count = 101;</code>
-     *
-     * <pre>
-     * the number of source code lines that are instrumented for code coverage
-     * measurement.
-     * </pre>
-     */
-    public int getTotalLineCount() {
-      return totalLineCount_;
-    }
-
-    // optional int32 covered_line_count = 102;
-    public static final int COVERED_LINE_COUNT_FIELD_NUMBER = 102;
-    private int coveredLineCount_;
-    /**
-     * <code>optional int32 covered_line_count = 102;</code>
-     *
-     * <pre>
-     * the number of source code lines that are executed.
-     * </pre>
-     */
-    public boolean hasCoveredLineCount() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <code>optional int32 covered_line_count = 102;</code>
-     *
-     * <pre>
-     * the number of source code lines that are executed.
-     * </pre>
-     */
-    public int getCoveredLineCount() {
-      return coveredLineCount_;
-    }
-
-    // optional bytes dir_path = 1 [deprecated = true];
-    public static final int DIR_PATH_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString dirPath_;
-    /**
-     * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * the directory path of a source file.
-     * </pre>
-     */
-    @java.lang.Deprecated public boolean hasDirPath() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
-    }
-    /**
-     * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * the directory path of a source file.
-     * </pre>
-     */
-    @java.lang.Deprecated public com.google.protobuf.ByteString getDirPath() {
-      return dirPath_;
-    }
-
-    // optional bytes file_name = 2 [deprecated = true];
-    public static final int FILE_NAME_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString fileName_;
-    /**
-     * <code>optional bytes file_name = 2 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * the name of the source file.
-     * </pre>
-     */
-    @java.lang.Deprecated public boolean hasFileName() {
-      return ((bitField0_ & 0x00000040) == 0x00000040);
-    }
-    /**
-     * <code>optional bytes file_name = 2 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * the name of the source file.
-     * </pre>
-     */
-    @java.lang.Deprecated public com.google.protobuf.ByteString getFileName() {
-      return fileName_;
-    }
-
-    // optional bytes html = 3 [deprecated = true];
-    public static final int HTML_FIELD_NUMBER = 3;
-    private com.google.protobuf.ByteString html_;
-    /**
-     * <code>optional bytes html = 3 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * produced html report.
-     * </pre>
-     */
-    @java.lang.Deprecated public boolean hasHtml() {
-      return ((bitField0_ & 0x00000080) == 0x00000080);
-    }
-    /**
-     * <code>optional bytes html = 3 [deprecated = true];</code>
-     *
-     * <pre>
-     * TODO(ryanjcampbell@) delete deprecated field
-     * produced html report.
-     * </pre>
-     */
-    @java.lang.Deprecated public com.google.protobuf.ByteString getHtml() {
-      return html_;
-    }
-
-    private void initFields() {
-      filePath_ = com.google.protobuf.ByteString.EMPTY;
-      projectName_ = com.google.protobuf.ByteString.EMPTY;
-      revision_ = com.google.protobuf.ByteString.EMPTY;
-      lineCoverageVector_ = java.util.Collections.emptyList();
-      totalLineCount_ = 0;
-      coveredLineCount_ = 0;
-      dirPath_ = com.google.protobuf.ByteString.EMPTY;
-      fileName_ = com.google.protobuf.ByteString.EMPTY;
-      html_ = com.google.protobuf.ByteString.EMPTY;
-    }
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized != -1) return isInitialized == 1;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        output.writeBytes(1, dirPath_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        output.writeBytes(2, fileName_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        output.writeBytes(3, html_);
-      }
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(11, filePath_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(12, projectName_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(13, revision_);
-      }
-      for (int i = 0; i < lineCoverageVector_.size(); i++) {
-        output.writeInt32(23, lineCoverageVector_.get(i));
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeInt32(101, totalLineCount_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeInt32(102, coveredLineCount_);
-      }
-      getUnknownFields().writeTo(output);
-    }
-
-    private int memoizedSerializedSize = -1;
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, dirPath_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, fileName_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, html_);
-      }
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(11, filePath_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(12, projectName_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(13, revision_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < lineCoverageVector_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeInt32SizeNoTag(lineCoverageVector_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getLineCoverageVectorList().size();
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(101, totalLineCount_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(102, coveredLineCount_);
-      }
-      size += getUnknownFields().getSerializedSize();
-      memoizedSerializedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    protected java.lang.Object writeReplace()
-        throws java.io.ObjectStreamException {
-      return super.writeReplace();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-
-    public static Builder newBuilder() { return Builder.create(); }
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.CoverageReportMessage prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() { return newBuilder(this); }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code android.vts.CoverageReportMessage}
-     *
-     * <pre>
-     * To specify a coverage report.
-     * </pre>
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessage.Builder<Builder>
-       implements com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.CoverageReportMessage.class, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.CoverageReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-        }
-      }
-      private static Builder create() {
-        return new Builder();
-      }
-
-      public Builder clear() {
-        super.clear();
-        filePath_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        projectName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        revision_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        lineCoverageVector_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000008);
-        totalLineCount_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        coveredLineCount_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000020);
-        dirPath_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000040);
-        fileName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000080);
-        html_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000100);
-        return this;
-      }
-
-      public Builder clone() {
-        return create().mergeFrom(buildPartial());
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.CoverageReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.CoverageReportMessage result = new com.android.vts.proto.VtsReportMessage.CoverageReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.filePath_ = filePath_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.projectName_ = projectName_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.revision_ = revision_;
-        if (((bitField0_ & 0x00000008) == 0x00000008)) {
-          lineCoverageVector_ = java.util.Collections.unmodifiableList(lineCoverageVector_);
-          bitField0_ = (bitField0_ & ~0x00000008);
-        }
-        result.lineCoverageVector_ = lineCoverageVector_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.totalLineCount_ = totalLineCount_;
-        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.coveredLineCount_ = coveredLineCount_;
-        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
-          to_bitField0_ |= 0x00000020;
-        }
-        result.dirPath_ = dirPath_;
-        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
-          to_bitField0_ |= 0x00000040;
-        }
-        result.fileName_ = fileName_;
-        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
-          to_bitField0_ |= 0x00000080;
-        }
-        result.html_ = html_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.CoverageReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.CoverageReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.CoverageReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance()) return this;
-        if (other.hasFilePath()) {
-          setFilePath(other.getFilePath());
-        }
-        if (other.hasProjectName()) {
-          setProjectName(other.getProjectName());
-        }
-        if (other.hasRevision()) {
-          setRevision(other.getRevision());
-        }
-        if (!other.lineCoverageVector_.isEmpty()) {
-          if (lineCoverageVector_.isEmpty()) {
-            lineCoverageVector_ = other.lineCoverageVector_;
-            bitField0_ = (bitField0_ & ~0x00000008);
-          } else {
-            ensureLineCoverageVectorIsMutable();
-            lineCoverageVector_.addAll(other.lineCoverageVector_);
-          }
-          onChanged();
-        }
-        if (other.hasTotalLineCount()) {
-          setTotalLineCount(other.getTotalLineCount());
-        }
-        if (other.hasCoveredLineCount()) {
-          setCoveredLineCount(other.getCoveredLineCount());
-        }
-        if (other.hasDirPath()) {
-          setDirPath(other.getDirPath());
-        }
-        if (other.hasFileName()) {
-          setFileName(other.getFileName());
-        }
-        if (other.hasHtml()) {
-          setHtml(other.getHtml());
-        }
-        this.mergeUnknownFields(other.getUnknownFields());
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.CoverageReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.CoverageReportMessage) e.getUnfinishedMessage();
-          throw e;
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      // optional bytes file_path = 11;
-      private com.google.protobuf.ByteString filePath_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes file_path = 11;</code>
-       *
-       * <pre>
-       * the path to the source file from the project root.
-       * </pre>
-       */
-      public boolean hasFilePath() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes file_path = 11;</code>
-       *
-       * <pre>
-       * the path to the source file from the project root.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getFilePath() {
-        return filePath_;
-      }
-      /**
-       * <code>optional bytes file_path = 11;</code>
-       *
-       * <pre>
-       * the path to the source file from the project root.
-       * </pre>
-       */
-      public Builder setFilePath(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        filePath_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes file_path = 11;</code>
-       *
-       * <pre>
-       * the path to the source file from the project root.
-       * </pre>
-       */
-      public Builder clearFilePath() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        filePath_ = getDefaultInstance().getFilePath();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes project_name = 12;
-      private com.google.protobuf.ByteString projectName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes project_name = 12;</code>
-       *
-       * <pre>
-       * the name of the project where the file can be found
-       * </pre>
-       */
-      public boolean hasProjectName() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional bytes project_name = 12;</code>
-       *
-       * <pre>
-       * the name of the project where the file can be found
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getProjectName() {
-        return projectName_;
-      }
-      /**
-       * <code>optional bytes project_name = 12;</code>
-       *
-       * <pre>
-       * the name of the project where the file can be found
-       * </pre>
-       */
-      public Builder setProjectName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        projectName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes project_name = 12;</code>
-       *
-       * <pre>
-       * the name of the project where the file can be found
-       * </pre>
-       */
-      public Builder clearProjectName() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        projectName_ = getDefaultInstance().getProjectName();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes revision = 13;
-      private com.google.protobuf.ByteString revision_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes revision = 13;</code>
-       *
-       * <pre>
-       * the commit ID identifying the code revision
-       * </pre>
-       */
-      public boolean hasRevision() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional bytes revision = 13;</code>
-       *
-       * <pre>
-       * the commit ID identifying the code revision
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getRevision() {
-        return revision_;
-      }
-      /**
-       * <code>optional bytes revision = 13;</code>
-       *
-       * <pre>
-       * the commit ID identifying the code revision
-       * </pre>
-       */
-      public Builder setRevision(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        revision_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes revision = 13;</code>
-       *
-       * <pre>
-       * the commit ID identifying the code revision
-       * </pre>
-       */
-      public Builder clearRevision() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        revision_ = getDefaultInstance().getRevision();
-        onChanged();
-        return this;
-      }
-
-      // repeated int32 line_coverage_vector = 23;
-      private java.util.List<java.lang.Integer> lineCoverageVector_ = java.util.Collections.emptyList();
-      private void ensureLineCoverageVectorIsMutable() {
-        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
-          lineCoverageVector_ = new java.util.ArrayList<java.lang.Integer>(lineCoverageVector_);
-          bitField0_ |= 0x00000008;
-         }
-      }
-      /**
-       * <code>repeated int32 line_coverage_vector = 23;</code>
-       *
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       */
-      public java.util.List<java.lang.Integer>
-          getLineCoverageVectorList() {
-        return java.util.Collections.unmodifiableList(lineCoverageVector_);
-      }
-      /**
-       * <code>repeated int32 line_coverage_vector = 23;</code>
-       *
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       */
-      public int getLineCoverageVectorCount() {
-        return lineCoverageVector_.size();
-      }
-      /**
-       * <code>repeated int32 line_coverage_vector = 23;</code>
-       *
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       */
-      public int getLineCoverageVector(int index) {
-        return lineCoverageVector_.get(index);
-      }
-      /**
-       * <code>repeated int32 line_coverage_vector = 23;</code>
-       *
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       */
-      public Builder setLineCoverageVector(
-          int index, int value) {
-        ensureLineCoverageVectorIsMutable();
-        lineCoverageVector_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int32 line_coverage_vector = 23;</code>
-       *
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       */
-      public Builder addLineCoverageVector(int value) {
-        ensureLineCoverageVectorIsMutable();
-        lineCoverageVector_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int32 line_coverage_vector = 23;</code>
-       *
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       */
-      public Builder addAllLineCoverageVector(
-          java.lang.Iterable<? extends java.lang.Integer> values) {
-        ensureLineCoverageVectorIsMutable();
-        super.addAll(values, lineCoverageVector_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int32 line_coverage_vector = 23;</code>
-       *
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       */
-      public Builder clearLineCoverageVector() {
-        lineCoverageVector_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000008);
-        onChanged();
-        return this;
-      }
-
-      // optional int32 total_line_count = 101;
-      private int totalLineCount_ ;
-      /**
-       * <code>optional int32 total_line_count = 101;</code>
-       *
-       * <pre>
-       * the number of source code lines that are instrumented for code coverage
-       * measurement.
-       * </pre>
-       */
-      public boolean hasTotalLineCount() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <code>optional int32 total_line_count = 101;</code>
-       *
-       * <pre>
-       * the number of source code lines that are instrumented for code coverage
-       * measurement.
-       * </pre>
-       */
-      public int getTotalLineCount() {
-        return totalLineCount_;
-      }
-      /**
-       * <code>optional int32 total_line_count = 101;</code>
-       *
-       * <pre>
-       * the number of source code lines that are instrumented for code coverage
-       * measurement.
-       * </pre>
-       */
-      public Builder setTotalLineCount(int value) {
-        bitField0_ |= 0x00000010;
-        totalLineCount_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int32 total_line_count = 101;</code>
-       *
-       * <pre>
-       * the number of source code lines that are instrumented for code coverage
-       * measurement.
-       * </pre>
-       */
-      public Builder clearTotalLineCount() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        totalLineCount_ = 0;
-        onChanged();
-        return this;
-      }
-
-      // optional int32 covered_line_count = 102;
-      private int coveredLineCount_ ;
-      /**
-       * <code>optional int32 covered_line_count = 102;</code>
-       *
-       * <pre>
-       * the number of source code lines that are executed.
-       * </pre>
-       */
-      public boolean hasCoveredLineCount() {
-        return ((bitField0_ & 0x00000020) == 0x00000020);
-      }
-      /**
-       * <code>optional int32 covered_line_count = 102;</code>
-       *
-       * <pre>
-       * the number of source code lines that are executed.
-       * </pre>
-       */
-      public int getCoveredLineCount() {
-        return coveredLineCount_;
-      }
-      /**
-       * <code>optional int32 covered_line_count = 102;</code>
-       *
-       * <pre>
-       * the number of source code lines that are executed.
-       * </pre>
-       */
-      public Builder setCoveredLineCount(int value) {
-        bitField0_ |= 0x00000020;
-        coveredLineCount_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int32 covered_line_count = 102;</code>
-       *
-       * <pre>
-       * the number of source code lines that are executed.
-       * </pre>
-       */
-      public Builder clearCoveredLineCount() {
-        bitField0_ = (bitField0_ & ~0x00000020);
-        coveredLineCount_ = 0;
-        onChanged();
-        return this;
-      }
-
-      // optional bytes dir_path = 1 [deprecated = true];
-      private com.google.protobuf.ByteString dirPath_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * the directory path of a source file.
-       * </pre>
-       */
-      @java.lang.Deprecated public boolean hasDirPath() {
-        return ((bitField0_ & 0x00000040) == 0x00000040);
-      }
-      /**
-       * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * the directory path of a source file.
-       * </pre>
-       */
-      @java.lang.Deprecated public com.google.protobuf.ByteString getDirPath() {
-        return dirPath_;
-      }
-      /**
-       * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * the directory path of a source file.
-       * </pre>
-       */
-      @java.lang.Deprecated public Builder setDirPath(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000040;
-        dirPath_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * the directory path of a source file.
-       * </pre>
-       */
-      @java.lang.Deprecated public Builder clearDirPath() {
-        bitField0_ = (bitField0_ & ~0x00000040);
-        dirPath_ = getDefaultInstance().getDirPath();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes file_name = 2 [deprecated = true];
-      private com.google.protobuf.ByteString fileName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes file_name = 2 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * the name of the source file.
-       * </pre>
-       */
-      @java.lang.Deprecated public boolean hasFileName() {
-        return ((bitField0_ & 0x00000080) == 0x00000080);
-      }
-      /**
-       * <code>optional bytes file_name = 2 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * the name of the source file.
-       * </pre>
-       */
-      @java.lang.Deprecated public com.google.protobuf.ByteString getFileName() {
-        return fileName_;
-      }
-      /**
-       * <code>optional bytes file_name = 2 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * the name of the source file.
-       * </pre>
-       */
-      @java.lang.Deprecated public Builder setFileName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000080;
-        fileName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes file_name = 2 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * the name of the source file.
-       * </pre>
-       */
-      @java.lang.Deprecated public Builder clearFileName() {
-        bitField0_ = (bitField0_ & ~0x00000080);
-        fileName_ = getDefaultInstance().getFileName();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes html = 3 [deprecated = true];
-      private com.google.protobuf.ByteString html_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes html = 3 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * produced html report.
-       * </pre>
-       */
-      @java.lang.Deprecated public boolean hasHtml() {
-        return ((bitField0_ & 0x00000100) == 0x00000100);
-      }
-      /**
-       * <code>optional bytes html = 3 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * produced html report.
-       * </pre>
-       */
-      @java.lang.Deprecated public com.google.protobuf.ByteString getHtml() {
-        return html_;
-      }
-      /**
-       * <code>optional bytes html = 3 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * produced html report.
-       * </pre>
-       */
-      @java.lang.Deprecated public Builder setHtml(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000100;
-        html_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes html = 3 [deprecated = true];</code>
-       *
-       * <pre>
-       * TODO(ryanjcampbell@) delete deprecated field
-       * produced html report.
-       * </pre>
-       */
-      @java.lang.Deprecated public Builder clearHtml() {
-        bitField0_ = (bitField0_ & ~0x00000100);
-        html_ = getDefaultInstance().getHtml();
-        onChanged();
-        return this;
-      }
-
-      // @@protoc_insertion_point(builder_scope:android.vts.CoverageReportMessage)
-    }
-
-    static {
-      defaultInstance = new CoverageReportMessage(true);
-      defaultInstance.initFields();
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.CoverageReportMessage)
-  }
-
-  public interface LogMessageOrBuilder
-      extends com.google.protobuf.MessageOrBuilder {
-
-    // optional bytes url = 1;
-    /**
-     * <code>optional bytes url = 1;</code>
-     *
-     * <pre>
-     * URL of a produced log file (e.g., stdout, stderr).
-     * </pre>
-     */
-    boolean hasUrl();
-    /**
-     * <code>optional bytes url = 1;</code>
-     *
-     * <pre>
-     * URL of a produced log file (e.g., stdout, stderr).
-     * </pre>
-     */
-    com.google.protobuf.ByteString getUrl();
-
-    // optional bytes name = 2;
-    /**
-     * <code>optional bytes name = 2;</code>
-     *
-     * <pre>
-     * Name of a log file.
-     * </pre>
-     */
-    boolean hasName();
-    /**
-     * <code>optional bytes name = 2;</code>
-     *
-     * <pre>
-     * Name of a log file.
-     * </pre>
-     */
-    com.google.protobuf.ByteString getName();
-
-    // optional bytes content = 3;
-    /**
-     * <code>optional bytes content = 3;</code>
-     *
-     * <pre>
-     * Content of log. Caution: do not put too much log in protobuf message,
-     * as BigTable for example recommends &lt; 10 MB for each record cell.
-     * </pre>
-     */
-    boolean hasContent();
-    /**
-     * <code>optional bytes content = 3;</code>
-     *
-     * <pre>
-     * Content of log. Caution: do not put too much log in protobuf message,
-     * as BigTable for example recommends &lt; 10 MB for each record cell.
-     * </pre>
-     */
-    com.google.protobuf.ByteString getContent();
-  }
-  /**
-   * Protobuf type {@code android.vts.LogMessage}
-   *
-   * <pre>
-   * To specify log report. This can be used either for per-test-module
-   * log message or per-test-case log message.
-   * </pre>
-   */
-  public static final class LogMessage extends
-      com.google.protobuf.GeneratedMessage
-      implements LogMessageOrBuilder {
-    // Use LogMessage.newBuilder() to construct.
-    private LogMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-      super(builder);
-      this.unknownFields = builder.getUnknownFields();
-    }
-    private LogMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
-
-    private static final LogMessage defaultInstance;
-    public static LogMessage getDefaultInstance() {
-      return defaultInstance;
-    }
-
-    public LogMessage getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-
-    private final com.google.protobuf.UnknownFieldSet unknownFields;
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-        getUnknownFields() {
-      return this.unknownFields;
-    }
-    private LogMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      initFields();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              url_ = input.readBytes();
-              break;
-            }
-            case 18: {
-              bitField0_ |= 0x00000002;
-              name_ = input.readBytes();
-              break;
-            }
-            case 26: {
-              bitField0_ |= 0x00000004;
-              content_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.LogMessage.class, com.android.vts.proto.VtsReportMessage.LogMessage.Builder.class);
-    }
-
-    public static com.google.protobuf.Parser<LogMessage> PARSER =
-        new com.google.protobuf.AbstractParser<LogMessage>() {
-      public LogMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new LogMessage(input, extensionRegistry);
-      }
-    };
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<LogMessage> getParserForType() {
-      return PARSER;
-    }
-
-    private int bitField0_;
-    // optional bytes url = 1;
-    public static final int URL_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString url_;
-    /**
-     * <code>optional bytes url = 1;</code>
-     *
-     * <pre>
-     * URL of a produced log file (e.g., stdout, stderr).
-     * </pre>
-     */
-    public boolean hasUrl() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <code>optional bytes url = 1;</code>
-     *
-     * <pre>
-     * URL of a produced log file (e.g., stdout, stderr).
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getUrl() {
-      return url_;
-    }
-
-    // optional bytes name = 2;
-    public static final int NAME_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <code>optional bytes name = 2;</code>
-     *
-     * <pre>
-     * Name of a log file.
-     * </pre>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <code>optional bytes name = 2;</code>
-     *
-     * <pre>
-     * Name of a log file.
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    // optional bytes content = 3;
-    public static final int CONTENT_FIELD_NUMBER = 3;
-    private com.google.protobuf.ByteString content_;
-    /**
-     * <code>optional bytes content = 3;</code>
-     *
-     * <pre>
-     * Content of log. Caution: do not put too much log in protobuf message,
-     * as BigTable for example recommends &lt; 10 MB for each record cell.
-     * </pre>
-     */
-    public boolean hasContent() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <code>optional bytes content = 3;</code>
-     *
-     * <pre>
-     * Content of log. Caution: do not put too much log in protobuf message,
-     * as BigTable for example recommends &lt; 10 MB for each record cell.
-     * </pre>
-     */
-    public com.google.protobuf.ByteString getContent() {
-      return content_;
-    }
-
-    private void initFields() {
-      url_ = com.google.protobuf.ByteString.EMPTY;
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      content_ = com.google.protobuf.ByteString.EMPTY;
-    }
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized != -1) return isInitialized == 1;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, url_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(2, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(3, content_);
-      }
-      getUnknownFields().writeTo(output);
-    }
-
-    private int memoizedSerializedSize = -1;
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, url_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, content_);
-      }
-      size += getUnknownFields().getSerializedSize();
-      memoizedSerializedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    protected java.lang.Object writeReplace()
-        throws java.io.ObjectStreamException {
-      return super.writeReplace();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
-    }
-
-    public static Builder newBuilder() { return Builder.create(); }
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.LogMessage prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() { return newBuilder(this); }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code android.vts.LogMessage}
-     *
-     * <pre>
-     * To specify log report. This can be used either for per-test-module
-     * log message or per-test-case log message.
-     * </pre>
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessage.Builder<Builder>
-       implements com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.LogMessage.class, com.android.vts.proto.VtsReportMessage.LogMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.LogMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-        }
-      }
-      private static Builder create() {
-        return new Builder();
-      }
-
-      public Builder clear() {
-        super.clear();
-        url_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        content_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        return this;
-      }
-
-      public Builder clone() {
-        return create().mergeFrom(buildPartial());
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.LogMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.LogMessage build() {
-        com.android.vts.proto.VtsReportMessage.LogMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.LogMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.LogMessage result = new com.android.vts.proto.VtsReportMessage.LogMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.url_ = url_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.content_ = content_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.LogMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.LogMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.LogMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance()) return this;
-        if (other.hasUrl()) {
-          setUrl(other.getUrl());
-        }
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasContent()) {
-          setContent(other.getContent());
-        }
-        this.mergeUnknownFields(other.getUnknownFields());
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.LogMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.LogMessage) e.getUnfinishedMessage();
-          throw e;
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      // optional bytes url = 1;
-      private com.google.protobuf.ByteString url_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes url = 1;</code>
-       *
-       * <pre>
-       * URL of a produced log file (e.g., stdout, stderr).
-       * </pre>
-       */
-      public boolean hasUrl() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes url = 1;</code>
-       *
-       * <pre>
-       * URL of a produced log file (e.g., stdout, stderr).
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getUrl() {
-        return url_;
-      }
-      /**
-       * <code>optional bytes url = 1;</code>
-       *
-       * <pre>
-       * URL of a produced log file (e.g., stdout, stderr).
-       * </pre>
-       */
-      public Builder setUrl(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        url_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes url = 1;</code>
-       *
-       * <pre>
-       * URL of a produced log file (e.g., stdout, stderr).
-       * </pre>
-       */
-      public Builder clearUrl() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        url_ = getDefaultInstance().getUrl();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes name = 2;
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes name = 2;</code>
-       *
-       * <pre>
-       * Name of a log file.
-       * </pre>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional bytes name = 2;</code>
-       *
-       * <pre>
-       * Name of a log file.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <code>optional bytes name = 2;</code>
-       *
-       * <pre>
-       * Name of a log file.
-       * </pre>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes name = 2;</code>
-       *
-       * <pre>
-       * Name of a log file.
-       * </pre>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      // optional bytes content = 3;
-      private com.google.protobuf.ByteString content_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes content = 3;</code>
-       *
-       * <pre>
-       * Content of log. Caution: do not put too much log in protobuf message,
-       * as BigTable for example recommends &lt; 10 MB for each record cell.
-       * </pre>
-       */
-      public boolean hasContent() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional bytes content = 3;</code>
-       *
-       * <pre>
-       * Content of log. Caution: do not put too much log in protobuf message,
-       * as BigTable for example recommends &lt; 10 MB for each record cell.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getContent() {
-        return content_;
-      }
-      /**
-       * <code>optional bytes content = 3;</code>
-       *
-       * <pre>
-       * Content of log. Caution: do not put too much log in protobuf message,
-       * as BigTable for example recommends &lt; 10 MB for each record cell.
-       * </pre>
-       */
-      public Builder setContent(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        content_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes content = 3;</code>
-       *
-       * <pre>
-       * Content of log. Caution: do not put too much log in protobuf message,
-       * as BigTable for example recommends &lt; 10 MB for each record cell.
-       * </pre>
-       */
-      public Builder clearContent() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        content_ = getDefaultInstance().getContent();
-        onChanged();
-        return this;
-      }
-
-      // @@protoc_insertion_point(builder_scope:android.vts.LogMessage)
-    }
-
-    static {
-      defaultInstance = new LogMessage(true);
-      defaultInstance.initFields();
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.LogMessage)
-  }
-
-  public interface UrlResourceMessageOrBuilder extends com.google.protobuf.MessageOrBuilder {
-      // optional bytes url = 1;
-      /**
-       * <code>optional bytes url = 1;</code>
-       *
-       * <pre>
-       * URL of a resource file.
-       * </pre>
-       */
-      boolean hasUrl();
-      /**
-       * <code>optional bytes url = 1;</code>
-       *
-       * <pre>
-       * URL of a resource file.
-       * </pre>
-       */
-      com.google.protobuf.ByteString getUrl();
-
-      // optional bytes name = 2;
-      /**
-       * <code>optional bytes name = 2;</code>
-       *
-       * <pre>
-       * Name of a resource file representing its type and does not have to be
-       * the same as the exact file name.
-       * </pre>
-       */
-      boolean hasName();
-      /**
-       * <code>optional bytes name = 2;</code>
-       *
-       * <pre>
-       * Name of a resource file representing its type and does not have to be
-       * the same as the exact file name.
-       * </pre>
-       */
-      com.google.protobuf.ByteString getName();
-
-      // optional bytes content = 3;
-      /**
-       * <code>optional bytes content = 3;</code>
-       *
-       * <pre>
-       * Raw content of a resource file. Used if the file is small.
-       * </pre>
-       */
-      boolean hasContent();
-      /**
-       * <code>optional bytes content = 3;</code>
-       *
-       * <pre>
-       * Raw content of a resource file. Used if the file is small.
-       * </pre>
-       */
-      com.google.protobuf.ByteString getContent();
-  }
-  /**
-   * Protobuf type {@code android.vts.UrlResourceMessage}
-   *
-   * <pre>
-   * To specify a resource object (reachable via a URL or contained in the
-   * message). This can be used to store a log file or an XML (or HTML) report
-   * file kept in a Google Cloud Storage (GCS) bucket or partner's network file
-   * system, or hosted by a HTTP server.
-   * </pre>
-   */
-  public static final class UrlResourceMessage
-          extends com.google.protobuf.GeneratedMessage implements UrlResourceMessageOrBuilder {
-      // Use UrlResourceMessage.newBuilder() to construct.
-      private UrlResourceMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-          super(builder);
-          this.unknownFields = builder.getUnknownFields();
-      }
-      private UrlResourceMessage(boolean noInit) {
-          this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance();
-      }
-
-      private static final UrlResourceMessage defaultInstance;
-      public static UrlResourceMessage getDefaultInstance() {
-          return defaultInstance;
-      }
-
-      public UrlResourceMessage getDefaultInstanceForType() {
-          return defaultInstance;
-      }
-
-      private final com.google.protobuf.UnknownFieldSet unknownFields;
-      @java.
-      lang.Override
-      public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
-          return this.unknownFields;
-      }
-      private UrlResourceMessage(com.google.protobuf.CodedInputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          initFields();
-          int mutable_bitField0_ = 0;
-          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-                  com.google.protobuf.UnknownFieldSet.newBuilder();
-          try {
-              boolean done = false;
-              while (!done) {
-                  int tag = input.readTag();
-                  switch (tag) {
-                      case 0:
-                          done = true;
-                          break;
-                      default: {
-                          if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
-                              done = true;
-                          }
-                          break;
-                      }
-                      case 10: {
-                          bitField0_ |= 0x00000001;
-                          url_ = input.readBytes();
-                          break;
-                      }
-                      case 18: {
-                          bitField0_ |= 0x00000002;
-                          name_ = input.readBytes();
-                          break;
-                      }
-                      case 26: {
-                          bitField0_ |= 0x00000004;
-                          content_ = input.readBytes();
-                          break;
-                      }
-                  }
-              }
-          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-              throw e.setUnfinishedMessage(this);
-          } catch (java.io.IOException e) {
-              throw new com.google.protobuf.InvalidProtocolBufferException(e.getMessage())
-                      .setUnfinishedMessage(this);
-          } finally {
-              this.unknownFields = unknownFields.build();
-              makeExtensionsImmutable();
-          }
-      }
-      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
-          return com.android.vts.proto.VtsReportMessage
-                  .internal_static_android_vts_UrlResourceMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internalGetFieldAccessorTable() {
-          return com.android.vts.proto.VtsReportMessage
-                  .internal_static_android_vts_UrlResourceMessage_fieldAccessorTable
-                  .ensureFieldAccessorsInitialized(
-                          com.android.vts.proto.VtsReportMessage.UrlResourceMessage.class,
-                          com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder.class);
-      }
-
-      public static com.google.protobuf.Parser<UrlResourceMessage> PARSER =
-              new com.google.protobuf.AbstractParser<UrlResourceMessage>() {
-                  public UrlResourceMessage parsePartialFrom(
-                          com.google.protobuf.CodedInputStream input,
-                          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-                          throws com.google.protobuf.InvalidProtocolBufferException {
-                      return new UrlResourceMessage(input, extensionRegistry);
-                  }
-              };
-
-      @java.
-      lang.Override
-      public com.google.protobuf.Parser<UrlResourceMessage> getParserForType() {
-          return PARSER;
-      }
-
-      private int bitField0_;
-      // optional bytes url = 1;
-      public static final int URL_FIELD_NUMBER = 1;
-      private com.google.protobuf.ByteString url_;
-      /**
-       * <code>optional bytes url = 1;</code>
-       *
-       * <pre>
-       * URL of a resource file.
-       * </pre>
-       */
-      public boolean hasUrl() {
-          return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes url = 1;</code>
-       *
-       * <pre>
-       * URL of a resource file.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getUrl() {
-          return url_;
-      }
-
-      // optional bytes name = 2;
-      public static final int NAME_FIELD_NUMBER = 2;
-      private com.google.protobuf.ByteString name_;
-      /**
-       * <code>optional bytes name = 2;</code>
-       *
-       * <pre>
-       * Name of a resource file representing its type and does not have to be
-       * the same as the exact file name.
-       * </pre>
-       */
-      public boolean hasName() {
-          return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional bytes name = 2;</code>
-       *
-       * <pre>
-       * Name of a resource file representing its type and does not have to be
-       * the same as the exact file name.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getName() {
-          return name_;
-      }
-
-      // optional bytes content = 3;
-      public static final int CONTENT_FIELD_NUMBER = 3;
-      private com.google.protobuf.ByteString content_;
-      /**
-       * <code>optional bytes content = 3;</code>
-       *
-       * <pre>
-       * Raw content of a resource file. Used if the file is small.
-       * </pre>
-       */
-      public boolean hasContent() {
-          return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional bytes content = 3;</code>
-       *
-       * <pre>
-       * Raw content of a resource file. Used if the file is small.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getContent() {
-          return content_;
-      }
-
-      private void initFields() {
-          url_ = com.google.protobuf.ByteString.EMPTY;
-          name_ = com.google.protobuf.ByteString.EMPTY;
-          content_ = com.google.protobuf.ByteString.EMPTY;
-      }
-      private byte memoizedIsInitialized = -1;
-      public final boolean isInitialized() {
-          byte isInitialized = memoizedIsInitialized;
-          if (isInitialized != -1)
-              return isInitialized == 1;
-
-          memoizedIsInitialized = 1;
-          return true;
-      }
-
-      public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-          getSerializedSize();
-          if (((bitField0_ & 0x00000001) == 0x00000001)) {
-              output.writeBytes(1, url_);
-          }
-          if (((bitField0_ & 0x00000002) == 0x00000002)) {
-              output.writeBytes(2, name_);
-          }
-          if (((bitField0_ & 0x00000004) == 0x00000004)) {
-              output.writeBytes(3, content_);
-          }
-          getUnknownFields().writeTo(output);
-      }
-
-      private int memoizedSerializedSize = -1;
-      public int getSerializedSize() {
-          int size = memoizedSerializedSize;
-          if (size != -1)
-              return size;
-
-          size = 0;
-          if (((bitField0_ & 0x00000001) == 0x00000001)) {
-              size += com.google.protobuf.CodedOutputStream.computeBytesSize(1, url_);
-          }
-          if (((bitField0_ & 0x00000002) == 0x00000002)) {
-              size += com.google.protobuf.CodedOutputStream.computeBytesSize(2, name_);
-          }
-          if (((bitField0_ & 0x00000004) == 0x00000004)) {
-              size += com.google.protobuf.CodedOutputStream.computeBytesSize(3, content_);
-          }
-          size += getUnknownFields().getSerializedSize();
-          memoizedSerializedSize = size;
-          return size;
-      }
-
-      private static final long serialVersionUID = 0L;
-      @java.
-      lang.Override
-      protected java.lang.Object writeReplace() throws java.io.ObjectStreamException {
-          return super.writeReplace();
-      }
-
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-              com.google.protobuf.ByteString data)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-              com.google.protobuf.ByteString data,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(byte[] data)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-              byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-              java.io.InputStream input) throws java.io.IOException {
-          return PARSER.parseFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-              java.io.InputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseFrom(input, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseDelimitedFrom(
-              java.io.InputStream input) throws java.io.IOException {
-          return PARSER.parseDelimitedFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseDelimitedFrom(
-              java.io.InputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseDelimitedFrom(input, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-              com.google.protobuf.CodedInputStream input) throws java.io.IOException {
-          return PARSER.parseFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-              com.google.protobuf.CodedInputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseFrom(input, extensionRegistry);
-      }
-
-      public static Builder newBuilder() {
-          return Builder.create();
-      }
-      public Builder newBuilderForType() {
-          return newBuilder();
-      }
-      public static Builder newBuilder(
-              com.android.vts.proto.VtsReportMessage.UrlResourceMessage prototype) {
-          return newBuilder().mergeFrom(prototype);
-      }
-      public Builder toBuilder() {
-          return newBuilder(this);
-      }
-
-      @java.lang.Override
-      protected Builder newBuilderForType(
-              com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-          Builder builder = new Builder(parent);
-          return builder;
-      }
-      /**
-       * Protobuf type {@code android.vts.UrlResourceMessage}
-       *
-       * <pre>
-       * To specify a resource object (reachable via a URL or contained in the
-       * message). This can be used to store a log file or an XML (or HTML) report
-       * file kept in a Google Cloud Storage (GCS) bucket or partner's network file
-       * system, or hosted by a HTTP server.
-       * </pre>
-       */
-      public static final class Builder
-              extends com.google.protobuf.GeneratedMessage.Builder<Builder>
-              implements com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder {
-          public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_UrlResourceMessage_descriptor;
-          }
-
-          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_UrlResourceMessage_fieldAccessorTable
-                      .ensureFieldAccessorsInitialized(
-                              com.android.vts.proto.VtsReportMessage.UrlResourceMessage.class,
-                              com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder
-                                      .class);
-          }
-
-          // Construct using com.android.vts.proto.VtsReportMessage.UrlResourceMessage.newBuilder()
-          private Builder() {
-              maybeForceBuilderInitialization();
-          }
-
-          private Builder(com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-              super(parent);
-              maybeForceBuilderInitialization();
-          }
-          private void maybeForceBuilderInitialization() {
-              if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-              }
-          }
-          private static Builder create() {
-              return new Builder();
-          }
-
-          public Builder clear() {
-              super.clear();
-              url_ = com.google.protobuf.ByteString.EMPTY;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              name_ = com.google.protobuf.ByteString.EMPTY;
-              bitField0_ = (bitField0_ & ~0x00000002);
-              content_ = com.google.protobuf.ByteString.EMPTY;
-              bitField0_ = (bitField0_ & ~0x00000004);
-              return this;
-          }
-
-          public Builder clone() {
-              return create().mergeFrom(buildPartial());
-          }
-
-          public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_UrlResourceMessage_descriptor;
-          }
-
-          public com.android.vts.proto.VtsReportMessage.UrlResourceMessage
-          getDefaultInstanceForType() {
-              return com.android.vts.proto.VtsReportMessage.UrlResourceMessage.getDefaultInstance();
-          }
-
-          public com.android.vts.proto.VtsReportMessage.UrlResourceMessage build() {
-              com.android.vts.proto.VtsReportMessage.UrlResourceMessage result = buildPartial();
-              if (!result.isInitialized()) {
-                  throw newUninitializedMessageException(result);
-              }
-              return result;
-          }
-
-          public com.android.vts.proto.VtsReportMessage.UrlResourceMessage buildPartial() {
-              com.android.vts.proto.VtsReportMessage.UrlResourceMessage result =
-                      new com.android.vts.proto.VtsReportMessage.UrlResourceMessage(this);
-              int from_bitField0_ = bitField0_;
-              int to_bitField0_ = 0;
-              if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-                  to_bitField0_ |= 0x00000001;
-              }
-              result.url_ = url_;
-              if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-                  to_bitField0_ |= 0x00000002;
-              }
-              result.name_ = name_;
-              if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-                  to_bitField0_ |= 0x00000004;
-              }
-              result.content_ = content_;
-              result.bitField0_ = to_bitField0_;
-              onBuilt();
-              return result;
-          }
-
-          public Builder mergeFrom(com.google.protobuf.Message other) {
-              if (other instanceof com.android.vts.proto.VtsReportMessage.UrlResourceMessage) {
-                  return mergeFrom(
-                          (com.android.vts.proto.VtsReportMessage.UrlResourceMessage) other);
-              } else {
-                  super.mergeFrom(other);
-                  return this;
-              }
-          }
-
-          public Builder mergeFrom(
-                  com.android.vts.proto.VtsReportMessage.UrlResourceMessage other) {
-              if (other
-                      == com.android.vts.proto.VtsReportMessage.UrlResourceMessage
-                                 .getDefaultInstance())
-                  return this;
-              if (other.hasUrl()) {
-                  setUrl(other.getUrl());
-              }
-              if (other.hasName()) {
-                  setName(other.getName());
-              }
-              if (other.hasContent()) {
-                  setContent(other.getContent());
-              }
-              this.mergeUnknownFields(other.getUnknownFields());
-              return this;
-          }
-
-          public final boolean isInitialized() {
-              return true;
-          }
-
-          public Builder mergeFrom(com.google.protobuf.CodedInputStream input,
-                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-                  throws java.io.IOException {
-              com.android.vts.proto.VtsReportMessage.UrlResourceMessage parsedMessage = null;
-              try {
-                  parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-              } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                  parsedMessage = (com.android.vts.proto.VtsReportMessage.UrlResourceMessage)
-                                          e.getUnfinishedMessage();
-                  throw e;
-              } finally {
-                  if (parsedMessage != null) {
-                      mergeFrom(parsedMessage);
-                  }
-              }
-              return this;
-          }
-          private int bitField0_;
-
-          // optional bytes url = 1;
-          private com.google.protobuf.ByteString url_ = com.google.protobuf.ByteString.EMPTY;
-          /**
-           * <code>optional bytes url = 1;</code>
-           *
-           * <pre>
-           * URL of a resource file.
-           * </pre>
-           */
-          public boolean hasUrl() {
-              return ((bitField0_ & 0x00000001) == 0x00000001);
-          }
-          /**
-           * <code>optional bytes url = 1;</code>
-           *
-           * <pre>
-           * URL of a resource file.
-           * </pre>
-           */
-          public com.google.protobuf.ByteString getUrl() {
-              return url_;
-          }
-          /**
-           * <code>optional bytes url = 1;</code>
-           *
-           * <pre>
-           * URL of a resource file.
-           * </pre>
-           */
-          public Builder setUrl(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000001;
-              url_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional bytes url = 1;</code>
-           *
-           * <pre>
-           * URL of a resource file.
-           * </pre>
-           */
-          public Builder clearUrl() {
-              bitField0_ = (bitField0_ & ~0x00000001);
-              url_ = getDefaultInstance().getUrl();
-              onChanged();
-              return this;
-          }
-
-          // optional bytes name = 2;
-          private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-          /**
-           * <code>optional bytes name = 2;</code>
-           *
-           * <pre>
-           * Name of a resource file representing its type and does not have to be
-           * the same as the exact file name.
-           * </pre>
-           */
-          public boolean hasName() {
-              return ((bitField0_ & 0x00000002) == 0x00000002);
-          }
-          /**
-           * <code>optional bytes name = 2;</code>
-           *
-           * <pre>
-           * Name of a resource file representing its type and does not have to be
-           * the same as the exact file name.
-           * </pre>
-           */
-          public com.google.protobuf.ByteString getName() {
-              return name_;
-          }
-          /**
-           * <code>optional bytes name = 2;</code>
-           *
-           * <pre>
-           * Name of a resource file representing its type and does not have to be
-           * the same as the exact file name.
-           * </pre>
-           */
-          public Builder setName(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000002;
-              name_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional bytes name = 2;</code>
-           *
-           * <pre>
-           * Name of a resource file representing its type and does not have to be
-           * the same as the exact file name.
-           * </pre>
-           */
-          public Builder clearName() {
-              bitField0_ = (bitField0_ & ~0x00000002);
-              name_ = getDefaultInstance().getName();
-              onChanged();
-              return this;
-          }
-
-          // optional bytes content = 3;
-          private com.google.protobuf.ByteString content_ = com.google.protobuf.ByteString.EMPTY;
-          /**
-           * <code>optional bytes content = 3;</code>
-           *
-           * <pre>
-           * Raw content of a resource file. Used if the file is small.
-           * </pre>
-           */
-          public boolean hasContent() {
-              return ((bitField0_ & 0x00000004) == 0x00000004);
-          }
-          /**
-           * <code>optional bytes content = 3;</code>
-           *
-           * <pre>
-           * Raw content of a resource file. Used if the file is small.
-           * </pre>
-           */
-          public com.google.protobuf.ByteString getContent() {
-              return content_;
-          }
-          /**
-           * <code>optional bytes content = 3;</code>
-           *
-           * <pre>
-           * Raw content of a resource file. Used if the file is small.
-           * </pre>
-           */
-          public Builder setContent(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000004;
-              content_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional bytes content = 3;</code>
-           *
-           * <pre>
-           * Raw content of a resource file. Used if the file is small.
-           * </pre>
-           */
-          public Builder clearContent() {
-              bitField0_ = (bitField0_ & ~0x00000004);
-              content_ = getDefaultInstance().getContent();
-              onChanged();
-              return this;
-          }
-
-          // @@protoc_insertion_point(builder_scope:android.vts.UrlResourceMessage)
-      }
-
-      static {
-          defaultInstance = new UrlResourceMessage(true);
-          defaultInstance.initFields();
-      }
-
-      // @@protoc_insertion_point(class_scope:android.vts.UrlResourceMessage)
-  }
-
-  public interface TestReportMessageOrBuilder extends com.google.protobuf.MessageOrBuilder {
-      // optional bytes test_suite = 1 [deprecated = true];
-      /**
-       * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-       *
-       * <pre>
-       * The test suite name..
-       * </pre>
-       */
-      @java.lang.Deprecated boolean hasTestSuite();
-      /**
-       * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-       *
-       * <pre>
-       * The test suite name..
-       * </pre>
-       */
-      @java.lang.Deprecated com.google.protobuf.ByteString getTestSuite();
-
-      // optional bytes test = 2;
-      /**
-       * <code>optional bytes test = 2;</code>
-       *
-       * <pre>
-       * The test name.
-       * </pre>
-       */
-      boolean hasTest();
-      /**
-       * <code>optional bytes test = 2;</code>
-       *
-       * <pre>
-       * The test name.
-       * </pre>
-       */
-      com.google.protobuf.ByteString getTest();
-
-      // optional .android.vts.VtsTestType test_type = 3;
-      /**
-       * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-       *
-       * <pre>
-       * The test type
-       * </pre>
-       */
-      boolean hasTestType();
-      /**
-       * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-       *
-       * <pre>
-       * The test type
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.VtsTestType getTestType();
-
-      // repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage>
-      getDeviceInfoList();
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDeviceInfo(int index);
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      int getDeviceInfoCount();
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      java.util.List<
-              ? extends com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder>
-      getDeviceInfoOrBuilderList();
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder
-      getDeviceInfoOrBuilder(int index);
-
-      // optional .android.vts.AndroidBuildInfo build_info = 5;
-      /**
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       *
-       * <pre>
-       * Build info
-       * </pre>
-       */
-      boolean hasBuildInfo();
-      /**
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       *
-       * <pre>
-       * Build info
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getBuildInfo();
-      /**
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       *
-       * <pre>
-       * Build info
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder getBuildInfoOrBuilder();
-
-      // repeated bytes subscriber_email = 6;
-      /**
-       * <code>repeated bytes subscriber_email = 6;</code>
-       *
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       */
-      java.util.List<com.google.protobuf.ByteString> getSubscriberEmailList();
-      /**
-       * <code>repeated bytes subscriber_email = 6;</code>
-       *
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       */
-      int getSubscriberEmailCount();
-      /**
-       * <code>repeated bytes subscriber_email = 6;</code>
-       *
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       */
-      com.google.protobuf.ByteString getSubscriberEmail(int index);
-
-      // optional .android.vts.VtsHostInfo host_info = 7;
-      /**
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       *
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       */
-      boolean hasHostInfo();
-      /**
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       *
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.VtsHostInfo getHostInfo();
-      /**
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       *
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder getHostInfoOrBuilder();
-
-      // repeated .android.vts.TestCaseReportMessage test_case = 11;
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage>
-      getTestCaseList();
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getTestCase(int index);
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      int getTestCaseCount();
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder>
-              getTestCaseOrBuilderList();
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder getTestCaseOrBuilder(
-              int index);
-
-      // repeated .android.vts.ProfilingReportMessage profiling = 21;
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>
-      getProfilingList();
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index);
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      int getProfilingCount();
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      java.util.List<
-              ? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder>
-      getProfilingOrBuilderList();
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-              int index);
-
-      // repeated .android.vts.SystraceReportMessage systrace = 22;
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>
-      getSystraceList();
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index);
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      int getSystraceCount();
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder>
-              getSystraceOrBuilderList();
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-              int index);
-
-      // optional int64 start_timestamp = 101;
-      /**
-       * <code>optional int64 start_timestamp = 101;</code>
-       *
-       * <pre>
-       * Execution start and end time stamp.
-       * </pre>
-       */
-      boolean hasStartTimestamp();
-      /**
-       * <code>optional int64 start_timestamp = 101;</code>
-       *
-       * <pre>
-       * Execution start and end time stamp.
-       * </pre>
-       */
-      long getStartTimestamp();
-
-      // optional int64 end_timestamp = 102;
-      /**
-       * <code>optional int64 end_timestamp = 102;</code>
-       */
-      boolean hasEndTimestamp();
-      /**
-       * <code>optional int64 end_timestamp = 102;</code>
-       */
-      long getEndTimestamp();
-
-      // repeated .android.vts.CoverageReportMessage coverage = 103;
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>
-      getCoverageList();
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index);
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      int getCoverageCount();
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder>
-              getCoverageOrBuilderList();
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-              int index);
-
-      // repeated .android.vts.LogMessage log = 1001;
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList();
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index);
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      int getLogCount();
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder>
-      getLogOrBuilderList();
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(int index);
-  }
-  /**
-   * Protobuf type {@code android.vts.TestReportMessage}
-   *
-   * <pre>
-   * To specify a test execution report.
-   * </pre>
-   */
-  public static final class TestReportMessage
-          extends com.google.protobuf.GeneratedMessage implements TestReportMessageOrBuilder {
-      // Use TestReportMessage.newBuilder() to construct.
-      private TestReportMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-          super(builder);
-          this.unknownFields = builder.getUnknownFields();
-      }
-      private TestReportMessage(boolean noInit) {
-          this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance();
-      }
-
-      private static final TestReportMessage defaultInstance;
-      public static TestReportMessage getDefaultInstance() {
-          return defaultInstance;
-      }
-
-      public TestReportMessage getDefaultInstanceForType() {
-          return defaultInstance;
-      }
-
-      private final com.google.protobuf.UnknownFieldSet unknownFields;
-      @java.
-      lang.Override
-      public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
-          return this.unknownFields;
-      }
-      private TestReportMessage(com.google.protobuf.CodedInputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          initFields();
-          int mutable_bitField0_ = 0;
-          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-                  com.google.protobuf.UnknownFieldSet.newBuilder();
-          try {
-              boolean done = false;
-              while (!done) {
-                  int tag = input.readTag();
-                  switch (tag) {
-                      case 0:
-                          done = true;
-                          break;
-                      default: {
-                          if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
-                              done = true;
-                          }
-                          break;
-                      }
-                      case 10: {
-                          bitField0_ |= 0x00000001;
-                          testSuite_ = input.readBytes();
-                          break;
-                      }
-                      case 18: {
-                          bitField0_ |= 0x00000002;
-                          test_ = input.readBytes();
-                          break;
-                      }
-                      case 24: {
-                          int rawValue = input.readEnum();
-                          com.android.vts.proto.VtsReportMessage.VtsTestType value =
-                                  com.android.vts.proto.VtsReportMessage.VtsTestType.valueOf(
-                                          rawValue);
-                          if (value == null) {
-                              unknownFields.mergeVarintField(3, rawValue);
-                          } else {
-                              bitField0_ |= 0x00000004;
-                              testType_ = value;
-                          }
-                          break;
-                      }
-                      case 34: {
-                          if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-                              deviceInfo_ =
-                                      new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                      .AndroidDeviceInfoMessage>();
-                              mutable_bitField0_ |= 0x00000008;
-                          }
-                          deviceInfo_.add(
-                                  input.readMessage(com.android.vts.proto.VtsReportMessage
-                                                            .AndroidDeviceInfoMessage.PARSER,
-                                          extensionRegistry));
-                          break;
-                      }
-                      case 42: {
-                          com.android.vts.proto.VtsReportMessage.AndroidBuildInfo
-                                  .Builder subBuilder = null;
-                          if (((bitField0_ & 0x00000008) == 0x00000008)) {
-                              subBuilder = buildInfo_.toBuilder();
-                          }
-                          buildInfo_ = input.readMessage(
-                                  com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.PARSER,
-                                  extensionRegistry);
-                          if (subBuilder != null) {
-                              subBuilder.mergeFrom(buildInfo_);
-                              buildInfo_ = subBuilder.buildPartial();
-                          }
-                          bitField0_ |= 0x00000008;
-                          break;
-                      }
-                      case 50: {
-                          if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-                              subscriberEmail_ =
-                                      new java.util.ArrayList<com.google.protobuf.ByteString>();
-                              mutable_bitField0_ |= 0x00000020;
-                          }
-                          subscriberEmail_.add(input.readBytes());
-                          break;
-                      }
-                      case 58: {
-                          com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder subBuilder =
-                                  null;
-                          if (((bitField0_ & 0x00000010) == 0x00000010)) {
-                              subBuilder = hostInfo_.toBuilder();
-                          }
-                          hostInfo_ = input.readMessage(
-                                  com.android.vts.proto.VtsReportMessage.VtsHostInfo.PARSER,
-                                  extensionRegistry);
-                          if (subBuilder != null) {
-                              subBuilder.mergeFrom(hostInfo_);
-                              hostInfo_ = subBuilder.buildPartial();
-                          }
-                          bitField0_ |= 0x00000010;
-                          break;
-                      }
-                      case 90: {
-                          if (!((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
-                              testCase_ =
-                                      new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                      .TestCaseReportMessage>();
-                              mutable_bitField0_ |= 0x00000080;
-                          }
-                          testCase_.add(input.readMessage(com.android.vts.proto.VtsReportMessage
-                                                                  .TestCaseReportMessage.PARSER,
-                                  extensionRegistry));
-                          break;
-                      }
-                      case 170: {
-                          if (!((mutable_bitField0_ & 0x00000100) == 0x00000100)) {
-                              profiling_ =
-                                      new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                      .ProfilingReportMessage>();
-                              mutable_bitField0_ |= 0x00000100;
-                          }
-                          profiling_.add(input.readMessage(com.android.vts.proto.VtsReportMessage
-                                                                   .ProfilingReportMessage.PARSER,
-                                  extensionRegistry));
-                          break;
-                      }
-                      case 178: {
-                          if (!((mutable_bitField0_ & 0x00000200) == 0x00000200)) {
-                              systrace_ =
-                                      new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                      .SystraceReportMessage>();
-                              mutable_bitField0_ |= 0x00000200;
-                          }
-                          systrace_.add(input.readMessage(com.android.vts.proto.VtsReportMessage
-                                                                  .SystraceReportMessage.PARSER,
-                                  extensionRegistry));
-                          break;
-                      }
-                      case 808: {
-                          bitField0_ |= 0x00000020;
-                          startTimestamp_ = input.readInt64();
-                          break;
-                      }
-                      case 816: {
-                          bitField0_ |= 0x00000040;
-                          endTimestamp_ = input.readInt64();
-                          break;
-                      }
-                      case 826: {
-                          if (!((mutable_bitField0_ & 0x00001000) == 0x00001000)) {
-                              coverage_ =
-                                      new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                      .CoverageReportMessage>();
-                              mutable_bitField0_ |= 0x00001000;
-                          }
-                          coverage_.add(input.readMessage(com.android.vts.proto.VtsReportMessage
-                                                                  .CoverageReportMessage.PARSER,
-                                  extensionRegistry));
-                          break;
-                      }
-                      case 8010: {
-                          if (!((mutable_bitField0_ & 0x00002000) == 0x00002000)) {
-                              log_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                     .LogMessage>();
-                              mutable_bitField0_ |= 0x00002000;
-                          }
-                          log_.add(input.readMessage(
-                                  com.android.vts.proto.VtsReportMessage.LogMessage.PARSER,
-                                  extensionRegistry));
-                          break;
-                      }
-                  }
-              }
-          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-              throw e.setUnfinishedMessage(this);
-          } catch (java.io.IOException e) {
-              throw new com.google.protobuf.InvalidProtocolBufferException(e.getMessage())
-                      .setUnfinishedMessage(this);
-          } finally {
-              if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-                  deviceInfo_ = java.util.Collections.unmodifiableList(deviceInfo_);
-              }
-              if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-                  subscriberEmail_ = java.util.Collections.unmodifiableList(subscriberEmail_);
-              }
-              if (((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
-                  testCase_ = java.util.Collections.unmodifiableList(testCase_);
-              }
-              if (((mutable_bitField0_ & 0x00000100) == 0x00000100)) {
-                  profiling_ = java.util.Collections.unmodifiableList(profiling_);
-              }
-              if (((mutable_bitField0_ & 0x00000200) == 0x00000200)) {
-                  systrace_ = java.util.Collections.unmodifiableList(systrace_);
-              }
-              if (((mutable_bitField0_ & 0x00001000) == 0x00001000)) {
-                  coverage_ = java.util.Collections.unmodifiableList(coverage_);
-              }
-              if (((mutable_bitField0_ & 0x00002000) == 0x00002000)) {
-                  log_ = java.util.Collections.unmodifiableList(log_);
-              }
-              this.unknownFields = unknownFields.build();
-              makeExtensionsImmutable();
-          }
-      }
-      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
-          return com.android.vts.proto.VtsReportMessage
-                  .internal_static_android_vts_TestReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internalGetFieldAccessorTable() {
-          return com.android.vts.proto.VtsReportMessage
-                  .internal_static_android_vts_TestReportMessage_fieldAccessorTable
-                  .ensureFieldAccessorsInitialized(
-                          com.android.vts.proto.VtsReportMessage.TestReportMessage.class,
-                          com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder.class);
-      }
-
-      public static com.google.protobuf.Parser<TestReportMessage> PARSER =
-              new com.google.protobuf.AbstractParser<TestReportMessage>() {
-                  public TestReportMessage parsePartialFrom(
-                          com.google.protobuf.CodedInputStream input,
-                          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-                          throws com.google.protobuf.InvalidProtocolBufferException {
-                      return new TestReportMessage(input, extensionRegistry);
-                  }
-              };
-
-      @java.
-      lang.Override
-      public com.google.protobuf.Parser<TestReportMessage> getParserForType() {
-          return PARSER;
-      }
-
-      private int bitField0_;
-      // optional bytes test_suite = 1 [deprecated = true];
-      public static final int TEST_SUITE_FIELD_NUMBER = 1;
-      private com.google.protobuf.ByteString testSuite_;
-      /**
-       * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-       *
-       * <pre>
-       * The test suite name..
-       * </pre>
-       */
-      @java.lang.Deprecated
-      public boolean hasTestSuite() {
-          return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-       *
-       * <pre>
-       * The test suite name..
-       * </pre>
-       */
-      @java.
-      lang.Deprecated
-      public com.google.protobuf.ByteString getTestSuite() {
-          return testSuite_;
-      }
-
-      // optional bytes test = 2;
-      public static final int TEST_FIELD_NUMBER = 2;
-      private com.google.protobuf.ByteString test_;
-      /**
-       * <code>optional bytes test = 2;</code>
-       *
-       * <pre>
-       * The test name.
-       * </pre>
-       */
-      public boolean hasTest() {
-          return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional bytes test = 2;</code>
-       *
-       * <pre>
-       * The test name.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getTest() {
-          return test_;
-      }
-
-      // optional .android.vts.VtsTestType test_type = 3;
-      public static final int TEST_TYPE_FIELD_NUMBER = 3;
-      private com.android.vts.proto.VtsReportMessage.VtsTestType testType_;
-      /**
-       * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-       *
-       * <pre>
-       * The test type
-       * </pre>
-       */
-      public boolean hasTestType() {
-          return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-       *
-       * <pre>
-       * The test type
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsTestType getTestType() {
-          return testType_;
-      }
-
-      // repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;
-      public static final int DEVICE_INFO_FIELD_NUMBER = 4;
-      private java.util
-              .List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage> deviceInfo_;
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage>
-      getDeviceInfoList() {
-          return deviceInfo_;
-      }
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      public java.util.List<
-              ? extends com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder>
-      getDeviceInfoOrBuilderList() {
-          return deviceInfo_;
-      }
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      public int getDeviceInfoCount() {
-          return deviceInfo_.size();
-      }
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDeviceInfo(
-              int index) {
-          return deviceInfo_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       *
-       * <pre>
-       * Target device info
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder
-      getDeviceInfoOrBuilder(int index) {
-          return deviceInfo_.get(index);
-      }
-
-      // optional .android.vts.AndroidBuildInfo build_info = 5;
-      public static final int BUILD_INFO_FIELD_NUMBER = 5;
-      private com.android.vts.proto.VtsReportMessage.AndroidBuildInfo buildInfo_;
-      /**
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       *
-       * <pre>
-       * Build info
-       * </pre>
-       */
-      public boolean hasBuildInfo() {
-          return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       *
-       * <pre>
-       * Build info
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getBuildInfo() {
-          return buildInfo_;
-      }
-      /**
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       *
-       * <pre>
-       * Build info
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder
-      getBuildInfoOrBuilder() {
-          return buildInfo_;
-      }
-
-      // repeated bytes subscriber_email = 6;
-      public static final int SUBSCRIBER_EMAIL_FIELD_NUMBER = 6;
-      private java.util.List<com.google.protobuf.ByteString> subscriberEmail_;
-      /**
-       * <code>repeated bytes subscriber_email = 6;</code>
-       *
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       */
-      public java.util.List<com.google.protobuf.ByteString> getSubscriberEmailList() {
-          return subscriberEmail_;
-      }
-      /**
-       * <code>repeated bytes subscriber_email = 6;</code>
-       *
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       */
-      public int getSubscriberEmailCount() {
-          return subscriberEmail_.size();
-      }
-      /**
-       * <code>repeated bytes subscriber_email = 6;</code>
-       *
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getSubscriberEmail(int index) {
-          return subscriberEmail_.get(index);
-      }
-
-      // optional .android.vts.VtsHostInfo host_info = 7;
-      public static final int HOST_INFO_FIELD_NUMBER = 7;
-      private com.android.vts.proto.VtsReportMessage.VtsHostInfo hostInfo_;
-      /**
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       *
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       */
-      public boolean hasHostInfo() {
-          return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       *
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo getHostInfo() {
-          return hostInfo_;
-      }
-      /**
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       *
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder getHostInfoOrBuilder() {
-          return hostInfo_;
-      }
-
-      // repeated .android.vts.TestCaseReportMessage test_case = 11;
-      public static final int TEST_CASE_FIELD_NUMBER = 11;
-      private java.util
-              .List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage> testCase_;
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage>
-      getTestCaseList() {
-          return testCase_;
-      }
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      public java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder>
-              getTestCaseOrBuilderList() {
-          return testCase_;
-      }
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      public int getTestCaseCount() {
-          return testCase_.size();
-      }
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getTestCase(int index) {
-          return testCase_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       *
-       * <pre>
-       * Test case reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder
-      getTestCaseOrBuilder(int index) {
-          return testCase_.get(index);
-      }
-
-      // repeated .android.vts.ProfilingReportMessage profiling = 21;
-      public static final int PROFILING_FIELD_NUMBER = 21;
-      private java.util
-              .List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> profiling_;
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>
-      getProfilingList() {
-          return profiling_;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      public java.util.List<
-              ? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder>
-      getProfilingOrBuilderList() {
-          return profiling_;
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      public int getProfilingCount() {
-          return profiling_.size();
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index) {
-          return profiling_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       *
-       * <pre>
-       * Profiling reports
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder
-      getProfilingOrBuilder(int index) {
-          return profiling_.get(index);
-      }
-
-      // repeated .android.vts.SystraceReportMessage systrace = 22;
-      public static final int SYSTRACE_FIELD_NUMBER = 22;
-      private java.util
-              .List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> systrace_;
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>
-      getSystraceList() {
-          return systrace_;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      public java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder>
-              getSystraceOrBuilderList() {
-          return systrace_;
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      public int getSystraceCount() {
-          return systrace_.size();
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index) {
-          return systrace_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-       *
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder
-      getSystraceOrBuilder(int index) {
-          return systrace_.get(index);
-      }
-
-      // optional int64 start_timestamp = 101;
-      public static final int START_TIMESTAMP_FIELD_NUMBER = 101;
-      private long startTimestamp_;
-      /**
-       * <code>optional int64 start_timestamp = 101;</code>
-       *
-       * <pre>
-       * Execution start and end time stamp.
-       * </pre>
-       */
-      public boolean hasStartTimestamp() {
-          return ((bitField0_ & 0x00000020) == 0x00000020);
-      }
-      /**
-       * <code>optional int64 start_timestamp = 101;</code>
-       *
-       * <pre>
-       * Execution start and end time stamp.
-       * </pre>
-       */
-      public long getStartTimestamp() {
-          return startTimestamp_;
-      }
-
-      // optional int64 end_timestamp = 102;
-      public static final int END_TIMESTAMP_FIELD_NUMBER = 102;
-      private long endTimestamp_;
-      /**
-       * <code>optional int64 end_timestamp = 102;</code>
-       */
-      public boolean hasEndTimestamp() {
-          return ((bitField0_ & 0x00000040) == 0x00000040);
-      }
-      /**
-       * <code>optional int64 end_timestamp = 102;</code>
-       */
-      public long getEndTimestamp() {
-          return endTimestamp_;
-      }
-
-      // repeated .android.vts.CoverageReportMessage coverage = 103;
-      public static final int COVERAGE_FIELD_NUMBER = 103;
-      private java.util
-              .List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> coverage_;
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>
-      getCoverageList() {
-          return coverage_;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      public java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder>
-              getCoverageOrBuilderList() {
-          return coverage_;
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      public int getCoverageCount() {
-          return coverage_.size();
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
-          return coverage_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       *
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder
-      getCoverageOrBuilder(int index) {
-          return coverage_.get(index);
-      }
-
-      // repeated .android.vts.LogMessage log = 1001;
-      public static final int LOG_FIELD_NUMBER = 1001;
-      private java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> log_;
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList() {
-          return log_;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder>
-      getLogOrBuilderList() {
-          return log_;
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public int getLogCount() {
-          return log_.size();
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index) {
-          return log_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       *
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(int index) {
-          return log_.get(index);
-      }
-
-      private void initFields() {
-          testSuite_ = com.google.protobuf.ByteString.EMPTY;
-          test_ = com.google.protobuf.ByteString.EMPTY;
-          testType_ = com.android.vts.proto.VtsReportMessage.VtsTestType.UNKNOWN_VTS_TESTTYPE;
-          deviceInfo_ = java.util.Collections.emptyList();
-          buildInfo_ = com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance();
-          subscriberEmail_ = java.util.Collections.emptyList();
-          hostInfo_ = com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance();
-          testCase_ = java.util.Collections.emptyList();
-          profiling_ = java.util.Collections.emptyList();
-          systrace_ = java.util.Collections.emptyList();
-          startTimestamp_ = 0L;
-          endTimestamp_ = 0L;
-          coverage_ = java.util.Collections.emptyList();
-          log_ = java.util.Collections.emptyList();
-      }
-      private byte memoizedIsInitialized = -1;
-      public final boolean isInitialized() {
-          byte isInitialized = memoizedIsInitialized;
-          if (isInitialized != -1)
-              return isInitialized == 1;
-
-          memoizedIsInitialized = 1;
-          return true;
-      }
-
-      public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-          getSerializedSize();
-          if (((bitField0_ & 0x00000001) == 0x00000001)) {
-              output.writeBytes(1, testSuite_);
-          }
-          if (((bitField0_ & 0x00000002) == 0x00000002)) {
-              output.writeBytes(2, test_);
-          }
-          if (((bitField0_ & 0x00000004) == 0x00000004)) {
-              output.writeEnum(3, testType_.getNumber());
-          }
-          for (int i = 0; i < deviceInfo_.size(); i++) {
-              output.writeMessage(4, deviceInfo_.get(i));
-          }
-          if (((bitField0_ & 0x00000008) == 0x00000008)) {
-              output.writeMessage(5, buildInfo_);
-          }
-          for (int i = 0; i < subscriberEmail_.size(); i++) {
-              output.writeBytes(6, subscriberEmail_.get(i));
-          }
-          if (((bitField0_ & 0x00000010) == 0x00000010)) {
-              output.writeMessage(7, hostInfo_);
-          }
-          for (int i = 0; i < testCase_.size(); i++) {
-              output.writeMessage(11, testCase_.get(i));
-          }
-          for (int i = 0; i < profiling_.size(); i++) {
-              output.writeMessage(21, profiling_.get(i));
-          }
-          for (int i = 0; i < systrace_.size(); i++) {
-              output.writeMessage(22, systrace_.get(i));
-          }
-          if (((bitField0_ & 0x00000020) == 0x00000020)) {
-              output.writeInt64(101, startTimestamp_);
-          }
-          if (((bitField0_ & 0x00000040) == 0x00000040)) {
-              output.writeInt64(102, endTimestamp_);
-          }
-          for (int i = 0; i < coverage_.size(); i++) {
-              output.writeMessage(103, coverage_.get(i));
-          }
-          for (int i = 0; i < log_.size(); i++) {
-              output.writeMessage(1001, log_.get(i));
-          }
-          getUnknownFields().writeTo(output);
-      }
-
-      private int memoizedSerializedSize = -1;
-      public int getSerializedSize() {
-          int size = memoizedSerializedSize;
-          if (size != -1)
-              return size;
-
-          size = 0;
-          if (((bitField0_ & 0x00000001) == 0x00000001)) {
-              size += com.google.protobuf.CodedOutputStream.computeBytesSize(1, testSuite_);
-          }
-          if (((bitField0_ & 0x00000002) == 0x00000002)) {
-              size += com.google.protobuf.CodedOutputStream.computeBytesSize(2, test_);
-          }
-          if (((bitField0_ & 0x00000004) == 0x00000004)) {
-              size += com.google.protobuf.CodedOutputStream.computeEnumSize(
-                      3, testType_.getNumber());
-          }
-          for (int i = 0; i < deviceInfo_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(
-                      4, deviceInfo_.get(i));
-          }
-          if (((bitField0_ & 0x00000008) == 0x00000008)) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, buildInfo_);
-          }
-          {
-              int dataSize = 0;
-              for (int i = 0; i < subscriberEmail_.size(); i++) {
-                  dataSize += com.google.protobuf.CodedOutputStream.computeBytesSizeNoTag(
-                          subscriberEmail_.get(i));
-              }
-              size += dataSize;
-              size += 1 * getSubscriberEmailList().size();
-          }
-          if (((bitField0_ & 0x00000010) == 0x00000010)) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(7, hostInfo_);
-          }
-          for (int i = 0; i < testCase_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(
-                      11, testCase_.get(i));
-          }
-          for (int i = 0; i < profiling_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(
-                      21, profiling_.get(i));
-          }
-          for (int i = 0; i < systrace_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(
-                      22, systrace_.get(i));
-          }
-          if (((bitField0_ & 0x00000020) == 0x00000020)) {
-              size += com.google.protobuf.CodedOutputStream.computeInt64Size(101, startTimestamp_);
-          }
-          if (((bitField0_ & 0x00000040) == 0x00000040)) {
-              size += com.google.protobuf.CodedOutputStream.computeInt64Size(102, endTimestamp_);
-          }
-          for (int i = 0; i < coverage_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(
-                      103, coverage_.get(i));
-          }
-          for (int i = 0; i < log_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(1001, log_.get(i));
-          }
-          size += getUnknownFields().getSerializedSize();
-          memoizedSerializedSize = size;
-          return size;
-      }
-
-      private static final long serialVersionUID = 0L;
-      @java.
-      lang.Override
-      protected java.lang.Object writeReplace() throws java.io.ObjectStreamException {
-          return super.writeReplace();
-      }
-
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-              com.google.protobuf.ByteString data)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-              com.google.protobuf.ByteString data,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(byte[] data)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-              byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-              java.io.InputStream input) throws java.io.IOException {
-          return PARSER.parseFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-              java.io.InputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseFrom(input, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseDelimitedFrom(
-              java.io.InputStream input) throws java.io.IOException {
-          return PARSER.parseDelimitedFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseDelimitedFrom(
-              java.io.InputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseDelimitedFrom(input, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-              com.google.protobuf.CodedInputStream input) throws java.io.IOException {
-          return PARSER.parseFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-              com.google.protobuf.CodedInputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseFrom(input, extensionRegistry);
-      }
-
-      public static Builder newBuilder() {
-          return Builder.create();
-      }
-      public Builder newBuilderForType() {
-          return newBuilder();
-      }
-      public static Builder newBuilder(
-              com.android.vts.proto.VtsReportMessage.TestReportMessage prototype) {
-          return newBuilder().mergeFrom(prototype);
-      }
-      public Builder toBuilder() {
-          return newBuilder(this);
-      }
-
-      @java.lang.Override
-      protected Builder newBuilderForType(
-              com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-          Builder builder = new Builder(parent);
-          return builder;
-      }
-      /**
-       * Protobuf type {@code android.vts.TestReportMessage}
-       *
-       * <pre>
-       * To specify a test execution report.
-       * </pre>
-       */
-      public static final class Builder
-              extends com.google.protobuf.GeneratedMessage.Builder<Builder>
-              implements com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder {
-          public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_TestReportMessage_descriptor;
-          }
-
-          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_TestReportMessage_fieldAccessorTable
-                      .ensureFieldAccessorsInitialized(
-                              com.android.vts.proto.VtsReportMessage.TestReportMessage.class,
-                              com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder
-                                      .class);
-          }
-
-          // Construct using com.android.vts.proto.VtsReportMessage.TestReportMessage.newBuilder()
-          private Builder() {
-              maybeForceBuilderInitialization();
-          }
-
-          private Builder(com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-              super(parent);
-              maybeForceBuilderInitialization();
-          }
-          private void maybeForceBuilderInitialization() {
-              if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-                  getDeviceInfoFieldBuilder();
-                  getBuildInfoFieldBuilder();
-                  getHostInfoFieldBuilder();
-                  getTestCaseFieldBuilder();
-                  getProfilingFieldBuilder();
-                  getSystraceFieldBuilder();
-                  getCoverageFieldBuilder();
-                  getLogFieldBuilder();
-              }
-          }
-          private static Builder create() {
-              return new Builder();
-          }
-
-          public Builder clear() {
-              super.clear();
-              testSuite_ = com.google.protobuf.ByteString.EMPTY;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              test_ = com.google.protobuf.ByteString.EMPTY;
-              bitField0_ = (bitField0_ & ~0x00000002);
-              testType_ = com.android.vts.proto.VtsReportMessage.VtsTestType.UNKNOWN_VTS_TESTTYPE;
-              bitField0_ = (bitField0_ & ~0x00000004);
-              if (deviceInfoBuilder_ == null) {
-                  deviceInfo_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000008);
-              } else {
-                  deviceInfoBuilder_.clear();
-              }
-              if (buildInfoBuilder_ == null) {
-                  buildInfo_ = com.android.vts.proto.VtsReportMessage.AndroidBuildInfo
-                                       .getDefaultInstance();
-              } else {
-                  buildInfoBuilder_.clear();
-              }
-              bitField0_ = (bitField0_ & ~0x00000010);
-              subscriberEmail_ = java.util.Collections.emptyList();
-              bitField0_ = (bitField0_ & ~0x00000020);
-              if (hostInfoBuilder_ == null) {
-                  hostInfo_ =
-                          com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance();
-              } else {
-                  hostInfoBuilder_.clear();
-              }
-              bitField0_ = (bitField0_ & ~0x00000040);
-              if (testCaseBuilder_ == null) {
-                  testCase_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000080);
-              } else {
-                  testCaseBuilder_.clear();
-              }
-              if (profilingBuilder_ == null) {
-                  profiling_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000100);
-              } else {
-                  profilingBuilder_.clear();
-              }
-              if (systraceBuilder_ == null) {
-                  systrace_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000200);
-              } else {
-                  systraceBuilder_.clear();
-              }
-              startTimestamp_ = 0L;
-              bitField0_ = (bitField0_ & ~0x00000400);
-              endTimestamp_ = 0L;
-              bitField0_ = (bitField0_ & ~0x00000800);
-              if (coverageBuilder_ == null) {
-                  coverage_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00001000);
-              } else {
-                  coverageBuilder_.clear();
-              }
-              if (logBuilder_ == null) {
-                  log_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00002000);
-              } else {
-                  logBuilder_.clear();
-              }
-              return this;
-          }
-
-          public Builder clone() {
-              return create().mergeFrom(buildPartial());
-          }
-
-          public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_TestReportMessage_descriptor;
-          }
-
-          public com.android.vts.proto.VtsReportMessage.TestReportMessage
-          getDefaultInstanceForType() {
-              return com.android.vts.proto.VtsReportMessage.TestReportMessage.getDefaultInstance();
-          }
-
-          public com.android.vts.proto.VtsReportMessage.TestReportMessage build() {
-              com.android.vts.proto.VtsReportMessage.TestReportMessage result = buildPartial();
-              if (!result.isInitialized()) {
-                  throw newUninitializedMessageException(result);
-              }
-              return result;
-          }
-
-          public com.android.vts.proto.VtsReportMessage.TestReportMessage buildPartial() {
-              com.android.vts.proto.VtsReportMessage.TestReportMessage result =
-                      new com.android.vts.proto.VtsReportMessage.TestReportMessage(this);
-              int from_bitField0_ = bitField0_;
-              int to_bitField0_ = 0;
-              if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-                  to_bitField0_ |= 0x00000001;
-              }
-              result.testSuite_ = testSuite_;
-              if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-                  to_bitField0_ |= 0x00000002;
-              }
-              result.test_ = test_;
-              if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-                  to_bitField0_ |= 0x00000004;
-              }
-              result.testType_ = testType_;
-              if (deviceInfoBuilder_ == null) {
-                  if (((bitField0_ & 0x00000008) == 0x00000008)) {
-                      deviceInfo_ = java.util.Collections.unmodifiableList(deviceInfo_);
-                      bitField0_ = (bitField0_ & ~0x00000008);
-                  }
-                  result.deviceInfo_ = deviceInfo_;
-              } else {
-                  result.deviceInfo_ = deviceInfoBuilder_.build();
-              }
-              if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-                  to_bitField0_ |= 0x00000008;
-              }
-              if (buildInfoBuilder_ == null) {
-                  result.buildInfo_ = buildInfo_;
-              } else {
-                  result.buildInfo_ = buildInfoBuilder_.build();
-              }
-              if (((bitField0_ & 0x00000020) == 0x00000020)) {
-                  subscriberEmail_ = java.util.Collections.unmodifiableList(subscriberEmail_);
-                  bitField0_ = (bitField0_ & ~0x00000020);
-              }
-              result.subscriberEmail_ = subscriberEmail_;
-              if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
-                  to_bitField0_ |= 0x00000010;
-              }
-              if (hostInfoBuilder_ == null) {
-                  result.hostInfo_ = hostInfo_;
-              } else {
-                  result.hostInfo_ = hostInfoBuilder_.build();
-              }
-              if (testCaseBuilder_ == null) {
-                  if (((bitField0_ & 0x00000080) == 0x00000080)) {
-                      testCase_ = java.util.Collections.unmodifiableList(testCase_);
-                      bitField0_ = (bitField0_ & ~0x00000080);
-                  }
-                  result.testCase_ = testCase_;
-              } else {
-                  result.testCase_ = testCaseBuilder_.build();
-              }
-              if (profilingBuilder_ == null) {
-                  if (((bitField0_ & 0x00000100) == 0x00000100)) {
-                      profiling_ = java.util.Collections.unmodifiableList(profiling_);
-                      bitField0_ = (bitField0_ & ~0x00000100);
-                  }
-                  result.profiling_ = profiling_;
-              } else {
-                  result.profiling_ = profilingBuilder_.build();
-              }
-              if (systraceBuilder_ == null) {
-                  if (((bitField0_ & 0x00000200) == 0x00000200)) {
-                      systrace_ = java.util.Collections.unmodifiableList(systrace_);
-                      bitField0_ = (bitField0_ & ~0x00000200);
-                  }
-                  result.systrace_ = systrace_;
-              } else {
-                  result.systrace_ = systraceBuilder_.build();
-              }
-              if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
-                  to_bitField0_ |= 0x00000020;
-              }
-              result.startTimestamp_ = startTimestamp_;
-              if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
-                  to_bitField0_ |= 0x00000040;
-              }
-              result.endTimestamp_ = endTimestamp_;
-              if (coverageBuilder_ == null) {
-                  if (((bitField0_ & 0x00001000) == 0x00001000)) {
-                      coverage_ = java.util.Collections.unmodifiableList(coverage_);
-                      bitField0_ = (bitField0_ & ~0x00001000);
-                  }
-                  result.coverage_ = coverage_;
-              } else {
-                  result.coverage_ = coverageBuilder_.build();
-              }
-              if (logBuilder_ == null) {
-                  if (((bitField0_ & 0x00002000) == 0x00002000)) {
-                      log_ = java.util.Collections.unmodifiableList(log_);
-                      bitField0_ = (bitField0_ & ~0x00002000);
-                  }
-                  result.log_ = log_;
-              } else {
-                  result.log_ = logBuilder_.build();
-              }
-              result.bitField0_ = to_bitField0_;
-              onBuilt();
-              return result;
-          }
-
-          public Builder mergeFrom(com.google.protobuf.Message other) {
-              if (other instanceof com.android.vts.proto.VtsReportMessage.TestReportMessage) {
-                  return mergeFrom(
-                          (com.android.vts.proto.VtsReportMessage.TestReportMessage) other);
-              } else {
-                  super.mergeFrom(other);
-                  return this;
-              }
-          }
-
-          public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.TestReportMessage other) {
-              if (other
-                      == com.android.vts.proto.VtsReportMessage.TestReportMessage
-                                 .getDefaultInstance())
-                  return this;
-              if (other.hasTestSuite()) {
-                  setTestSuite(other.getTestSuite());
-              }
-              if (other.hasTest()) {
-                  setTest(other.getTest());
-              }
-              if (other.hasTestType()) {
-                  setTestType(other.getTestType());
-              }
-              if (deviceInfoBuilder_ == null) {
-                  if (!other.deviceInfo_.isEmpty()) {
-                      if (deviceInfo_.isEmpty()) {
-                          deviceInfo_ = other.deviceInfo_;
-                          bitField0_ = (bitField0_ & ~0x00000008);
-                      } else {
-                          ensureDeviceInfoIsMutable();
-                          deviceInfo_.addAll(other.deviceInfo_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.deviceInfo_.isEmpty()) {
-                      if (deviceInfoBuilder_.isEmpty()) {
-                          deviceInfoBuilder_.dispose();
-                          deviceInfoBuilder_ = null;
-                          deviceInfo_ = other.deviceInfo_;
-                          bitField0_ = (bitField0_ & ~0x00000008);
-                          deviceInfoBuilder_ =
-                                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getDeviceInfoFieldBuilder()
-                                  : null;
-                      } else {
-                          deviceInfoBuilder_.addAllMessages(other.deviceInfo_);
-                      }
-                  }
-              }
-              if (other.hasBuildInfo()) {
-                  mergeBuildInfo(other.getBuildInfo());
-              }
-              if (!other.subscriberEmail_.isEmpty()) {
-                  if (subscriberEmail_.isEmpty()) {
-                      subscriberEmail_ = other.subscriberEmail_;
-                      bitField0_ = (bitField0_ & ~0x00000020);
-                  } else {
-                      ensureSubscriberEmailIsMutable();
-                      subscriberEmail_.addAll(other.subscriberEmail_);
-                  }
-                  onChanged();
-              }
-              if (other.hasHostInfo()) {
-                  mergeHostInfo(other.getHostInfo());
-              }
-              if (testCaseBuilder_ == null) {
-                  if (!other.testCase_.isEmpty()) {
-                      if (testCase_.isEmpty()) {
-                          testCase_ = other.testCase_;
-                          bitField0_ = (bitField0_ & ~0x00000080);
-                      } else {
-                          ensureTestCaseIsMutable();
-                          testCase_.addAll(other.testCase_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.testCase_.isEmpty()) {
-                      if (testCaseBuilder_.isEmpty()) {
-                          testCaseBuilder_.dispose();
-                          testCaseBuilder_ = null;
-                          testCase_ = other.testCase_;
-                          bitField0_ = (bitField0_ & ~0x00000080);
-                          testCaseBuilder_ =
-                                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getTestCaseFieldBuilder()
-                                  : null;
-                      } else {
-                          testCaseBuilder_.addAllMessages(other.testCase_);
-                      }
-                  }
-              }
-              if (profilingBuilder_ == null) {
-                  if (!other.profiling_.isEmpty()) {
-                      if (profiling_.isEmpty()) {
-                          profiling_ = other.profiling_;
-                          bitField0_ = (bitField0_ & ~0x00000100);
-                      } else {
-                          ensureProfilingIsMutable();
-                          profiling_.addAll(other.profiling_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.profiling_.isEmpty()) {
-                      if (profilingBuilder_.isEmpty()) {
-                          profilingBuilder_.dispose();
-                          profilingBuilder_ = null;
-                          profiling_ = other.profiling_;
-                          bitField0_ = (bitField0_ & ~0x00000100);
-                          profilingBuilder_ =
-                                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getProfilingFieldBuilder()
-                                  : null;
-                      } else {
-                          profilingBuilder_.addAllMessages(other.profiling_);
-                      }
-                  }
-              }
-              if (systraceBuilder_ == null) {
-                  if (!other.systrace_.isEmpty()) {
-                      if (systrace_.isEmpty()) {
-                          systrace_ = other.systrace_;
-                          bitField0_ = (bitField0_ & ~0x00000200);
-                      } else {
-                          ensureSystraceIsMutable();
-                          systrace_.addAll(other.systrace_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.systrace_.isEmpty()) {
-                      if (systraceBuilder_.isEmpty()) {
-                          systraceBuilder_.dispose();
-                          systraceBuilder_ = null;
-                          systrace_ = other.systrace_;
-                          bitField0_ = (bitField0_ & ~0x00000200);
-                          systraceBuilder_ =
-                                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getSystraceFieldBuilder()
-                                  : null;
-                      } else {
-                          systraceBuilder_.addAllMessages(other.systrace_);
-                      }
-                  }
-              }
-              if (other.hasStartTimestamp()) {
-                  setStartTimestamp(other.getStartTimestamp());
-              }
-              if (other.hasEndTimestamp()) {
-                  setEndTimestamp(other.getEndTimestamp());
-              }
-              if (coverageBuilder_ == null) {
-                  if (!other.coverage_.isEmpty()) {
-                      if (coverage_.isEmpty()) {
-                          coverage_ = other.coverage_;
-                          bitField0_ = (bitField0_ & ~0x00001000);
-                      } else {
-                          ensureCoverageIsMutable();
-                          coverage_.addAll(other.coverage_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.coverage_.isEmpty()) {
-                      if (coverageBuilder_.isEmpty()) {
-                          coverageBuilder_.dispose();
-                          coverageBuilder_ = null;
-                          coverage_ = other.coverage_;
-                          bitField0_ = (bitField0_ & ~0x00001000);
-                          coverageBuilder_ =
-                                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getCoverageFieldBuilder()
-                                  : null;
-                      } else {
-                          coverageBuilder_.addAllMessages(other.coverage_);
-                      }
-                  }
-              }
-              if (logBuilder_ == null) {
-                  if (!other.log_.isEmpty()) {
-                      if (log_.isEmpty()) {
-                          log_ = other.log_;
-                          bitField0_ = (bitField0_ & ~0x00002000);
-                      } else {
-                          ensureLogIsMutable();
-                          log_.addAll(other.log_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.log_.isEmpty()) {
-                      if (logBuilder_.isEmpty()) {
-                          logBuilder_.dispose();
-                          logBuilder_ = null;
-                          log_ = other.log_;
-                          bitField0_ = (bitField0_ & ~0x00002000);
-                          logBuilder_ = com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getLogFieldBuilder()
-                                  : null;
-                      } else {
-                          logBuilder_.addAllMessages(other.log_);
-                      }
-                  }
-              }
-              this.mergeUnknownFields(other.getUnknownFields());
-              return this;
-          }
-
-          public final boolean isInitialized() {
-              return true;
-          }
-
-          public Builder mergeFrom(com.google.protobuf.CodedInputStream input,
-                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-                  throws java.io.IOException {
-              com.android.vts.proto.VtsReportMessage.TestReportMessage parsedMessage = null;
-              try {
-                  parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-              } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                  parsedMessage = (com.android.vts.proto.VtsReportMessage.TestReportMessage)
-                                          e.getUnfinishedMessage();
-                  throw e;
-              } finally {
-                  if (parsedMessage != null) {
-                      mergeFrom(parsedMessage);
-                  }
-              }
-              return this;
-          }
-          private int bitField0_;
-
-          // optional bytes test_suite = 1 [deprecated = true];
-          private com.google.protobuf.ByteString testSuite_ = com.google.protobuf.ByteString.EMPTY;
-          /**
-           * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-           *
-           * <pre>
-           * The test suite name..
-           * </pre>
-           */
-          @java.lang.Deprecated
-          public boolean hasTestSuite() {
-              return ((bitField0_ & 0x00000001) == 0x00000001);
-          }
-          /**
-           * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-           *
-           * <pre>
-           * The test suite name..
-           * </pre>
-           */
-          @java.
-          lang.Deprecated
-          public com.google.protobuf.ByteString getTestSuite() {
-              return testSuite_;
-          }
-          /**
-           * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-           *
-           * <pre>
-           * The test suite name..
-           * </pre>
-           */
-          @java.lang.Deprecated
-          public Builder setTestSuite(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000001;
-              testSuite_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-           *
-           * <pre>
-           * The test suite name..
-           * </pre>
-           */
-          @java.lang.Deprecated
-          public Builder clearTestSuite() {
-              bitField0_ = (bitField0_ & ~0x00000001);
-              testSuite_ = getDefaultInstance().getTestSuite();
-              onChanged();
-              return this;
-          }
-
-          // optional bytes test = 2;
-          private com.google.protobuf.ByteString test_ = com.google.protobuf.ByteString.EMPTY;
-          /**
-           * <code>optional bytes test = 2;</code>
-           *
-           * <pre>
-           * The test name.
-           * </pre>
-           */
-          public boolean hasTest() {
-              return ((bitField0_ & 0x00000002) == 0x00000002);
-          }
-          /**
-           * <code>optional bytes test = 2;</code>
-           *
-           * <pre>
-           * The test name.
-           * </pre>
-           */
-          public com.google.protobuf.ByteString getTest() {
-              return test_;
-          }
-          /**
-           * <code>optional bytes test = 2;</code>
-           *
-           * <pre>
-           * The test name.
-           * </pre>
-           */
-          public Builder setTest(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000002;
-              test_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional bytes test = 2;</code>
-           *
-           * <pre>
-           * The test name.
-           * </pre>
-           */
-          public Builder clearTest() {
-              bitField0_ = (bitField0_ & ~0x00000002);
-              test_ = getDefaultInstance().getTest();
-              onChanged();
-              return this;
-          }
-
-          // optional .android.vts.VtsTestType test_type = 3;
-          private com.android.vts.proto.VtsReportMessage.VtsTestType testType_ =
-                  com.android.vts.proto.VtsReportMessage.VtsTestType.UNKNOWN_VTS_TESTTYPE;
-          /**
-           * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-           *
-           * <pre>
-           * The test type
-           * </pre>
-           */
-          public boolean hasTestType() {
-              return ((bitField0_ & 0x00000004) == 0x00000004);
-          }
-          /**
-           * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-           *
-           * <pre>
-           * The test type
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.VtsTestType getTestType() {
-              return testType_;
-          }
-          /**
-           * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-           *
-           * <pre>
-           * The test type
-           * </pre>
-           */
-          public Builder setTestType(com.android.vts.proto.VtsReportMessage.VtsTestType value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000004;
-              testType_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-           *
-           * <pre>
-           * The test type
-           * </pre>
-           */
-          public Builder clearTestType() {
-              bitField0_ = (bitField0_ & ~0x00000004);
-              testType_ = com.android.vts.proto.VtsReportMessage.VtsTestType.UNKNOWN_VTS_TESTTYPE;
-              onChanged();
-              return this;
-          }
-
-          // repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;
-          private java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage>
-                  deviceInfo_ = java.util.Collections.emptyList();
-          private void ensureDeviceInfoIsMutable() {
-              if (!((bitField0_ & 0x00000008) == 0x00000008)) {
-                  deviceInfo_ =
-                          new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                          .AndroidDeviceInfoMessage>(deviceInfo_);
-                  bitField0_ |= 0x00000008;
-              }
-          }
-
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .AndroidDeviceInfoMessage,
-                  com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder>
-                  deviceInfoBuilder_;
-
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage>
-          getDeviceInfoList() {
-              if (deviceInfoBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(deviceInfo_);
-              } else {
-                  return deviceInfoBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public int getDeviceInfoCount() {
-              if (deviceInfoBuilder_ == null) {
-                  return deviceInfo_.size();
-              } else {
-                  return deviceInfoBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDeviceInfo(
-                  int index) {
-              if (deviceInfoBuilder_ == null) {
-                  return deviceInfo_.get(index);
-              } else {
-                  return deviceInfoBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder setDeviceInfo(int index,
-                  com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage value) {
-              if (deviceInfoBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureDeviceInfoIsMutable();
-                  deviceInfo_.set(index, value);
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder setDeviceInfo(
-                  int index, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage
-                                     .Builder builderForValue) {
-              if (deviceInfoBuilder_ == null) {
-                  ensureDeviceInfoIsMutable();
-                  deviceInfo_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder addDeviceInfo(
-                  com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage value) {
-              if (deviceInfoBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureDeviceInfoIsMutable();
-                  deviceInfo_.add(value);
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder addDeviceInfo(int index,
-                  com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage value) {
-              if (deviceInfoBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureDeviceInfoIsMutable();
-                  deviceInfo_.add(index, value);
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder addDeviceInfo(com.android.vts.proto.VtsReportMessage
-                                               .AndroidDeviceInfoMessage.Builder builderForValue) {
-              if (deviceInfoBuilder_ == null) {
-                  ensureDeviceInfoIsMutable();
-                  deviceInfo_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder addDeviceInfo(
-                  int index, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage
-                                     .Builder builderForValue) {
-              if (deviceInfoBuilder_ == null) {
-                  ensureDeviceInfoIsMutable();
-                  deviceInfo_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder addAllDeviceInfo(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage
-                                                       .AndroidDeviceInfoMessage> values) {
-              if (deviceInfoBuilder_ == null) {
-                  ensureDeviceInfoIsMutable();
-                  super.addAll(values, deviceInfo_);
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder clearDeviceInfo() {
-              if (deviceInfoBuilder_ == null) {
-                  deviceInfo_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000008);
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public Builder removeDeviceInfo(int index) {
-              if (deviceInfoBuilder_ == null) {
-                  ensureDeviceInfoIsMutable();
-                  deviceInfo_.remove(index);
-                  onChanged();
-              } else {
-                  deviceInfoBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder
-          getDeviceInfoBuilder(int index) {
-              return getDeviceInfoFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder
-          getDeviceInfoOrBuilder(int index) {
-              if (deviceInfoBuilder_ == null) {
-                  return deviceInfo_.get(index);
-              } else {
-                  return deviceInfoBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public java.util.List<? extends com.android.vts.proto.VtsReportMessage
-                                                  .AndroidDeviceInfoMessageOrBuilder>
-          getDeviceInfoOrBuilderList() {
-              if (deviceInfoBuilder_ != null) {
-                  return deviceInfoBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(deviceInfo_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder
-          addDeviceInfoBuilder() {
-              return getDeviceInfoFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage
-                              .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder
-          addDeviceInfoBuilder(int index) {
-              return getDeviceInfoFieldBuilder().addBuilder(
-                      index, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage
-                                     .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-           *
-           * <pre>
-           * Target device info
-           * </pre>
-           */
-          public java.util
-                  .List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder>
-                  getDeviceInfoBuilderList() {
-              return getDeviceInfoFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .AndroidDeviceInfoMessage,
-                  com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder>
-          getDeviceInfoFieldBuilder() {
-              if (deviceInfoBuilder_ == null) {
-                  deviceInfoBuilder_ =
-                          new com.google.protobuf
-                                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                .AndroidDeviceInfoMessage,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .AndroidDeviceInfoMessage.Builder,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .AndroidDeviceInfoMessageOrBuilder>(deviceInfo_,
-                                          ((bitField0_ & 0x00000008) == 0x00000008),
-                                          getParentForChildren(), isClean());
-                  deviceInfo_ = null;
-              }
-              return deviceInfoBuilder_;
-          }
-
-          // optional .android.vts.AndroidBuildInfo build_info = 5;
-          private com.android.vts.proto.VtsReportMessage.AndroidBuildInfo buildInfo_ =
-                  com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance();
-          private com.google.protobuf
-                  .SingleFieldBuilder<com.android.vts.proto.VtsReportMessage.AndroidBuildInfo,
-                          com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder,
-                          com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder>
-                          buildInfoBuilder_;
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          public boolean hasBuildInfo() {
-              return ((bitField0_ & 0x00000010) == 0x00000010);
-          }
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getBuildInfo() {
-              if (buildInfoBuilder_ == null) {
-                  return buildInfo_;
-              } else {
-                  return buildInfoBuilder_.getMessage();
-              }
-          }
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          public Builder setBuildInfo(
-                  com.android.vts.proto.VtsReportMessage.AndroidBuildInfo value) {
-              if (buildInfoBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  buildInfo_ = value;
-                  onChanged();
-              } else {
-                  buildInfoBuilder_.setMessage(value);
-              }
-              bitField0_ |= 0x00000010;
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          public Builder setBuildInfo(
-                  com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder builderForValue) {
-              if (buildInfoBuilder_ == null) {
-                  buildInfo_ = builderForValue.build();
-                  onChanged();
-              } else {
-                  buildInfoBuilder_.setMessage(builderForValue.build());
-              }
-              bitField0_ |= 0x00000010;
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          public Builder mergeBuildInfo(
-                  com.android.vts.proto.VtsReportMessage.AndroidBuildInfo value) {
-              if (buildInfoBuilder_ == null) {
-                  if (((bitField0_ & 0x00000010) == 0x00000010)
-                          && buildInfo_
-                                  != com.android.vts.proto.VtsReportMessage.AndroidBuildInfo
-                                             .getDefaultInstance()) {
-                      buildInfo_ = com.android.vts.proto.VtsReportMessage.AndroidBuildInfo
-                                           .newBuilder(buildInfo_)
-                                           .mergeFrom(value)
-                                           .buildPartial();
-                  } else {
-                      buildInfo_ = value;
-                  }
-                  onChanged();
-              } else {
-                  buildInfoBuilder_.mergeFrom(value);
-              }
-              bitField0_ |= 0x00000010;
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          public Builder clearBuildInfo() {
-              if (buildInfoBuilder_ == null) {
-                  buildInfo_ = com.android.vts.proto.VtsReportMessage.AndroidBuildInfo
-                                       .getDefaultInstance();
-                  onChanged();
-              } else {
-                  buildInfoBuilder_.clear();
-              }
-              bitField0_ = (bitField0_ & ~0x00000010);
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder
-          getBuildInfoBuilder() {
-              bitField0_ |= 0x00000010;
-              onChanged();
-              return getBuildInfoFieldBuilder().getBuilder();
-          }
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder
-          getBuildInfoOrBuilder() {
-              if (buildInfoBuilder_ != null) {
-                  return buildInfoBuilder_.getMessageOrBuilder();
-              } else {
-                  return buildInfo_;
-              }
-          }
-          /**
-           * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-           *
-           * <pre>
-           * Build info
-           * </pre>
-           */
-          private com.google.protobuf
-                  .SingleFieldBuilder<com.android.vts.proto.VtsReportMessage.AndroidBuildInfo,
-                          com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder,
-                          com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder>
-                  getBuildInfoFieldBuilder() {
-              if (buildInfoBuilder_ == null) {
-                  buildInfoBuilder_ =
-                          new com.google.protobuf.SingleFieldBuilder<com.android.vts.proto
-                                                                             .VtsReportMessage
-                                                                             .AndroidBuildInfo,
-                                  com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder,
-                                  com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder>(
-                                  buildInfo_, getParentForChildren(), isClean());
-                  buildInfo_ = null;
-              }
-              return buildInfoBuilder_;
-          }
-
-          // repeated bytes subscriber_email = 6;
-          private java.util.List<com.google.protobuf.ByteString> subscriberEmail_ =
-                  java.util.Collections.emptyList();
-          private void ensureSubscriberEmailIsMutable() {
-              if (!((bitField0_ & 0x00000020) == 0x00000020)) {
-                  subscriberEmail_ =
-                          new java.util.ArrayList<com.google.protobuf.ByteString>(subscriberEmail_);
-                  bitField0_ |= 0x00000020;
-              }
-          }
-          /**
-           * <code>repeated bytes subscriber_email = 6;</code>
-           *
-           * <pre>
-           * Email addresses of subscribers to the test results
-           * </pre>
-           */
-          public java.util.List<com.google.protobuf.ByteString> getSubscriberEmailList() {
-              return java.util.Collections.unmodifiableList(subscriberEmail_);
-          }
-          /**
-           * <code>repeated bytes subscriber_email = 6;</code>
-           *
-           * <pre>
-           * Email addresses of subscribers to the test results
-           * </pre>
-           */
-          public int getSubscriberEmailCount() {
-              return subscriberEmail_.size();
-          }
-          /**
-           * <code>repeated bytes subscriber_email = 6;</code>
-           *
-           * <pre>
-           * Email addresses of subscribers to the test results
-           * </pre>
-           */
-          public com.google.protobuf.ByteString getSubscriberEmail(int index) {
-              return subscriberEmail_.get(index);
-          }
-          /**
-           * <code>repeated bytes subscriber_email = 6;</code>
-           *
-           * <pre>
-           * Email addresses of subscribers to the test results
-           * </pre>
-           */
-          public Builder setSubscriberEmail(int index, com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              ensureSubscriberEmailIsMutable();
-              subscriberEmail_.set(index, value);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated bytes subscriber_email = 6;</code>
-           *
-           * <pre>
-           * Email addresses of subscribers to the test results
-           * </pre>
-           */
-          public Builder addSubscriberEmail(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              ensureSubscriberEmailIsMutable();
-              subscriberEmail_.add(value);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated bytes subscriber_email = 6;</code>
-           *
-           * <pre>
-           * Email addresses of subscribers to the test results
-           * </pre>
-           */
-          public Builder addAllSubscriberEmail(
-                  java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-              ensureSubscriberEmailIsMutable();
-              super.addAll(values, subscriberEmail_);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated bytes subscriber_email = 6;</code>
-           *
-           * <pre>
-           * Email addresses of subscribers to the test results
-           * </pre>
-           */
-          public Builder clearSubscriberEmail() {
-              subscriberEmail_ = java.util.Collections.emptyList();
-              bitField0_ = (bitField0_ & ~0x00000020);
-              onChanged();
-              return this;
-          }
-
-          // optional .android.vts.VtsHostInfo host_info = 7;
-          private com.android.vts.proto.VtsReportMessage.VtsHostInfo hostInfo_ =
-                  com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance();
-          private com.google.protobuf
-                  .SingleFieldBuilder<com.android.vts.proto.VtsReportMessage.VtsHostInfo,
-                          com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder,
-                          com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder>
-                          hostInfoBuilder_;
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          public boolean hasHostInfo() {
-              return ((bitField0_ & 0x00000040) == 0x00000040);
-          }
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.VtsHostInfo getHostInfo() {
-              if (hostInfoBuilder_ == null) {
-                  return hostInfo_;
-              } else {
-                  return hostInfoBuilder_.getMessage();
-              }
-          }
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          public Builder setHostInfo(com.android.vts.proto.VtsReportMessage.VtsHostInfo value) {
-              if (hostInfoBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  hostInfo_ = value;
-                  onChanged();
-              } else {
-                  hostInfoBuilder_.setMessage(value);
-              }
-              bitField0_ |= 0x00000040;
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          public Builder setHostInfo(
-                  com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder builderForValue) {
-              if (hostInfoBuilder_ == null) {
-                  hostInfo_ = builderForValue.build();
-                  onChanged();
-              } else {
-                  hostInfoBuilder_.setMessage(builderForValue.build());
-              }
-              bitField0_ |= 0x00000040;
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          public Builder mergeHostInfo(com.android.vts.proto.VtsReportMessage.VtsHostInfo value) {
-              if (hostInfoBuilder_ == null) {
-                  if (((bitField0_ & 0x00000040) == 0x00000040)
-                          && hostInfo_
-                                  != com.android.vts.proto.VtsReportMessage.VtsHostInfo
-                                             .getDefaultInstance()) {
-                      hostInfo_ = com.android.vts.proto.VtsReportMessage.VtsHostInfo
-                                          .newBuilder(hostInfo_)
-                                          .mergeFrom(value)
-                                          .buildPartial();
-                  } else {
-                      hostInfo_ = value;
-                  }
-                  onChanged();
-              } else {
-                  hostInfoBuilder_.mergeFrom(value);
-              }
-              bitField0_ |= 0x00000040;
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          public Builder clearHostInfo() {
-              if (hostInfoBuilder_ == null) {
-                  hostInfo_ =
-                          com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance();
-                  onChanged();
-              } else {
-                  hostInfoBuilder_.clear();
-              }
-              bitField0_ = (bitField0_ & ~0x00000040);
-              return this;
-          }
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder getHostInfoBuilder() {
-              bitField0_ |= 0x00000040;
-              onChanged();
-              return getHostInfoFieldBuilder().getBuilder();
-          }
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder
-          getHostInfoOrBuilder() {
-              if (hostInfoBuilder_ != null) {
-                  return hostInfoBuilder_.getMessageOrBuilder();
-              } else {
-                  return hostInfo_;
-              }
-          }
-          /**
-           * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-           *
-           * <pre>
-           * Info about the host computer
-           * </pre>
-           */
-          private com.google.protobuf
-                  .SingleFieldBuilder<com.android.vts.proto.VtsReportMessage.VtsHostInfo,
-                          com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder,
-                          com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder>
-                  getHostInfoFieldBuilder() {
-              if (hostInfoBuilder_ == null) {
-                  hostInfoBuilder_ =
-                          new com.google.protobuf.SingleFieldBuilder<com.android.vts.proto
-                                                                             .VtsReportMessage
-                                                                             .VtsHostInfo,
-                                  com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder,
-                                  com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder>(
-                                  hostInfo_, getParentForChildren(), isClean());
-                  hostInfo_ = null;
-              }
-              return hostInfoBuilder_;
-          }
-
-          // repeated .android.vts.TestCaseReportMessage test_case = 11;
-          private java.util
-                  .List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage> testCase_ =
-                  java.util.Collections.emptyList();
-          private void ensureTestCaseIsMutable() {
-              if (!((bitField0_ & 0x00000080) == 0x00000080)) {
-                  testCase_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                              .TestCaseReportMessage>(testCase_);
-                  bitField0_ |= 0x00000080;
-              }
-          }
-
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .TestCaseReportMessage,
-                  com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder>
-                  testCaseBuilder_;
-
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage>
-          getTestCaseList() {
-              if (testCaseBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(testCase_);
-              } else {
-                  return testCaseBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public int getTestCaseCount() {
-              if (testCaseBuilder_ == null) {
-                  return testCase_.size();
-              } else {
-                  return testCaseBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getTestCase(
-                  int index) {
-              if (testCaseBuilder_ == null) {
-                  return testCase_.get(index);
-              } else {
-                  return testCaseBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder setTestCase(
-                  int index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage value) {
-              if (testCaseBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestCaseIsMutable();
-                  testCase_.set(index, value);
-                  onChanged();
-              } else {
-                  testCaseBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder setTestCase(
-                  int index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage
-                                     .Builder builderForValue) {
-              if (testCaseBuilder_ == null) {
-                  ensureTestCaseIsMutable();
-                  testCase_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  testCaseBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder addTestCase(
-                  com.android.vts.proto.VtsReportMessage.TestCaseReportMessage value) {
-              if (testCaseBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestCaseIsMutable();
-                  testCase_.add(value);
-                  onChanged();
-              } else {
-                  testCaseBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder addTestCase(
-                  int index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage value) {
-              if (testCaseBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestCaseIsMutable();
-                  testCase_.add(index, value);
-                  onChanged();
-              } else {
-                  testCaseBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder addTestCase(com.android.vts.proto.VtsReportMessage.TestCaseReportMessage
-                                             .Builder builderForValue) {
-              if (testCaseBuilder_ == null) {
-                  ensureTestCaseIsMutable();
-                  testCase_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  testCaseBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder addTestCase(
-                  int index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage
-                                     .Builder builderForValue) {
-              if (testCaseBuilder_ == null) {
-                  ensureTestCaseIsMutable();
-                  testCase_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  testCaseBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder addAllTestCase(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage
-                                                       .TestCaseReportMessage> values) {
-              if (testCaseBuilder_ == null) {
-                  ensureTestCaseIsMutable();
-                  super.addAll(values, testCase_);
-                  onChanged();
-              } else {
-                  testCaseBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder clearTestCase() {
-              if (testCaseBuilder_ == null) {
-                  testCase_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000080);
-                  onChanged();
-              } else {
-                  testCaseBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public Builder removeTestCase(int index) {
-              if (testCaseBuilder_ == null) {
-                  ensureTestCaseIsMutable();
-                  testCase_.remove(index);
-                  onChanged();
-              } else {
-                  testCaseBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder
-          getTestCaseBuilder(int index) {
-              return getTestCaseFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder
-          getTestCaseOrBuilder(int index) {
-              if (testCaseBuilder_ == null) {
-                  return testCase_.get(index);
-              } else {
-                  return testCaseBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public java.util.List<
-                  ? extends com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder>
-          getTestCaseOrBuilderList() {
-              if (testCaseBuilder_ != null) {
-                  return testCaseBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(testCase_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder
-          addTestCaseBuilder() {
-              return getTestCaseFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.TestCaseReportMessage
-                              .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder
-          addTestCaseBuilder(int index) {
-              return getTestCaseFieldBuilder().addBuilder(
-                      index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage
-                                     .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-           *
-           * <pre>
-           * Test case reports
-           * </pre>
-           */
-          public java.util
-                  .List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder>
-                  getTestCaseBuilderList() {
-              return getTestCaseFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .TestCaseReportMessage,
-                  com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder>
-          getTestCaseFieldBuilder() {
-              if (testCaseBuilder_ == null) {
-                  testCaseBuilder_ =
-                          new com.google.protobuf
-                                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                .TestCaseReportMessage,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .TestCaseReportMessage.Builder,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .TestCaseReportMessageOrBuilder>(testCase_,
-                                          ((bitField0_ & 0x00000080) == 0x00000080),
-                                          getParentForChildren(), isClean());
-                  testCase_ = null;
-              }
-              return testCaseBuilder_;
-          }
-
-          // repeated .android.vts.ProfilingReportMessage profiling = 21;
-          private java.util
-                  .List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> profiling_ =
-                  java.util.Collections.emptyList();
-          private void ensureProfilingIsMutable() {
-              if (!((bitField0_ & 0x00000100) == 0x00000100)) {
-                  profiling_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                               .ProfilingReportMessage>(profiling_);
-                  bitField0_ |= 0x00000100;
-              }
-          }
-
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .ProfilingReportMessage,
-                  com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder>
-                  profilingBuilder_;
-
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>
-          getProfilingList() {
-              if (profilingBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(profiling_);
-              } else {
-                  return profilingBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public int getProfilingCount() {
-              if (profilingBuilder_ == null) {
-                  return profiling_.size();
-              } else {
-                  return profilingBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(
-                  int index) {
-              if (profilingBuilder_ == null) {
-                  return profiling_.get(index);
-              } else {
-                  return profilingBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder setProfiling(
-                  int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-              if (profilingBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureProfilingIsMutable();
-                  profiling_.set(index, value);
-                  onChanged();
-              } else {
-                  profilingBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder setProfiling(
-                  int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage
-                                     .Builder builderForValue) {
-              if (profilingBuilder_ == null) {
-                  ensureProfilingIsMutable();
-                  profiling_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  profilingBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder addProfiling(
-                  com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-              if (profilingBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureProfilingIsMutable();
-                  profiling_.add(value);
-                  onChanged();
-              } else {
-                  profilingBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder addProfiling(
-                  int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-              if (profilingBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureProfilingIsMutable();
-                  profiling_.add(index, value);
-                  onChanged();
-              } else {
-                  profilingBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder addProfiling(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage
-                                              .Builder builderForValue) {
-              if (profilingBuilder_ == null) {
-                  ensureProfilingIsMutable();
-                  profiling_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  profilingBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder addProfiling(
-                  int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage
-                                     .Builder builderForValue) {
-              if (profilingBuilder_ == null) {
-                  ensureProfilingIsMutable();
-                  profiling_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  profilingBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder addAllProfiling(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage
-                                                       .ProfilingReportMessage> values) {
-              if (profilingBuilder_ == null) {
-                  ensureProfilingIsMutable();
-                  super.addAll(values, profiling_);
-                  onChanged();
-              } else {
-                  profilingBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder clearProfiling() {
-              if (profilingBuilder_ == null) {
-                  profiling_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000100);
-                  onChanged();
-              } else {
-                  profilingBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public Builder removeProfiling(int index) {
-              if (profilingBuilder_ == null) {
-                  ensureProfilingIsMutable();
-                  profiling_.remove(index);
-                  onChanged();
-              } else {
-                  profilingBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder
-          getProfilingBuilder(int index) {
-              return getProfilingFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder
-          getProfilingOrBuilder(int index) {
-              if (profilingBuilder_ == null) {
-                  return profiling_.get(index);
-              } else {
-                  return profilingBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public java.util.List<
-                  ? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder>
-          getProfilingOrBuilderList() {
-              if (profilingBuilder_ != null) {
-                  return profilingBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(profiling_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder
-          addProfilingBuilder() {
-              return getProfilingFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.ProfilingReportMessage
-                              .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder
-          addProfilingBuilder(int index) {
-              return getProfilingFieldBuilder().addBuilder(
-                      index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage
-                                     .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-           *
-           * <pre>
-           * Profiling reports
-           * </pre>
-           */
-          public java.util
-                  .List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder>
-                  getProfilingBuilderList() {
-              return getProfilingFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .ProfilingReportMessage,
-                  com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder>
-          getProfilingFieldBuilder() {
-              if (profilingBuilder_ == null) {
-                  profilingBuilder_ =
-                          new com.google.protobuf
-                                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                .ProfilingReportMessage,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .ProfilingReportMessage.Builder,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .ProfilingReportMessageOrBuilder>(profiling_,
-                                          ((bitField0_ & 0x00000100) == 0x00000100),
-                                          getParentForChildren(), isClean());
-                  profiling_ = null;
-              }
-              return profilingBuilder_;
-          }
-
-          // repeated .android.vts.SystraceReportMessage systrace = 22;
-          private java.util
-                  .List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> systrace_ =
-                  java.util.Collections.emptyList();
-          private void ensureSystraceIsMutable() {
-              if (!((bitField0_ & 0x00000200) == 0x00000200)) {
-                  systrace_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                              .SystraceReportMessage>(systrace_);
-                  bitField0_ |= 0x00000200;
-              }
-          }
-
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .SystraceReportMessage,
-                  com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder>
-                  systraceBuilder_;
-
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>
-          getSystraceList() {
-              if (systraceBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(systrace_);
-              } else {
-                  return systraceBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public int getSystraceCount() {
-              if (systraceBuilder_ == null) {
-                  return systrace_.size();
-              } else {
-                  return systraceBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(
-                  int index) {
-              if (systraceBuilder_ == null) {
-                  return systrace_.get(index);
-              } else {
-                  return systraceBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder setSystrace(
-                  int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-              if (systraceBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureSystraceIsMutable();
-                  systrace_.set(index, value);
-                  onChanged();
-              } else {
-                  systraceBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder setSystrace(
-                  int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage
-                                     .Builder builderForValue) {
-              if (systraceBuilder_ == null) {
-                  ensureSystraceIsMutable();
-                  systrace_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  systraceBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder addSystrace(
-                  com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-              if (systraceBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureSystraceIsMutable();
-                  systrace_.add(value);
-                  onChanged();
-              } else {
-                  systraceBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder addSystrace(
-                  int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-              if (systraceBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureSystraceIsMutable();
-                  systrace_.add(index, value);
-                  onChanged();
-              } else {
-                  systraceBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder addSystrace(com.android.vts.proto.VtsReportMessage.SystraceReportMessage
-                                             .Builder builderForValue) {
-              if (systraceBuilder_ == null) {
-                  ensureSystraceIsMutable();
-                  systrace_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  systraceBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder addSystrace(
-                  int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage
-                                     .Builder builderForValue) {
-              if (systraceBuilder_ == null) {
-                  ensureSystraceIsMutable();
-                  systrace_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  systraceBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder addAllSystrace(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage
-                                                       .SystraceReportMessage> values) {
-              if (systraceBuilder_ == null) {
-                  ensureSystraceIsMutable();
-                  super.addAll(values, systrace_);
-                  onChanged();
-              } else {
-                  systraceBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder clearSystrace() {
-              if (systraceBuilder_ == null) {
-                  systrace_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000200);
-                  onChanged();
-              } else {
-                  systraceBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public Builder removeSystrace(int index) {
-              if (systraceBuilder_ == null) {
-                  ensureSystraceIsMutable();
-                  systrace_.remove(index);
-                  onChanged();
-              } else {
-                  systraceBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder
-          getSystraceBuilder(int index) {
-              return getSystraceFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder
-          getSystraceOrBuilder(int index) {
-              if (systraceBuilder_ == null) {
-                  return systrace_.get(index);
-              } else {
-                  return systraceBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public java.util.List<
-                  ? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder>
-          getSystraceOrBuilderList() {
-              if (systraceBuilder_ != null) {
-                  return systraceBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(systrace_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder
-          addSystraceBuilder() {
-              return getSystraceFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.SystraceReportMessage
-                              .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder
-          addSystraceBuilder(int index) {
-              return getSystraceFieldBuilder().addBuilder(
-                      index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage
-                                     .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.SystraceReportMessage systrace = 22;</code>
-           *
-           * <pre>
-           * Systrace report per file
-           * </pre>
-           */
-          public java.util
-                  .List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder>
-                  getSystraceBuilderList() {
-              return getSystraceFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .SystraceReportMessage,
-                  com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder>
-          getSystraceFieldBuilder() {
-              if (systraceBuilder_ == null) {
-                  systraceBuilder_ =
-                          new com.google.protobuf
-                                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                .SystraceReportMessage,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .SystraceReportMessage.Builder,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .SystraceReportMessageOrBuilder>(systrace_,
-                                          ((bitField0_ & 0x00000200) == 0x00000200),
-                                          getParentForChildren(), isClean());
-                  systrace_ = null;
-              }
-              return systraceBuilder_;
-          }
-
-          // optional int64 start_timestamp = 101;
-          private long startTimestamp_;
-          /**
-           * <code>optional int64 start_timestamp = 101;</code>
-           *
-           * <pre>
-           * Execution start and end time stamp.
-           * </pre>
-           */
-          public boolean hasStartTimestamp() {
-              return ((bitField0_ & 0x00000400) == 0x00000400);
-          }
-          /**
-           * <code>optional int64 start_timestamp = 101;</code>
-           *
-           * <pre>
-           * Execution start and end time stamp.
-           * </pre>
-           */
-          public long getStartTimestamp() {
-              return startTimestamp_;
-          }
-          /**
-           * <code>optional int64 start_timestamp = 101;</code>
-           *
-           * <pre>
-           * Execution start and end time stamp.
-           * </pre>
-           */
-          public Builder setStartTimestamp(long value) {
-              bitField0_ |= 0x00000400;
-              startTimestamp_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional int64 start_timestamp = 101;</code>
-           *
-           * <pre>
-           * Execution start and end time stamp.
-           * </pre>
-           */
-          public Builder clearStartTimestamp() {
-              bitField0_ = (bitField0_ & ~0x00000400);
-              startTimestamp_ = 0L;
-              onChanged();
-              return this;
-          }
-
-          // optional int64 end_timestamp = 102;
-          private long endTimestamp_;
-          /**
-           * <code>optional int64 end_timestamp = 102;</code>
-           */
-          public boolean hasEndTimestamp() {
-              return ((bitField0_ & 0x00000800) == 0x00000800);
-          }
-          /**
-           * <code>optional int64 end_timestamp = 102;</code>
-           */
-          public long getEndTimestamp() {
-              return endTimestamp_;
-          }
-          /**
-           * <code>optional int64 end_timestamp = 102;</code>
-           */
-          public Builder setEndTimestamp(long value) {
-              bitField0_ |= 0x00000800;
-              endTimestamp_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional int64 end_timestamp = 102;</code>
-           */
-          public Builder clearEndTimestamp() {
-              bitField0_ = (bitField0_ & ~0x00000800);
-              endTimestamp_ = 0L;
-              onChanged();
-              return this;
-          }
-
-          // repeated .android.vts.CoverageReportMessage coverage = 103;
-          private java.util
-                  .List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> coverage_ =
-                  java.util.Collections.emptyList();
-          private void ensureCoverageIsMutable() {
-              if (!((bitField0_ & 0x00001000) == 0x00001000)) {
-                  coverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                              .CoverageReportMessage>(coverage_);
-                  bitField0_ |= 0x00001000;
-              }
-          }
-
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .CoverageReportMessage,
-                  com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder>
-                  coverageBuilder_;
-
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>
-          getCoverageList() {
-              if (coverageBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(coverage_);
-              } else {
-                  return coverageBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public int getCoverageCount() {
-              if (coverageBuilder_ == null) {
-                  return coverage_.size();
-              } else {
-                  return coverageBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(
-                  int index) {
-              if (coverageBuilder_ == null) {
-                  return coverage_.get(index);
-              } else {
-                  return coverageBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder setCoverage(
-                  int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-              if (coverageBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureCoverageIsMutable();
-                  coverage_.set(index, value);
-                  onChanged();
-              } else {
-                  coverageBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder setCoverage(
-                  int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage
-                                     .Builder builderForValue) {
-              if (coverageBuilder_ == null) {
-                  ensureCoverageIsMutable();
-                  coverage_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  coverageBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder addCoverage(
-                  com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-              if (coverageBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureCoverageIsMutable();
-                  coverage_.add(value);
-                  onChanged();
-              } else {
-                  coverageBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder addCoverage(
-                  int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-              if (coverageBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureCoverageIsMutable();
-                  coverage_.add(index, value);
-                  onChanged();
-              } else {
-                  coverageBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder addCoverage(com.android.vts.proto.VtsReportMessage.CoverageReportMessage
-                                             .Builder builderForValue) {
-              if (coverageBuilder_ == null) {
-                  ensureCoverageIsMutable();
-                  coverage_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  coverageBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder addCoverage(
-                  int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage
-                                     .Builder builderForValue) {
-              if (coverageBuilder_ == null) {
-                  ensureCoverageIsMutable();
-                  coverage_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  coverageBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder addAllCoverage(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage
-                                                       .CoverageReportMessage> values) {
-              if (coverageBuilder_ == null) {
-                  ensureCoverageIsMutable();
-                  super.addAll(values, coverage_);
-                  onChanged();
-              } else {
-                  coverageBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder clearCoverage() {
-              if (coverageBuilder_ == null) {
-                  coverage_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00001000);
-                  onChanged();
-              } else {
-                  coverageBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public Builder removeCoverage(int index) {
-              if (coverageBuilder_ == null) {
-                  ensureCoverageIsMutable();
-                  coverage_.remove(index);
-                  onChanged();
-              } else {
-                  coverageBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder
-          getCoverageBuilder(int index) {
-              return getCoverageFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder
-          getCoverageOrBuilder(int index) {
-              if (coverageBuilder_ == null) {
-                  return coverage_.get(index);
-              } else {
-                  return coverageBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public java.util.List<
-                  ? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder>
-          getCoverageOrBuilderList() {
-              if (coverageBuilder_ != null) {
-                  return coverageBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(coverage_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder
-          addCoverageBuilder() {
-              return getCoverageFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.CoverageReportMessage
-                              .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder
-          addCoverageBuilder(int index) {
-              return getCoverageFieldBuilder().addBuilder(
-                      index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage
-                                     .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-           *
-           * <pre>
-           * Coverage report per file
-           * </pre>
-           */
-          public java.util
-                  .List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder>
-                  getCoverageBuilderList() {
-              return getCoverageFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .CoverageReportMessage,
-                  com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder>
-          getCoverageFieldBuilder() {
-              if (coverageBuilder_ == null) {
-                  coverageBuilder_ =
-                          new com.google.protobuf
-                                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                .CoverageReportMessage,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .CoverageReportMessage.Builder,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .CoverageReportMessageOrBuilder>(coverage_,
-                                          ((bitField0_ & 0x00001000) == 0x00001000),
-                                          getParentForChildren(), isClean());
-                  coverage_ = null;
-              }
-              return coverageBuilder_;
-          }
-
-          // repeated .android.vts.LogMessage log = 1001;
-          private java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> log_ =
-                  java.util.Collections.emptyList();
-          private void ensureLogIsMutable() {
-              if (!((bitField0_ & 0x00002000) == 0x00002000)) {
-                  log_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.LogMessage>(
-                          log_);
-                  bitField0_ |= 0x00002000;
-              }
-          }
-
-          private com.google.protobuf
-                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage.LogMessage,
-                          com.android.vts.proto.VtsReportMessage.LogMessage.Builder,
-                          com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> logBuilder_;
-
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList() {
-              if (logBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(log_);
-              } else {
-                  return logBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public int getLogCount() {
-              if (logBuilder_ == null) {
-                  return log_.size();
-              } else {
-                  return logBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index) {
-              if (logBuilder_ == null) {
-                  return log_.get(index);
-              } else {
-                  return logBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder setLog(
-                  int index, com.android.vts.proto.VtsReportMessage.LogMessage value) {
-              if (logBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureLogIsMutable();
-                  log_.set(index, value);
-                  onChanged();
-              } else {
-                  logBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder setLog(int index,
-                  com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-              if (logBuilder_ == null) {
-                  ensureLogIsMutable();
-                  log_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  logBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder addLog(com.android.vts.proto.VtsReportMessage.LogMessage value) {
-              if (logBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureLogIsMutable();
-                  log_.add(value);
-                  onChanged();
-              } else {
-                  logBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder addLog(
-                  int index, com.android.vts.proto.VtsReportMessage.LogMessage value) {
-              if (logBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureLogIsMutable();
-                  log_.add(index, value);
-                  onChanged();
-              } else {
-                  logBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder addLog(
-                  com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-              if (logBuilder_ == null) {
-                  ensureLogIsMutable();
-                  log_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  logBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder addLog(int index,
-                  com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-              if (logBuilder_ == null) {
-                  ensureLogIsMutable();
-                  log_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  logBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder addAllLog(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.LogMessage>
-                          values) {
-              if (logBuilder_ == null) {
-                  ensureLogIsMutable();
-                  super.addAll(values, log_);
-                  onChanged();
-              } else {
-                  logBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder clearLog() {
-              if (logBuilder_ == null) {
-                  log_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00002000);
-                  onChanged();
-              } else {
-                  logBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public Builder removeLog(int index) {
-              if (logBuilder_ == null) {
-                  ensureLogIsMutable();
-                  log_.remove(index);
-                  onChanged();
-              } else {
-                  logBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.LogMessage.Builder getLogBuilder(
-                  int index) {
-              return getLogFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-                  int index) {
-              if (logBuilder_ == null) {
-                  return log_.get(index);
-              } else {
-                  return logBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public java.util
-                  .List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder>
-                  getLogOrBuilderList() {
-              if (logBuilder_ != null) {
-                  return logBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(log_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.LogMessage.Builder addLogBuilder() {
-              return getLogFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.LogMessage.Builder addLogBuilder(
-                  int index) {
-              return getLogFieldBuilder().addBuilder(index,
-                      com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.LogMessage log = 1001;</code>
-           *
-           * <pre>
-           * Log for a test module. May contain multiple logs such as logcat, host log,
-           * etc.
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage.Builder>
-          getLogBuilderList() {
-              return getLogFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf
-                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage.LogMessage,
-                          com.android.vts.proto.VtsReportMessage.LogMessage.Builder,
-                          com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder>
-                  getLogFieldBuilder() {
-              if (logBuilder_ == null) {
-                  logBuilder_ =
-                          new com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto
-                                                                               .VtsReportMessage
-                                                                               .LogMessage,
-                                  com.android.vts.proto.VtsReportMessage.LogMessage.Builder,
-                                  com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder>(log_,
-                                  ((bitField0_ & 0x00002000) == 0x00002000), getParentForChildren(),
-                                  isClean());
-                  log_ = null;
-              }
-              return logBuilder_;
-          }
-
-          // @@protoc_insertion_point(builder_scope:android.vts.TestReportMessage)
-      }
-
-      static {
-          defaultInstance = new TestReportMessage(true);
-          defaultInstance.initFields();
-      }
-
-      // @@protoc_insertion_point(class_scope:android.vts.TestReportMessage)
-  }
-
-  public interface TestPlanReportMessageOrBuilder extends com.google.protobuf.MessageOrBuilder {
-      // repeated string test_module_name = 11;
-      /**
-       * <code>repeated string test_module_name = 11;</code>
-       *
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       */
-      java.util.List<java.lang.String> getTestModuleNameList();
-      /**
-       * <code>repeated string test_module_name = 11;</code>
-       *
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       */
-      int getTestModuleNameCount();
-      /**
-       * <code>repeated string test_module_name = 11;</code>
-       *
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       */
-      java.lang.String getTestModuleName(int index);
-      /**
-       * <code>repeated string test_module_name = 11;</code>
-       *
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       */
-      com.google.protobuf.ByteString getTestModuleNameBytes(int index);
-
-      // repeated int64 test_module_start_timestamp = 12;
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      java.util.List<java.lang.Long> getTestModuleStartTimestampList();
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      int getTestModuleStartTimestampCount();
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      long getTestModuleStartTimestamp(int index);
-
-      // optional string test_plan_name = 21;
-      /**
-       * <code>optional string test_plan_name = 21;</code>
-       *
-       * <pre>
-       * The test plan name.
-       * </pre>
-       */
-      boolean hasTestPlanName();
-      /**
-       * <code>optional string test_plan_name = 21;</code>
-       *
-       * <pre>
-       * The test plan name.
-       * </pre>
-       */
-      java.lang.String getTestPlanName();
-      /**
-       * <code>optional string test_plan_name = 21;</code>
-       *
-       * <pre>
-       * The test plan name.
-       * </pre>
-       */
-      com.google.protobuf.ByteString getTestPlanNameBytes();
-
-      // repeated .android.vts.UrlResourceMessage partner_report = 31;
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage>
-      getPartnerReportList();
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.UrlResourceMessage getPartnerReport(int index);
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      int getPartnerReportCount();
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      java.util.List<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder>
-      getPartnerReportOrBuilderList();
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder getPartnerReportOrBuilder(
-              int index);
-  }
-  /**
-   * Protobuf type {@code android.vts.TestPlanReportMessage}
-   *
-   * <pre>
-   * To specify a test execution report.
-   * </pre>
-   */
-  public static final class TestPlanReportMessage
-          extends com.google.protobuf.GeneratedMessage implements TestPlanReportMessageOrBuilder {
-      // Use TestPlanReportMessage.newBuilder() to construct.
-      private TestPlanReportMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-          super(builder);
-          this.unknownFields = builder.getUnknownFields();
-      }
-      private TestPlanReportMessage(boolean noInit) {
-          this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance();
-      }
-
-      private static final TestPlanReportMessage defaultInstance;
-      public static TestPlanReportMessage getDefaultInstance() {
-          return defaultInstance;
-      }
-
-      public TestPlanReportMessage getDefaultInstanceForType() {
-          return defaultInstance;
-      }
-
-      private final com.google.protobuf.UnknownFieldSet unknownFields;
-      @java.
-      lang.Override
-      public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
-          return this.unknownFields;
-      }
-      private TestPlanReportMessage(com.google.protobuf.CodedInputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          initFields();
-          int mutable_bitField0_ = 0;
-          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-                  com.google.protobuf.UnknownFieldSet.newBuilder();
-          try {
-              boolean done = false;
-              while (!done) {
-                  int tag = input.readTag();
-                  switch (tag) {
-                      case 0:
-                          done = true;
-                          break;
-                      default: {
-                          if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
-                              done = true;
-                          }
-                          break;
-                      }
-                      case 90: {
-                          if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
-                              testModuleName_ = new com.google.protobuf.LazyStringArrayList();
-                              mutable_bitField0_ |= 0x00000001;
-                          }
-                          testModuleName_.add(input.readBytes());
-                          break;
-                      }
-                      case 96: {
-                          if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                              testModuleStartTimestamp_ = new java.util.ArrayList<java.lang.Long>();
-                              mutable_bitField0_ |= 0x00000002;
-                          }
-                          testModuleStartTimestamp_.add(input.readInt64());
-                          break;
-                      }
-                      case 98: {
-                          int length = input.readRawVarint32();
-                          int limit = input.pushLimit(length);
-                          if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)
-                                  && input.getBytesUntilLimit() > 0) {
-                              testModuleStartTimestamp_ = new java.util.ArrayList<java.lang.Long>();
-                              mutable_bitField0_ |= 0x00000002;
-                          }
-                          while (input.getBytesUntilLimit() > 0) {
-                              testModuleStartTimestamp_.add(input.readInt64());
-                          }
-                          input.popLimit(limit);
-                          break;
-                      }
-                      case 170: {
-                          bitField0_ |= 0x00000001;
-                          testPlanName_ = input.readBytes();
-                          break;
-                      }
-                      case 250: {
-                          if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-                              partnerReport_ =
-                                      new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                      .UrlResourceMessage>();
-                              mutable_bitField0_ |= 0x00000008;
-                          }
-                          partnerReport_.add(input.readMessage(
-                                  com.android.vts.proto.VtsReportMessage.UrlResourceMessage.PARSER,
-                                  extensionRegistry));
-                          break;
-                      }
-                  }
-              }
-          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-              throw e.setUnfinishedMessage(this);
-          } catch (java.io.IOException e) {
-              throw new com.google.protobuf.InvalidProtocolBufferException(e.getMessage())
-                      .setUnfinishedMessage(this);
-          } finally {
-              if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
-                  testModuleName_ =
-                          new com.google.protobuf.UnmodifiableLazyStringList(testModuleName_);
-              }
-              if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                  testModuleStartTimestamp_ =
-                          java.util.Collections.unmodifiableList(testModuleStartTimestamp_);
-              }
-              if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-                  partnerReport_ = java.util.Collections.unmodifiableList(partnerReport_);
-              }
-              this.unknownFields = unknownFields.build();
-              makeExtensionsImmutable();
-          }
-      }
-      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
-          return com.android.vts.proto.VtsReportMessage
-                  .internal_static_android_vts_TestPlanReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internalGetFieldAccessorTable() {
-          return com.android.vts.proto.VtsReportMessage
-                  .internal_static_android_vts_TestPlanReportMessage_fieldAccessorTable
-                  .ensureFieldAccessorsInitialized(
-                          com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.class,
-                          com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder
-                                  .class);
-      }
-
-      public static com.google.protobuf.Parser<TestPlanReportMessage> PARSER =
-              new com.google.protobuf.AbstractParser<TestPlanReportMessage>() {
-                  public TestPlanReportMessage parsePartialFrom(
-                          com.google.protobuf.CodedInputStream input,
-                          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-                          throws com.google.protobuf.InvalidProtocolBufferException {
-                      return new TestPlanReportMessage(input, extensionRegistry);
-                  }
-              };
-
-      @java.
-      lang.Override
-      public com.google.protobuf.Parser<TestPlanReportMessage> getParserForType() {
-          return PARSER;
-      }
-
-      private int bitField0_;
-      // repeated string test_module_name = 11;
-      public static final int TEST_MODULE_NAME_FIELD_NUMBER = 11;
-      private com.google.protobuf.LazyStringList testModuleName_;
-      /**
-       * <code>repeated string test_module_name = 11;</code>
-       *
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       */
-      public java.util.List<java.lang.String> getTestModuleNameList() {
-          return testModuleName_;
-      }
-      /**
-       * <code>repeated string test_module_name = 11;</code>
-       *
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       */
-      public int getTestModuleNameCount() {
-          return testModuleName_.size();
-      }
-      /**
-       * <code>repeated string test_module_name = 11;</code>
-       *
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       */
-      public java.lang.String getTestModuleName(int index) {
-          return testModuleName_.get(index);
-      }
-      /**
-       * <code>repeated string test_module_name = 11;</code>
-       *
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getTestModuleNameBytes(int index) {
-          return testModuleName_.getByteString(index);
-      }
-
-      // repeated int64 test_module_start_timestamp = 12;
-      public static final int TEST_MODULE_START_TIMESTAMP_FIELD_NUMBER = 12;
-      private java.util.List<java.lang.Long> testModuleStartTimestamp_;
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public java.util.List<java.lang.Long> getTestModuleStartTimestampList() {
-          return testModuleStartTimestamp_;
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public int getTestModuleStartTimestampCount() {
-          return testModuleStartTimestamp_.size();
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public long getTestModuleStartTimestamp(int index) {
-          return testModuleStartTimestamp_.get(index);
-      }
-
-      // optional string test_plan_name = 21;
-      public static final int TEST_PLAN_NAME_FIELD_NUMBER = 21;
-      private java.lang.Object testPlanName_;
-      /**
-       * <code>optional string test_plan_name = 21;</code>
-       *
-       * <pre>
-       * The test plan name.
-       * </pre>
-       */
-      public boolean hasTestPlanName() {
-          return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional string test_plan_name = 21;</code>
-       *
-       * <pre>
-       * The test plan name.
-       * </pre>
-       */
-      public java.lang.String getTestPlanName() {
-          java.lang.Object ref = testPlanName_;
-          if (ref instanceof java.lang.String) {
-              return (java.lang.String) ref;
-          } else {
-              com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
-              java.lang.String s = bs.toStringUtf8();
-              if (bs.isValidUtf8()) {
-                  testPlanName_ = s;
-              }
-              return s;
-          }
-      }
-      /**
-       * <code>optional string test_plan_name = 21;</code>
-       *
-       * <pre>
-       * The test plan name.
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getTestPlanNameBytes() {
-          java.lang.Object ref = testPlanName_;
-          if (ref instanceof java.lang.String) {
-              com.google.protobuf.ByteString b =
-                      com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
-              testPlanName_ = b;
-              return b;
-          } else {
-              return (com.google.protobuf.ByteString) ref;
-          }
-      }
-
-      // repeated .android.vts.UrlResourceMessage partner_report = 31;
-      public static final int PARTNER_REPORT_FIELD_NUMBER = 31;
-      private java.util
-              .List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> partnerReport_;
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage>
-      getPartnerReportList() {
-          return partnerReport_;
-      }
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      public java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder>
-              getPartnerReportOrBuilderList() {
-          return partnerReport_;
-      }
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      public int getPartnerReportCount() {
-          return partnerReport_.size();
-      }
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage getPartnerReport(int index) {
-          return partnerReport_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       *
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder
-      getPartnerReportOrBuilder(int index) {
-          return partnerReport_.get(index);
-      }
-
-      private void initFields() {
-          testModuleName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-          testModuleStartTimestamp_ = java.util.Collections.emptyList();
-          testPlanName_ = "";
-          partnerReport_ = java.util.Collections.emptyList();
-      }
-      private byte memoizedIsInitialized = -1;
-      public final boolean isInitialized() {
-          byte isInitialized = memoizedIsInitialized;
-          if (isInitialized != -1)
-              return isInitialized == 1;
-
-          memoizedIsInitialized = 1;
-          return true;
-      }
-
-      public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-          getSerializedSize();
-          for (int i = 0; i < testModuleName_.size(); i++) {
-              output.writeBytes(11, testModuleName_.getByteString(i));
-          }
-          for (int i = 0; i < testModuleStartTimestamp_.size(); i++) {
-              output.writeInt64(12, testModuleStartTimestamp_.get(i));
-          }
-          if (((bitField0_ & 0x00000001) == 0x00000001)) {
-              output.writeBytes(21, getTestPlanNameBytes());
-          }
-          for (int i = 0; i < partnerReport_.size(); i++) {
-              output.writeMessage(31, partnerReport_.get(i));
-          }
-          getUnknownFields().writeTo(output);
-      }
-
-      private int memoizedSerializedSize = -1;
-      public int getSerializedSize() {
-          int size = memoizedSerializedSize;
-          if (size != -1)
-              return size;
-
-          size = 0;
-          {
-              int dataSize = 0;
-              for (int i = 0; i < testModuleName_.size(); i++) {
-                  dataSize += com.google.protobuf.CodedOutputStream.computeBytesSizeNoTag(
-                          testModuleName_.getByteString(i));
-              }
-              size += dataSize;
-              size += 1 * getTestModuleNameList().size();
-          }
-          {
-              int dataSize = 0;
-              for (int i = 0; i < testModuleStartTimestamp_.size(); i++) {
-                  dataSize += com.google.protobuf.CodedOutputStream.computeInt64SizeNoTag(
-                          testModuleStartTimestamp_.get(i));
-              }
-              size += dataSize;
-              size += 1 * getTestModuleStartTimestampList().size();
-          }
-          if (((bitField0_ & 0x00000001) == 0x00000001)) {
-              size += com.google.protobuf.CodedOutputStream.computeBytesSize(
-                      21, getTestPlanNameBytes());
-          }
-          for (int i = 0; i < partnerReport_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(
-                      31, partnerReport_.get(i));
-          }
-          size += getUnknownFields().getSerializedSize();
-          memoizedSerializedSize = size;
-          return size;
-      }
-
-      private static final long serialVersionUID = 0L;
-      @java.
-      lang.Override
-      protected java.lang.Object writeReplace() throws java.io.ObjectStreamException {
-          return super.writeReplace();
-      }
-
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-              com.google.protobuf.ByteString data)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-              com.google.protobuf.ByteString data,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-              byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-              byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-              java.io.InputStream input) throws java.io.IOException {
-          return PARSER.parseFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-              java.io.InputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseFrom(input, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseDelimitedFrom(
-              java.io.InputStream input) throws java.io.IOException {
-          return PARSER.parseDelimitedFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseDelimitedFrom(
-              java.io.InputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseDelimitedFrom(input, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-              com.google.protobuf.CodedInputStream input) throws java.io.IOException {
-          return PARSER.parseFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-              com.google.protobuf.CodedInputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseFrom(input, extensionRegistry);
-      }
-
-      public static Builder newBuilder() {
-          return Builder.create();
-      }
-      public Builder newBuilderForType() {
-          return newBuilder();
-      }
-      public static Builder newBuilder(
-              com.android.vts.proto.VtsReportMessage.TestPlanReportMessage prototype) {
-          return newBuilder().mergeFrom(prototype);
-      }
-      public Builder toBuilder() {
-          return newBuilder(this);
-      }
-
-      @java.lang.Override
-      protected Builder newBuilderForType(
-              com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-          Builder builder = new Builder(parent);
-          return builder;
-      }
-      /**
-       * Protobuf type {@code android.vts.TestPlanReportMessage}
-       *
-       * <pre>
-       * To specify a test execution report.
-       * </pre>
-       */
-      public static final class Builder
-              extends com.google.protobuf.GeneratedMessage.Builder<Builder>
-              implements com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder {
-          public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_TestPlanReportMessage_descriptor;
-          }
-
-          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_TestPlanReportMessage_fieldAccessorTable
-                      .ensureFieldAccessorsInitialized(
-                              com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.class,
-                              com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder
-                                      .class);
-          }
-
-          // Construct using
-          // com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.newBuilder()
-          private Builder() {
-              maybeForceBuilderInitialization();
-          }
-
-          private Builder(com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-              super(parent);
-              maybeForceBuilderInitialization();
-          }
-          private void maybeForceBuilderInitialization() {
-              if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-                  getPartnerReportFieldBuilder();
-              }
-          }
-          private static Builder create() {
-              return new Builder();
-          }
-
-          public Builder clear() {
-              super.clear();
-              testModuleName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              testModuleStartTimestamp_ = java.util.Collections.emptyList();
-              bitField0_ = (bitField0_ & ~0x00000002);
-              testPlanName_ = "";
-              bitField0_ = (bitField0_ & ~0x00000004);
-              if (partnerReportBuilder_ == null) {
-                  partnerReport_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000008);
-              } else {
-                  partnerReportBuilder_.clear();
-              }
-              return this;
-          }
-
-          public Builder clone() {
-              return create().mergeFrom(buildPartial());
-          }
-
-          public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_TestPlanReportMessage_descriptor;
-          }
-
-          public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage
-          getDefaultInstanceForType() {
-              return com.android.vts.proto.VtsReportMessage.TestPlanReportMessage
-                      .getDefaultInstance();
-          }
-
-          public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage build() {
-              com.android.vts.proto.VtsReportMessage.TestPlanReportMessage result = buildPartial();
-              if (!result.isInitialized()) {
-                  throw newUninitializedMessageException(result);
-              }
-              return result;
-          }
-
-          public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage buildPartial() {
-              com.android.vts.proto.VtsReportMessage.TestPlanReportMessage result =
-                      new com.android.vts.proto.VtsReportMessage.TestPlanReportMessage(this);
-              int from_bitField0_ = bitField0_;
-              int to_bitField0_ = 0;
-              if (((bitField0_ & 0x00000001) == 0x00000001)) {
-                  testModuleName_ =
-                          new com.google.protobuf.UnmodifiableLazyStringList(testModuleName_);
-                  bitField0_ = (bitField0_ & ~0x00000001);
-              }
-              result.testModuleName_ = testModuleName_;
-              if (((bitField0_ & 0x00000002) == 0x00000002)) {
-                  testModuleStartTimestamp_ =
-                          java.util.Collections.unmodifiableList(testModuleStartTimestamp_);
-                  bitField0_ = (bitField0_ & ~0x00000002);
-              }
-              result.testModuleStartTimestamp_ = testModuleStartTimestamp_;
-              if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-                  to_bitField0_ |= 0x00000001;
-              }
-              result.testPlanName_ = testPlanName_;
-              if (partnerReportBuilder_ == null) {
-                  if (((bitField0_ & 0x00000008) == 0x00000008)) {
-                      partnerReport_ = java.util.Collections.unmodifiableList(partnerReport_);
-                      bitField0_ = (bitField0_ & ~0x00000008);
-                  }
-                  result.partnerReport_ = partnerReport_;
-              } else {
-                  result.partnerReport_ = partnerReportBuilder_.build();
-              }
-              result.bitField0_ = to_bitField0_;
-              onBuilt();
-              return result;
-          }
-
-          public Builder mergeFrom(com.google.protobuf.Message other) {
-              if (other instanceof com.android.vts.proto.VtsReportMessage.TestPlanReportMessage) {
-                  return mergeFrom(
-                          (com.android.vts.proto.VtsReportMessage.TestPlanReportMessage) other);
-              } else {
-                  super.mergeFrom(other);
-                  return this;
-              }
-          }
-
-          public Builder mergeFrom(
-                  com.android.vts.proto.VtsReportMessage.TestPlanReportMessage other) {
-              if (other
-                      == com.android.vts.proto.VtsReportMessage.TestPlanReportMessage
-                                 .getDefaultInstance())
-                  return this;
-              if (!other.testModuleName_.isEmpty()) {
-                  if (testModuleName_.isEmpty()) {
-                      testModuleName_ = other.testModuleName_;
-                      bitField0_ = (bitField0_ & ~0x00000001);
-                  } else {
-                      ensureTestModuleNameIsMutable();
-                      testModuleName_.addAll(other.testModuleName_);
-                  }
-                  onChanged();
-              }
-              if (!other.testModuleStartTimestamp_.isEmpty()) {
-                  if (testModuleStartTimestamp_.isEmpty()) {
-                      testModuleStartTimestamp_ = other.testModuleStartTimestamp_;
-                      bitField0_ = (bitField0_ & ~0x00000002);
-                  } else {
-                      ensureTestModuleStartTimestampIsMutable();
-                      testModuleStartTimestamp_.addAll(other.testModuleStartTimestamp_);
-                  }
-                  onChanged();
-              }
-              if (other.hasTestPlanName()) {
-                  bitField0_ |= 0x00000004;
-                  testPlanName_ = other.testPlanName_;
-                  onChanged();
-              }
-              if (partnerReportBuilder_ == null) {
-                  if (!other.partnerReport_.isEmpty()) {
-                      if (partnerReport_.isEmpty()) {
-                          partnerReport_ = other.partnerReport_;
-                          bitField0_ = (bitField0_ & ~0x00000008);
-                      } else {
-                          ensurePartnerReportIsMutable();
-                          partnerReport_.addAll(other.partnerReport_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.partnerReport_.isEmpty()) {
-                      if (partnerReportBuilder_.isEmpty()) {
-                          partnerReportBuilder_.dispose();
-                          partnerReportBuilder_ = null;
-                          partnerReport_ = other.partnerReport_;
-                          bitField0_ = (bitField0_ & ~0x00000008);
-                          partnerReportBuilder_ =
-                                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getPartnerReportFieldBuilder()
-                                  : null;
-                      } else {
-                          partnerReportBuilder_.addAllMessages(other.partnerReport_);
-                      }
-                  }
-              }
-              this.mergeUnknownFields(other.getUnknownFields());
-              return this;
-          }
-
-          public final boolean isInitialized() {
-              return true;
-          }
-
-          public Builder mergeFrom(com.google.protobuf.CodedInputStream input,
-                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-                  throws java.io.IOException {
-              com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parsedMessage = null;
-              try {
-                  parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-              } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                  parsedMessage = (com.android.vts.proto.VtsReportMessage.TestPlanReportMessage)
-                                          e.getUnfinishedMessage();
-                  throw e;
-              } finally {
-                  if (parsedMessage != null) {
-                      mergeFrom(parsedMessage);
-                  }
-              }
-              return this;
-          }
-          private int bitField0_;
-
-          // repeated string test_module_name = 11;
-          private com.google.protobuf.LazyStringList testModuleName_ =
-                  com.google.protobuf.LazyStringArrayList.EMPTY;
-          private void ensureTestModuleNameIsMutable() {
-              if (!((bitField0_ & 0x00000001) == 0x00000001)) {
-                  testModuleName_ = new com.google.protobuf.LazyStringArrayList(testModuleName_);
-                  bitField0_ |= 0x00000001;
-              }
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public java.util.List<java.lang.String> getTestModuleNameList() {
-              return java.util.Collections.unmodifiableList(testModuleName_);
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public int getTestModuleNameCount() {
-              return testModuleName_.size();
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public java.lang.String getTestModuleName(int index) {
-              return testModuleName_.get(index);
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public com.google.protobuf.ByteString getTestModuleNameBytes(int index) {
-              return testModuleName_.getByteString(index);
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public Builder setTestModuleName(int index, java.lang.String value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              ensureTestModuleNameIsMutable();
-              testModuleName_.set(index, value);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public Builder addTestModuleName(java.lang.String value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              ensureTestModuleNameIsMutable();
-              testModuleName_.add(value);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public Builder addAllTestModuleName(java.lang.Iterable<java.lang.String> values) {
-              ensureTestModuleNameIsMutable();
-              super.addAll(values, testModuleName_);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public Builder clearTestModuleName() {
-              testModuleName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated string test_module_name = 11;</code>
-           *
-           * <pre>
-           * Keys used to find all TestReportMessage messages of test modules in
-           * this plan.
-           * </pre>
-           */
-          public Builder addTestModuleNameBytes(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              ensureTestModuleNameIsMutable();
-              testModuleName_.add(value);
-              onChanged();
-              return this;
-          }
-
-          // repeated int64 test_module_start_timestamp = 12;
-          private java.util.List<java.lang.Long> testModuleStartTimestamp_ =
-                  java.util.Collections.emptyList();
-          private void ensureTestModuleStartTimestampIsMutable() {
-              if (!((bitField0_ & 0x00000002) == 0x00000002)) {
-                  testModuleStartTimestamp_ =
-                          new java.util.ArrayList<java.lang.Long>(testModuleStartTimestamp_);
-                  bitField0_ |= 0x00000002;
-              }
-          }
-          /**
-           * <code>repeated int64 test_module_start_timestamp = 12;</code>
-           */
-          public java.util.List<java.lang.Long> getTestModuleStartTimestampList() {
-              return java.util.Collections.unmodifiableList(testModuleStartTimestamp_);
-          }
-          /**
-           * <code>repeated int64 test_module_start_timestamp = 12;</code>
-           */
-          public int getTestModuleStartTimestampCount() {
-              return testModuleStartTimestamp_.size();
-          }
-          /**
-           * <code>repeated int64 test_module_start_timestamp = 12;</code>
-           */
-          public long getTestModuleStartTimestamp(int index) {
-              return testModuleStartTimestamp_.get(index);
-          }
-          /**
-           * <code>repeated int64 test_module_start_timestamp = 12;</code>
-           */
-          public Builder setTestModuleStartTimestamp(int index, long value) {
-              ensureTestModuleStartTimestampIsMutable();
-              testModuleStartTimestamp_.set(index, value);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated int64 test_module_start_timestamp = 12;</code>
-           */
-          public Builder addTestModuleStartTimestamp(long value) {
-              ensureTestModuleStartTimestampIsMutable();
-              testModuleStartTimestamp_.add(value);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated int64 test_module_start_timestamp = 12;</code>
-           */
-          public Builder addAllTestModuleStartTimestamp(
-                  java.lang.Iterable<? extends java.lang.Long> values) {
-              ensureTestModuleStartTimestampIsMutable();
-              super.addAll(values, testModuleStartTimestamp_);
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>repeated int64 test_module_start_timestamp = 12;</code>
-           */
-          public Builder clearTestModuleStartTimestamp() {
-              testModuleStartTimestamp_ = java.util.Collections.emptyList();
-              bitField0_ = (bitField0_ & ~0x00000002);
-              onChanged();
-              return this;
-          }
-
-          // optional string test_plan_name = 21;
-          private java.lang.Object testPlanName_ = "";
-          /**
-           * <code>optional string test_plan_name = 21;</code>
-           *
-           * <pre>
-           * The test plan name.
-           * </pre>
-           */
-          public boolean hasTestPlanName() {
-              return ((bitField0_ & 0x00000004) == 0x00000004);
-          }
-          /**
-           * <code>optional string test_plan_name = 21;</code>
-           *
-           * <pre>
-           * The test plan name.
-           * </pre>
-           */
-          public java.lang.String getTestPlanName() {
-              java.lang.Object ref = testPlanName_;
-              if (!(ref instanceof java.lang.String)) {
-                  java.lang.String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
-                  testPlanName_ = s;
-                  return s;
-              } else {
-                  return (java.lang.String) ref;
-              }
-          }
-          /**
-           * <code>optional string test_plan_name = 21;</code>
-           *
-           * <pre>
-           * The test plan name.
-           * </pre>
-           */
-          public com.google.protobuf.ByteString getTestPlanNameBytes() {
-              java.lang.Object ref = testPlanName_;
-              if (ref instanceof String) {
-                  com.google.protobuf.ByteString b =
-                          com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
-                  testPlanName_ = b;
-                  return b;
-              } else {
-                  return (com.google.protobuf.ByteString) ref;
-              }
-          }
-          /**
-           * <code>optional string test_plan_name = 21;</code>
-           *
-           * <pre>
-           * The test plan name.
-           * </pre>
-           */
-          public Builder setTestPlanName(java.lang.String value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000004;
-              testPlanName_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional string test_plan_name = 21;</code>
-           *
-           * <pre>
-           * The test plan name.
-           * </pre>
-           */
-          public Builder clearTestPlanName() {
-              bitField0_ = (bitField0_ & ~0x00000004);
-              testPlanName_ = getDefaultInstance().getTestPlanName();
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional string test_plan_name = 21;</code>
-           *
-           * <pre>
-           * The test plan name.
-           * </pre>
-           */
-          public Builder setTestPlanNameBytes(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000004;
-              testPlanName_ = value;
-              onChanged();
-              return this;
-          }
-
-          // repeated .android.vts.UrlResourceMessage partner_report = 31;
-          private java.util
-                  .List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> partnerReport_ =
-                  java.util.Collections.emptyList();
-          private void ensurePartnerReportIsMutable() {
-              if (!((bitField0_ & 0x00000008) == 0x00000008)) {
-                  partnerReport_ =
-                          new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                          .UrlResourceMessage>(partnerReport_);
-                  bitField0_ |= 0x00000008;
-              }
-          }
-
-          private com.google.protobuf
-                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage.UrlResourceMessage,
-                          com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder,
-                          com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder>
-                          partnerReportBuilder_;
-
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage>
-          getPartnerReportList() {
-              if (partnerReportBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(partnerReport_);
-              } else {
-                  return partnerReportBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public int getPartnerReportCount() {
-              if (partnerReportBuilder_ == null) {
-                  return partnerReport_.size();
-              } else {
-                  return partnerReportBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.UrlResourceMessage getPartnerReport(
-                  int index) {
-              if (partnerReportBuilder_ == null) {
-                  return partnerReport_.get(index);
-              } else {
-                  return partnerReportBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder setPartnerReport(
-                  int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-              if (partnerReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensurePartnerReportIsMutable();
-                  partnerReport_.set(index, value);
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder setPartnerReport(
-                  int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage
-                                     .Builder builderForValue) {
-              if (partnerReportBuilder_ == null) {
-                  ensurePartnerReportIsMutable();
-                  partnerReport_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder addPartnerReport(
-                  com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-              if (partnerReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensurePartnerReportIsMutable();
-                  partnerReport_.add(value);
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder addPartnerReport(
-                  int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-              if (partnerReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensurePartnerReportIsMutable();
-                  partnerReport_.add(index, value);
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder addPartnerReport(com.android.vts.proto.VtsReportMessage.UrlResourceMessage
-                                                  .Builder builderForValue) {
-              if (partnerReportBuilder_ == null) {
-                  ensurePartnerReportIsMutable();
-                  partnerReport_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder addPartnerReport(
-                  int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage
-                                     .Builder builderForValue) {
-              if (partnerReportBuilder_ == null) {
-                  ensurePartnerReportIsMutable();
-                  partnerReport_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder addAllPartnerReport(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage
-                                                       .UrlResourceMessage> values) {
-              if (partnerReportBuilder_ == null) {
-                  ensurePartnerReportIsMutable();
-                  super.addAll(values, partnerReport_);
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder clearPartnerReport() {
-              if (partnerReportBuilder_ == null) {
-                  partnerReport_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000008);
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public Builder removePartnerReport(int index) {
-              if (partnerReportBuilder_ == null) {
-                  ensurePartnerReportIsMutable();
-                  partnerReport_.remove(index);
-                  onChanged();
-              } else {
-                  partnerReportBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder
-          getPartnerReportBuilder(int index) {
-              return getPartnerReportFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder
-          getPartnerReportOrBuilder(int index) {
-              if (partnerReportBuilder_ == null) {
-                  return partnerReport_.get(index);
-              } else {
-                  return partnerReportBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public java.util.List<
-                  ? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder>
-          getPartnerReportOrBuilderList() {
-              if (partnerReportBuilder_ != null) {
-                  return partnerReportBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(partnerReport_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder
-          addPartnerReportBuilder() {
-              return getPartnerReportFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.UrlResourceMessage
-                              .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder
-          addPartnerReportBuilder(int index) {
-              return getPartnerReportFieldBuilder().addBuilder(
-                      index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage
-                                     .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-           *
-           * <pre>
-           * Report resource flies.
-           * </pre>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder>
-          getPartnerReportBuilderList() {
-              return getPartnerReportFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf
-                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage.UrlResourceMessage,
-                          com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder,
-                          com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder>
-                  getPartnerReportFieldBuilder() {
-              if (partnerReportBuilder_ == null) {
-                  partnerReportBuilder_ =
-                          new com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto
-                                                                               .VtsReportMessage
-                                                                               .UrlResourceMessage,
-                                  com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder,
-                                  com.android.vts.proto.VtsReportMessage
-                                          .UrlResourceMessageOrBuilder>(partnerReport_,
-                                  ((bitField0_ & 0x00000008) == 0x00000008), getParentForChildren(),
-                                  isClean());
-                  partnerReport_ = null;
-              }
-              return partnerReportBuilder_;
-          }
-
-          // @@protoc_insertion_point(builder_scope:android.vts.TestPlanReportMessage)
-      }
-
-      static {
-          defaultInstance = new TestPlanReportMessage(true);
-          defaultInstance.initFields();
-      }
-
-      // @@protoc_insertion_point(class_scope:android.vts.TestPlanReportMessage)
-  }
-
-  public interface DashboardPostMessageOrBuilder extends com.google.protobuf.MessageOrBuilder {
-      // optional string access_token = 1;
-      /**
-       * <code>optional string access_token = 1;</code>
-       *
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       */
-      boolean hasAccessToken();
-      /**
-       * <code>optional string access_token = 1;</code>
-       *
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       */
-      java.lang.String getAccessToken();
-      /**
-       * <code>optional string access_token = 1;</code>
-       *
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       */
-      com.google.protobuf.ByteString getAccessTokenBytes();
-
-      // repeated .android.vts.TestReportMessage test_report = 2;
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage> getTestReportList();
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      com.android.vts.proto.VtsReportMessage.TestReportMessage getTestReport(int index);
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      int getTestReportCount();
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder>
-      getTestReportOrBuilderList();
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder getTestReportOrBuilder(
-              int index);
-
-      // repeated .android.vts.TestPlanReportMessage test_plan_report = 3;
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage>
-      getTestPlanReportList();
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getTestPlanReport(int index);
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      int getTestPlanReportCount();
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder>
-              getTestPlanReportOrBuilderList();
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder
-      getTestPlanReportOrBuilder(int index);
-  }
-  /**
-   * Protobuf type {@code android.vts.DashboardPostMessage}
-   *
-   * <pre>
-   * Proto wrapper for posting data to the VTS Dashboard
-   * </pre>
-   */
-  public static final class DashboardPostMessage
-          extends com.google.protobuf.GeneratedMessage implements DashboardPostMessageOrBuilder {
-      // Use DashboardPostMessage.newBuilder() to construct.
-      private DashboardPostMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
-          super(builder);
-          this.unknownFields = builder.getUnknownFields();
-      }
-      private DashboardPostMessage(boolean noInit) {
-          this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance();
-      }
-
-      private static final DashboardPostMessage defaultInstance;
-      public static DashboardPostMessage getDefaultInstance() {
-          return defaultInstance;
-      }
-
-      public DashboardPostMessage getDefaultInstanceForType() {
-          return defaultInstance;
-      }
-
-      private final com.google.protobuf.UnknownFieldSet unknownFields;
-      @java.
-      lang.Override
-      public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
-          return this.unknownFields;
-      }
-      private DashboardPostMessage(com.google.protobuf.CodedInputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          initFields();
-          int mutable_bitField0_ = 0;
-          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-                  com.google.protobuf.UnknownFieldSet.newBuilder();
-          try {
-              boolean done = false;
-              while (!done) {
-                  int tag = input.readTag();
-                  switch (tag) {
-                      case 0:
-                          done = true;
-                          break;
-                      default: {
-                          if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
-                              done = true;
-                          }
-                          break;
-                      }
-                      case 10: {
-                          bitField0_ |= 0x00000001;
-                          accessToken_ = input.readBytes();
-                          break;
-                      }
-                      case 18: {
-                          if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                              testReport_ =
-                                      new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                      .TestReportMessage>();
-                              mutable_bitField0_ |= 0x00000002;
-                          }
-                          testReport_.add(input.readMessage(
-                                  com.android.vts.proto.VtsReportMessage.TestReportMessage.PARSER,
-                                  extensionRegistry));
-                          break;
-                      }
-                      case 26: {
-                          if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-                              testPlanReport_ =
-                                      new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                      .TestPlanReportMessage>();
-                              mutable_bitField0_ |= 0x00000004;
-                          }
-                          testPlanReport_.add(
-                                  input.readMessage(com.android.vts.proto.VtsReportMessage
-                                                            .TestPlanReportMessage.PARSER,
-                                          extensionRegistry));
-                          break;
-                      }
-                  }
-              }
-          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-              throw e.setUnfinishedMessage(this);
-          } catch (java.io.IOException e) {
-              throw new com.google.protobuf.InvalidProtocolBufferException(e.getMessage())
-                      .setUnfinishedMessage(this);
-          } finally {
-              if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                  testReport_ = java.util.Collections.unmodifiableList(testReport_);
-              }
-              if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-                  testPlanReport_ = java.util.Collections.unmodifiableList(testPlanReport_);
-              }
-              this.unknownFields = unknownFields.build();
-              makeExtensionsImmutable();
-          }
-      }
-      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
-          return com.android.vts.proto.VtsReportMessage
-                  .internal_static_android_vts_DashboardPostMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internalGetFieldAccessorTable() {
-          return com.android.vts.proto.VtsReportMessage
-                  .internal_static_android_vts_DashboardPostMessage_fieldAccessorTable
-                  .ensureFieldAccessorsInitialized(
-                          com.android.vts.proto.VtsReportMessage.DashboardPostMessage.class,
-                          com.android.vts.proto.VtsReportMessage.DashboardPostMessage.Builder
-                                  .class);
-      }
-
-      public static com.google.protobuf.Parser<DashboardPostMessage> PARSER =
-              new com.google.protobuf.AbstractParser<DashboardPostMessage>() {
-                  public DashboardPostMessage parsePartialFrom(
-                          com.google.protobuf.CodedInputStream input,
-                          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-                          throws com.google.protobuf.InvalidProtocolBufferException {
-                      return new DashboardPostMessage(input, extensionRegistry);
-                  }
-              };
-
-      @java.
-      lang.Override
-      public com.google.protobuf.Parser<DashboardPostMessage> getParserForType() {
-          return PARSER;
-      }
-
-      private int bitField0_;
-      // optional string access_token = 1;
-      public static final int ACCESS_TOKEN_FIELD_NUMBER = 1;
-      private java.lang.Object accessToken_;
-      /**
-       * <code>optional string access_token = 1;</code>
-       *
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       */
-      public boolean hasAccessToken() {
-          return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <code>optional string access_token = 1;</code>
-       *
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       */
-      public java.lang.String getAccessToken() {
-          java.lang.Object ref = accessToken_;
-          if (ref instanceof java.lang.String) {
-              return (java.lang.String) ref;
-          } else {
-              com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
-              java.lang.String s = bs.toStringUtf8();
-              if (bs.isValidUtf8()) {
-                  accessToken_ = s;
-              }
-              return s;
-          }
-      }
-      /**
-       * <code>optional string access_token = 1;</code>
-       *
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       */
-      public com.google.protobuf.ByteString getAccessTokenBytes() {
-          java.lang.Object ref = accessToken_;
-          if (ref instanceof java.lang.String) {
-              com.google.protobuf.ByteString b =
-                      com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
-              accessToken_ = b;
-              return b;
-          } else {
-              return (com.google.protobuf.ByteString) ref;
-          }
-      }
-
-      // repeated .android.vts.TestReportMessage test_report = 2;
-      public static final int TEST_REPORT_FIELD_NUMBER = 2;
-      private java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage> testReport_;
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage>
-      getTestReportList() {
-          return testReport_;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder>
-              getTestReportOrBuilderList() {
-          return testReport_;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public int getTestReportCount() {
-          return testReport_.size();
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestReportMessage getTestReport(int index) {
-          return testReport_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder
-      getTestReportOrBuilder(int index) {
-          return testReport_.get(index);
-      }
-
-      // repeated .android.vts.TestPlanReportMessage test_plan_report = 3;
-      public static final int TEST_PLAN_REPORT_FIELD_NUMBER = 3;
-      private java.util
-              .List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage> testPlanReport_;
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage>
-      getTestPlanReportList() {
-          return testPlanReport_;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public java.util
-              .List<? extends com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder>
-              getTestPlanReportOrBuilderList() {
-          return testPlanReport_;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public int getTestPlanReportCount() {
-          return testPlanReport_.size();
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getTestPlanReport(
-              int index) {
-          return testPlanReport_.get(index);
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder
-      getTestPlanReportOrBuilder(int index) {
-          return testPlanReport_.get(index);
-      }
-
-      private void initFields() {
-          accessToken_ = "";
-          testReport_ = java.util.Collections.emptyList();
-          testPlanReport_ = java.util.Collections.emptyList();
-      }
-      private byte memoizedIsInitialized = -1;
-      public final boolean isInitialized() {
-          byte isInitialized = memoizedIsInitialized;
-          if (isInitialized != -1)
-              return isInitialized == 1;
-
-          memoizedIsInitialized = 1;
-          return true;
-      }
-
-      public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-          getSerializedSize();
-          if (((bitField0_ & 0x00000001) == 0x00000001)) {
-              output.writeBytes(1, getAccessTokenBytes());
-          }
-          for (int i = 0; i < testReport_.size(); i++) {
-              output.writeMessage(2, testReport_.get(i));
-          }
-          for (int i = 0; i < testPlanReport_.size(); i++) {
-              output.writeMessage(3, testPlanReport_.get(i));
-          }
-          getUnknownFields().writeTo(output);
-      }
-
-      private int memoizedSerializedSize = -1;
-      public int getSerializedSize() {
-          int size = memoizedSerializedSize;
-          if (size != -1)
-              return size;
-
-          size = 0;
-          if (((bitField0_ & 0x00000001) == 0x00000001)) {
-              size += com.google.protobuf.CodedOutputStream.computeBytesSize(
-                      1, getAccessTokenBytes());
-          }
-          for (int i = 0; i < testReport_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(
-                      2, testReport_.get(i));
-          }
-          for (int i = 0; i < testPlanReport_.size(); i++) {
-              size += com.google.protobuf.CodedOutputStream.computeMessageSize(
-                      3, testPlanReport_.get(i));
-          }
-          size += getUnknownFields().getSerializedSize();
-          memoizedSerializedSize = size;
-          return size;
-      }
-
-      private static final long serialVersionUID = 0L;
-      @java.
-      lang.Override
-      protected java.lang.Object writeReplace() throws java.io.ObjectStreamException {
-          return super.writeReplace();
-      }
-
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-              com.google.protobuf.ByteString data)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-              com.google.protobuf.ByteString data,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-              byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-              byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws com.google.protobuf.InvalidProtocolBufferException {
-          return PARSER.parseFrom(data, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-              java.io.InputStream input) throws java.io.IOException {
-          return PARSER.parseFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-              java.io.InputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseFrom(input, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseDelimitedFrom(
-              java.io.InputStream input) throws java.io.IOException {
-          return PARSER.parseDelimitedFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseDelimitedFrom(
-              java.io.InputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseDelimitedFrom(input, extensionRegistry);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-              com.google.protobuf.CodedInputStream input) throws java.io.IOException {
-          return PARSER.parseFrom(input);
-      }
-      public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-              com.google.protobuf.CodedInputStream input,
-              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-              throws java.io.IOException {
-          return PARSER.parseFrom(input, extensionRegistry);
-      }
-
-      public static Builder newBuilder() {
-          return Builder.create();
-      }
-      public Builder newBuilderForType() {
-          return newBuilder();
-      }
-      public static Builder newBuilder(
-              com.android.vts.proto.VtsReportMessage.DashboardPostMessage prototype) {
-          return newBuilder().mergeFrom(prototype);
-      }
-      public Builder toBuilder() {
-          return newBuilder(this);
-      }
-
-      @java.lang.Override
-      protected Builder newBuilderForType(
-              com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-          Builder builder = new Builder(parent);
-          return builder;
-      }
-      /**
-       * Protobuf type {@code android.vts.DashboardPostMessage}
-       *
-       * <pre>
-       * Proto wrapper for posting data to the VTS Dashboard
-       * </pre>
-       */
-      public static final class Builder
-              extends com.google.protobuf.GeneratedMessage.Builder<Builder>
-              implements com.android.vts.proto.VtsReportMessage.DashboardPostMessageOrBuilder {
-          public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_DashboardPostMessage_descriptor;
-          }
-
-          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_DashboardPostMessage_fieldAccessorTable
-                      .ensureFieldAccessorsInitialized(
-                              com.android.vts.proto.VtsReportMessage.DashboardPostMessage.class,
-                              com.android.vts.proto.VtsReportMessage.DashboardPostMessage.Builder
-                                      .class);
-          }
-
-          // Construct using
-          // com.android.vts.proto.VtsReportMessage.DashboardPostMessage.newBuilder()
-          private Builder() {
-              maybeForceBuilderInitialization();
-          }
-
-          private Builder(com.google.protobuf.GeneratedMessage.BuilderParent parent) {
-              super(parent);
-              maybeForceBuilderInitialization();
-          }
-          private void maybeForceBuilderInitialization() {
-              if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
-                  getTestReportFieldBuilder();
-                  getTestPlanReportFieldBuilder();
-              }
-          }
-          private static Builder create() {
-              return new Builder();
-          }
-
-          public Builder clear() {
-              super.clear();
-              accessToken_ = "";
-              bitField0_ = (bitField0_ & ~0x00000001);
-              if (testReportBuilder_ == null) {
-                  testReport_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000002);
-              } else {
-                  testReportBuilder_.clear();
-              }
-              if (testPlanReportBuilder_ == null) {
-                  testPlanReport_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000004);
-              } else {
-                  testPlanReportBuilder_.clear();
-              }
-              return this;
-          }
-
-          public Builder clone() {
-              return create().mergeFrom(buildPartial());
-          }
-
-          public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-              return com.android.vts.proto.VtsReportMessage
-                      .internal_static_android_vts_DashboardPostMessage_descriptor;
-          }
-
-          public com.android.vts.proto.VtsReportMessage.DashboardPostMessage
-          getDefaultInstanceForType() {
-              return com.android.vts.proto.VtsReportMessage.DashboardPostMessage
-                      .getDefaultInstance();
-          }
-
-          public com.android.vts.proto.VtsReportMessage.DashboardPostMessage build() {
-              com.android.vts.proto.VtsReportMessage.DashboardPostMessage result = buildPartial();
-              if (!result.isInitialized()) {
-                  throw newUninitializedMessageException(result);
-              }
-              return result;
-          }
-
-          public com.android.vts.proto.VtsReportMessage.DashboardPostMessage buildPartial() {
-              com.android.vts.proto.VtsReportMessage.DashboardPostMessage result =
-                      new com.android.vts.proto.VtsReportMessage.DashboardPostMessage(this);
-              int from_bitField0_ = bitField0_;
-              int to_bitField0_ = 0;
-              if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-                  to_bitField0_ |= 0x00000001;
-              }
-              result.accessToken_ = accessToken_;
-              if (testReportBuilder_ == null) {
-                  if (((bitField0_ & 0x00000002) == 0x00000002)) {
-                      testReport_ = java.util.Collections.unmodifiableList(testReport_);
-                      bitField0_ = (bitField0_ & ~0x00000002);
-                  }
-                  result.testReport_ = testReport_;
-              } else {
-                  result.testReport_ = testReportBuilder_.build();
-              }
-              if (testPlanReportBuilder_ == null) {
-                  if (((bitField0_ & 0x00000004) == 0x00000004)) {
-                      testPlanReport_ = java.util.Collections.unmodifiableList(testPlanReport_);
-                      bitField0_ = (bitField0_ & ~0x00000004);
-                  }
-                  result.testPlanReport_ = testPlanReport_;
-              } else {
-                  result.testPlanReport_ = testPlanReportBuilder_.build();
-              }
-              result.bitField0_ = to_bitField0_;
-              onBuilt();
-              return result;
-          }
-
-          public Builder mergeFrom(com.google.protobuf.Message other) {
-              if (other instanceof com.android.vts.proto.VtsReportMessage.DashboardPostMessage) {
-                  return mergeFrom(
-                          (com.android.vts.proto.VtsReportMessage.DashboardPostMessage) other);
-              } else {
-                  super.mergeFrom(other);
-                  return this;
-              }
-          }
-
-          public Builder mergeFrom(
-                  com.android.vts.proto.VtsReportMessage.DashboardPostMessage other) {
-              if (other
-                      == com.android.vts.proto.VtsReportMessage.DashboardPostMessage
-                                 .getDefaultInstance())
-                  return this;
-              if (other.hasAccessToken()) {
-                  bitField0_ |= 0x00000001;
-                  accessToken_ = other.accessToken_;
-                  onChanged();
-              }
-              if (testReportBuilder_ == null) {
-                  if (!other.testReport_.isEmpty()) {
-                      if (testReport_.isEmpty()) {
-                          testReport_ = other.testReport_;
-                          bitField0_ = (bitField0_ & ~0x00000002);
-                      } else {
-                          ensureTestReportIsMutable();
-                          testReport_.addAll(other.testReport_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.testReport_.isEmpty()) {
-                      if (testReportBuilder_.isEmpty()) {
-                          testReportBuilder_.dispose();
-                          testReportBuilder_ = null;
-                          testReport_ = other.testReport_;
-                          bitField0_ = (bitField0_ & ~0x00000002);
-                          testReportBuilder_ =
-                                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getTestReportFieldBuilder()
-                                  : null;
-                      } else {
-                          testReportBuilder_.addAllMessages(other.testReport_);
-                      }
-                  }
-              }
-              if (testPlanReportBuilder_ == null) {
-                  if (!other.testPlanReport_.isEmpty()) {
-                      if (testPlanReport_.isEmpty()) {
-                          testPlanReport_ = other.testPlanReport_;
-                          bitField0_ = (bitField0_ & ~0x00000004);
-                      } else {
-                          ensureTestPlanReportIsMutable();
-                          testPlanReport_.addAll(other.testPlanReport_);
-                      }
-                      onChanged();
-                  }
-              } else {
-                  if (!other.testPlanReport_.isEmpty()) {
-                      if (testPlanReportBuilder_.isEmpty()) {
-                          testPlanReportBuilder_.dispose();
-                          testPlanReportBuilder_ = null;
-                          testPlanReport_ = other.testPlanReport_;
-                          bitField0_ = (bitField0_ & ~0x00000004);
-                          testPlanReportBuilder_ =
-                                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders
-                                  ? getTestPlanReportFieldBuilder()
-                                  : null;
-                      } else {
-                          testPlanReportBuilder_.addAllMessages(other.testPlanReport_);
-                      }
-                  }
-              }
-              this.mergeUnknownFields(other.getUnknownFields());
-              return this;
-          }
-
-          public final boolean isInitialized() {
-              return true;
-          }
-
-          public Builder mergeFrom(com.google.protobuf.CodedInputStream input,
-                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-                  throws java.io.IOException {
-              com.android.vts.proto.VtsReportMessage.DashboardPostMessage parsedMessage = null;
-              try {
-                  parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-              } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                  parsedMessage = (com.android.vts.proto.VtsReportMessage.DashboardPostMessage)
-                                          e.getUnfinishedMessage();
-                  throw e;
-              } finally {
-                  if (parsedMessage != null) {
-                      mergeFrom(parsedMessage);
-                  }
-              }
-              return this;
-          }
-          private int bitField0_;
-
-          // optional string access_token = 1;
-          private java.lang.Object accessToken_ = "";
-          /**
-           * <code>optional string access_token = 1;</code>
-           *
-           * <pre>
-           * oauth2.0 access token
-           * </pre>
-           */
-          public boolean hasAccessToken() {
-              return ((bitField0_ & 0x00000001) == 0x00000001);
-          }
-          /**
-           * <code>optional string access_token = 1;</code>
-           *
-           * <pre>
-           * oauth2.0 access token
-           * </pre>
-           */
-          public java.lang.String getAccessToken() {
-              java.lang.Object ref = accessToken_;
-              if (!(ref instanceof java.lang.String)) {
-                  java.lang.String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
-                  accessToken_ = s;
-                  return s;
-              } else {
-                  return (java.lang.String) ref;
-              }
-          }
-          /**
-           * <code>optional string access_token = 1;</code>
-           *
-           * <pre>
-           * oauth2.0 access token
-           * </pre>
-           */
-          public com.google.protobuf.ByteString getAccessTokenBytes() {
-              java.lang.Object ref = accessToken_;
-              if (ref instanceof String) {
-                  com.google.protobuf.ByteString b =
-                          com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
-                  accessToken_ = b;
-                  return b;
-              } else {
-                  return (com.google.protobuf.ByteString) ref;
-              }
-          }
-          /**
-           * <code>optional string access_token = 1;</code>
-           *
-           * <pre>
-           * oauth2.0 access token
-           * </pre>
-           */
-          public Builder setAccessToken(java.lang.String value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000001;
-              accessToken_ = value;
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional string access_token = 1;</code>
-           *
-           * <pre>
-           * oauth2.0 access token
-           * </pre>
-           */
-          public Builder clearAccessToken() {
-              bitField0_ = (bitField0_ & ~0x00000001);
-              accessToken_ = getDefaultInstance().getAccessToken();
-              onChanged();
-              return this;
-          }
-          /**
-           * <code>optional string access_token = 1;</code>
-           *
-           * <pre>
-           * oauth2.0 access token
-           * </pre>
-           */
-          public Builder setAccessTokenBytes(com.google.protobuf.ByteString value) {
-              if (value == null) {
-                  throw new NullPointerException();
-              }
-              bitField0_ |= 0x00000001;
-              accessToken_ = value;
-              onChanged();
-              return this;
-          }
-
-          // repeated .android.vts.TestReportMessage test_report = 2;
-          private java.util
-                  .List<com.android.vts.proto.VtsReportMessage.TestReportMessage> testReport_ =
-                  java.util.Collections.emptyList();
-          private void ensureTestReportIsMutable() {
-              if (!((bitField0_ & 0x00000002) == 0x00000002)) {
-                  testReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                                .TestReportMessage>(testReport_);
-                  bitField0_ |= 0x00000002;
-              }
-          }
-
-          private com.google.protobuf
-                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage.TestReportMessage,
-                          com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder,
-                          com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder>
-                          testReportBuilder_;
-
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage>
-          getTestReportList() {
-              if (testReportBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(testReport_);
-              } else {
-                  return testReportBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public int getTestReportCount() {
-              if (testReportBuilder_ == null) {
-                  return testReport_.size();
-              } else {
-                  return testReportBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestReportMessage getTestReport(int index) {
-              if (testReportBuilder_ == null) {
-                  return testReport_.get(index);
-              } else {
-                  return testReportBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder setTestReport(
-                  int index, com.android.vts.proto.VtsReportMessage.TestReportMessage value) {
-              if (testReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestReportIsMutable();
-                  testReport_.set(index, value);
-                  onChanged();
-              } else {
-                  testReportBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder setTestReport(
-                  int index, com.android.vts.proto.VtsReportMessage.TestReportMessage
-                                     .Builder builderForValue) {
-              if (testReportBuilder_ == null) {
-                  ensureTestReportIsMutable();
-                  testReport_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  testReportBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder addTestReport(
-                  com.android.vts.proto.VtsReportMessage.TestReportMessage value) {
-              if (testReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestReportIsMutable();
-                  testReport_.add(value);
-                  onChanged();
-              } else {
-                  testReportBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder addTestReport(
-                  int index, com.android.vts.proto.VtsReportMessage.TestReportMessage value) {
-              if (testReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestReportIsMutable();
-                  testReport_.add(index, value);
-                  onChanged();
-              } else {
-                  testReportBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder addTestReport(com.android.vts.proto.VtsReportMessage.TestReportMessage
-                                               .Builder builderForValue) {
-              if (testReportBuilder_ == null) {
-                  ensureTestReportIsMutable();
-                  testReport_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  testReportBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder addTestReport(
-                  int index, com.android.vts.proto.VtsReportMessage.TestReportMessage
-                                     .Builder builderForValue) {
-              if (testReportBuilder_ == null) {
-                  ensureTestReportIsMutable();
-                  testReport_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  testReportBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder addAllTestReport(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage
-                                                       .TestReportMessage> values) {
-              if (testReportBuilder_ == null) {
-                  ensureTestReportIsMutable();
-                  super.addAll(values, testReport_);
-                  onChanged();
-              } else {
-                  testReportBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder clearTestReport() {
-              if (testReportBuilder_ == null) {
-                  testReport_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000002);
-                  onChanged();
-              } else {
-                  testReportBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public Builder removeTestReport(int index) {
-              if (testReportBuilder_ == null) {
-                  ensureTestReportIsMutable();
-                  testReport_.remove(index);
-                  onChanged();
-              } else {
-                  testReportBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder
-          getTestReportBuilder(int index) {
-              return getTestReportFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder
-          getTestReportOrBuilder(int index) {
-              if (testReportBuilder_ == null) {
-                  return testReport_.get(index);
-              } else {
-                  return testReportBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public java.util
-                  .List<? extends com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder>
-                  getTestReportOrBuilderList() {
-              if (testReportBuilder_ != null) {
-                  return testReportBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(testReport_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder
-          addTestReportBuilder() {
-              return getTestReportFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.TestReportMessage
-                              .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder
-          addTestReportBuilder(int index) {
-              return getTestReportFieldBuilder().addBuilder(
-                      index, com.android.vts.proto.VtsReportMessage.TestReportMessage
-                                     .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder>
-          getTestReportBuilderList() {
-              return getTestReportFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf
-                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage.TestReportMessage,
-                          com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder,
-                          com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder>
-                  getTestReportFieldBuilder() {
-              if (testReportBuilder_ == null) {
-                  testReportBuilder_ =
-                          new com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto
-                                                                               .VtsReportMessage
-                                                                               .TestReportMessage,
-                                  com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder,
-                                  com.android.vts.proto.VtsReportMessage
-                                          .TestReportMessageOrBuilder>(testReport_,
-                                  ((bitField0_ & 0x00000002) == 0x00000002), getParentForChildren(),
-                                  isClean());
-                  testReport_ = null;
-              }
-              return testReportBuilder_;
-          }
-
-          // repeated .android.vts.TestPlanReportMessage test_plan_report = 3;
-          private java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage>
-                  testPlanReport_ = java.util.Collections.emptyList();
-          private void ensureTestPlanReportIsMutable() {
-              if (!((bitField0_ & 0x00000004) == 0x00000004)) {
-                  testPlanReport_ =
-                          new java.util.ArrayList<com.android.vts.proto.VtsReportMessage
-                                                          .TestPlanReportMessage>(testPlanReport_);
-                  bitField0_ |= 0x00000004;
-              }
-          }
-
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .TestPlanReportMessage,
-                  com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder>
-                  testPlanReportBuilder_;
-
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage>
-          getTestPlanReportList() {
-              if (testPlanReportBuilder_ == null) {
-                  return java.util.Collections.unmodifiableList(testPlanReport_);
-              } else {
-                  return testPlanReportBuilder_.getMessageList();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public int getTestPlanReportCount() {
-              if (testPlanReportBuilder_ == null) {
-                  return testPlanReport_.size();
-              } else {
-                  return testPlanReportBuilder_.getCount();
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getTestPlanReport(
-                  int index) {
-              if (testPlanReportBuilder_ == null) {
-                  return testPlanReport_.get(index);
-              } else {
-                  return testPlanReportBuilder_.getMessage(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder setTestPlanReport(
-                  int index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage value) {
-              if (testPlanReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestPlanReportIsMutable();
-                  testPlanReport_.set(index, value);
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.setMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder setTestPlanReport(
-                  int index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage
-                                     .Builder builderForValue) {
-              if (testPlanReportBuilder_ == null) {
-                  ensureTestPlanReportIsMutable();
-                  testPlanReport_.set(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.setMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder addTestPlanReport(
-                  com.android.vts.proto.VtsReportMessage.TestPlanReportMessage value) {
-              if (testPlanReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestPlanReportIsMutable();
-                  testPlanReport_.add(value);
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.addMessage(value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder addTestPlanReport(
-                  int index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage value) {
-              if (testPlanReportBuilder_ == null) {
-                  if (value == null) {
-                      throw new NullPointerException();
-                  }
-                  ensureTestPlanReportIsMutable();
-                  testPlanReport_.add(index, value);
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.addMessage(index, value);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder addTestPlanReport(com.android.vts.proto.VtsReportMessage
-                                                   .TestPlanReportMessage.Builder builderForValue) {
-              if (testPlanReportBuilder_ == null) {
-                  ensureTestPlanReportIsMutable();
-                  testPlanReport_.add(builderForValue.build());
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.addMessage(builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder addTestPlanReport(
-                  int index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage
-                                     .Builder builderForValue) {
-              if (testPlanReportBuilder_ == null) {
-                  ensureTestPlanReportIsMutable();
-                  testPlanReport_.add(index, builderForValue.build());
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.addMessage(index, builderForValue.build());
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder addAllTestPlanReport(
-                  java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage
-                                                       .TestPlanReportMessage> values) {
-              if (testPlanReportBuilder_ == null) {
-                  ensureTestPlanReportIsMutable();
-                  super.addAll(values, testPlanReport_);
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.addAllMessages(values);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder clearTestPlanReport() {
-              if (testPlanReportBuilder_ == null) {
-                  testPlanReport_ = java.util.Collections.emptyList();
-                  bitField0_ = (bitField0_ & ~0x00000004);
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.clear();
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public Builder removeTestPlanReport(int index) {
-              if (testPlanReportBuilder_ == null) {
-                  ensureTestPlanReportIsMutable();
-                  testPlanReport_.remove(index);
-                  onChanged();
-              } else {
-                  testPlanReportBuilder_.remove(index);
-              }
-              return this;
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder
-          getTestPlanReportBuilder(int index) {
-              return getTestPlanReportFieldBuilder().getBuilder(index);
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder
-          getTestPlanReportOrBuilder(int index) {
-              if (testPlanReportBuilder_ == null) {
-                  return testPlanReport_.get(index);
-              } else {
-                  return testPlanReportBuilder_.getMessageOrBuilder(index);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public java.util.List<
-                  ? extends com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder>
-          getTestPlanReportOrBuilderList() {
-              if (testPlanReportBuilder_ != null) {
-                  return testPlanReportBuilder_.getMessageOrBuilderList();
-              } else {
-                  return java.util.Collections.unmodifiableList(testPlanReport_);
-              }
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder
-          addTestPlanReportBuilder() {
-              return getTestPlanReportFieldBuilder().addBuilder(
-                      com.android.vts.proto.VtsReportMessage.TestPlanReportMessage
-                              .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder
-          addTestPlanReportBuilder(int index) {
-              return getTestPlanReportFieldBuilder().addBuilder(
-                      index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage
-                                     .getDefaultInstance());
-          }
-          /**
-           * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-           */
-          public java.util
-                  .List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder>
-                  getTestPlanReportBuilderList() {
-              return getTestPlanReportFieldBuilder().getBuilderList();
-          }
-          private com.google.protobuf.RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                   .TestPlanReportMessage,
-                  com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder,
-                  com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder>
-          getTestPlanReportFieldBuilder() {
-              if (testPlanReportBuilder_ == null) {
-                  testPlanReportBuilder_ =
-                          new com.google.protobuf
-                                  .RepeatedFieldBuilder<com.android.vts.proto.VtsReportMessage
-                                                                .TestPlanReportMessage,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .TestPlanReportMessage.Builder,
-                                          com.android.vts.proto.VtsReportMessage
-                                                  .TestPlanReportMessageOrBuilder>(testPlanReport_,
-                                          ((bitField0_ & 0x00000004) == 0x00000004),
-                                          getParentForChildren(), isClean());
-                  testPlanReport_ = null;
-              }
-              return testPlanReportBuilder_;
-          }
-
-          // @@protoc_insertion_point(builder_scope:android.vts.DashboardPostMessage)
-      }
-
-      static {
-          defaultInstance = new DashboardPostMessage(true);
-          defaultInstance.initFields();
-      }
-
-      // @@protoc_insertion_point(class_scope:android.vts.DashboardPostMessage)
-  }
-
-  private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_AndroidDeviceInfoMessage_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_AndroidDeviceInfoMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_AndroidBuildInfo_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_AndroidBuildInfo_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_VtsHostInfo_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_VtsHostInfo_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_TestCaseReportMessage_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_TestCaseReportMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_ProfilingReportMessage_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_ProfilingReportMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_SystraceReportMessage_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_SystraceReportMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_CoverageReportMessage_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_CoverageReportMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_LogMessage_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_LogMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors
-          .Descriptor internal_static_android_vts_UrlResourceMessage_descriptor;
-  private static com.google.protobuf.GeneratedMessage
-          .FieldAccessorTable internal_static_android_vts_UrlResourceMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors
-          .Descriptor internal_static_android_vts_TestReportMessage_descriptor;
-  private static
-    com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_android_vts_TestReportMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors
-          .Descriptor internal_static_android_vts_TestPlanReportMessage_descriptor;
-  private static com.google.protobuf.GeneratedMessage
-          .FieldAccessorTable internal_static_android_vts_TestPlanReportMessage_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors
-          .Descriptor internal_static_android_vts_DashboardPostMessage_descriptor;
-  private static com.google.protobuf.GeneratedMessage
-          .FieldAccessorTable internal_static_android_vts_DashboardPostMessage_fieldAccessorTable;
-
-  public static com.google.protobuf.Descriptors.FileDescriptor
-      getDescriptor() {
-    return descriptor;
-  }
-  private static com.google.protobuf.Descriptors.FileDescriptor
-      descriptor;
-  static {
-      java.lang.String[] descriptorData = {
-              "\n\026VtsReportMessage.proto\022\013android.vts\"\340\001"
-                      + "\n\030AndroidDeviceInfoMessage\022\024\n\014product_ty"
-                      + "pe\030\001 \001(\014\022\027\n\017product_variant\030\002 \001(\014\022\024\n\014bui"
-                      + "ld_flavor\030\013 \001(\014\022\020\n\010build_id\030\014 \001(\014\022\016\n\006bra"
-                      + "nch\030\025 \001(\014\022\023\n\013build_alias\030\026 \001(\014\022\021\n\tapi_le"
-                      + "vel\030\037 \001(\014\022\020\n\010abi_name\0303 \001(\014\022\023\n\013abi_bitne"
-                      + "ss\0304 \001(\014\022\016\n\006serial\030e \001(\014\"g\n\020AndroidBuild"
-                      + "Info\022\n\n\002id\030\001 \001(\014\022\014\n\004name\030\013 \001(\014\022\022\n\nbuild_"
-                      + "type\030\014 \001(\014\022\016\n\006branch\030\r \001(\014\022\025\n\rbuild_summ"
-                      + "ary\030\025 \001(\014\"\037\n\013VtsHostInfo\022\020\n\010hostname\030\001 \001",
-              "(\014\"\321\002\n\025TestCaseReportMessage\022\014\n\004name\030\001 \001"
-                      + "(\014\0220\n\013test_result\030\013 \001(\0162\033.android.vts.Te"
-                      + "stCaseResult\022\027\n\017start_timestamp\030\025 \001(\003\022\025\n"
-                      + "\rend_timestamp\030\026 \001(\003\0224\n\010coverage\030\037 \003(\0132\""
-                      + ".android.vts.CoverageReportMessage\0226\n\tpr"
-                      + "ofiling\030) \003(\0132#.android.vts.ProfilingRep"
-                      + "ortMessage\0224\n\010systrace\030* \003(\0132\".android.v"
-                      + "ts.SystraceReportMessage\022$\n\003log\030e \003(\0132\027."
-                      + "android.vts.LogMessage\"\240\002\n\026ProfilingRepo"
-                      + "rtMessage\022\014\n\004name\030\001 \001(\014\022+\n\004type\030\002 \001(\0162\035.",
-              "android.vts.VtsProfilingType\022@\n\017regressi"
-                      + "on_mode\030\003 \001(\0162\'.android.vts.VtsProfiling"
-                      + "RegressionMode\022\027\n\017start_timestamp\030\013 \001(\003\022"
-                      + "\025\n\rend_timestamp\030\014 \001(\003\022\r\n\005label\030\025 \003(\014\022\r\n"
-                      + "\005value\030\026 \003(\003\022\024\n\014x_axis_label\030\037 \001(\014\022\024\n\014y_"
-                      + "axis_label\030  \001(\014\022\017\n\007options\030) \003(\014\"H\n\025Sys"
-                      + "traceReportMessage\022\024\n\014process_name\030\001 \001(\014"
-                      + "\022\014\n\004html\030\013 \003(\014\022\013\n\003url\030\025 \003(\014\"\345\001\n\025Coverage"
-                      + "ReportMessage\022\021\n\tfile_path\030\013 \001(\014\022\024\n\014proj"
-                      + "ect_name\030\014 \001(\014\022\020\n\010revision\030\r \001(\014\022\034\n\024line",
-              "_coverage_vector\030\027 \003(\005\022\030\n\020total_line_cou"
-                      + "nt\030e \001(\005\022\032\n\022covered_line_count\030f \001(\005\022\024\n\010"
-                      + "dir_path\030\001 \001(\014B\002\030\001\022\025\n\tfile_name\030\002 \001(\014B\002\030"
-                      + "\001\022\020\n\004html\030\003 \001(\014B\002\030\001\"8\n\nLogMessage\022\013\n\003url"
-                      + "\030\001 \001(\014\022\014\n\004name\030\002 \001(\014\022\017\n\007content\030\003 \001(\014\"@\n"
-                      + "\022UrlResourceMessage\022\013\n\003url\030\001 \001(\014\022\014\n\004name"
-                      + "\030\002 \001(\014\022\017\n\007content\030\003 \001(\014\"\316\004\n\021TestReportMe"
-                      + "ssage\022\026\n\ntest_suite\030\001 \001(\014B\002\030\001\022\014\n\004test\030\002 "
-                      + "\001(\014\022+\n\ttest_type\030\003 \001(\0162\030.android.vts.Vts"
-                      + "TestType\022:\n\013device_info\030\004 \003(\0132%.android.",
-              "vts.AndroidDeviceInfoMessage\0221\n\nbuild_in"
-                      + "fo\030\005 \001(\0132\035.android.vts.AndroidBuildInfo\022"
-                      + "\030\n\020subscriber_email\030\006 \003(\014\022+\n\thost_info\030\007"
-                      + " \001(\0132\030.android.vts.VtsHostInfo\0225\n\ttest_c"
-                      + "ase\030\013 \003(\0132\".android.vts.TestCaseReportMe"
-                      + "ssage\0226\n\tprofiling\030\025 \003(\0132#.android.vts.P"
-                      + "rofilingReportMessage\0224\n\010systrace\030\026 \003(\0132"
-                      + "\".android.vts.SystraceReportMessage\022\027\n\017s"
-                      + "tart_timestamp\030e \001(\003\022\025\n\rend_timestamp\030f "
-                      + "\001(\003\0224\n\010coverage\030g \003(\0132\".android.vts.Cove",
-              "rageReportMessage\022%\n\003log\030\351\007 \003(\0132\027.androi"
-                      + "d.vts.LogMessage\"\247\001\n\025TestPlanReportMessa"
-                      + "ge\022\030\n\020test_module_name\030\013 \003(\t\022#\n\033test_mod"
-                      + "ule_start_timestamp\030\014 \003(\003\022\026\n\016test_plan_n"
-                      + "ame\030\025 \001(\t\0227\n\016partner_report\030\037 \003(\0132\037.andr"
-                      + "oid.vts.UrlResourceMessage\"\237\001\n\024Dashboard"
-                      + "PostMessage\022\024\n\014access_token\030\001 \001(\t\0223\n\013tes"
-                      + "t_report\030\002 \003(\0132\036.android.vts.TestReportM"
-                      + "essage\022<\n\020test_plan_report\030\003 \003(\0132\".andro"
-                      + "id.vts.TestPlanReportMessage*\263\001\n\016TestCas",
-              "eResult\022\022\n\016UNKNOWN_RESULT\020\000\022\031\n\025TEST_CASE"
-                      + "_RESULT_PASS\020\001\022\031\n\025TEST_CASE_RESULT_FAIL\020"
-                      + "\002\022\031\n\025TEST_CASE_RESULT_SKIP\020\003\022\036\n\032TEST_CAS"
-                      + "E_RESULT_EXCEPTION\020\004\022\034\n\030TEST_CASE_RESULT"
-                      + "_TIMEOUT\020\005*\234\001\n\013VtsTestType\022\030\n\024UNKNOWN_VT"
-                      + "S_TESTTYPE\020\000\022\036\n\032VTS_HOST_DRIVEN_STRUCTUR"
-                      + "AL\020\001\022\033\n\027VTS_HOST_DRIVEN_FUZZING\020\002\022\031\n\025VTS"
-                      + "_TARGET_SIDE_GTEST\020\003\022\033\n\027VTS_TARGET_SIDE_"
-                      + "FUZZING\020\004*\243\001\n\032VtsProfilingRegressionMode"
-                      + "\022\033\n\027UNKNOWN_REGRESSION_MODE\020\000\022 \n\034VTS_REG",
-              "RESSION_MODE_DISABLED\020\001\022\"\n\036VTS_REGRESSIO"
-                      + "N_MODE_INCREASING\020\002\022\"\n\036VTS_REGRESSION_MO"
-                      + "DE_DECREASING\020\003*\244\001\n\020VtsProfilingType\022\036\n\032"
-                      + "UNKNOWN_VTS_PROFILING_TYPE\020\000\022 \n\034VTS_PROF"
-                      + "ILING_TYPE_TIMESTAMP\020\001\022%\n!VTS_PROFILING_"
-                      + "TYPE_LABELED_VECTOR\020\002\022\'\n#VTS_PROFILING_T"
-                      + "YPE_UNLABELED_VECTOR\020\003B+\n\025com.android.vt"
-                      + "s.protoB\020VtsReportMessageP\000"};
-      com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
-              new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
-                  public com.google.protobuf.ExtensionRegistry assignDescriptors(
-                          com.google.protobuf.Descriptors.FileDescriptor root) {
-                      descriptor = root;
-                      internal_static_android_vts_AndroidDeviceInfoMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(0);
-                      internal_static_android_vts_AndroidDeviceInfoMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_AndroidDeviceInfoMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "ProductType", "ProductVariant", "BuildFlavor",
-                                              "BuildId", "Branch", "BuildAlias", "ApiLevel",
-                                              "AbiName", "AbiBitness", "Serial",
-                                      });
-                      internal_static_android_vts_AndroidBuildInfo_descriptor =
-                              getDescriptor().getMessageTypes().get(1);
-                      internal_static_android_vts_AndroidBuildInfo_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_AndroidBuildInfo_descriptor,
-                                      new java.lang.String[] {
-                                              "Id", "Name", "BuildType", "Branch", "BuildSummary",
-                                      });
-                      internal_static_android_vts_VtsHostInfo_descriptor =
-                              getDescriptor().getMessageTypes().get(2);
-                      internal_static_android_vts_VtsHostInfo_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_VtsHostInfo_descriptor,
-                                      new java.lang.String[] {
-                                              "Hostname",
-                                      });
-                      internal_static_android_vts_TestCaseReportMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(3);
-                      internal_static_android_vts_TestCaseReportMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_TestCaseReportMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "Name", "TestResult", "StartTimestamp",
-                                              "EndTimestamp", "Coverage", "Profiling", "Systrace",
-                                              "Log",
-                                      });
-                      internal_static_android_vts_ProfilingReportMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(4);
-                      internal_static_android_vts_ProfilingReportMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_ProfilingReportMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "Name", "Type", "RegressionMode", "StartTimestamp",
-                                              "EndTimestamp", "Label", "Value", "XAxisLabel",
-                                              "YAxisLabel", "Options",
-                                      });
-                      internal_static_android_vts_SystraceReportMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(5);
-                      internal_static_android_vts_SystraceReportMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_SystraceReportMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "ProcessName", "Html", "Url",
-                                      });
-                      internal_static_android_vts_CoverageReportMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(6);
-                      internal_static_android_vts_CoverageReportMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_CoverageReportMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "FilePath", "ProjectName", "Revision",
-                                              "LineCoverageVector", "TotalLineCount",
-                                              "CoveredLineCount", "DirPath", "FileName", "Html",
-                                      });
-                      internal_static_android_vts_LogMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(7);
-                      internal_static_android_vts_LogMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_LogMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "Url", "Name", "Content",
-                                      });
-                      internal_static_android_vts_UrlResourceMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(8);
-                      internal_static_android_vts_UrlResourceMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_UrlResourceMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "Url", "Name", "Content",
-                                      });
-                      internal_static_android_vts_TestReportMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(9);
-                      internal_static_android_vts_TestReportMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_TestReportMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "TestSuite", "Test", "TestType", "DeviceInfo",
-                                              "BuildInfo", "SubscriberEmail", "HostInfo",
-                                              "TestCase", "Profiling", "Systrace", "StartTimestamp",
-                                              "EndTimestamp", "Coverage", "Log",
-                                      });
-                      internal_static_android_vts_TestPlanReportMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(10);
-                      internal_static_android_vts_TestPlanReportMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_TestPlanReportMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "TestModuleName", "TestModuleStartTimestamp",
-                                              "TestPlanName", "PartnerReport",
-                                      });
-                      internal_static_android_vts_DashboardPostMessage_descriptor =
-                              getDescriptor().getMessageTypes().get(11);
-                      internal_static_android_vts_DashboardPostMessage_fieldAccessorTable =
-                              new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-                                      internal_static_android_vts_DashboardPostMessage_descriptor,
-                                      new java.lang.String[] {
-                                              "AccessToken", "TestReport", "TestPlanReport",
-                                      });
-                      return null;
-                  }
-              };
-      com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(
-              descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}, assigner);
-  }
-
-  // @@protoc_insertion_point(outer_class_scope)
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/BaseServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/BaseServlet.java
deleted file mode 100644
index 86c5bb9..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/BaseServlet.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserService;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
-import java.io.IOException;
-import java.util.List;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public abstract class BaseServlet extends HttpServlet {
-    protected final Logger logger = Logger.getLogger(getClass().getName());
-
-    // Environment variables
-    protected static final String GERRIT_URI = System.getProperty("GERRIT_URI");
-    protected static final String GERRIT_SCOPE = System.getProperty("GERRIT_SCOPE");
-    protected static final String CLIENT_ID = System.getProperty("CLIENT_ID");
-    protected static final String ANALYTICS_ID = System.getProperty("ANALYTICS_ID");
-
-    // Common constants
-    protected static final String CURRENT_PAGE = "#";
-
-    public enum Page {
-        HOME("VTS Dashboard Home", "/"),
-        TABLE("", "/show_table"),
-        GRAPH("Profiling", "/show_graph"),
-        COVERAGE("Coverage", "/show_coverage"),
-        PERFORMANCE("Performance Digest", "/show_performance_digest"),
-        PLAN_RELEASE("", "/show_plan_release"),
-        PLAN_RUN("Run", "/show_plan_run"),
-        ;
-
-        private final String name;
-        private final String url;
-
-        Page(String name, String url) {
-            this.name = name;
-            this.url = url;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public String getUrl() {
-            return url;
-        }
-    }
-
-    /**
-     * Get a list of URL/Display name pairs for the navbar heirarchy.
-     *
-     * @param request The HttpServletRequest object for the page request.
-     * @return a list of 2-entried String arrays in the order [page url, page name]
-     */
-    public abstract List<String[]> getNavbarLinks(HttpServletRequest request);
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        // If the user is logged out, allow them to log back in and return to the page.
-        // Set the logout URL to direct back to a login page that directs to the current request.
-        UserService userService = UserServiceFactory.getUserService();
-        User currentUser = userService.getCurrentUser();
-        String requestUri = request.getRequestURI();
-        String requestArgs = request.getQueryString();
-        String loginURI = userService.createLoginURL(requestUri + '?' + requestArgs);
-        String logoutURI = userService.createLogoutURL(loginURI);
-        if (currentUser == null || currentUser.getEmail() == null) {
-            response.sendRedirect(loginURI);
-            return;
-        }
-        request.setAttribute("logoutURL", logoutURI);
-        request.setAttribute("email", currentUser.getEmail());
-        request.setAttribute("analyticsID", new Gson().toJson(ANALYTICS_ID));
-        request.setAttribute("navbarLinksJson", new Gson().toJson(getNavbarLinks(request)));
-        request.setAttribute("navbarLinks", getNavbarLinks(request));
-        response.setContentType("text/html");
-        doGetHandler(request, response);
-    }
-
-    /**
-     * Implementation of the doGet method to be executed by servlet subclasses.
-     *
-     * @param request The HttpServletRequest object.
-     * @param response The HttpServletResponse object.
-     * @throws IOException
-     */
-    public abstract void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException;
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/DashboardMainServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/DashboardMainServlet.java
deleted file mode 100644
index d190d25..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/DashboardMainServlet.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.UserFavoriteEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.PropertyProjection;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserService;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Represents the servlet that is invoked on loading the first page of dashboard. */
-public class DashboardMainServlet extends BaseServlet {
-    private static final String DASHBOARD_MAIN_JSP = "WEB-INF/jsp/dashboard_main.jsp";
-    private static final String DASHBOARD_ALL_LINK = "/?showAll=true";
-    private static final String DASHBOARD_FAVORITES_LINK = "/";
-    private static final String ALL_HEADER = "All Tests";
-    private static final String FAVORITES_HEADER = "Favorites";
-    private static final String NO_TESTS_ERROR = "No test results available.";
-    private static final String FAVORITES_BUTTON = "Show Favorites";
-    private static final String ALL_BUTTON = "Show All";
-    private static final String UP_ARROW = "keyboard_arrow_up";
-    private static final String DOWN_ARROW = "keyboard_arrow_down";
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        List<String[]> links = new ArrayList<>();
-        Page root = Page.HOME;
-        String[] rootEntry = new String[] {root.getUrl(), root.getName()};
-        links.add(rootEntry);
-        return links;
-    }
-
-    /** Helper class for displaying test entries on the main dashboard. */
-    public class TestDisplay implements Comparable<TestDisplay> {
-        private final Key testKey;
-        private final int passCount;
-        private final int failCount;
-
-        /**
-         * Test display constructor.
-         *
-         * @param testKey The key of the test.
-         * @param passCount The number of tests passing.
-         * @param failCount The number of tests failing.
-         */
-        public TestDisplay(Key testKey, int passCount, int failCount) {
-            this.testKey = testKey;
-            this.passCount = passCount;
-            this.failCount = failCount;
-        }
-
-        /**
-         * Get the key of the test.
-         *
-         * @return The key of the test.
-         */
-        public String getName() {
-            return this.testKey.getName();
-        }
-
-        /**
-         * Get the number of passing test cases.
-         *
-         * @return The number of passing test cases.
-         */
-        public int getPassCount() {
-            return this.passCount;
-        }
-
-        /**
-         * Get the number of failing test cases.
-         *
-         * @return The number of failing test cases.
-         */
-        public int getFailCount() {
-            return this.failCount;
-        }
-
-        @Override
-        public int compareTo(TestDisplay test) {
-            return this.testKey.getName().compareTo(test.getName());
-        }
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        UserService userService = UserServiceFactory.getUserService();
-        User currentUser = userService.getCurrentUser();
-        RequestDispatcher dispatcher = null;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        List<TestDisplay> displayedTests = new ArrayList<>();
-        List<String> allTests = new ArrayList<>();
-
-        Map<Key, TestDisplay> testMap = new HashMap<>(); // map from table key to TestDisplay
-        Map<String, String> subscriptionMap = new HashMap<>();
-
-        boolean showAll = request.getParameter("showAll") != null;
-        String header;
-        String buttonLabel;
-        String buttonIcon;
-        String buttonLink;
-        String error = null;
-
-        Query q = new Query(TestEntity.KIND)
-                          .addProjection(new PropertyProjection(TestEntity.PASS_COUNT, Long.class))
-                          .addProjection(new PropertyProjection(TestEntity.FAIL_COUNT, Long.class));
-        for (Entity test : datastore.prepare(q).asIterable()) {
-            TestEntity testEntity = TestEntity.fromEntity(test);
-            if (test != null) {
-                TestDisplay display =
-                        new TestDisplay(test.getKey(), testEntity.passCount, testEntity.failCount);
-                testMap.put(test.getKey(), display);
-                allTests.add(test.getKey().getName());
-            }
-        }
-
-        if (testMap.size() == 0) {
-            error = NO_TESTS_ERROR;
-        }
-
-        if (showAll) {
-            for (Key testKey : testMap.keySet()) {
-                displayedTests.add(testMap.get(testKey));
-            }
-            header = ALL_HEADER;
-            buttonLabel = FAVORITES_BUTTON;
-            buttonIcon = UP_ARROW;
-            buttonLink = DASHBOARD_FAVORITES_LINK;
-        } else {
-            if (testMap.size() > 0) {
-                Filter userFilter = new FilterPredicate(
-                        UserFavoriteEntity.USER, FilterOperator.EQUAL, currentUser);
-                q = new Query(UserFavoriteEntity.KIND).setFilter(userFilter);
-
-                for (Entity favorite : datastore.prepare(q).asIterable()) {
-                    Key testKey = (Key) favorite.getProperty(UserFavoriteEntity.TEST_KEY);
-                    if (!testMap.containsKey(testKey)) {
-                        continue;
-                    }
-                    displayedTests.add(testMap.get(testKey));
-                    subscriptionMap.put(
-                            testKey.getName(), KeyFactory.keyToString(favorite.getKey()));
-                }
-            }
-            header = FAVORITES_HEADER;
-            buttonLabel = ALL_BUTTON;
-            buttonIcon = DOWN_ARROW;
-            buttonLink = DASHBOARD_ALL_LINK;
-        }
-        Collections.sort(displayedTests);
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        request.setAttribute("allTestsJson", new Gson().toJson(allTests));
-        request.setAttribute("subscriptionMapJson", new Gson().toJson(subscriptionMap));
-        request.setAttribute("testNames", displayedTests);
-        request.setAttribute("headerLabel", header);
-        request.setAttribute("showAll", showAll);
-        request.setAttribute("buttonLabel", buttonLabel);
-        request.setAttribute("buttonIcon", buttonIcon);
-        request.setAttribute("buttonLink", buttonLink);
-        request.setAttribute("error", error);
-        dispatcher = request.getRequestDispatcher(DASHBOARD_MAIN_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/ShowCoverageServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/ShowCoverageServlet.java
deleted file mode 100644
index 728b219..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/ShowCoverageServlet.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.gson.Gson;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to show code coverage. */
-public class ShowCoverageServlet extends BaseServlet {
-    private static final String COVERAGE_JSP = "WEB-INF/jsp/show_coverage.jsp";
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        List<String[]> links = new ArrayList<>();
-        Page root = Page.HOME;
-        String[] rootEntry = new String[] {root.getUrl(), root.getName()};
-        links.add(rootEntry);
-
-        Page table = Page.TABLE;
-        String testName = request.getParameter("testName");
-        String name = table.getName() + testName;
-        String url = table.getUrl() + "?testName=" + testName;
-        String[] tableEntry = new String[] {url, name};
-        links.add(tableEntry);
-
-        Page coverage = Page.COVERAGE;
-        String startTime = request.getParameter("startTime");
-        url = coverage.getUrl() + "?testName=" + testName + "&startTime=" + startTime;
-        String[] coverageEntry = new String[] {url, coverage.getName()};
-        links.add(coverageEntry);
-        return links;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        RequestDispatcher dispatcher = null;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String test = request.getParameter("testName");
-        String timeString = request.getParameter("startTime");
-
-        // Process the time key requested
-        long time = -1;
-        try {
-            time = Long.parseLong(timeString);
-        } catch (NumberFormatException e) {
-            request.setAttribute("testName", test);
-            dispatcher = request.getRequestDispatcher("/show_table.jsp");
-            return;
-        }
-
-        // Compute the parent test run key based off of the test and time
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, test);
-        Key testRunKey = KeyFactory.createKey(testKey, TestRunEntity.KIND, time);
-
-        // Create a query for coverage entities
-        Query coverageQuery = new Query(CoverageEntity.KIND).setAncestor(testRunKey);
-
-        List<String> sourceFiles = new ArrayList<>(); // list of source files
-        List<List<Long>> coverageVectors = new ArrayList<>(); // list of line coverage vectors
-        List<String> projects = new ArrayList<>(); // list of project names
-        List<String> commits = new ArrayList<>(); // list of project commit hashes
-        List<String> indicators = new ArrayList<>(); // list of HTML indicates to display
-
-        /*
-         * Map from section name to a list of indexes into the above lists where each coverage
-         * report's data is located.
-         */
-        Map<String, List<Integer>> sectionMap = new HashMap<>();
-        for (Entity e : datastore.prepare(coverageQuery).asIterable()) {
-            CoverageEntity coverageEntity = CoverageEntity.fromEntity(e);
-            if (coverageEntity == null) {
-                logger.log(Level.WARNING, "Invalid coverage entity: " + e.getKey());
-                continue;
-            }
-            if (!sectionMap.containsKey(coverageEntity.group)) {
-                sectionMap.put(coverageEntity.group, new ArrayList<Integer>());
-            }
-            sectionMap.get(coverageEntity.group).add(coverageVectors.size());
-            coverageVectors.add(coverageEntity.lineCoverage);
-            sourceFiles.add(coverageEntity.filePath);
-            projects.add(coverageEntity.projectName);
-            commits.add(coverageEntity.projectVersion);
-            String indicator = "";
-            long total = coverageEntity.totalLineCount;
-            long covered = coverageEntity.coveredLineCount;
-            if (total > 0) {
-                double pct = Math.round(covered * 10000d / total) / 100d;
-                String color = pct >= 70 ? "green" : "red";
-                indicator = "<div class=\"right indicator " + color + "\">" + pct + "%</div>"
-                        + "<span class=\"right total-count\">" + covered + "/" + total + "</span>";
-            }
-            indicators.add(indicator);
-        }
-
-        request.setAttribute("testName", request.getParameter("testName"));
-        request.setAttribute("gerritURI", new Gson().toJson(GERRIT_URI));
-        request.setAttribute("gerritScope", new Gson().toJson(GERRIT_SCOPE));
-        request.setAttribute("clientId", new Gson().toJson(CLIENT_ID));
-        request.setAttribute("coverageVectors", new Gson().toJson(coverageVectors));
-        request.setAttribute("sourceFiles", new Gson().toJson(sourceFiles));
-        request.setAttribute("projects", new Gson().toJson(projects));
-        request.setAttribute("commits", new Gson().toJson(commits));
-        request.setAttribute("indicators", new Gson().toJson(indicators));
-        request.setAttribute("sectionMap", new Gson().toJson(sectionMap));
-        request.setAttribute("startTime", request.getParameter("startTime"));
-        dispatcher = request.getRequestDispatcher(COVERAGE_JSP);
-
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/ShowGraphServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/ShowGraphServlet.java
deleted file mode 100644
index 1f396c8..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/ShowGraphServlet.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.Graph;
-import com.android.vts.util.GraphSerializer;
-import com.android.vts.util.Histogram;
-import com.android.vts.util.LineGraph;
-import com.android.vts.util.PerformanceUtil;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-
-/** Servlet for handling requests to load graphs. */
-public class ShowGraphServlet extends BaseServlet {
-    private static final String GRAPH_JSP = "WEB-INF/jsp/show_graph.jsp";
-    private static final long DEFAULT_FILTER_OPTION = -1;
-
-    private static final String HIDL_HAL_OPTION = "hidl_hal_mode";
-    private static final String[] splitKeysArray = new String[] {HIDL_HAL_OPTION};
-    private static final Set<String> splitKeySet =
-            new HashSet<String>(Arrays.asList(splitKeysArray));
-    private static final String PROFILING_DATA_ALERT = "No profiling data was found.";
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        List<String[]> links = new ArrayList<>();
-        Page root = Page.HOME;
-        String[] rootEntry = new String[] {root.getUrl(), root.getName()};
-        links.add(rootEntry);
-
-        Page table = Page.TABLE;
-        String testName = request.getParameter("testName");
-        String name = table.getName() + testName;
-        String url = table.getUrl() + "?testName=" + testName;
-        String[] tableEntry = new String[] {url, name};
-        links.add(tableEntry);
-
-        Page graph = Page.GRAPH;
-        String profilingPointName = request.getParameter("profilingPoint");
-        url = graph.getUrl() + "?testName=" + testName + "&profilingPoint=" + profilingPointName;
-        String[] graphEntry = new String[] {url, graph.getName()};
-        links.add(graphEntry);
-        return links;
-    }
-
-    /**
-     * Process a profiling report message and add it to the map of graphs.
-     *
-     * @param profilingRun The Entity of a profiling point run to process.
-     * @param idString The ID derived from the test run to identify the profiling report.
-     * @param graphMap A map from graph name to Graph object.
-     */
-    private static void processProfilingRun(
-            Entity profilingRun, String idString, Map<String, Graph> graphMap) {
-        ProfilingPointRunEntity pt = ProfilingPointRunEntity.fromEntity(profilingRun);
-        if (pt == null)
-            return;
-        String name = PerformanceUtil.getOptionAlias(profilingRun, splitKeySet);
-        Graph g = null;
-        if (pt.labels != null && pt.labels.size() == pt.values.size()) {
-            g = new LineGraph(name);
-        } else if (pt.labels == null && pt.values.size() > 0) {
-            g = new Histogram(name);
-        } else {
-            return;
-        }
-        if (!graphMap.containsKey(name)) {
-            graphMap.put(name, g);
-        }
-        graphMap.get(name).addData(idString, pt);
-    }
-
-    /**
-     * Get a summary string describing the devices in the test run.
-     *
-     * @param testRun The entity storing test run information.
-     * @param selectedDevice The name of the selected device.
-     * @return A string describing the devices in the test run, or null if it doesn't match filter.
-     */
-    private static String getDeviceSummary(Entity testRun, String selectedDevice) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        List<String> buildInfos = new ArrayList<>();
-        Query deviceQuery =
-                new Query(DeviceInfoEntity.KIND)
-                        .setAncestor(testRun.getKey());
-        boolean isSelectedDevice = selectedDevice == null;
-        for (Entity device : datastore.prepare(deviceQuery).asIterable()) {
-            String product = (String) device.getProperty(DeviceInfoEntity.PRODUCT);
-            if (selectedDevice != null && product.equals(selectedDevice)) {
-                isSelectedDevice = true;
-            }
-            String buildId = (String) device.getProperty(DeviceInfoEntity.BUILD_ID);
-            buildInfos.add(product + " (" + buildId + ")");
-        }
-        return isSelectedDevice ? StringUtils.join(buildInfos, ", ") : null;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        RequestDispatcher dispatcher = null;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String testName = request.getParameter("testName");
-        String profilingPointName = request.getParameter("profilingPoint");
-        String selectedDevice = request.getParameter("device");
-        Long endTime = null;
-        if (request.getParameter("endTime") != null) {
-            String time = request.getParameter("endTime");
-            try {
-                endTime = Long.parseLong(time);
-            } catch (NumberFormatException e) {
-            }
-        }
-        if (endTime == null) {
-            endTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        }
-        Long startTime = endTime - TimeUnit.DAYS.toMicros(1);
-
-        // Set of device names
-        List<String> devices = DatastoreHelper.getAllProducts();
-        if (!devices.contains(selectedDevice))
-            selectedDevice = null;
-
-        Map<String, Graph> graphMap = new HashMap<>();
-
-        // Create a query for test runs matching the time window filter
-        Key parentKey = KeyFactory.createKey(TestEntity.KIND, testName);
-        Filter timeFilter = FilterUtil.getTimeFilter(parentKey, startTime, endTime);
-        Query testRunQuery = new Query(TestRunEntity.KIND)
-                                     .setAncestor(parentKey)
-                                     .setFilter(timeFilter)
-                                     .setKeysOnly();
-
-        // Process the test runs in the query
-        for (Entity testRun : datastore.prepare(testRunQuery).asIterable()) {
-            String buildInfoString = getDeviceSummary(testRun, selectedDevice);
-            if (buildInfoString == null) {
-                continue;
-            }
-
-            try {
-                Entity profilingRun = datastore.get(KeyFactory.createKey(
-                        testRun.getKey(), ProfilingPointRunEntity.KIND, profilingPointName));
-                processProfilingRun(profilingRun, buildInfoString, graphMap);
-            } catch (EntityNotFoundException e) {
-                // Profiling point not collected during this test run
-                continue;
-            }
-        }
-        // Get the names of the graphs to render
-        String[] names = graphMap.keySet().toArray(new String[graphMap.size()]);
-        Arrays.sort(names);
-
-        List<Graph> graphList = new ArrayList<>();
-        boolean hasHistogram = false;
-        for (String name : names) {
-            Graph g = graphMap.get(name);
-            if (g.size() > 0) {
-                graphList.add(g);
-                if (g instanceof Histogram)
-                    hasHistogram = true;
-            }
-        }
-
-        String filterVal = request.getParameter("filterVal");
-        try {
-            Long.parseLong(filterVal);
-        } catch (NumberFormatException e) {
-            filterVal = Long.toString(DEFAULT_FILTER_OPTION);
-        }
-        request.setAttribute("testName", request.getParameter("testName"));
-        request.setAttribute("filterVal", filterVal);
-        request.setAttribute("endTime", new Gson().toJson(endTime));
-        request.setAttribute("devices", devices);
-        request.setAttribute("selectedDevice", selectedDevice);
-        request.setAttribute("showFilterDropdown", hasHistogram);
-        if (graphList.size() == 0)
-            request.setAttribute("error", PROFILING_DATA_ALERT);
-
-        Gson gson = new GsonBuilder()
-                            .registerTypeHierarchyAdapter(Graph.class, new GraphSerializer())
-                            .create();
-        request.setAttribute("graphs", gson.toJson(graphList));
-
-        request.setAttribute("profilingPointName", profilingPointName);
-        dispatcher = request.getRequestDispatcher(GRAPH_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/ShowPerformanceDigestServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/ShowPerformanceDigestServlet.java
deleted file mode 100644
index 213cc51..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/ShowPerformanceDigestServlet.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.PerformanceSummary;
-import com.android.vts.util.PerformanceUtil;
-import com.android.vts.util.PerformanceUtil.TimeInterval;
-import com.android.vts.util.ProfilingPointSummary;
-import com.android.vts.util.StatSummary;
-import java.io.IOException;
-import java.math.RoundingMode;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for producing tabular performance summaries. */
-public class ShowPerformanceDigestServlet extends BaseServlet {
-    private static final String PERF_DIGEST_JSP = "WEB-INF/jsp/show_performance_digest.jsp";
-    private static final String HIDL_HAL_OPTION = "hidl_hal_mode";
-    private static final String[] splitKeysArray = new String[] {HIDL_HAL_OPTION};
-    private static final Set<String> splitKeySet =
-            new HashSet<String>(Arrays.asList(splitKeysArray));
-
-    private static final String MEAN = "Mean";
-    private static final String MIN = "Min";
-    private static final String MAX = "Max";
-    private static final String MEAN_DELTA = "&Delta;Mean (%)";
-    private static final String HIGHER_IS_BETTER =
-            "Note: Higher values are better. Maximum is the best-case performance.";
-    private static final String LOWER_IS_BETTER =
-            "Note: Lower values are better. Minimum is the best-case performance.";
-    private static final String STD = "Std";
-
-    private static final DecimalFormat FORMATTER;
-
-    /**
-     * Initialize the decimal formatter.
-     */
-    static {
-        FORMATTER = new DecimalFormat("#.##");
-        FORMATTER.setRoundingMode(RoundingMode.HALF_UP);
-    }
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        List<String[]> links = new ArrayList<>();
-        Page root = Page.HOME;
-        String[] rootEntry = new String[] {root.getUrl(), root.getName()};
-        links.add(rootEntry);
-
-        Page table = Page.TABLE;
-        String testName = request.getParameter("testName");
-        String name = table.getName() + testName;
-        String url = table.getUrl() + "?testName=" + testName;
-        String[] tableEntry = new String[] {url, name};
-        links.add(tableEntry);
-
-        Page perf = Page.PERFORMANCE;
-        url = perf.getUrl() + "?testName=" + testName;
-        String[] perfEntry = new String[] {url, perf.getName()};
-        links.add(perfEntry);
-        return links;
-    }
-
-    /**
-     * Generates an HTML summary of the performance changes for the profiling results in the
-     * specified
-     * table.
-     *
-     * <p>Retrieves the past 24 hours of profiling data and compares it to the 24 hours that
-     * preceded
-     * it. Creates a table representation of the mean and standard deviation for each profiling
-     * point.
-     * When performance degrades, the cell is shaded red.
-     *
-     * @param profilingPoint The name of the profiling point to summarize.
-     * @param testSummary The ProfilingPointSummary object to compare against.
-     * @param perfSummaries List of PerformanceSummary objects for each profiling run (in reverse
-     *     chronological order).
-     * @param sectionLabels HTML string for the section labels (i.e. for each time interval).
-     * @returns An HTML string for a table comparing the profiling point results across time
-     *     intervals.
-     */
-    public static String getPeformanceSummary(String profilingPoint,
-            ProfilingPointSummary testSummary, List<PerformanceSummary> perfSummaries,
-            String sectionLabels) {
-        String tableHTML = "<table>";
-
-        // Format section labels
-        tableHTML += "<tr>";
-        tableHTML += "<th class='section-label grey lighten-2'>";
-        tableHTML += testSummary.yLabel + "</th>";
-        tableHTML += sectionLabels;
-        tableHTML += "</tr>";
-
-        String bestCaseString;
-        switch (testSummary.getRegressionMode()) {
-            case VTS_REGRESSION_MODE_DECREASING:
-                bestCaseString = MAX;
-                break;
-            default:
-                bestCaseString = MIN;
-                break;
-        }
-
-        // Format column labels
-        tableHTML += "<tr>";
-        for (int i = 0; i <= perfSummaries.size() + 1; i++) {
-            if (i > 1) {
-                tableHTML += "<th class='section-label grey lighten-2'>" + MEAN_DELTA + "</th>";
-            }
-            if (i == 0) {
-                tableHTML += "<th class='section-label grey lighten-2'>";
-                tableHTML += testSummary.xLabel + "</th>";
-            } else if (i > 0) {
-                tableHTML += "<th class='section-label grey lighten-2'>" + bestCaseString + "</th>";
-                tableHTML += "<th class='section-label grey lighten-2'>" + MEAN + "</th>";
-                tableHTML += "<th class='section-label grey lighten-2'>" + STD + "</th>";
-            }
-        }
-        tableHTML += "</tr>";
-
-        // Populate data cells
-        for (StatSummary stats : testSummary) {
-            String label = stats.getLabel();
-            tableHTML += "<tr><td class='axis-label grey lighten-2'>" + label;
-            tableHTML += "</td><td class='cell inner-cell'>";
-            tableHTML += FORMATTER.format(stats.getBestCase()) + "</td>";
-            tableHTML += "<td class='cell inner-cell'>";
-            tableHTML += FORMATTER.format(stats.getMean()) + "</td>";
-            tableHTML += "<td class='cell outer-cell'>";
-            tableHTML += FORMATTER.format(stats.getStd()) + "</td>";
-            for (PerformanceSummary prevPerformance : perfSummaries) {
-                if (prevPerformance.hasProfilingPoint(profilingPoint)) {
-                    StatSummary baseline = prevPerformance.getProfilingPointSummary(profilingPoint)
-                                                   .getStatSummary(label);
-                    tableHTML += PerformanceUtil.getAvgCasePerformanceComparisonHTML(
-                            baseline, stats, "cell inner-cell", "cell outer-cell", "", "");
-                } else {
-                    tableHTML += "<td></td><td></td><td></td><td></td>";
-                }
-            }
-            tableHTML += "</tr>";
-        }
-        tableHTML += "</table>";
-        return tableHTML;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        RequestDispatcher dispatcher = null;
-        String testName = request.getParameter("testName");
-        String selectedDevice = request.getParameter("device");
-        Long startTime = null;
-        if (request.getParameter("startTime") != null) {
-            String time = request.getParameter("startTime");
-            try {
-                startTime = Long.parseLong(time);
-            } catch (NumberFormatException e) {
-                logger.log(Level.WARNING, "Invalid start time passed to digest servlet: " + time);
-            }
-        }
-        if (startTime == null) {
-            startTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        }
-
-        // Add today to the list of time intervals to analyze
-        List<TimeInterval> timeIntervals = new ArrayList<>();
-        TimeInterval today = new TimeInterval(startTime - TimeUnit.DAYS.toMicros(1), startTime);
-        timeIntervals.add(today);
-
-        // Add yesterday as a baseline time interval for analysis
-        long oneDayAgo = startTime - TimeUnit.DAYS.toMicros(1);
-        TimeInterval yesterday = new TimeInterval(oneDayAgo - TimeUnit.DAYS.toMicros(1), oneDayAgo);
-        timeIntervals.add(yesterday);
-
-        // Add last week as a baseline time interval for analysis
-        long oneWeek = TimeUnit.DAYS.toMicros(7);
-        long oneWeekAgo = startTime - oneWeek;
-        String spanString = "<span class='date-label'>";
-        String label =
-                spanString + TimeUnit.MICROSECONDS.toMillis(oneWeekAgo - oneWeek) + "</span>";
-        label += " - " + spanString + TimeUnit.MICROSECONDS.toMillis(oneWeekAgo) + "</span>";
-        TimeInterval lastWeek = new TimeInterval(oneWeekAgo - oneWeek, oneWeekAgo, label);
-        timeIntervals.add(lastWeek);
-
-        List<PerformanceSummary> perfSummaries = new ArrayList<>();
-
-        String sectionLabels = "";
-        int i = 0;
-        for (TimeInterval interval : timeIntervals) {
-            PerformanceSummary perfSummary = new PerformanceSummary(splitKeySet);
-            PerformanceUtil.updatePerformanceSummary(
-                    testName, interval.start, interval.end, selectedDevice, perfSummary);
-            if (perfSummary.size() == 0) {
-                continue;
-            }
-            perfSummaries.add(perfSummary);
-            String content = interval.label;
-            sectionLabels += "<th class='section-label grey lighten-2 center' ";
-            if (i++ == 0)
-                sectionLabels += "colspan='3'";
-            else
-                sectionLabels += "colspan='4'";
-            sectionLabels += ">" + content + "</th>";
-        }
-
-        List<String> tables = new ArrayList<>();
-        List<String> tableTitles = new ArrayList<>();
-        List<String> tableSubtitles = new ArrayList<>();
-        if (perfSummaries.size() != 0) {
-            PerformanceSummary todayPerformance = perfSummaries.remove(0);
-            String[] profilingNames = todayPerformance.getProfilingPointNames();
-
-            for (String profilingPointName : profilingNames) {
-                ProfilingPointSummary baselinePerformance =
-                        todayPerformance.getProfilingPointSummary(profilingPointName);
-                String table = getPeformanceSummary(
-                        profilingPointName, baselinePerformance, perfSummaries, sectionLabels);
-                if (table != null) {
-                    tables.add(table);
-                    tableTitles.add(profilingPointName);
-                    switch (baselinePerformance.getRegressionMode()) {
-                        case VTS_REGRESSION_MODE_DECREASING:
-                            tableSubtitles.add(HIGHER_IS_BETTER);
-                            break;
-                        default:
-                            tableSubtitles.add(LOWER_IS_BETTER);
-                            break;
-                    }
-                }
-            }
-        }
-
-        request.setAttribute("testName", testName);
-        request.setAttribute("tables", tables);
-        request.setAttribute("tableTitles", tableTitles);
-        request.setAttribute("tableSubtitles", tableSubtitles);
-        request.setAttribute("startTime", Long.toString(startTime));
-        request.setAttribute("selectedDevice", selectedDevice);
-        request.setAttribute("devices", DatastoreHelper.getAllProducts());
-
-        dispatcher = request.getRequestDispatcher(PERF_DIGEST_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : " + e.toString());
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java
deleted file mode 100644
index 90f6067..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.FetchOptions;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.Set;
-import java.util.HashSet;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-
-public class ShowPlanReleaseServlet extends BaseServlet {
-    private static final String PLAN_RELEASE_JSP = "WEB-INF/jsp/show_plan_release.jsp";
-    private static final int MAX_RUNS_PER_PAGE = 90;
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        List<String[]> links = new ArrayList<>();
-        Page root = Page.HOME;
-        String[] rootEntry = new String[] {root.getUrl(), root.getName()};
-        links.add(rootEntry);
-
-        Page release = Page.PLAN_RELEASE;
-        String planName = request.getParameter("plan");
-        String name = release.getName() + planName.toUpperCase();
-        String url = release.getUrl() + "?plan=" + planName;
-        String[] tableEntry = new String[] {url, name};
-        links.add(tableEntry);
-        return links;
-    }
-
-    /**
-     * Model to describe each test plan run .
-     */
-    private class TestPlanRunMetadata implements Comparable<TestPlanRunMetadata> {
-        public final TestPlanRunEntity testPlanRun;
-        public final List<String> devices;
-        public final Set<DeviceInfoEntity> deviceSet;
-
-        public TestPlanRunMetadata(TestPlanRunEntity testPlanRun) {
-            this.testPlanRun = testPlanRun;
-            this.devices = new ArrayList<>();
-            this.deviceSet = new HashSet<>();
-        }
-
-        public void addDevice(DeviceInfoEntity device) {
-            if (device == null || deviceSet.contains(device))
-                return;
-            devices.add(device.branch + "/" + device.buildFlavor + " (" + device.buildId + ")");
-            deviceSet.add(device);
-        }
-
-        public JsonObject toJson() {
-            JsonObject obj = new JsonObject();
-            obj.add("testPlanRun", testPlanRun.toJson());
-            obj.add("deviceInfo", new JsonPrimitive(StringUtils.join(devices, ", ")));
-            return obj;
-        }
-
-        @Override
-        public int compareTo(TestPlanRunMetadata o) {
-            return new Long(o.testPlanRun.startTimestamp)
-                    .compareTo(this.testPlanRun.startTimestamp);
-        }
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Long startTime = null; // time in microseconds
-        Long endTime = null; // time in microseconds
-        if (request.getParameter("startTime") != null) {
-            String time = request.getParameter("startTime");
-            try {
-                startTime = Long.parseLong(time);
-                startTime = startTime > 0 ? startTime : null;
-            } catch (NumberFormatException e) {
-                startTime = null;
-            }
-        }
-        if (request.getParameter("endTime") != null) {
-            String time = request.getParameter("endTime");
-            try {
-                endTime = Long.parseLong(time);
-                endTime = endTime > 0 ? endTime : null;
-            } catch (NumberFormatException e) {
-                endTime = null;
-            }
-        }
-        SortDirection dir = SortDirection.DESCENDING;
-        if (startTime != null && endTime == null) {
-            dir = SortDirection.ASCENDING;
-        }
-        String testPlan = request.getParameter("plan");
-        Key testPlanKey = KeyFactory.createKey(TestPlanEntity.KIND, testPlan);
-        Filter testPlanRunFilter = FilterUtil.getTimeFilter(testPlanKey, startTime, endTime, null);
-
-        Query testPlanRunQuery = new Query(TestPlanRunEntity.KIND)
-                                         .setAncestor(testPlanKey)
-                                         .setFilter(testPlanRunFilter)
-                                         .addSort(Entity.KEY_RESERVED_PROPERTY, dir);
-
-        List<TestPlanRunMetadata> testPlanRuns = new ArrayList<>();
-        for (Entity testPlanRunEntity :
-                datastore.prepare(testPlanRunQuery)
-                        .asIterable(FetchOptions.Builder.withLimit(MAX_RUNS_PER_PAGE))) {
-            TestPlanRunEntity testPlanRun = TestPlanRunEntity.fromEntity(testPlanRunEntity);
-            if (testPlanRun == null) {
-                logger.log(Level.WARNING, "Invalid test plan run: " + testPlanRunEntity.getKey());
-                continue;
-            }
-            TestPlanRunMetadata metadata = new TestPlanRunMetadata(testPlanRun);
-            testPlanRuns.add(metadata);
-            Query deviceInfoQuery = new Query(DeviceInfoEntity.KIND).setAncestor(testPlanRun.key);
-            for (Entity deviceInfoEntity : datastore.prepare(deviceInfoQuery).asIterable()) {
-                DeviceInfoEntity device = DeviceInfoEntity.fromEntity(deviceInfoEntity);
-                metadata.addDevice(device);
-            }
-        }
-        Collections.sort(testPlanRuns);
-
-        if (testPlanRuns.size() > 0) {
-            TestPlanRunMetadata firstRun = testPlanRuns.get(0);
-            endTime = firstRun.testPlanRun.startTimestamp;
-
-            TestPlanRunMetadata lastRun = testPlanRuns.get(testPlanRuns.size() - 1);
-            startTime = lastRun.testPlanRun.startTimestamp;
-        }
-
-        List<JsonObject> testPlanRunObjects = new ArrayList<>();
-        for (TestPlanRunMetadata metadata : testPlanRuns) {
-            testPlanRunObjects.add(metadata.toJson());
-        }
-
-        request.setAttribute("plan", request.getParameter("plan"));
-        request.setAttribute("hasNewer", new Gson().toJson(DatastoreHelper.hasNewer(
-                                                 testPlanKey, TestPlanRunEntity.KIND, endTime)));
-        request.setAttribute("hasOlder", new Gson().toJson(DatastoreHelper.hasOlder(
-                                                 testPlanKey, TestPlanRunEntity.KIND, startTime)));
-        request.setAttribute("planRuns", new Gson().toJson(testPlanRunObjects));
-        request.setAttribute("startTime",
-                new Gson().toJson(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())));
-        request.setAttribute("endTime",
-                new Gson().toJson(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())));
-        response.setStatus(HttpServletResponse.SC_OK);
-        RequestDispatcher dispatcher = request.getRequestDispatcher(PLAN_RELEASE_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/ShowPlanRunServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/ShowPlanRunServlet.java
deleted file mode 100644
index 789eb0e..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/ShowPlanRunServlet.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.TestRunMetadata;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to load individual plan runs. */
-public class ShowPlanRunServlet extends BaseServlet {
-    private static final String PLAN_RUN_JSP = "WEB-INF/jsp/show_plan_run.jsp";
-    private static final String PROFILING_DATA_ALERT = "No profiling data was found.";
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        List<String[]> links = new ArrayList<>();
-        Page root = Page.HOME;
-        String[] rootEntry = new String[] {root.getUrl(), root.getName()};
-        links.add(rootEntry);
-
-        Page release = Page.PLAN_RELEASE;
-        String planName = request.getParameter("plan");
-        String name = release.getName() + planName.toUpperCase();
-        String url = release.getUrl() + "?plan=" + planName;
-        String[] tableEntry = new String[] {url, name};
-        links.add(tableEntry);
-
-        Page planRun = Page.PLAN_RUN;
-        String time = request.getParameter("time");
-        name = planRun.getName();
-        url = planRun.getUrl() + "?plan=" + planName + "&time=" + time;
-        tableEntry = new String[] {url, name};
-        links.add(tableEntry);
-        return links;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        Long startTime = null; // time in microseconds
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        RequestDispatcher dispatcher = null;
-
-        String plan = request.getParameter("plan");
-
-        if (request.getParameter("time") != null) {
-            String time = request.getParameter("time");
-            try {
-                startTime = Long.parseLong(time);
-                startTime = startTime > 0 ? startTime : null;
-            } catch (NumberFormatException e) {
-                startTime = null;
-            }
-        }
-
-        // Add result names to list
-        List<String> resultNames = new ArrayList<>();
-        for (TestCaseResult r : TestCaseResult.values()) {
-            resultNames.add(r.name());
-        }
-
-        List<TestRunMetadata> testRunMetadata = new ArrayList<>();
-        List<JsonObject> testRunObjects = new ArrayList<>();
-
-        Key planKey = KeyFactory.createKey(TestPlanEntity.KIND, plan);
-        Key planRunKey = KeyFactory.createKey(planKey, TestPlanRunEntity.KIND, startTime);
-        int passCount = 0;
-        int failCount = 0;
-        try {
-            Entity testPlanRunEntity = datastore.get(planRunKey);
-            TestPlanRunEntity testPlanRun = TestPlanRunEntity.fromEntity(testPlanRunEntity);
-            Map<Key, Entity> testRuns = datastore.get(testPlanRun.testRuns);
-            passCount = (int) testPlanRun.passCount;
-            failCount = (int) testPlanRun.failCount;
-
-            for (Key key : testPlanRun.testRuns) {
-                if (!testRuns.containsKey(key))
-                    continue;
-                TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRuns.get(key));
-                if (testRunEntity == null)
-                    continue;
-                TestRunMetadata metadata =
-                        new TestRunMetadata(key.getParent().getName(), testRunEntity);
-                testRunMetadata.add(metadata);
-                testRunObjects.add(metadata.toJson());
-            }
-        } catch (EntityNotFoundException e) {
-            // Invalid parameters
-        }
-
-        int[] topBuildResultCounts = new int[TestCaseResult.values().length];
-        topBuildResultCounts = new int[TestCaseResult.values().length];
-        topBuildResultCounts[TestCaseResult.TEST_CASE_RESULT_PASS.getNumber()] = passCount;
-        topBuildResultCounts[TestCaseResult.TEST_CASE_RESULT_FAIL.getNumber()] = failCount;
-
-        Set<String> profilingPoints = new HashSet<>();
-
-        String profilingDataAlert = "";
-        if (profilingPoints.size() == 0) {
-            profilingDataAlert = PROFILING_DATA_ALERT;
-        }
-        List<String> profilingPointNames = new ArrayList<>(profilingPoints);
-        Collections.sort(profilingPointNames);
-
-        request.setAttribute("plan", request.getParameter("plan"));
-        request.setAttribute("time", request.getParameter("time"));
-
-        request.setAttribute("error", profilingDataAlert);
-
-        request.setAttribute("profilingPointNames", profilingPointNames);
-        request.setAttribute("resultNames", resultNames);
-        request.setAttribute("resultNamesJson", new Gson().toJson(resultNames));
-        request.setAttribute("testRuns", new Gson().toJson(testRunObjects));
-
-        // data for pie chart
-        request.setAttribute("topBuildResultCounts", new Gson().toJson(topBuildResultCounts));
-
-        dispatcher = request.getRequestDispatcher(PLAN_RUN_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : " + e.toString());
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/ShowTableServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/ShowTableServlet.java
deleted file mode 100644
index 32e3743..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/ShowTableServlet.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.TestResults;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.FetchOptions;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.CompositeFilterOperator;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.gson.Gson;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-
-/** Servlet for handling requests to load individual tables. */
-public class ShowTableServlet extends BaseServlet {
-    private static final String TABLE_JSP = "WEB-INF/jsp/show_table.jsp";
-    // Error message displayed on the webpage is tableName passed is null.
-    private static final String TABLE_NAME_ERROR = "Error : Table name must be passed!";
-    private static final String PROFILING_DATA_ALERT = "No profiling data was found.";
-    private static final int MAX_BUILD_IDS_PER_PAGE = 10;
-
-    private static final String SEARCH_HELP_HEADER = "Search Help";
-    private static final String SEARCH_HELP = "Data can be queried using one or more filters. "
-            + "If more than one filter is provided, results will be returned that match <i>all</i>. "
-            + "<br><br>Filters are delimited by spaces; to specify a multi-word token, enclose it in "
-            + "double quotes. A query must be in the format: \"field:value\".<br><br>"
-            + "<b>Supported field qualifiers:</b> "
-            + StringUtils.join(FilterUtil.FilterKey.values(), ", ") + ".";
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        List<String[]> links = new ArrayList<>();
-        Page root = Page.HOME;
-        String[] rootEntry = new String[] {root.getUrl(), root.getName()};
-        links.add(rootEntry);
-
-        Page table = Page.TABLE;
-        String testName = request.getParameter("testName");
-        String name = table.getName() + testName;
-        String url = table.getUrl() + "?testName=" + testName;
-        String[] tableEntry = new String[] {url, name};
-        links.add(tableEntry);
-        return links;
-    }
-
-    public static void processTestRun(TestResults testResults, Entity testRun) {
-        TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRun);
-        if (testRunEntity == null) {
-            return;
-        }
-
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        List<Key> gets = new ArrayList<>();
-        for (long testCaseId : testRunEntity.testCaseIds) {
-            gets.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
-        }
-
-        List<Entity> testCases = new ArrayList<>();
-        Map<Key, Entity> entityMap = datastore.get(gets);
-        for (Key key : gets) {
-            if (entityMap.containsKey(key)) {
-                testCases.add(entityMap.get(key));
-            }
-        }
-
-        Query deviceInfoQuery = new Query(DeviceInfoEntity.KIND).setAncestor(testRun.getKey());
-        Iterable<Entity> deviceInfos = datastore.prepare(deviceInfoQuery).asIterable();
-
-        Query profilingPointQuery =
-                new Query(ProfilingPointRunEntity.KIND).setAncestor(testRun.getKey()).setKeysOnly();
-        Iterable<Entity> profilingPoints = datastore.prepare(profilingPointQuery).asIterable();
-
-        testResults.addTestRun(testRun, testCases, deviceInfos, profilingPoints);
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        boolean unfiltered = request.getParameter("unfiltered") != null;
-        boolean showPresubmit = request.getParameter("showPresubmit") != null;
-        boolean showPostsubmit = request.getParameter("showPostsubmit") != null;
-        String searchString = request.getParameter("search");
-        Long startTime = null; // time in microseconds
-        Long endTime = null; // time in microseconds
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        RequestDispatcher dispatcher = null;
-
-        // message to display if profiling point data is not available
-        String profilingDataAlert = "";
-
-        if (request.getParameter("testName") == null) {
-            request.setAttribute("testName", TABLE_NAME_ERROR);
-            return;
-        }
-        String testName = request.getParameter("testName");
-
-        if (request.getParameter("startTime") != null) {
-            String time = request.getParameter("startTime");
-            try {
-                startTime = Long.parseLong(time);
-                startTime = startTime > 0 ? startTime : null;
-            } catch (NumberFormatException e) {
-                startTime = null;
-            }
-        }
-        if (request.getParameter("endTime") != null) {
-            String time = request.getParameter("endTime");
-            try {
-                endTime = Long.parseLong(time);
-                endTime = endTime > 0 ? endTime : null;
-            } catch (NumberFormatException e) {
-                endTime = null;
-            }
-        }
-
-        // If no params are specified, set to default of postsubmit-only.
-        if (!(showPresubmit || showPostsubmit)) {
-            showPostsubmit = true;
-        }
-
-        // If unfiltered, set showPre- and Post-submit to true for accurate UI.
-        if (unfiltered) {
-            showPostsubmit = true;
-            showPresubmit = true;
-        }
-
-        // Add result names to list
-        List<String> resultNames = new ArrayList<>();
-        for (TestCaseResult r : TestCaseResult.values()) {
-            resultNames.add(r.name());
-        }
-
-        TestResults testResults = new TestResults(testName);
-
-        SortDirection dir = SortDirection.DESCENDING;
-        if (startTime != null && endTime == null) {
-            dir = SortDirection.ASCENDING;
-        }
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, testName);
-        Filter userTestFilter = FilterUtil.getUserTestFilter(searchString);
-        Filter userDeviceFilter = FilterUtil.getDeviceFilter(searchString);
-
-        Filter typeFilter = FilterUtil.getTestTypeFilter(showPresubmit, showPostsubmit, unfiltered);
-        Filter testFilter = FilterUtil.getTimeFilter(testKey, startTime, endTime, typeFilter);
-        if (userTestFilter == null && userDeviceFilter == null) {
-            Query testRunQuery = new Query(TestRunEntity.KIND)
-                                         .setAncestor(testKey)
-                                         .setFilter(testFilter)
-                                         .addSort(Entity.KEY_RESERVED_PROPERTY, dir);
-            for (Entity testRun :
-                    datastore.prepare(testRunQuery)
-                            .asIterable(FetchOptions.Builder.withLimit(MAX_BUILD_IDS_PER_PAGE))) {
-                processTestRun(testResults, testRun);
-            }
-        } else {
-            List<Key> gets = new ArrayList<>();
-            Set<Key> matchingTestKeys = new HashSet<>();
-            if (userTestFilter != null) {
-                testFilter = CompositeFilterOperator.and(userTestFilter, testFilter);
-            }
-            Query testRunQuery = new Query(TestRunEntity.KIND)
-                                         .setAncestor(testKey)
-                                         .setFilter(testFilter)
-                                         .setKeysOnly();
-            for (Entity testRunKey : datastore.prepare(testRunQuery).asIterable()) {
-                matchingTestKeys.add(testRunKey.getKey());
-            }
-
-            Set<Key> allMatchingKeys;
-            if (userDeviceFilter == null) {
-                allMatchingKeys = matchingTestKeys;
-            } else {
-                allMatchingKeys = new HashSet<>();
-                Query deviceQuery = new Query(DeviceInfoEntity.KIND)
-                                            .setAncestor(testKey)
-                                            .setFilter(userDeviceFilter)
-                                            .setKeysOnly();
-                for (Entity device : datastore.prepare(deviceQuery).asIterable()) {
-                    if (matchingTestKeys.contains(device.getKey().getParent())) {
-                        allMatchingKeys.add(device.getKey().getParent());
-                    }
-                }
-            }
-            List<Key> allKeysSorted = new ArrayList<>(allMatchingKeys);
-            if (dir == SortDirection.DESCENDING) {
-                Collections.sort(allKeysSorted, Collections.reverseOrder());
-            } else {
-                Collections.sort(allKeysSorted);
-            }
-            allKeysSorted = allKeysSorted.subList(
-                    0, Math.min(allKeysSorted.size(), MAX_BUILD_IDS_PER_PAGE));
-            for (Key key : allKeysSorted) {
-                gets.add(key);
-            }
-            Map<Key, Entity> entityMap = datastore.get(gets);
-            for (Key key : allKeysSorted) {
-                if (!entityMap.containsKey(key)) {
-                    continue;
-                }
-                processTestRun(testResults, entityMap.get(key));
-            }
-        }
-
-        testResults.processReport();
-
-        if (testResults.profilingPointNames.length == 0) {
-            profilingDataAlert = PROFILING_DATA_ALERT;
-        }
-
-        request.setAttribute("testName", request.getParameter("testName"));
-
-        request.setAttribute("error", profilingDataAlert);
-        request.setAttribute("searchString", searchString);
-        request.setAttribute("searchHelpHeader", SEARCH_HELP_HEADER);
-        request.setAttribute("searchHelpBody", SEARCH_HELP);
-
-        // pass values by converting to JSON
-        request.setAttribute("headerRow", new Gson().toJson(testResults.headerRow));
-        request.setAttribute("timeGrid", new Gson().toJson(testResults.timeGrid));
-        request.setAttribute("durationGrid", new Gson().toJson(testResults.durationGrid));
-        request.setAttribute("summaryGrid", new Gson().toJson(testResults.summaryGrid));
-        request.setAttribute("resultsGrid", new Gson().toJson(testResults.resultsGrid));
-        request.setAttribute("profilingPointNames", testResults.profilingPointNames);
-        request.setAttribute("resultNames", resultNames);
-        request.setAttribute("resultNamesJson", new Gson().toJson(resultNames));
-        request.setAttribute("logInfoMap", new Gson().toJson(testResults.logInfoMap));
-
-        // data for pie chart
-        request.setAttribute(
-                "topBuildResultCounts", new Gson().toJson(testResults.totResultCounts));
-        request.setAttribute("topBuildId", testResults.totBuildId);
-        request.setAttribute("startTime", new Gson().toJson(testResults.startTime));
-        request.setAttribute("endTime", new Gson().toJson(testResults.endTime));
-        request.setAttribute("hasNewer", new Gson().toJson(DatastoreHelper.hasNewer(testKey,
-                                                 TestRunEntity.KIND, testResults.endTime)));
-        request.setAttribute("hasOlder", new Gson().toJson(DatastoreHelper.hasOlder(testKey,
-                                                 TestRunEntity.KIND, testResults.startTime)));
-        request.setAttribute("unfiltered", unfiltered);
-        request.setAttribute("showPresubmit", showPresubmit);
-        request.setAttribute("showPostsubmit", showPostsubmit);
-
-        dispatcher = request.getRequestDispatcher(TABLE_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : " + e.toString());
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/ShowTreeServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/ShowTreeServlet.java
deleted file mode 100644
index 9f3ce80..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/ShowTreeServlet.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.TestRunDetails;
-import com.android.vts.util.TestRunMetadata;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.FetchOptions;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.CompositeFilterOperator;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-
-/** Servlet for handling requests to load individual tables. */
-public class ShowTreeServlet extends BaseServlet {
-    private static final String TABLE_JSP = "WEB-INF/jsp/show_tree.jsp";
-    // Error message displayed on the webpage is tableName passed is null.
-    private static final String TABLE_NAME_ERROR = "Error : Table name must be passed!";
-    private static final String PROFILING_DATA_ALERT = "No profiling data was found.";
-    private static final int MAX_BUILD_IDS_PER_PAGE = 20;
-    private static final int MAX_PREFETCH_COUNT = 10;
-
-    private static final String SEARCH_HELP_HEADER = "Search Help";
-    private static final String SEARCH_HELP = "Data can be queried using one or more filters. "
-            + "If more than one filter is provided, results will be returned that match <i>all</i>. "
-            + "<br><br>Filters are delimited by spaces; to specify a multi-word token, enclose it in "
-            + "double quotes. A query must be in the format: \"field:value\".<br><br>"
-            + "<b>Supported field qualifiers:</b> "
-            + StringUtils.join(FilterUtil.FilterKey.values(), ", ") + ".";
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        List<String[]> links = new ArrayList<>();
-        Page root = Page.HOME;
-        String[] rootEntry = new String[] {root.getUrl(), root.getName()};
-        links.add(rootEntry);
-
-        Page table = Page.TABLE;
-        String testName = request.getParameter("testName");
-        String name = table.getName() + testName;
-        String url = table.getUrl() + "?testName=" + testName;
-        String[] tableEntry = new String[] {url, name};
-        links.add(tableEntry);
-        return links;
-    }
-
-    /**
-     * Get the test run details for a test run.
-     * @param metadata The metadata for the test run whose details will be fetched.
-     * @return The TestRunDetails object for the provided test run.
-     */
-    public static TestRunDetails processTestDetails(TestRunMetadata metadata) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        TestRunDetails details = new TestRunDetails();
-        List<Key> gets = new ArrayList<>();
-        for (long testCaseId : metadata.testRun.testCaseIds) {
-            gets.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
-        }
-        Map<Key, Entity> entityMap = datastore.get(gets);
-        for (int i = 0; i < 1; i++) {
-            for (Key key : entityMap.keySet()) {
-                TestCaseRunEntity testCaseRun = TestCaseRunEntity.fromEntity(entityMap.get(key));
-                if (testCaseRun == null) {
-                    continue;
-                }
-                details.addTestCase(testCaseRun);
-            }
-        }
-        return details;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        boolean unfiltered = request.getParameter("unfiltered") != null;
-        boolean showPresubmit = request.getParameter("showPresubmit") != null;
-        boolean showPostsubmit = request.getParameter("showPostsubmit") != null;
-        String searchString = request.getParameter("search");
-        Long startTime = null; // time in microseconds
-        Long endTime = null; // time in microseconds
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        RequestDispatcher dispatcher = null;
-
-        // message to display if profiling point data is not available
-        String profilingDataAlert = "";
-
-        if (request.getParameter("testName") == null) {
-            request.setAttribute("testName", TABLE_NAME_ERROR);
-            return;
-        }
-        String testName = request.getParameter("testName");
-
-        if (request.getParameter("startTime") != null) {
-            String time = request.getParameter("startTime");
-            try {
-                startTime = Long.parseLong(time);
-                startTime = startTime > 0 ? startTime : null;
-            } catch (NumberFormatException e) {
-                startTime = null;
-            }
-        }
-        if (request.getParameter("endTime") != null) {
-            String time = request.getParameter("endTime");
-            try {
-                endTime = Long.parseLong(time);
-                endTime = endTime > 0 ? endTime : null;
-            } catch (NumberFormatException e) {
-                endTime = null;
-            }
-        }
-
-        // If no params are specified, set to default of postsubmit-only.
-        if (!(showPresubmit || showPostsubmit)) {
-            showPostsubmit = true;
-        }
-
-        // If unfiltered, set showPre- and Post-submit to true for accurate UI.
-        if (unfiltered) {
-            showPostsubmit = true;
-            showPresubmit = true;
-        }
-
-        // Add result names to list
-        List<String> resultNames = new ArrayList<>();
-        for (TestCaseResult r : TestCaseResult.values()) {
-            resultNames.add(r.name());
-        }
-
-        SortDirection dir = SortDirection.DESCENDING;
-        if (startTime != null && endTime == null) {
-            dir = SortDirection.ASCENDING;
-        }
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, testName);
-        Filter userTestFilter = FilterUtil.getUserTestFilter(searchString);
-        Filter userDeviceFilter = FilterUtil.getDeviceFilter(searchString);
-
-        Filter typeFilter = FilterUtil.getTestTypeFilter(showPresubmit, showPostsubmit, unfiltered);
-        Filter testFilter = FilterUtil.getTimeFilter(testKey, startTime, endTime, typeFilter);
-
-        List<TestRunMetadata> testRunMetadata = new ArrayList<>();
-        if (userTestFilter == null && userDeviceFilter == null) {
-            Query testRunQuery = new Query(TestRunEntity.KIND)
-                                         .setAncestor(testKey)
-                                         .setFilter(testFilter)
-                                         .addSort(Entity.KEY_RESERVED_PROPERTY, dir);
-            for (Entity testRun :
-                    datastore.prepare(testRunQuery)
-                            .asIterable(FetchOptions.Builder.withLimit(MAX_BUILD_IDS_PER_PAGE))) {
-                TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRun);
-                if (testRunEntity == null) {
-                    continue;
-                }
-                TestRunMetadata metadata = new TestRunMetadata(testName, testRunEntity);
-                testRunMetadata.add(metadata);
-            }
-        } else {
-            List<Key> gets = new ArrayList<>();
-            Set<Key> matchingTestKeys = new HashSet<>();
-            if (userTestFilter != null) {
-                testFilter = CompositeFilterOperator.and(userTestFilter, testFilter);
-            }
-            Query testRunQuery = new Query(TestRunEntity.KIND)
-                                         .setAncestor(testKey)
-                                         .setFilter(testFilter)
-                                         .setKeysOnly();
-            for (Entity testRunKey : datastore.prepare(testRunQuery).asIterable()) {
-                matchingTestKeys.add(testRunKey.getKey());
-            }
-
-            Set<Key> allMatchingKeys;
-            if (userDeviceFilter == null) {
-                allMatchingKeys = matchingTestKeys;
-            } else {
-                allMatchingKeys = new HashSet<>();
-                Query deviceQuery = new Query(DeviceInfoEntity.KIND)
-                                            .setAncestor(testKey)
-                                            .setFilter(userDeviceFilter)
-                                            .setKeysOnly();
-                for (Entity device : datastore.prepare(deviceQuery).asIterable()) {
-                    if (matchingTestKeys.contains(device.getKey().getParent())) {
-                        allMatchingKeys.add(device.getKey().getParent());
-                    }
-                }
-            }
-            List<Key> allKeysSorted = new ArrayList<>(allMatchingKeys);
-            if (dir == SortDirection.DESCENDING) {
-                Collections.sort(allKeysSorted, Collections.reverseOrder());
-            } else {
-                Collections.sort(allKeysSorted);
-            }
-            allKeysSorted = allKeysSorted.subList(
-                    0, Math.min(allKeysSorted.size(), MAX_BUILD_IDS_PER_PAGE));
-            for (Key key : allKeysSorted) {
-                gets.add(key);
-            }
-            Map<Key, Entity> entityMap = datastore.get(gets);
-            for (Key key : allKeysSorted) {
-                if (!entityMap.containsKey(key)) {
-                    continue;
-                }
-                TestRunEntity testRunEntity = TestRunEntity.fromEntity(entityMap.get(key));
-                if (testRunEntity == null) {
-                    continue;
-                }
-                TestRunMetadata metadata = new TestRunMetadata(testName, testRunEntity);
-                testRunMetadata.add(metadata);
-            }
-        }
-
-        Comparator<TestRunMetadata> comparator = new Comparator<TestRunMetadata>() {
-            @Override
-            public int compare(TestRunMetadata t1, TestRunMetadata t2) {
-                return new Long(t2.testRun.startTimestamp).compareTo(t1.testRun.startTimestamp);
-            }
-        };
-        Collections.sort(testRunMetadata, comparator);
-        List<JsonObject> testRunObjects = new ArrayList<>();
-
-        int prefetchCount = 0;
-        for (TestRunMetadata metadata : testRunMetadata) {
-            if (metadata.testRun.failCount > 0 && prefetchCount < MAX_PREFETCH_COUNT) {
-                // process
-                metadata.addDetails(processTestDetails(metadata));
-                ++prefetchCount;
-            }
-            testRunObjects.add(metadata.toJson());
-        }
-
-        int[] topBuildResultCounts = null;
-        String topBuild = "";
-        if (testRunMetadata.size() > 0) {
-            TestRunMetadata firstRun = testRunMetadata.get(0);
-            topBuild = firstRun.getDeviceInfo();
-            endTime = firstRun.testRun.startTimestamp;
-            TestRunDetails topDetails = firstRun.getDetails();
-            if (topDetails == null) {
-                topDetails = processTestDetails(firstRun);
-            }
-            topBuildResultCounts = topDetails.resultCounts;
-
-            TestRunMetadata lastRun = testRunMetadata.get(testRunMetadata.size() - 1);
-            startTime = lastRun.testRun.startTimestamp;
-        }
-
-        Set<String> profilingPoints = new HashSet<>();
-        Query profilingPointQuery =
-                new Query(ProfilingPointRunEntity.KIND).setAncestor(testKey).setKeysOnly();
-        for (Entity e : datastore.prepare(profilingPointQuery).asIterable()) {
-            profilingPoints.add(e.getKey().getName());
-        }
-
-        if (profilingPoints.size() == 0) {
-            profilingDataAlert = PROFILING_DATA_ALERT;
-        }
-        List<String> profilingPointNames = new ArrayList<>(profilingPoints);
-        Collections.sort(profilingPointNames);
-
-        request.setAttribute("testName", request.getParameter("testName"));
-
-        request.setAttribute("error", profilingDataAlert);
-        request.setAttribute("searchString", searchString);
-        request.setAttribute("searchHelpHeader", SEARCH_HELP_HEADER);
-        request.setAttribute("searchHelpBody", SEARCH_HELP);
-
-        request.setAttribute("profilingPointNames", profilingPointNames);
-        request.setAttribute("resultNames", resultNames);
-        request.setAttribute("resultNamesJson", new Gson().toJson(resultNames));
-        request.setAttribute("testRuns", new Gson().toJson(testRunObjects));
-
-        // data for pie chart
-        request.setAttribute("topBuildResultCounts", new Gson().toJson(topBuildResultCounts));
-        request.setAttribute("topBuildId", topBuild);
-        request.setAttribute("startTime", new Gson().toJson(startTime));
-        request.setAttribute("endTime", new Gson().toJson(endTime));
-        request.setAttribute("hasNewer",
-                new Gson().toJson(DatastoreHelper.hasNewer(testKey, TestRunEntity.KIND, endTime)));
-        request.setAttribute("hasOlder", new Gson().toJson(DatastoreHelper.hasOlder(
-                                                 testKey, TestRunEntity.KIND, startTime)));
-        request.setAttribute("unfiltered", unfiltered);
-        request.setAttribute("showPresubmit", showPresubmit);
-        request.setAttribute("showPostsubmit", showPostsubmit);
-
-        dispatcher = request.getRequestDispatcher(TABLE_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : " + e.toString());
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/VtsAlertJobServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/VtsAlertJobServlet.java
deleted file mode 100644
index 1c00d5a..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/VtsAlertJobServlet.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestCaseRunEntity.TestCase;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestEntity.TestCaseReference;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.EmailHelper;
-import com.android.vts.util.FilterUtil;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.appengine.api.datastore.Transaction;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-
-/** Represents the notifications service which is automatically called on a fixed schedule. */
-public class VtsAlertJobServlet extends BaseServlet {
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        return null;
-    }
-
-    /**
-     * Creates an email footer with the provided link.
-     *
-     * @param link The (string) link to provide in the footer.
-     * @return The full HTML email footer.
-     */
-    private String getFooter(String link) {
-        return "<br><br>For details, visit the"
-                + " <a href='" + link + "'>"
-                + "VTS dashboard.</a>";
-    }
-
-    /**
-     * Compose an email if the test is inactive.
-     *
-     * @param test The TestEntity document storing the test status.
-     * @param link Fully specified link to the test's status page.
-     * @param emails The list of email addresses to send the email.
-     * @param messages The message list in which to insert the inactivity notification email.
-     * @return True if the test is inactive, false otherwise.
-     */
-    private boolean notifyIfInactive(
-            TestEntity test, String link, List<String> emails, List<Message> messages) {
-        long now = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        long diff = now - test.timestamp;
-        // Send an email daily to notify that the test hasn't been running.
-        // After 7 full days have passed, notifications will no longer be sent (i.e. the
-        // test is assumed to be deprecated).
-        if (diff > TimeUnit.DAYS.toMicros(1) && diff < TimeUnit.DAYS.toMicros(8)
-                && diff % TimeUnit.DAYS.toMicros(1) < TimeUnit.MINUTES.toMicros(3)) {
-            Date lastUpload = new Date(TimeUnit.MICROSECONDS.toMillis(test.timestamp));
-            String uploadTimeString =
-                    new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(lastUpload);
-            String subject = "Warning! Inactive test: " + test;
-            String body = "Hello,<br><br>Test \"" + test + "\" is inactive. "
-                    + "No new data has been uploaded since " + uploadTimeString + "."
-                    + getFooter(link);
-            try {
-                messages.add(EmailHelper.composeEmail(emails, subject, body));
-                return true;
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Checks whether any new failures have occurred beginning since (and including) startTime.
-     *
-     * @param test The TestEntity object for the test.
-     * @param link The string URL linking to the test's status table.
-     * @param failedTestCaseMap The map of test case names to TestCase for those failing in the
-     *     last status update.
-     * @param emailAddresses The list of email addresses to send notifications to.
-     * @param messages The email Message queue.
-     * @returns latest TestStatusMessage or null if no update is available.
-     * @throws IOException
-     */
-    public TestEntity getTestStatus(TestEntity test, String link,
-            Map<String, TestCase> failedTestCaseMap, List<String> emailAddresses,
-            List<Message> messages) throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String footer = getFooter(link);
-
-        TestRunEntity mostRecentRun = null;
-        Map<String, TestCaseResult> mostRecentTestCaseResults = new HashMap<>();
-        Map<String, TestCase> testCaseBreakageMap = new HashMap<>();
-        int passingTestcaseCount = 0;
-        List<TestCaseReference> failingTestCases = new ArrayList<>();
-        Set<String> fixedTestcases = new HashSet<>();
-        Set<String> newTestcaseFailures = new HashSet<>();
-        Set<String> continuedTestcaseFailures = new HashSet<>();
-        Set<String> skippedTestcaseFailures = new HashSet<>();
-        Set<String> transientTestcaseFailures = new HashSet<>();
-
-        String testName = test.testName;
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, testName);
-        Filter testTypeFilter = FilterUtil.getTestTypeFilter(false, true, false);
-        Filter runFilter =
-                FilterUtil.getTimeFilter(testKey, test.timestamp + 1, null, testTypeFilter);
-        Query q = new Query(TestRunEntity.KIND)
-                          .setAncestor(testKey)
-                          .setFilter(runFilter)
-                          .addSort(Entity.KEY_RESERVED_PROPERTY, SortDirection.DESCENDING);
-
-        for (Entity testRun : datastore.prepare(q).asIterable()) {
-            TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRun);
-            if (testRunEntity == null) {
-                logger.log(Level.WARNING, "Invalid test run detected: " + testRun.getKey());
-            }
-            if (mostRecentRun == null) {
-                mostRecentRun = testRunEntity;
-            }
-            List<Key> testCaseKeys = new ArrayList<>();
-            for (long testCaseId : testRunEntity.testCaseIds) {
-                testCaseKeys.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
-            }
-            Map<Key, Entity> entityMap = datastore.get(testCaseKeys);
-            for (Key testCaseKey : testCaseKeys) {
-                if (!entityMap.containsKey(testCaseKey)) {
-                    logger.log(Level.WARNING, "Test case entity missing: " + testCaseKey);
-                    continue;
-                }
-                Entity testCaseRun = entityMap.get(testCaseKey);
-                TestCaseRunEntity testCaseRunEntity = TestCaseRunEntity.fromEntity(testCaseRun);
-                if (testCaseRunEntity == null) {
-                    logger.log(Level.WARNING, "Invalid test case run: " + testCaseRun.getKey());
-                    continue;
-                }
-                for (TestCase testCase : testCaseRunEntity.testCases) {
-                    String testCaseName = testCase.name;
-                    TestCaseResult result = TestCaseResult.valueOf(testCase.result);
-
-                    if (mostRecentRun == testRunEntity) {
-                        mostRecentTestCaseResults.put(testCaseName, result);
-                    } else {
-                        if (!mostRecentTestCaseResults.containsKey(testCaseName)) {
-                            // Deprecate notifications for tests that are not present on newer runs
-                            continue;
-                        }
-                        TestCaseResult mostRecentRes = mostRecentTestCaseResults.get(testCaseName);
-                        if (mostRecentRes == TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                            mostRecentTestCaseResults.put(testCaseName, result);
-                        } else if (mostRecentRes == TestCaseResult.TEST_CASE_RESULT_PASS) {
-                            // Test is passing now, witnessed a transient failure
-                            if (result != TestCaseResult.TEST_CASE_RESULT_PASS
-                                    && result != TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                                transientTestcaseFailures.add(testCaseName);
-                            }
-                        }
-                    }
-
-                    // Record test case breakages
-                    if (result != TestCaseResult.TEST_CASE_RESULT_PASS
-                            && result != TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                        testCaseBreakageMap.put(testCaseName, testCase);
-                    }
-                }
-            }
-        }
-
-        if (mostRecentRun == null) {
-            notifyIfInactive(test, link, emailAddresses, messages);
-            return null;
-        }
-
-        for (String testCaseName : mostRecentTestCaseResults.keySet()) {
-            TestCaseResult mostRecentResult = mostRecentTestCaseResults.get(testCaseName);
-            boolean previouslyFailed = failedTestCaseMap.containsKey(testCaseName);
-            if (mostRecentResult == TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                // persist previous status
-                if (previouslyFailed) {
-                    failingTestCases.add(
-                            new TestCaseReference(failedTestCaseMap.get(testCaseName)));
-                } else {
-                    ++passingTestcaseCount;
-                }
-            } else if (mostRecentResult == TestCaseResult.TEST_CASE_RESULT_PASS) {
-                ++passingTestcaseCount;
-                if (previouslyFailed && !transientTestcaseFailures.contains(testCaseName)) {
-                    fixedTestcases.add(testCaseName);
-                }
-            } else {
-                if (!previouslyFailed) {
-                    newTestcaseFailures.add(testCaseName);
-                    failingTestCases.add(
-                            new TestCaseReference(testCaseBreakageMap.get(testCaseName)));
-                } else {
-                    continuedTestcaseFailures.add(testCaseName);
-                    failingTestCases.add(
-                            new TestCaseReference(failedTestCaseMap.get(testCaseName)));
-                }
-            }
-        }
-
-        Set<String> buildIdList = new HashSet<>();
-        Query deviceQuery = new Query(DeviceInfoEntity.KIND).setAncestor(mostRecentRun.key);
-        for (Entity device : datastore.prepare(deviceQuery).asIterable()) {
-            DeviceInfoEntity deviceEntity = DeviceInfoEntity.fromEntity(device);
-            if (deviceEntity == null) {
-                continue;
-            }
-            buildIdList.add(deviceEntity.buildId);
-        }
-        String buildId = StringUtils.join(buildIdList, ",");
-        String summary = new String();
-        if (newTestcaseFailures.size() + continuedTestcaseFailures.size() > 0) {
-            summary += "The following test cases failed in the latest test run:<br>";
-
-            // Add new test case failures to top of summary in bold font.
-            List<String> sortedNewTestcaseFailures = new ArrayList<>(newTestcaseFailures);
-            Collections.sort(sortedNewTestcaseFailures);
-            for (String testcaseName : sortedNewTestcaseFailures) {
-                summary += "- "
-                        + "<b>" + testcaseName + "</b><br>";
-            }
-
-            // Add continued test case failures to summary.
-            List<String> sortedContinuedTestcaseFailures =
-                    new ArrayList<>(continuedTestcaseFailures);
-            Collections.sort(sortedContinuedTestcaseFailures);
-            for (String testcaseName : sortedContinuedTestcaseFailures) {
-                summary += "- " + testcaseName + "<br>";
-            }
-        }
-        if (fixedTestcases.size() > 0) {
-            // Add fixed test cases to summary.
-            summary += "<br><br>The following test cases were fixed in the latest test run:<br>";
-            List<String> sortedFixedTestcases = new ArrayList<>(fixedTestcases);
-            Collections.sort(sortedFixedTestcases);
-            for (String testcaseName : sortedFixedTestcases) {
-                summary += "- <i>" + testcaseName + "</i><br>";
-            }
-        }
-        if (transientTestcaseFailures.size() > 0) {
-            // Add transient test case failures to summary.
-            summary += "<br><br>The following transient test case failures occured:<br>";
-            List<String> sortedTransientTestcaseFailures =
-                    new ArrayList<>(transientTestcaseFailures);
-            Collections.sort(sortedTransientTestcaseFailures);
-            for (String testcaseName : sortedTransientTestcaseFailures) {
-                summary += "- " + testcaseName + "<br>";
-            }
-        }
-        if (skippedTestcaseFailures.size() > 0) {
-            // Add skipped test case failures to summary.
-            summary += "<br><br>The following test cases have not been run since failing:<br>";
-            List<String> sortedSkippedTestcaseFailures = new ArrayList<>(skippedTestcaseFailures);
-            Collections.sort(sortedSkippedTestcaseFailures);
-            for (String testcaseName : sortedSkippedTestcaseFailures) {
-                summary += "- " + testcaseName + "<br>";
-            }
-        }
-
-        if (newTestcaseFailures.size() > 0) {
-            String subject = "New test failures in " + testName + " @ " + buildId;
-            String body = "Hello,<br><br>Test cases are failing in " + testName
-                    + " for device build ID(s): " + buildId + ".<br><br>" + summary + footer;
-            try {
-                messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        } else if (continuedTestcaseFailures.size() > 0) {
-            String subject = "Continued test failures in " + testName + " @ " + buildId;
-            String body = "Hello,<br><br>Test cases are failing in " + testName
-                    + " for device build ID(s): " + buildId + ".<br><br>" + summary + footer;
-            try {
-                messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        } else if (transientTestcaseFailures.size() > 0) {
-            String subject = "Transient test failure in " + testName + " @ " + buildId;
-            String body = "Hello,<br><br>Some test cases failed in " + testName + " but tests all "
-                    + "are passing in the latest device build(s): " + buildId + ".<br><br>"
-                    + summary + footer;
-            try {
-                messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        } else if (fixedTestcases.size() > 0) {
-            String subject = "All test cases passing in " + testName + " @ " + buildId;
-            String body = "Hello,<br><br>All test cases passed in " + testName
-                    + " for device build ID(s): " + buildId + "!<br><br>" + summary + footer;
-            try {
-                messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        }
-        return new TestEntity(test.testName, mostRecentRun.startTimestamp, passingTestcaseCount,
-                failingTestCases.size(), failingTestCases);
-    }
-
-    /**
-     * Process the current test case failures for a test.
-     *
-     * @param testEntity The TestEntity object for the test.
-     * @returns a map from test case name to the test case run ID for which the test case failed.
-     */
-    public static Map<String, TestCase> getCurrentFailures(TestEntity testEntity) {
-        if (testEntity.failingTestCases == null || testEntity.failingTestCases.size() == 0) {
-            return new HashMap<>();
-        }
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Map<String, TestCase> failingTestcases = new HashMap<>();
-        Set<Key> gets = new HashSet<>();
-        for (TestCaseReference testCaseRef : testEntity.failingTestCases) {
-            gets.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseRef.parentId));
-        }
-        if (gets.size() == 0) {
-            return failingTestcases;
-        }
-        Map<Key, Entity> testCaseMap = datastore.get(gets);
-
-        for (TestCaseReference testCaseRef : testEntity.failingTestCases) {
-            Key key = KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseRef.parentId);
-            if (!testCaseMap.containsKey(key)) {
-                continue;
-            }
-            Entity testCaseRun = testCaseMap.get(key);
-            TestCaseRunEntity testCaseRunEntity = TestCaseRunEntity.fromEntity(testCaseRun);
-            if (testCaseRunEntity.testCases.size() <= testCaseRef.offset) {
-                continue;
-            }
-            TestCase testCase = testCaseRunEntity.testCases.get(testCaseRef.offset);
-            failingTestcases.put(testCase.name, testCase);
-        }
-        return failingTestcases;
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        doGetHandler(request, response);
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Query q = new Query(TestEntity.KIND);
-        for (Entity test : datastore.prepare(q).asIterable()) {
-            TestEntity testEntity = TestEntity.fromEntity(test);
-            if (testEntity == null) {
-                logger.log(Level.WARNING, "Corrupted test entity: " + test.getKey().getName());
-                continue;
-            }
-            List<String> emails = EmailHelper.getSubscriberEmails(test.getKey());
-
-            StringBuffer fullUrl = request.getRequestURL();
-            String baseUrl = fullUrl.substring(0, fullUrl.indexOf(request.getRequestURI()));
-            String link = baseUrl + "/show_table?testName=" + testEntity.testName;
-
-            List<Message> messageQueue = new ArrayList<>();
-            Map<String, TestCase> failedTestcaseMap = getCurrentFailures(testEntity);
-
-            TestEntity newTestEntity =
-                    getTestStatus(testEntity, link, failedTestcaseMap, emails, messageQueue);
-
-            // Send any inactivity notifications
-            if (newTestEntity == null) {
-                if (messageQueue.size() > 0) {
-                    EmailHelper.sendAll(messageQueue);
-                }
-                continue;
-            }
-
-            Transaction txn = datastore.beginTransaction();
-            try {
-                try {
-                    testEntity = TestEntity.fromEntity(datastore.get(test.getKey()));
-
-                    // Another job updated the test entity
-                    if (testEntity == null || testEntity.timestamp >= newTestEntity.timestamp) {
-                        txn.rollback();
-                    } else { // This update is most recent.
-                        datastore.put(newTestEntity.toEntity());
-                        txn.commit();
-                        EmailHelper.sendAll(messageQueue);
-                    }
-                } catch (EntityNotFoundException e) {
-                    logger.log(Level.INFO,
-                            "Test disappeared during updated: " + newTestEntity.testName);
-                }
-            } finally {
-                if (txn.isActive()) {
-                    txn.rollback();
-                }
-            }
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/VtsPerformanceJobServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/VtsPerformanceJobServlet.java
deleted file mode 100644
index 6758879..0000000
--- a/web/dashboard/src/main/java/com/android/vts/servlet/VtsPerformanceJobServlet.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.TestEntity;
-import com.android.vts.util.EmailHelper;
-import com.android.vts.util.PerformanceSummary;
-import com.android.vts.util.PerformanceUtil;
-import com.android.vts.util.PerformanceUtil.TimeInterval;
-import com.android.vts.util.ProfilingPointSummary;
-import com.android.vts.util.StatSummary;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.Query;
-import java.io.IOException;
-import java.math.RoundingMode;
-import java.text.DecimalFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Represents the notifications service which is automatically called on a fixed schedule. */
-public class VtsPerformanceJobServlet extends BaseServlet {
-    private static final String MEAN = "Mean";
-    private static final String MAX = "Max";
-    private static final String MIN = "Min";
-    private static final String MIN_DELTA = "&Delta;Min (%)";
-    private static final String MAX_DELTA = "&Delta;Max (%)";
-    private static final String HIGHER_IS_BETTER =
-            "Note: Higher values are better. Maximum is the best-case performance.";
-    private static final String LOWER_IS_BETTER =
-            "Note: Lower values are better. Minimum is the best-case performance.";
-    private static final String STD = "Std";
-    private static final String SUBJECT_PREFIX = "Daily Performance Digest: ";
-    private static final String LAST_WEEK = "Last Week";
-    private static final String LABEL_STYLE = "font-family: arial";
-    private static final String SUBTEXT_STYLE = "font-family: arial; font-size: 12px";
-    private static final String TABLE_STYLE =
-            "width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;";
-    private static final String SECTION_LABEL_STYLE =
-            "border: 1px solid black; border-bottom: none; background-color: lightgray;";
-    private static final String COL_LABEL_STYLE =
-            "border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;";
-    private static final String HEADER_COL_STYLE =
-            "border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;";
-    private static final String INNER_CELL_STYLE =
-            "border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;";
-    private static final String OUTER_CELL_STYLE =
-            "border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;";
-
-    private static final DecimalFormat FORMATTER;
-
-    /**
-     * Initialize the decimal formatter.
-     */
-    static {
-        FORMATTER = new DecimalFormat("#.##");
-        FORMATTER.setRoundingMode(RoundingMode.HALF_UP);
-    }
-
-    @Override
-    public List<String[]> getNavbarLinks(HttpServletRequest request) {
-        return null;
-    }
-
-    /**
-     * Generates an HTML summary of the performance changes for the profiling results in the
-     * specified
-     * table.
-     *
-     * <p>Retrieves the past 24 hours of profiling data and compares it to the 24 hours that
-     * preceded
-     * it. Creates a table representation of the mean and standard deviation for each profiling
-     * point.
-     * When performance degrades, the cell is shaded red.
-     *
-     * @param testName The name of the test whose profiling data to summarize.
-     * @param perfSummaries List of PerformanceSummary objects for each profiling run (in reverse
-     *     chronological order).
-     * @param labels List of string labels for use as the column headers.
-     * @returns An HTML string containing labeled table summaries.
-     */
-    public static String getPeformanceSummary(
-            String testName, List<PerformanceSummary> perfSummaries, List<String> labels) {
-        if (perfSummaries.size() == 0)
-            return "";
-        PerformanceSummary now = perfSummaries.get(0);
-        String tableHTML = "<p style='" + LABEL_STYLE + "'><b>";
-        tableHTML += testName + "</b></p>";
-        for (String profilingPoint : now.getProfilingPointNames()) {
-            ProfilingPointSummary summary = now.getProfilingPointSummary(profilingPoint);
-            tableHTML += "<table cellpadding='2' style='" + TABLE_STYLE + "'>";
-
-            // Format header rows
-            String[] headerRows = new String[] {profilingPoint, summary.yLabel};
-            int colspan = labels.size() * 4;
-            for (String content : headerRows) {
-                tableHTML += "<tr><td colspan='" + colspan + "'>" + content + "</td></tr>";
-            }
-
-            // Format section labels
-            tableHTML += "<tr>";
-            for (int i = 0; i < labels.size(); i++) {
-                String content = labels.get(i);
-                tableHTML += "<th style='" + SECTION_LABEL_STYLE + "' ";
-                if (i == 0)
-                    tableHTML += "colspan='1'";
-                else if (i == 1)
-                    tableHTML += "colspan='3'";
-                else
-                    tableHTML += "colspan='4'";
-                tableHTML += ">" + content + "</th>";
-            }
-            tableHTML += "</tr>";
-
-            String deltaString;
-            String bestCaseString;
-            String subtext;
-            switch (now.getProfilingPointSummary(profilingPoint).getRegressionMode()) {
-                case VTS_REGRESSION_MODE_DECREASING:
-                    deltaString = MAX_DELTA;
-                    bestCaseString = MAX;
-                    subtext = HIGHER_IS_BETTER;
-                    break;
-                default:
-                    deltaString = MIN_DELTA;
-                    bestCaseString = MIN;
-                    subtext = LOWER_IS_BETTER;
-                    break;
-            }
-
-            // Format column labels
-            tableHTML += "<tr>";
-            for (int i = 0; i < labels.size(); i++) {
-                if (i > 1) {
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>" + deltaString + "</th>";
-                }
-                if (i == 0) {
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>";
-                    tableHTML += summary.xLabel + "</th>";
-                } else if (i > 0) {
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>" + bestCaseString + "</th>";
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>" + MEAN + "</th>";
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>" + STD + "</th>";
-                }
-            }
-            tableHTML += "</tr>";
-
-            // Populate data cells
-            for (StatSummary stats : summary) {
-                String label = stats.getLabel();
-                tableHTML += "<tr><td style='" + HEADER_COL_STYLE + "'>" + label;
-                tableHTML += "</td><td style='" + INNER_CELL_STYLE + "'>";
-                tableHTML += FORMATTER.format(stats.getBestCase()) + "</td>";
-                tableHTML += "<td style='" + INNER_CELL_STYLE + "'>";
-                tableHTML += FORMATTER.format(stats.getMean()) + "</td>";
-                tableHTML += "<td style='" + OUTER_CELL_STYLE + "'>";
-                tableHTML += FORMATTER.format(stats.getStd()) + "</td>";
-                for (int i = 1; i < perfSummaries.size(); i++) {
-                    PerformanceSummary oldPerfSummary = perfSummaries.get(i);
-                    if (oldPerfSummary.hasProfilingPoint(profilingPoint)) {
-                        StatSummary baseline =
-                                oldPerfSummary.getProfilingPointSummary(profilingPoint)
-                                        .getStatSummary(label);
-                        tableHTML += PerformanceUtil.getBestCasePerformanceComparisonHTML(
-                                baseline, stats, "", "", INNER_CELL_STYLE, OUTER_CELL_STYLE);
-                    } else
-                        tableHTML += "<td></td><td></td><td></td><td></td>";
-                }
-                tableHTML += "</tr>";
-            }
-            tableHTML += "</table>";
-            tableHTML += "<i style='" + SUBTEXT_STYLE + "'>" + subtext + "</i><br><br>";
-        }
-        return tableHTML;
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        doGetHandler(request, response);
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Set<Key> allTestKeys = new HashSet<>();
-
-        Query q = new Query(TestEntity.KIND).setKeysOnly();
-        for (Entity test : datastore.prepare(q).asIterable()) {
-            if (test.getKey().getName() == null) {
-                continue;
-            }
-            allTestKeys.add(test.getKey());
-        }
-
-        // Add today to the list of time intervals to analyze
-        List<TimeInterval> timeIntervals = new ArrayList<>();
-        long nowMilli = System.currentTimeMillis();
-        long nowMicro = TimeUnit.MILLISECONDS.toMicros(nowMilli);
-        String dateString = new SimpleDateFormat("MM-dd-yyyy").format(new Date(nowMilli));
-        TimeInterval today =
-                new TimeInterval(nowMicro - TimeUnit.DAYS.toMicros(1), nowMicro, dateString);
-        timeIntervals.add(today);
-
-        // Add yesterday as a baseline time interval for analysis
-        long oneDayAgo = nowMicro - TimeUnit.DAYS.toMicros(1);
-        String dateStringYesterday = new SimpleDateFormat(
-                "MM-dd-yyyy").format(new Date(TimeUnit.MICROSECONDS.toMillis(oneDayAgo)));
-        TimeInterval yesterday = new TimeInterval(
-                oneDayAgo - TimeUnit.DAYS.toMicros(1), oneDayAgo, dateStringYesterday);
-        timeIntervals.add(yesterday);
-
-        // Add last week as a baseline time interval for analysis
-        long oneWeek = TimeUnit.DAYS.toMicros(7);
-        long oneWeekAgo = nowMicro - oneWeek;
-        TimeInterval lastWeek = new TimeInterval(oneWeekAgo - oneWeek, oneWeekAgo, LAST_WEEK);
-        timeIntervals.add(lastWeek);
-
-        for (Key testKey : allTestKeys) {
-            List<PerformanceSummary> perfSummaries = new ArrayList<>();
-            List<String> labels = new ArrayList<>();
-            labels.add("");
-            for (TimeInterval interval : timeIntervals) {
-                PerformanceSummary perfSummary = new PerformanceSummary();
-                PerformanceUtil.updatePerformanceSummary(
-                        testKey.getName(), interval.start, interval.end, null, perfSummary);
-                if (perfSummary.size() == 0) {
-                    continue;
-                }
-                perfSummaries.add(perfSummary);
-                labels.add(interval.label);
-            }
-            String body = getPeformanceSummary(testKey.getName(), perfSummaries, labels);
-            if (body == null || body.equals("")) {
-                continue;
-            }
-            List<String> emails = EmailHelper.getSubscriberEmails(testKey);
-            if (emails.size() == 0) {
-                continue;
-            }
-            String subject = SUBJECT_PREFIX + testKey.getName();
-            EmailHelper.send(emails, subject, body);
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/DatastoreHelper.java b/web/dashboard/src/main/java/com/android/vts/util/DatastoreHelper.java
deleted file mode 100644
index 8bd7b5b..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/DatastoreHelper.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.entity.TestRunEntity.TestRunType;
-import com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage;
-import com.android.vts.proto.VtsReportMessage.CoverageReportMessage;
-import com.android.vts.proto.VtsReportMessage.LogMessage;
-import com.android.vts.proto.VtsReportMessage.ProfilingReportMessage;
-import com.android.vts.proto.VtsReportMessage.TestCaseReportMessage;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.proto.VtsReportMessage.TestPlanReportMessage;
-import com.android.vts.proto.VtsReportMessage.TestReportMessage;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.FetchOptions;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.KeyRange;
-import com.google.appengine.api.datastore.PropertyProjection;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import com.google.appengine.api.datastore.Transaction;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** DatastoreHelper, a helper class for interacting with Cloud Datastore. */
-public class DatastoreHelper {
-    protected static final Logger logger = Logger.getLogger(DatastoreHelper.class.getName());
-
-    /**
-     * Returns true if there are data points newer than lowerBound in the results table.
-     *
-     * @param parentKey The parent key to use in the query.
-     * @param kind The query entity kind.
-     * @param lowerBound The (exclusive) lower time bound, long, microseconds.
-     * @return boolean True if there are newer data points.
-     * @throws IOException
-     */
-    public static boolean hasNewer(Key parentKey, String kind, Long lowerBound) throws IOException {
-        if (lowerBound == null || lowerBound <= 0)
-            return false;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Key startKey = KeyFactory.createKey(parentKey, kind, lowerBound);
-        Filter startFilter = new FilterPredicate(
-                Entity.KEY_RESERVED_PROPERTY, FilterOperator.GREATER_THAN, startKey);
-        Query q = new Query(kind).setAncestor(parentKey).setFilter(startFilter).setKeysOnly();
-        return datastore.prepare(q).countEntities(FetchOptions.Builder.withLimit(1)) > 0;
-    }
-
-    /**
-     * Returns true if there are data points older than upperBound in the table.
-     *
-     * @param parentKey The parent key to use in the query.
-     * @param kind The query entity kind.
-     * @param upperBound The (exclusive) upper time bound, long, microseconds.
-     * @return boolean True if there are older data points.
-     * @throws IOException
-     */
-    public static boolean hasOlder(Key parentKey, String kind, Long upperBound) throws IOException {
-        if (upperBound == null || upperBound <= 0)
-            return false;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Key endKey = KeyFactory.createKey(parentKey, kind, upperBound);
-        Filter endFilter =
-                new FilterPredicate(Entity.KEY_RESERVED_PROPERTY, FilterOperator.LESS_THAN, endKey);
-        Query q = new Query(kind).setAncestor(parentKey).setFilter(endFilter).setKeysOnly();
-        return datastore.prepare(q).countEntities(FetchOptions.Builder.withLimit(1)) > 0;
-    }
-
-    /**
-     * Determines if any entities match the provided query.
-     *
-     * @param query The query to test.
-     * @return true if entities match the query.
-     */
-    public static boolean hasEntities(Query query) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        FetchOptions limitOne = FetchOptions.Builder.withLimit(1);
-        return datastore.prepare(query).countEntities(limitOne) > 0;
-    }
-
-    /**
-     * Get all of the target product names.
-     *
-     * @return a list of all device product names.
-     */
-    public static List<String> getAllProducts() {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Query query = new Query(DeviceInfoEntity.KIND)
-                              .addProjection(new PropertyProjection(
-                                      DeviceInfoEntity.PRODUCT, String.class))
-                              .setDistinct(true);
-        List<String> devices = new ArrayList<>();
-        for (Entity e : datastore.prepare(query).asIterable()) {
-            devices.add((String) e.getProperty(DeviceInfoEntity.PRODUCT));
-        }
-        return devices;
-    }
-
-    /**
-     * Upload data from a test report message
-     *
-     * @param report The test report containing data to upload.
-     */
-    public static void insertTestReport(TestReportMessage report) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        List<Entity> puts = new ArrayList<>();
-
-        if (!report.hasStartTimestamp() || !report.hasEndTimestamp() || !report.hasTest()
-                || !report.hasHostInfo() || !report.hasBuildInfo()) {
-            // missing information
-            return;
-        }
-        long startTimestamp = report.getStartTimestamp();
-        long endTimestamp = report.getEndTimestamp();
-        String testName = report.getTest().toStringUtf8();
-        String testBuildId = report.getBuildInfo().getId().toStringUtf8();
-        String hostName = report.getHostInfo().getHostname().toStringUtf8();
-
-        Entity testEntity = new TestEntity(testName).toEntity();
-        List<Long> testCaseIds = new ArrayList<>();
-
-        Key testRunKey = KeyFactory.createKey(
-                testEntity.getKey(), TestRunEntity.KIND, report.getStartTimestamp());
-
-        long passCount = 0;
-        long failCount = 0;
-        long coveredLineCount = 0;
-        long totalLineCount = 0;
-
-        List<TestCaseRunEntity> testCases = new ArrayList<>();
-
-        // Process test cases
-        for (TestCaseReportMessage testCase : report.getTestCaseList()) {
-            String testCaseName = testCase.getName().toStringUtf8();
-            TestCaseResult result = testCase.getTestResult();
-            // Track global pass/fail counts
-            if (result == TestCaseResult.TEST_CASE_RESULT_PASS) {
-                ++passCount;
-            } else if (result != TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                ++failCount;
-            }
-            String systraceLink = null;
-            if (testCase.getSystraceCount() > 0
-                    && testCase.getSystraceList().get(0).getUrlCount() > 0) {
-                systraceLink = testCase.getSystraceList().get(0).getUrl(0).toStringUtf8();
-            }
-            // Process coverage data for test case
-            for (CoverageReportMessage coverage : testCase.getCoverageList()) {
-                CoverageEntity coverageEntity =
-                        CoverageEntity.fromCoverageReport(testRunKey, testCaseName, coverage);
-                if (coverageEntity == null) {
-                    logger.log(Level.WARNING, "Invalid coverage report in test run " + testRunKey);
-                    continue;
-                }
-                coveredLineCount += coverageEntity.coveredLineCount;
-                totalLineCount += coverageEntity.totalLineCount;
-                puts.add(coverageEntity.toEntity());
-            }
-            // Process profiling data for test case
-            for (ProfilingReportMessage profiling : testCase.getProfilingList()) {
-                ProfilingPointRunEntity profilingEntity =
-                        ProfilingPointRunEntity.fromProfilingReport(testRunKey, profiling);
-                if (profilingEntity == null) {
-                    logger.log(Level.WARNING, "Invalid profiling report in test run " + testRunKey);
-                }
-                puts.add(profilingEntity.toEntity());
-            }
-
-            int lastIndex = testCases.size() - 1;
-            if (lastIndex < 0 || testCases.get(lastIndex).isFull()) {
-                KeyRange keys = datastore.allocateIds(TestCaseRunEntity.KIND, 1);
-                testCaseIds.add(keys.getStart().getId());
-                testCases.add(new TestCaseRunEntity(keys.getStart()));
-                ++lastIndex;
-            }
-            TestCaseRunEntity testCaseEntity = testCases.get(lastIndex);
-            testCaseEntity.addTestCase(testCaseName, result.getNumber());
-            testCaseEntity.setSystraceUrl(systraceLink);
-        }
-        List<Entity> testCasePuts = new ArrayList<>();
-        for (TestCaseRunEntity testCaseEntity : testCases) {
-            testCasePuts.add(testCaseEntity.toEntity());
-        }
-        datastore.put(testCasePuts);
-
-        // Process device information
-        TestRunType testRunType = null;
-        for (AndroidDeviceInfoMessage device : report.getDeviceInfoList()) {
-            DeviceInfoEntity deviceInfoEntity =
-                    DeviceInfoEntity.fromDeviceInfoMessage(testRunKey, device);
-            if (deviceInfoEntity == null) {
-                logger.log(Level.WARNING, "Invalid device info in test run " + testRunKey);
-            }
-
-            // Run type on devices must be the same, else set to OTHER
-            TestRunType runType = TestRunType.fromBuildId(deviceInfoEntity.buildId);
-            if (testRunType == null) {
-                testRunType = runType;
-            } else if (runType != testRunType) {
-                testRunType = TestRunType.OTHER;
-            }
-            puts.add(deviceInfoEntity.toEntity());
-        }
-
-        // Overall run type should be determined by the device builds unless test build is OTHER
-        if (testRunType == null) {
-            testRunType = TestRunType.fromBuildId(testBuildId);
-        } else if (TestRunType.fromBuildId(testBuildId) == TestRunType.OTHER) {
-            testRunType = TestRunType.OTHER;
-        }
-
-        // Process global coverage data
-        for (CoverageReportMessage coverage : report.getCoverageList()) {
-            CoverageEntity coverageEntity =
-                    CoverageEntity.fromCoverageReport(testRunKey, new String(), coverage);
-            if (coverageEntity == null) {
-                logger.log(Level.WARNING, "Invalid coverage report in test run " + testRunKey);
-                continue;
-            }
-            coveredLineCount += coverageEntity.coveredLineCount;
-            totalLineCount += coverageEntity.totalLineCount;
-            puts.add(coverageEntity.toEntity());
-        }
-
-        // Process global profiling data
-        for (ProfilingReportMessage profiling : report.getProfilingList()) {
-            ProfilingPointRunEntity profilingEntity =
-                    ProfilingPointRunEntity.fromProfilingReport(testRunKey, profiling);
-            if (profilingEntity == null) {
-                logger.log(Level.WARNING, "Invalid profiling report in test run " + testRunKey);
-            }
-            puts.add(profilingEntity.toEntity());
-        }
-
-        List<String> logLinks = new ArrayList<>();
-        // Process log data
-        for (LogMessage log : report.getLogList()) {
-            if (!log.hasUrl())
-                continue;
-            logLinks.add(log.getUrl().toStringUtf8());
-        }
-
-        TestRunEntity testRunEntity = new TestRunEntity(testEntity.getKey(), testRunType,
-                startTimestamp, endTimestamp, testBuildId, hostName, passCount, failCount,
-                testCaseIds, logLinks, coveredLineCount, totalLineCount);
-        puts.add(testRunEntity.toEntity());
-
-        Transaction txn = datastore.beginTransaction();
-        try {
-            // Check if test already exists in the database
-            try {
-                datastore.get(testEntity.getKey());
-            } catch (EntityNotFoundException e) {
-                puts.add(testEntity);
-            }
-            datastore.put(puts);
-            txn.commit();
-        } finally {
-            if (txn.isActive()) {
-                logger.log(
-                        Level.WARNING, "Transaction rollback forced for run: " + testRunEntity.key);
-                txn.rollback();
-            }
-        }
-    }
-
-    /**
-     * Upload data from a test plan report message
-     *
-     * @param report The test plan report containing data to upload.
-     */
-    public static void insertTestPlanReport(TestPlanReportMessage report) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        List<Entity> puts = new ArrayList<>();
-
-        List<String> testModules = report.getTestModuleNameList();
-        List<Long> testTimes = report.getTestModuleStartTimestampList();
-        if (testModules.size() != testTimes.size() || !report.hasTestPlanName()) {
-            logger.log(Level.WARNING, "TestPlanReportMessage is missing information.");
-            return;
-        }
-
-        String testPlanName = report.getTestPlanName();
-        Entity testPlanEntity = new TestPlanEntity(testPlanName).toEntity();
-        List<Key> testRunKeys = new ArrayList<>();
-        for (int i = 0; i < testModules.size(); i++) {
-            String test = testModules.get(i);
-            long time = testTimes.get(i);
-            Key parentKey = KeyFactory.createKey(TestEntity.KIND, test);
-            Key testRunKey = KeyFactory.createKey(parentKey, TestRunEntity.KIND, time);
-            testRunKeys.add(testRunKey);
-        }
-        Map<Key, Entity> testRuns = datastore.get(testRunKeys);
-        long passCount = 0;
-        long failCount = 0;
-        long startTimestamp = -1;
-        String testBuildId = null;
-        TestRunType type = null;
-        Set<DeviceInfoEntity> devices = new HashSet<>();
-        for (Key testRunKey : testRuns.keySet()) {
-            TestRunEntity testRun = TestRunEntity.fromEntity(testRuns.get(testRunKey));
-            if (testRun == null) {
-                continue; // not a valid test run
-            }
-            passCount += testRun.passCount;
-            failCount += testRun.failCount;
-            if (startTimestamp < 0 || testRunKey.getId() < startTimestamp) {
-                startTimestamp = testRunKey.getId();
-            }
-            if (type == null) {
-                type = testRun.type;
-            } else if (type != testRun.type) {
-                type = TestRunType.OTHER;
-            }
-            testBuildId = testRun.testBuildId;
-            Query deviceInfoQuery = new Query(DeviceInfoEntity.KIND).setAncestor(testRunKey);
-            for (Entity deviceInfoEntity : datastore.prepare(deviceInfoQuery).asIterable()) {
-                DeviceInfoEntity device = DeviceInfoEntity.fromEntity(deviceInfoEntity);
-                if (device == null) {
-                    continue; // invalid entity
-                }
-                devices.add(device);
-            }
-        }
-        if (startTimestamp < 0 || testBuildId == null || type == null) {
-            logger.log(Level.WARNING, "Couldn't infer test run information from runs.");
-            return;
-        }
-        TestPlanRunEntity testPlanRun = new TestPlanRunEntity(testPlanEntity.getKey(), testPlanName,
-                type, startTimestamp, testBuildId, passCount, failCount, testRunKeys);
-
-        // Create the device infos.
-        for (DeviceInfoEntity device : devices) {
-            puts.add(device.copyWithParent(testPlanRun.key).toEntity());
-        }
-        puts.add(testPlanRun.toEntity());
-
-        Transaction txn = datastore.beginTransaction();
-        try {
-            // Check if test already exists in the database
-            try {
-                datastore.get(testPlanEntity.getKey());
-            } catch (EntityNotFoundException e) {
-                puts.add(testPlanEntity);
-            }
-            datastore.put(puts);
-            txn.commit();
-        } finally {
-            if (txn.isActive()) {
-                logger.log(Level.WARNING,
-                        "Transaction rollback forced for plan run: " + testPlanRun.key);
-                txn.rollback();
-            }
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/EmailHelper.java b/web/dashboard/src/main/java/com/android/vts/util/EmailHelper.java
deleted file mode 100644
index dd14d19..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/EmailHelper.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.UserFavoriteEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-import org.apache.commons.lang.StringUtils;
-
-/** EmailHelper, a helper class for building and sending emails. */
-public class EmailHelper {
-    protected static final Logger logger = Logger.getLogger(EmailHelper.class.getName());
-    protected static final String DEFAULT_EMAIL = System.getProperty("DEFAULT_EMAIL");
-    protected static final String EMAIL_DOMAIN = System.getProperty("EMAIL_DOMAIN");
-    protected static final String SENDER_EMAIL = System.getProperty("SENDER_EMAIL");
-    private static final String VTS_EMAIL_NAME = "VTS Alert Bot";
-
-    /**
-     * Fetches the list of subscriber email addresses for a test.
-     *
-     * @param testKey The key for the test for which to fetch the email addresses.
-     * @returns List of email addresses (String).
-     * @throws IOException
-     */
-    public static List<String> getSubscriberEmails(Key testKey) throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Filter testFilter =
-                new FilterPredicate(UserFavoriteEntity.TEST_KEY, FilterOperator.EQUAL, testKey);
-        Query favoritesQuery = new Query(UserFavoriteEntity.KIND).setFilter(testFilter);
-        Set<String> emailSet = new HashSet<>();
-        if (!StringUtils.isBlank(DEFAULT_EMAIL)) {
-            emailSet.add(DEFAULT_EMAIL);
-        }
-        for (Entity favorite : datastore.prepare(favoritesQuery).asIterable()) {
-            UserFavoriteEntity favoriteEntity = UserFavoriteEntity.fromEntity(favorite);
-            if (favoriteEntity != null && favoriteEntity.user != null
-                    && favoriteEntity.user.getEmail().endsWith(EMAIL_DOMAIN)) {
-                emailSet.add(favoriteEntity.user.getEmail());
-            }
-        }
-        return new ArrayList<>(emailSet);
-    }
-
-    /**
-     * Sends an email to the specified email address to notify of a test status change.
-     *
-     * @param emails List of subscriber email addresses (byte[]) to which the email should be sent.
-     * @param subject The email subject field, string.
-     * @param body The html (string) body to send in the email.
-     * @returns The Message object to be sent.
-     * @throws MessagingException, UnsupportedEncodingException
-     */
-    public static Message composeEmail(List<String> emails, String subject, String body)
-            throws MessagingException, UnsupportedEncodingException {
-        if (emails.size() == 0) {
-            throw new MessagingException("No subscriber email addresses provided");
-        }
-        Properties props = new Properties();
-        Session session = Session.getDefaultInstance(props, null);
-
-        Message msg = new MimeMessage(session);
-        for (String email : emails) {
-            try {
-                msg.addRecipient(Message.RecipientType.TO, new InternetAddress(email, email));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                // Gracefully continue when a subscriber email is invalid.
-                logger.log(Level.WARNING, "Error sending email to recipient " + email + " : ", e);
-            }
-        }
-        msg.setFrom(new InternetAddress(SENDER_EMAIL, VTS_EMAIL_NAME));
-        msg.setSubject(subject);
-        msg.setContent(body, "text/html; charset=utf-8");
-        return msg;
-    }
-
-    /**
-     * Sends an email.
-     *
-     * @param msg Message object to send.
-     * @returns true if the message sends successfully, false otherwise
-     */
-    public static boolean send(Message msg) {
-        try {
-            Transport.send(msg);
-        } catch (MessagingException e) {
-            logger.log(Level.WARNING, "Error sending email : ", e);
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Sends a list of emails and logs any failures.
-     *
-     * @param messages List of Message objects to be sent.
-     */
-    public static void sendAll(List<Message> messages) {
-        for (Message msg : messages) {
-            send(msg);
-        }
-    }
-
-    /**
-     * Sends an email.
-     *
-     * @param recipients List of email address strings to which an email will be sent.
-     * @param subject The subject of the email.
-     * @param body The body of the email.
-     * @returns true if the message sends successfully, false otherwise
-     */
-    public static boolean send(List<String> recipients, String subject, String body) {
-        try {
-            Message msg = composeEmail(recipients, subject, body);
-            return send(msg);
-        } catch (MessagingException | UnsupportedEncodingException e) {
-            logger.log(Level.WARNING, "Error composing email : ", e);
-            return false;
-        }
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/FilterUtil.java b/web/dashboard/src/main/java/com/android/vts/util/FilterUtil.java
deleted file mode 100644
index 6bdbf18..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/FilterUtil.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query.CompositeFilterOperator;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/** FilterUtil, a helper class for parsing and matching search queries to data. */
-public class FilterUtil {
-    private static final String TERM_DELIMITER = ":";
-    private static final String SEARCH_REGEX = "([^\"]\\S*|\".+?\")\\s*";
-
-    /** Key class to represent a filter token. */
-    public static enum FilterKey {
-        DEVICE_BUILD_ID("devicebuildid", DeviceInfoEntity.BUILD_ID),
-        BRANCH("branch", DeviceInfoEntity.BRANCH),
-        TARGET("target", DeviceInfoEntity.BUILD_FLAVOR),
-        DEVICE("device", DeviceInfoEntity.PRODUCT),
-        VTS_BUILD_ID("vtsbuildid", TestRunEntity.TEST_BUILD_ID),
-        HOSTNAME("hostname", TestRunEntity.HOST_NAME),
-        PASSING("passing", TestRunEntity.PASS_COUNT),
-        NONPASSING("nonpassing", TestRunEntity.FAIL_COUNT);
-
-        private static final Map<String, FilterKey> keyMap;
-
-        static {
-            keyMap = new HashMap<>();
-            for (FilterKey k : EnumSet.allOf(FilterKey.class)) {
-                keyMap.put(k.toString(), k);
-            }
-        }
-
-        /**
-         * Test if a string is a valid key.
-         *
-         * @param keyString The key string.
-         * @return True if they key string matches a key.
-         */
-        public static boolean isKey(String keyString) {
-            return keyMap.containsKey(keyString);
-        }
-
-        /**
-         * Parses a key string into a key.
-         *
-         * @param keyString The key string.
-         * @return The key matching the key string.
-         */
-        public static FilterKey parse(String keyString) {
-            return keyMap.get(keyString);
-        }
-
-        private final String keyString;
-        private final String property;
-
-        /**
-         * Constructs a key with the specified key string.
-         *
-         * @param keyString The identifying key string.
-         * @param propertyName The name of the property to match.
-         */
-        private FilterKey(String keyString, String propertyName) {
-            this.keyString = keyString;
-            this.property = propertyName;
-        }
-
-        @Override
-        public String toString() {
-            return this.keyString;
-        }
-
-        public Filter getFilterForString(String matchString) {
-            return new FilterPredicate(this.property, FilterOperator.EQUAL, matchString);
-        }
-
-        public Filter getFilterForNumber(long matchNumber) {
-            return new FilterPredicate(this.property, FilterOperator.EQUAL, matchNumber);
-        }
-    }
-
-    /**
-     * Gets a device filter from the user search string.
-     *
-     * @param searchString The user search string.
-     * @return A filter to apply to a test run's device entities.
-     */
-    public static Filter getDeviceFilter(String searchString) {
-        Filter deviceFilter = null;
-        if (searchString != null) {
-            Matcher m = Pattern.compile(SEARCH_REGEX).matcher(searchString);
-            while (m.find()) {
-                String term = m.group(1).replace("\"", "");
-                if (!term.contains(TERM_DELIMITER))
-                    continue;
-                String[] terms = term.split(TERM_DELIMITER, 2);
-                if (terms.length != 2 || !FilterKey.isKey(terms[0].toLowerCase()))
-                    continue;
-
-                FilterKey key = FilterKey.parse(terms[0].toLowerCase());
-                switch (key) {
-                    case BRANCH:
-                    case DEVICE:
-                    case DEVICE_BUILD_ID:
-                    case TARGET:
-                        String value = terms[1].toLowerCase();
-                        Filter f = key.getFilterForString(value);
-                        if (deviceFilter == null) {
-                            deviceFilter = f;
-                        } else {
-                            deviceFilter = CompositeFilterOperator.and(deviceFilter, f);
-                        }
-                        break;
-                    default:
-                        break;
-                }
-            }
-        }
-        return deviceFilter;
-    }
-
-    /**
-     * Get a filter on the test run type.
-     *
-     * @param showPresubmit True to display presubmit tests.
-     * @param showPostsubmit True to display postsubmit tests.
-     * @param unfiltered True if no filtering should be applied.
-     * @return A filter on the test type.
-     */
-    public static Filter getTestTypeFilter(
-            boolean showPresubmit, boolean showPostsubmit, boolean unfiltered) {
-        if (unfiltered) {
-            return null;
-        } else if (showPresubmit && !showPostsubmit) {
-            return new FilterPredicate(TestRunEntity.TYPE, FilterOperator.EQUAL,
-                    TestRunEntity.TestRunType.PRESUBMIT.getNumber());
-        } else if (showPostsubmit && !showPresubmit) {
-            return new FilterPredicate(TestRunEntity.TYPE, FilterOperator.EQUAL,
-                    TestRunEntity.TestRunType.POSTSUBMIT.getNumber());
-        } else {
-            List<Integer> types = new ArrayList<>();
-            types.add(TestRunEntity.TestRunType.PRESUBMIT.getNumber());
-            types.add(TestRunEntity.TestRunType.POSTSUBMIT.getNumber());
-            return new FilterPredicate(TestRunEntity.TYPE, FilterOperator.IN, types);
-        }
-    }
-
-    /**
-     * Get a filter on test runs from a user search string.
-     *
-     * @param searchString The user search string to parse.
-     * @return A filter with the values from the user search string.
-     */
-    public static Filter getUserTestFilter(String searchString) {
-        Filter testRunFilter = null;
-        if (searchString != null) {
-            Matcher m = Pattern.compile(SEARCH_REGEX).matcher(searchString);
-            while (m.find()) {
-                String term = m.group(1).replace("\"", "");
-                if (!term.contains(TERM_DELIMITER))
-                    continue;
-                String[] terms = term.split(TERM_DELIMITER, 2);
-                if (terms.length != 2 || !FilterKey.isKey(terms[0].toLowerCase()))
-                    continue;
-
-                FilterKey key = FilterKey.parse(terms[0].toLowerCase());
-                Filter f = null;
-                switch (key) {
-                    case NONPASSING:
-                    case PASSING:
-                        String valueString = terms[1];
-                        try {
-                            Long value = Long.parseLong(valueString);
-                            f = key.getFilterForNumber(value);
-                        } catch (NumberFormatException e) {
-                            // invalid number
-                        }
-                        break;
-                    case HOSTNAME:
-                    case VTS_BUILD_ID:
-                        String value = terms[1].toLowerCase();
-                        f = key.getFilterForString(value);
-                        break;
-                    default:
-                        break;
-                }
-                if (testRunFilter == null) {
-                    testRunFilter = f;
-                } else if (f != null) {
-                    testRunFilter = CompositeFilterOperator.and(testRunFilter, f);
-                }
-            }
-        }
-        return testRunFilter;
-    }
-
-    /**
-     * Get the time range filter to apply to a query.
-     *
-     * @param testKey The key of the parent TestEntity object.
-     * @param startTime The start time in microseconds, or null if unbounded.
-     * @param endTime The end time in microseconds, or null if unbounded.
-     * @param testRunFilter The existing filter on test runs to apply, or null.
-     * @return A filter to apply on test runs.
-     */
-    public static Filter getTimeFilter(
-            Key testKey, Long startTime, Long endTime, Filter testRunFilter) {
-        if (startTime == null && endTime == null) {
-            endTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        }
-
-        Filter startFilter = null;
-        Filter endFilter = null;
-        Filter filter = null;
-        if (startTime != null) {
-            Key startKey = KeyFactory.createKey(testKey, TestRunEntity.KIND, startTime);
-            startFilter = new FilterPredicate(
-                    Entity.KEY_RESERVED_PROPERTY, FilterOperator.GREATER_THAN_OR_EQUAL, startKey);
-            filter = startFilter;
-        }
-        if (endTime != null) {
-            Key endKey = KeyFactory.createKey(testKey, TestRunEntity.KIND, endTime);
-            endFilter = new FilterPredicate(
-                    Entity.KEY_RESERVED_PROPERTY, FilterOperator.LESS_THAN_OR_EQUAL, endKey);
-            filter = endFilter;
-        }
-        if (startFilter != null && endFilter != null) {
-            filter = CompositeFilterOperator.and(startFilter, endFilter);
-        }
-        if (testRunFilter != null) {
-            filter = CompositeFilterOperator.and(filter, testRunFilter);
-        }
-        return filter;
-    }
-
-    public static Filter getTimeFilter(Key testKey, Long startTime, Long endTime) {
-        return getTimeFilter(testKey, startTime, endTime, null);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/Graph.java b/web/dashboard/src/main/java/com/android/vts/util/Graph.java
deleted file mode 100644
index 2fe98bb..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/Graph.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-
-/** Helper object for describing graph data. */
-public abstract class Graph {
-    public static final String VALUE_KEY = "values";
-    public static final String X_LABEL_KEY = "x_label";
-    public static final String Y_LABEL_KEY = "y_label";
-    public static final String IDS_KEY = "ids";
-    public static final String NAME_KEY = "name";
-    public static final String TYPE_KEY = "type";
-
-    public static enum GraphType { LINE_GRAPH, HISTOGRAM }
-
-    /**
-     * Get the graph type.
-     *
-     * @return The graph type.
-     */
-    public abstract GraphType getType();
-
-    /**
-     * Get the x axis label.
-     *
-     * @return The x axis label.
-     */
-    public abstract String getXLabel();
-
-    /**
-     * Get the y axis label.
-     *
-     * @return The y axis label.
-     */
-    public abstract String getYLabel();
-
-    /**
-     * Get the name of the graph.
-     *
-     * @return The name of the graph.
-     */
-    public abstract String getName();
-
-    /**
-     * Get the number of data points stored in the graph.
-     *
-     * @return The number of data points stored in the graph.
-     */
-    public abstract int size();
-
-    /**
-     * Add data to the graph.
-     *
-     * @param id The name of the graph.
-     * @param profilingPoint The ProfilingPointEntity containing data to add.
-     */
-    public abstract void addData(String id, ProfilingPointRunEntity profilingPoint);
-
-    /**
-     * Serializes the graph to json format.
-     *
-     * @return A JsonElement object representing the graph object.
-     */
-    public JsonObject toJson() {
-        JsonObject json = new JsonObject();
-        json.add(X_LABEL_KEY, new JsonPrimitive(getXLabel()));
-        json.add(Y_LABEL_KEY, new JsonPrimitive(getYLabel()));
-        json.add(NAME_KEY, new JsonPrimitive(getName()));
-        json.add(TYPE_KEY, new JsonPrimitive(getType().toString()));
-        return json;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/GraphSerializer.java b/web/dashboard/src/main/java/com/android/vts/util/GraphSerializer.java
deleted file mode 100644
index 722b511..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/GraphSerializer.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonSerializationContext;
-import com.google.gson.JsonSerializer;
-import java.lang.reflect.Type;
-
-/** Serializer class for Graph objects. */
-public class GraphSerializer implements JsonSerializer<Graph> {
-    @Override
-    public JsonElement serialize(Graph src, Type typeOfSrc, JsonSerializationContext context) {
-        return src.toJson();
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/Histogram.java b/web/dashboard/src/main/java/com/android/vts/util/Histogram.java
deleted file mode 100644
index 450714b..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/Histogram.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.google.common.primitives.Doubles;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.math3.stat.descriptive.rank.Percentile;
-
-/** Helper object for describing graph data. */
-public class Histogram extends Graph {
-    public static final String PERCENTILES_KEY = "percentiles";
-    public static final String PERCENTILE_VALUES_KEY = "percentile_values";
-    public static final String MIN_KEY = "min";
-    public static final String MAX_KEY = "max";
-
-    private List<Double> values;
-    private List<String> ids;
-    private String xLabel;
-    private String yLabel;
-    private String name;
-    private GraphType type = GraphType.HISTOGRAM;
-    private Double min = null;
-    private Double max = null;
-
-    public Histogram(String name) {
-        this.name = name;
-        this.values = new ArrayList<>();
-        this.ids = new ArrayList<>();
-    }
-
-    /**
-     * Get the x axis label.
-     *
-     * @return The x axis label.
-     */
-    @Override
-    public String getXLabel() {
-        return xLabel;
-    }
-
-    /**
-     * Get the graph type.
-     *
-     * @return The graph type.
-     */
-    @Override
-    public GraphType getType() {
-        return type;
-    }
-
-    /**
-     * Get the name of the graph.
-     *
-     * @return The name of the graph.
-     */
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Get the y axis label.
-     *
-     * @return The y axis label.
-     */
-    @Override
-    public String getYLabel() {
-        return yLabel;
-    }
-
-    /**
-     * Get the number of data points stored in the graph.
-     *
-     * @return The number of data points stored in the graph.
-     */
-    @Override
-    public int size() {
-        return values.size();
-    }
-
-    /**
-     * Get the minimum value.
-     *
-     * @return The minimum value.
-     */
-    public Double getMin() {
-        return min;
-    }
-
-    /**
-     * Get the maximum value.
-     *
-     * @return The maximum value.
-     */
-    public Double getMax() {
-        return max;
-    }
-
-    /**
-     * Add data to the graph.
-     *
-     * @param id The name of the graph.
-     * @param profilingPoint The ProfilingPointRunEntity containing data to add.
-     */
-    @Override
-    public void addData(String id, ProfilingPointRunEntity profilingPoint) {
-        if (profilingPoint.values.size() == 0)
-            return;
-        xLabel = profilingPoint.xLabel;
-        yLabel = profilingPoint.yLabel;
-        for (long v : profilingPoint.values) {
-            double value = v;
-            values.add(value);
-            ids.add(id);
-            if (max == null || value > max)
-                max = value;
-            if (min == null || value < min)
-                min = value;
-        }
-    }
-
-    /**
-     * Serializes the graph to json format.
-     *
-     * @return A JsonElement object representing the graph object.
-     */
-    @Override
-    public JsonObject toJson() {
-        int[] percentiles = {1, 2, 5, 10, 25, 50, 75, 90, 95, 98, 99};
-        double[] percentileValues = new double[percentiles.length];
-        double[] valueList = Doubles.toArray(values);
-        for (int i = 0; i < percentiles.length; i++) {
-            percentileValues[i] =
-                    Math.round(new Percentile().evaluate(valueList, percentiles[i]) * 1000d)
-                    / 1000d;
-        }
-        JsonObject json = super.toJson();
-        json.add(VALUE_KEY, new Gson().toJsonTree(values).getAsJsonArray());
-        json.add(PERCENTILES_KEY, new Gson().toJsonTree(percentiles).getAsJsonArray());
-        json.add(PERCENTILE_VALUES_KEY, new Gson().toJsonTree(percentileValues).getAsJsonArray());
-        json.add(IDS_KEY, new Gson().toJsonTree(ids).getAsJsonArray());
-        json.add(MIN_KEY, new JsonPrimitive(min));
-        json.add(MAX_KEY, new JsonPrimitive(max));
-        return json;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/LineGraph.java b/web/dashboard/src/main/java/com/android/vts/util/LineGraph.java
deleted file mode 100644
index 22c64da..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/LineGraph.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Helper object for describing graph data. */
-public class LineGraph extends Graph {
-    public static final String TICKS_KEY = "ticks";
-
-    private List<ProfilingPointRunEntity> profilingRuns;
-    private List<String> ids;
-    private String xLabel;
-    private String yLabel;
-    private String name;
-    private GraphType type = GraphType.LINE_GRAPH;
-
-    public LineGraph(String name) {
-        this.name = name;
-        profilingRuns = new ArrayList<>();
-        ids = new ArrayList<>();
-    }
-
-    /**
-     * Get the x axis label.
-     *
-     * @return The x axis label.
-     */
-    @Override
-    public String getXLabel() {
-        return xLabel;
-    }
-
-    /**
-     * Get the graph type.
-     *
-     * @return The graph type.
-     */
-    @Override
-    public GraphType getType() {
-        return type;
-    }
-
-    /**
-     * Get the name of the graph.
-     *
-     * @return The name of the graph.
-     */
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Get the y axis label.
-     *
-     * @return The y axis label.
-     */
-    @Override
-    public String getYLabel() {
-        return yLabel;
-    }
-
-    /**
-     * Get the number of data points stored in the graph.
-     *
-     * @return The number of data points stored in the graph.
-     */
-    @Override
-    public int size() {
-        return profilingRuns.size();
-    }
-
-    /**
-     * Add data to the graph.
-     *
-     * @param id The name of the graph.
-     * @param profilingPoint The ProfilingPointRunEntity containing data to add.
-     */
-    @Override
-    public void addData(String id, ProfilingPointRunEntity profilingPoint) {
-        if (profilingPoint.values.size() == 0
-                || profilingPoint.values.size() != profilingPoint.labels.size())
-            return;
-        ids.add(id);
-        profilingRuns.add(profilingPoint);
-        xLabel = profilingPoint.xLabel;
-        yLabel = profilingPoint.yLabel;
-    }
-
-    /**
-     * Serializes the graph to json format.
-     *
-     * @return A JsonElement object representing the graph object.
-     */
-    @Override
-    public JsonObject toJson() {
-        JsonObject json = super.toJson();
-        // Use the most recent profiling vector to generate the labels
-        ProfilingPointRunEntity profilingRun = profilingRuns.get(profilingRuns.size() - 1);
-
-        List<String> axisTicks = new ArrayList<>();
-        Map<String, Integer> tickIndexMap = new HashMap<>();
-        for (int i = 0; i < profilingRun.labels.size(); i++) {
-            String label = profilingRun.labels.get(i);
-            axisTicks.add(label);
-            tickIndexMap.put(label, i);
-        }
-
-        long[][] lineGraphValues = new long[axisTicks.size()][profilingRuns.size()];
-        for (int reportIndex = 0; reportIndex < profilingRuns.size(); reportIndex++) {
-            ProfilingPointRunEntity pt = profilingRuns.get(reportIndex);
-            for (int i = 0; i < pt.labels.size(); i++) {
-                String label = pt.labels.get(i);
-
-                // Skip value if its label is not present
-                if (!tickIndexMap.containsKey(label))
-                    continue;
-                int labelIndex = tickIndexMap.get(label);
-
-                lineGraphValues[labelIndex][reportIndex] = pt.values.get(i);
-            }
-        }
-        json.add(VALUE_KEY, new Gson().toJsonTree(lineGraphValues).getAsJsonArray());
-        json.add(IDS_KEY, new Gson().toJsonTree(ids).getAsJsonArray());
-        json.add(TICKS_KEY, new Gson().toJsonTree(axisTicks));
-        return json;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/PerformanceSummary.java b/web/dashboard/src/main/java/com/android/vts/util/PerformanceSummary.java
deleted file mode 100644
index 0084267..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/PerformanceSummary.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.google.appengine.api.datastore.Entity;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** PerformanceSummary, an object summarizing performance across profiling points for a test run. */
-public class PerformanceSummary {
-    protected static Logger logger = Logger.getLogger(PerformanceSummary.class.getName());
-    private Map<String, ProfilingPointSummary> summaryMap;
-    private Set<String> optionSplitKeys;
-
-    /** Creates a performance summary object. */
-    public PerformanceSummary() {
-        this.summaryMap = new HashMap<>();
-        this.optionSplitKeys = new HashSet<>();
-    }
-
-    /**
-     * Creates a performance summary object with the specified device name filter. If the specified
-     * name is null, then use no filter.
-     *
-     * @param optionSplitKeys A set of option keys to split on (i.e. profiling data with different
-     *     values corresponding to the option key will be analyzed as different profiling points).
-     */
-    public PerformanceSummary(Set<String> optionSplitKeys) {
-        this();
-        this.optionSplitKeys = optionSplitKeys;
-    }
-
-    /**
-     * Add the profiling data from a ProfilingPointRunEntity to the performance summary.
-     *
-     * @param profilingRun The Entity object whose data to add.
-     */
-    public void addData(Entity profilingRun) {
-        ProfilingPointRunEntity pt = ProfilingPointRunEntity.fromEntity(profilingRun);
-        if (pt == null)
-            return;
-        if (pt.regressionMode == VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DISABLED) {
-            return;
-        }
-
-        String name = pt.name;
-        String optionSuffix = PerformanceUtil.getOptionAlias(profilingRun, optionSplitKeys);
-
-        if (pt.labels != null) {
-            if (pt.labels.size() != pt.values.size()) {
-                logger.log(Level.WARNING, "Labels and values are different sizes.");
-                return;
-            }
-            if (!optionSuffix.equals("")) {
-                name += " (" + optionSuffix + ")";
-            }
-            if (!summaryMap.containsKey(name)) {
-                summaryMap.put(name, new ProfilingPointSummary());
-            }
-            summaryMap.get(name).update(pt);
-        } else {
-            // Use the option suffix as the table name.
-            // Group all profiling points together into one table
-            if (!summaryMap.containsKey(optionSuffix)) {
-                summaryMap.put(optionSuffix, new ProfilingPointSummary());
-            }
-            summaryMap.get(optionSuffix).updateLabel(pt, pt.name);
-        }
-    }
-
-    /**
-     * Adds a ProfilingPointSummary object into the summary map only if the key doesn't exist.
-     *
-     * @param key The name of the profiling point.
-     * @param summary The ProfilingPointSummary object to add into the summary map.
-     * @return True if the data was inserted into the performance summary, false otherwise.
-     */
-    public boolean insertProfilingPointSummary(String key, ProfilingPointSummary summary) {
-        if (!summaryMap.containsKey(key)) {
-            summaryMap.put(key, summary);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Gets the number of profiling points.
-     *
-     * @return The number of profiling points in the performance summary.
-     */
-    public int size() {
-        return summaryMap.size();
-    }
-
-    /**
-     * Gets the names of the profiling points.
-     *
-     * @return A string array of profiling point names.
-     */
-    public String[] getProfilingPointNames() {
-        String[] profilingNames = summaryMap.keySet().toArray(new String[summaryMap.size()]);
-        Arrays.sort(profilingNames);
-        return profilingNames;
-    }
-
-    /**
-     * Determines if a profiling point is described by the performance summary.
-     *
-     * @param profilingPointName The name of the profiling point.
-     * @return True if the profiling point is contained in the performance summary, else false.
-     */
-    public boolean hasProfilingPoint(String profilingPointName) {
-        return summaryMap.containsKey(profilingPointName);
-    }
-
-    /**
-     * Gets the profiling point summary by name.
-     *
-     * @param profilingPointName The name of the profiling point to fetch.
-     * @return The ProfilingPointSummary object describing the specified profiling point.
-     */
-    public ProfilingPointSummary getProfilingPointSummary(String profilingPointName) {
-        return summaryMap.get(profilingPointName);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/PerformanceUtil.java b/web/dashboard/src/main/java/com/android/vts/util/PerformanceUtil.java
deleted file mode 100644
index 834d8e2..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/PerformanceUtil.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import java.io.IOException;
-import java.math.RoundingMode;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
-
-/** PerformanceUtil, a helper class for analyzing profiling and performance data. */
-public class PerformanceUtil {
-    protected static Logger logger = Logger.getLogger(PerformanceUtil.class.getName());
-
-    private static final DecimalFormat FORMATTER;
-    private static final String NAME_DELIMITER = ", ";
-
-    /**
-     * Initialize the decimal formatter.
-     */
-    static {
-        FORMATTER = new DecimalFormat("#.##");
-        FORMATTER.setRoundingMode(RoundingMode.HALF_UP);
-    }
-
-    public static class TimeInterval {
-        public final long start;
-        public final long end;
-        public final String label;
-
-        public TimeInterval(long start, long end, String label) {
-            this.start = start;
-            this.end = end;
-            this.label = label;
-        }
-
-        public TimeInterval(long start, long end) {
-            this(start, end, "<span class='date-label'>"
-                            + Long.toString(TimeUnit.MICROSECONDS.toMillis(end)) + "</span>");
-        }
-    }
-
-    /**
-     * Creates the HTML for a table cell representing the percent change between two numbers.
-     *
-     * <p>Computes the percent change (after - before)/before * 100 and inserts it into a table cell
-     * with the specified style. The color of the cell is white if 'after' is less than before.
-     * Otherwise, the cell is colored red with opacity according to the percent change (100%+ delta
-     * means 100% opacity). If the before value is 0 and the after value is positive, then the color
-     * of the cell is 100% red to indicate an increase of undefined magnitude.
-     *
-     * @param baseline The baseline value observed.
-     * @param test The value to compare against the baseline.
-     * @param classNames A string containing HTML classes to apply to the table cell.
-     * @param style A string containing additional CSS styles.
-     * @returns An HTML string for a colored table cell containing the percent change.
-     */
-    public static String getPercentChangeHTML(double baseline, double test, String classNames,
-            String style, VtsProfilingRegressionMode mode) {
-        String pctChangeString = "0 %";
-        double alpha = 0;
-        double delta = test - baseline;
-        if (baseline != 0) {
-            double pctChange = delta / baseline;
-            alpha = pctChange * 2;
-            pctChangeString = FORMATTER.format(pctChange * 100) + " %";
-        } else if (delta != 0) {
-            // If the percent change is undefined, the cell will be solid red or white
-            alpha = (int) Math.signum(delta); // get the sign of the delta (+1, 0, -1)
-            pctChangeString = "";
-        }
-        if (mode == VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING) {
-            alpha = -alpha;
-        }
-        String color = "background-color: rgba(255, 0, 0, " + alpha + "); ";
-        String html = "<td class='" + classNames + "' style='" + color + style + "'>";
-        html += pctChangeString + "</td>";
-        return html;
-    }
-
-    /**
-     * Compares a test StatSummary to a baseline StatSummary using best-case performance.
-     *
-     * @param baseline The StatSummary object containing initial values to compare against
-     * @param test The StatSummary object containing test values to be compared against the baseline
-     * @param innerClasses Class names to apply to cells on the inside of the grid
-     * @param outerClasses Class names to apply to cells on the outside of the grid
-     * @param innerStyles CSS styles to apply to cells on the inside of the grid
-     * @param outerStyles CSS styles to apply to cells on the outside of the grid
-     * @return HTML string representing the performance of the test versus the baseline
-     */
-    public static String getBestCasePerformanceComparisonHTML(StatSummary baseline,
-            StatSummary test, String innerClasses, String outerClasses, String innerStyles,
-            String outerStyles) {
-        if (test == null || baseline == null) {
-            return "<td></td><td></td><td></td><td></td>";
-        }
-        String row = "";
-        // Intensity of red color is a function of the relative (percent) change
-        // in the new value compared to the previous day's. Intensity is a linear function
-        // of percentage change, reaching a ceiling at 100% change (e.g. a doubling).
-        row += getPercentChangeHTML(baseline.getBestCase(), test.getBestCase(), innerClasses,
-                innerStyles, test.getRegressionMode());
-        row += "<td class='" + innerClasses + "' style='" + innerStyles + "'>";
-        row += FORMATTER.format(baseline.getBestCase());
-        row += "<td class='" + innerClasses + "' style='" + innerStyles + "'>";
-        row += FORMATTER.format(baseline.getMean());
-        row += "<td class='" + outerClasses + "' style='" + outerStyles + "'>";
-        row += FORMATTER.format(baseline.getStd()) + "</td>";
-        return row;
-    }
-
-    /**
-     * Compares a test StatSummary to a baseline StatSummary using average-case performance.
-     *
-     * @param baseline The StatSummary object containing initial values to compare against
-     * @param test The StatSummary object containing test values to be compared against the baseline
-     * @param innerClasses Class names to apply to cells on the inside of the grid
-     * @param outerClasses Class names to apply to cells on the outside of the grid
-     * @param innerStyles CSS styles to apply to cells on the inside of the grid
-     * @param outerStyles CSS styles to apply to cells on the outside of the grid
-     * @return HTML string representing the performance of the test versus the baseline
-     */
-    public static String getAvgCasePerformanceComparisonHTML(StatSummary baseline, StatSummary test,
-            String innerClasses, String outerClasses, String innerStyles, String outerStyles) {
-        if (test == null || baseline == null) {
-            return "<td></td><td></td><td></td><td></td>";
-        }
-        String row = "";
-        // Intensity of red color is a function of the relative (percent) change
-        // in the new value compared to the previous day's. Intensity is a linear function
-        // of percentage change, reaching a ceiling at 100% change (e.g. a doubling).
-        row += getPercentChangeHTML(baseline.getMean(), test.getMean(), innerClasses, innerStyles,
-                test.getRegressionMode());
-        row += "<td class='" + innerClasses + "' style='" + innerStyles + "'>";
-        row += FORMATTER.format(baseline.getBestCase());
-        row += "<td class='" + innerClasses + "' style='" + innerStyles + "'>";
-        row += FORMATTER.format(baseline.getMean());
-        row += "<td class='" + outerClasses + "' style='" + outerStyles + "'>";
-        row += FORMATTER.format(baseline.getStd()) + "</td>";
-        return row;
-    }
-
-    /**
-     * Updates a PerformanceSummary object with data in the specified window.
-     *
-     * @param testName The name of the table whose profiling vectors to retrieve.
-     * @param startTime The (inclusive) start time in microseconds to scan from.
-     * @param endTime The (inclusive) end time in microseconds at which to stop scanning.
-     * @param selectedDevice The name of the device whose data to query for, or null for unfiltered.
-     * @param perfSummary The PerformanceSummary object to update with data.
-     * @throws IOException
-     */
-    public static void updatePerformanceSummary(String testName, long startTime, long endTime,
-            String selectedDevice, PerformanceSummary perfSummary) throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, testName);
-        Filter testTypeFilter = FilterUtil.getTestTypeFilter(false, true, false);
-        Filter runFilter = FilterUtil.getTimeFilter(testKey, startTime, endTime, testTypeFilter);
-
-        Filter deviceFilter = null;
-        if (selectedDevice != null) {
-            deviceFilter = new FilterPredicate(
-                    DeviceInfoEntity.PRODUCT, FilterOperator.EQUAL, selectedDevice);
-        }
-        Query testRunQuery = new Query(TestRunEntity.KIND)
-                                     .setAncestor(testKey)
-                                     .setFilter(runFilter)
-                                     .setKeysOnly();
-        for (Entity testRun : datastore.prepare(testRunQuery).asIterable()) {
-            if (deviceFilter != null) {
-                Query deviceQuery = new Query(DeviceInfoEntity.KIND)
-                                            .setAncestor(testRun.getKey())
-                                            .setFilter(deviceFilter)
-                                            .setKeysOnly();
-                if (!DatastoreHelper.hasEntities(deviceQuery))
-                    continue;
-            }
-            Query q = new Query(ProfilingPointRunEntity.KIND).setAncestor(testRun.getKey());
-
-            for (Entity profilingRun : datastore.prepare(q).asIterable()) {
-                perfSummary.addData(profilingRun);
-            }
-        }
-    }
-
-    /**
-     * Generates a string of the values in optionsList which have matches in the profiling entity.
-     *
-     * @param profilingRun The entity for a profiling point run.
-     * @param optionKeys A list of keys to match against the optionsList key value pairs.
-     * @return The values in optionsList whose key match a key in optionKeys.
-     */
-    public static String getOptionAlias(Entity profilingRun, Set<String> optionKeys) {
-        String name = "";
-        List<String> nameSuffixes = new ArrayList<String>();
-        for (String key : optionKeys) {
-            if (profilingRun.hasProperty(key)) {
-                try {
-                    nameSuffixes.add((String) profilingRun.getProperty(key));
-                } catch (ClassCastException e) {
-                    continue;
-                }
-            }
-        }
-        if (nameSuffixes.size() > 0) {
-            StringUtils.join(nameSuffixes, NAME_DELIMITER);
-            name += StringUtils.join(nameSuffixes, NAME_DELIMITER);
-        }
-        return name;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/ProfilingPointSummary.java b/web/dashboard/src/main/java/com/android/vts/util/ProfilingPointSummary.java
deleted file mode 100644
index 6e3e8c9..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/ProfilingPointSummary.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/** Represents statistical summaries of each profiling point. */
-public class ProfilingPointSummary implements Iterable<StatSummary> {
-    private List<StatSummary> statSummaries;
-    private Map<String, Integer> labelIndices;
-    private List<String> labels;
-    private VtsProfilingRegressionMode regressionMode;
-    public String xLabel;
-    public String yLabel;
-
-    /** Initializes the summary with empty arrays. */
-    public ProfilingPointSummary() {
-        statSummaries = new ArrayList<>();
-        labelIndices = new HashMap<>();
-        labels = new ArrayList<>();
-    }
-
-    /**
-     * Determines if a data label is present in the profiling point.
-     *
-     * @param label The name of the label.
-     * @return true if the label is present, false otherwise.
-     */
-    public boolean hasLabel(String label) {
-        return labelIndices.containsKey(label);
-    }
-
-    /**
-     * Gets the statistical summary for a specified data label.
-     *
-     * @param label The name of the label.
-     * @return The StatSummary object if it exists, or null otherwise.
-     */
-    public StatSummary getStatSummary(String label) {
-        if (!hasLabel(label))
-            return null;
-        return statSummaries.get(labelIndices.get(label));
-    }
-
-    /**
-     * Gets the last-seen regression mode.
-     *
-     * @return The VtsProfilingRegressionMode value.
-     */
-    public VtsProfilingRegressionMode getRegressionMode() {
-        return regressionMode;
-    }
-
-    /**
-     * Updates the profiling summary with the data from a new profiling report.
-     *
-     * @param profilingRun The profiling point run entity object containing profiling data.
-     */
-    public void update(ProfilingPointRunEntity profilingRun) {
-        for (int i = 0; i < profilingRun.labels.size(); i++) {
-            String label = profilingRun.labels.get(i);
-            if (!labelIndices.containsKey(label)) {
-                StatSummary summary = new StatSummary(label, profilingRun.regressionMode);
-                labelIndices.put(label, statSummaries.size());
-                statSummaries.add(summary);
-            }
-            StatSummary summary = getStatSummary(label);
-            summary.updateStats(profilingRun.values.get(i));
-        }
-        this.regressionMode = profilingRun.regressionMode;
-        this.labels = profilingRun.labels;
-        this.xLabel = profilingRun.xLabel;
-        this.yLabel = profilingRun.yLabel;
-    }
-
-    /**
-     * Updates the profiling summary at a label with the data from a new profiling report.
-     *
-     * <p>Updates the summary specified by the label with all values provided in the report. If
-     * labels
-     * are provided in the report, they will be ignored -- all values are updated only to the
-     * provided
-     * label.
-     *
-     * @param profilingEntity The ProfilingPointRunEntity object containing profiling data.
-     * @param label The ByteString label for which all values in the report will be updated.
-     */
-    public void updateLabel(ProfilingPointRunEntity profilingEntity, String label) {
-        if (!labelIndices.containsKey(label)) {
-            StatSummary summary = new StatSummary(label, profilingEntity.regressionMode);
-            labelIndices.put(label, labels.size());
-            labels.add(label);
-            statSummaries.add(summary);
-        }
-        StatSummary summary = getStatSummary(label);
-        for (long value : profilingEntity.values) {
-            summary.updateStats(value);
-        }
-        this.regressionMode = profilingEntity.regressionMode;
-        this.xLabel = profilingEntity.xLabel;
-        this.yLabel = profilingEntity.yLabel;
-    }
-
-    /**
-     * Gets an iterator that returns stat summaries in the ordered the labels were specified in the
-     * ProfilingReportMessage objects.
-     */
-    @Override
-    public Iterator<StatSummary> iterator() {
-        Iterator<StatSummary> it = new Iterator<StatSummary>() {
-            private int currentIndex = 0;
-
-            @Override
-            public boolean hasNext() {
-                return labels != null && currentIndex < labels.size();
-            }
-
-            @Override
-            public StatSummary next() {
-                String label = labels.get(currentIndex++);
-                return statSummaries.get(labelIndices.get(label));
-            }
-        };
-        return it;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/StatSummary.java b/web/dashboard/src/main/java/com/android/vts/util/StatSummary.java
deleted file mode 100644
index 04db7c4..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/StatSummary.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-
-/** Helper object for storing statistics. */
-public class StatSummary {
-    private String label;
-    private double min;
-    private double max;
-    private double mean;
-    private double var;
-    private int n;
-    private VtsProfilingRegressionMode regression_mode;
-
-    /**
-     * Initializes the statistical summary.
-     *
-     * <p>Sets the label as provided. Initializes the mean, variance, and n (number of values seen)
-     * to
-     * 0.
-     *
-     * @param label The (String) label to assign to the summary.
-     * @param mode The VtsProfilingRegressionMode to use when analyzing performance.
-     */
-    public StatSummary(String label, VtsProfilingRegressionMode mode) {
-        this.label = label;
-        this.min = Double.MAX_VALUE;
-        this.max = Double.MIN_VALUE;
-        this.mean = 0;
-        this.var = 0;
-        this.n = 0;
-        this.regression_mode = mode;
-    }
-
-    /**
-     * Update the mean and variance using Welford's single-pass method.
-     *
-     * @param value The observed value in the stream.
-     */
-    public void updateStats(double value) {
-        n += 1;
-        double oldMean = mean;
-        mean = oldMean + (value - oldMean) / n;
-        var = var + (value - mean) * (value - oldMean);
-        if (value < min)
-            min = value;
-        if (value > max)
-            max = value;
-    }
-
-    /**
-     * Gets the best case of the stream.
-     *
-     * @return The min or max.
-     */
-    public double getBestCase() {
-        switch (regression_mode) {
-            case VTS_REGRESSION_MODE_DECREASING:
-                return getMax();
-            default:
-                return getMin();
-        }
-    }
-
-    /**
-     * Gets the calculated min of the stream.
-     *
-     * @return The min.
-     */
-    public double getMin() {
-        return min;
-    }
-
-    /**
-     * Gets the calculated max of the stream.
-     *
-     * @return The max.
-     */
-    public double getMax() {
-        return max;
-    }
-
-    /**
-     * Gets the calculated mean of the stream.
-     *
-     * @return The mean.
-     */
-    public double getMean() {
-        return mean;
-    }
-
-    /**
-     * Gets the calculated standard deviation of the stream.
-     *
-     * @return The standard deviation.
-     */
-    public double getStd() {
-        return Math.sqrt(var / (n - 1));
-    }
-
-    /**
-     * Gets the number of elements that have passed through the stream.
-     *
-     * @return Number of elements.
-     */
-    public int getCount() {
-        return n;
-    }
-
-    /**
-     * Gets the label for the summarized statistics.
-     *
-     * @return The (string) label.
-     */
-    public String getLabel() {
-        return label;
-    }
-
-    /**
-     * Gets the regression mode.
-     *
-     * @return The VtsProfilingRegressionMode value.
-     */
-    public VtsProfilingRegressionMode getRegressionMode() {
-        return regression_mode;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/TestResults.java b/web/dashboard/src/main/java/com/android/vts/util/TestResults.java
deleted file mode 100644
index f2dbdb9..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/TestResults.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestCaseRunEntity.TestCase;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.UrlUtil.LinkDisplay;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
-
-/** Helper object for describing test results data. */
-public class TestResults {
-    private final Logger logger = Logger.getLogger(getClass().getName());
-
-    private List<TestRunEntity> testRuns; // list of all test runs
-    private Map<Key, List<TestCaseRunEntity>>
-            testCaseRunMap; // map from test run key to the test run information
-    private Map<Key, List<DeviceInfoEntity>> deviceInfoMap; // map from test run key to device info
-    private Map<String, Integer> testCaseNameMap; // map from test case name to its order
-    private Set<String> profilingPointNameSet; // set of profiling point names
-
-    public String testName;
-    public String[] headerRow; // row to display above the test results table
-    public String[][] timeGrid; // grid of data storing timestamps to render as dates
-    public String[][] durationGrid; // grid of data storing timestamps to render as time intervals
-    public String[][] summaryGrid; // grid of data displaying a summary of the test run
-    public String[][] resultsGrid; // grid of data displaying test case results
-    public String[] profilingPointNames; // list of profiling point names in the test run
-    public Map<String, List<String[]>> logInfoMap; // map from test run index to url/display pairs
-    public int[] totResultCounts; // array of test result counts for the tip-of-tree runs
-    public String totBuildId = ""; // build ID of tip-of-tree run
-    public long startTime = Long.MAX_VALUE; // oldest timestamp displayed in the results table
-    public long endTime = Long.MIN_VALUE; // newest timestamp displayed in the results table
-
-    // Row labels for the test time-formatted information.
-    private static final String[] TIME_INFO_NAMES = {"Test Start", "Test End"};
-
-    // Row labels for the test duration information.
-    private static final String[] DURATION_INFO_NAMES = {"<b>Test Duration</b>"};
-
-    // Row labels for the test summary grid.
-    private static final String[] SUMMARY_NAMES = {"Total", "Passing #", "Non-Passing #",
-            "Passing %", "Covered Lines", "Coverage %", "Logs"};
-
-    // Row labels for the device summary information in the table header.
-    private static final String[] HEADER_NAMES = {"<b>Stats Type \\ Device Build ID</b>", "Branch",
-            "Build Target", "Device", "ABI Target", "VTS Build ID", "Hostname"};
-
-    /**
-     * Create a test results object.
-     *
-     * @param testName The name of the test.
-     */
-    public TestResults(String testName) {
-        this.testName = testName;
-        this.testRuns = new ArrayList<>();
-        this.deviceInfoMap = new HashMap<>();
-        this.testCaseRunMap = new HashMap<>();
-        this.testCaseNameMap = new HashMap<>();
-        this.logInfoMap = new HashMap<>();
-        this.profilingPointNameSet = new HashSet<>();
-    }
-
-    /**
-     * Add a test run to the test results.
-     *
-     * @param testRun The Entity containing the test run information.
-     * @param testCaseRuns The collection of test case executions within the test run.
-     * @param deviceInfos The collection of device information entities for the test run.
-     * @param profilingPoints The collection of profiling point names for the test run.
-     */
-    public void addTestRun(Entity testRun, Iterable<Entity> testCaseRuns,
-            Iterable<Entity> deviceInfos, Iterable<Entity> profilingPoints) {
-        // Process the devices in the test run
-        List<DeviceInfoEntity> devices = new ArrayList<>();
-        for (Entity e : deviceInfos) {
-            DeviceInfoEntity deviceInfoEntity = DeviceInfoEntity.fromEntity(e);
-            if (deviceInfoEntity == null)
-                continue;
-            devices.add(deviceInfoEntity);
-        }
-
-        // Filter out test runs lacking device information
-        if (devices.size() == 0) {
-            logger.log(Level.WARNING, "No device info found for run: " + testRun.getKey());
-            return;
-        }
-        deviceInfoMap.put(testRun.getKey(), devices);
-
-        TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRun);
-        if (testRunEntity == null)
-            return;
-        if (testRunEntity.startTimestamp < startTime) {
-            startTime = testRunEntity.startTimestamp;
-        }
-        if (testRunEntity.endTimestamp > endTime) {
-            endTime = testRunEntity.endTimestamp;
-        }
-        testRuns.add(testRunEntity);
-        testCaseRunMap.put(testRun.getKey(), new ArrayList<TestCaseRunEntity>());
-
-        // Process the test cases in the test run
-        for (Entity e : testCaseRuns) {
-            TestCaseRunEntity testCaseRunEntity = TestCaseRunEntity.fromEntity(e);
-            if (testCaseRunEntity == null)
-                continue;
-            testCaseRunMap.get(testRun.getKey()).add(testCaseRunEntity);
-            for (TestCase testCase : testCaseRunEntity.testCases) {
-                if (!testCaseNameMap.containsKey(testCase.name)) {
-                    testCaseNameMap.put(testCase.name, testCaseNameMap.size());
-                }
-            }
-        }
-
-        // Process the profiling point observations in the test run
-        for (Entity e : profilingPoints) {
-            if (e.getKey().getName() != null) {
-                profilingPointNameSet.add(e.getKey().getName());
-            }
-        }
-    }
-
-    /** Creates a test case breakdown of the most recent test run. */
-    private void generateToTBreakdown() {
-        totResultCounts = new int[TestCaseResult.values().length];
-        if (testRuns.size() == 0)
-            return;
-
-        TestRunEntity mostRecentRun = testRuns.get(0);
-        List<TestCaseRunEntity> testCaseResults = testCaseRunMap.get(mostRecentRun.key);
-        List<DeviceInfoEntity> deviceInfos = deviceInfoMap.get(mostRecentRun.key);
-        if (deviceInfos.size() > 0) {
-            DeviceInfoEntity totDevice = deviceInfos.get(0);
-            totBuildId = totDevice.buildId;
-        }
-        // Count array for each test result
-        for (TestCaseRunEntity testCaseRunEntity : testCaseResults) {
-            for (TestCase testCase : testCaseRunEntity.testCases) {
-                totResultCounts[testCase.result]++;
-            }
-        }
-    }
-
-    /**
-     * Get the number of test runs observed.
-     *
-     * @return The number of test runs observed.
-     */
-    public int getSize() {
-        return testRuns.size();
-    }
-
-    /** Post-process the test runs to generate reports of the results. */
-    public void processReport() {
-        Comparator<TestRunEntity> comparator = new Comparator<TestRunEntity>() {
-            @Override
-            public int compare(TestRunEntity t1, TestRunEntity t2) {
-                return new Long(t2.startTimestamp).compareTo(t1.startTimestamp);
-            }
-        };
-        Collections.sort(testRuns, comparator);
-        generateToTBreakdown();
-
-        headerRow = new String[testRuns.size() + 1];
-        headerRow[0] = StringUtils.join(HEADER_NAMES, "<br>");
-
-        summaryGrid = new String[SUMMARY_NAMES.length][testRuns.size() + 1];
-        for (int i = 0; i < SUMMARY_NAMES.length; i++) {
-            summaryGrid[i][0] = "<b>" + SUMMARY_NAMES[i] + "</b>";
-        }
-
-        timeGrid = new String[TIME_INFO_NAMES.length][testRuns.size() + 1];
-        for (int i = 0; i < TIME_INFO_NAMES.length; i++) {
-            timeGrid[i][0] = "<b>" + TIME_INFO_NAMES[i] + "</b>";
-        }
-
-        durationGrid = new String[DURATION_INFO_NAMES.length][testRuns.size() + 1];
-        for (int i = 0; i < DURATION_INFO_NAMES.length; i++) {
-            durationGrid[i][0] = "<b>" + DURATION_INFO_NAMES[i] + "</b>";
-        }
-
-        resultsGrid = new String[testCaseNameMap.size()][testRuns.size() + 1];
-        // first column for results grid
-        for (String testCaseName : testCaseNameMap.keySet()) {
-            resultsGrid[testCaseNameMap.get(testCaseName)][0] = testCaseName;
-        }
-
-        // Iterate through the test runs
-        for (int col = 0; col < testRuns.size(); col++) {
-            TestRunEntity testRun = testRuns.get(col);
-
-            // Process the device information
-            List<DeviceInfoEntity> devices = deviceInfoMap.get(testRun.key);
-            List<String> buildIdList = new ArrayList<>();
-            List<String> buildAliasList = new ArrayList<>();
-            List<String> buildFlavorList = new ArrayList<>();
-            List<String> productVariantList = new ArrayList<>();
-            List<String> abiInfoList = new ArrayList<>();
-            for (DeviceInfoEntity deviceInfoEntity : devices) {
-                buildAliasList.add(deviceInfoEntity.branch);
-                buildFlavorList.add(deviceInfoEntity.buildFlavor);
-                productVariantList.add(deviceInfoEntity.product);
-                buildIdList.add(deviceInfoEntity.buildId);
-                String abi = "";
-                String abiName = deviceInfoEntity.abiName;
-                String abiBitness = deviceInfoEntity.abiBitness;
-                if (abiName.length() > 0) {
-                    abi += abiName;
-                    if (abiBitness.length() > 0) {
-                        abi += " (" + abiBitness + " bit)";
-                    }
-                }
-                abiInfoList.add(abi);
-            }
-
-            String buildAlias = StringUtils.join(buildAliasList, ",");
-            String buildFlavor = StringUtils.join(buildFlavorList, ",");
-            String productVariant = StringUtils.join(productVariantList, ",");
-            String buildIds = StringUtils.join(buildIdList, ",");
-            String abiInfo = StringUtils.join(abiInfoList, ",");
-            String vtsBuildId = testRun.testBuildId;
-
-            int passCount = (int) testRun.passCount;
-            int nonpassCount = (int) testRun.failCount;
-            TestCaseResult aggregateStatus = TestCaseResult.UNKNOWN_RESULT;
-            long totalLineCount = testRun.totalLineCount;
-            long coveredLineCount = testRun.coveredLineCount;
-
-            // Process test case results
-            for (TestCaseRunEntity testCaseEntity : testCaseRunMap.get(testRun.key)) {
-                // Update the aggregated test run status
-                for (TestCase testCase : testCaseEntity.testCases) {
-                    int result = testCase.result;
-                    String name = testCase.name;
-                    if (result == TestCaseResult.TEST_CASE_RESULT_PASS.getNumber()) {
-                        if (aggregateStatus == TestCaseResult.UNKNOWN_RESULT) {
-                            aggregateStatus = TestCaseResult.TEST_CASE_RESULT_PASS;
-                        }
-                    } else if (result != TestCaseResult.TEST_CASE_RESULT_SKIP.getNumber()) {
-                        aggregateStatus = TestCaseResult.TEST_CASE_RESULT_FAIL;
-                    }
-
-                    String systraceUrl = null;
-
-                    if (testCaseEntity.getSystraceUrl() != null) {
-                        String url = testCaseEntity.getSystraceUrl();
-                        LinkDisplay validatedLink = UrlUtil.processUrl(url);
-                        if (validatedLink != null) {
-                            systraceUrl = validatedLink.url;
-                        } else {
-                            logger.log(Level.WARNING, "Invalid systrace URL : " + url);
-                        }
-                    }
-
-                    int index = testCaseNameMap.get(name);
-                    String classNames = "test-case-status ";
-                    String glyph = "";
-                    TestCaseResult testCaseResult = TestCaseResult.valueOf(result);
-                    if (testCaseResult != null)
-                        classNames += testCaseResult.toString();
-                    else
-                        classNames += TestCaseResult.UNKNOWN_RESULT.toString();
-
-                    if (systraceUrl != null) {
-                        classNames += " width-1";
-                        glyph += "<a href=\"" + systraceUrl + "\" "
-                                + "class=\"waves-effect waves-light btn red right inline-btn\">"
-                                + "<i class=\"material-icons inline-icon\">info_outline</i></a>";
-                    }
-                    resultsGrid[index][col + 1] =
-                            "<div class=\"" + classNames + "\">&nbsp;</div>" + glyph;
-                }
-            }
-            String passInfo;
-            try {
-                double passPct =
-                        Math.round((100 * passCount / (passCount + nonpassCount)) * 100f) / 100f;
-                passInfo = Double.toString(passPct) + "%";
-            } catch (ArithmeticException e) {
-                passInfo = " - ";
-            }
-
-            // Process coverage metadata
-            String coverageInfo;
-            String coveragePctInfo;
-            try {
-                double coveragePct =
-                        Math.round((100 * coveredLineCount / totalLineCount) * 100f) / 100f;
-                coveragePctInfo = Double.toString(coveragePct) + "%"
-                        + "<a href=\"/show_coverage?testName=" + testName + "&startTime="
-                        + testRun.startTimestamp
-                        + "\" class=\"waves-effect waves-light btn red right inline-btn\">"
-                        + "<i class=\"material-icons inline-icon\">menu</i></a>";
-                coverageInfo = coveredLineCount + "/" + totalLineCount;
-            } catch (ArithmeticException e) {
-                coveragePctInfo = " - ";
-                coverageInfo = " - ";
-            }
-
-            // Process log information
-            String logSummary = " - ";
-            List<String[]> logEntries = new ArrayList<>();
-            logInfoMap.put(Integer.toString(col), logEntries);
-
-            if (testRun.logLinks != null) {
-                for (String rawUrl : testRun.logLinks) {
-                    LinkDisplay validatedLink = UrlUtil.processUrl(rawUrl);
-                    if (validatedLink == null) {
-                        logger.log(Level.WARNING, "Invalid logging URL : " + rawUrl);
-                        continue;
-                    }
-                    String[] logInfo = new String[] {
-                            validatedLink.name,
-                            validatedLink.url // TODO: process the name from the URL
-                    };
-                    logEntries.add(logInfo);
-                }
-            }
-            if (logEntries.size() > 0) {
-                logSummary = Integer.toString(logEntries.size());
-                logSummary += "<i class=\"waves-effect waves-light btn red right inline-btn"
-                        + " info-btn material-icons inline-icon\""
-                        + " data-col=\"" + Integer.toString(col) + "\""
-                        + ">launch</i>";
-            }
-
-            String icon = "<div class='status-icon " + aggregateStatus.toString() + "'>&nbsp</div>";
-            String hostname = testRun.hostName;
-
-            // Populate the header row
-            headerRow[col + 1] = "<span class='valign-wrapper'><b>" + buildIds + "</b>" + icon
-                    + "</span>" + buildAlias + "<br>" + buildFlavor + "<br>" + productVariant
-                    + "<br>" + abiInfo + "<br>" + vtsBuildId + "<br>" + hostname;
-
-            // Populate the test summary grid
-            summaryGrid[0][col + 1] = Integer.toString(testCaseRunMap.get(testRun.key).size());
-            summaryGrid[1][col + 1] = Integer.toString(passCount);
-            summaryGrid[2][col + 1] = Integer.toString(nonpassCount);
-            summaryGrid[3][col + 1] = passInfo;
-            summaryGrid[4][col + 1] = coverageInfo;
-            summaryGrid[5][col + 1] = coveragePctInfo;
-            summaryGrid[6][col + 1] = logSummary;
-
-            // Populate the test time info grid
-            timeGrid[0][col + 1] = Long.toString(testRun.startTimestamp);
-            timeGrid[1][col + 1] = Long.toString(testRun.endTimestamp);
-
-            // Populate the test duration info grid
-            durationGrid[0][col + 1] = Long.toString(testRun.endTimestamp - testRun.startTimestamp);
-        }
-
-        profilingPointNames =
-                profilingPointNameSet.toArray(new String[profilingPointNameSet.size()]);
-        Arrays.sort(profilingPointNames);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/TestRunDetails.java b/web/dashboard/src/main/java/com/android/vts/util/TestRunDetails.java
deleted file mode 100644
index 41e20c4..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/TestRunDetails.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestCaseRunEntity.TestCase;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/** Helper object for describing test results data. */
-public class TestRunDetails {
-    private static final String NAME_KEY = "name";
-    private static final String DATA_KEY = "data";
-
-    private class ResultColumn {
-        private final String name;
-        private final List<String> testCases;
-
-        public ResultColumn(String name) {
-            this.name = name;
-            this.testCases = new ArrayList<>();
-        }
-
-        public void add(String testCase) {
-            this.testCases.add(testCase);
-        }
-
-        public int size() {
-            return this.testCases.size();
-        }
-
-        public JsonObject toJson() {
-            Collections.sort(testCases);
-            JsonObject json = new JsonObject();
-            json.add(NAME_KEY, new JsonPrimitive(name));
-            json.add(DATA_KEY, new Gson().toJsonTree(testCases));
-            return json;
-        }
-    }
-
-    private final ResultColumn[] columns;
-    public final int[] resultCounts = new int[TestCaseResult.values().length];
-
-    public TestRunDetails() {
-        columns = new ResultColumn[TestCaseResult.values().length];
-        for (TestCaseResult r : TestCaseResult.values()) {
-            columns[r.getNumber()] = new ResultColumn(r.name());
-        }
-    }
-
-    /**
-     * Add a test case entity to the details object.
-     * @param testCaseEntity The TestCaseRunEntity object storing test case results.
-     */
-    public void addTestCase(TestCaseRunEntity testCaseEntity) {
-        for (TestCase testCase : testCaseEntity.testCases) {
-            int result = testCase.result;
-            if (result > resultCounts.length)
-                continue;
-            ++resultCounts[result];
-            ResultColumn column = columns[result];
-            column.add(testCase.name);
-        }
-    }
-
-    /**
-     * Serializes the test run details to json format.
-     *
-     * @return A JsonObject object representing the details object.
-     */
-    public JsonElement toJson() {
-        List<JsonObject> jsonColumns = new ArrayList<>();
-        for (ResultColumn column : columns) {
-            if (column.size() > 0) {
-                jsonColumns.add(column.toJson());
-            }
-        }
-        return new Gson().toJsonTree(jsonColumns);
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/TestRunMetadata.java b/web/dashboard/src/main/java/com/android/vts/util/TestRunMetadata.java
deleted file mode 100644
index 0cc375c..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/TestRunMetadata.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Query;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.lang.StringUtils;
-
-/** Helper object for describing test results data. */
-public class TestRunMetadata {
-    private static final String TEST_RUN = "testRun";
-    private static final String TEST_DETAILS = "testDetails";
-    private static final String DEVICE_INFO = "deviceInfo";
-    private static final String ABI_INFO = "abiInfo";
-
-    public final TestRunEntity testRun;
-
-    private String deviceInfo;
-    private String abiInfo;
-    private TestRunDetails details;
-
-    /**
-     * Create a test metadata object.
-     *
-     * @param testName The name of the test.
-     */
-    public TestRunMetadata(String testName, TestRunEntity testRun) {
-        this.testRun = testRun;
-        this.deviceInfo = "";
-        this.abiInfo = "";
-        this.details = null;
-        processDeviceInfo();
-    }
-
-    /**
-     * Get device information for the test run and add it to the metadata message.
-     */
-    private void processDeviceInfo() {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Query deviceInfoQuery = new Query(DeviceInfoEntity.KIND).setAncestor(testRun.key);
-        List<String> deviceInfoList = new ArrayList<>();
-        List<String> abiInfoList = new ArrayList<>();
-
-        for (Entity device : datastore.prepare(deviceInfoQuery).asIterable()) {
-            DeviceInfoEntity deviceInfoEntity = DeviceInfoEntity.fromEntity(device);
-            if (deviceInfoEntity == null) {
-                continue;
-            }
-            String abi = "";
-            String abiName = deviceInfoEntity.abiName;
-            String abiBitness = deviceInfoEntity.abiBitness;
-            if (abiName.length() > 0) {
-                abi += abiName;
-                if (abiBitness.length() > 0) {
-                    abi += " (" + abiBitness + " bit)";
-                }
-            }
-            abiInfoList.add(abi);
-            deviceInfoList.add(deviceInfoEntity.branch + "/" + deviceInfoEntity.buildFlavor + " ("
-                    + deviceInfoEntity.buildId + ")");
-        }
-        this.abiInfo = StringUtils.join(abiInfoList, ", ");
-        this.deviceInfo = StringUtils.join(deviceInfoList, ", ");
-    }
-
-    /**
-     * Get the device info string in the test metadata.
-     * @return The string descriptor of the devices used in the test run.
-     */
-    public String getDeviceInfo() {
-        return this.deviceInfo;
-    }
-
-    /**
-     * Get the test run details (e.g. test case information) for the test run.
-     * @return The TestRunDetails object stored in the metadata, or null if not set.
-     */
-    public TestRunDetails getDetails() {
-        return this.details;
-    }
-
-    /**
-     * Add test case details to the metadata object.
-     *
-     * Used for prefetching details on initial page load.
-     * @param details The TestRunDetails object storing test case results for the test run.
-     */
-    public void addDetails(TestRunDetails details) {
-        this.details = details;
-    }
-
-    /**
-     * Serializes the test run metadata to json format.
-     *
-     * @return A JsonElement object representing the details object.
-     */
-    public JsonObject toJson() {
-        JsonObject json = new JsonObject();
-        json.add(DEVICE_INFO, new JsonPrimitive(this.deviceInfo));
-        json.add(ABI_INFO, new JsonPrimitive(this.abiInfo));
-        json.add(TEST_RUN, this.testRun.toJson());
-        if (this.details != null) {
-            json.add(TEST_DETAILS, this.details.toJson());
-        }
-        return json;
-    }
-}
diff --git a/web/dashboard/src/main/java/com/android/vts/util/UrlUtil.java b/web/dashboard/src/main/java/com/android/vts/util/UrlUtil.java
deleted file mode 100644
index 03c23eb..0000000
--- a/web/dashboard/src/main/java/com/android/vts/util/UrlUtil.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.vts.util;
-
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-/** UrlUtil, a helper class for formatting and validating URLs. */
-public class UrlUtil {
-    private static final String HTTPS = "https";
-
-    public static class LinkDisplay {
-        public final String name;
-        public final String url;
-
-        /**
-         * Create a link display object.
-         *
-         * @param uri The hyperlink URI.
-         */
-        public LinkDisplay(URI uri) {
-            this.url = uri.toString();
-
-            // Parse the name from the URI path
-            int lastSeparator = uri.getPath().lastIndexOf('/');
-            if (lastSeparator < 0) {
-                this.name = uri.toString();
-            } else {
-                this.name = uri.getPath().substring(lastSeparator + 1);
-            }
-        }
-    }
-
-    /**
-     * Validates and formats a URL.
-     *
-     * <p>Ensures that the protocol is HTTPs and the URL is properly formatted. This avoids link
-     * issues in the UI and possible vulnerabilities due to embedded JS in URLs.
-     *
-     * @param urlString The url string to validate.
-     * @returns The validated LinkDisplay object.
-     */
-    public static LinkDisplay processUrl(String urlString) {
-        try {
-            URL url = new URL(urlString);
-            String scheme = url.getProtocol();
-            String userInfo = url.getUserInfo();
-            String host = url.getHost();
-            int port = url.getPort();
-            String path = url.getPath();
-            String query = url.getQuery();
-            String fragment = url.getRef();
-            if (!url.getProtocol().equals(HTTPS))
-                throw new MalformedURLException();
-            URI uri = new URI(scheme, userInfo, host, port, path, query, fragment);
-            return new LinkDisplay(uri);
-        } catch (MalformedURLException | URISyntaxException e) {
-            return null;
-        }
-    }
-}
diff --git a/web/dashboard/src/main/webapp/WEB-INF/appengine-web.xml b/web/dashboard/src/main/webapp/WEB-INF/appengine-web.xml
deleted file mode 100644
index 6c7632c..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/appengine-web.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2016 Google Inc.
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-        http://www.apache.org/licenses/LICENSE-2.0
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
-  <application>s~google.com:android-vts-staging</application>
-  <version>4</version>
-  <threadsafe>true</threadsafe>
-
-  <system-properties>
-    <property name="EMAIL_DOMAIN" value="${appengine.emailDomain}" />
-    <property name="SENDER_EMAIL" value="${appengine.senderEmail}" />
-    <property name="DEFAULT_EMAIL" value="${appengine.defaultEmail}" />
-    <property name="SERVICE_CLIENT_ID" value="${appengine.serviceClientID}" />
-    <property name="CLIENT_ID" value="${appengine.clientID}" />
-    <property name="GERRIT_URI" value="${gerrit.uri}" />
-    <property name="GERRIT_SCOPE" value="${gerrit.scope}" />
-    <property name="ANALYTICS_ID" value="${analytics.id}" />
-  </system-properties>
-
-</appengine-web-app>
\ No newline at end of file
diff --git a/web/dashboard/src/main/webapp/WEB-INF/cron.xml b/web/dashboard/src/main/webapp/WEB-INF/cron.xml
deleted file mode 100644
index d8dc49e..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/cron.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright 2016 Google Inc. All Rights Reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<cronentries>
-  <cron>
-    <url>/cron/vts_alert_job</url>
-    <description>Send test failure emails.</description>
-    <schedule>every 2 minutes</schedule>
-  </cron>
-  <cron>
-    <url>/cron/vts_performance_job</url>
-    <description>Send daily performance digests.</description>
-    <schedule>every day 07:30</schedule>
-    <timezone>America/Los_Angeles</timezone>
-  </cron>
-</cronentries>
\ No newline at end of file
diff --git a/web/dashboard/src/main/webapp/WEB-INF/datastore-indexes.xml b/web/dashboard/src/main/webapp/WEB-INF/datastore-indexes.xml
deleted file mode 100644
index b913801..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/datastore-indexes.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2017 Google Inc.
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-        http://www.apache.org/licenses/LICENSE-2.0
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<datastore-indexes autoGenerate="true">
-
-  <datastore-index kind="TestPlanRun" ancestor="true" source="manual">
-    <property name="type" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestPlanRun" ancestor="true" source="manual">
-    <property name="type" direction="asc"/>
-    <property name="__key__" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestPlanRun" ancestor="true" source="manual">
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="Test" ancestor="false" source="manual">
-    <property name="failCount" direction="asc"/>
-    <property name="passCount" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="type" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="type" direction="asc"/>
-    <property name="__key__" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="false" source="manual">
-    <property name="testName" direction="asc"/>
-    <property name="startTimestamp" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="false" source="manual">
-    <property name="testName" direction="asc"/>
-    <property name="startTimestamp" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="false" source="manual">
-    <property name="testName" direction="asc"/>
-    <property name="type" direction="asc"/>
-    <property name="startTimestamp" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="false" source="manual">
-    <property name="testName" direction="asc"/>
-    <property name="type" direction="asc"/>
-    <property name="startTimestamp" direction="desc"/>
-  </datastore-index>
-
-</datastore-indexes>
\ No newline at end of file
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/dashboard_main.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/dashboard_main.jsp
deleted file mode 100644
index 3b72110..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/dashboard_main.jsp
+++ /dev/null
@@ -1,177 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <link rel='stylesheet' href='/css/dashboard_main.css'>
-  <%@ include file='header.jsp' %>
-  <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.0/jquery-ui.min.js'></script>
-  <body>
-    <script>
-        var allTests = ${allTestsJson};
-        var testSet = new Set(allTests);
-        var subscriptionMap = ${subscriptionMapJson};
-
-        var addFavorite = function() {
-            if ($(this).hasClass('disabled')) {
-                return;
-            }
-            var test = $('#input-box').val();
-            if (!testSet.has(test) || test in subscriptionMap) {
-                return;
-            }
-            $('#add-button').addClass('disabled');
-            $.post('/api/favorites/' + test).then(function(data) {
-                if (!data.key) {
-                    return;
-                }
-                subscriptionMap[test] = data.key;
-                var wrapper = $('<div></div>');
-                var a = $('<a></a>')
-                    .attr('href', '/show_table?testName=' + test);
-                var div = $('<div class="col s11 card hoverable option"></div>');
-                div.addClass('valign-wrapper waves-effect');
-                div.appendTo(a);
-                var span = $('<span class="entry valign"></span>').text(test);
-                span.appendTo(div);
-                a.appendTo(wrapper);
-                var clear = $('<a class="col s1 btn-flat center"></a>');
-                clear.addClass('clear-button');
-                clear.append('<i class="material-icons">clear</i>');
-                clear.attr('test', test);
-                clear.appendTo(wrapper);
-                clear.click(removeFavorite);
-                wrapper.prependTo('#options').hide()
-                                          .slideDown(150);
-                $('#input-box').val(null);
-                Materialize.updateTextFields();
-            }).always(function() {
-                $('#add-button').removeClass('disabled');
-            });
-        }
-
-        var removeFavorite = function() {
-            var self = $(this);
-            if (self.hasClass('disabled')) {
-                return;
-            }
-            var test = self.attr('test');
-            if (!(test in subscriptionMap)) {
-                return;
-            }
-            self.addClass('disabled');
-            $.ajax({
-                url: '/api/favorites/' + subscriptionMap[test],
-                type: 'DELETE'
-            }).always(function() {
-                self.removeClass('disabled');
-            }).then(function() {
-                delete subscriptionMap[test];
-                self.parent().slideUp(150, function() {
-                    self.remove();
-                });
-            });
-        }
-
-        $.widget('custom.sizedAutocomplete', $.ui.autocomplete, {
-            _resizeMenu: function() {
-                this.menu.element.outerWidth($('#input-box').width());
-            }
-        });
-
-        $(function() {
-            $('#input-box').sizedAutocomplete({
-                source: allTests,
-                classes: {
-                    'ui-autocomplete': 'card'
-                }
-            });
-
-            $('#input-box').keyup(function(event) {
-                if (event.keyCode == 13) {  // return button
-                    $('#add-button').click();
-                }
-            });
-
-            $('.clear-button').click(removeFavorite);
-            $('#add-button').click(addFavorite);
-        });
-    </script>
-    <div class='container'>
-      <c:choose>
-        <c:when test='${not empty error}'>
-          <div id='error-container' class='row card'>
-            <div class='col s12 center-align'>
-              <h5>${error}</h5>
-            </div>
-          </div>
-        </c:when>
-        <c:otherwise>
-          <c:set var='width' value='${showAll ? 12 : 11}' />
-          <c:if test='${not showAll}'>
-            <div class='row'>
-              <div class='input-field col s8'>
-                <input type='text' id='input-box'></input>
-                <label for='input-box'>Search for tests to add to favorites</label>
-              </div>
-              <div id='add-button-wrapper' class='col s1 valign-wrapper'>
-                <a id='add-button' class='btn-floating btn waves-effect waves-light red valign'><i class='material-icons'>add</i></a>
-              </div>
-            </div>
-          </c:if>
-          <div class='row'>
-            <div class='col s12'>
-              <h4 id='section-header'>${headerLabel}</h4>
-            </div>
-          </div>
-          <div class='row' id='options'>
-            <c:forEach items='${testNames}' var='test'>
-              <div>
-                <a href='/show_table?testName=${test.name}'>
-                  <div class='col s${width} card hoverable option valign-wrapper waves-effect'>
-                    <span class='entry valign'>${test.name}
-                      <c:if test='${test.failCount >= 0 && test.passCount >= 0}'>
-                        <c:set var='color' value='${test.failCount > 0 ? "red" : (test.passCount > 0 ? "green" : "grey")}' />
-                        <span class='indicator center ${color}'>
-                          ${test.passCount} / ${test.passCount + test.failCount}
-                        </span>
-                      </c:if>
-                    </span>
-                  </div>
-                </a>
-                <c:if test='${not showAll}'>
-                  <a class='col s1 btn-flat center clear-button' test='${test.name}'>
-                    <i class='material-icons'>clear</i>
-                  </a>
-                </c:if>
-              </div>
-            </c:forEach>
-          </div>
-        </c:otherwise>
-      </c:choose>
-    </div>
-    <c:if test='${empty error}'>
-      <div class='center'>
-        <a href='${buttonLink}' id='show-button' class='btn waves-effect red'>${buttonLabel}
-          <i id='show-button-arrow' class='material-icons right'>${buttonIcon}</i>
-        </a>
-      </div>
-    </c:if>
-    <%@ include file='footer.jsp' %>
-  </body>
-</html>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/footer.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/footer.jsp
deleted file mode 100644
index ed2d950..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/footer.jsp
+++ /dev/null
@@ -1,25 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-<footer class='page-footer'>
-  <div class='footer-copyright'>
-    <div class='container'>
-      © 2017 - The Android Open Source Project
-    </div>
-  </div>
-</footer>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/header.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/header.jsp
deleted file mode 100644
index 1978511..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/header.jsp
+++ /dev/null
@@ -1,61 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-<head>
-  <link rel='stylesheet' href='/css/navbar.css'>
-  <link rel='stylesheet' href='/css/common.css'>
-  <link rel='stylesheet' href='https://www.gstatic.com/external_hosted/materialize/all_styles-bundle.css'>
-  <link rel='icon' href='https://www.gstatic.com/images/branding/googleg/1x/googleg_standard_color_32dp.png' sizes='32x32'>
-  <link rel='stylesheet' href='https://fonts.googleapis.com/icon?family=Material+Icons'>
-  <link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700'>
-  <script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/materialize/materialize.min.js'></script>
-  <script type='text/javascript'>
-    if (${analyticsID}) {
-        // Autogenerated from Google Analytics
-        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-            (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-        })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-        ga('create', ${analyticsID}, 'auto');
-        ga('send', 'pageview');
-    }
-    links = ${navbarLinksJson};
-  </script>
-  <title>VTS Dashboard</title>
-</head>
-<body>
-  <nav id='navbar'>
-    <div class='nav-wrapper'>
-      <span>
-        <c:forEach items='${navbarLinks}' var='link'>
-          <a href='${link[0]}' class='breadcrumb'>${link[1]}</a>
-        </c:forEach>
-      </span>
-      <ul class='right'><li>
-        <a id='dropdown-button' class='dropdown-button btn red lighten-3' href='#' data-activates='dropdown'>
-          ${email}
-        </a>
-      </li></ul>
-      <ul id='dropdown' class='dropdown-content'>
-        <li><a href='${logoutURL}'>Log out</a></li>
-      </ul>
-      </div>
-    </div>
-  </nav>
-</body>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_coverage.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/show_coverage.jsp
deleted file mode 100644
index 790590d..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_coverage.jsp
+++ /dev/null
@@ -1,171 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link rel="stylesheet" href="/css/show_coverage.css">
-  <script src="https://apis.google.com/js/api.js" type="text/javascript"></script>
-  <body>
-    <script type="text/javascript">
-        var coverageVectors = ${coverageVectors};
-        $(document).ready(function() {
-            // Initialize AJAX for CORS
-            $.ajaxSetup({
-                xhrFields : {
-                    withCredentials: true
-                }
-            });
-
-            // Initialize auth2 client and scope for requests to Gerrit
-            gapi.load('auth2', function() {
-                var auth2 = gapi.auth2.init({
-                    client_id: ${clientId},
-                    scope: ${gerritScope}
-                });
-                auth2.then(displayEntries);
-            });
-        });
-
-        /* Open a window to Gerrit so that user can login.
-           Minimize the previously clicked entry.
-        */
-        var gerritLogin = function(element) {
-            window.open(${gerritURI}, "Ratting", "toolbar=0,status=0");
-            element.click();
-        }
-
-        /* Loads source code for a particular entry and displays it with
-           coverage information as the accordion entry expands.
-        */
-        var onClick = function() {
-            // Remove source code from the accordion entry that was open before
-            var self = $(this);
-            var prev = self.parent().siblings('li.active');
-            if (prev.length > 0) {
-                prev.find('.table-container').empty();
-            }
-            var url = self.parent().attr('url');
-            var i = self.parent().attr('index');
-            var container = self.parent().find('.table-container');
-            container.html('<div class="center-align">Loading...</div>');
-            if (self.parent().hasClass('active')) {
-                // Remove the code from display
-                container.empty();
-            } else {
-                /* Fetch and display the code.
-                   Note: a coverageVector may be shorter than sourceContents due
-                   to non-executable (i.e. comments or language-specific syntax)
-                   lines in the code. Trailing source lines that have no
-                   coverage information are assumed to be non-executable.
-                */
-                $.ajax({
-                    url: url,
-                    dataType: 'text'
-                }).promise().done(function(src) {
-                    src = atob(src);
-                    if (!src) return;
-                    srcLines = src.split('\n');
-                    covered = 0;
-                    total = 0;
-                    var table = $('<table class="table"></table>');
-                    var rows = srcLines.forEach(function(line, j) {
-                        var count = coverageVectors[i][j];
-                        var row = $('<tr></tr>');
-                        if (typeof count == 'undefined' || count < 0) {
-                            count = "--";
-                        } else if (count == 0) {
-                            row.addClass('uncovered');
-                            total += 1;
-                        } else {
-                            row.addClass('covered');
-                            total += 1;
-                        }
-                        row.append('<td class="count">' + String(count) + '</td>');
-                        row.append('<td class="line_no">' + String(j+1) + '</td>');
-                        code = $('<td class="code"></td>');
-                        code.text(String(line));
-                        code.appendTo(row);
-                        row.appendTo(table);
-                    });
-                    container.empty();
-                    container.append(table);
-                }).fail(function(error) {
-                    if (error.status == 0) {  // origin error, refresh cookie
-                        container.empty();
-                        container.html('<div class="center-align">' +
-                                       '<span class="login-button">' +
-                                       'Click to authorize Gerrit access' +
-                                       '</span></div>');
-                        container.find('.login-button').click(function() {
-                            gerritLogin(self);
-                        });
-                    } else {
-                        container.html('<div class="center-align">' +
-                                       'Not found.</div>');
-                    }
-                });
-            }
-        }
-
-        /* Appends a row to the display with test name and aggregated coverage
-           information. On expansion, source code is loaded with coverage
-           highlighted by calling 'onClick'.
-        */
-        var displayEntries = function() {
-            var sourceFilenames = ${sourceFiles};
-            var sectionMap = ${sectionMap};
-            var gerritURI = ${gerritURI};
-            var projects = ${projects};
-            var commits = ${commits};
-            var indicators = ${indicators};
-            Object.keys(sectionMap).forEach(function(section) {
-                var indices = sectionMap[section];
-                var html = String();
-                indices.forEach(function(i) {
-                    var url = gerritURI + '/projects/' +
-                              encodeURIComponent(projects[i]) + '/commits/' +
-                              encodeURIComponent(commits[i]) + '/files/' +
-                              encodeURIComponent(sourceFilenames[i]) +
-                              '/content';
-                    html += '<li url="' + url + '" index="' + i + '">' +
-                            '<div class="collapsible-header">' +
-                            '<i class="material-icons">library_books</i>' +
-                            sourceFilenames[i] + indicators[i] + '</div>';
-                    html += '<div class="collapsible-body row">' +
-                            '<div class="html-container">' +
-                            '<div class="table-container"></div>' +
-                            '</div></div></li>';
-                });
-                if (html) {
-                    html = '<h4 class="section-title"><b>Coverage:</b> ' +
-                           section + '</h4><ul class="collapsible popout" ' +
-                           'data-collapsible="accordion">' + html + '</ul>';
-                    $('#coverage-container').append(html);
-                }
-            });
-            $('.collapsible.popout').collapsible({
-               accordion : true
-            }).find('.collapsible-header').click(onClick);
-        }
-    </script>
-    <div id='coverage-container' class='wide container'>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_graph.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/show_graph.jsp
deleted file mode 100644
index 7111f58..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_graph.jsp
+++ /dev/null
@@ -1,292 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/datepicker.css' rel='stylesheet'>
-  <link type='text/css' href='/css/show_graph.css' rel='stylesheet'>
-  <link rel='stylesheet' href='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.0/jquery-ui.css'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js'></script>
-  <body>
-    <script type='text/javascript'>
-        google.charts.load('current', {packages:['corechart', 'table', 'line']});
-        google.charts.setOnLoadCallback(drawAllGraphs);
-
-        ONE_DAY = 86400000000;
-        MICRO_PER_MILLI = 1000;
-        N_BUCKETS = 200;
-
-        var graphs = ${graphs};
-
-        $(function() {
-            $('select').material_select();
-            var date = $('#date').datepicker({
-                showAnim: 'slideDown',
-                maxDate: new Date()
-            });
-            date.datepicker('setDate', new Date(${endTime} / MICRO_PER_MILLI));
-            $('#load').click(load);
-            $('#outlier-select').change(drawAllGraphs);
-        });
-
-        // Draw all graphs.
-        function drawAllGraphs() {
-            $('#profiling-container').empty();
-            var percentileIndex = Number($('#outlier-select').val());
-
-            // Get histogram extrema
-            var histMin = null;
-            var histMax = null;
-            graphs.forEach(function(g) {
-                if (g.type != 'HISTOGRAM') return;
-                var minVal;
-                var maxVal;
-                if (percentileIndex == -1) {
-                    minVal = g.min;
-                    maxVal = g.max;
-                } else {
-                    minVal = g.percentile_values[percentileIndex];
-                    var endIndex = g.percentiles.length - percentileIndex - 1
-                    maxVal = g.percentile_values[endIndex];
-                }
-                if (!histMin || minVal < histMin) histMin = minVal;
-                if (!histMax || maxVal > histMax) histMax = maxVal;
-            });
-
-            graphs.forEach(function(graph) {
-                if (graph.type == 'LINE_GRAPH') drawLineGraph(graph);
-                else if (graph.type == 'HISTOGRAM')
-                    drawHistogram(graph, histMin, histMax);
-            });
-        }
-
-       /**
-        * Draw a line graph.
-        *
-        * Args:
-        *     lineGraph: a JSON object containing the following fields:
-        *                - name: the name of the graph
-        *                - values: an array of numbers
-        *                - ticks: an array of strings to use as x-axis labels
-        *                - ids: an array of string labels for each point (e.g. the
-        *                       build info for the run that produced the point)
-        *                - x_label: the string label for the x axis
-        *                - y_label: the string label for the y axis
-        */
-        function drawLineGraph(lineGraph) {
-            if (!lineGraph.ticks || lineGraph.ticks.length < 1) {
-                return;
-            }
-            var title = 'Performance';
-            if (lineGraph.name) title += ' (' + lineGraph.name + ')';
-            lineGraph.ticks.forEach(function (label, i) {
-                lineGraph.values[i].unshift(label);
-            });
-            var data = new google.visualization.DataTable();
-            data.addColumn('string', lineGraph.x_label);
-            lineGraph.ids.forEach(function(id) {
-                data.addColumn('number', id);
-            });
-            data.addRows(lineGraph.values);
-            var options = {
-              chart: {
-                  title: title,
-                  subtitle: lineGraph.y_label
-              },
-              legend: { position: 'none' }
-            };
-            var container = $('<div class="row card center-align col s12 graph-wrapper"></div>');
-            container.appendTo('#profiling-container');
-            var chartDiv = $('<div class="col s12 graph"></div>');
-            chartDiv.appendTo(container);
-            var chart = new google.charts.Line(chartDiv[0]);
-            chart.draw(data, options);
-        }
-
-       /**
-        * Draw a histogram.
-        *
-        * Args:
-        *     hist: a JSON object containing the following fields:
-        *           - name: the name of the graph
-        *           - values: an array of numbers
-        *           - ids: an array of string labels for each point (e.g. the
-        *                  build info for the run that produced the point)
-        *           - x_label: the string label for the x axis
-        *           - y_label: the string label for the y axis
-        *     min: the minimum value to display
-        *     max: the maximum value to display
-        */
-        function drawHistogram(hist, min, max) {
-            if (!hist.values || hist.values.length == 0) return;
-            var title = 'Performance';
-            if (hist.name) title += ' (' + hist.name + ')';
-            var values = hist.values;
-            var histogramData = values.reduce(function(result, d, i) {
-                if (d <= max && d >= min) result.push([hist.ids[i], d]);
-                return result;
-            }, []);
-
-            var data = google.visualization.arrayToDataTable(histogramData, true);
-            var bucketSize = (max - min) / N_BUCKETS;
-
-            var options = {
-                title: title,
-                titleTextStyle: {
-                    color: '#757575',
-                    fontSize: 16,
-                    bold: false
-                },
-                legend: { position: 'none' },
-                colors: ['#4285F4'],
-                fontName: 'Roboto',
-                vAxis:{
-                    title: hist.y_label,
-                    titleTextStyle: {
-                        color: '#424242',
-                        fontSize: 12,
-                        italic: false
-                    },
-                    textStyle: {
-                        fontSize: 12,
-                        color: '#757575'
-                    },
-                },
-                hAxis: {
-                    title: hist.x_label,
-                    textStyle: {
-                        fontSize: 12,
-                        color: '#757575'
-                    },
-                    titleTextStyle: {
-                        color: '#424242',
-                        fontSize: 12,
-                        italic: false
-                    }
-                },
-                bar: { gap: 0 },
-                histogram: {
-                    minValue: min,
-                    maxValue: max,
-                    maxNumBuckets: N_BUCKETS,
-                    bucketSize: bucketSize
-                },
-                chartArea: {
-                    width: '100%',
-                    top: 40,
-                    left: 60,
-                    height: 375
-                }
-            };
-            var container = $('<div class="row card col s12 graph-wrapper"></div>');
-            container.appendTo('#profiling-container');
-
-            var chartDiv = $('<div class="col s12 graph"></div>');
-            chartDiv.appendTo(container);
-            var chart = new google.visualization.Histogram(chartDiv[0]);
-            chart.draw(data, options);
-
-            var tableDiv = $('<div class="col s12"></div>');
-            tableDiv.appendTo(container);
-
-            var tableHtml = '<table class="percentile-table"><thead><tr>';
-            hist.percentiles.forEach(function(p) {
-                tableHtml += '<th data-field="id">' + p + '%</th>';
-            });
-            tableHtml += '</tr></thead><tbody><tr>';
-            hist.percentile_values.forEach(function(v) {
-                tableHtml += '<td>' + v + '</td>';
-            });
-            tableHtml += '</tbody></table>';
-            $(tableHtml).appendTo(tableDiv);
-        }
-
-        // Reload the page.
-        function load() {
-            var endTime = $('#date').datepicker('getDate').getTime();
-            endTime = endTime + (ONE_DAY / MICRO_PER_MILLI) - 1;
-            var filterVal = $('#outlier-select').val();
-            var ctx = '${pageContext.request.contextPath}';
-            var link = ctx + '/show_graph?profilingPoint=${profilingPointName}' +
-                '&testName=${testName}' +
-                '&endTime=' + (endTime * MICRO_PER_MILLI) +
-                '&filterVal=' + filterVal;
-            if ($('#device-select').prop('selectedIndex') > 1) {
-                link += '&device=' + $('#device-select').val();
-            }
-            window.open(link,'_self');
-        }
-    </script>
-    <div id='download' class='fixed-action-btn'>
-      <a id='b' class='btn-floating btn-large red waves-effect waves-light'>
-        <i class='large material-icons'>file_download</i>
-      </a>
-    </div>
-    <div class='container wide'>
-      <div class='row card'>
-        <div id='header-container' class='valign-wrapper col s12'>
-          <div class='col s3 valign'>
-            <h5>Profiling Point:</h5>
-          </div>
-          <div class='col s9 right-align valign'>
-            <h5 class='profiling-name truncate'>${profilingPointName}</h5>
-          </div>
-        </div>
-        <div id='date-container' class='col s12'>
-          <c:set var='offset' value='${showFilterDropdown ? 0 : 2}' />
-          <c:if test='${showFilterDropdown}'>
-            <div id='outlier-select-wrapper' class='col s2'>
-              <select id='outlier-select'>
-                <option value='-1' ${filterVal eq -1 ? 'selected' : ''}>Show outliers</option>
-                <option value='0' ${filterVal eq 0 ? 'selected' : ''}>Filter outliers (1%)</option>
-                <option value='1' ${filterVal eq 1 ? 'selected' : ''}>Filter outliers (2%)</option>
-                <option value='2' ${filterVal eq 2 ? 'selected' : ''}>Filter outliers (5%)</option>
-              </select>
-            </div>
-          </c:if>
-          <div id='device-select-wrapper' class='input-field col s5 m3 offset-m${offset + 4} offset-s${offset}'>
-            <select id='device-select'>
-              <option value='' disabled>Select device</option>
-              <option value='0' ${empty selectedDevice ? 'selected' : ''}>All Devices</option>
-              <c:forEach items='${devices}' var='device' varStatus='loop'>
-                <option value=${device} ${selectedDevice eq device ? 'selected' : ''}>${device}</option>
-              </c:forEach>
-            </select>
-          </div>
-          <input type='text' id='date' name='date' class='col s4 m2'>
-          <a id='load' class='btn-floating btn-medium red right waves-effect waves-light'>
-            <i class='medium material-icons'>cached</i>
-          </a>
-        </div>
-      </div>
-      <div id='profiling-container'>
-      </div>
-      <c:if test='${not empty error}'>
-        <div id='error-container' class='row card'>
-          <div class='col s10 offset-s1 center-align'>
-            <!-- Error in case of profiling data is missing -->
-            <h5>${error}</h5>
-          </div>
-        </div>
-      </c:if>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_performance_digest.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/show_performance_digest.jsp
deleted file mode 100644
index 224d847..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_performance_digest.jsp
+++ /dev/null
@@ -1,100 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/datepicker.css' rel='stylesheet'>
-  <link type='text/css' href='/css/show_performance_digest.css' rel='stylesheet'>
-  <link rel='stylesheet' href='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.0/jquery-ui.css'>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
-  <body>
-    <script type='text/javascript'>
-        ONE_DAY = 86400000000;
-        MICRO_PER_MILLI = 1000;
-
-        function load() {
-            var time = $('#date').datepicker('getDate').getTime() - 1;
-            time = time * MICRO_PER_MILLI + ONE_DAY;  // end of day
-            var ctx = '${pageContext.request.contextPath}';
-            var link = ctx + '/show_performance_digest?profilingPoint=${profilingPointName}' +
-                '&testName=${testName}' +
-                '&startTime=' + time;
-            if ($('#device-select').prop('selectedIndex') > 1) {
-                link += '&device=' + $('#device-select').val();
-            }
-            window.open(link,'_self');
-        }
-
-        $(function() {
-            var date = $('#date').datepicker({
-                showAnim: "slideDown",
-                maxDate: new Date()
-            });
-            date.datepicker('setDate', new Date(${startTime} / MICRO_PER_MILLI));
-            $('#load').click(load);
-
-            $('.date-label').each(function(i) {
-                var label = $(this);
-                label.html(moment(parseInt(label.html())).format('M/D/YY'));
-            });
-            $('select').material_select();
-        });
-    </script>
-    <div class='wide container'>
-      <div class='row card'>
-        <div id='header-container' class='col s12'>
-          <div class='col s12'>
-            <h4>Daily Performance Digest</h4>
-          </div>
-          <div id='device-select-wrapper' class='input-field col s6 m3 offset-m6'>
-            <select id='device-select'>
-              <option value='' disabled>Select device</option>
-              <option value='0' ${empty selectedDevice ? 'selected' : ''}>All Devices</option>
-              <c:forEach items='${devices}' var='device' varStatus='loop'>
-                <option value=${device} ${selectedDevice eq device ? 'selected' : ''}>${device}</option>
-              </c:forEach>
-            </select>
-          </div>
-          <input type='text' id='date' name='date' class='col s5 m2'>
-          <a id='load' class='btn-floating btn-medium red right waves-effect waves-light'>
-            <i class='medium material-icons'>cached</i>
-          </a>
-        </div>
-      </div>
-      <div class='row'>
-        <c:forEach items='${tables}' var='table' varStatus='loop'>
-          <div class='col s12 card summary'>
-            <div class='col s3 valign'>
-              <h5>Profiling Point:</h5>
-            </div>
-            <div class='col s9 right-align valign'>
-              <h5 class="profiling-name truncate">${tableTitles[loop.index]}</h5>
-            </div>
-            ${table}
-            <span class='profiling-subtitle'>
-              ${tableSubtitles[loop.index]}
-            </span>
-          </div>
-        </c:forEach>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_plan_release.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/show_plan_release.jsp
deleted file mode 100644
index 7ebfab7..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_plan_release.jsp
+++ /dev/null
@@ -1,78 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link rel='stylesheet' href='/css/show_plan_release.css'>
-  <link rel='stylesheet' href='/css/plan_runs.css'>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/plan_runs.js'></script>
-  <script type='text/javascript'>
-      $(document).ready(function() {
-          // disable buttons on load
-          if (!${hasNewer}) {
-              $('#newer-button').toggleClass('disabled');
-          }
-          if (!${hasOlder}) {
-              $('#older-button').toggleClass('disabled');
-          }
-
-          $('#newer-button').click(prev);
-          $('#older-button').click(next);
-          $('#release-container').showPlanRuns(${planRuns});
-      });
-
-      // view older data
-      function next() {
-          if($(this).hasClass('disabled')) return;
-          var endTime = ${startTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_plan_release?plan=${plan}&endTime=' + endTime;
-          window.open(link,'_self');
-      }
-
-      // view newer data
-      function prev() {
-          if($(this).hasClass('disabled')) return;
-          var startTime = ${endTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_plan_release?plan=${plan}&startTime=' + startTime;
-          window.open(link,'_self');
-        }
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <h4 id='section-header'>${plan}</h4>
-      <div class='row' id='release-container'></div>
-      <div id='newer-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='newer-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_left</i>
-        </a>
-      </div>
-      <div id='older-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='older-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_right</i>
-        </a>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_plan_run.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/show_plan_run.jsp
deleted file mode 100644
index 491703a..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_plan_run.jsp
+++ /dev/null
@@ -1,131 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/show_test_runs_common.css' rel='stylesheet'>
-  <link type='text/css' href='/css/test_results.css' rel='stylesheet'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/test_results.js'></script>
-  <script type='text/javascript'>
-      google.charts.load('current', {'packages':['table', 'corechart']});
-      google.charts.setOnLoadCallback(drawPieChart);
-
-      $(document).ready(function() {
-          $('#test-results-container').showTests(${testRuns}, true);
-      });
-
-      // to draw pie chart
-      function drawPieChart() {
-          var topBuildResultCounts = ${topBuildResultCounts};
-          if (topBuildResultCounts.length < 1) {
-              return;
-          }
-          var resultNames = ${resultNamesJson};
-          var rows = resultNames.map(function(res, i) {
-              nickname = res.replace('TEST_CASE_RESULT_', '').replace('_', ' ')
-                         .trim().toLowerCase();
-              return [nickname, parseInt(topBuildResultCounts[i])];
-          });
-          rows.unshift(['Result', 'Count']);
-
-          // Get CSS color definitions (or default to white)
-          var colors = resultNames.map(function(res) {
-              return $('.' + res).css('background-color') || 'white';
-          });
-
-          var data = google.visualization.arrayToDataTable(rows);
-          var options = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              legend: 'none',
-              tooltip: {showColorCode: true, ignoreBounds: true},
-              chartArea: {height: '90%'}
-          };
-
-          var chart = new google.visualization.PieChart(document.getElementById('pie-chart-div'));
-          chart.draw(data, options);
-      }
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class='row'>
-        <div class='col s7'>
-          <div class='col s12 card center-align'>
-            <div id='legend-wrapper'>
-              <c:forEach items='${resultNames}' var='res'>
-                <div class='center-align legend-entry'>
-                  <c:set var='trimmed' value='${fn:replace(res, "TEST_CASE_RESULT_", "")}'/>
-                  <c:set var='nickname' value='${fn:replace(trimmed, "_", " ")}'/>
-                  <label for='${res}'>${nickname}</label>
-                  <div id='${res}' class='${res} legend-bubble'></div>
-                </div>
-              </c:forEach>
-            </div>
-          </div>
-          <div id='profiling-container' class='col s12'>
-            <c:choose>
-              <c:when test='${empty profilingPointNames}'>
-                <div id='error-div' class='center-align card'><h5>${error}</h5></div>
-              </c:when>
-              <c:otherwise>
-                <ul id='profiling-body' class='collapsible' data-collapsible='accordion'>
-                  <li>
-                    <div class='collapsible-header'><i class='material-icons'>timeline</i>Profiling Graphs</div>
-                    <div class='collapsible-body'>
-                      <ul id='profiling-list' class='collection'>
-                        <c:forEach items='${profilingPointNames}' var='pt'>
-                          <c:set var='profPointArgs' value='testName=${testName}&profilingPoint=${pt}'/>
-                          <c:set var='timeArgs' value='endTime=${endTime}'/>
-                          <a href='/show_graph?${profPointArgs}&${timeArgs}'
-                             class='collection-item profiling-point-name'>${pt}
-                          </a>
-                        </c:forEach>
-                      </ul>
-                    </div>
-                  </li>
-                  <li>
-                    <a class='collapsible-link' href='/show_performance_digest?testName=${testName}'>
-                      <div class='collapsible-header'><i class='material-icons'>toc</i>Performance Digest</div>
-                    </a>
-                  </li>
-                </ul>
-              </c:otherwise>
-            </c:choose>
-          </div>
-        </div>
-        <div class='col s5 valign-wrapper'>
-          <!-- pie chart -->
-          <div id='pie-chart-wrapper' class='col s12 valign center-align card'>
-            <div id='pie-chart-div'></div>
-          </div>
-        </div>
-      </div>
-
-      <div class='col s12' id='test-results-container'>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_table.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/show_table.jsp
deleted file mode 100644
index 4cf36d1..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_table.jsp
+++ /dev/null
@@ -1,394 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/show_table.css' rel='stylesheet'>
-  <link type='text/css' href='/css/show_test_runs_common.css' rel='stylesheet'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script type='text/javascript'>
-      google.charts.load('current', {'packages':['table', 'corechart']});
-      google.charts.setOnLoadCallback(drawGridTable);
-      google.charts.setOnLoadCallback(activateLogLinks);
-      google.charts.setOnLoadCallback(drawProfilingTable);
-      google.charts.setOnLoadCallback(drawPieChart);
-      google.charts.setOnLoadCallback(function() {
-          $('.gradient').removeClass('gradient');
-      });
-
-      $(document).ready(function() {
-          function verify() {
-              var oneChecked = ($('#presubmit').prop('checked') ||
-                                $('#postsubmit').prop('checked'));
-              if (!oneChecked) {
-                  $('#refresh').addClass('disabled');
-              } else {
-                  $('#refresh').removeClass('disabled');
-              }
-          }
-          $('#presubmit').prop('checked', ${showPresubmit} || false)
-                         .change(verify);
-          $('#postsubmit').prop('checked', ${showPostsubmit} || false)
-                          .change(verify);
-          $('#refresh').click(refresh);
-          $('#help-icon').click(function() {
-              $('#help-modal').openModal();
-          });
-          $('#input-box').keypress(function(e) {
-              if (e.which == 13) {
-                  refresh();
-              }
-          });
-
-          // disable buttons on load
-          if (!${hasNewer}) {
-              $('#newer-button').toggleClass('disabled');
-          }
-          if (!${hasOlder}) {
-              $('#older-button').toggleClass('disabled');
-          }
-          $('#treeLink').click(function() {
-              window.open('/show_tree?testName=${testName}', '_self');
-          });
-          $('#newer-button').click(prev);
-          $('#older-button').click(next);
-      });
-
-      // Actives the log links to display the log info modal when clicked.
-      function activateLogLinks() {
-          $('.info-btn').click(function(e) {
-              showLog(${logInfoMap}[$(this).data('col')]);
-          });
-      }
-
-      /** Displays a modal window with the specified log entries.
-       *
-       * @param logEntries Array of string arrays. Each entry in the outer array
-       *                   must contain (1) name string, and (2) url string.
-       */
-      function showLog(logEntries) {
-          if (!logEntries || logEntries.length == 0) return;
-
-          var logList = $('<ul class="collection"></ul>');
-          var entries = logEntries.reduce(function(acc, entry) {
-              if (!entry || entry.length == 0) return acc;
-              var link = '<a href="' + entry[1] + '"';
-              link += 'class="collection-item">' + entry[0] + '</li>';
-              return acc + link;
-          }, '');
-          logList.html(entries);
-          var infoContainer = $('#info-modal>.modal-content>.info-container');
-          infoContainer.empty();
-          logList.appendTo(infoContainer);
-          $('#info-modal').openModal();
-      }
-
-      // refresh the page to see the selected test types (pre-/post-submit)
-      function refresh() {
-          if($(this).hasClass('disabled')) return;
-          var link = '${pageContext.request.contextPath}' +
-              '/show_table?testName=${testName}';
-          var presubmit = $('#presubmit').prop('checked');
-          var postsubmit = $('#postsubmit').prop('checked');
-          if (presubmit) {
-              link += '&showPresubmit=';
-          }
-          if (postsubmit) {
-              link += '&showPostsubmit=';
-          }
-          if (${unfiltered} && postsubmit && presubmit) {
-              link += '&unfiltered=';
-          }
-          var searchString = $('#input-box').val();
-          if (searchString) {
-              link += '&search=' + encodeURIComponent(searchString);
-          }
-          window.open(link,'_self');
-      }
-
-      // view older data
-      function next() {
-          if($(this).hasClass('disabled')) return;
-          var endTime = ${startTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_table?testName=${testName}&endTime=' + endTime;
-          if ($('#presubmit').prop('checked')) {
-              link += '&showPresubmit=';
-          }
-          if ($('#postsubmit').prop('checked')) {
-              link += '&showPostsubmit=';
-          }
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          var searchString = '${searchString}';
-          if (searchString) {
-              link += '&search=' + encodeURIComponent(searchString);
-          }
-          window.open(link,'_self');
-      }
-
-      // view newer data
-      function prev() {
-          if($(this).hasClass('disabled')) return;
-          var startTime = ${endTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_table?testName=${testName}&startTime=' + startTime;
-          if ($('#presubmit').prop('checked')) {
-              link += '&showPresubmit=';
-          }
-          if ($('#postsubmit').prop('checked')) {
-              link += '&showPostsubmit=';
-          }
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          var searchString = '${searchString}';
-          if (searchString) {
-              link += '&search=' + encodeURIComponent(searchString);
-          }
-          window.open(link,'_self');
-        }
-
-      // table for profiling data
-      function drawProfilingTable() {
-
-      }
-
-      // to draw pie chart
-      function drawPieChart() {
-          var topBuildResultCounts = ${topBuildResultCounts};
-          if (topBuildResultCounts.length < 1) {
-              return;
-          }
-          var resultNames = ${resultNamesJson};
-          var rows = resultNames.map(function(res, i) {
-              nickname = res.replace('TEST_CASE_RESULT_', '').replace('_', ' ')
-                         .trim().toLowerCase();
-              return [nickname, parseInt(topBuildResultCounts[i])];
-          });
-          rows.unshift(['Result', 'Count']);
-
-          // Get CSS color definitions (or default to white)
-          var colors = resultNames.map(function(res) {
-              return $('.' + res).css('background-color') || 'white';
-          });
-
-          var data = google.visualization.arrayToDataTable(rows);
-          var options = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              legend: 'none',
-              tooltip: {showColorCode: true, ignoreBounds: true},
-              chartArea: {height: '90%'}
-          };
-
-          var chart = new google.visualization.PieChart(document.getElementById('pie-chart-div'));
-          chart.draw(data, options);
-      }
-
-      // table for grid data
-      function drawGridTable() {
-          var data = new google.visualization.DataTable();
-
-          // Add column headers.
-          headerRow = ${headerRow};
-          headerRow.forEach(function(d, i) {
-              var classNames = 'table-header-content';
-              if (i == 0) classNames += ' table-header-legend';
-              data.addColumn('string', '<span class="' + classNames + '">' +
-                             d + '</span>');
-          });
-
-          var timeGrid = ${timeGrid};
-          var durationGrid = ${durationGrid};
-          var summaryGrid = ${summaryGrid};
-          var resultsGrid = ${resultsGrid};
-
-          // Format time grid to a formatted date
-          timeGrid = timeGrid.map(function(row) {
-              return row.map(function(cell, j) {
-                  if (j == 0) return cell;
-                  var time = moment(cell/1000);
-                  // If today, don't display the date
-                  if (time.isSame(moment(), 'd')) {
-                      return time.format('H:mm:ssZZ');
-                  } else {
-                      return time.format('M/D/YY H:mm:ssZZ');
-                  }
-              });
-          });
-
-          // Format duration grid to HH:mm:ss.SSS
-          durationGrid = durationGrid.map(function(row) {
-              return row.map(function(cell, j) {
-                  if (j == 0) return cell;
-                  return moment.utc(cell/1000).format("HH:mm:ss.SSS");
-              });
-          });
-
-          // add rows to the data.
-          data.addRows(timeGrid);
-          data.addRows(durationGrid);
-          data.addRows(summaryGrid);
-          data.addRows(resultsGrid);
-
-          var table = new google.visualization.Table(document.getElementById('grid-table-div'));
-          var classNames = {
-              headerRow : 'table-header',
-              headerCell : 'table-header-cell'
-          };
-          var options = {
-              showRowNumber: false,
-              alternatingRowStyle: true,
-              allowHtml: true,
-              frozenColumns: 1,
-              cssClassNames: classNames,
-              sort: 'disable'
-          };
-          table.draw(data, options);
-      }
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class='row'>
-        <div class='col s12'>
-          <div class='card'>
-            <ul class='tabs'>
-              <li class='tab col s6'><a class='active'>Table</a></li>
-              <li class='tab col s6' id='treeLink'><a>Tree</a></li>
-            </ul>
-          </div>
-          <div class='card' id='filter-wrapper'>
-            <div id='search-icon-wrapper'>
-              <i class='material-icons' id='search-icon'>search</i>
-            </div>
-            <div class='input-field' id='search-wrapper'>
-              <input value='${searchString}' type='text' id='input-box'>
-              <label for='input-box'>Search for test results</label>
-            </div>
-            <div id='help-icon-wrapper'>
-              <i class='material-icons' id='help-icon'>help</i>
-            </div>
-            <div id='build-type-div' class='right'>
-              <input type='checkbox' id='presubmit' />
-              <label for='presubmit'>Presubmit</label>
-              <input type='checkbox' id='postsubmit' />
-              <label for='postsubmit'>Postsubmit</label>
-              <a id='refresh' class='btn-floating btn-medium red right waves-effect waves-light'>
-                <i class='medium material-icons'>cached</i>
-              </a>
-            </div>
-          </div>
-        </div>
-        <div class='col s7'>
-          <div class='col s12 card center-align'>
-            <div id='legend-wrapper'>
-              <c:forEach items='${resultNames}' var='res'>
-                <div class='center-align legend-entry'>
-                  <c:set var='trimmed' value='${fn:replace(res, "TEST_CASE_RESULT_", "")}'/>
-                  <c:set var='nickname' value='${fn:replace(trimmed, "_", " ")}'/>
-                  <label for='${res}'>${nickname}</label>
-                  <div id='${res}' class='${res} legend-bubble'></div>
-                </div>
-              </c:forEach>
-            </div>
-          </div>
-          <div id='profiling-container' class='col s12'>
-            <c:choose>
-              <c:when test='${empty profilingPointNames}'>
-                <div id='error-div' class='center-align card'><h5>${error}</h5></div>
-              </c:when>
-              <c:otherwise>
-                <ul id='profiling-body' class='collapsible' data-collapsible='accordion'>
-                  <li>
-                    <div class='collapsible-header'><i class='material-icons'>timeline</i>Profiling Graphs</div>
-                    <div class='collapsible-body'>
-                      <ul id='profiling-list' class='collection'>
-                        <c:forEach items='${profilingPointNames}' var='pt'>
-                          <c:set var='profPointArgs' value='testName=${testName}&profilingPoint=${pt}'/>
-                          <c:set var='timeArgs' value='endTime=${endTime}'/>
-                          <a href='/show_graph?${profPointArgs}&${timeArgs}'
-                             class='collection-item profiling-point-name'>${pt}
-                          </a>
-                        </c:forEach>
-                      </ul>
-                    </div>
-                  </li>
-                  <li>
-                    <a class='collapsible-link' href='/show_performance_digest?testName=${testName}'>
-                      <div class='collapsible-header'><i class='material-icons'>toc</i>Performance Digest</div>
-                    </a>
-                  </li>
-                </ul>
-              </c:otherwise>
-            </c:choose>
-          </div>
-        </div>
-        <div class='col s5 valign-wrapper'>
-          <!-- pie chart -->
-          <div id='pie-chart-wrapper' class='col s12 valign center-align card'>
-            <h6 class='pie-chart-title'>Test Status for Device Build ID: ${topBuildId}</h6>
-            <div id='pie-chart-div'></div>
-          </div>
-        </div>
-      </div>
-
-      <div class='col s12'>
-        <div id='chart-holder' class='col s12 card'>
-          <!-- Grid tables-->
-          <div id='grid-table-div'></div>
-        </div>
-      </div>
-      <div id='newer-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='newer-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_left</i>
-        </a>
-      </div>
-      <div id='older-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='older-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_right</i>
-        </a>
-      </div>
-    </div>
-    <div id="help-modal" class="modal">
-      <div class="modal-content">
-        <h4>${searchHelpHeader}</h4>
-        <p>${searchHelpBody}</p>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect btn-flat">Close</a>
-      </div>
-    </div>
-    <div id="info-modal" class="modal">
-      <div class="modal-content">
-        <h4>Logs</h4>
-        <div class="info-container"></div>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect btn-flat">Close</a>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_tree.jsp b/web/dashboard/src/main/webapp/WEB-INF/jsp/show_tree.jsp
deleted file mode 100644
index c829304..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/jsp/show_tree.jsp
+++ /dev/null
@@ -1,285 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License"); you
-  ~ may not use this file except in compliance with the License. You may
-  ~ obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  ~ implied. See the License for the specific language governing
-  ~ permissions and limitations under the License.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/show_test_runs_common.css' rel='stylesheet'>
-  <link type='text/css' href='/css/test_results.css' rel='stylesheet'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/test_results.js'></script>
-  <script type='text/javascript'>
-      google.charts.load('current', {'packages':['table', 'corechart']});
-      google.charts.setOnLoadCallback(drawPieChart);
-      google.charts.setOnLoadCallback(function() {
-          $('.gradient').removeClass('gradient');
-      });
-
-      $(document).ready(function() {
-          function verify() {
-              var oneChecked = ($('#presubmit').prop('checked') ||
-                                $('#postsubmit').prop('checked'));
-              if (!oneChecked) {
-                  $('#refresh').addClass('disabled');
-              } else {
-                  $('#refresh').removeClass('disabled');
-              }
-          }
-          $('#presubmit').prop('checked', ${showPresubmit} || false)
-                         .change(verify);
-          $('#postsubmit').prop('checked', ${showPostsubmit} || false)
-                          .change(verify);
-          $('#refresh').click(refresh);
-          $('#help-icon').click(function() {
-              $('#help-modal').openModal();
-          });
-          $('#input-box').keypress(function(e) {
-              if (e.which == 13) {
-                  refresh();
-              }
-          });
-
-          // disable buttons on load
-          if (!${hasNewer}) {
-              $('#newer-button').toggleClass('disabled');
-          }
-          if (!${hasOlder}) {
-              $('#older-button').toggleClass('disabled');
-          }
-          $('#tableLink').click(function() {
-              window.open('/show_table?testName=${testName}', '_self');
-          });
-          $('#newer-button').click(prev);
-          $('#older-button').click(next);
-          $('#test-results-container').showTests(${testRuns});
-      });
-
-      // refresh the page to see the selected test types (pre-/post-submit)
-      function refresh() {
-          if($(this).hasClass('disabled')) return;
-          var link = '${pageContext.request.contextPath}' +
-              '/show_tree?testName=${testName}';
-          var presubmit = $('#presubmit').prop('checked');
-          var postsubmit = $('#postsubmit').prop('checked');
-          if (presubmit) {
-              link += '&showPresubmit=';
-          }
-          if (postsubmit) {
-              link += '&showPostsubmit=';
-          }
-          if (${unfiltered} && postsubmit && presubmit) {
-              link += '&unfiltered=';
-          }
-          var searchString = $('#input-box').val();
-          if (searchString) {
-              link += '&search=' + encodeURIComponent(searchString);
-          }
-          window.open(link,'_self');
-      }
-
-      // view older data
-      function next() {
-          if($(this).hasClass('disabled')) return;
-          var endTime = ${startTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_tree?testName=${testName}&endTime=' + endTime;
-          if ($('#presubmit').prop('checked')) {
-              link += '&showPresubmit=';
-          }
-          if ($('#postsubmit').prop('checked')) {
-              link += '&showPostsubmit=';
-          }
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          var searchString = '${searchString}';
-          if (searchString) {
-              link += '&search=' + encodeURIComponent(searchString);
-          }
-          window.open(link,'_self');
-      }
-
-      // view newer data
-      function prev() {
-          if($(this).hasClass('disabled')) return;
-          var startTime = ${endTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_tree?testName=${testName}&startTime=' + startTime;
-          if ($('#presubmit').prop('checked')) {
-              link += '&showPresubmit=';
-          }
-          if ($('#postsubmit').prop('checked')) {
-              link += '&showPostsubmit=';
-          }
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          var searchString = '${searchString}';
-          if (searchString) {
-              link += '&search=' + encodeURIComponent(searchString);
-          }
-          window.open(link,'_self');
-        }
-
-      // to draw pie chart
-      function drawPieChart() {
-          var topBuildResultCounts = ${topBuildResultCounts};
-          if (topBuildResultCounts.length < 1) {
-              return;
-          }
-          var resultNames = ${resultNamesJson};
-          var rows = resultNames.map(function(res, i) {
-              nickname = res.replace('TEST_CASE_RESULT_', '').replace('_', ' ')
-                         .trim().toLowerCase();
-              return [nickname, parseInt(topBuildResultCounts[i])];
-          });
-          rows.unshift(['Result', 'Count']);
-
-          // Get CSS color definitions (or default to white)
-          var colors = resultNames.map(function(res) {
-              return $('.' + res).css('background-color') || 'white';
-          });
-
-          var data = google.visualization.arrayToDataTable(rows);
-          var options = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              legend: 'none',
-              tooltip: {showColorCode: true, ignoreBounds: true},
-              chartArea: {height: '90%'}
-          };
-
-          var chart = new google.visualization.PieChart(document.getElementById('pie-chart-div'));
-          chart.draw(data, options);
-      }
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class='row'>
-        <div class='col s12'>
-          <div class='card'>
-            <ul class='tabs'>
-              <li class='tab col s6' id='tableLink'><a>Table</a></li>
-              <li class='tab col s6'><a class='active'>Tree</a></li>
-            </ul>
-          </div>
-          <div class='card' id='filter-wrapper'>
-            <div id='search-icon-wrapper'>
-              <i class='material-icons' id='search-icon'>search</i>
-            </div>
-            <div class='input-field' id='search-wrapper'>
-              <input value='${searchString}' type='text' id='input-box'>
-              <label for='input-box'>Search for test results</label>
-            </div>
-            <div id='help-icon-wrapper'>
-              <i class='material-icons' id='help-icon'>help</i>
-            </div>
-            <div id='build-type-div' class='right'>
-              <input type='checkbox' id='presubmit' />
-              <label for='presubmit'>Presubmit</label>
-              <input type='checkbox' id='postsubmit' />
-              <label for='postsubmit'>Postsubmit</label>
-              <a id='refresh' class='btn-floating btn-medium red right waves-effect waves-light'>
-                <i class='medium material-icons'>cached</i>
-              </a>
-            </div>
-          </div>
-        </div>
-        <div class='col s7'>
-          <div class='col s12 card center-align'>
-            <div id='legend-wrapper'>
-              <c:forEach items='${resultNames}' var='res'>
-                <div class='center-align legend-entry'>
-                  <c:set var='trimmed' value='${fn:replace(res, "TEST_CASE_RESULT_", "")}'/>
-                  <c:set var='nickname' value='${fn:replace(trimmed, "_", " ")}'/>
-                  <label for='${res}'>${nickname}</label>
-                  <div id='${res}' class='${res} legend-bubble'></div>
-                </div>
-              </c:forEach>
-            </div>
-          </div>
-          <div id='profiling-container' class='col s12'>
-            <c:choose>
-              <c:when test='${empty profilingPointNames}'>
-                <div id='error-div' class='center-align card'><h5>${error}</h5></div>
-              </c:when>
-              <c:otherwise>
-                <ul id='profiling-body' class='collapsible' data-collapsible='accordion'>
-                  <li>
-                    <div class='collapsible-header'><i class='material-icons'>timeline</i>Profiling Graphs</div>
-                    <div class='collapsible-body'>
-                      <ul id='profiling-list' class='collection'>
-                        <c:forEach items='${profilingPointNames}' var='pt'>
-                          <c:set var='profPointArgs' value='testName=${testName}&profilingPoint=${pt}'/>
-                          <c:set var='timeArgs' value='endTime=${endTime}'/>
-                          <a href='/show_graph?${profPointArgs}&${timeArgs}'
-                             class='collection-item profiling-point-name'>${pt}
-                          </a>
-                        </c:forEach>
-                      </ul>
-                    </div>
-                  </li>
-                  <li>
-                    <a class='collapsible-link' href='/show_performance_digest?testName=${testName}'>
-                      <div class='collapsible-header'><i class='material-icons'>toc</i>Performance Digest</div>
-                    </a>
-                  </li>
-                </ul>
-              </c:otherwise>
-            </c:choose>
-          </div>
-        </div>
-        <div class='col s5 valign-wrapper'>
-          <!-- pie chart -->
-          <div id='pie-chart-wrapper' class='col s12 valign center-align card'>
-            <h6 class='pie-chart-title'>${topBuildId}</h6>
-            <div id='pie-chart-div'></div>
-          </div>
-        </div>
-      </div>
-
-      <div class='col s12' id='test-results-container'>
-      </div>
-      <div id='newer-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='newer-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_left</i>
-        </a>
-      </div>
-      <div id='older-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='older-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_right</i>
-        </a>
-      </div>
-    </div>
-    <div id="help-modal" class="modal">
-      <div class="modal-content">
-        <h4>${searchHelpHeader}</h4>
-        <p>${searchHelpBody}</p>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect btn-flat">Close</a>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/web/dashboard/src/main/webapp/WEB-INF/web.xml b/web/dashboard/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 5890341..0000000
--- a/web/dashboard/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,177 +0,0 @@
-<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
-<!--
-Copyright 2016 Google Inc. All Rights Reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<servlet>
-  <servlet-name>dashboard_main</servlet-name>
-  <servlet-class>com.android.vts.servlet.DashboardMainServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_tree</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowTreeServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_table</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowTableServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_graph</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowGraphServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_plan_release</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowPlanReleaseServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_plan_run</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowPlanRunServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_performance_digest</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowPerformanceDigestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_coverage</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowCoverageServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>datastore</servlet-name>
-  <servlet-class>com.android.vts.api.DatastoreRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>test_run</servlet-name>
-  <servlet-class>com.android.vts.api.TestRunRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>favorites</servlet-name>
-  <servlet-class>com.android.vts.api.UserFavoriteRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>bigtable_legacy</servlet-name>
-  <servlet-class>com.android.vts.api.BigtableLegacyJsonServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>vts_alert_job</servlet-name>
-  <servlet-class>com.android.vts.servlet.VtsAlertJobServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>vts_performance_job</servlet-name>
-  <servlet-class>com.android.vts.servlet.VtsPerformanceJobServlet</servlet-class>
-</servlet>
-
-<servlet-mapping>
-  <servlet-name>dashboard_main</servlet-name>
-  <url-pattern>/</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_tree</servlet-name>
-  <url-pattern>/show_tree/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_table</servlet-name>
-  <url-pattern>/show_table/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_graph</servlet-name>
-  <url-pattern>/show_graph/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_plan_release</servlet-name>
-  <url-pattern>/show_plan_release/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_plan_run</servlet-name>
-  <url-pattern>/show_plan_run/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_performance_digest</servlet-name>
-  <url-pattern>/show_performance_digest/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_coverage</servlet-name>
-  <url-pattern>/show_coverage/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>bigtable_legacy</servlet-name>
-  <url-pattern>/api/bigtable/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>datastore</servlet-name>
-  <url-pattern>/api/datastore/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>test_run</servlet-name>
-  <url-pattern>/api/test_run/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>favorites</servlet-name>
-  <url-pattern>/api/favorites/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>vts_alert_job</servlet-name>
-  <url-pattern>/cron/vts_alert_job/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>vts_performance_job</servlet-name>
-  <url-pattern>/cron/vts_performance_job/*</url-pattern>
-</servlet-mapping>
-
-<security-constraint>
-  <web-resource-collection>
-    <web-resource-name>cron</web-resource-name>
-    <url-pattern>/cron/*</url-pattern>
-  </web-resource-collection>
-  <auth-constraint>
-    <role-name>admin</role-name>
-  </auth-constraint>
-</security-constraint>
-
-<security-constraint>
-  <web-resource-collection>
-    <web-resource-name>all</web-resource-name>
-    <url-pattern>/show_*</url-pattern>
-  </web-resource-collection>
-  <auth-constraint>
-    <role-name>*</role-name>
-  </auth-constraint>
-</security-constraint>
-</web-app>
diff --git a/web/dashboard/src/main/webapp/css/common.css b/web/dashboard/src/main/webapp/css/common.css
deleted file mode 100644
index 974f129..0000000
--- a/web/dashboard/src/main/webapp/css/common.css
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-.container {
-    min-height: 80%;
-}
-
-@media only screen and (min-width: 993px) {
-    .wide.container {
-        width: 80%;
-        max-width: 1600px;
-    }
-}
diff --git a/web/dashboard/src/main/webapp/css/dashboard_main.css b/web/dashboard/src/main/webapp/css/dashboard_main.css
deleted file mode 100644
index e6e899f..0000000
--- a/web/dashboard/src/main/webapp/css/dashboard_main.css
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-#edit-button-wrapper {
-    bottom: 25px;
-    right: 25px;
-}
-
-.input-field {
-    margin-bottom: 50px;
-}
-
-#add-button-wrapper {
-    margin-top: 10px;
-    height: 61px;
-}
-
-.btn-flat.clear-button {
-    margin-top: 8px;
-    user-select: none;
-    color: grey;
-}
-
-.row .col.card.option {
-    padding: 6px 15px 6px 15px;
-    margin: 5px 0;
-    border-radius: 25px;
-}
-
-#error-container {
-    padding-top: 50px;
-    padding-bottom: 50px;
-}
-
-.entry {
-    font-size: 20px;
-    font-weight: 300;
-    position: relative;
-}
-
-.indicator {
-    color: white;
-    font-size: 12px;
-    font-weight: bold;
-    padding: 1px 6px;
-    position: absolute;
-    right: 0;
-    min-width: 40px;
-    border-radius: 10px;
-    margin-top: 5px;
-}
-
-#show-button {
-    border-radius: 100px;
-}
-
-#show-button-arrow {
-    margin-left: 3px;
-}
-
-#section-header {
-    cursor: default;
-    user-select: none;
-    color: #ee6e73;
-}
-
-#section-header:after {
-    border: 1px solid #ee6e73;
-    margin-top: 10px;
-    margin-bottom: 0;
-    display: block;
-    content: " ";
-}
-
-.ui-menu {
-    overflow-y: auto;
-    z-index: 100;
-    max-height: 50%;
-}
-
-.ui-menu-item {
-    font-size: 16px;
-    padding: 4px 10px;
-    transition: background-color .25s;
-}
-
-.ui-menu-item:hover {
-    background-color: #e0f2f1;
-}
-
-.ui-menu-item:active {
-    background-color: #b2dfdb;
-}
-
-.ui-helper-hidden-accessible {
-    display: none;
-}
diff --git a/web/dashboard/src/main/webapp/css/datepicker.css b/web/dashboard/src/main/webapp/css/datepicker.css
deleted file mode 100644
index b98dd80..0000000
--- a/web/dashboard/src/main/webapp/css/datepicker.css
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-.ui-datepicker table {
-    font-family: Roboto !important;
-    font-size: 13px !important;
-    white-space: nowrap !important;
-}
-
-#ui-datepicker-div {
-    font-family: "Roboto", sans-serif;
-    padding: 0;
-}
-
-.ui-corner-all {
-    border-bottom-right-radius: 0 !important;
-    border-bottom-left-radius: 0 !important;
-    border-top-right-radius: 0 !important;
-    border-top-left-radius: 0 !important;
-}
-
-.ui-datepicker td span.ui-state-default, .ui-datepicker td a.ui-state-default {
-    text-align: center;
-    padding: 0.7em 0.4em;
-    border: none;
-    border-radius: 10em;
-    background: none;
-}
-
-.ui-datepicker td span.ui-state-hover, .ui-datepicker td a.ui-state-hover {
-    background: #e0f2f1;
-}
-
-.ui-datepicker td span.ui-state-active, .ui-datepicker td a.ui-state-active {
-    color: white;
-    font-weight: 600;
-    background: #009688;
-}
-
-.ui-datepicker-header.ui-widget-header.ui-helper-clearfix.ui-corner-all {
-    background: #009688;
-    border: none;
-    color: white;
-}
-
-.ui-datepicker-next.ui-state-hover.ui-datepicker-next-hover {
-    right: 2px;
-    top: 2px;
-}
-
-.ui-datepicker-prev.ui-state-hover.ui-datepicker-prev-hover {
-    left: 2px;
-    top: 2px;
-}
-
-.ui-datepicker-next.ui-corner-all.ui-state-hover, .ui-datepicker-prev.ui-corner-all.ui-state-hover {
-    background: none;
-    border: none;
-}
diff --git a/web/dashboard/src/main/webapp/css/navbar.css b/web/dashboard/src/main/webapp/css/navbar.css
deleted file mode 100644
index 71df169..0000000
--- a/web/dashboard/src/main/webapp/css/navbar.css
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-nav {
-    padding-left: 20px;
-    margin-bottom: 30px;
-}
-
-#dropdown-button {
-    color: rgba(255,255,255,0.75);
-    font-style: italic;
-    margin-left: 0;
-    margin-top: 0;
-}
\ No newline at end of file
diff --git a/web/dashboard/src/main/webapp/css/plan_runs.css b/web/dashboard/src/main/webapp/css/plan_runs.css
deleted file mode 100644
index 3c9eeb9..0000000
--- a/web/dashboard/src/main/webapp/css/plan_runs.css
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-.plan-run-metadata {
-    display: inline-block;
-    font-size: 13px;
-    line-height: 16px;
-    padding: 10px;
-}
-.release-entry {
-    border-radius: 5px 5px 10px 10px;
-}
-.counter {
-    color: white;
-    font-size: 12px;
-    font-weight: bold;
-    display: block;
-    border-radius: 0 0 10px 10px;
-}
\ No newline at end of file
diff --git a/web/dashboard/src/main/webapp/css/show_coverage.css b/web/dashboard/src/main/webapp/css/show_coverage.css
deleted file mode 100644
index c187fd3..0000000
--- a/web/dashboard/src/main/webapp/css/show_coverage.css
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-.collapsible.popout {
-    margin-bottom: 50px;
-}
-
-.table {
-    font-size: 12px;
-    border: none;
-    width: 100%;
-    word-spacing: 4px;
-    font-family: monospace;
-    white-space: PRE;
-    border-collapse: collapse;
-}
-
-.section-title {
-    margin-left: 24px;
-}
-
-.html-container {
-    padding:  25px 25px;
-}
-
-.login-button {
-    border: 1px solid gray;
-    color: gray;
-    border-radius: 15px;
-    padding: 4px 15px;
-    cursor: pointer;
-}
-
-td {
-    padding: 0;
-}
-
-.count {
-    white-space: nowrap;
-    text-align: right;
-    border-right: 1px solid black;
-    padding-right: 5px;
-}
-
-.line_no {
-    padding-left: 35px;
-    white-space: nowrap;
-    padding-right: 5px;
-    border-right: 1px dotted gray;
-}
-
-.code {
-    padding-left: 10px;
-    width: 99%;
-}
-
-.indicator {
-    display: inline-block;
-    width: 50px;
-    margin-top: 12px;
-    line-height: 18px;
-    border-radius: 10px;
-    padding: 2px 5px;
-    text-align: center;
-    font-size: 12px;
-    font-weight: bold;
-    color: white;
-}
-
-.total-count {
-    margin-top: 12px;
-    margin-right: 8px;
-    padding-right: 5px;
-    line-height: 22px;
-    border-right: 1px solid gray;
-    font-size: 12px;
-    font-weight: bold;
-    color: gray;
-}
-
-.uncovered {
-    background-color: LightPink;
-}
-
-.covered {
-    background-color: LightGreen;
-}
-
-.source-name {
-    margin-top: -25px;
-    padding-left: 45px;
-}
diff --git a/web/dashboard/src/main/webapp/css/show_graph.css b/web/dashboard/src/main/webapp/css/show_graph.css
deleted file mode 100644
index 51e4c04..0000000
--- a/web/dashboard/src/main/webapp/css/show_graph.css
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-#download {
-    bottom: 25px;
-    right: 25px;
-}
-
-#header-container {
-    padding: 50px;
-    padding-bottom: 30px;
-}
-
-#device-select-wrapper {
-    margin-top: 0;
-}
-
-#date-container {
-    padding: 0 50px;
-    padding-bottom: 25px;
-}
-
-#load {
-    margin-top: 5px;
-}
-
-.profiling-name {
-    font-weight: 200;
-    font-style: italic;
-    font-size: 1.4rem
-}
-
-#error-container {
-    padding-top: 25px;
-    padding-bottom: 25px;
-}
-
-.graph-wrapper {
-    padding: 30px;
-}
-
-.graph {
-    height: 500px;
-    padding-bottom: 30px;
-}
-
-.percentile-table {
-    width: auto;
-    margin: auto;
-    margin-top: 20px;
-}
-
-.percentile-table td, th{
-    font-size: 11px;
-    text-align: center;
-    padding: 5px 10px;
-}
-
diff --git a/web/dashboard/src/main/webapp/css/show_performance_digest.css b/web/dashboard/src/main/webapp/css/show_performance_digest.css
deleted file mode 100644
index 5d0c0e6..0000000
--- a/web/dashboard/src/main/webapp/css/show_performance_digest.css
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-#header-container {
-    padding: 25px;
-}
-
-#load {
-    margin-top: 15px;
-}
-
-#device-select-wrapper {
-    margin-top: 9px;
-}
-
-#date {
-    margin-bottom: 0;
-    margin-top: 10px;
-}
-
-div.col.card.summary {
-    padding: 0 20px 20px;
-}
-
-.profiling-name {
-    font-weight: 200;
-    font-style: italic;
-    font-size: 1.4rem
-}
-
-.profiling-subtitle {
-    font-style: italic;
-    font-size: 12px;
-    margin-left: 2px;
-}
-
-.summary table {
-    width: 100%;
-    border-collapse: collapse;
-    border: 1px solid black;
-    font-size: 12px;
-    font-family: Roboto !important;
-}
-
-.summary table td, th {
-    padding: 2px;
-}
-
-.section-label {
-    border: 1px solid black;
-}
-
-.axis-label {
-    border-top: 1px solid lightgray;
-    border-right: 1px solid black;
-    text-align: right;
-}
-
-.cell {
-    border-top: 1px solid lightgray;
-    text-align: right;
-}
-
-.inner-cell {
-    border-right: 1px solid lightgray;
-}
-
-.outer-cell {
-    border-right: 1px solid black;
-}
diff --git a/web/dashboard/src/main/webapp/css/show_plan_release.css b/web/dashboard/src/main/webapp/css/show_plan_release.css
deleted file mode 100644
index 0f198f0..0000000
--- a/web/dashboard/src/main/webapp/css/show_plan_release.css
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-#section-header {
-    cursor: default;
-    user-select: none;
-    color: #ee6e73;
-}
-#section-header:after {
-    border: 1px solid #ee6e73;
-    margin-top: 10px;
-    margin-bottom: 30px;
-    display: block;
-    content: " ";
-}
-.page-button-wrapper {
-    top: 50%;
-    bottom: auto;
-    padding: 0;
-}
-#newer-wrapper {
-    left: 23px;
-    right: auto;
-}
diff --git a/web/dashboard/src/main/webapp/css/show_table.css b/web/dashboard/src/main/webapp/css/show_table.css
deleted file mode 100644
index 0bc31db..0000000
--- a/web/dashboard/src/main/webapp/css/show_table.css
+++ /dev/null
@@ -1,202 +0,0 @@
-/* Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-table {
-    font-family: Roboto !important;
-    font-size: 13px !important;
-    white-space: nowrap !important;
-}
-.table-header-cell {
-    background-color: white;
-    transition: max-width 1s;
-    max-width: 150px;
-}
-.table-header-cell:hover {
-    transition-delay: 0.5s;
-    max-width: 1000px;
-}
-.table-header-content.table-header-legend {
-    max-width: none;
-}
-.table-header-content {
-    font-weight: initial;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    display: inline-block;
-    max-width: inherit;
-    width: 100%;
-}
-.page-button-wrapper {
-    top: 50%;
-    bottom: auto;
-    padding: 0;
-}
-#newer-wrapper {
-    left: 23px;
-    right: auto;
-}
-#chart-holder {
-    padding: 30px 5px;
-}
-#pie-chart-div {
-    width: 100%;
-    height: 300px;
-}
-#profiling-container {
-    padding: 0;
-}
-#error-div {
-    padding: 30px 25px;
-}
-#profiling-body {
-    border: none;
-}
-#profiling-list {
-    max-height: 200px;
-    overflow-y: scroll;
-}
-.collapsible-header {
-    user-select: none;
-}
-.collapsible-link {
-    color: inherit;
-}
-.collection a.collection-item.profiling-point-name {
-    color: #616161;
-    font-size: 13px;
-    padding: 2px 0 2px 25px;
-}
-#legend-wrapper {
-    display: inline-block;
-    padding: 10px 15px 12px;
-}
-#filter-wrapper {
-    height: 74px;
-}
-#search-icon-wrapper {
-    display: inline-block;
-    height: 100%;
-    padding-top: 26px;
-    padding-left: 15px;
-}
-#search-icon {
-    color: #9e9e9e;
-    cursor: default;
-}
-#help-icon-wrapper {
-    display: inline-block;
-    height: 100%;
-    padding-top: 26px;
-    padding-left: 0;
-}
-#help-icon {
-    color: #bdbdbd;
-    font-size: 18px;
-    cursor: help;
-}
-#search-wrapper {
-    display: inline-block;
-    width: 45%;
-    margin-top: 0;
-    margin-left: 5px;
-    top: -8px;
-}
-.input-field label {
-    left: 0;
-}
-.input-field label.active {
-    transform: translateY(-100%);
-}
-#refresh {
-    margin-top: 18px;
-    margin-right: 15px;
-}
-[type="checkbox"]+label {
-    padding-left: 25px;
-    margin-right: 20px;
-    margin-top: 28px;
-}
-.btn.inline-btn {
-    border-radius: 50px;
-    height: auto;
-    line-height: inherit;
-    padding: 1px;
-    margin-left: 2px;
-}
-i.material-icons.inline-icon {
-    font-size: inherit;
-}
-a.legend-circle {
-    width: 15px;
-    height: 15px;
-    padding: 0;
-    border-radius: 15px;
-}
-.legend-header-cell {
-    text-transform: capitalize;
-}
-.legend-entry {
-    display: inline-block;
-    margin: 0 5px;
-    min-width: 50px;
-}
-.legend-bubble {
-    border-radius: 20px;
-    height: 20px;
-    width: 20px;
-    margin: 0 auto;
-}
-#pie-chart-wrapper {
-    padding: 25px 0;
-}
-.pie-chart-title {
-    cursor: default;
-}
-div.status-icon {
-    width: 10px;
-    height: 10px;
-    border-radius: 10px;
-    display: inline-block;
-    margin-left: 5px;
-}
-.test-case-status {
-    border-radius: 50px;
-    display: inline-block;
-    height: 100%;
-    width: 100%;
-}
-.test-case-status.width-1 {
-    width: calc(100% - 18px);
-}
-.TEST_CASE_RESULT_PASS {
-    background-color: #7FFF00;
-}
-.TEST_CASE_RESULT_FAIL {
-    background-color: #ff4d4d;
-}
-.TEST_CASE_RESULT_SKIP {
-    background-color: #A8A8A8;
-}
-.TEST_CASE_RESULT_EXCEPTION {
-    background-color: black;
-}
-.TEST_CASE_RESULT_TIMEOUT {
-    background-color: #9900CC;
-}
-.UNKNOWN_RESULT {
-    background-color: white;
-    border: 1px #A8A8A8 solid;
-}
diff --git a/web/dashboard/src/main/webapp/css/show_test_runs_common.css b/web/dashboard/src/main/webapp/css/show_test_runs_common.css
deleted file mode 100644
index 5246f97..0000000
--- a/web/dashboard/src/main/webapp/css/show_test_runs_common.css
+++ /dev/null
@@ -1,178 +0,0 @@
-/* Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-.page-button-wrapper {
-    top: 50%;
-    bottom: auto;
-    padding: 0;
-}
-#newer-wrapper {
-    left: 23px;
-    right: auto;
-}
-#chart-holder {
-    padding: 30px 5px;
-}
-#pie-chart-div {
-    width: 100%;
-    height: 300px;
-}
-#profiling-container {
-    padding: 0;
-}
-#error-div {
-    padding: 30px 25px;
-}
-#profiling-body {
-    border: none;
-}
-#profiling-list {
-    max-height: 200px;
-    overflow-y: scroll;
-}
-.collapsible-header {
-    user-select: none;
-}
-.collapsible-link {
-    color: inherit;
-}
-.collection a.collection-item.profiling-point-name {
-    color: #616161;
-    font-size: 13px;
-    padding: 2px 0 2px 25px;
-}
-#legend-wrapper {
-    display: inline-block;
-    padding: 10px 15px 12px;
-}
-#filter-wrapper {
-    height: 74px;
-}
-#search-icon-wrapper {
-    display: inline-block;
-    height: 100%;
-    padding-top: 26px;
-    padding-left: 15px;
-}
-#search-icon {
-    color: #9e9e9e;
-    cursor: default;
-}
-#help-icon-wrapper {
-    display: inline-block;
-    height: 100%;
-    padding-top: 26px;
-    padding-left: 0;
-}
-#help-icon {
-    color: #bdbdbd;
-    font-size: 18px;
-    cursor: help;
-}
-#search-wrapper {
-    display: inline-block;
-    width: 45%;
-    margin-top: 0;
-    margin-left: 5px;
-    top: -8px;
-}
-.input-field label {
-    left: 0;
-}
-.input-field label.active {
-    transform: translateY(-100%);
-}
-#refresh {
-    margin-top: 18px;
-    margin-right: 15px;
-}
-[type="checkbox"]+label {
-    padding-left: 25px;
-    margin-right: 20px;
-    margin-top: 28px;
-}
-.btn.inline-btn {
-    border-radius: 50px;
-    height: auto;
-    line-height: inherit;
-    padding: 1px;
-    margin-left: 2px;
-}
-i.material-icons.inline-icon {
-    font-size: inherit;
-}
-a.legend-circle {
-    width: 15px;
-    height: 15px;
-    padding: 0;
-    border-radius: 15px;
-}
-.legend-header-cell {
-    text-transform: capitalize;
-}
-.legend-entry {
-    display: inline-block;
-    margin: 0 5px;
-    min-width: 50px;
-}
-.legend-bubble {
-    border-radius: 20px;
-    height: 20px;
-    width: 20px;
-    margin: 0 auto;
-}
-#pie-chart-wrapper {
-    padding: 25px 0;
-}
-.pie-chart-title {
-    cursor: default;
-}
-div.status-icon {
-    width: 10px;
-    height: 10px;
-    border-radius: 10px;
-    display: inline-block;
-    margin-left: 5px;
-}
-.test-case-status {
-    border-radius: 50px;
-    display: inline-block;
-    height: 100%;
-    width: 100%;
-}
-.test-case-status.width-1 {
-    width: calc(100% - 18px);
-}
-.TEST_CASE_RESULT_PASS {
-    background-color: #4CAF50;
-}
-.TEST_CASE_RESULT_FAIL {
-    background-color: #F44336;
-}
-.TEST_CASE_RESULT_SKIP {
-    background-color: #A8A8A8;
-}
-.TEST_CASE_RESULT_EXCEPTION {
-    background-color: black;
-}
-.TEST_CASE_RESULT_TIMEOUT {
-    background-color: #9900CC;
-}
-.UNKNOWN_RESULT {
-    background-color: white;
-    border: 1px #A8A8A8 solid;
-}
-.tabs > div.indicator {
-    height: 3px;
-}
diff --git a/web/dashboard/src/main/webapp/css/test_results.css b/web/dashboard/src/main/webapp/css/test_results.css
deleted file mode 100644
index f717e79..0000000
--- a/web/dashboard/src/main/webapp/css/test_results.css
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-li.test-run-container.active {
-    border-radius: 0 0 10px 10px;
-}
-.collapsible-header {
-    user-select: none;
-}
-.collapsible-header.disabled {
-    pointer-events: none;
-}
-.collapsible-header.test-run {
-    position: relative;
-}
-.test-run-metadata {
-    font-size: 13px;
-    line-height: 15px;
-    padding-top: 10px;
-    padding-bottom: 10px;
-    position: relative;
-    display: inline-block;
-    cursor: text;
-    user-select: initial;
-}
-.test-results.row {
-    margin: 0;
-    border-radius: 0 0 10px 10px;
-}
-.test-case-container {
-    border: 1px solid lightgray;
-    background: white;
-    padding: 10px;
-    margin-bottom: 25px;
-    max-height: 80%;
-    overflow: auto;
-}
-.indicator {
-    color: white;
-    font-size: 12px;
-    line-height: 20px;
-    font-weight: bold;
-    padding: 1px 6px;
-    margin-top: 10px;
-    min-width: 40px;
-    border-radius: 10px;
-}
-.indicator.padded {
-    margin-right: 5px;
-}
-.material-icons.expand-arrow {
-    right: 3px;
-    bottom: 0px;
-    position: absolute;
-    transition: transform 0.2s;
-}
-.rotate {
-    transform: rotate(-180deg);
-}
-i.material-icons.inline-icon {
-    font-size: inherit;
-}
-.test-run-label {
-    font-size: 18px;
-    line-height: 35px;
-    font-weight: 300;
-}
diff --git a/web/dashboard/src/main/webapp/js/plan_runs.js b/web/dashboard/src/main/webapp/js/plan_runs.js
deleted file mode 100644
index e81ad03..0000000
--- a/web/dashboard/src/main/webapp/js/plan_runs.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-(function ($, moment) {
-
-  /**
-   * Display test plan metadata in a vertical popout.
-   * @param container The jquery object in which to insert the plan metadata.
-   * @param metadataList The list of metadata objects to render on the display.
-   */
-  function renderCard(container, entry) {
-    var card = $('<div class="col s12 m6 l4"></div>');
-    card.appendTo(container);
-    var div = $('<div class="hoverable card release-entry"></div>');
-    var startTime = entry.testPlanRun.startTimestamp;
-    div.appendTo(card);
-    var span = $('<span></span>');
-    span.addClass('plan-run-metadata');
-    span.appendTo(div);
-    $('<b></b>').text(entry.deviceInfo).appendTo(span);
-    span.append('<br>');
-    $('<b></b>').text('VTS Build: ').appendTo(span);
-    span.append(entry.testPlanRun.testBuildId).append('<br>');
-    var timeString = moment().renderTime(startTime, true);
-    span.append(timeString);
-    var counter = $('<span></span>');
-    var color = entry.testPlanRun.failCount > 0 ? 'red' : 'green';
-    counter.addClass('counter center ' + color);
-    counter.append(
-      entry.testPlanRun.passCount + '/' +
-      (entry.testPlanRun.passCount + entry.testPlanRun.failCount));
-    counter.appendTo(div);
-    div.click(function () {
-      window.location.href = (
-        '/show_plan_run?plan=' + entry.testPlanRun.testPlanName +
-        '&time=' + entry.testPlanRun.startTimestamp);
-    })
-  }
-
-  $.fn.showPlanRuns = function(data) {
-    var self = $(this);
-    data.forEach(function (entry) {
-      renderCard(self, entry);
-    })
-  }
-
-})(jQuery, moment);
diff --git a/web/dashboard/src/main/webapp/js/test_results.js b/web/dashboard/src/main/webapp/js/test_results.js
deleted file mode 100644
index 6e929b1..0000000
--- a/web/dashboard/src/main/webapp/js/test_results.js
+++ /dev/null
@@ -1,267 +0,0 @@
-/**
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-(function ($, moment) {
-
-  /**
-   * Display the log links in a modal window.
-   * @param logList A list of [name, url] tuples representing log links.
-   */
-  function showLogs(container, logList) {
-    if (!logList || logList.length == 0) return;
-
-    var logCollection = $('<ul class="collection"></ul>');
-    var entries = logList.reduce(function(acc, entry) {
-      if (!entry || entry.length == 0) return acc;
-      var link = '<a href="' + entry[1] + '"';
-      link += 'class="collection-item">' + entry[0] + '</li>';
-      return acc + link;
-    }, '');
-    logCollection.html(entries);
-
-    if (container.find('#info-modal').length == 0) {
-      var modal = $('<div id="info-modal" class="modal"></div>');
-      var content = $('<div class="modal-content"></div>');
-      content.append('<h4>Logs</h4>');
-      content.append('<div class="info-container"></div>');
-      content.appendTo(modal);
-      modal.appendTo(container);
-    }
-    var infoContainer = $('#info-modal>.modal-content>.info-container');
-    infoContainer.empty();
-    logCollection.appendTo(infoContainer);
-    $('#info-modal').openModal();
-  }
-
-  /**
-   * Get the nickname for a test case result.
-   *
-   * Removes the result prefix and suffix, extracting only the result name.
-   *
-   * @param testCaseResult The string name of a VtsReportMessage.TestCaseResult.
-   * @returns the string nickname of the result.
-   */
-  function getNickname(testCaseResult) {
-    return testCaseResult
-      .replace('TEST_CASE_RESULT_', '')
-      .replace('_RESULT', '')
-      .trim().toLowerCase();
-  }
-
-  /**
-   * Display test data in the body beneath a test run's metadata.
-   * @param container The jquery object in which to insert the test metadata.
-   * @param data The json object containing the columns to display.
-   * @param lineHeight The height of each list element.
-   */
-  function displayTestDetails(container, data, lineHeight) {
-    var nCol = data.length;
-    var width = 12 / nCol;
-    test = container;
-    var maxLines = 0;
-    data.forEach(function (column) {
-      if (column.data == undefined || column.name == undefined) {
-        return;
-      }
-      var colContainer =
-        $('<div class="col s' + width + ' test-col"></div>');
-      var col = $('<div class="test-case-container"></div>');
-      colContainer.appendTo(container);
-      var count = column.data.length;
-      $('<h5>' + getNickname(column.name) + ' (' + count + ')' + '</h5>')
-        .appendTo(colContainer).css('text-transform', 'capitalize');
-      col.appendTo(colContainer);
-      var list = $('<ul></ul>').appendTo(col);
-      column.data.forEach(function (testCase) {
-        $('<li></li>')
-          .text(testCase)
-          .addClass('test-case')
-          .css('font-size', lineHeight - 2)
-          .css('line-height', lineHeight + 'px')
-          .appendTo(list);
-      });
-      if (count > maxLines) {
-        maxLines = count;
-      }
-    });
-    var containers = container.find('.test-case-container');
-    containers.height(maxLines * lineHeight);
-  }
-
-  /**
-   * Click handler for displaying test run details.
-   * @param e The click event.
-   */
-  function testRunClick(e) {
-    var header = $(this);
-    var icon = header.find('.material-icons.expand-arrow');
-    var container = header.parent().find('.test-results');
-    var test = header.attr('test');
-    var time = header.attr('time');
-    var url = '/api/test_run?test=' + test + '&timestamp=' + time;
-    if (header.parent().hasClass('active')) {
-      header.parent().removeClass('active');
-      header.removeClass('active');
-      icon.removeClass('rotate');
-      header.siblings('.collapsible-body').stop(true, false).slideUp({
-        duration: 100,
-        easing: "easeOutQuart",
-        queue: false,
-        complete: function() { header.css('height', ''); }
-      });
-    } else {
-      container.empty();
-      header.parent().addClass('active');
-      header.addClass('active');
-      header.addClass('disabled');
-      icon.addClass('rotate');
-      $.get(url).done(function(data) {
-        displayTestDetails(container, data, 16);
-        header.siblings('.collapsible-body').stop(true, false).slideDown({
-          duration: 100,
-          easing: "easeOutQuart",
-          queue: false,
-          complete: function() { header.css('height', ''); }
-        });
-      }).fail(function() {
-        icon.removeClass('rotate');
-      }).always(function() {
-        header.removeClass('disabled');
-      });
-    }
-  }
-
-  /**
-   * Append a clickable indicator link to the container.
-   * @param container The jquery object to append the indicator to.
-   * @param content The text to display in the indicator.
-   * @param classes Additional space-delimited classes to add to the indicator.
-   * @param click The click handler to assign to the indicator.
-   * @returns The jquery object for the indicator.
-   */
-  function createClickableIndicator(container, content, classes, click) {
-    var link = $('<a></a>');
-    link.addClass('indicator right center padded hoverable waves-effect');
-    link.addClass(classes)
-    link.append(content);
-    link.appendTo(container);
-    link.click(click);
-    return link;
-  }
-
-  function displayTestMetadata(container, metadataList, showTestNames=false) {
-    var popout = $('<ul></ul>');
-    popout.attr('data-collapsible', 'expandable');
-    popout.addClass('collapsible popout test-runs');
-    popout.appendTo(container);
-    popout.unbind();
-    metadataList.forEach(function (metadata) {
-      var li = $('<li class="test-run-container"></li>');
-      li.appendTo(popout);
-      var div = $('<div></div>');
-      var test = metadata.testRun.testName;
-      var startTime = metadata.testRun.startTimestamp;
-      var endTime = metadata.testRun.endTimestamp;
-      div.attr('test', test);
-      div.attr('time', startTime);
-      div.addClass('collapsible-header test-run');
-      div.appendTo(li);
-      div.unbind().click(testRunClick);
-      var span = $('<span></span>');
-      span.addClass('test-run-metadata');
-      span.appendTo(div);
-      span.click(function() { return false; });
-      if (showTestNames) {
-          $('<span class="test-run-label"></span>').text(test).appendTo(span);
-          span.append('<br>');
-      }
-      $('<b></b>').text(metadata.deviceInfo).appendTo(span);
-      span.append('<br>');
-      $('<b></b>').text('ABI: ')
-            .appendTo(span)
-      span.append(metadata.abiInfo).append('<br>');
-      $('<b></b>').text('VTS Build: ')
-            .appendTo(span)
-      span.append(metadata.testRun.testBuildId).append('<br>');
-      $('<b></b>').text('Host: ')
-            .appendTo(span)
-      span.append(metadata.testRun.hostName).append('<br>');
-      var timeString = (
-        moment().renderTime(startTime, false) + ' - ' +
-        moment().renderTime(endTime, true) + ' (' +
-        moment().renderDuration(endTime - startTime) + ')');
-      span.append(timeString);
-      var indicator = $('<span></span>');
-      var color = metadata.testRun.failCount > 0 ? 'red' : 'green';
-      indicator.addClass('indicator right center ' + color);
-      indicator.append(
-        metadata.testRun.passCount + '/' +
-        (metadata.testRun.passCount + metadata.testRun.failCount));
-      indicator.appendTo(div);
-      if (metadata.testRun.coveredLineCount != undefined &&
-        metadata.testRun.totalLineCount != undefined) {
-        var url = (
-          '/show_coverage?testName=' + test + '&startTime=' + startTime);
-        covered = metadata.testRun.coveredLineCount;
-        total = metadata.testRun.totalLineCount;
-        covPct = Math.round(covered / total * 1000) / 10;
-        var color = covPct < 70 ? 'red' : 'green';
-        var coverage = (
-          'Coverage: ' + covered + '/' + total + ' (' + covPct + '%)');
-        createClickableIndicator(
-          div, coverage, color,
-          function () { window.location.href = url; return false; });
-      }
-      if (metadata.testRun.logLinks != undefined) {
-        createClickableIndicator(
-          div, 'Logs', 'grey lighten-1',
-          function () {
-            showLogs(popout, metadata.testRun.logLinks);
-            return false;
-          });
-      }
-      var expand = $('<i></i>');
-      expand.addClass('material-icons expand-arrow')
-      expand.text('expand_more');
-      expand.appendTo(div);
-      var body = $('<div></div>')
-        .addClass('collapsible-body test-results row grey lighten-4')
-        .appendTo(li);
-      if (metadata.testDetails != undefined) {
-        expand.addClass('rotate');
-        li.addClass('active');
-        div.addClass('active');
-        displayTestDetails(body, metadata.testDetails, 16);
-        div.siblings('.collapsible-body').stop(true, false).slideDown({
-          duration: 0,
-          queue: false,
-          complete: function() { div.css('height', ''); }
-        });
-      }
-    });
-  }
-
-  /**
-   * Display test metadata in a vertical popout.
-   * @param container The jquery object in which to insert the test metadata.
-   * @param metadataList The list of metadata objects to render on the display.
-   * @param showTestNames True to label each entry with the test module name.
-   */
-  $.fn.showTests = function(metadataList, showTestNames=false) {
-    displayTestMetadata($(this), metadataList, showTestNames);
-  }
-
-})(jQuery, moment);
diff --git a/web/dashboard/src/main/webapp/js/time.js b/web/dashboard/src/main/webapp/js/time.js
deleted file mode 100644
index c5fbef6..0000000
--- a/web/dashboard/src/main/webapp/js/time.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-(function (moment) {
-
-  /**
-   * Renders a timestamp in the user timezone.
-   * @param timestamp The long timestamp to render (in microseconds).
-   * @param showTimezone True if the timezone should be rendered, false otherwise.
-   * @returns the string-formatted version of the provided timestamp.
-   */
-  moment.prototype.renderTime = function (timestamp, showTimezone) {
-    var time = moment(timestamp / 1000);
-    var format = 'H:mm:ss';
-    if (!time.isSame(moment(), 'd')) {
-        format = 'M/D/YY ' + format;
-    }
-    if (!!showTimezone) {
-        format = format + 'ZZ';
-    }
-    return time.format(format);
-  }
-
-  /**
-   * Renders a duration in the user timezone.
-   * @param durationTimestamp The long duration to render (in microseconds).
-   * @returns the string-formatted duration of the provided duration timestamp.
-   */
-  moment.prototype.renderDuration = function (durationTimestamp) {
-    var fmt = 's[s]';
-    var duration = moment.utc(durationTimestamp / 1000);
-    if (duration.hours() > 0) {
-      fmt = 'H[h], m[m], ' + fmt;
-    } else if (duration.minutes() > 0) {
-      fmt = 'm[m], ' + fmt;
-    }
-    return duration.format(fmt);
-  }
-
-})(moment);
diff --git a/web/dashboard/src/test/java/com/android/vts/servlet/VtsPerformanceJobServletTest.java b/web/dashboard/src/test/java/com/android/vts/servlet/VtsPerformanceJobServletTest.java
deleted file mode 100644
index c1717da..0000000
--- a/web/dashboard/src/test/java/com/android/vts/servlet/VtsPerformanceJobServletTest.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.servlet;
-
-import static org.junit.Assert.*;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.android.vts.util.PerformanceSummary;
-import com.android.vts.util.ProfilingPointSummary;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
-import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class VtsPerformanceJobServletTest {
-    private final LocalServiceTestHelper helper =
-            new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
-
-    private static final String LABEL = "testLabel";
-    private static final String ROOT = "src/test/res/servlet";
-    private static final String[] LABELS = new String[] {"label1", "label2", "label3"};
-    private static final long[] HIGH_VALS = new long[] {10, 20, 30};
-    private static final long[] LOW_VALS = new long[] {1, 2, 3};
-
-    List<PerformanceSummary> dailySummaries;
-    List<String> legendLabels;
-
-    /**
-     * Helper method for creating ProfilingPointRunEntity objects.
-     *
-     * @param labels The list of data labels.
-     * @param values The list of data values. Must be equal in size to the labels list.
-     * @param regressionMode The regression mode.
-     * @return A ProfilingPointRunEntity with specified arguments.
-     */
-    private static ProfilingPointRunEntity createProfilingReport(
-            String[] labels, long[] values, VtsProfilingRegressionMode regressionMode) {
-        List<String> labelList = Arrays.asList(labels);
-        List<Long> valueList = new ArrayList<>();
-        for (long value : values) {
-            valueList.add(value);
-        }
-        return new ProfilingPointRunEntity(KeyFactory.createKey(TestEntity.KIND, "test"), "name", 0,
-                regressionMode.getNumber(), labelList, valueList, "", "");
-    }
-
-    /** Asserts whether text is the same as the contents in the baseline file specified. */
-    private static void compareToBaseline(String text, String baselineFilename)
-            throws FileNotFoundException, IOException {
-        File f = new File(ROOT, baselineFilename);
-        String baseline = "";
-        try (BufferedReader br = new BufferedReader(new FileReader(f))) {
-            StringBuilder sb = new StringBuilder();
-            String line = br.readLine();
-
-            while (line != null) {
-                sb.append(line);
-                line = br.readLine();
-            }
-            baseline = sb.toString();
-        }
-        assertEquals(baseline, text);
-    }
-
-    @Before
-    public void setUp() {
-        helper.setUp();
-    }
-
-    @After
-    public void tearDown() {
-        helper.tearDown();
-    }
-
-    public void setUp(boolean grouped) {
-        dailySummaries = new ArrayList<>();
-        legendLabels = new ArrayList<>();
-        legendLabels.add("");
-
-        // Add today's data
-        PerformanceSummary today = new PerformanceSummary();
-        ProfilingPointSummary summary = new ProfilingPointSummary();
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointRunEntity pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        if (grouped) {
-            summary.updateLabel(pt, LABEL);
-            summary.updateLabel(pt, LABEL);
-        } else {
-            summary.update(pt);
-            summary.update(pt);
-        }
-        today.insertProfilingPointSummary("p1", summary);
-
-        summary = new ProfilingPointSummary();
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING;
-        pt = createProfilingReport(LABELS, LOW_VALS, mode);
-        if (grouped) {
-            summary.updateLabel(pt, LABEL);
-            summary.updateLabel(pt, LABEL);
-        } else {
-            summary.update(pt);
-            summary.update(pt);
-        }
-        today.insertProfilingPointSummary("p2", summary);
-        dailySummaries.add(today);
-        legendLabels.add("today");
-
-        // Add yesterday data with regressions
-        PerformanceSummary yesterday = new PerformanceSummary();
-        summary = new ProfilingPointSummary();
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        pt = createProfilingReport(LABELS, LOW_VALS, mode);
-        if (grouped) {
-            summary.updateLabel(pt, LABEL);
-            summary.updateLabel(pt, LABEL);
-        } else {
-            summary.update(pt);
-            summary.update(pt);
-        }
-        yesterday.insertProfilingPointSummary("p1", summary);
-
-        summary = new ProfilingPointSummary();
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING;
-        pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        if (grouped) {
-            summary.updateLabel(pt, LABEL);
-            summary.updateLabel(pt, LABEL);
-        } else {
-            summary.update(pt);
-            summary.update(pt);
-        }
-        yesterday.insertProfilingPointSummary("p2", summary);
-        dailySummaries.add(yesterday);
-        legendLabels.add("yesterday");
-
-        // Add last week data without regressions
-        PerformanceSummary lastWeek = new PerformanceSummary();
-        summary = new ProfilingPointSummary();
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        summary.update(pt);
-        summary.update(pt);
-        lastWeek.insertProfilingPointSummary("p1", summary);
-
-        summary = new ProfilingPointSummary();
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING;
-        pt = createProfilingReport(LABELS, LOW_VALS, mode);
-        summary.update(pt);
-        summary.update(pt);
-        lastWeek.insertProfilingPointSummary("p2", summary);
-        dailySummaries.add(lastWeek);
-        legendLabels.add("last week");
-    }
-
-    /**
-     * End-to-end test of performance report in the normal case. The normal case is when a profiling
-     * point is added or removed from the test.
-     */
-    @Test
-    public void testPerformanceSummaryNormal() throws FileNotFoundException, IOException {
-        setUp(false);
-        String output =
-                VtsPerformanceJobServlet.getPeformanceSummary("test", dailySummaries, legendLabels);
-        compareToBaseline(output, "performanceSummary1.html");
-    }
-
-    /** End-to-end test of performance report when a profiling point was removed in the latest run.
-     */
-    @Test
-    public void testPerformanceSummaryDroppedProfilingPoint()
-            throws FileNotFoundException, IOException {
-        setUp(false);
-        PerformanceSummary yesterday = dailySummaries.get(dailySummaries.size() - 1);
-        ProfilingPointSummary summary = new ProfilingPointSummary();
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointRunEntity pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        summary.update(pt);
-        summary.update(pt);
-        yesterday.insertProfilingPointSummary("p3", summary);
-        String output =
-                VtsPerformanceJobServlet.getPeformanceSummary("test", dailySummaries, legendLabels);
-        compareToBaseline(output, "performanceSummary2.html");
-    }
-
-    /** End-to-end test of performance report when a profiling point was added in the latest run. */
-    @Test
-    public void testPerformanceSummaryAddedProfilingPoint()
-            throws FileNotFoundException, IOException {
-        setUp(false);
-        PerformanceSummary today = dailySummaries.get(0);
-        ProfilingPointSummary summary = new ProfilingPointSummary();
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointRunEntity pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        summary.update(pt);
-        summary.update(pt);
-        today.insertProfilingPointSummary("p3", summary);
-        String output =
-                VtsPerformanceJobServlet.getPeformanceSummary("test", dailySummaries, legendLabels);
-        compareToBaseline(output, "performanceSummary3.html");
-    }
-
-    /** End-to-end test of performance report labels are grouped (e.g. as if using unlabeled data)
-     */
-    @Test
-    public void testPerformanceSummaryGroupedNormal() throws FileNotFoundException, IOException {
-        setUp(true);
-        String output =
-                VtsPerformanceJobServlet.getPeformanceSummary("test", dailySummaries, legendLabels);
-        compareToBaseline(output, "performanceSummary4.html");
-    }
-}
diff --git a/web/dashboard/src/test/java/com/android/vts/util/ProfilingPointSummaryTest.java b/web/dashboard/src/test/java/com/android/vts/util/ProfilingPointSummaryTest.java
deleted file mode 100644
index a7967e3..0000000
--- a/web/dashboard/src/test/java/com/android/vts/util/ProfilingPointSummaryTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import static org.junit.Assert.*;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
-import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ProfilingPointSummaryTest {
-    private final LocalServiceTestHelper helper =
-            new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
-    private static String[] labels = new String[] {"label1", "label2", "label3"};
-    private static long[] values = new long[] {1, 2, 3};
-    private static ProfilingPointSummary summary;
-
-    /**
-     * Helper method for creating ProfilingPointRunEntity objects.
-     *
-     * @param labels The list of data labels.
-     * @param values The list of data values. Must be equal in size to the labels list.
-     * @param regressionMode The regression mode.
-     * @return A ProfilingPointRunEntity with specified arguments.
-     */
-    private static ProfilingPointRunEntity createProfilingReport(
-            String[] labels, long[] values, VtsProfilingRegressionMode regressionMode) {
-        List<String> labelList = Arrays.asList(labels);
-        List<Long> valueList = new ArrayList<>();
-        for (long value : values) {
-            valueList.add(value);
-        }
-        return new ProfilingPointRunEntity(KeyFactory.createKey(TestEntity.KIND, "test"), "name", 0,
-                regressionMode.getNumber(), labelList, valueList, "x", "y");
-    }
-
-    @Before
-    public void setUp() {
-        helper.setUp();
-        summary = new ProfilingPointSummary();
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointRunEntity pt = createProfilingReport(labels, values, mode);
-        summary.update(pt);
-    }
-
-    @After
-    public void tearDown() {
-        helper.tearDown();
-    }
-
-    /** Test that all labels are found by hasLabel. */
-    @Test
-    public void testHasLabel() {
-        for (String label : labels) {
-            assertTrue(summary.hasLabel(label));
-        }
-    }
-
-    /** Test that invalid labels are not found by hasLabel. */
-    @Test
-    public void testInvalidHasLabel() {
-        assertFalse(summary.hasLabel("bad label"));
-    }
-
-    /** Test that all stat summaries can be retrieved by profiling point label. */
-    @Test
-    public void testGetStatSummary() {
-        for (String label : labels) {
-            StatSummary stats = summary.getStatSummary(label);
-            assertNotNull(stats);
-            assertEquals(label, stats.getLabel());
-        }
-    }
-
-    /** Test that the getStatSummary method returns null when the label is not present. */
-    @Test
-    public void testInvalidGetStatSummary() {
-        StatSummary stats = summary.getStatSummary("bad label");
-        assertNull(stats);
-    }
-
-    /** Test that StatSummary objects are iterated in the order that the labels were provided. */
-    @Test
-    public void testIterator() {
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointRunEntity pt = createProfilingReport(labels, values, mode);
-        summary.update(pt);
-
-        int i = 0;
-        for (StatSummary stats : summary) {
-            assertEquals(labels[i++], stats.getLabel());
-        }
-    }
-
-    /** Test that the updateLabel method updates the StatSummary for just the label provided. */
-    @Test
-    public void testUpdateLabelGrouped() {
-        summary = new ProfilingPointSummary();
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointRunEntity pt = createProfilingReport(labels, values, mode);
-        summary.updateLabel(pt, labels[0]);
-
-        // Ensure the label specified is present and has been updated for each data point.
-        assertTrue(summary.hasLabel(labels[0]));
-        assertNotNull(summary.getStatSummary(labels[0]));
-        assertEquals(summary.getStatSummary(labels[0]).getCount(), labels.length);
-
-        // Check that the other labels were not updated.
-        for (int i = 1; i < labels.length; i++) {
-            assertFalse(summary.hasLabel(labels[i]));
-        }
-    }
-}
diff --git a/web/dashboard/src/test/java/com/android/vts/util/StatSummaryTest.java b/web/dashboard/src/test/java/com/android/vts/util/StatSummaryTest.java
deleted file mode 100644
index 333e3b5..0000000
--- a/web/dashboard/src/test/java/com/android/vts/util/StatSummaryTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you
- * may not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.vts.util;
-
-import static org.junit.Assert.*;
-
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import java.util.Random;
-import org.junit.Before;
-import org.junit.Test;
-
-public class StatSummaryTest {
-    private static double threshold = 0.0000000001;
-    private StatSummary test;
-
-    @Before
-    public void setUp() {
-        test = new StatSummary("label", VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING);
-    }
-
-    /** Test computation of average. */
-    @Test
-    public void testAverage() {
-        int n = 1000;
-        double mean = (n - 1) / 2.0;
-        for (int i = 0; i < n; i++) {
-            test.updateStats(i);
-        }
-        assertEquals(n, test.getCount(), threshold);
-        assertEquals(mean, test.getMean(), threshold);
-    }
-
-    /** Test computation of minimum. */
-    @Test
-    public void testMin() {
-        double min = Double.MAX_VALUE;
-        int n = 1000;
-        Random rand = new Random();
-        for (int i = 0; i < n; i++) {
-            double value = rand.nextInt(1000);
-            if (value < min)
-                min = value;
-            test.updateStats(value);
-        }
-        assertEquals(n, test.getCount(), threshold);
-        assertEquals(min, test.getMin(), threshold);
-    }
-
-    /** Test computation of maximum. */
-    @Test
-    public void testMax() {
-        double max = Double.MIN_VALUE;
-        int n = 1000;
-        Random rand = new Random();
-        for (int i = 0; i < n; i++) {
-            double value = rand.nextInt(1000);
-            if (value > max)
-                max = value;
-            test.updateStats(value);
-        }
-        assertEquals(max, test.getMax(), threshold);
-    }
-
-    /** Test computation of standard deviation. */
-    @Test
-    public void testStd() {
-        int n = 1000;
-        double[] values = new double[n];
-        Random rand = new Random();
-        double sum = 0.0;
-        for (int i = 0; i < n; i++) {
-            values[i] = rand.nextInt(1000);
-            sum += values[i];
-            test.updateStats(values[i]);
-        }
-        double mean = sum / n;
-        double sumSq = 0;
-        for (int i = 0; i < n; i++) {
-            sumSq += (values[i] - mean) * (values[i] - mean);
-        }
-        double std = Math.sqrt(sumSq / (n - 1));
-        assertEquals(std, test.getStd(), threshold);
-    }
-}
diff --git a/web/dashboard/src/test/res/driver/chromedriver b/web/dashboard/src/test/res/driver/chromedriver
deleted file mode 100755
index bbb06c3..0000000
--- a/web/dashboard/src/test/res/driver/chromedriver
+++ /dev/null
Binary files differ
diff --git a/web/dashboard/src/test/res/driver/config.properties b/web/dashboard/src/test/res/driver/config.properties
deleted file mode 100644
index 939fa90..0000000
--- a/web/dashboard/src/test/res/driver/config.properties
+++ /dev/null
@@ -1 +0,0 @@
-LOCALHOST=localhost:8080
\ No newline at end of file
diff --git a/web/dashboard/src/test/res/servlet/performanceSummary1.html b/web/dashboard/src/test/res/servlet/performanceSummary1.html
deleted file mode 100644
index 3b01593..0000000
--- a/web/dashboard/src/test/res/servlet/performanceSummary1.html
+++ /dev/null
@@ -1 +0,0 @@
-<p style='font-family: arial'><b>test</b></p><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p1</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p2</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Higher values are better. Maximum is the best-case performance.</i><br><br>
\ No newline at end of file
diff --git a/web/dashboard/src/test/res/servlet/performanceSummary2.html b/web/dashboard/src/test/res/servlet/performanceSummary2.html
deleted file mode 100644
index 3b01593..0000000
--- a/web/dashboard/src/test/res/servlet/performanceSummary2.html
+++ /dev/null
@@ -1 +0,0 @@
-<p style='font-family: arial'><b>test</b></p><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p1</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p2</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Higher values are better. Maximum is the best-case performance.</i><br><br>
\ No newline at end of file
diff --git a/web/dashboard/src/test/res/servlet/performanceSummary3.html b/web/dashboard/src/test/res/servlet/performanceSummary3.html
deleted file mode 100644
index 1ff1028..0000000
--- a/web/dashboard/src/test/res/servlet/performanceSummary3.html
+++ /dev/null
@@ -1 +0,0 @@
-<p style='font-family: arial'><b>test</b></p><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p1</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p2</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Higher values are better. Maximum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p3</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br>
\ No newline at end of file
diff --git a/web/dashboard/src/test/res/servlet/performanceSummary4.html b/web/dashboard/src/test/res/servlet/performanceSummary4.html
deleted file mode 100644
index 8fc8997..0000000
--- a/web/dashboard/src/test/res/servlet/performanceSummary4.html
+++ /dev/null
@@ -1 +0,0 @@
-<p style='font-family: arial'><b>test</b></p><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p1</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>testLabel</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>8.94</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0.89</td><td></td><td></td><td></td><td></td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p2</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>testLabel</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0.89</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>8.94</td><td></td><td></td><td></td><td></td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Higher values are better. Maximum is the best-case performance.</i><br><br>
\ No newline at end of file