Merge "Use config options instead of hardcoded values."
diff --git a/Android.mk b/Android.mk
index 6e15608..ad73d41 100644
--- a/Android.mk
+++ b/Android.mk
@@ -24,8 +24,9 @@
 include $(CLEAR_VARS)
 
 VTS_PYTHON_ZIP := $(HOST_OUT)/vts_runner_python/vts_runner_python.zip
-VTS_CAMERAITS_ZIP := $(HOST_OUT)/vts/CameraITS.zip
-VTS_TESTCASES_OUT := $(HOST_OUT)/vts/android-vts/testcases
+VTS_OUT_ROOT := $(HOST_OUT)/vts
+VTS_CAMERAITS_ZIP := $(VTS_OUT_ROOT)/CameraITS.zip
+VTS_TESTCASES_OUT := $(VTS_OUT_ROOT)/android-vts/testcases
 
 .PHONY: $(VTS_PYTHON_ZIP) $(VTS_CAMERAITS_ZIP)
 $(VTS_PYTHON_ZIP): $(SOONG_ZIP)
@@ -49,7 +50,12 @@
 	$(hide) unzip $@ -d $(VTS_TESTCASES_OUT)/CameraITS
 
 .PHONY: vts
-vts: $(VTS_PYTHON_ZIP) $(VTS_CAMERAITS_ZIP)
+
+my_deps_copy_pairs :=
+  $(foreach d,$(ADDITIONAL_VTS_JARS),\
+    $(eval my_deps_copy_pairs += $(d):$(VTS_OUT_ROOT)/$(notdir $(d))))
+
+vts: $(VTS_PYTHON_ZIP) $(VTS_CAMERAITS_ZIP) $(call copy-many-files,$(my_deps_copy_pairs))
 
 endif # vts
 endif # linux
diff --git a/agents/hal/AgentRequestHandler.cpp b/agents/hal/AgentRequestHandler.cpp
index c31c0b7..457e18f 100644
--- a/agents/hal/AgentRequestHandler.cpp
+++ b/agents/hal/AgentRequestHandler.cpp
@@ -116,7 +116,8 @@
 bool AgentRequestHandler::LaunchDriverService(
     int driver_type, const string& service_name, const string& file_path,
     int target_class, int target_type, float target_version,
-    const string& target_package, const string& module_name, int bits) {
+    const string& target_package, const string& target_component_name,
+    const string& module_name, int bits) {
   cout << "[runner->agent] command " << __FUNCTION__ << endl;
   ResponseCode result = FAIL;
 
@@ -252,7 +253,8 @@
             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, module_name);
+                                   target_version, target_package,
+                                   target_component_name, module_name);
           cout << "[driver->agent]: LoadHal returns " << result << endl;
           if (result == VTS_DRIVER_RESPONSE_SUCCESS) {
             response_msg.set_response_code(SUCCESS);
@@ -505,8 +507,8 @@
           command_msg.driver_type(), command_msg.service_name(),
           command_msg.file_path(), command_msg.target_class(),
           command_msg.target_type(), command_msg.target_version() / 100.0,
-          command_msg.target_package(), command_msg.module_name(),
-          command_msg.bits());
+          command_msg.target_package(), command_msg.target_component_name(),
+          command_msg.module_name(), command_msg.bits());
     case VTS_AGENT_COMMAND_READ_SPECIFICATION:
       return ReadSpecification(command_msg.service_name());
     case LIST_APIS:
diff --git a/agents/hal/AgentRequestHandler.h b/agents/hal/AgentRequestHandler.h
index be0008b..8e7a36a 100644
--- a/agents/hal/AgentRequestHandler.h
+++ b/agents/hal/AgentRequestHandler.h
@@ -66,6 +66,7 @@
                            const string& file_path, int target_class,
                            int target_type, float target_version,
                            const string& target_package,
+                           const string& target_component_name,
                            const string& module_name, int bits);
 
   // for the VTS_AGENT_COMMAND_READ_SPECIFICATION`
diff --git a/agents/hal/SocketClientToDriver.cpp b/agents/hal/SocketClientToDriver.cpp
index d4e33ac..188db3e 100644
--- a/agents/hal/SocketClientToDriver.cpp
+++ b/agents/hal/SocketClientToDriver.cpp
@@ -68,6 +68,7 @@
                                        int target_class, int target_type,
                                        float target_version,
                                        const string& target_package,
+                                       const string& target_component_name,
                                        const string& module_name) {
   VtsDriverControlCommandMessage command_message;
   command_message.set_command_type(LOAD_HAL);
@@ -76,6 +77,7 @@
   command_message.set_target_type(target_type);
   command_message.set_target_version(target_version);
   command_message.set_target_package(target_package);
+  command_message.set_target_component_name(target_component_name);
   command_message.set_module_name(module_name);
   if (!VtsSocketSendMessage(command_message)) return -1;
 
diff --git a/agents/hal/SocketClientToDriver.h b/agents/hal/SocketClientToDriver.h
index 1008ac1..877c321 100644
--- a/agents/hal/SocketClientToDriver.h
+++ b/agents/hal/SocketClientToDriver.h
@@ -42,6 +42,7 @@
   // Sends a LOAD_HAL request.
   int32_t LoadHal(const string& file_path, int target_class, int target_type,
                   float target_version, const string& target_package,
+                  const string& target_component_name,
                   const string& module_name);
 
   // Sends a LIST_FUNCTIONS request.
diff --git a/doc/developer_testing/kernel/run_individual_ltp_testcase.md b/doc/developer_testing/kernel/run_individual_ltp_testcase.md
index 2fabb22..7351688 100644
--- a/doc/developer_testing/kernel/run_individual_ltp_testcase.md
+++ b/doc/developer_testing/kernel/run_individual_ltp_testcase.md
@@ -9,13 +9,13 @@
 `> run vts-kernel -m KernelLtpTest -t <testname1,testname2,...>`
 
 Test names in filter can be any of the following formats:
-`<testsuite-testname>`, `<testsuite-testname_Nbit>`, `<testname>`
+`<testsuite.testname>`, `<testsuite.testname_bitness>`, `<testname>`
 
 It is recommended to include test suite, i.e., the first two formats above.
 
 Example:
 
-`> run vts-kernel -m KernelLtpTest -t syscalls-accept01,mm-mmapstress05`
+`> run vts-kernel -m KernelLtpTest -t syscalls.accept01,mm.mmapstress05_64bit`
 
 Test cases specified in this filter will be run regardless of
 whether they are disabled in configuration, unless a specified test case name
diff --git a/drivers/libprofiling/VtsProfilingInterface.cpp b/drivers/libprofiling/VtsProfilingInterface.cpp
index 37c4825..bd2ad76 100644
--- a/drivers/libprofiling/VtsProfilingInterface.cpp
+++ b/drivers/libprofiling/VtsProfilingInterface.cpp
@@ -13,9 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 #include "VtsProfilingInterface.h"
 
+#include <fstream>
+#include <string>
+
+#include <android-base/logging.h>
+#include <google/protobuf/text_format.h>
+
 #include "test/vts/proto/VtsDriverControlMessage.pb.h"
 
 using namespace std;
@@ -27,14 +32,64 @@
 const int VtsProfilingInterface::kProfilingPointCallback = 2;
 const int VtsProfilingInterface::kProfilingPointExit = 3;
 
-VtsProfilingInterface& VtsProfilingInterface::getInstance()
-{
-    static VtsProfilingInterface instance;
-    return instance;
+VtsProfilingInterface::VtsProfilingInterface(const string& trace_file_path)
+    : trace_file_path_(trace_file_path),
+      trace_output_(nullptr),
+      initialized_(false) {
 }
 
-bool VtsProfilingInterface::AddTraceEvent(
+VtsProfilingInterface::~VtsProfilingInterface() {
+  if (trace_output_) {
+    trace_output_.close();
+  }
+}
+
+static int64_t NanoTime() {
+  std::chrono::nanoseconds duration(
+      std::chrono::steady_clock::now().time_since_epoch());
+  return static_cast<int64_t>(duration.count());
+}
+
+VtsProfilingInterface& VtsProfilingInterface::getInstance(
+    const string& trace_file_path) {
+  static VtsProfilingInterface instance(trace_file_path);
+  return instance;
+}
+
+void VtsProfilingInterface::Init() {
+  if (initialized_) return;
+  // Attach timestamp for the trace file.
+  string file_path = trace_file_path_ + "_" + to_string(NanoTime());
+  LOG(INFO) << "Creating new profiler instance with file path: " << file_path;
+  trace_output_ = std::ofstream(file_path, std::fstream::out);
+  if (!trace_output_) {
+    LOG(ERROR) << "Can not open trace file: " << trace_file_path_;
+    exit(1);
+  }
+  initialized_ = true;
+}
+
+bool VtsProfilingInterface::AddTraceEvent(const char* package,
+    const char* version, const char* interface,
     const FunctionSpecificationMessage& message) {
+  if (!initialized_) {
+    LOG(ERROR) << "Profiler not initialized. ";
+    return false;
+  }
+  string msg_str;
+  if (!google::protobuf::TextFormat::PrintToString(message, &msg_str)) {
+    LOG(ERROR) << "Can't print the message";
+    return false;
+  }
+
+  mutex_.lock();
+  // Record the event data with the following format:
+  // timestamp,package_name,package_version,interface_name,message
+  trace_output_ << NanoTime() << "," << package << "," << version << ","
+                << interface << "," << msg_str << "\n";
+  trace_output_.flush();
+  mutex_.unlock();
+
   return true;
 }
 
diff --git a/drivers/libprofiling/VtsProfilingInterface.h b/drivers/libprofiling/VtsProfilingInterface.h
index a5d696b..5636a26 100644
--- a/drivers/libprofiling/VtsProfilingInterface.h
+++ b/drivers/libprofiling/VtsProfilingInterface.h
@@ -18,6 +18,8 @@
 #define __VTS_DRIVER_PROFILING_INTERFACE_H_
 
 #include <android-base/macros.h>
+#include <fstream>
+#include <utils/Condition.h>
 
 #include "test/vts/proto/ComponentSpecificationMessage.pb.h"
 
@@ -37,18 +39,26 @@
   // for the API exit on the stub side.
   static const int kProfilingPointExit;
 
-  //Get and create the VtsProfilingInterface singleton.
-  static VtsProfilingInterface& getInstance();
+  explicit VtsProfilingInterface(const string& trace_file_path);
 
-  VtsProfilingInterface() {};
+  virtual ~VtsProfilingInterface();
 
-  virtual ~VtsProfilingInterface() {};
+  void Init();
+
+  // Get and create the VtsProfilingInterface singleton.
+  static VtsProfilingInterface& getInstance(const string& trace_file_path);
 
   // returns true if the given message is added to the tracing queue.
-  bool AddTraceEvent(const FunctionSpecificationMessage& message);
+  bool AddTraceEvent(const char* package, const char* version,
+      const char* interface, const FunctionSpecificationMessage& message);
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(VtsProfilingInterface);
+  string trace_file_path_;  // Path of the trace file.
+  std::ofstream trace_output_;  // Writer to the trace file.
+  Mutex mutex_;  // Mutex used to synchronize the writing to the trace file.
+  bool initialized_;
+
+  DISALLOW_COPY_AND_ASSIGN (VtsProfilingInterface);
 };
 
 }  // namespace vts
diff --git a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTest.java b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTest.java
index 984d917..9ec8742 100644
--- a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTest.java
+++ b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTest.java
@@ -30,6 +30,7 @@
 import com.android.tradefed.util.CommandResult;
 import com.android.tradefed.util.CommandStatus;
 import com.android.tradefed.util.FileUtil;
+import com.android.tradefed.util.StreamUtil;
 import com.android.tradefed.util.JsonUtil;
 import com.android.tradefed.util.IRunUtil;
 import com.android.tradefed.util.RunUtil;
@@ -43,6 +44,7 @@
 import java.io.FileNotFoundException;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.Paths;
 import java.util.TreeSet;
 import java.util.Set;
@@ -369,6 +371,23 @@
      */
     private void updateVtsRunnerTestConfig(JSONObject jsonObject)
             throws IOException, JSONException, RuntimeException {
+        CLog.i("Load vendor test config %s", "/config/google-tradefed-vts-config.config");
+        InputStream config = getClass().getResourceAsStream("/config/google-tradefed-vts-config.config");
+        if (config != null) {
+            try {
+                String content = StreamUtil.getStringFromStream(config);
+                CLog.i("Loaded vendor test config %s", content);
+                if (content != null) {
+                    JSONObject vendorConfigJson = new JSONObject(content);
+                    JsonUtil.deepMergeJsonObjects(jsonObject, vendorConfigJson);
+                }
+            } catch(IOException e) {
+                throw new RuntimeException("Failed to read vendor config json file");
+            } catch(JSONException e) {
+                throw new RuntimeException("Failed to build updated vendor config json data");
+            }
+        }
+
         CLog.i("Load original test config %s %s", mTestCaseDataDir, mTestConfigPath);
         String content = null;
 
@@ -489,6 +508,7 @@
         } catch(JSONException e) {
             throw new RuntimeException("Failed to build updated test config json data");
         }
+
         CLog.i("config json: %s", jsonObject.toString());
 
         String jsonFilePath = null;
diff --git a/proto/AndroidSystemControlMessage.proto b/proto/AndroidSystemControlMessage.proto
index dd517c6..4e28a83 100644
--- a/proto/AndroidSystemControlMessage.proto
+++ b/proto/AndroidSystemControlMessage.proto
@@ -113,6 +113,9 @@
   // the package name of a HIDL HAL.
   optional bytes target_package = 3008;
 
+  // the name of a target component (currently used for HIDL HALs only).
+  optional bytes target_component_name = 3009;
+
   // for LIST_APIS
   // none
 
diff --git a/proto/AndroidSystemControlMessage_pb2.py b/proto/AndroidSystemControlMessage_pb2.py
index 54233a3..790dc9c 100644
--- a/proto/AndroidSystemControlMessage_pb2.py
+++ b/proto/AndroidSystemControlMessage_pb2.py
@@ -15,7 +15,7 @@
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='AndroidSystemControlMessage.proto',
   package='android.vts',
-  serialized_pb='\n!AndroidSystemControlMessage.proto\x12\x0b\x61ndroid.vts\x1a#ComponentSpecificationMessage.proto\"\x83\x03\n\"AndroidSystemControlCommandMessage\x12.\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32\x18.android.vts.CommandType\x12\x0e\n\x05paths\x18\xe9\x07 \x03(\x0c\x12\x16\n\rcallback_port\x18\xcd\x08 \x01(\x05\x12\x15\n\x0cservice_name\x18\xd1\x0f \x01(\x0c\x12\x30\n\x0b\x64river_type\x18\xb9\x17 \x01(\x0e\x32\x1a.android.vts.VtsDriverType\x12\x12\n\tfile_path\x18\xba\x17 \x01(\x0c\x12\r\n\x04\x62its\x18\xbb\x17 \x01(\x05\x12\x15\n\x0ctarget_class\x18\xbc\x17 \x01(\x05\x12\x14\n\x0btarget_type\x18\xbd\x17 \x01(\x05\x12\x17\n\x0etarget_version\x18\xbe\x17 \x01(\x05\x12\x14\n\x0bmodule_name\x18\xbf\x17 \x01(\x0c\x12\x17\n\x0etarget_package\x18\xc0\x17 \x01(\x0c\x12\x0c\n\x03\x61rg\x18\xa1\x1f \x01(\x0c\x12\x16\n\rshell_command\x18\x89\' \x03(\x0c\"\xd3\x01\n#AndroidSystemControlResponseMessage\x12\x30\n\rresponse_code\x18\x01 \x01(\x0e\x32\x19.android.vts.ResponseCode\x12\x0f\n\x06reason\x18\xe9\x07 \x01(\x0c\x12\x13\n\nfile_names\x18\xea\x07 \x03(\x0c\x12\r\n\x04spec\x18\xeb\x07 \x01(\x0c\x12\x0f\n\x06result\x18\xec\x07 \x01(\x0c\x12\x0f\n\x06stdout\x18\xd1\x0f \x03(\x0c\x12\x0f\n\x06stderr\x18\xd2\x0f \x03(\x0c\x12\x12\n\texit_code\x18\xd3\x0f \x03(\x05\"i\n#AndroidSystemCallbackRequestMessage\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x36\n\x03\x61rg\x18\x0b \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"X\n$AndroidSystemCallbackResponseMessage\x12\x30\n\rresponse_code\x18\x01 \x01(\x0e\x32\x19.android.vts.ResponseCode*\xa5\x02\n\x0b\x43ommandType\x12\x18\n\x14UNKNOWN_COMMAND_TYPE\x10\x00\x12\r\n\tLIST_HALS\x10\x01\x12\x11\n\rSET_HOST_INFO\x10\x02\x12\x08\n\x04PING\x10\x03\x12\x18\n\x14\x43HECK_DRIVER_SERVICE\x10\x65\x12\x19\n\x15LAUNCH_DRIVER_SERVICE\x10\x66\x12(\n$VTS_AGENT_COMMAND_READ_SPECIFICATION\x10g\x12\x0e\n\tLIST_APIS\x10\xc9\x01\x12\r\n\x08\x43\x41LL_API\x10\xca\x01\x12$\n\x1fVTS_AGENT_COMMAND_GET_ATTRIBUTE\x10\xcb\x01\x12,\n\'VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND\x10\xad\x02*@\n\x0cResponseCode\x12\x19\n\x15UNKNOWN_RESPONSE_CODE\x10\x00\x12\x0b\n\x07SUCCESS\x10\x01\x12\x08\n\x04\x46\x41IL\x10\x02*\xfd\x01\n\rVtsDriverType\x12\x1a\n\x16UKNOWN_VTS_DRIVER_TYPE\x10\x00\x12$\n VTS_DRIVER_TYPE_HAL_CONVENTIONAL\x10\x01\x12\x1e\n\x1aVTS_DRIVER_TYPE_HAL_LEGACY\x10\x02\x12\x1c\n\x18VTS_DRIVER_TYPE_HAL_HIDL\x10\x03\x12\x31\n-VTS_DRIVER_TYPE_HAL_HIDL_WRAPPED_CONVENTIONAL\x10\x04\x12\x1e\n\x1aVTS_DRIVER_TYPE_LIB_SHARED\x10\x0b\x12\x19\n\x15VTS_DRIVER_TYPE_SHELL\x10\x15')
+  serialized_pb='\n!AndroidSystemControlMessage.proto\x12\x0b\x61ndroid.vts\x1a#ComponentSpecificationMessage.proto\"\xa3\x03\n\"AndroidSystemControlCommandMessage\x12.\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32\x18.android.vts.CommandType\x12\x0e\n\x05paths\x18\xe9\x07 \x03(\x0c\x12\x16\n\rcallback_port\x18\xcd\x08 \x01(\x05\x12\x15\n\x0cservice_name\x18\xd1\x0f \x01(\x0c\x12\x30\n\x0b\x64river_type\x18\xb9\x17 \x01(\x0e\x32\x1a.android.vts.VtsDriverType\x12\x12\n\tfile_path\x18\xba\x17 \x01(\x0c\x12\r\n\x04\x62its\x18\xbb\x17 \x01(\x05\x12\x15\n\x0ctarget_class\x18\xbc\x17 \x01(\x05\x12\x14\n\x0btarget_type\x18\xbd\x17 \x01(\x05\x12\x17\n\x0etarget_version\x18\xbe\x17 \x01(\x05\x12\x14\n\x0bmodule_name\x18\xbf\x17 \x01(\x0c\x12\x17\n\x0etarget_package\x18\xc0\x17 \x01(\x0c\x12\x1e\n\x15target_component_name\x18\xc1\x17 \x01(\x0c\x12\x0c\n\x03\x61rg\x18\xa1\x1f \x01(\x0c\x12\x16\n\rshell_command\x18\x89\' \x03(\x0c\"\xd3\x01\n#AndroidSystemControlResponseMessage\x12\x30\n\rresponse_code\x18\x01 \x01(\x0e\x32\x19.android.vts.ResponseCode\x12\x0f\n\x06reason\x18\xe9\x07 \x01(\x0c\x12\x13\n\nfile_names\x18\xea\x07 \x03(\x0c\x12\r\n\x04spec\x18\xeb\x07 \x01(\x0c\x12\x0f\n\x06result\x18\xec\x07 \x01(\x0c\x12\x0f\n\x06stdout\x18\xd1\x0f \x03(\x0c\x12\x0f\n\x06stderr\x18\xd2\x0f \x03(\x0c\x12\x12\n\texit_code\x18\xd3\x0f \x03(\x05\"i\n#AndroidSystemCallbackRequestMessage\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x36\n\x03\x61rg\x18\x0b \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"X\n$AndroidSystemCallbackResponseMessage\x12\x30\n\rresponse_code\x18\x01 \x01(\x0e\x32\x19.android.vts.ResponseCode*\xa5\x02\n\x0b\x43ommandType\x12\x18\n\x14UNKNOWN_COMMAND_TYPE\x10\x00\x12\r\n\tLIST_HALS\x10\x01\x12\x11\n\rSET_HOST_INFO\x10\x02\x12\x08\n\x04PING\x10\x03\x12\x18\n\x14\x43HECK_DRIVER_SERVICE\x10\x65\x12\x19\n\x15LAUNCH_DRIVER_SERVICE\x10\x66\x12(\n$VTS_AGENT_COMMAND_READ_SPECIFICATION\x10g\x12\x0e\n\tLIST_APIS\x10\xc9\x01\x12\r\n\x08\x43\x41LL_API\x10\xca\x01\x12$\n\x1fVTS_AGENT_COMMAND_GET_ATTRIBUTE\x10\xcb\x01\x12,\n\'VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND\x10\xad\x02*@\n\x0cResponseCode\x12\x19\n\x15UNKNOWN_RESPONSE_CODE\x10\x00\x12\x0b\n\x07SUCCESS\x10\x01\x12\x08\n\x04\x46\x41IL\x10\x02*\xfd\x01\n\rVtsDriverType\x12\x1a\n\x16UKNOWN_VTS_DRIVER_TYPE\x10\x00\x12$\n VTS_DRIVER_TYPE_HAL_CONVENTIONAL\x10\x01\x12\x1e\n\x1aVTS_DRIVER_TYPE_HAL_LEGACY\x10\x02\x12\x1c\n\x18VTS_DRIVER_TYPE_HAL_HIDL\x10\x03\x12\x31\n-VTS_DRIVER_TYPE_HAL_HIDL_WRAPPED_CONVENTIONAL\x10\x04\x12\x1e\n\x1aVTS_DRIVER_TYPE_LIB_SHARED\x10\x0b\x12\x19\n\x15VTS_DRIVER_TYPE_SHELL\x10\x15')
 
 _COMMANDTYPE = _descriptor.EnumDescriptor(
   name='CommandType',
@@ -70,8 +70,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=889,
-  serialized_end=1182,
+  serialized_start=921,
+  serialized_end=1214,
 )
 
 CommandType = enum_type_wrapper.EnumTypeWrapper(_COMMANDTYPE)
@@ -96,8 +96,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=1184,
-  serialized_end=1248,
+  serialized_start=1216,
+  serialized_end=1280,
 )
 
 ResponseCode = enum_type_wrapper.EnumTypeWrapper(_RESPONSECODE)
@@ -138,8 +138,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=1251,
-  serialized_end=1504,
+  serialized_start=1283,
+  serialized_end=1536,
 )
 
 VtsDriverType = enum_type_wrapper.EnumTypeWrapper(_VTSDRIVERTYPE)
@@ -259,14 +259,21 @@
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='arg', full_name='android.vts.AndroidSystemControlCommandMessage.arg', index=12,
+      name='target_component_name', full_name='android.vts.AndroidSystemControlCommandMessage.target_component_name', index=12,
+      number=3009, 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='arg', full_name='android.vts.AndroidSystemControlCommandMessage.arg', index=13,
       number=4001, 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='shell_command', full_name='android.vts.AndroidSystemControlCommandMessage.shell_command', index=13,
+      name='shell_command', full_name='android.vts.AndroidSystemControlCommandMessage.shell_command', index=14,
       number=5001, type=12, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -282,7 +289,7 @@
   is_extendable=False,
   extension_ranges=[],
   serialized_start=88,
-  serialized_end=475,
+  serialized_end=507,
 )
 
 
@@ -358,8 +365,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=478,
-  serialized_end=689,
+  serialized_start=510,
+  serialized_end=721,
 )
 
 
@@ -393,8 +400,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=691,
-  serialized_end=796,
+  serialized_start=723,
+  serialized_end=828,
 )
 
 
@@ -421,8 +428,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=798,
-  serialized_end=886,
+  serialized_start=830,
+  serialized_end=918,
 )
 
 _ANDROIDSYSTEMCONTROLCOMMANDMESSAGE.fields_by_name['command_type'].enum_type = _COMMANDTYPE
diff --git a/proto/ComponentSpecificationMessage.proto b/proto/ComponentSpecificationMessage.proto
index fdf16c5..d6bb167 100644
--- a/proto/ComponentSpecificationMessage.proto
+++ b/proto/ComponentSpecificationMessage.proto
@@ -58,7 +58,7 @@
   MOBILE = 6;
   // For a WiFi submodule.
   BLUETOOTH = 7;
-  // For a NFC submodule
+  // For a NFC submodule.
   NFC = 8;
   // For a power HAL.
   POWER = 9;
@@ -66,6 +66,8 @@
   MEMTRACK = 10;
   // For a biometrics fingerprint HAL.
   BFP = 11;
+  // For a vibrator submodule.
+  VIBRATOR = 12;
 
   // for bionic's libm
   BIONIC_LIBM = 1001;
diff --git a/proto/VtsDriverControlMessage.proto b/proto/VtsDriverControlMessage.proto
index aa0368a..970a37b 100644
--- a/proto/VtsDriverControlMessage.proto
+++ b/proto/VtsDriverControlMessage.proto
@@ -82,6 +82,8 @@
   optional bytes module_name = 1205;
   // the package of a HIDL HAL to open.
   optional bytes target_package = 1206;
+  // the name of a target component (currently used for HIDL HALs only).
+  optional bytes target_component_name = 1207;
 
   // for LIST_FUNCTIONS
   // none
diff --git a/run-angler.sh b/run-angler.sh
index e7cc7c1..d59bad1 100755
--- a/run-angler.sh
+++ b/run-angler.sh
@@ -7,6 +7,7 @@
 # PYTHONPATH=$PYTHONPATH:.. python -m vts.testcases.host.camera.conventional.SampleCameraTest
 # PYTHONPATH=$PYTHONPATH:.. python -m vts.testcases.host.camera.conventional.2_1.SampleCameraV2Test
 # PYTHONPATH=$PYTHONPATH:.. python -m vts.testcases.host.camera.conventional.3_4.SampleCameraV3Test
-# PYTHONPATH=$PYTHONPATH:.. python -m vts.testcases.host.nfc.hidl.NfcHidlBasicTest
+# PYTHONPATH=$PYTHONPATH:.. python -m vts.testcases.hal.nfc.hidl.host.NfcHidlBasicTest
+# PYTHONPATH=$PYTHONPATH:.. python -m vts.testcases.hal.vibrator.hidl.VibratorHidlTest
 # PYTHONPATH=$PYTHONPATH:.. python -m vts.testcases.host.shell.SampleShellTest
 # PYTHONPATH=$PYTHONPATH:.. python -m vts.testcases.fuzz_test.lib_bionic.LibBionicLibmFuzzTest
diff --git a/runners/host/tcp_client/vts_tcp_client.py b/runners/host/tcp_client/vts_tcp_client.py
index 3ab7b32..ee644ee 100755
--- a/runners/host/tcp_client/vts_tcp_client.py
+++ b/runners/host/tcp_client/vts_tcp_client.py
@@ -134,7 +134,8 @@
 
     def LaunchDriverService(self, driver_type, service_name, bits,
                             file_path=None, target_class=None, target_type=None,
-                            target_version=None, target_package=None):
+                            target_version=None, target_package=None,
+                            target_component_name=None):
         """RPC to LAUNCH_DRIVER_SERVICE."""
         logging.info("service_name: %s", service_name)
         logging.info("file_path: %s", file_path)
@@ -148,7 +149,8 @@
                          target_class=target_class,
                          target_type=target_type,
                          target_version=target_version,
-                         target_package=target_package)
+                         target_package=target_package,
+                         target_component_name=target_component_name)
         resp = self.RecvResponse()
         logging.info("resp for LAUNCH_DRIVER_SERVICE: %s", resp)
         return (resp.response_code == SysMsg_pb2.SUCCESS)
@@ -282,6 +284,7 @@
                     target_type=None,
                     target_version=None,
                     target_package=None,
+                    target_component_name=None,
                     module_name=None,
                     service_name=None,
                     callback_port=None,
@@ -318,6 +321,9 @@
         if target_package is not None:
             command_msg.target_package = target_package
 
+        if target_component_name is not None:
+            command_msg.target_component_name = target_component_name
+
         if module_name is not None:
             command_msg.module_name = module_name
 
diff --git a/specification/Android.mk b/specification/Android.mk
index 0d46185..9b1fc20 100644
--- a/specification/Android.mk
+++ b/specification/Android.mk
@@ -73,6 +73,7 @@
 LOCAL_C_INCLUDES := \
   ${vtslib_interfacespec_includes} \
   android.hardware.nfc@1.0 \
+  android.hardware.vibrator@1.0 \
   system/core/base/include \
 
 ifeq ($(VTS_ENABLE_TREBLE), true)
@@ -89,6 +90,8 @@
   libutils \
   android.hardware.nfc@1.0 \
   libvts_driver_hidl_nfc@1.0 \
+  android.hardware.vibrator@1.0 \
+  libvts_driver_hidl_vibrator@1.0 \
 
 endif
 
diff --git a/specification/vts_specification.mk b/specification/vts_specification.mk
index 3d659db..768fbd0 100644
--- a/specification/vts_specification.mk
+++ b/specification/vts_specification.mk
@@ -14,5 +14,7 @@
     harware/interfaces/nfc/1.0/vts/Nfc.vts:system/etc/Nfc.vts \
     harware/interfaces/nfc/1.0/vts/NfcClientCallback.vts:system/etc/NfcClientCallback.vts \
     harware/interfaces/nfc/1.0/vts/types.vts:system/etc/types.vts \
+    harware/interfaces/vibrator/1.0/vts/Vibrator.vts:system/etc/Vibrator.vts \
+    harware/interfaces/vibrator/1.0/vts/types.vts:system/etc/types.vts \
     test/vts/specification/lib_bionic/libmV1.vts:system/etc/libmV1.vts \
     test/vts/specification/lib_bionic/libcV1.vts:system/etc/libcV1.vts \
diff --git a/sysfuzzer/common/include/specification_parser/SpecificationBuilder.h b/sysfuzzer/common/include/specification_parser/SpecificationBuilder.h
index 982dd43..9d3bc68 100644
--- a/sysfuzzer/common/include/specification_parser/SpecificationBuilder.h
+++ b/sysfuzzer/common/include/specification_parser/SpecificationBuilder.h
@@ -48,7 +48,8 @@
   // 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 submodule_name = "", const string package = "",
+      const string component_name = "");
 
   vts::ComponentSpecificationMessage*
       FindComponentSpecification(const string& component_name);
@@ -69,12 +70,14 @@
   // 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_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* module_name);
+                           const char* target_package,
+                           const char* target_component_name,
+                           const char* module_name);
 
   FuzzerBase* GetFuzzerBase(
       const ComponentSpecificationMessage& iface_spec_msg,
diff --git a/sysfuzzer/common/specification_parser/SpecificationBuilder.cpp b/sysfuzzer/common/specification_parser/SpecificationBuilder.cpp
index bee9e2b..19eb87e 100644
--- a/sysfuzzer/common/specification_parser/SpecificationBuilder.cpp
+++ b/sysfuzzer/common/specification_parser/SpecificationBuilder.cpp
@@ -46,7 +46,8 @@
                                                  const int target_type,
                                                  const float target_version,
                                                  const string submodule_name,
-                                                 const string package) {
+                                                 const string package,
+                                                 const string component_name) {
   DIR* dir;
   struct dirent* ent;
 
@@ -79,6 +80,11 @@
         } 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;
           }
@@ -224,10 +230,11 @@
 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* module_name) {
+    const char* target_component_name, const char* module_name) {
   if_spec_msg_ =
       FindComponentSpecification(target_class, target_type, target_version,
-                                 module_name, target_package);
+                                 module_name, target_package,
+                                 target_component_name);
   if (!if_spec_msg_) {
     cerr << __FUNCTION__ << ": no interface specification file found for "
          << "class " << target_class << " type " << target_type << " version "
@@ -439,7 +446,7 @@
             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_->package(), if_spec_msg_->component_name());
         if (!submodule_iface_spec_msg) {
           cerr << __func__ << " submodule InterfaceSpecification not found" << endl;
         } else {
@@ -589,7 +596,7 @@
             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_->package(), if_spec_msg_->component_name());
         if (!submodule_iface_spec_msg) {
           cerr << __func__ << " submodule InterfaceSpecification not found" << endl;
         } else {
@@ -614,10 +621,11 @@
                                    const char* spec_lib_file_path,
                                    int target_class, int target_type,
                                    float target_version,
-                                   const char* target_package) {
+                                   const char* target_package,
+                                   const char* target_component_name) {
   vts::ComponentSpecificationMessage* interface_specification_message =
       FindComponentSpecification(target_class, target_type, target_version,
-                                 target_package);
+                                 target_package, target_component_name);
   cout << "ifspec addr " << interface_specification_message << endl;
 
   if (!interface_specification_message) {
diff --git a/sysfuzzer/framework/SocketServer.cpp b/sysfuzzer/framework/SocketServer.cpp
index cf064ff..fb226ec 100644
--- a/sysfuzzer/framework/SocketServer.cpp
+++ b/sysfuzzer/framework/SocketServer.cpp
@@ -65,11 +65,13 @@
 int32_t VtsDriverHalSocketServer::LoadHal(const string& path, int target_class,
                                           int target_type, float target_version,
                                           const string& target_package,
+                                          const string& target_component_name,
                                           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,
-      target_package.c_str(), module_name.c_str());
+      target_package.c_str(), target_component_name.c_str(),
+      module_name.c_str());
   cout << "Result: " << success << std::endl;
   if (success) {
     return 0;
@@ -152,7 +154,9 @@
       int32_t result = LoadHal(
           command_message.file_path(), command_message.target_class(),
           command_message.target_type(), command_message.target_version(),
-          command_message.target_package(), command_message.module_name());
+          command_message.target_package(),
+          command_message.target_component_name(),
+          command_message.module_name());
       VtsDriverControlResponseMessage response_message;
       response_message.set_response_code(VTS_DRIVER_RESPONSE_SUCCESS);
       response_message.set_return_value(result);
diff --git a/sysfuzzer/framework/SocketServer.h b/sysfuzzer/framework/SocketServer.h
index d15a5e7..b87789a 100644
--- a/sysfuzzer/framework/SocketServer.h
+++ b/sysfuzzer/framework/SocketServer.h
@@ -39,7 +39,8 @@
   void Exit();
   int32_t LoadHal(const string& path, int target_class, int target_type,
                   float target_version, const string& target_package,
-                  const string& module_name);
+                  const string& module_name,
+                  const string& target_component_name);
   int32_t Status(int32_t type);
   const char* ReadSpecification(const string& name);
   const char* Call(const string& arg);
diff --git a/sysfuzzer/framework/VtsFuzzerMain.cpp b/sysfuzzer/framework/VtsFuzzerMain.cpp
index 253302a..4878714 100644
--- a/sysfuzzer/framework/VtsFuzzerMain.cpp
+++ b/sysfuzzer/framework/VtsFuzzerMain.cpp
@@ -85,6 +85,7 @@
       {"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
@@ -105,6 +106,7 @@
   string service_name(VTS_FUZZER_BINDER_SERVICE_NAME);
 #endif
   string target_package;
+  string target_component_name;
   string callback_socket_name;
 
   while (true) {
@@ -177,6 +179,9 @@
       case 'k':
         target_package = string(optarg);
         break;
+      case 'n':
+        target_component_name = string(optarg);
+        break;
       default:
         if (ic != '?') {
           fprintf(stderr, "getopt_long returned unexpected value 0x%x\n", ic);
@@ -196,7 +201,8 @@
     bool success =
         spec_builder.Process(argv[optind], INTERFACE_SPEC_LIB_FILENAME,
                              target_class, target_type, target_version,
-                             target_package.c_str());
+                             target_package.c_str(),
+                             target_component_name.c_str());
     cout << "Result: " << success << endl;
     if (success) {
       cout << endl << PASSED_MARKER << endl;
diff --git a/sysfuzzer/vtscompiler/VtsCompilerUtils.cpp b/sysfuzzer/vtscompiler/VtsCompilerUtils.cpp
index 80b76ea..d8de0d6 100644
--- a/sysfuzzer/vtscompiler/VtsCompilerUtils.cpp
+++ b/sysfuzzer/vtscompiler/VtsCompilerUtils.cpp
@@ -81,6 +81,8 @@
       return "bluetooth";
     case NFC:
       return "nfc";
+    case VIBRATOR:
+      return "vibrator";
     case BIONIC_LIBM:
       return "bionic_libm";
   }
diff --git a/sysfuzzer/vtscompiler/code_gen/profiler/HalHidlProfilerCodeGen.cpp b/sysfuzzer/vtscompiler/code_gen/profiler/HalHidlProfilerCodeGen.cpp
index f67709e..d79cd53 100644
--- a/sysfuzzer/vtscompiler/code_gen/profiler/HalHidlProfilerCodeGen.cpp
+++ b/sysfuzzer/vtscompiler/code_gen/profiler/HalHidlProfilerCodeGen.cpp
@@ -186,7 +186,7 @@
   out << "}\n";
   out.unindent();
   out << "}\n";
-  out << "VtsProfilingInterface::getInstance().AddTraceEvent(msg);\n";
+  out << "profiler.AddTraceEvent(package, version, interface, msg);\n";
   out.unindent();
   out << "}\n";
 }
@@ -196,6 +196,7 @@
   // Basic includes.
   out << "#include <android-base/logging.h>\n";
   out << "#include <hidl/HidlSupport.h>\n";
+  out << "#include <linux/limits.h>\n";
   out << "#include <test/vts/proto/ComponentSpecificationMessage.pb.h>\n";
   out << "#include <VtsProfilingInterface.h>\n";
   out << "\n";
@@ -243,6 +244,12 @@
   out << "\n";
 }
 
+void HalHidlProfilerCodeGen::GenerateMacros(Formatter& out,
+    const ComponentSpecificationMessage&) {
+  out << "#define TRACEFILEPREFIX \"/data/local/tmp\"\n";
+  out << "\n";
+}
+
 void HalHidlProfilerCodeGen::GenerateProfierSanityCheck(Formatter& out,
   const ComponentSpecificationMessage& message) {
   out << "if (strcmp(package, \"" << GetPackage(message) << "\") != 0) {\n";
@@ -267,6 +274,21 @@
   out << "return;\n";
   out.unindent();
   out << "}\n";
+  out << "\n";
+}
+
+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);"
+      << "\n";
+
+  // create and initialize the VTS profiler interface.
+  out << "VtsProfilingInterface& profiler = "
+      << "VtsProfilingInterface::getInstance(trace_file);\n";
+  out << "profiler.Init();\n";
+  out << "\n";
 }
 
 }  // namespace vts
diff --git a/sysfuzzer/vtscompiler/code_gen/profiler/HalHidlProfilerCodeGen.h b/sysfuzzer/vtscompiler/code_gen/profiler/HalHidlProfilerCodeGen.h
index 5b36e55..019c549 100644
--- a/sysfuzzer/vtscompiler/code_gen/profiler/HalHidlProfilerCodeGen.h
+++ b/sysfuzzer/vtscompiler/code_gen/profiler/HalHidlProfilerCodeGen.h
@@ -72,8 +72,12 @@
     const ComponentSpecificationMessage& message) override;
   void GenerateUsingDeclaration(Formatter& out,
     const ComponentSpecificationMessage& message) override;
+  void GenerateMacros(Formatter& out,
+    const ComponentSpecificationMessage& message) override;
   virtual void GenerateProfierSanityCheck(Formatter& out,
     const ComponentSpecificationMessage& message) override;
+  virtual void GenerateLocalVariableDefinition(Formatter& out,
+    const ComponentSpecificationMessage& message) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN (HalHidlProfilerCodeGen);
diff --git a/sysfuzzer/vtscompiler/code_gen/profiler/ProfilerCodeGenBase.cpp b/sysfuzzer/vtscompiler/code_gen/profiler/ProfilerCodeGenBase.cpp
index 714d6c6..8251ab0 100644
--- a/sysfuzzer/vtscompiler/code_gen/profiler/ProfilerCodeGenBase.cpp
+++ b/sysfuzzer/vtscompiler/code_gen/profiler/ProfilerCodeGenBase.cpp
@@ -87,6 +87,7 @@
     Formatter& out, const ComponentSpecificationMessage& message) {
   GenerateSourceIncludeFiles(out, message);
   GenerateUsingDeclaration(out, message);
+  GenerateMacros(out, message);
   GenerateOpenNameSpaces(out);
 
   if (message.has_interface()) {
@@ -109,9 +110,12 @@
     out << "std::vector<void *> *args) {\n";
     out.unindent();
 
-    // Code for sanity check.
+    // Generate code for sanity check.
     GenerateProfierSanityCheck(out, message);
 
+    // Generate code to define local variables.
+    GenerateLocalVariableDefinition(out, message);
+
     // Generate the profiler code for each method.
     for (const FunctionSpecificationMessage api : interface.api()) {
       out << "if (strcmp(method, \"" << api.name() << "\") == 0) {\n";
@@ -218,11 +222,6 @@
   out << "}\n\n";
 }
 
-void ProfilerCodeGenBase::GenerateProfierSanityCheck(Formatter&,
-  const ComponentSpecificationMessage&) {
-  return;
-}
-
 void ProfilerCodeGenBase::GenerateOpenNameSpaces(Formatter& out) {
   out << "namespace android {\n";
   out << "namespace vts {\n\n";
diff --git a/sysfuzzer/vtscompiler/code_gen/profiler/ProfilerCodeGenBase.h b/sysfuzzer/vtscompiler/code_gen/profiler/ProfilerCodeGenBase.h
index ca3fdfe..ca98c3b 100644
--- a/sysfuzzer/vtscompiler/code_gen/profiler/ProfilerCodeGenBase.h
+++ b/sysfuzzer/vtscompiler/code_gen/profiler/ProfilerCodeGenBase.h
@@ -106,10 +106,17 @@
   // Generates the necessary "using" code for profiler.
   virtual void GenerateUsingDeclaration(Formatter& out,
     const ComponentSpecificationMessage& message) = 0;
+  // Generates the necessary "#define" code for profiler.
+  virtual void GenerateMacros(Formatter&,
+      const ComponentSpecificationMessage&) {};
   // Generates sanity check for profiler. These codes will be generated at the
   // beginning of the main profiler function.
-  virtual void GenerateProfierSanityCheck(Formatter& out,
-    const ComponentSpecificationMessage& message);
+  virtual void GenerateProfierSanityCheck(Formatter&,
+    const ComponentSpecificationMessage&) {};
+  // Generate local variable definition. These codes will be generated after
+  // the sanity check code.
+  virtual void GenerateLocalVariableDefinition(Formatter&,
+    const ComponentSpecificationMessage&) {};
 
   // Generates the profiler code for a typed variable.
   virtual void GenerateProfilerForTypedVariable(Formatter& out,
diff --git a/sysfuzzer/vtscompiler/test/golden/PROFILER/Nfc.profiler.cpp b/sysfuzzer/vtscompiler/test/golden/PROFILER/Nfc.profiler.cpp
index 3d236ca..3f39c87 100644
--- a/sysfuzzer/vtscompiler/test/golden/PROFILER/Nfc.profiler.cpp
+++ b/sysfuzzer/vtscompiler/test/golden/PROFILER/Nfc.profiler.cpp
@@ -4,6 +4,8 @@
 using namespace android::hardware;
 using namespace android::hardware::nfc::V1_0;
 
+#define TRACEFILEPREFIX "/data/local/tmp"
+
 namespace android {
 namespace vts {
 
@@ -27,6 +29,12 @@
         LOG(WARNING) << "incorrect interface.";
         return;
     }
+
+    char trace_file[PATH_MAX];
+    sprintf(trace_file, "%s/%s@%s", TRACEFILEPREFIX, package, version);
+    VtsProfilingInterface& profiler = VtsProfilingInterface::getInstance(trace_file);
+    profiler.Init();
+
     if (strcmp(method, "open") == 0) {
         FunctionSpecificationMessage msg;
         switch (event) {
@@ -51,7 +59,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
     if (strcmp(method, "write") == 0) {
         FunctionSpecificationMessage msg;
@@ -81,7 +89,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
     if (strcmp(method, "coreInitialized") == 0) {
         FunctionSpecificationMessage msg;
@@ -111,7 +119,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
     if (strcmp(method, "prediscover") == 0) {
         FunctionSpecificationMessage msg;
@@ -134,7 +142,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
     if (strcmp(method, "close") == 0) {
         FunctionSpecificationMessage msg;
@@ -157,7 +165,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
     if (strcmp(method, "controlGranted") == 0) {
         FunctionSpecificationMessage msg;
@@ -180,7 +188,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
     if (strcmp(method, "powerCycle") == 0) {
         FunctionSpecificationMessage msg;
@@ -203,7 +211,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
 }
 
diff --git a/sysfuzzer/vtscompiler/test/golden/PROFILER/NfcClientCallback.profiler.cpp b/sysfuzzer/vtscompiler/test/golden/PROFILER/NfcClientCallback.profiler.cpp
index 92c299f..79606fc 100644
--- a/sysfuzzer/vtscompiler/test/golden/PROFILER/NfcClientCallback.profiler.cpp
+++ b/sysfuzzer/vtscompiler/test/golden/PROFILER/NfcClientCallback.profiler.cpp
@@ -4,6 +4,8 @@
 using namespace android::hardware;
 using namespace android::hardware::nfc::V1_0;
 
+#define TRACEFILEPREFIX "/data/local/tmp"
+
 namespace android {
 namespace vts {
 
@@ -27,6 +29,12 @@
         LOG(WARNING) << "incorrect interface.";
         return;
     }
+
+    char trace_file[PATH_MAX];
+    sprintf(trace_file, "%s/%s@%s", TRACEFILEPREFIX, package, version);
+    VtsProfilingInterface& profiler = VtsProfilingInterface::getInstance(trace_file);
+    profiler.Init();
+
     if (strcmp(method, "sendEvent") == 0) {
         FunctionSpecificationMessage msg;
         switch (event) {
@@ -52,7 +60,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
     if (strcmp(method, "sendData") == 0) {
         FunctionSpecificationMessage msg;
@@ -78,7 +86,7 @@
                 break;
             }
         }
-        VtsProfilingInterface::getInstance().AddTraceEvent(msg);
+        profiler.AddTraceEvent(package, version, interface, msg);
     }
 }
 
diff --git a/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/Nfc.vts.h b/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/Nfc.vts.h
index 792851c..81f5e4c 100644
--- a/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/Nfc.vts.h
+++ b/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/Nfc.vts.h
@@ -4,6 +4,7 @@
 
 #include <android-base/logging.h>
 #include <hidl/HidlSupport.h>
+#include <linux/limits.h>
 #include <test/vts/proto/ComponentSpecificationMessage.pb.h>
 #include <VtsProfilingInterface.h>
 
diff --git a/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/NfcClientCallback.vts.h b/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/NfcClientCallback.vts.h
index 4887970..003c00e 100644
--- a/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/NfcClientCallback.vts.h
+++ b/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/NfcClientCallback.vts.h
@@ -4,6 +4,7 @@
 
 #include <android-base/logging.h>
 #include <hidl/HidlSupport.h>
+#include <linux/limits.h>
 #include <test/vts/proto/ComponentSpecificationMessage.pb.h>
 #include <VtsProfilingInterface.h>
 
diff --git a/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/types.vts.h b/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/types.vts.h
index 080d39e..f0d11cd 100644
--- a/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/types.vts.h
+++ b/sysfuzzer/vtscompiler/test/golden/PROFILER/hardware/interfaces/nfc/1.0/vts/types.vts.h
@@ -4,6 +4,7 @@
 
 #include <android-base/logging.h>
 #include <hidl/HidlSupport.h>
+#include <linux/limits.h>
 #include <test/vts/proto/ComponentSpecificationMessage.pb.h>
 #include <VtsProfilingInterface.h>
 
diff --git a/sysfuzzer/vtscompiler/test/golden/PROFILER/types.profiler.cpp b/sysfuzzer/vtscompiler/test/golden/PROFILER/types.profiler.cpp
index 80e0826..eba5f5f 100644
--- a/sysfuzzer/vtscompiler/test/golden/PROFILER/types.profiler.cpp
+++ b/sysfuzzer/vtscompiler/test/golden/PROFILER/types.profiler.cpp
@@ -4,6 +4,8 @@
 using namespace android::hardware;
 using namespace android::hardware::nfc::V1_0;
 
+#define TRACEFILEPREFIX "/data/local/tmp"
+
 namespace android {
 namespace vts {
 
diff --git a/testcases/host/nfc/Android.mk b/testcases/hal/Android.mk
similarity index 100%
copy from testcases/host/nfc/Android.mk
copy to testcases/hal/Android.mk
diff --git a/testcases/host/nfc/__init__.py b/testcases/hal/__init__.py
similarity index 100%
copy from testcases/host/nfc/__init__.py
copy to testcases/hal/__init__.py
diff --git a/testcases/host/nfc/Android.mk b/testcases/hal/nfc/Android.mk
similarity index 100%
rename from testcases/host/nfc/Android.mk
rename to testcases/hal/nfc/Android.mk
diff --git a/testcases/host/nfc/__init__.py b/testcases/hal/nfc/__init__.py
similarity index 100%
rename from testcases/host/nfc/__init__.py
rename to testcases/hal/nfc/__init__.py
diff --git a/testcases/host/nfc/Android.mk b/testcases/hal/nfc/hidl/Android.mk
similarity index 100%
copy from testcases/host/nfc/Android.mk
copy to testcases/hal/nfc/hidl/Android.mk
diff --git a/testcases/host/nfc/hidl/__init__.py b/testcases/hal/nfc/hidl/__init__.py
similarity index 100%
rename from testcases/host/nfc/hidl/__init__.py
rename to testcases/hal/nfc/hidl/__init__.py
diff --git a/testcases/host/nfc/hidl/Android.mk b/testcases/hal/nfc/hidl/host/Android.mk
similarity index 73%
rename from testcases/host/nfc/hidl/Android.mk
rename to testcases/hal/nfc/hidl/host/Android.mk
index 4c169fc..2d8596c 100644
--- a/testcases/host/nfc/hidl/Android.mk
+++ b/testcases/hal/nfc/hidl/host/Android.mk
@@ -3,5 +3,5 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := NfcHidlBasicTest
-VTS_CONFIG_SRC_DIR := testcases/host/nfc/hidl
+VTS_CONFIG_SRC_DIR := testcases/hal/nfc/hidl/host
 include test/vts/tools/build/Android.host_config.mk
diff --git a/testcases/host/nfc/hidl/AndroidTest.xml b/testcases/hal/nfc/hidl/host/AndroidTest.xml
similarity index 77%
rename from testcases/host/nfc/hidl/AndroidTest.xml
rename to testcases/hal/nfc/hidl/host/AndroidTest.xml
index bd145e5..711e98a 100644
--- a/testcases/host/nfc/hidl/AndroidTest.xml
+++ b/testcases/hal/nfc/hidl/host/AndroidTest.xml
@@ -15,16 +15,14 @@
 -->
 <configuration description="Config for VTS HAL NFC test cases">
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
-        <option name="push-group" value="HostDrivenTest.push" />
+        <option name="push-group" value="HidlHalTest.push" />
         <option name="cleanup" value="true" />
-        <option name="push" value="DATA/lib/libvts_driver_hidl_nfc@1.0.so->/data/local/tmp/32/libvts_driver_hidl_nfc@1.0.so" />
-        <option name="push" value="DATA/lib64/libvts_driver_hidl_nfc@1.0.so->/data/local/tmp/64/libvts_driver_hidl_nfc@1.0.so" />
         <option name="push" value="spec/hardware/interfaces/nfc/1.0/vts/Nfc.vts->/data/local/tmp/spec/Nfc.vts" />
         <option name="push" value="spec/hardware/interfaces/nfc/1.0/vts/NfcClientCallback.vts->/data/local/tmp/spec/NfcClientCallback.vts" />
         <option name="push" value="spec/hardware/interfaces/nfc/1.0/vts/types.vts->/data/local/tmp/spec/types.vts" />
     </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer" />
     <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
-        <option name="test-case-path" value="vts/testcases/host/nfc/hidl/NfcHidlBasicTest" />
+        <option name="test-case-path" value="vts/testcases/hal/nfc/hidl/host/NfcHidlBasicTest" />
     </test>
 </configuration>
diff --git a/testcases/host/nfc/hidl/NfcHidlBasicTest.py b/testcases/hal/nfc/hidl/host/NfcHidlBasicTest.py
similarity index 97%
rename from testcases/host/nfc/hidl/NfcHidlBasicTest.py
rename to testcases/hal/nfc/hidl/host/NfcHidlBasicTest.py
index 363b380..4ce50c2 100644
--- a/testcases/host/nfc/hidl/NfcHidlBasicTest.py
+++ b/testcases/hal/nfc/hidl/host/NfcHidlBasicTest.py
@@ -37,6 +37,7 @@
                                  target_basepaths=["/system/lib64"],
                                  target_version=1.0,
                                  target_package="android.hardware.nfc",
+                                 target_component_name="INfc",
                                  bits=64)
 
         self.dut.shell.InvokeTerminal("one")
diff --git a/testcases/host/nfc/__init__.py b/testcases/hal/nfc/hidl/host/__init__.py
similarity index 100%
copy from testcases/host/nfc/__init__.py
copy to testcases/hal/nfc/hidl/host/__init__.py
diff --git a/testcases/host/nfc/Android.mk b/testcases/hal/vibrator/Android.mk
similarity index 100%
copy from testcases/host/nfc/Android.mk
copy to testcases/hal/vibrator/Android.mk
diff --git a/testcases/host/nfc/__init__.py b/testcases/hal/vibrator/__init__.py
similarity index 100%
copy from testcases/host/nfc/__init__.py
copy to testcases/hal/vibrator/__init__.py
diff --git a/testcases/hal/vibrator/hidl/Android.mk b/testcases/hal/vibrator/hidl/Android.mk
new file mode 100644
index 0000000..f3be6c8
--- /dev/null
+++ b/testcases/hal/vibrator/hidl/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := VibratorHidlTest
+VTS_CONFIG_SRC_DIR := testcases/hal/vibrator/hidl
+include test/vts/tools/build/Android.host_config.mk
diff --git a/testcases/hal/vibrator/hidl/AndroidTest.xml b/testcases/hal/vibrator/hidl/AndroidTest.xml
new file mode 100644
index 0000000..8897cb9
--- /dev/null
+++ b/testcases/hal/vibrator/hidl/AndroidTest.xml
@@ -0,0 +1,28 @@
+<?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="Config for VTS HAL vibrator test cases">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HidlHalTest.push" />
+        <option name="cleanup" value="true" />
+        <option name="push" value="spec/hardware/interfaces/vibrator/1.0/vts/Vibrator.vts->/data/local/tmp/spec/Vibrator.vts" />
+        <option name="push" value="spec/hardware/interfaces/vibrator/1.0/vts/types.vts->/data/local/tmp/spec/types.vts" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer" />
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="VibratorHidlTest" />
+        <option name="test-case-path" value="vts/testcases/hal/vibrator/hidl/VibratorHidlTest" />
+    </test>
+</configuration>
diff --git a/testcases/hal/vibrator/hidl/VibratorHidlTest.py b/testcases/hal/vibrator/hidl/VibratorHidlTest.py
new file mode 100644
index 0000000..c436cd1
--- /dev/null
+++ b/testcases/hal/vibrator/hidl/VibratorHidlTest.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3.4
+#
+# 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
+import time
+
+from vts.runners.host import asserts
+from vts.runners.host import base_test_with_webdb
+from vts.runners.host import test_runner
+from vts.utils.python.controllers import android_device
+
+
+class VibratorHidlTest(base_test_with_webdb.BaseTestWithWebDbClass):
+    """A simple testcase for the VIBRATOR HIDL HAL."""
+
+    _TREBLE_DEVICE_NAME_SUFFIX = "_treble"
+
+    def setUpClass(self):
+        """Creates a mirror and turns on the framework-layer VIBRATOR service."""
+        self.dut = self.registerController(android_device)[0]
+        self.dut.hal.InitHidlHal(
+            target_type="vibrator",
+            target_basepaths=["/system/lib64"],
+            target_version=1.0,
+            target_package="android.hardware.vibrator",
+            target_component_name="IVibrator",
+            bits=64)
+
+        self.dut.shell.InvokeTerminal("one")
+        self.dut.shell.one.Execute("setenforce 0")  # SELinux permissive mode
+
+    def testVibratorBasic(self):
+        """A simple test case which just calls each registered function."""
+        asserts.skipIf(
+                not self.dut.model.endswith(self._TREBLE_DEVICE_NAME_SUFFIX),
+                "a non-Treble device.")
+
+        result = self.dut.hal.vibrator.on()
+        logging.info("open result: %s", result)
+
+        time.sleep(1)
+
+        result = self.dut.hal.vibrator.off()
+        logging.info("prediscover result: %s", result)
+
+
+if __name__ == "__main__":
+    test_runner.main()
diff --git a/testcases/host/nfc/hidl/__init__.py b/testcases/hal/vibrator/hidl/__init__.py
similarity index 100%
copy from testcases/host/nfc/hidl/__init__.py
copy to testcases/hal/vibrator/hidl/__init__.py
diff --git a/testcases/kernel/ltp/ltp_configs.py b/testcases/kernel/ltp/ltp_configs.py
index 840219e..a9af3e8 100644
--- a/testcases/kernel/ltp/ltp_configs.py
+++ b/testcases/kernel/ltp/ltp_configs.py
@@ -63,37 +63,37 @@
 # Requirement to testcase dictionary.
 REQUIREMENTS_TO_TESTCASE = {
     ltp_enums.Requirements.LOOP_DEVICE_SUPPORT: [
-        'syscalls-mount01',
-        'syscalls-fchmod06',
-        'syscalls-ftruncate04',
-        'syscalls-ftruncate04_64',
-        'syscalls-inotify03',
-        'syscalls-link08',
-        'syscalls-linkat02',
-        'syscalls-mkdir03',
-        'syscalls-mkdirat02',
-        'syscalls-mknod07',
-        'syscalls-mknodat02',
-        'syscalls-mmap16',
-        'syscalls-mount01',
-        'syscalls-mount02',
-        'syscalls-mount03',
-        'syscalls-mount04',
-        'syscalls-mount06',
-        'syscalls-rename11',
-        'syscalls-renameat01',
-        'syscalls-rmdir02',
-        'syscalls-umount01',
-        'syscalls-umount02',
-        'syscalls-umount03',
-        'syscalls-umount2_01',
-        'syscalls-umount2_02',
-        'syscalls-umount2_03',
-        'syscalls-utime06',
-        'syscalls-utimes01',
-        'syscalls-mkfs01',
+        'syscalls.mount01',
+        'syscalls.fchmod06',
+        'syscalls.ftruncate04',
+        'syscalls.ftruncate04_64',
+        'syscalls.inotify03',
+        'syscalls.link08',
+        'syscalls.linkat02',
+        'syscalls.mkdir03',
+        'syscalls.mkdirat02',
+        'syscalls.mknod07',
+        'syscalls.mknodat02',
+        'syscalls.mmap16',
+        'syscalls.mount01',
+        'syscalls.mount02',
+        'syscalls.mount03',
+        'syscalls.mount04',
+        'syscalls.mount06',
+        'syscalls.rename11',
+        'syscalls.renameat01',
+        'syscalls.rmdir02',
+        'syscalls.umount01',
+        'syscalls.umount02',
+        'syscalls.umount03',
+        'syscalls.umount2_01',
+        'syscalls.umount2_02',
+        'syscalls.umount2_03',
+        'syscalls.utime06',
+        'syscalls.utimes01',
+        'syscalls.mkfs01',
     ],
-    ltp_enums.Requirements.BIN_IN_PATH_LDD: ['commands-ldd'],
+    ltp_enums.Requirements.BIN_IN_PATH_LDD: ['commands.ldd'],
 }
 
 # Requirement for all test cases
@@ -143,116 +143,48 @@
 ]
 
 # Staging tests are for debugging and verifying fixed tests
-# Test specified here can be in format: testsuite-testname,
-# or testsuite-testname_**bit, or just testname. Using just testname
+# Test specified here can be in format: testsuite.testname,
+# or testsuite.testname_**bit, or just testname. Using just testname
 # is not recommended
 STAGING_TESTS = [
-    # Tests currently only failing on sailfish and marlin,
+    # Tests currently only failing on pixels,
     # these will be inspected soon
-    'syscalls-open14',
-    'syscalls-openat03',
+    'syscalls.open14',
+    'syscalls.openat03',
     # Recently fixed
-    'connectors-Connectors',
-    'kernel_misc-kmsg01',
-    'syscalls-access01',
-    'syscalls-add_key01',
-    'syscalls-add_key02',
-    'syscalls-chdir03',
-    'syscalls-chroot01',
-    'syscalls-creat01',
-    'syscalls-creat01',
-    'syscalls-creat03',
-    'syscalls-creat04',
-    'syscalls-creat05',
-    'epoll_create1_01',
-    'epoll_ctl01',
-    'epoll_ctl02',
-    'fcntl07',
-    'fcntl07_64',
-    'madvise05',
-    'mkdir02',
-    'mkdir04',
-    'pause01',
-    'pipe01',
-    'pipe02',
-    'pipe03',
-    'posix_fadvise01',
-    'posix_fadvise01_64',
-    'posix_fadvise03',
-    'posix_fadvise03_64',
-    'ppoll01',
-    'preadv01',
-    'preadv01_64',
-    'preadv02_64',
-    'pwritev01',
-    'pwritev02_64',
-    'recvmsg02',
-    'rename09',
-    'syscall01',
-    'utime03',
-    'commands-ldd',
+    'syscalls.getrusage03',
+    'syscalls.creat07',
+    'syscalls.creat08',
+    'sched.sched_cli_serv',
+    'admin_tools.at_deny01',
+    'admin_tools.at_allow01',
+    'cpuhotplug.cpuhotplug02',
+    'mm.mtest05',
+    'numa.move_pages01_64bit',
+    'numa.move_pages02',
+    'numa.move_pages04',
+    'numa.move_pages05',
+    'numa.move_pages06',
+    'numa.move_pages07',
+    'numa.move_pages08',
+    'numa.move_pages09',
+    'numa.move_pages10',
     # getrusage04 gives inconsistent result over different runs
-    'syscalls-getrusage04',
+    'syscalls.getrusage04',
     # Fail on local device but pass on lab devices
-    'fs-proc01',
-    # Fail on lab devices but pass on local device
-    'syscalls-execl01',
-    'syscalls-execle01',
-    'syscalls-execlp01',
-    'syscalls-execv01',
-    'syscalls-execve01',
-    'syscalls-execve04',
-    'syscalls-execvp01',
-    'syscalls-ioctl01_02',
-    'syscalls-move_pages01',
-    'syscalls-move_pages02',
-    'syscalls-move_pages04',
-    'syscalls-move_pages05',
-    'syscalls-move_pages06',
-    'syscalls-move_pages07',
-    'syscalls-move_pages08',
-    'syscalls-move_pages09',
-    'syscalls-move_pages10',
-    'syscalls-setpgid03',
-    'numa-move_pages01_32bit',
+    'fs.proc01',
     # Fail on staging but passing on stable
-    'fs-fs_di',
-    # New tests from timers Securebits test suite
-    'check_keepcaps01',
-    'check_keepcaps02',
-    'check_keepcaps03',
-    # New tests from timers Tracing test suite
-    'ftrace_regression01',
-    'ftrace_regression02',
-    'ftrace-stress-test',
+    'fs.fs_di',
 ]
 
 # Tests disabled
 # Based on external/ltp commit 5f01077afe994f4107b147222f3956716d4a8fde
 DISABLED_TESTS = [
-    # Recently fixed, will push to staging soon
-    'syscalls-getrusage03',
-    'syscalls-creat07',
-    'syscalls-creat08',
-    'sched-sched_cli_serv',
-    'admin_tools-at_deny01',
-    'admin_tools-at_allow01',
-    'cpuhotplug-cpuhotplug02',
-    'mm-mtest05',
-    'numa-move_pages01_64bit',
-    'numa-move_pages02',
-    'numa-move_pages04',
-    'numa-move_pages05',
-    'numa-move_pages06',
-    'numa-move_pages07',
-    'numa-move_pages08',
-    'numa-move_pages09',
-    'numa-move_pages10',
     # The following test case is designed only for i386
     'f00f',
     # The following test cases are uncategorized
-    'syscalls-fcntl34',
-    'syscalls-fcntl34_64',
+    'syscalls.fcntl34',
+    'syscalls.fcntl34_64',
     'inotify06',
     'abort01',
     'chmod05',
@@ -533,8 +465,8 @@
     'smt_smp_enabled',
     'smt_smp_affinity',
     'zram03',
-    'ext4_uninit_groups',
-    'ext4_persist_prealloc',
+    'ext4-uninit-groups',
+    'ext4-persist-prealloc',
     'pipeio_1',
     'pipeio_4',
     'pipeio_5',
@@ -544,42 +476,42 @@
     'cpuhotplug06',
     'input06',
     'dio10',
-    'fsx_linux',
+    'fsx-linux',
     'dio04',
-    'Numa_testcases',
-    'ext4_uninit_groups',
-    'ext4_persist_prealloc',
+    'Numa-testcases',
+    'ext4-uninit-groups',
+    'ext4-persist-prealloc',
     'connect01',
     'prot_hsymlinks',
-    'fs-ftest01',
-    'fs-ftest03',
-    'fs-ftest04',
-    'fs-ftest05',
-    'fs-ftest07',
-    'fs-ftest08',
-    'fs-inode02',
-    'ipc-signal_test_01',
-    'mm-data_space',
-    'mm-mmapstress01',
-    'mm-mmapstress03',
-    'mm-mmapstress09',
-    'mm-mmapstress10',
-    'syscalls-clock_nanosleep01',
-    'syscalls-clone04',
-    'syscalls-fcntl14',
-    'syscalls-fcntl14',
-    'syscalls-fcntl14_64',
-    'syscalls-fcntl17',
-    'syscalls-fcntl17_64',
-    'syscalls-getdomainname01',
-    'syscalls-kill12',
-    'syscalls-setdomainname01',
-    'syscalls-setdomainname02',
-    'syscalls-setdomainname03',
-    'syscalls-sighold02',
-    'syscalls-sigpending02',
-    'syscalls-sigrelse01',
-    'syscalls-vfork02',
+    'fs.ftest01',
+    'fs.ftest03',
+    'fs.ftest04',
+    'fs.ftest05',
+    'fs.ftest07',
+    'fs.ftest08',
+    'fs.inode02',
+    'ipc.signal_test_01',
+    'mm.data_space',
+    'mm.mmapstress01',
+    'mm.mmapstress03',
+    'mm.mmapstress09',
+    'mm.mmapstress10',
+    'syscalls.clock_nanosleep01',
+    'syscalls.clone04',
+    'syscalls.fcntl14',
+    'syscalls.fcntl14',
+    'syscalls.fcntl14_64',
+    'syscalls.fcntl17',
+    'syscalls.fcntl17_64',
+    'syscalls.getdomainname01',
+    'syscalls.kill12',
+    'syscalls.setdomainname01',
+    'syscalls.setdomainname02',
+    'syscalls.setdomainname03',
+    'syscalls.sighold02',
+    'syscalls.sigpending02',
+    'syscalls.sigrelse01',
+    'syscalls.vfork02',
     # The following tests are not stable on 64bit version
     'input01_64bit',
     'input02_64bit',
@@ -588,25 +520,30 @@
     'input05_64bit',
     'input06_64bit',
     # The following tests are failing on 64bit version
-    'mm-overcommit_memory01_64bit',
-    'mm-overcommit_memory02_64bit',
-    'mm-overcommit_memory03_64bit',
-    'mm-overcommit_memory04_64bit',
-    'mm-overcommit_memory05_64bit',
-    'mm-overcommit_memory06_64bit',
+    'mm.overcommit_memory01_64bit',
+    'mm.overcommit_memory02_64bit',
+    'mm.overcommit_memory03_64bit',
+    'mm.overcommit_memory04_64bit',
+    'mm.overcommit_memory05_64bit',
+    'mm.overcommit_memory06_64bit',
     # 'which' in Android does not accept the tested options b/31152668
-    'commands-which01',
-    # tests that are currently killing some lab devices
-    'mm-oom01_64bit',
-    'mm-oom02_64bit',
-    'mm-oom03_64bit',
-    'mm-oom04_64bit',
-    'mm-oom05_64bit',
-    'mm-swapping01_64bit',
-    'mm-thp01_64bit',
-    'mm-thp02_64bit',
-    'mm-thp03_64bit',
-    'mm-vma01_64bit',
+    'commands.which01',
+    # tests that are currently killing some lab devices 64bit on (pixel and bullhead)
+    # b/31181781
+    'mm.oom01_64bit',
+    'mm.oom02_64bit',
+    'mm.oom03_64bit',
+    'mm.oom04_64bit',
+    'mm.oom05_64bit',
+    'mm.swapping01_64bit',
+    'mm.thp01_64bit',
+    'mm.thp02_64bit',
+    'mm.thp03_64bit',
+    'mm.vma01_64bit',
+    # kmsg01 would pass but it occasionally causes socket timeout and misalignment
+    # of request and response
+    # b/32343072
+    'kernel_misc.kmsg01',
     # alarm02 tests for a boundary condition which is impractical to implement
     # correctly on 32-bit Linux.  bionic deliberately breaks with POSIX by reporting
     # that it failed to set up the alarm.  (Other libc implementations fail to
@@ -626,27 +563,27 @@
     # https://android-review.googlesource.com/#/c/127908/
     'open13',
     # Bug#30675453
-    'syscalls-perf_event_open02',
+    'syscalls.perf_event_open02',
     # Bug#30688551
-    'syscalls-lstat03_64',
-    'syscalls-lstat03',
+    'syscalls.lstat03_64',
+    'syscalls.lstat03',
     # Bug#30688061
-    'input-input03',
+    'input.input03',
     # Bug#30688056
-    'cpuhotplug-cpuhotplug04',
+    'cpuhotplug.cpuhotplug04',
     # Bug#30699880
-    'mm-mtest01w',
-    'mm-mtest01',
+    'mm.mtest01w',
+    'mm.mtest01',
     # Bug#30688574
-    'syscalls-accept4_01',
+    'syscalls.accept4_01',
     # Bug#30689411
-    'mm-mmapstress03',
+    'mm.mmapstress03',
     # Bug #32100169
-    'dma_thread_diotest-dma_thread_diotest1',
-    'dma_thread_diotest-dma_thread_diotest2',
-    'dma_thread_diotest-dma_thread_diotest3',
-    'dma_thread_diotest-dma_thread_diotest4',
-    'dma_thread_diotest-dma_thread_diotest5',
-    'dma_thread_diotest-dma_thread_diotest6',
-    'dma_thread_diotest-dma_thread_diotest7',
+    'dma_thread_diotest.dma_thread_diotest1',
+    'dma_thread_diotest.dma_thread_diotest2',
+    'dma_thread_diotest.dma_thread_diotest3',
+    'dma_thread_diotest.dma_thread_diotest4',
+    'dma_thread_diotest.dma_thread_diotest5',
+    'dma_thread_diotest.dma_thread_diotest6',
+    'dma_thread_diotest.dma_thread_diotest7',
 ]
diff --git a/testcases/kernel/ltp/stable/KernelLtpTest.config b/testcases/kernel/ltp/stable/KernelLtpTest.config
index de2e1a0..119d247 100644
--- a/testcases/kernel/ltp/stable/KernelLtpTest.config
+++ b/testcases/kernel/ltp/stable/KernelLtpTest.config
@@ -1,6 +1,6 @@
 {
     "run_staging": false,
     "run_32bit": true,
-    "run_64bit": false,
+    "run_64bit": true,
     "number_of_threads": 1
 }
diff --git a/testcases/kernel/ltp/test_case.py b/testcases/kernel/ltp/test_case.py
index 7932c56..9a3e669 100644
--- a/testcases/kernel/ltp/test_case.py
+++ b/testcases/kernel/ltp/test_case.py
@@ -138,7 +138,7 @@
     @property
     def fullname(self):
         """Return full test name in <testsuite-testname> format"""
-        return "%s-%s" % (self.testsuite, self.testname)
+        return "%s.%s" % (self.testsuite, self.testname)
 
     def __str__(self):
         return self.fullname
diff --git a/testcases/kernel/ltp/test_cases_parser.py b/testcases/kernel/ltp/test_cases_parser.py
index 5c89cb5..436740a 100644
--- a/testcases/kernel/ltp/test_cases_parser.py
+++ b/testcases/kernel/ltp/test_cases_parser.py
@@ -172,7 +172,6 @@
         '''
         testsuite_script = os.path.join(self._data_path,
                                         ltp_configs.LTP_RUNTEST_DIR, testsuite)
-        testsuite = testsuite.replace('-', '_')
 
         result = []
         for line in open(testsuite_script, 'r'):
@@ -183,7 +182,7 @@
             testname = line.split()[0]
             testname_prefix = ('DISABLED_'
                                if testname in disabled_tests_list else '')
-            testname_modified = testname_prefix + testname.replace('-', '_')
+            testname_modified = testname_prefix + testname
 
             result.append("\t".join([testsuite, testname_modified, line[len(
                 testname):].strip()]))
diff --git a/tools/build/tasks/list/vts_spec_file_list.mk b/tools/build/tasks/list/vts_spec_file_list.mk
index 25e11b0..8410bc4 100644
--- a/tools/build/tasks/list/vts_spec_file_list.mk
+++ b/tools/build/tasks/list/vts_spec_file_list.mk
@@ -32,3 +32,5 @@
   hardware/interfaces/nfc/1.0/vts/Nfc.vts \
   hardware/interfaces/nfc/1.0/vts/NfcClientCallback.vts \
   hardware/interfaces/nfc/1.0/vts/types.vts \
+  hardware/interfaces/vibrator/1.0/vts/Vibrator.vts \
+  hardware/interfaces/vibrator/1.0/vts/types.vts \
diff --git a/tools/vts-tradefed/etc/vts-tradefed b/tools/vts-tradefed/etc/vts-tradefed
index fd5298c..5510bb6 100755
--- a/tools/vts-tradefed/etc/vts-tradefed
+++ b/tools/vts-tradefed/etc/vts-tradefed
@@ -91,6 +91,7 @@
 
 # to run in the lab.
 OPTIONAL_JARS="
+  google-tradefed-vts-prebuilt
   google-tradefed-prebuilt
   google-tradefed-tests
   google-tf-prod-tests"
diff --git a/tools/vts-tradefed/res/config/vts-serving-staging-hal-hidl.xml b/tools/vts-tradefed/res/config/vts-serving-staging-hal-hidl.xml
index 0bd8ce5..a1bd5fc 100644
--- a/tools/vts-tradefed/res/config/vts-serving-staging-hal-hidl.xml
+++ b/tools/vts-tradefed/res/config/vts-serving-staging-hal-hidl.xml
@@ -21,5 +21,6 @@
     <option name="compatibility:include-filter" value="HwBinderThroughputBenchmark" />
     <option name="compatibility:include-filter" value="HwBinderPerformanceTest" />
     <option name="compatibility:include-filter" value="NfcHidlBasicTest" />
+    <option name="compatibility:include-filter" value="VibratorHidlTest" />
     <template-include name="reporters" default="basic-reporters" />
 </configuration>
diff --git a/tools/vts-tradefed/res/push_groups/HidlHalTest.push b/tools/vts-tradefed/res/push_groups/HidlHalTest.push
index acd468b..30df503 100644
--- a/tools/vts-tradefed/res/push_groups/HidlHalTest.push
+++ b/tools/vts-tradefed/res/push_groups/HidlHalTest.push
@@ -1 +1,7 @@
 HostDrivenTest.push
+
+DATA/lib/libvts_driver_hidl_nfc@1.0.so->/data/local/tmp/32/libvts_driver_hidl_nfc@1.0.so
+DATA/lib64/libvts_driver_hidl_nfc@1.0.so->/data/local/tmp/64/libvts_driver_hidl_nfc@1.0.so
+
+DATA/lib/libvts_driver_hidl_vibrator@1.0.so->/data/local/tmp/32/libvts_driver_hidl_vibrator@1.0.so
+DATA/lib64/libvts_driver_hidl_vibrator@1.0.so->/data/local/tmp/64/libvts_driver_hidl_vibrator@1.0.so
diff --git a/utils/python/mirror/hal_mirror.py b/utils/python/mirror/hal_mirror.py
index 8dee7d0..4120c32 100644
--- a/utils/python/mirror/hal_mirror.py
+++ b/utils/python/mirror/hal_mirror.py
@@ -41,6 +41,7 @@
                        "mobile": 6,
                        "bluetooth": 7,
                        "nfc": 8,
+                       "vibrator": 12,
                        "bionic_libm": 1001,
                        "bionic_libc": 1002,
                        "vndk_libcutils": 1101}
@@ -147,6 +148,7 @@
                     target_type,
                     target_version,
                     target_package=None,
+                    target_component_name=None,
                     target_basepaths=_DEFAULT_TARGET_BASE_PATHS,
                     handler_name=None,
                     bits=64):
@@ -169,6 +171,7 @@
                                  target_type,
                                  target_version,
                                  target_package=target_package,
+                                 target_component_name=target_component_name,
                                  target_basepaths=target_basepaths,
                                  handler_name=handler_name,
                                  bits=bits)
@@ -196,6 +199,7 @@
                             target_type,
                             target_version,
                             target_package=None,
+                            target_component_name=None,
                             target_basepaths=_DEFAULT_TARGET_BASE_PATHS,
                             handler_name=None,
                             bits=64):
@@ -209,6 +213,7 @@
             target_type: string, the target type name (e.g., light, camera).
             target_version: float, the target component version (e.g., 1.0).
             target_package: string, the package name of a HIDL HAL.
+            target_component_name: string, the name of a target component.
             target_basepaths: list of strings, the paths to look for target
                              files in. Default is _DEFAULT_TARGET_BASE_PATHS.
             handler_name: string, the name of the handler. target_type is used
@@ -275,7 +280,8 @@
             target_class=target_class_id,
             target_type=target_type_id,
             target_version=target_version,
-            target_package=target_package)
+            target_package=target_package,
+            target_component_name=target_component_name)
 
         if not launched:
             raise errors.ComponentLoadingError(
diff --git a/web/dashboard/appengine/servlet/pom.xml b/web/dashboard/appengine/servlet/pom.xml
index 8c0ee82..df5f711 100644
--- a/web/dashboard/appengine/servlet/pom.xml
+++ b/web/dashboard/appengine/servlet/pom.xml
@@ -32,6 +32,7 @@
     <appengine.senderEmail></appengine.senderEmail>
     <appengine.emailDomain></appengine.emailDomain>
     <appengine.defaultEmail></appengine.defaultEmail>
+    <appengine.serviceClientID></appengine.serviceClientID>
 
     <hadoop.version>2.4.1</hadoop.version>
     <compat.module>hbase-hadoop2-compat</compat.module>
@@ -94,7 +95,6 @@
     </pluginRepository>
   </pluginRepositories>
 
-
   <dependencies>
     <dependency>
       <groupId>com.google.cloud.bigtable</groupId>
@@ -139,16 +139,60 @@
       <artifactId>slf4j-api</artifactId>
       <version>${slf4jVersion}</version>
     </dependency>
+
     <dependency>
       <groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
       <version>2.7</version>
     </dependency>
+
     <dependency>
         <groupId>org.seleniumhq.selenium</groupId>
         <artifactId>selenium-java</artifactId>
         <version>3.0.0-beta2</version>
     </dependency>
+
+    <dependency>
+        <groupId>com.google.api-client</groupId>
+        <artifactId>google-api-client</artifactId>
+        <version>1.22.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.api-client</groupId>
+      <artifactId>google-api-client</artifactId>
+      <version>1.20.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.http-client</groupId>
+      <artifactId>google-http-client</artifactId>
+      <version>1.20.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.3.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.http-client</groupId>
+      <artifactId>google-http-client-jackson</artifactId>
+      <version>1.20.0</version>
+    </dependency>
+
+    <dependency>
+        <groupId>com.google.http-client</groupId>
+        <artifactId>google-http-client-gson</artifactId>
+        <version>1.21.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.apis</groupId>
+      <artifactId>google-api-services-oauth2</artifactId>
+      <version>v1-rev124-1.22.0</version>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/api/BigtableApiServlet.java b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/api/BigtableApiServlet.java
new file mode 100644
index 0000000..c398cab
--- /dev/null
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/api/BigtableApiServlet.java
@@ -0,0 +1,166 @@
+/*
+ * 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.google.android.vts.api;
+
+import com.google.android.vts.helpers.BigtableHelper;
+import com.google.api.client.json.gson.GsonFactory;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.jackson.JacksonFactory;
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
+import com.google.api.services.oauth2.Oauth2;
+import com.google.api.services.oauth2.model.Tokeninfo;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.Admin;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.client.Table;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.io.BufferedReader;
+import java.io.IOException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Represents the servlet that is invoked on loading the first page of dashboard.
+ */
+@WebServlet(name = "bigtable", urlPatterns = {"/api/bigtable"})
+public class BigtableApiServlet extends HttpServlet {
+
+    private static final String SERVICE_CLIENT_ID = System.getenv("SERVICE_CLIENT_ID");
+    private static final Logger logger = LoggerFactory.getLogger(BigtableApiServlet.class);
+
+    @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 e) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+            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).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":
+                        createTable(payloadJson);
+                        break;
+                    case "insertRow":
+                        insertRow(payloadJson);
+                        break;
+                    default:
+                        logger.info("Invalid Bigtable API 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);
+    }
+
+    /**
+     * Creates a table in the Bigtable instance.
+     * @param payloadJson The JSON object representing the table to be created. Of the form:
+     *                    {
+     *                      'tableName' : 'table',
+     *                      'familyNames' : ['family1', 'family2', 'family3']
+     *                    }
+     * @throws IOException
+     */
+    private void createTable(JSONObject payloadJson) throws IOException {
+        if (!payloadJson.has("tableName") || !payloadJson.has("familyNames")) {
+            logger.info("Missing attributes for bigtable api createTable().");
+            throw new IOException("Missing attributes.");
+        }
+        String table = payloadJson.getString("tableName");
+        TableName tableName = TableName.valueOf(table);
+        JSONArray familyArray = payloadJson.getJSONArray("familyNames");
+        HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
+        for (int i = 0; i < familyArray.length(); i++) {
+            tableDescriptor.addFamily(new HColumnDescriptor(familyArray.getString(i).trim()));
+        }
+        Admin admin = BigtableHelper.getConnection().getAdmin();
+        admin.createTable(tableDescriptor);
+    }
+
+    /**
+     * Inserts a row into the BigTable instance
+     * @param payloadJson The JSON object representing the row to be inserted. Of the form:
+     *                    {
+     *                      'tableName' : 'table',
+     *                      'rowKey' : 'row',
+     *                      'family' : 'family',
+     *                      'qualifier' : 'qualifier',
+     *                      'value' : 'value'
+     *                    }
+     * @throws IOException
+     */
+    private void insertRow(JSONObject payloadJson) throws IOException {
+        if (!payloadJson.has("tableName") || !payloadJson.has("rowKey") ||
+            !payloadJson.has("family") || !payloadJson.has("qualifier") ||
+            !payloadJson.has("value")) {
+            logger.info("Missing attributes for bigtable api insertRow().");
+            throw new IOException("Missing attributes.");
+        }
+        String tableName = payloadJson.getString("tableName");
+        Table table = BigtableHelper.getTable(TableName.valueOf(tableName));
+        String row = payloadJson.getString("rowKey").trim();
+        String family = payloadJson.getString("family").trim();
+        String qualifier = payloadJson.getString("qualifier").trim();
+        String value = payloadJson.getString("value");
+        Put put = new Put(Bytes.toBytes(row));
+        put.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value));
+        table.put(put);
+    }
+}
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/DashboardMainServlet.java b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/DashboardMainServlet.java
index ac6064b..3040035 100644
--- a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/DashboardMainServlet.java
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/DashboardMainServlet.java
@@ -54,7 +54,6 @@
     private static final String DASHBOARD_ALL_LINK = "/?showAll=true";
     private static final String DASHBOARD_FAVORITES_LINK = "/";
     private static final byte[] EMAIL_FAMILY = Bytes.toBytes("email_to_test");
-    private static final byte[] TEST_FAMILY = Bytes.toBytes("test_to_email");
     private static final String STATUS_TABLE = "vts_status_table";
     private static final String TABLE_PREFIX = "result_";
     private static final String ALL_HEADER = "All Tests";
@@ -76,6 +75,10 @@
         RequestDispatcher dispatcher = null;
         String loginURI = userService.createLoginURL(request.getRequestURI());
         String logoutURI = userService.createLogoutURL(loginURI);
+        if (currentUser == null || currentUser.getEmail() == null) {
+            response.sendRedirect(loginURI);
+            return;
+        }
 
         Table table = BigtableHelper.getTable(TableName.valueOf(STATUS_TABLE));
         List<String> displayedTests = new ArrayList<>();
@@ -139,6 +142,7 @@
         String[] testArray = new String[displayedTests.size()];
         displayedTests.toArray(testArray);
         response.setContentType("text/plain");
+        response.setStatus(HttpServletResponse.SC_OK);
         request.setAttribute("testNames", testArray);
         request.setAttribute("headerLabel", header);
         request.setAttribute("showAll", showAll);
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/PreferencesServlet.java b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/ShowPreferencesServlet.java
similarity index 95%
rename from web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/PreferencesServlet.java
rename to web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/ShowPreferencesServlet.java
index 171ff7d..740af49 100644
--- a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/PreferencesServlet.java
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/ShowPreferencesServlet.java
@@ -21,7 +21,6 @@
 import com.google.appengine.api.users.UserService;
 import com.google.appengine.api.users.UserServiceFactory;
 import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.HTableDescriptor;
@@ -30,8 +29,6 @@
 import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.ResultScanner;
-import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.slf4j.Logger;
@@ -52,16 +49,16 @@
 /**
  * Represents the servlet that is invoked on loading the preferences page to manage favorites.
  */
-@WebServlet(name = "preferences", urlPatterns = {"/preferences"})
-public class PreferencesServlet extends HttpServlet {
+@WebServlet(name = "preferences", urlPatterns = {"/show_preferences"})
+public class ShowPreferencesServlet extends HttpServlet {
 
-    private static final String PREFERENCES_JSP = "/preferences.jsp";
+    private static final String PREFERENCES_JSP = "/show_preferences.jsp";
     private static final String DASHBOARD_MAIN_LINK = "/";
     private static final byte[] EMAIL_FAMILY = Bytes.toBytes("email_to_test");
     private static final byte[] TEST_FAMILY = Bytes.toBytes("test_to_email");
     private static final String STATUS_TABLE = "vts_status_table";
     private static final String TABLE_PREFIX = "result_";
-    private static final Logger logger = LoggerFactory.getLogger(PreferencesServlet.class);
+    private static final Logger logger = LoggerFactory.getLogger(ShowPreferencesServlet.class);
 
 
     @Override
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/VtsAlertJobServlet.java b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/VtsAlertJobServlet.java
index e1f0f99..fc643f0 100644
--- a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/VtsAlertJobServlet.java
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/servlet/VtsAlertJobServlet.java
@@ -18,7 +18,6 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Delete;
 import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
@@ -404,9 +403,6 @@
                         logger.error("Error sending email : ", e);
                     }
                 }
-            } else {
-                Delete del = new Delete(Bytes.toBytes(testName));
-                table.delete(del);
             }
         }
     }
diff --git a/web/dashboard/appengine/servlet/src/main/webapp/WEB-INF/appengine-web.xml b/web/dashboard/appengine/servlet/src/main/webapp/WEB-INF/appengine-web.xml
index 70a7b7b..f414966 100644
--- a/web/dashboard/appengine/servlet/src/main/webapp/WEB-INF/appengine-web.xml
+++ b/web/dashboard/appengine/servlet/src/main/webapp/WEB-INF/appengine-web.xml
@@ -17,6 +17,7 @@
       <env-var name="EMAIL_DOMAIN" value="${appengine.emailDomain}" />
       <env-var name="SENDER_EMAIL" value="${appengine.senderEmail}" />
       <env-var name="DEFAULT_EMAIL" value="${appengine.defaultEmail}" />
+      <env-var name="SERVICE_CLIENT_ID" value="${appengine.serviceClientID}" />
     </env-variables>
 
     <system-properties>
diff --git a/web/dashboard/appengine/servlet/src/main/webapp/WEB-INF/web.xml b/web/dashboard/appengine/servlet/src/main/webapp/WEB-INF/web.xml
index 22cbb5a..53037d7 100644
--- a/web/dashboard/appengine/servlet/src/main/webapp/WEB-INF/web.xml
+++ b/web/dashboard/appengine/servlet/src/main/webapp/WEB-INF/web.xml
@@ -38,6 +38,11 @@
 </servlet>
 
 <servlet>
+  <servlet-name>bigtable</servlet-name>
+  <servlet-class>com.google.android.vts.api.BigtableApiServlet</servlet-class>
+</servlet>
+
+<servlet>
   <servlet-name>vts_alert_job</servlet-name>
   <servlet-class>com.google.android.vts.servlet.VtsAlertJobServlet</servlet-class>
 </servlet>
@@ -49,7 +54,7 @@
 
 <servlet-mapping>
   <servlet-name>preferences</servlet-name>
-  <url-pattern>/preferences/*</url-pattern>
+  <url-pattern>/show_preferences/*</url-pattern>
 </servlet-mapping>
 
 <servlet-mapping>
@@ -68,6 +73,11 @@
 </servlet-mapping>
 
 <servlet-mapping>
+  <servlet-name>bigtable</servlet-name>
+  <url-pattern>/api/bigtable/*</url-pattern>
+</servlet-mapping>
+
+<servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>*.css</url-pattern>
 </servlet-mapping>
@@ -90,7 +100,7 @@
 <security-constraint>
   <web-resource-collection>
     <web-resource-name>all</web-resource-name>
-    <url-pattern>/*</url-pattern>
+    <url-pattern>/show_*</url-pattern>
   </web-resource-collection>
   <auth-constraint>
     <role-name>*</role-name>
diff --git a/web/dashboard/appengine/servlet/src/main/webapp/css/preferences.css b/web/dashboard/appengine/servlet/src/main/webapp/css/show_preferences.css
similarity index 100%
rename from web/dashboard/appengine/servlet/src/main/webapp/css/preferences.css
rename to web/dashboard/appengine/servlet/src/main/webapp/css/show_preferences.css
diff --git a/web/dashboard/appengine/servlet/src/main/webapp/dashboard_main.jsp b/web/dashboard/appengine/servlet/src/main/webapp/dashboard_main.jsp
index 68c62c8..415d298 100644
--- a/web/dashboard/appengine/servlet/src/main/webapp/dashboard_main.jsp
+++ b/web/dashboard/appengine/servlet/src/main/webapp/dashboard_main.jsp
@@ -67,7 +67,7 @@
     </div>
     <c:if test='${not showAll}'>
       <div id='edit-button-wrapper' class='fixed-action-btn'>
-        <a href='/preferences' id='edit-button' class='btn-floating btn-large red waves-effect'>
+        <a href='/show_preferences' id='edit-button' class='btn-floating btn-large red waves-effect'>
           <i class='large material-icons'>mode_edit</i>
         </a>
       </div>
diff --git a/web/dashboard/appengine/servlet/src/main/webapp/preferences.jsp b/web/dashboard/appengine/servlet/src/main/webapp/show_preferences.jsp
similarity index 97%
rename from web/dashboard/appengine/servlet/src/main/webapp/preferences.jsp
rename to web/dashboard/appengine/servlet/src/main/webapp/show_preferences.jsp
index 651d5d8..3efd566 100644
--- a/web/dashboard/appengine/servlet/src/main/webapp/preferences.jsp
+++ b/web/dashboard/appengine/servlet/src/main/webapp/show_preferences.jsp
@@ -10,7 +10,7 @@
   <link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700'>
   <link rel='stylesheet' href='https://www.gstatic.com/external_hosted/materialize/all_styles-bundle.css'>
   <link rel='stylesheet' href='/css/navbar.css'>
-  <link rel='stylesheet' href='/css/preferences.css'>
+  <link rel='stylesheet' href='/css/show_preferences.css'>
   <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' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.0/jquery-ui.min.js'></script>
@@ -155,7 +155,7 @@
         </c:forEach>
       </div>
     </div>
-    <form id='prefs-form' style='visibility:hidden' action='/preferences' method='post'>
+    <form id='prefs-form' style='visibility:hidden' action='/show_preferences' method='post'>
         <input name='addedTests' type='text'>
         <input name='removedTests' type='text'>
     </form>