Merge "updated architecture file."
diff --git a/build-python.sh b/build-python.sh
index 93c97ff..48725fe 100755
--- a/build-python.sh
+++ b/build-python.sh
@@ -1,16 +1,22 @@
 #!/bin/bash
 
-# Modify any import statements (to remove subdir path)
+# Modifies any import statements (to remove subdir path)
 
-## Modify import statement in proto/AndroidSystemControlMessage.proto
+## Modifies import statement in proto files.
 sed -i 's/import "test\/vts\/proto\/InterfaceSpecificationMessage.proto";/import "InterfaceSpecificationMessage.proto";/g' proto/AndroidSystemControlMessage.proto
-## Compile proto/AndroidSystemControlMessage.proto to .py code
+sed -i 's/import "test\/vts\/proto\/InterfaceSpecificationMessage.proto";/import "InterfaceSpecificationMessage.proto";/g' proto/ComponentSpecificationMessage.proto
+
+## Compiles modified proto files to .py files.
 protoc -I=proto --python_out=proto proto/AndroidSystemControlMessage.proto
-## Restore import statement in proto/AndroidSystemControlMessage.proto
+protoc -I=proto --python_out=proto proto/ComponentSpecificationMessage.proto
+
+## Restores import statement in proto files.
 sed -i 's/import "InterfaceSpecificationMessage.proto";/import "test\/vts\/proto\/InterfaceSpecificationMessage.proto";/g' proto/AndroidSystemControlMessage.proto
+sed -i 's/import "InterfaceSpecificationMessage.proto";/import "test\/vts\/proto\/InterfaceSpecificationMessage.proto";/g' proto/ComponentSpecificationMessage.proto
 
 protoc -I=proto --python_out=proto proto/InterfaceSpecificationMessage.proto
 protoc -I=proto --python_out=proto proto/VtsReportMessage.proto
 
-# Compile all the python source codes
+# Compiles all the python source codes.
 python -m compileall .
+
diff --git a/doc/web/vts_dashboard.md b/doc/web/vts_dashboard.md
index c3b926d..5a13da0 100644
--- a/doc/web/vts_dashboard.md
+++ b/doc/web/vts_dashboard.md
@@ -91,6 +91,9 @@
 ```
    within the 'com.google.appengine' plugin tag :
 
+   Install the Google App Engine Python SDK:
+   https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Python
+
 ## To run GAE on local machine:
 
 $ cd web/dashboard/appengine/servlet
diff --git a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
index 7276571..a6fe44d 100644
--- a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
+++ b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
@@ -219,7 +219,7 @@
             markTestFailure();
             return true;
         } else if (lastToken.equals(SKIP)){
-            markTestSkip();
+            // SKIP is not a recognized test type in TradeFed.
             return true;
         } else {
             markTestTimeout();
@@ -344,13 +344,6 @@
         mTestResultCache.put(mCurrentTestId, TIMEOUT);
     }
 
-    /**
-     * This method is called whenever the current test decides to skip the test
-     */
-    private void markTestSkip() {
-        mTestResultCache.put(mCurrentTestId, SKIP);
-    }
-
     @Override
     public boolean isCancelled() {
         return false;
diff --git a/proto/ComponentSpecificationMessage.proto b/proto/ComponentSpecificationMessage.proto
new file mode 100644
index 0000000..4ed762c
--- /dev/null
+++ b/proto/ComponentSpecificationMessage.proto
@@ -0,0 +1,52 @@
+// Copyright 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto2";
+
+package android.vts;
+
+import "test/vts/proto/InterfaceSpecificationMessage.proto";
+
+
+// To specify a module (which is logically equivalent to a .hal file in case
+// of a HIDL HAL).
+message ComponentSpecificationMessage {
+  // Class, type, and version of a target component.
+  optional ComponentClass component_class = 1;
+  optional ComponentType component_type = 2;
+  optional float component_type_version = 3 [default = 1.0];
+
+  // The name of a target component (used for HIDL HALs).
+  optional bytes component_name = 4;
+
+  // The package path of a target component (e.g., android.hardware.name).
+  // name implies the component_type field.
+  optional bytes package = 11;
+
+  // The modules to import (e.g., package_path.component_name).
+  repeated bytes import = 12;
+
+  // The name of original C/C++ data structure
+  // (used for conventional and legacy HALs).
+  optional bytes original_data_structure_name = 1001;
+
+  // a list of headers that need to be imported in order to use the component.
+  repeated bytes header = 1002;
+
+  // For a .hal file which actually defines an interface.
+  optional InterfaceSpecificationMessage interface = 2001;
+
+  // For a .hal file which does not defines an interface (e.g., types.hal).
+  repeated VariableSpecificationMessage attributes = 2101;
+}
diff --git a/proto/ComponentSpecificationMessage_pb2.py b/proto/ComponentSpecificationMessage_pb2.py
new file mode 100644
index 0000000..b1ae7b2
--- /dev/null
+++ b/proto/ComponentSpecificationMessage_pb2.py
@@ -0,0 +1,125 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ComponentSpecificationMessage.proto
+
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+
+import InterfaceSpecificationMessage_pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='ComponentSpecificationMessage.proto',
+  package='android.vts',
+  serialized_pb='\n#ComponentSpecificationMessage.proto\x12\x0b\x61ndroid.vts\x1a#InterfaceSpecificationMessage.proto\"\x9d\x03\n\x1d\x43omponentSpecificationMessage\x12\x34\n\x0f\x63omponent_class\x18\x01 \x01(\x0e\x32\x1b.android.vts.ComponentClass\x12\x32\n\x0e\x63omponent_type\x18\x02 \x01(\x0e\x32\x1a.android.vts.ComponentType\x12!\n\x16\x63omponent_type_version\x18\x03 \x01(\x02:\x01\x31\x12\x16\n\x0e\x63omponent_name\x18\x04 \x01(\x0c\x12\x0f\n\x07package\x18\x0b \x01(\x0c\x12\x0e\n\x06import\x18\x0c \x03(\x0c\x12%\n\x1coriginal_data_structure_name\x18\xe9\x07 \x01(\x0c\x12\x0f\n\x06header\x18\xea\x07 \x03(\x0c\x12>\n\tinterface\x18\xd1\x0f \x01(\x0b\x32*.android.vts.InterfaceSpecificationMessage\x12>\n\nattributes\x18\xb5\x10 \x03(\x0b\x32).android.vts.VariableSpecificationMessage')
+
+
+
+
+_COMPONENTSPECIFICATIONMESSAGE = _descriptor.Descriptor(
+  name='ComponentSpecificationMessage',
+  full_name='android.vts.ComponentSpecificationMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='component_class', full_name='android.vts.ComponentSpecificationMessage.component_class', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='component_type', full_name='android.vts.ComponentSpecificationMessage.component_type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='component_type_version', full_name='android.vts.ComponentSpecificationMessage.component_type_version', index=2,
+      number=3, type=2, cpp_type=6, label=1,
+      has_default_value=True, default_value=1,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='component_name', full_name='android.vts.ComponentSpecificationMessage.component_name', index=3,
+      number=4, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value="",
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='package', full_name='android.vts.ComponentSpecificationMessage.package', index=4,
+      number=11, 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='import', full_name='android.vts.ComponentSpecificationMessage.import', index=5,
+      number=12, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='original_data_structure_name', full_name='android.vts.ComponentSpecificationMessage.original_data_structure_name', index=6,
+      number=1001, 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='header', full_name='android.vts.ComponentSpecificationMessage.header', index=7,
+      number=1002, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='interface', full_name='android.vts.ComponentSpecificationMessage.interface', index=8,
+      number=2001, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='android.vts.ComponentSpecificationMessage.attributes', index=9,
+      number=2101, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=90,
+  serialized_end=503,
+)
+
+_COMPONENTSPECIFICATIONMESSAGE.fields_by_name['component_class'].enum_type = InterfaceSpecificationMessage_pb2._COMPONENTCLASS
+_COMPONENTSPECIFICATIONMESSAGE.fields_by_name['component_type'].enum_type = InterfaceSpecificationMessage_pb2._COMPONENTTYPE
+_COMPONENTSPECIFICATIONMESSAGE.fields_by_name['interface'].message_type = InterfaceSpecificationMessage_pb2._INTERFACESPECIFICATIONMESSAGE
+_COMPONENTSPECIFICATIONMESSAGE.fields_by_name['attributes'].message_type = InterfaceSpecificationMessage_pb2._VARIABLESPECIFICATIONMESSAGE
+DESCRIPTOR.message_types_by_name['ComponentSpecificationMessage'] = _COMPONENTSPECIFICATIONMESSAGE
+
+class ComponentSpecificationMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _COMPONENTSPECIFICATIONMESSAGE
+
+  # @@protoc_insertion_point(class_scope:android.vts.ComponentSpecificationMessage)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/proto/InterfaceSpecificationMessage.proto b/proto/InterfaceSpecificationMessage.proto
index 794ca63..f3d527a 100644
--- a/proto/InterfaceSpecificationMessage.proto
+++ b/proto/InterfaceSpecificationMessage.proto
@@ -58,6 +58,9 @@
 
   // for bionic's libm
   BIONIC_LIBM = 1001;
+
+  // for VNDK's libcutils
+  VNDK_LIBCUTILS = 1101;
 }
 
 
diff --git a/proto/InterfaceSpecificationMessage_pb2.py b/proto/InterfaceSpecificationMessage_pb2.py
index b524442..7507add 100644
--- a/proto/InterfaceSpecificationMessage_pb2.py
+++ b/proto/InterfaceSpecificationMessage_pb2.py
@@ -14,7 +14,7 @@
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='InterfaceSpecificationMessage.proto',
   package='android.vts',
-  serialized_pb='\n#InterfaceSpecificationMessage.proto\x12\x0b\x61ndroid.vts\"e\n\x1c\x43\x61llFlowSpecificationMessage\x12\x14\n\x05\x65ntry\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04\x65xit\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x0c\n\x04next\x18\x0b \x03(\x0c\x12\x0c\n\x04prev\x18\x0c \x03(\x0c\"C\n NativeCodeCoverageRawDataMessage\x12\x11\n\tfile_path\x18\x01 \x01(\x0c\x12\x0c\n\x04gcda\x18\x0b \x01(\x0c\"\xa9\x04\n\x1c\x46unctionSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x16\n\x0esubmodule_name\x18\x02 \x01(\x0c\x12>\n\x0breturn_type\x18\x0b \x01(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x43\n\x10return_type_hidl\x18\x0c \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12N\n\x1areturn_type_submodule_spec\x18\r \x01(\x0b\x32*.android.vts.InterfaceSpecificationMessage\x12\x36\n\x03\x61rg\x18\x15 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12;\n\x08\x63\x61llflow\x18\x1f \x03(\x0b\x32).android.vts.CallFlowSpecificationMessage\x12\x16\n\x0eprofiling_data\x18\x65 \x03(\x02\x12 \n\x17processed_coverage_data\x18\xc9\x01 \x03(\r\x12I\n\x11raw_coverage_data\x18\xca\x01 \x03(\x0b\x32-.android.vts.NativeCodeCoverageRawDataMessage\x12\x14\n\x0bparent_path\x18\xad\x02 \x01(\x0c\"\x84\x03\n\x16ScalarDataValueMessage\x12\x0e\n\x06\x62ool_t\x18\x01 \x01(\x05\x12\x0e\n\x06int8_t\x18\x0b \x01(\x05\x12\x0f\n\x07uint8_t\x18\x0c \x01(\r\x12\x0c\n\x04\x63har\x18\r \x01(\x05\x12\r\n\x05uchar\x18\x0e \x01(\r\x12\x0f\n\x07int16_t\x18\x15 \x01(\x05\x12\x10\n\x08uint16_t\x18\x16 \x01(\r\x12\x0f\n\x07int32_t\x18\x1f \x01(\x05\x12\x10\n\x08uint32_t\x18  \x01(\r\x12\x0f\n\x07int64_t\x18) \x01(\x03\x12\x10\n\x08uint64_t\x18* \x01(\x04\x12\x0f\n\x07\x66loat_t\x18\x65 \x01(\x02\x12\x10\n\x08\x64ouble_t\x18\x66 \x01(\x01\x12\x10\n\x07pointer\x18\xc9\x01 \x01(\r\x12\x0f\n\x06opaque\x18\xca\x01 \x01(\r\x12\x15\n\x0cvoid_pointer\x18\xd3\x01 \x01(\r\x12\x15\n\x0c\x63har_pointer\x18\xd4\x01 \x01(\r\x12\x16\n\ruchar_pointer\x18\xd5\x01 \x01(\r\x12\x18\n\x0fpointer_pointer\x18\xfb\x01 \x01(\r\x12\r\n\x04\x62its\x18\xe9\x07 \x01(\r\"\xee\x01\n\x16VectorDataValueMessage\x12\'\n\x04type\x18\x01 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x0c\n\x04size\x18\x02 \x01(\r\x12\x13\n\x0bscalar_type\x18\x0b \x01(\x0c\x12\x32\n\x05value\x18\x0c \x03(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bstruct_type\x18\x15 \x01(\x0c\x12?\n\x0cstruct_value\x18\x16 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd1\x01\n#FunctionPointerSpecificationMessage\x12\x15\n\rfunction_name\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x0b \x01(\r\x12\n\n\x02id\x18\x15 \x01(\x0c\x12\x36\n\x03\x61rg\x18\x65 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12>\n\x0breturn_type\x18o \x01(\x0b\x32).android.vts.VariableSpecificationMessage\"9\n\x16StringDataValueMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0e\n\x06length\x18\x0b \x01(\r\"9\n\x14\x45numDataValueMessage\x12\x12\n\nenumerator\x18\x01 \x03(\x0c\x12\r\n\x05value\x18\x02 \x03(\r\"\xbe\x05\n\x1cVariableSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\'\n\x04type\x18\x02 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x39\n\x0cscalar_value\x18\x65 \x01(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bscalar_type\x18\x66 \x01(\x0c\x12\x39\n\x0cstring_value\x18o \x01(\x0b\x32#.android.vts.StringDataValueMessage\x12\x35\n\nenum_value\x18y \x01(\x0b\x32!.android.vts.EnumDataValueMessage\x12:\n\x0cvector_value\x18\x83\x01 \x03(\x0b\x32#.android.vts.VectorDataValueMessage\x12@\n\x0cstruct_value\x18\x8d\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x14\n\x0bstruct_type\x18\x8e\x01 \x01(\x0c\x12?\n\x0bunion_value\x18\x97\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x18\n\x0fpredefined_type\x18\xc9\x01 \x01(\x0c\x12K\n\x10\x66unction_pointer\x18\xdd\x01 \x03(\x0b\x32\x30.android.vts.FunctionPointerSpecificationMessage\x12\x17\n\x08is_input\x18\xad\x02 \x01(\x08:\x04true\x12\x19\n\tis_output\x18\xae\x02 \x01(\x08:\x05\x66\x61lse\x12\x18\n\x08is_const\x18\xaf\x02 \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0bis_callback\x18\xb0\x02 \x01(\x08:\x05\x66\x61lse\"\xfb\x01\n\x1aStructSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x19\n\nis_pointer\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x37\n\x03\x61pi\x18\xe9\x07 \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12<\n\nsub_struct\x18\xd1\x0f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd3\x03\n\x1dInterfaceSpecificationMessage\x12\x34\n\x0f\x63omponent_class\x18\x01 \x01(\x0e\x32\x1b.android.vts.ComponentClass\x12\x32\n\x0e\x63omponent_type\x18\x02 \x01(\x0e\x32\x1a.android.vts.ComponentType\x12!\n\x16\x63omponent_type_version\x18\x03 \x01(\x02:\x01\x31\x12\x16\n\x0e\x63omponent_name\x18\x04 \x01(\x0c\x12\x0f\n\x07package\x18\x0b \x01(\x0c\x12\x0e\n\x06import\x18\x0c \x03(\x0c\x12%\n\x1coriginal_data_structure_name\x18\xe9\x07 \x01(\x0c\x12\x0f\n\x06header\x18\xea\x07 \x03(\x0c\x12\x37\n\x03\x61pi\x18\xd1\x0f \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12<\n\nsub_struct\x18\xa1\x1f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage*\xaa\x01\n\x0e\x43omponentClass\x12\x11\n\rUNKNOWN_CLASS\x10\x00\x12\x14\n\x10HAL_CONVENTIONAL\x10\x01\x12\x1e\n\x1aHAL_CONVENTIONAL_SUBMODULE\x10\x02\x12\x0e\n\nHAL_LEGACY\x10\x03\x12\x0c\n\x08HAL_HIDL\x10\x04\x12!\n\x1dHAL_HIDL_WRAPPED_CONVENTIONAL\x10\x05\x12\x0e\n\nLIB_SHARED\x10\x0b*\x8c\x01\n\rComponentType\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\t\n\x05\x41UDIO\x10\x01\x12\n\n\x06\x43\x41MERA\x10\x02\x12\x07\n\x03GPS\x10\x03\x12\t\n\x05LIGHT\x10\x04\x12\x08\n\x04WIFI\x10\x05\x12\n\n\x06MOBILE\x10\x06\x12\r\n\tBLUETOOTH\x10\x07\x12\x07\n\x03NFC\x10\x08\x12\x10\n\x0b\x42IONIC_LIBM\x10\xe9\x07*\xf7\x01\n\x0cVariableType\x12\x19\n\x15UNKNOWN_VARIABLE_TYPE\x10\x00\x12\x13\n\x0fTYPE_PREDEFINED\x10\x01\x12\x0f\n\x0bTYPE_SCALAR\x10\x02\x12\x0f\n\x0bTYPE_STRING\x10\x03\x12\r\n\tTYPE_ENUM\x10\x04\x12\x0e\n\nTYPE_ARRAY\x10\x05\x12\x0f\n\x0bTYPE_VECTOR\x10\x06\x12\x0f\n\x0bTYPE_STRUCT\x10\x07\x12\x19\n\x15TYPE_FUNCTION_POINTER\x10\x08\x12\r\n\tTYPE_VOID\x10\t\x12\x16\n\x12TYPE_HIDL_CALLBACK\x10\n\x12\x12\n\x0eTYPE_SUBMODULE\x10\x0b')
+  serialized_pb='\n#InterfaceSpecificationMessage.proto\x12\x0b\x61ndroid.vts\"e\n\x1c\x43\x61llFlowSpecificationMessage\x12\x14\n\x05\x65ntry\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04\x65xit\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x0c\n\x04next\x18\x0b \x03(\x0c\x12\x0c\n\x04prev\x18\x0c \x03(\x0c\"C\n NativeCodeCoverageRawDataMessage\x12\x11\n\tfile_path\x18\x01 \x01(\x0c\x12\x0c\n\x04gcda\x18\x0b \x01(\x0c\"\xa9\x04\n\x1c\x46unctionSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x16\n\x0esubmodule_name\x18\x02 \x01(\x0c\x12>\n\x0breturn_type\x18\x0b \x01(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x43\n\x10return_type_hidl\x18\x0c \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12N\n\x1areturn_type_submodule_spec\x18\r \x01(\x0b\x32*.android.vts.InterfaceSpecificationMessage\x12\x36\n\x03\x61rg\x18\x15 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12;\n\x08\x63\x61llflow\x18\x1f \x03(\x0b\x32).android.vts.CallFlowSpecificationMessage\x12\x16\n\x0eprofiling_data\x18\x65 \x03(\x02\x12 \n\x17processed_coverage_data\x18\xc9\x01 \x03(\r\x12I\n\x11raw_coverage_data\x18\xca\x01 \x03(\x0b\x32-.android.vts.NativeCodeCoverageRawDataMessage\x12\x14\n\x0bparent_path\x18\xad\x02 \x01(\x0c\"\x84\x03\n\x16ScalarDataValueMessage\x12\x0e\n\x06\x62ool_t\x18\x01 \x01(\x05\x12\x0e\n\x06int8_t\x18\x0b \x01(\x05\x12\x0f\n\x07uint8_t\x18\x0c \x01(\r\x12\x0c\n\x04\x63har\x18\r \x01(\x05\x12\r\n\x05uchar\x18\x0e \x01(\r\x12\x0f\n\x07int16_t\x18\x15 \x01(\x05\x12\x10\n\x08uint16_t\x18\x16 \x01(\r\x12\x0f\n\x07int32_t\x18\x1f \x01(\x05\x12\x10\n\x08uint32_t\x18  \x01(\r\x12\x0f\n\x07int64_t\x18) \x01(\x03\x12\x10\n\x08uint64_t\x18* \x01(\x04\x12\x0f\n\x07\x66loat_t\x18\x65 \x01(\x02\x12\x10\n\x08\x64ouble_t\x18\x66 \x01(\x01\x12\x10\n\x07pointer\x18\xc9\x01 \x01(\r\x12\x0f\n\x06opaque\x18\xca\x01 \x01(\r\x12\x15\n\x0cvoid_pointer\x18\xd3\x01 \x01(\r\x12\x15\n\x0c\x63har_pointer\x18\xd4\x01 \x01(\r\x12\x16\n\ruchar_pointer\x18\xd5\x01 \x01(\r\x12\x18\n\x0fpointer_pointer\x18\xfb\x01 \x01(\r\x12\r\n\x04\x62its\x18\xe9\x07 \x01(\r\"\xee\x01\n\x16VectorDataValueMessage\x12\'\n\x04type\x18\x01 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x0c\n\x04size\x18\x02 \x01(\r\x12\x13\n\x0bscalar_type\x18\x0b \x01(\x0c\x12\x32\n\x05value\x18\x0c \x03(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bstruct_type\x18\x15 \x01(\x0c\x12?\n\x0cstruct_value\x18\x16 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd1\x01\n#FunctionPointerSpecificationMessage\x12\x15\n\rfunction_name\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x0b \x01(\r\x12\n\n\x02id\x18\x15 \x01(\x0c\x12\x36\n\x03\x61rg\x18\x65 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12>\n\x0breturn_type\x18o \x01(\x0b\x32).android.vts.VariableSpecificationMessage\"9\n\x16StringDataValueMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0e\n\x06length\x18\x0b \x01(\r\"9\n\x14\x45numDataValueMessage\x12\x12\n\nenumerator\x18\x01 \x03(\x0c\x12\r\n\x05value\x18\x02 \x03(\r\"\xbe\x05\n\x1cVariableSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\'\n\x04type\x18\x02 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x39\n\x0cscalar_value\x18\x65 \x01(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bscalar_type\x18\x66 \x01(\x0c\x12\x39\n\x0cstring_value\x18o \x01(\x0b\x32#.android.vts.StringDataValueMessage\x12\x35\n\nenum_value\x18y \x01(\x0b\x32!.android.vts.EnumDataValueMessage\x12:\n\x0cvector_value\x18\x83\x01 \x03(\x0b\x32#.android.vts.VectorDataValueMessage\x12@\n\x0cstruct_value\x18\x8d\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x14\n\x0bstruct_type\x18\x8e\x01 \x01(\x0c\x12?\n\x0bunion_value\x18\x97\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x18\n\x0fpredefined_type\x18\xc9\x01 \x01(\x0c\x12K\n\x10\x66unction_pointer\x18\xdd\x01 \x03(\x0b\x32\x30.android.vts.FunctionPointerSpecificationMessage\x12\x17\n\x08is_input\x18\xad\x02 \x01(\x08:\x04true\x12\x19\n\tis_output\x18\xae\x02 \x01(\x08:\x05\x66\x61lse\x12\x18\n\x08is_const\x18\xaf\x02 \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0bis_callback\x18\xb0\x02 \x01(\x08:\x05\x66\x61lse\"\xfb\x01\n\x1aStructSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x19\n\nis_pointer\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x37\n\x03\x61pi\x18\xe9\x07 \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12<\n\nsub_struct\x18\xd1\x0f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd3\x03\n\x1dInterfaceSpecificationMessage\x12\x34\n\x0f\x63omponent_class\x18\x01 \x01(\x0e\x32\x1b.android.vts.ComponentClass\x12\x32\n\x0e\x63omponent_type\x18\x02 \x01(\x0e\x32\x1a.android.vts.ComponentType\x12!\n\x16\x63omponent_type_version\x18\x03 \x01(\x02:\x01\x31\x12\x16\n\x0e\x63omponent_name\x18\x04 \x01(\x0c\x12\x0f\n\x07package\x18\x0b \x01(\x0c\x12\x0e\n\x06import\x18\x0c \x03(\x0c\x12%\n\x1coriginal_data_structure_name\x18\xe9\x07 \x01(\x0c\x12\x0f\n\x06header\x18\xea\x07 \x03(\x0c\x12\x37\n\x03\x61pi\x18\xd1\x0f \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12<\n\nsub_struct\x18\xa1\x1f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage*\xaa\x01\n\x0e\x43omponentClass\x12\x11\n\rUNKNOWN_CLASS\x10\x00\x12\x14\n\x10HAL_CONVENTIONAL\x10\x01\x12\x1e\n\x1aHAL_CONVENTIONAL_SUBMODULE\x10\x02\x12\x0e\n\nHAL_LEGACY\x10\x03\x12\x0c\n\x08HAL_HIDL\x10\x04\x12!\n\x1dHAL_HIDL_WRAPPED_CONVENTIONAL\x10\x05\x12\x0e\n\nLIB_SHARED\x10\x0b*\xa1\x01\n\rComponentType\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\t\n\x05\x41UDIO\x10\x01\x12\n\n\x06\x43\x41MERA\x10\x02\x12\x07\n\x03GPS\x10\x03\x12\t\n\x05LIGHT\x10\x04\x12\x08\n\x04WIFI\x10\x05\x12\n\n\x06MOBILE\x10\x06\x12\r\n\tBLUETOOTH\x10\x07\x12\x07\n\x03NFC\x10\x08\x12\x10\n\x0b\x42IONIC_LIBM\x10\xe9\x07\x12\x13\n\x0eVNDK_LIBCUTILS\x10\xcd\x08*\xf7\x01\n\x0cVariableType\x12\x19\n\x15UNKNOWN_VARIABLE_TYPE\x10\x00\x12\x13\n\x0fTYPE_PREDEFINED\x10\x01\x12\x0f\n\x0bTYPE_SCALAR\x10\x02\x12\x0f\n\x0bTYPE_STRING\x10\x03\x12\r\n\tTYPE_ENUM\x10\x04\x12\x0e\n\nTYPE_ARRAY\x10\x05\x12\x0f\n\x0bTYPE_VECTOR\x10\x06\x12\x0f\n\x0bTYPE_STRUCT\x10\x07\x12\x19\n\x15TYPE_FUNCTION_POINTER\x10\x08\x12\r\n\tTYPE_VOID\x10\t\x12\x16\n\x12TYPE_HIDL_CALLBACK\x10\n\x12\x12\n\x0eTYPE_SUBMODULE\x10\x0b')
 
 _COMPONENTCLASS = _descriptor.EnumDescriptor(
   name='ComponentClass',
@@ -104,11 +104,15 @@
       name='BIONIC_LIBM', index=9, number=1001,
       options=None,
       type=None),
+    _descriptor.EnumValueDescriptor(
+      name='VNDK_LIBCUTILS', index=10, number=1101,
+      options=None,
+      type=None),
   ],
   containing_type=None,
   options=None,
   serialized_start=3345,
-  serialized_end=3485,
+  serialized_end=3506,
 )
 
 ComponentType = enum_type_wrapper.EnumTypeWrapper(_COMPONENTTYPE)
@@ -169,8 +173,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=3488,
-  serialized_end=3735,
+  serialized_start=3509,
+  serialized_end=3756,
 )
 
 VariableType = enum_type_wrapper.EnumTypeWrapper(_VARIABLETYPE)
@@ -191,6 +195,7 @@
 BLUETOOTH = 7
 NFC = 8
 BIONIC_LIBM = 1001
+VNDK_LIBCUTILS = 1101
 UNKNOWN_VARIABLE_TYPE = 0
 TYPE_PREDEFINED = 1
 TYPE_SCALAR = 2
diff --git a/setup.sh b/setup.sh
index 7c6ec8a..7e40aa9 100755
--- a/setup.sh
+++ b/setup.sh
@@ -57,6 +57,7 @@
   adb push specification/hal_hidl/Nfc.vts /data/local/tmp/spec/Nfc.vts
   adb push specification/hal_hidl/NfcClientCallback.vts /data/local/tmp/spec/NfcClientCallback.vts
   adb push specification/lib_bionic/libmV1.vts /data/local/tmp/spec/libmV1.vts
+  adb push specification/lib_bionic/libcutilsV1.vts /data/local/tmp/spec/libcutilsV1.vts
 
   echo "install asan packages"
   # asan
diff --git a/specification/Android.mk b/specification/Android.mk
index 32f9fd6..918cd2d 100644
--- a/specification/Android.mk
+++ b/specification/Android.mk
@@ -26,6 +26,7 @@
   hal_conventional/BluetoothHalV1.vts \
   hal_conventional/BluetoothHalV1bt_interface_t.vts \
   lib_bionic/libmV1.vts \
+  lib_bionic/libcutilsV1.vts \
 
 VTS_ENABLE_TREBLE:=
 
@@ -123,8 +124,9 @@
 vts_spec_file6 := $(VTS_TESTCASES_OUT)/WifiHalV1.vts
 vts_spec_file7 := $(VTS_TESTCASES_OUT)/Nfc.vts
 vts_spec_file8 := $(VTS_TESTCASES_OUT)/NfcClientCallback.vts
-+vts_spec_file9 := $(VTS_TESTCASES_OUT)/BluetoothHalV1.vts
-+vts_spec_file10 := $(VTS_TESTCASES_OUT)/BluetoothHalV1bt_interface_t.vts
+vts_spec_file9 := $(VTS_TESTCASES_OUT)/BluetoothHalV1.vts
+vts_spec_file10 := $(VTS_TESTCASES_OUT)/BluetoothHalV1bt_interface_t.vts
+vts_spec_file11 := $(VTS_TESTCASES_OUT)/libcutilsV1.vts
 
 $(vts_spec_file1): $(LOCAL_PATH)/hal_conventional/CameraHalV2.vts | $(ACP)
 	$(hide) mkdir -p $(VTS_TESTCASES_OUT)
@@ -166,6 +168,10 @@
 	$(hide) mkdir -p $(VTS_TESTCASES_OUT)
 	$(hide) $(ACP) -fp $< $@
 
-vts: $(vts_spec_file1) $(vts_spec_file2) $(vts_spec_file3) $(vts_spec_file4) $(vts_spec_file5) $(vts_spec_file6) $(vts_spec_file7) $(vts_spec_file8) $(vts_spec_file9) $(vts_spec_file10)
+$(vts_spec_file11): $(LOCAL_PATH)/lib_bionic/libcutilsV1.vts | $(ACP)
+	$(hide) mkdir -p $(VTS_TESTCASES_OUT)
+	$(hide) $(ACP) -fp $< $@
+
+vts: $(vts_spec_file1) $(vts_spec_file2) $(vts_spec_file3) $(vts_spec_file4) $(vts_spec_file5) $(vts_spec_file6) $(vts_spec_file7) $(vts_spec_file8) $(vts_spec_file9) $(vts_spec_file10) $(vts_spec_file11)
 
 
diff --git a/specification/lib_bionic/libcutilsV1.vts b/specification/lib_bionic/libcutilsV1.vts
new file mode 100644
index 0000000..66554ea
--- /dev/null
+++ b/specification/lib_bionic/libcutilsV1.vts
@@ -0,0 +1,88 @@
+component_class: LIB_SHARED
+component_type: VNDK_LIBCUTILS
+component_type_version: 1.0
+component_name: "libcutils"
+
+header: "<unistd.h>"
+header: "<stdint.h>"
+header: "<sys/types.h>"
+
+api: {
+  name: "qtaguid_tagSocket"
+  return_type: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "uint32_t"
+  }
+
+}
+
+api: {
+  name: "qtaguid_untagSocket"
+  return_type: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+
+}
+
+api: {
+  name: "qtaguid_setCounterSet"
+  return_type: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "uint32_t"
+  }
+
+}
+api: {
+  name: "qtaguid_deleteTagData"
+  return_type: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "uint32_t"
+  }
+
+}
+
+api: {
+  name: "qtaguid_setPacifier"
+  return_type: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+  arg: {
+    type: TYPE_SCALAR
+    scalar_type: "int32_t"
+  }
+}
+
diff --git a/sysfuzzer/vtscompiler/code_gen/LibSharedCodeGen.cpp b/sysfuzzer/vtscompiler/code_gen/LibSharedCodeGen.cpp
index 01721b0..b8a5a7b 100644
--- a/sysfuzzer/vtscompiler/code_gen/LibSharedCodeGen.cpp
+++ b/sysfuzzer/vtscompiler/code_gen/LibSharedCodeGen.cpp
@@ -59,6 +59,11 @@
           message.original_data_structure_name().length() > 0) {
         cpp_ss << "reinterpret_cast<" << GetCppVariableType(arg) << ">("
                << kInstanceVariableName << ")";
+      } else if (arg.type() == TYPE_SCALAR) {
+        cpp_ss << "(func_msg->arg(" << arg_count << ").type() == TYPE_SCALAR && "
+               << "func_msg->arg(" << arg_count << ").scalar_value().has_" << arg.scalar_type() << "()) ? "
+               << "func_msg->arg(" << arg_count << ").scalar_value()." << arg.scalar_type() << "()"
+               << " : " << GetCppInstanceType(arg);
       } else {
         cpp_ss << GetCppInstanceType(arg);
       }
diff --git a/testcases/host/shell_binary_crash_test/ShellBinaryCrashTest.py b/testcases/host/shell_binary_crash_test/ShellBinaryCrashTest.py
index 28e6ed8..a858d70 100644
--- a/testcases/host/shell_binary_crash_test/ShellBinaryCrashTest.py
+++ b/testcases/host/shell_binary_crash_test/ShellBinaryCrashTest.py
@@ -27,6 +27,9 @@
 class ShellBinaryCrashTest(base_test_with_webdb.BaseTestWithWebDbClass):
     """A binary crash test case for the shell driver."""
 
+    EXIT_CODE_CRASH = 133
+    EXIT_CODE_SEGFAULT = 139
+
     def setUpClass(self):
         self.dut = self.registerController(android_device)[0]
 
@@ -35,13 +38,12 @@
         self.dut.shell.InvokeTerminal("my_shell1")
         target = "/data/local/tmp/64/vts_test_binary_crash_app"
         results = self.dut.shell.my_shell1.Execute(
-            ["chmod 755 %s" % target,
-             "%s" % target])
+            ["chmod 755 %s" % target, target])
         logging.info(str(results[const.STDOUT]))
         asserts.assertEqual(len(results[const.STDOUT]), 2)
         asserts.assertEqual(results[const.STDOUT][1].strip(), "")
         # "crash_app: start" is also valid output.
-        asserts.assertEqual(results[const.EXIT_CODE][1], 127)
+        asserts.assertEqual(results[const.EXIT_CODE][1], self.EXIT_CODE_CRASH)
 
         self.CheckShellDriver("my_shell1")
         self.CheckShellDriver("my_shell2")
@@ -51,14 +53,14 @@
         self.dut.shell.InvokeTerminal("my_shell1")
         target = "/data/local/tmp/32/connect01"
         results = self.dut.shell.my_shell1.Execute(
-            ["chmod 755 %s" % target,
-             "%s" % target])
+            ["chmod 755 %s" % target, target])
         logging.info(str(results[const.STDOUT]))
         asserts.assertEqual(len(results[const.STDOUT]), 2)
         asserts.assertEqual(results[const.STDOUT][1].strip(), "")
         # TODO: currently the agent doesn't return the stdout log emitted
         # before a failure.
-        asserts.assertEqual(results[const.EXIT_CODE][1], 127)
+        asserts.assertEqual(results[const.EXIT_CODE][1],
+                            self.EXIT_CODE_SEGFAULT)
 
         self.CheckShellDriver("my_shell1")
         self.CheckShellDriver("my_shell2")
diff --git a/testcases/kernel/ltp/Android.mk b/testcases/kernel/ltp/Android.mk
index 36c142a..f9e3276 100644
--- a/testcases/kernel/ltp/Android.mk
+++ b/testcases/kernel/ltp/Android.mk
@@ -1,18 +1,19 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
 LOCAL_PATH := $(call my-dir)
 
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := KernelLtpTest
-LOCAL_MODULE_CLASS := FAKE
-LOCAL_IS_HOST_MODULE := true
-LOCAL_COMPATIBILITY_SUITE := vts
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-$(LOCAL_BUILT_MODULE):
-	@echo "VTS host-driven test target: $(LOCAL_MODULE)"
-	$(hide) touch $@
-
-VTS_CONFIG_SRC_DIR := testcases/kernel/ltp
-include test/vts/tools/build/Android.host_config.mk
-
+include $(call all-subdir-makefiles)
diff --git a/testcases/kernel/ltp/KernelLtpTest.py b/testcases/kernel/ltp/KernelLtpTest.py
index 47dfb52..58298c7 100644
--- a/testcases/kernel/ltp/KernelLtpTest.py
+++ b/testcases/kernel/ltp/KernelLtpTest.py
@@ -16,7 +16,6 @@
 #
 
 import logging
-import os
 
 from vts.runners.host import asserts
 from vts.runners.host import base_test_with_webdb
@@ -25,57 +24,50 @@
 from vts.runners.host import test_runner
 from vts.utils.python.controllers import android_device
 
-from vts.testcases.kernel.ltp import KernelLtpTestHelper
+from vts.testcases.kernel.ltp import test_cases_parser
+from vts.testcases.kernel.ltp import environment_requirement_checker as env_checker
+from vts.testcases.kernel.ltp import ltp_enums
+from vts.testcases.kernel.ltp import ltp_configs
 
 
 class KernelLtpTest(base_test_with_webdb.BaseTestWithWebDbClass):
     """Runs the LTP (Linux Test Project) testcases against Android OS kernel.
 
     Attributes:
-        _TPASS: int, exit_code for Test pass
-        _TCONF: int, The test case is not for current configuration of kernel
-        _32BIT: int, for 32 bit tests
-        _64BIT: int, for 64 bit tests
         _dut: AndroidDevice, the device under test
         _shell: ShellMirrorObject, shell mirror object used to execute commands
-        _ltp_dir: string, ltp build root directory on target
         _testcases: TestcasesParser, test case input parser
         _env: dict<stirng, stirng>, dict of environment variable key value pair
-        _KEY_ENV__: constant strings starting with prefix "_KEY_ENV_" are used as dict
-                    key in environment variable dictionary
     """
-    _TPASS = 0
-    _TCONF = 32
-    _32BIT = 32
-    _64BIT = 64
-    _KEY_ENV_TMPDIR = 'TMPDIR'
-    _KEY_ENV_TMP = 'TMP'
-    _KEY_ENV_LTP_DEV_FS_TYPE = 'LTP_DEV_FS_TYPE'
-    _KEY_ENV_LTPROOT = 'LTPROOT'
-    _KEY_ENV_PATH = 'PATH'
+    _32BIT = "32"
+    _64BIT = "64"
 
     def setUpClass(self):
         """Creates a remote shell instance, and copies data files."""
-        required_params = [keys.ConfigKeys.IKEY_DATA_FILE_PATH]
+        required_params = [keys.ConfigKeys.IKEY_DATA_FILE_PATH,
+                           ltp_enums.ConfigKeys.RUN_STAGING]
         self.getUserParams(required_params)
 
         logging.info("data_file_path: %s", self.data_file_path)
+        logging.info("run_staging: %s", self.run_staging)
+
         self._dut = self.registerController(android_device)[0]
         self._dut.shell.InvokeTerminal("one")
         self._shell = self._dut.shell.one
-        self._ltp_dir = "/data/local/tmp/ltp"
 
-        self._requirement = KernelLtpTestHelper.EnvironmentRequirementChecker(
+        self._requirement = env_checker.EnvironmentRequirementChecker(
             self._shell)
 
-        self._testcases = KernelLtpTestHelper.TestCasesParser(
+        self._testcases = test_cases_parser.TestCasesParser(
             self.data_file_path)
-        self._env = {self._KEY_ENV_TMPDIR: KernelLtpTestHelper.LTPTMP,
-                     self._KEY_ENV_TMP: "%s/tmp" % KernelLtpTestHelper.LTPTMP,
-                     self._KEY_ENV_LTP_DEV_FS_TYPE: "ext4",
-                     self._KEY_ENV_LTPROOT: self._ltp_dir,
-                     self._KEY_ENV_PATH:
-                     "/system/bin:%s/testcases/bin" % self._ltp_dir, }
+        self._env = {ltp_enums.ShellEnvKeys.TMP: ltp_configs.TMP,
+                     ltp_enums.ShellEnvKeys.TMPBASE: ltp_configs.TMPBASE,
+                     ltp_enums.ShellEnvKeys.LTPTMP: ltp_configs.LTPTMP,
+                     ltp_enums.ShellEnvKeys.TMPDIR: ltp_configs.TMPDIR,
+                     ltp_enums.ShellEnvKeys.LTP_DEV_FS_TYPE:
+                     ltp_configs.LTP_DEV_FS_TYPE,
+                     ltp_enums.ShellEnvKeys.LTPROOT: ltp_configs.LTPDIR,
+                     ltp_enums.ShellEnvKeys.PATH: ltp_configs.PATH}
 
     def PushFiles(self, n_bit):
         """Push the related files to target.
@@ -85,10 +77,9 @@
                    _64BIT, or 64, for 64bit test;
         """
 
-        self._shell.Execute("mkdir %s -p" % self._ltp_dir)
-        self._dut.adb.push("%s/%i/ltp/. %s" %
-                           (self.data_file_path, n_bit, self._ltp_dir))
-        # TODO: libcap
+        self._shell.Execute("mkdir %s -p" % ltp_configs.LTPDIR)
+        self._dut.adb.push("%s/%s/ltp/. %s" %
+                           (self.data_file_path, n_bit, ltp_configs.LTPDIR))
 
     def GetEnvp(self):
         """Generate the environment variable required to run the tests."""
@@ -97,13 +88,13 @@
 
     def tearDownClass(self):
         """Deletes all copied data files."""
-        self._shell.Execute("rm -rf %s" % self._ltp_dir)
+        self._shell.Execute("rm -rf %s" % ltp_configs.LTPDIR)
         self._requirement.Cleanup()
 
     def Verify(self, results):
         """Verifies the test result of each test case."""
-        asserts.assertFalse(len(results) == 0,
-                            "No response received. Socket timeout")
+        asserts.assertFalse(
+            len(results) == 0, "No response received. Socket timeout")
 
         logging.info("stdout: %s", results[const.STDOUT])
         logging.info("stderr: %s", results[const.STDERR])
@@ -114,12 +105,13 @@
         stdout = results[const.STDOUT][0]
         ret_code = results[const.EXIT_CODE][0]
         # Test case is not for the current configuration, SKIP
-        if ret_code == self._TCONF:
+        if ret_code == ltp_enums.TestExitCode.TCONF:
             asserts.skipIf('TPASS' not in stdout,
                            "Incompatible test skipped: TCONF")
         else:
-            asserts.assertEqual(ret_code, self._TPASS,
-                               "Got return code %s, test did not pass." % ret_code)
+            asserts.assertEqual(ret_code, ltp_enums.TestExitCode.TPASS,
+                                "Got return code %s, test did not pass." %
+                                ret_code)
 
     def TestNBits(self, n_bit):
         """Runs all 32-bit or 64-bit LTP test cases.
@@ -129,19 +121,22 @@
                    _64BIT, or 64, for 64bit test;
         """
         self.PushFiles(n_bit)
-        logging.info("[Test Case] test%iBits SKIP", n_bit)
+        logging.info("[Test Case] test%sBits SKIP", n_bit)
 
-        test_cases = list(self._testcases.Load(self._ltp_dir))
+        test_cases = list(
+            self._testcases.Load(
+                ltp_configs.LTPDIR, n_bit=n_bit, run_staging=self.run_staging))
         logging.info("Checking binary exists for all test cases.")
         self._requirement.RunCheckTestcasePathExistsAll(test_cases)
         self._requirement.RunChmodTestcasesAll(test_cases)
-        logging.info("Start running individual tests.")
+        logging.info("Start running %i individual tests." % len(test_cases))
 
-        self.runGeneratedTests(test_func=self.RunLtpOnce,
-                               settings=test_cases,
-                               args=(n_bit, ),
-                               name_func=self.GetTestName)
-        logging.info("[Test Case] test%iBits", n_bit)
+        self.runGeneratedTests(
+            test_func=self.RunLtpOnce,
+            settings=test_cases,
+            args=(n_bit, ),
+            name_func=self.GetTestName)
+        logging.info("[Test Case] test%sBits", n_bit)
         asserts.skip("Finished generating {} bit tests.".format(n_bit))
 
     def GetTestName(self, test_case, n_bit):
@@ -155,7 +150,7 @@
         cmd = "env {envp} {binary} {args}".format(
             envp=self.GetEnvp(),
             binary=test_case.path,
-            args=test_case.GetArgs("$LTPROOT", self._ltp_dir))
+            args=test_case.GetArgs("$LTPROOT", ltp_configs.LTPDIR))
         logging.info("Executing %s", cmd)
         self.Verify(self._shell.Execute(cmd))
 
diff --git a/testcases/kernel/ltp/KernelLtpTestHelper.py b/testcases/kernel/ltp/KernelLtpTestHelper.py
deleted file mode 100644
index 2b46f4c..0000000
--- a/testcases/kernel/ltp/KernelLtpTestHelper.py
+++ /dev/null
@@ -1,356 +0,0 @@
-#!/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 copy
-import logging
-import os
-
-from vts.runners.host import asserts
-from vts.runners.host import const
-from vts.testcases.kernel.ltp.shell_environment import ShellEnvironment
-from vts.testcases.kernel.ltp.shell_environment import CheckDefinition
-
-LTPTMP = "/data/local/tmp/ltp/temp"
-
-REQUIREMENTS_TO_TESTCASE = {"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", ]}
-
-REQUIREMENT_FOR_ALL = ["ltptmp_dir"]
-
-REQUIREMENT_TO_TESTSUITE = {}
-
-
-class RequirementState(object):
-    """Enum for test case requirement check state
-
-    Attributes:
-        UNCHECKED: test case requirement has not been checked
-        PATHEXISTS: the path of the test case has been verified exist, but
-                    all the other requirements have not been checked
-        SATISFIED: all the requirements are satisfied
-        UNSATISFIED: some of the requirements are not satisfied. Test case will
-                     not be executed
-    """
-    UNCHECKED = 0
-    PATHEXISTS = 1
-    SATISFIED = 2
-    UNSATISFIED = 3
-
-
-class TestCase(object):
-    """Stores name, path, and param information for each test case.
-
-    Attributes:
-        testsuite: string, name of testsuite to which the testcase belongs
-        testname: string, name of the test case
-        path: string, test binary path
-        _args: list of string, test case command line arguments
-        requirement_state: RequirementState, enum representing requirement
-                            check results
-        note: string, a place to store additional note for the test case
-              such as what environment requirement did not satisfy.
-    """
-
-    def __init__(self, testsuite, testname, path, args):
-        self.testsuite = testsuite
-        self.testname = testname
-        self.path = path
-        self._args = args
-        self.requirement_state = RequirementState.UNCHECKED
-        self.note = None
-
-    @property
-    def note(self):
-        """Get the note"""
-        return self._note
-
-    @note.setter
-    def note(self, note):
-        """Set the note"""
-        self._note = note
-
-    @property
-    def requirement_state(self):
-        """Get the requirement state"""
-        return self._requirement_state
-
-    @requirement_state.setter
-    def requirement_state(self, requirement_state):
-        """Set the requirement state"""
-        self._requirement_state = requirement_state
-
-    @property
-    def testsuite(self):
-        """Get the test suite's name."""
-        return self._testsuite
-
-    @testsuite.setter
-    def testsuite(self, testsuite):
-        """Set the test suite's name."""
-        self._testsuite = testsuite
-
-    @property
-    def testname(self):
-        """Get the test case's name."""
-        return self._testname
-
-    @testname.setter
-    def testname(self, testname):
-        """Set the test case's name."""
-        self._testname = testname
-
-    @property
-    def path(self):
-        """Get the test binary's file name."""
-        return self._path
-
-    @path.setter
-    def path(self, path):
-        """Set the test testbinary's name."""
-        self._path = path
-
-    def GetArgs(self, replace_string_from=None, replace_string_to=None):
-        """Get the case arguments in string format.
-
-        if replacement string is provided, arguments will be
-        filtered with the replacement string
-
-        Args:
-            replace_string_from: string, replacement string source, if any
-            replace_string_to: string, replacement string destination, if any
-
-        Returns:
-            string, arguments formated in space separated string
-        """
-        if replace_string_from is None or replace_string_to is None:
-            return ' '.join(self._args)
-        else:
-            return ' '.join([p.replace(replace_string_from, replace_string_to)
-                             for p in self._args])
-
-    def __str__(self):
-        return "%s-%s" % (self.testsuite, self.testname)
-
-
-class TestCasesParser(object):
-    """Load a ltp vts testcase definition file and parse it into a generator.
-
-    Attributes:
-        _data_path: string, the vts data path on host side
-    """
-
-    def __init__(self, data_path):
-        self._data_path = data_path
-
-    def _GetTestcaseFilePath(self):
-        """return the test case definition fiile's path."""
-        return os.path.join(self._data_path, '32', 'ltp',
-                            'ltp_vts_testcases.txt')
-
-    def Load(self, ltp_dir):
-        """read the definition file and return a TestCase generator."""
-        with open(self._GetTestcaseFilePath(), 'r') as f:
-            for line in f:
-                items = line.split('\t')
-                if not len(items) == 4:
-                    continue
-                testsuite, testname, testbinary, arg = items
-                arg = arg.strip()
-
-                if testname.startswith("DISABLED_"):
-                    continue
-
-                args = []
-                if arg:
-                    args.extend(arg.split(','))
-                yield TestCase(
-                    testsuite, testname,
-                    os.path.join(ltp_dir, 'testcases/bin', testbinary), args)
-
-
-class EnvironmentRequirementChecker(object):
-    """LTP testcase environment checker.
-
-    This class contains a dictionary for some known environment
-    requirements for a set of test cases and several environment
-    check functions to be mapped with. All check functions' results
-    are cached in a dictionary for multiple use.
-
-    Attributes:
-        _REQUIREMENT_DEFINITIONS: dictionary {string, method}, a map between requirement
-                                  name and the actual check method inside class
-        _result_cache: dictionary {requirement_check_method_name: (bool, string)}
-                       a map between check method name and cached result
-                       tuples (boolean, note)
-        _shell_env: ShellEnvironment object, which checks and sets shell environments
-                    given a shell mirror
-        shell: shell mirror object, can be used to execute shell commands on target
-               side through runner
-    """
-
-    def __init__(self, shell):
-        self.shell = shell
-        self._result_cache = {}
-
-        self._shell_env = ShellEnvironment(self.shell)
-        loop_device_support = CheckDefinition(self._shell_env.LoopDeviceSupport)
-        ltptmp_dir = CheckDefinition(self._shell_env.DirsAllExistAndPermission,
-                                     True, True, [LTPTMP, "%s/tmp" % LTPTMP],
-                                     [775, 775])
-        self._REQUIREMENT_DEFINITIONS = {
-            "loop_device_support": loop_device_support,
-            "ltptmp_dir": ltptmp_dir
-        }
-
-    @property
-    def shell(self):
-        """Get the runner's shell mirror object to execute commands"""
-        return self._shell
-
-    @shell.setter
-    def shell(self, shell):
-        """Set the runner's shell mirror object to execute commands"""
-        self._shell = shell
-
-    def Cleanup(self):
-        """Run all cleanup jobs at the end of tests"""
-        self._shell_env.Cleanup()
-
-    def GetRequirements(self, test_case):
-        """Get a list of requirements for a fiven test case
-
-        Args:
-            test_case: TestCase object, the test case to query
-        """
-        result = copy.copy(REQUIREMENT_FOR_ALL)
-
-        for rule in REQUIREMENTS_TO_TESTCASE:
-            if str(test_case) in REQUIREMENTS_TO_TESTCASE[rule]:
-                result.append(rule)
-
-        for rule in REQUIREMENT_TO_TESTSUITE:
-            if test_case.testsuite in REQUIREMENT_TO_TESTSUITE[rule]:
-                result.append(rule)
-
-        return list(set(result))
-
-    def Check(self, test_case):
-        """Check whether a given test case's requirement has been satisfied.
-        Skip the test if not.
-
-        Args:
-            test_case: TestCase object, a given test case to check
-        """
-        asserts.skipIf(
-            test_case.requirement_state == RequirementState.UNSATISFIED,
-            test_case.note)
-        asserts.skipIf(not self.IsTestBinaryExist(test_case),
-                       test_case.note)
-
-        for requirement_name in self.GetRequirements(test_case):
-            if requirement_name not in self._result_cache:
-                req_def = self._REQUIREMENT_DEFINITIONS[requirement_name]
-                self._result_cache[requirement_name] = req_def.Execute()
-            result, note = self._result_cache[requirement_name]
-            logging.info("Result for %s's requirement %s is %s", test_case,
-                         requirement_name, result)
-            if result is False:
-                test_case.requirement_state = RequirementState.UNSATISFIED
-                test_case.note = note
-                asserts.skip(note)
-        test_case.requirement_state = RequirementState.SATISFIED
-
-    def RunCheckTestcasePathExistsAll(self, test_cases):
-        """Run a batch job to check the path existance of all given test cases
-
-        Args:
-            test_case: list of TestCase objects.
-        """
-        commands = ["ls %s" % test_case.path for test_case in test_cases]
-        command_results = self._shell.Execute(commands)
-        exists_results = [exit_code is 0
-                          for exit_code in command_results[const.EXIT_CODE]]
-        for testcase_result in zip(test_cases, exists_results):
-            self.SetCheckResultPathExists(*testcase_result)
-
-    def RunChmodTestcasesAll(self, test_cases):
-        """Batch commands to make all test case binaries executable
-        Test cases whose binary path does not exist will be excluded.
-
-        Args:
-            test_case: list of TestCase objects.
-        """
-        self._shell.Execute(["chmod 775 %s" % test_case.path
-                             for test_case in test_cases
-                             if self.IsTestBinaryExist(test_case)])
-
-    def SetCheckResultPathExists(self, test_case, is_exists):
-        """Set a path exists result to a test case object
-
-        Args:
-            test_case: TestCase object, the target test case
-            is_exists: bool, the result. True for exists, False otherwise.
-        """
-        if is_exists:
-            test_case.requirement_state = RequirementState.PATHEXISTS
-        else:
-            test_case.requirement_state = RequirementState.UNSATISFIED
-            test_case.note = "Test binary is not compiled."
-
-    def IsTestBinaryExist(self, test_case):
-        """Check whether the given test case's binary exists.
-
-        Args:
-            test_case: TestCase, the object representing the test case
-        Return:
-            True if exists, False otherwise
-        """
-        if test_case.requirement_state != RequirementState.UNCHECKED:
-            return test_case.requirement_state != RequirementState.UNSATISFIED
-
-        command_results = self._shell.Execute("ls %s" % test_case.path)
-        exists = command_results[const.STDOUT][0].find(
-            ": No such file or directory") > 0
-        self.SetCheckResultPathExists(test_case, exists)
-        return exists
diff --git a/testcases/kernel/ltp/environment_requirement_checker.py b/testcases/kernel/ltp/environment_requirement_checker.py
new file mode 100644
index 0000000..fd270aa
--- /dev/null
+++ b/testcases/kernel/ltp/environment_requirement_checker.py
@@ -0,0 +1,168 @@
+#!/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 copy
+import logging
+
+from vts.runners.host import asserts
+from vts.runners.host import const
+from vts.testcases.kernel.ltp.shell_environment import shell_environment
+from vts.testcases.kernel.ltp import ltp_enums
+from vts.testcases.kernel.ltp import ltp_configs
+from vts.testcases.kernel.ltp import requirements
+
+
+class EnvironmentRequirementChecker(object):
+    """LTP testcase environment checker.
+
+    This class contains a dictionary for some known environment
+    requirements for a set of test cases and several environment
+    check functions to be mapped with. All check functions' results
+    are cached in a dictionary for multiple use.
+
+    Attributes:
+        _REQUIREMENT_DEFINITIONS: dictionary {string, obj}, a map between
+            requirement name and the actual definition class object
+        _result_cache: dictionary {requirement_check_method_name:
+            (bool, string)}, a map between check method name and cached result
+            tuples (boolean, note)
+        _shell_env: ShellEnvironment object, which checks and sets
+            shell environments given a shell mirror
+        shell: shell mirror object, can be used to execute shell
+            commands on target side through runner
+    """
+
+    def __init__(self, shell):
+        self.shell = shell
+        self._result_cache = {}
+        self._shell_env = shell_environment.ShellEnvironment(self.shell)
+        self._REQUIREMENT_DEFINITIONS = requirements.GetRequrementDefinitions()
+
+    @property
+    def shell(self):
+        """Get the runner's shell mirror object to execute commands"""
+        return self._shell
+
+    @shell.setter
+    def shell(self, shell):
+        """Set the runner's shell mirror object to execute commands"""
+        self._shell = shell
+
+    def Cleanup(self):
+        """Run all cleanup jobs at the end of tests"""
+        self._shell_env.Cleanup()
+
+    def GetRequirements(self, test_case):
+        """Get a list of requirements for a fiven test case
+
+        Args:
+            test_case: TestCase object, the test case to query
+        """
+        result = copy.copy(ltp_configs.REQUIREMENT_FOR_ALL)
+
+        for rule in ltp_configs.REQUIREMENTS_TO_TESTCASE:
+            if str(test_case) in ltp_configs.REQUIREMENTS_TO_TESTCASE[rule]:
+                result.append(rule)
+
+        for rule in ltp_configs.REQUIREMENT_TO_TESTSUITE:
+            if test_case.testsuite in ltp_configs.REQUIREMENT_TO_TESTSUITE[
+                    rule]:
+                result.append(rule)
+
+        return list(set(result))
+
+    def Check(self, test_case):
+        """Check whether a given test case's requirement has been satisfied.
+        Skip the test if not.
+
+        Args:
+            test_case: TestCase object, a given test case to check
+        """
+        asserts.skipIf(test_case.requirement_state ==
+                       ltp_enums.RequirementState.UNSATISFIED, test_case.note)
+        asserts.skipIf(not self.IsTestBinaryExist(test_case), test_case.note)
+
+        for requirement in self.GetRequirements(test_case):
+            if requirement not in self._result_cache:
+                definitions = self._REQUIREMENT_DEFINITIONS[requirement]
+                self._result_cache[
+                    requirement] = self._shell_env.ExecuteDefinitions(
+                        definitions)
+
+            result, note = self._result_cache[requirement]
+            logging.info("Result for %s's requirement %s is %s", test_case,
+                         requirement, result)
+            if result is False:
+                test_case.requirement_state = ltp_enums.RequirementState.UNSATISFIED
+                test_case.note = note
+                asserts.skip(note)
+        test_case.requirement_state = ltp_enums.RequirementState.SATISFIED
+
+    def RunCheckTestcasePathExistsAll(self, test_cases):
+        """Run a batch job to check the path existance of all given test cases
+
+        Args:
+            test_case: list of TestCase objects.
+        """
+        commands = ["ls %s" % test_case.path for test_case in test_cases]
+        command_results = self._shell.Execute(commands)
+        exists_results = [exit_code is 0
+                          for exit_code in command_results[const.EXIT_CODE]]
+        for testcase_result in zip(test_cases, exists_results):
+            self.SetCheckResultPathExists(*testcase_result)
+
+    def RunChmodTestcasesAll(self, test_cases):
+        """Batch commands to make all test case binaries executable
+        Test cases whose binary path does not exist will be excluded.
+
+        Args:
+            test_case: list of TestCase objects.
+        """
+        self._shell.Execute(["chmod 775 %s" % test_case.path
+                             for test_case in test_cases
+                             if self.IsTestBinaryExist(test_case)])
+
+    def SetCheckResultPathExists(self, test_case, is_exists):
+        """Set a path exists result to a test case object
+
+        Args:
+            test_case: TestCase object, the target test case
+            is_exists: bool, the result. True for exists, False otherwise.
+        """
+        if is_exists:
+            test_case.requirement_state = ltp_enums.RequirementState.PATHEXISTS
+        else:
+            test_case.requirement_state = ltp_enums.RequirementState.UNSATISFIED
+            test_case.note = "Test binary is not compiled."
+
+    def IsTestBinaryExist(self, test_case):
+        """Check whether the given test case's binary exists.
+
+        Args:
+            test_case: TestCase, the object representing the test case
+
+        Return:
+            True if exists, False otherwise
+        """
+        if test_case.requirement_state != ltp_enums.RequirementState.UNCHECKED:
+            return test_case.requirement_state != ltp_enums.RequirementState.UNSATISFIED
+
+        command_results = self._shell.Execute("ls %s" % test_case.path)
+        exists = command_results[const.STDOUT][0].find(
+            ": No such file or directory") > 0
+        self.SetCheckResultPathExists(test_case, exists)
+        return exists
diff --git a/testcases/kernel/ltp/ltp_configs.py b/testcases/kernel/ltp/ltp_configs.py
new file mode 100644
index 0000000..1eff6dc
--- /dev/null
+++ b/testcases/kernel/ltp/ltp_configs.py
@@ -0,0 +1,474 @@
+#!/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 os
+
+from vts.testcases.kernel.ltp import ltp_enums
+
+# Environment paths for ltp test cases
+# string, ltp build root directory on target
+LTPDIR = "/data/local/tmp/ltp"
+# Directory for environment variable 'TMP' needed by some test cases
+TMP = os.path.join(LTPDIR, "tmp")
+# Directory for environment variable 'TMPBASE' needed by some test cases
+TMPBASE = os.path.join(TMP, "tmpbase")
+# Directory for environment variable 'LTPTMP' needed by some test cases
+LTPTMP = os.path.join(TMP, "ltptemp")
+# Directory for environment variable 'TMPDIR' needed by some test cases
+TMPDIR = os.path.join(TMP, "tmpdir")
+# Add LTP's binary path to PATH
+PATH = "/system/bin:%s" % os.path.join(LTPDIR, "testcases/bin")
+
+# File system type for loop device
+LTP_DEV_FS_TYPE = "ext4"
+
+# 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",
+    ],
+}
+
+# Requirement for all test cases
+REQUIREMENT_FOR_ALL = [ltp_enums.Requirements.LTP_TMP_DIR]
+
+# Requirement to test suite dictionary
+REQUIREMENT_TO_TESTSUITE = {}
+
+# Staging tests are temporally disabled in stable version and are being addressed.
+STAGING_TESTS = [
+    # Bug#30675453
+    "syscalls-perf_event_open02_32bit",
+    # Bug#30688551
+    "syscalls-lstat03_64_32bit",
+    "syscalls-lstat03_32bit"
+    # Bug#30688061
+    "input-input03_32bit",
+    # Bug#30688056
+    "cpuhotplug-cpuhotplug04_32bit",
+    # Bug#30699880
+    "mm-mtest01w_32bit",
+    "mm-mtest01_32bit",
+    # Bug#30688574
+    "syscalls-accept4_01_32bit",
+    # Bug#30689411
+    "mm-mmapstress03_32bit"
+]
+
+# Tests disabled
+# Based on external/ltp commit 5f01077afe994f4107b147222f3956716d4a8fde
+DISABLED_TESTS = [
+    "inotify06",
+    "kmsg01",
+    "abort01",
+    "access01",
+    "add_key01",
+    "add_key02",
+    "chdir03",
+    "chmod05",
+    "chmod07",
+    "chown01_16",
+    "chown02_16",
+    "chown03_16",
+    "chown05_16",
+    "chroot01",
+    "creat01",
+    "creat03",
+    "creat04",
+    "creat05",
+    "creat07",
+    "epoll_create1_01",
+    "epoll_ctl01",
+    "epoll_ctl02",
+    "posix_fadvise01",
+    "posix_fadvise01_64",
+    "posix_fadvise03",
+    "posix_fadvise03_64",
+    "fchmod01",
+    "fchmod02",
+    "fchmod05",
+    "fchmod06",
+    "fchown01_16",
+    "fchown02_16",
+    "fchown03_16",
+    "fchown04_16",
+    "fchown05_16",
+    "fcntl07",
+    "fcntl07_64",
+    "fsync01",
+    "ftruncate04",
+    "ftruncate04_64",
+    "getcwd02",
+    "getcwd03",
+    "getegid01_16",
+    "getegid02_16",
+    "geteuid01_16",
+    "geteuid02_16",
+    "getgid01_16",
+    "getgid03_16",
+    "getgroups01_16",
+    "gethostbyname_r01",
+    "getuid01_16",
+    "getuid03_16",
+    "ioctl03",
+    "inotify03",
+    "kill11",
+    "lchown01_16",
+    "lchown02_16",
+    "lchown03_16",
+    "link08",
+    "linkat02",
+    "mkdir02",
+    "mkdir03",
+    "mkdir04",
+    "mkdirat02",
+    "mknod07",
+    "mknodat02",
+    "mmap16",
+    "mount01",
+    "mount02",
+    "mount03",
+    "mount04",
+    "mount06",
+    "move_pages03",
+    "move_pages11",
+    "mprotect01",
+    "nftw01",
+    "nftw6401",
+    "nice04",
+    "open01",
+    "open08",
+    "open10",
+    "open11",
+    "madvise01",
+    "madvise02",
+    "madvise05",
+    "madvise06",
+    "pathconf01",
+    "pause01",
+    "pipe01",
+    "pipe02",
+    "pipe03",
+    "ppoll01",
+    "preadv01",
+    "preadv01_64",
+    "preadv02",
+    "preadv02_64",
+    "process_vm_readv01",
+    "process_vm_writev01",
+    "pwritev01",
+    "pwritev01_64",
+    "pwritev02",
+    "pwritev02_64",
+    "quotactl01",
+    "readlink04",
+    "recvmsg02",
+    "rename09",
+    "rename11",
+    "renameat01",
+    "request_key01",
+    "request_key02",
+    "rmdir02",
+    "rt_sigprocmask01",
+    "sbrk03",
+    "setfsgid01_16",
+    "setfsgid02_16",
+    "setfsgid03_16",
+    "setfsuid01_16",
+    "setfsuid02_16",
+    "setfsuid03_16",
+    "setfsuid04_16",
+    "setgid01_16",
+    "setgid02_16",
+    "setgid03_16",
+    "setgroups01_16",
+    "setgroups02_16",
+    "setgroups03_16",
+    "setgroups04_16",
+    "setregid01_16",
+    "setregid02_16",
+    "setregid03_16",
+    "setregid04_16",
+    "setresgid01_16",
+    "setresgid02_16",
+    "setresgid03_16",
+    "setresgid04_16",
+    "setresuid01_16",
+    "setresuid02_16",
+    "setresuid03_16",
+    "setresuid04_16",
+    "setresuid05_16",
+    "setreuid01_16",
+    "setreuid02_16",
+    "setreuid03_16",
+    "setreuid04_16",
+    "setreuid05_16",
+    "setreuid06_16",
+    "setreuid07_16",
+    "setuid01_16",
+    "setuid02_16",
+    "setuid03_16",
+    "setuid04_16",
+    "splice02",
+    "syscall01",
+    "sysconf01",
+    "syslog01",
+    "syslog02",
+    "syslog03",
+    "syslog04",
+    "syslog05",
+    "syslog06",
+    "syslog07",
+    "syslog08",
+    "syslog09",
+    "syslog10",
+    "umask02",
+    "umask03",
+    "umount01",
+    "umount02",
+    "umount03",
+    "umount2_01",
+    "umount2_02",
+    "umount2_03",
+    "utime03",
+    "utime06",
+    "utimes01",
+    "utimensat01",
+    "waitpid05",
+    "gf01",
+    "gf02",
+    "gf03",
+    "gf04",
+    "gf05",
+    "gf06",
+    "gf07",
+    "gf08",
+    "gf09",
+    "gf10",
+    "gf11",
+    "gf14",
+    "gf15",
+    "gf16",
+    "gf17",
+    "gf18",
+    "gf19",
+    "gf20",
+    "gf21",
+    "gf22",
+    "gf23",
+    "gf24",
+    "gf25",
+    "gf26",
+    "gf27",
+    "gf28",
+    "gf29",
+    "gf30",
+    "rwtest01",
+    "rwtest02",
+    "rwtest03",
+    "rwtest04",
+    "rwtest05",
+    "iogen01",
+    "fs_inod01",
+    "ftest06",
+    "isofs",
+    "fsx_linux",
+    "ddio04",
+    "ddio10",
+    "aio01",
+    "aio02",
+    "mtest06",
+    "shm_test01",
+    "mallocstress01",
+    "mmapstress04",
+    "mmapstress07",
+    "vma03",
+    "min_free_kbytes",
+    "pipeio_1",
+    "pipeio_3",
+    "pipeio_4",
+    "pipeio_5",
+    "pipeio_6",
+    "pipeio_8",
+    "trace_sched01",
+    "float_bessel",
+    "float_exp_log",
+    "float_iperb",
+    "float_power",
+    "float_trigo",
+    "pty01",
+    "mqns_01_clone",
+    "mqns_02_clone",
+    "mqns_03_clone",
+    "mqns_04_clone",
+    "netns_netlink",
+    "netns_breakns_ns_exec_ipv4_netlink",
+    "netns_breakns_ns_exec_ipv6_netlink",
+    "netns_breakns_ns_exec_ipv4_ioctl",
+    "netns_breakns_ns_exec_ipv6_ioctl",
+    "netns_breakns_ip_ipv4_netlink",
+    "netns_breakns_ip_ipv6_netlink",
+    "netns_breakns_ip_ipv4_ioctl",
+    "netns_breakns_ip_ipv6_ioctl",
+    "netns_comm_ns_exec_ipv4_netlink",
+    "netns_comm_ns_exec_ipv6_netlink",
+    "netns_comm_ns_exec_ipv4_ioctl",
+    "netns_comm_ns_exec_ipv6_ioctl",
+    "netns_comm_ip_ipv4_netlink",
+    "netns_comm_ip_ipv6_netlink",
+    "netns_comm_ip_ipv4_ioctl",
+    "netns_comm_ip_ipv6_ioctl",
+    "netns_sysfs",
+    "shmnstest_none",
+    "shmnstest_clone",
+    "shmnstest_unshare",
+    "shmem_2nstest_none",
+    "shmem_2nstest_clone",
+    "shmem_2nstest_unshare",
+    "mesgq_nstest_none",
+    "mesgq_nstest_clone",
+    "mesgq_nstest_unshare",
+    "sem_nstest_none",
+    "sem_nstest_clone",
+    "sem_nstest_unshare",
+    "semtest_2ns_none",
+    "semtest_2ns_clone",
+    "semtest_2ns_unshare",
+    "BindMounts",
+    "Filecaps",
+    "Cap_bounds",
+    "FCNTL_LOCKTESTS",
+    "Connectors",
+    "su01",
+    "cron02",
+    "cron_deny01",
+    "cron_allow01",
+    "cron_dirs_checks01",
+    "Numa_testcases",
+    "move_pages03",
+    "move_pages11",
+    "hugemmap05_1",
+    "hugemmap05_2",
+    "hugemmap05_3",
+    "ar",
+    "ld",
+    "ldd",
+    "nm",
+    "objdump",
+    "file",
+    "tar",
+    "cron",
+    "logrotate",
+    "mail",
+    "cpio",
+    "unzip01",
+    "cp_tests01",
+    "ln_tests01",
+    "mkdir_tests01",
+    "mv_tests01",
+    "size01",
+    "sssd01",
+    "sssd02",
+    "sssd03",
+    "du01",
+    "mkfs01",
+    "which01",
+    "lsmod01",
+    "wc01",
+    "smt_smp_enabled",
+    "smt_smp_affinity",
+    "zram03",
+    "ext4_uninit_groups",
+    "ext4_persist_prealloc",
+    "pipeio_1",
+    "pipeio_4",
+    "pipeio_5",
+    "pipeio_6",
+    "pipeio_8",
+    "cpuhotplug02",
+    "cpuhotplug03",
+    "cpuhotplug06",
+    "input06",
+    "dio10",
+    "fsx_linux",
+    "dio04",
+    "Numa_testcases",
+    "ext4_uninit_groups",
+    "ext4_persist_prealloc",
+    "connect01",
+    "prot_hsymlinks",
+    "fs-ftest01_32bit",
+    "fs-ftest03_32bit",
+    "fs-ftest04_32bit",
+    "fs-ftest05_32bit",
+    "fs-ftest07_32bit",
+    "fs-ftest08_32bit",
+    "fs-inode02_32bit",
+    "ipc-signal_test_01_32bit",
+    "mm-data_space_32bit",
+    "mm-mmapstress01_32bit",
+    "mm-mmapstress03_32bit",
+    "mm-mmapstress09_32bit",
+    "mm-mmapstress10_32bit",
+    "syscalls-clock_nanosleep01_32bit",
+    "syscalls-clone04_32bit",
+    "syscalls-creat08_32bit",
+    "syscalls-fcntl14_32bit",
+    "syscalls-fcntl14_32bit",
+    "syscalls-fcntl14_64_32bit",
+    "syscalls-fcntl17_32bit",
+    "syscalls-fcntl17_64_32bit",
+    "syscalls-getdomainname01_32bit",
+    "syscalls-kill12_32bit",
+    "syscalls-setdomainname01_32bit",
+    "syscalls-setdomainname02_32bit",
+    "syscalls-setdomainname03_32bit",
+    "syscalls-sighold02_32bit",
+    "syscalls-sigpending02_32bit",
+    "syscalls-sigrelse01_32bit",
+    "syscalls-vfork02_32bit",
+    "syscalls-getrusage03_32bit",
+    "syscalls-getrusage04_32bit",
+]
diff --git a/testcases/kernel/ltp/ltp_enums.py b/testcases/kernel/ltp/ltp_enums.py
new file mode 100644
index 0000000..f9a9792
--- /dev/null
+++ b/testcases/kernel/ltp/ltp_enums.py
@@ -0,0 +1,74 @@
+#!/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.
+#
+
+
+class RequirementState(object):
+    """Enum for test case requirement check state.
+
+    Attributes:
+        UNCHECKED: test case requirement has not been checked
+        PATHEXISTS: the path of the test case has been verified exist, but
+                    all the other requirements have not been checked
+        SATISFIED: all the requirements are satisfied
+        UNSATISFIED: some of the requirements are not satisfied. Test case will
+                     not be executed
+    """
+    UNCHECKED = 0
+    PATHEXISTS = 1
+    SATISFIED = 2
+    UNSATISFIED = 3
+
+
+class ConfigKeys(object):
+    RUN_STAGING = "run_staging"
+
+
+class ShellEnvKeys(object):
+    """Shell env keys to run LTP (Linux Test Project) testcases.
+
+    Contains constant strings starting with prefix "_KEY_ENV_" are used as dict
+        key in environment variable dictionary
+    """
+    TMP = 'TMP'
+    TMPBASE = 'TMPBASE'
+    LTPTMP = 'LTPTMP'
+    TMPDIR = 'TMPDIR'
+    LTP_DEV_FS_TYPE = 'LTP_DEV_FS_TYPE'
+    LTPROOT = 'LTPROOT'
+    PATH = 'PATH'
+
+
+class TestExitCode(object):
+    """Exit return codes of LTP test case binary
+
+    Attributes:
+        TPASS: int, exit_code for Test pass
+        TCONF: int, the test case is not for current configuration of kernel
+        TBROK: int, test assumption failed, such as missing system binary and
+               and permission issue not explicitly checked by the test case.
+        SEGFAULT: int, test case results in segmentation fault
+    """
+    TPASS = 0
+    TCONF = 32
+    TBROK = 2
+    SEGFAULT = 139
+
+
+class Requirements(object):
+    """Enum for all ltp requirements"""
+    LOOP_DEVICE_SUPPORT = 1
+    LTP_TMP_DIR = 2
diff --git a/testcases/kernel/ltp/requirements.py b/testcases/kernel/ltp/requirements.py
new file mode 100644
index 0000000..14090f2
--- /dev/null
+++ b/testcases/kernel/ltp/requirements.py
@@ -0,0 +1,45 @@
+#!/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.
+#
+
+from vts.testcases.kernel.ltp import ltp_enums
+from vts.testcases.kernel.ltp import ltp_configs
+from vts.testcases.kernel.ltp.shell_environment.definitions import directory_exists
+from vts.testcases.kernel.ltp.shell_environment.definitions import loop_device_support
+from vts.testcases.kernel.ltp.shell_environment.definitions import path_permission
+
+
+def GetRequrementDefinitions():
+    """Get a dictionary in which keys are requirement names and
+       values are corresponding definition class object or a list
+       of such objects.
+    """
+    return {
+        ltp_enums.Requirements.LOOP_DEVICE_SUPPORT:
+        loop_device_support.LoopDeviceSupport(),
+        ltp_enums.Requirements.LTP_TMP_DIR: [
+            directory_exists.DirectoryExists(
+                paths=[ltp_configs.TMP, ltp_configs.TMPBASE,
+                       ltp_configs.LTPTMP, ltp_configs.TMPDIR],
+                to_setup=True,
+                to_cleanup=True), path_permission.PathPermission(
+                    paths=[ltp_configs.TMP, ltp_configs.TMPBASE,
+                           ltp_configs.LTPTMP, ltp_configs.TMPDIR],
+                    permissions=775,
+                    to_setup=True,
+                    to_cleanup=False)
+        ]
+    }
diff --git a/testcases/kernel/ltp/shell_environment.py b/testcases/kernel/ltp/shell_environment.py
deleted file mode 100644
index b2192be..0000000
--- a/testcases/kernel/ltp/shell_environment.py
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/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
-
-from vts.runners.host import const
-
-
-class CheckDefinition(object):
-    """Environment check definition class
-
-    Used to specify what function to call, whether to setup environment after
-    check failure, and put additional arguments.
-
-    Attributes:
-        _function: method, the function to call
-        to_setup: bool, whether or not to setup the environment if check returns
-                  False (given the method will deal with setup case). The default
-                  value is False
-        to_cleanup: whether to clean up after setup. The default value is True
-        args: any additional arguments to pass to the method
-    """
-    def __init__(self, function, to_setup=False, to_cleanup=True, *args):
-        self._function = function
-        self.to_setup = to_setup
-        self.to_cleanup = to_cleanup
-        self.args = args
-
-    def Execute(self):
-        """Execute the specified function"""
-        return self._function(self)
-
-    def __str__(self):
-        return ("Shell Environment Check Definition: function=%s, to_setup=%s"
-                " args=%s") % (self._function, self.to_setup, self.args)
-
-class ShellEnvironment(object):
-    """Wrapper class for all the environment setup classes.
-
-    Provides a bridge between the caller and individual setup classes.
-
-    Attributes:
-        _shell: shell mirror object, shell to execute commands
-        _cleanup_jobs: set of CheckSetupCleanup objects, a set used to store clean
-                       up jobs if requested.
-    """
-    def __init__(self, shell):
-        self._shell = shell
-        # TODO use a queue?
-        self._cleanup_jobs = set()
-
-    def Cleanup(self):
-        """Final cleanup jobs. Will run all the stored cleanup jobs"""
-        # TODO check error
-        for obj in self._cleanup_jobs:
-            obj.Cleanup()
-
-    def AddCleanupJob(self, obj):
-        """Add a clean up job for final cleanup"""
-        self._cleanup_jobs.add(obj)
-
-    def ExecuteCommand(self, command):
-        """Execute a shell command or a list of shell commands.
-
-        Args:
-            command: str, the command to execute; Or
-                     list of str, a list of commands to execute
-
-        return:
-            True if all commands return exit codes 0; False otherwise
-        """
-        command_result = self._shell.Execute(command)
-        return all([i is 0 for i in command_result[const.EXIT_CODE]])
-
-    def LoopDeviceSupport(self, definition):
-        """Environment definition function.
-        Will create a corresponding setup class and execute
-
-        Args:
-            definition: CheckDefinition obj, a definition class which stores
-                        related arguments for the setup class to execute
-
-        Return:
-            tuple(bool, string), a tuple of True and empty string if success,
-                                 a tuple of False and error message if fail.
-        """
-        return LoopDeviceSupportClass(definition, self).Execute()
-
-    def DirExists(self, definition):
-        """Environment definition function.
-        Will create a corresponding setup class and execute
-
-        Args:
-            definition: CheckDefinition obj, a definition class which stores
-                        related arguments for the setup class to execute
-
-        Return:
-            tuple(bool, string), a tuple of True and empty string if success,
-                                 a tuple of False and error message if fail.
-        """
-        return DirExistsClass(definition, self).Execute()
-
-    def DirsAllExistAndPermission(self, definition):
-        """Environment definition function.
-        Will create a corresponding setup class and execute
-
-        Args:
-            definition: CheckDefinition obj, a definition class which stores
-                        related arguments for the setup class to execute
-
-        Return:
-            tuple(bool, string), a tuple of True and empty string if success,
-                                 a tuple of False and error message if fail.
-        """
-        return DirsAllExistAndPermissionClass(definition, self).Execute()
-
-
-class CheckSetupCleanup(object):
-    """An abstract class for defining environment setup job.
-
-    Usually such a job contains check -> setup -> cleanup workflow
-
-    Attributes:
-        _NOTE: string, a message used in GetNote() to display when environment
-               check or setup failed.
-        context: ShellEnvironment object, the context that can be used to add
-                 cleanup jobs and execute shell commands
-        definition: CheckDefinition object, the definition of a test case
-                    requirement
-    """
-    _NOTE = ""
-
-    def __init__(self, definition, context):
-        self.definition = definition
-        self.context = context
-
-    def Execute(self):
-        """Execute the check, setup, and cleanup.
-        Will execute setup and cleanup only if the boolean switches for them
-        are True. It will NOT execute cleanup if check function passes.
-
-        Return:
-            tuple(bool, string), a tuple of True and empty string if success,
-                                 a tuple of False and error message if fail.
-        """
-        valid_input, message = self.ValidateInput()
-        if not valid_input:
-            return (valid_input, "Environment check error: %s" % message)
-
-        check_result = self.Check()
-        if check_result or not self.definition.to_setup:
-            return (check_result, self.GetNote())
-
-        if self.definition.to_cleanup:
-            self.context.AddCleanupJob(self)
-
-        return (self.Setup(), self.GetNote())
-
-    def GetNote(self):
-        """Get a string note as error message. Can be override by sub-class"""
-        return "{}\n{}".format(self.NOTE, self.definition)
-
-    def ValidateInput(self):
-        """Validate input parameters. Can be override by sub-class
-
-        Return:
-            tuple(bool, string), a tuple of True and empty string if pass,
-                                 a tuple of False and error message if fail.
-        """
-        return (True, "")
-
-    def Check(self):
-        """Check function for the class.
-        Used to check environment. Can be override by sub-class"""
-        return False
-
-    def Setup(self):
-        """Check function for the class.
-        Used to setup environment if check fail. Can be override by sub-class"""
-        return False
-
-    def Cleanup(self):
-        """Check function for the class.
-        Used to cleanup setup if check fail. Can be override by sub-class"""
-        return False
-
-    def ExecuteCommand(self, cmd):
-        return self.context.ExecuteCommand(cmd)
-
-
-class LoopDeviceSupportClass(CheckSetupCleanup):
-    """Class for checking loopback device support."""
-    NOTE = "Kernel does not have loop device support"
-
-    def Check(self):
-        return self.ExecuteCommand("losetup -f")
-
-class DirExistsClass(CheckSetupCleanup):
-    """Class for check, setup, and cleanup a existence of a directory."""
-    NOTE = "Directory does not exist"
-
-    def ValidateInput(self):
-        return (len(self.definition.args) is 1,
-                "unexpected arguments in definition: %s" % self.definition)
-
-    def Check(self):
-        logging.info("Checking existence of directory %s" % definition.args[0])
-        return self.ExecuteCommand("ls %s" % self.definition.args[0])
-
-    def Setup(self):
-        return self.ExecuteCommand("mkdir -p %s" % self.definition.args[0])
-
-    def Cleanup(self):
-        return self.ExecuteCommand("rm -rf %s" % self.definition.args[0])
-
-
-class DirsAllExistAndPermissionClass(CheckSetupCleanup):
-    """Class for check, setup, and cleanup a existence of a list of directories
-    and set permissions."""
-    NOTE = "Directories do not all exist or have the specified permission"
-
-    def ValidateInput(self):
-        return (len(self.definition.args) is 2 and \
-                    len(self.definition.args[0]) == len(self.definition.args[1]),
-                "unexpected arguments in definition: %s" % self.definition)
-
-    def Check(self):
-        dirs = self.definition.args[0]
-        permissions = self.definition.args[1]
-
-        commands = []
-        # TODO(yuexi): "dir" is a reserved word in Python, we should not use
-        # it as a var name.
-        commands.extend(["ls %s" % dir for dir in dirs])
-        commands.extend(["stat -c {}a {}".format('%', *pair)
-                         for pair in zip(permissions, dirs)])
-
-        return self.ExecuteCommand(commands)
-
-    def Setup(self):
-        dirs = self.definition.args[0]
-        permissions = self.definition.args[1]
-
-        commands = []
-        commands.extend(["mkdir -p %s" % dir for dir in dirs])
-        commands.extend(["chmod {} {}".format(*pair)
-                         for pair in zip(permissions, dirs)])
-
-        return self.ExecuteCommand(commands)
-
-    def Cleanup(self):
-        commands = ["rm -rf %s" % dir for dir in self.definition.args[0]]
-        return self.ExecuteCommand(commands)
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/kernel/ltp/shell_environment/__init__.py
similarity index 100%
rename from testcases/kernel/ltp_adb/__init__.py
rename to testcases/kernel/ltp/shell_environment/__init__.py
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/kernel/ltp/shell_environment/definitions/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/kernel/ltp/shell_environment/definitions/__init__.py
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/kernel/ltp/shell_environment/definitions/base_definitions/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/kernel/ltp/shell_environment/definitions/base_definitions/__init__.py
diff --git a/testcases/kernel/ltp/shell_environment/definitions/base_definitions/check_setup_cleanup.py b/testcases/kernel/ltp/shell_environment/definitions/base_definitions/check_setup_cleanup.py
new file mode 100644
index 0000000..4c09196
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/definitions/base_definitions/check_setup_cleanup.py
@@ -0,0 +1,224 @@
+#!/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 itertools
+
+from vts.runners.host import const
+
+
+class CheckSetupCleanup(object):
+    """An abstract class for defining environment setup job.
+
+    Usually such a job contains check -> setup -> cleanup workflow
+
+    Attributes:
+        to_check: bool, whether or not to check the defined environment
+                  requirement. Default: True
+        to_setup: bool, whether or not to setup the defined environment
+                  requirement. Default: False
+        to_cleanup: bool, whether or not to cleanup the defined environment
+                    requirement if it is set up by this class. Default: False
+        context: ShellEnvironment object that provides AddCleanupJobs and
+                 ExecuteShellCommand method
+        note: string, used by GetNote to generate error message if fail.
+    """
+
+    def __init__(self):
+        self.to_check = True
+        self.to_setup = False
+        self.to_cleanup = False
+        self.context = None
+        self.note = None
+
+    @property
+    def note(self):
+        return self._note
+
+    @note.setter
+    def note(self, note):
+        self._note = note
+
+    @property
+    def context(self):
+        return self._context
+
+    @context.setter
+    def context(self, context):
+        self._context = context
+
+    def Execute(self):
+        """Execute the check, setup, and cleanup.
+           Will execute setup and cleanup only if the boolean switches for them
+           are True. It will NOT execute cleanup if check function passes.
+
+           Return:
+               tuple(bool, string), a tuple of True and empty string if success,
+                                    a tuple of False and error message if fail.
+        """
+
+        if self.context is None:
+            self.note = "Error: Environment definition context not set"
+            return False
+
+        if not self.InternalCall(self.ValidateInput):
+            return False
+
+        check_result = False
+        if self.to_check:
+            check_result = self.InternalCall(self.Check)
+
+        if check_result or not self.to_setup:
+            return check_result
+
+        if self.to_cleanup:
+            self.context.AddCleanupJob(self.InternalCall, self.Cleanup)
+
+        return self.InternalCall(self.Setup)
+
+    def __str__(self):
+        return ("Shell Environment Check Definition Class:{cls} "
+                "Variables:{props}").format(
+                    msg=message, cls=self.__class__.__name__, props=vars(self))
+
+    def GetNote(self):
+        """Get a string note as error message. Can be override by sub-class"""
+        if not self.note:
+            self.note = "Shell environment definition unsatisfied"
+        return "{}\nat: {}".format(self.note, self)
+
+    def InternalCall(self, method):
+        """Base definition's internal method to call sub class inherited
+           methods, check results and put note if not set
+        """
+        self.note = None
+        success = method()
+        if not success and not self.note:
+            self.note = ("Shell environment definition unsatisfied: step [%s] "
+                         "failed.") % method.__name__
+        return success
+
+    def ValidateInput(self):
+        """Validate input parameters. Can be override by sub-class
+
+        Return:
+            tuple(bool, string), a tuple of True and empty string if pass,
+                                 a tuple of False and error message if fail.
+        """
+        return True
+
+    def ToListLike(self, obj):
+        """Convert single item to list of single item. If input is already
+           a list like object, the same object will be returned.
+           This method is for the convenience of writing child class.
+
+        Arguments:
+            obj: any object
+        """
+        if not self.IsListLike(obj):
+            return [obj]
+        else:
+            return obj
+
+    def IsListLike(self, obj):
+        """Checks whether a object is list-like.
+
+           This method is for the convenience of writing child class.
+           This method will check for existence of __iter__ and __getitem__
+           in attributes of the object.
+           String is not considered list-like, tuple is.
+
+        Arguments:
+            obj: any object
+        """
+        return hasattr(obj, '__iter__') and hasattr(obj, '__getitem__')
+
+    def NormalizeInputLists(self, *inputs):
+        """Normalize inputs to lists of same length.
+
+           This method is for the convenience of writing child class.
+           If there are lists in inputs, they should all be of same length;
+           otherwise, None is returned.
+           If there are lists and single items in inputs, single items are
+           duplicated to a list of other list's length.
+           If there are only single items in inputs, they all get converted to
+           single item lists.
+
+        Arguments:
+            inputs: any inputs
+
+        Return:
+            a generator of normalized inputs
+        """
+        # If any of inputs is None or empty, inputs are considered not valid
+        # Definition classes wish to take None input should not use this method
+        if not all(inputs):
+            return None
+
+        lists = filter(self.IsListLike, inputs)
+        if not lists:
+            # All inputs are single items. Convert them to lists
+            return ([i] for i in inputs)
+
+        lengths = set(map(len, lists))
+        if len(lengths) != 1:
+            # lists in inputs have different lengths, cannot normalize
+            return None
+        length = lengths.pop()
+
+        return (i if self.IsListLike(i) else list(itertools.repeat(i, length))
+                for i in inputs)
+
+    def Check(self):
+        """Check function for the class.
+           Used to check environment. Can be override by sub-class
+        """
+        self.note = "Check step undefined."
+        return False
+
+    def Setup(self):
+        """Check function for the class.
+           Used to setup environment if check fail. Can be override by sub-class
+        """
+        self.note = "Setup step undefined."
+        return False
+
+    def Cleanup(self):
+        """Check function for the class.
+           Used to cleanup setup if check fail. Can be override by sub-class
+        """
+        self.note = "Cleanup step undefined."
+        return False
+
+    @property
+    def shell(self):
+        """returns an object that can execute a shell command"""
+        return self.context.shell
+
+    def ExecuteShellCommand(self, cmd):
+        """Execute a shell command or a list of shell commands.
+
+        Args:
+            command: str, the command to execute; Or
+                     list of str, a list of commands to execute
+
+        return:
+            A dictionary containing results in format:
+                {const.STDOUT: [stdouts],
+                 const.STDERR: [stderrs],
+                 const.EXIT_CODE: [exit_codes]}.
+        """
+        return self.shell.Execute(cmd)
diff --git a/testcases/kernel/ltp/shell_environment/definitions/directory_exists.py b/testcases/kernel/ltp/shell_environment/definitions/directory_exists.py
new file mode 100644
index 0000000..682d623
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/definitions/directory_exists.py
@@ -0,0 +1,81 @@
+#!/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.
+#
+
+from vts.runners.host import const
+from vts.testcases.kernel.ltp.shell_environment.definitions.base_definitions import check_setup_cleanup
+
+
+class DirectoryExists(check_setup_cleanup.CheckSetupCleanup):
+    """Class for check existence of directories, make directories if not,
+       and delete afterwards.
+
+    Attributes:
+        to_check: bool, whether or not to check the defined environment
+                  requirement. Default: True
+        to_setup: bool, whether or not to setup the defined environment
+                  requirement. Default: False
+        to_cleanup: bool, whether or not to cleanup the defined environment
+                    requirement if it is set up by this class. Default: False
+        _paths: list string, target directory paths
+        _failed_paths: list of string, paths that don't have desired permissions
+        _permissions: list of int, desired permissions for each path
+    """
+
+    def __init__(self,
+                 paths=None,
+                 to_check=True,
+                 to_setup=False,
+                 to_cleanup=False):
+        self._paths = paths
+        self.to_check = to_check
+        self.to_setup = to_setup
+        self.to_cleanup = to_cleanup
+
+    def ValidateInput(self):
+        """Validate input paths is not null or empty list
+        or list containing empty string. If input is a single path, it will
+        be converted to a single item list containing that path.
+        """
+        if not self._paths:
+            return False
+
+        self._paths = self.ToListLike(self._paths)
+
+        return all(self._paths)
+
+    def Check(self):
+        commands = ["ls %s" % path for path in self._paths]
+        results = self.ExecuteShellCommand(commands)[const.EXIT_CODE]
+
+        self._failed_paths = [
+            path for path, fail in zip(self._paths, map(bool, results)) if fail
+        ]
+
+        if not self._failed_paths:
+            return True
+
+        self.note = "Some directories do not exist: %s" % self._failed_paths
+        return False
+
+    def Setup(self):
+        commands = ["mkdir -p %s" % path for path in self._failed_paths]
+        # TODO: perhaps store or print failed setup paths
+        return not any(self.ExecuteShellCommand(commands)[const.EXIT_CODE])
+
+    def Cleanup(self):
+        commands = ["rm -rf %s" % path for path in self._failed_paths]
+        return not any(self.ExecuteShellCommand(commands)[const.EXIT_CODE])
diff --git a/testcases/kernel/ltp/shell_environment/definitions/loop_device_support.py b/testcases/kernel/ltp/shell_environment/definitions/loop_device_support.py
new file mode 100644
index 0000000..2e07772
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/definitions/loop_device_support.py
@@ -0,0 +1,27 @@
+#!/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.
+#
+
+from vts.runners.host import const
+from vts.testcases.kernel.ltp.shell_environment.definitions.base_definitions import check_setup_cleanup
+
+
+class LoopDeviceSupport(check_setup_cleanup.CheckSetupCleanup):
+    """Class for checking loopback device support."""
+    note = "Kernel does not have loop device support"
+
+    def Check(self):
+        return not self.ExecuteCommand("losetup -f")[const.EXIT_CODE][0]
diff --git a/testcases/kernel/ltp/shell_environment/definitions/path_permission.py b/testcases/kernel/ltp/shell_environment/definitions/path_permission.py
new file mode 100644
index 0000000..761a04d
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/definitions/path_permission.py
@@ -0,0 +1,89 @@
+#!/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.
+#
+
+from vts.runners.host import const
+from vts.testcases.kernel.ltp.shell_environment.definitions.base_definitions import check_setup_cleanup
+
+
+class PathPermission(check_setup_cleanup.CheckSetupCleanup):
+    """Class for check and set path permissions.
+
+    Attributes:
+        to_check: bool, whether or not to check the defined environment
+                  requirement. Default: True
+        to_setup: bool, whether or not to setup the defined environment
+                  requirement. Default: False
+        to_cleanup: bool, whether or not to cleanup the defined environment
+                    requirement if it is set up by this class. Default: False
+        _paths: list string, target paths
+        _failed_paths: list of string, paths that don't have desired permissions
+        _permissions: list of int, desired permissions for each path
+    """
+
+    def __init__(self,
+                 paths=None,
+                 permissions=None,
+                 to_check=True,
+                 to_setup=False,
+                 to_cleanup=False):
+        self._paths = paths
+        self._permissions = permissions
+        self.to_check = to_check
+        self.to_setup = to_setup
+        self.to_cleanup = to_cleanup
+
+    def ValidateInput(self):
+        """Validate input lists is not null or empty list
+        or list containing empty string, and two lists containing same number
+        of items. If inputs are two single item, they will
+        be converted to single item lists.
+        """
+        normalized = self.NormalizeInputLists(self._paths, self._permissions)
+        if not normalized:
+            return False
+        self._paths, self._permissions = normalized
+
+        return True
+
+    def Check(self):
+        commands = ["stat -c {}a {}".format('%', path) for path in self._paths]
+        results = self.ExecuteShellCommand(commands)[const.STDOUT]
+
+        self._failed_paths = [
+            (path, permission, result)
+            for path, permission, result in zip(self._paths, self._permissions,
+                                                results)
+            if str(permission) != result
+        ]
+
+        if not self._failed_paths:
+            return True
+
+        self.note = ("Some paths do not have desired "
+                     "permission: %s") % self._failed_paths
+        return False
+
+    def Setup(self):
+        commands = ["chmod {} {}".format(permission, path)
+                    for (path, permission, result) in self._failed_paths]
+        # TODO: perhaps store or print failed setup paths
+        return not any(self.ExecuteShellCommand(commands)[const.EXIT_CODE])
+
+    def Cleanup(self):
+        commands = ["chmod {} {}".format(original, path)
+                    for (path, permission, original) in self._failed_paths]
+        return not any(self.ExecuteShellCommand(commands)[const.EXIT_CODE])
diff --git a/testcases/kernel/ltp/shell_environment/shell_environment.py b/testcases/kernel/ltp/shell_environment/shell_environment.py
new file mode 100644
index 0000000..a946314
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/shell_environment.py
@@ -0,0 +1,61 @@
+#!/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 types
+
+
+class ShellEnvironment(object):
+    """Class for executing environment definition classes and do cleanup jobs.
+
+    Attributes:
+        shell: shell mirror object, shell to execute commands
+        _cleanup_jobs: set of CheckSetupCleanup objects, a set used to store
+                       clean up jobs if requested.
+    """
+
+    def __init__(self, shell):
+        self.shell = shell
+        self._cleanup_jobs = []
+
+    def Cleanup(self):
+        """Final cleanup jobs. Will run all the stored cleanup jobs"""
+        return all([method(*args) for method, args in self._cleanup_jobs])
+
+    def AddCleanupJob(self, method, *args):
+        """Add a clean up job for final cleanup"""
+        if (method, args) not in self._cleanup_jobs:
+            self._cleanup_jobs.append((method, args))
+
+    @property
+    def shell(self):
+        """returns an object that can execute a shell command"""
+        return self._shell
+
+    @shell.setter
+    def shell(self, shell):
+        self._shell = shell
+
+    def ExecuteDefinitions(self, definitions):
+        if not isinstance(definitions, types.ListType):
+            definitions = [definitions]
+
+        for definition in definitions:
+            definition.context = self
+            if not definition.Execute():
+                return (False, definition.GetNote())
+
+        return (True, "")
diff --git a/testcases/kernel/ltp/stable/Android.mk b/testcases/kernel/ltp/stable/Android.mk
new file mode 100644
index 0000000..4f4208a
--- /dev/null
+++ b/testcases/kernel/ltp/stable/Android.mk
@@ -0,0 +1,33 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := KernelLtpTest
+LOCAL_MODULE_CLASS := FAKE
+LOCAL_IS_HOST_MODULE := true
+LOCAL_COMPATIBILITY_SUITE := vts
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE):
+	@echo "VTS host-driven test target: $(LOCAL_MODULE)"
+	$(hide) touch $@
+
+VTS_CONFIG_SRC_DIR := testcases/kernel/ltp/stable
+include test/vts/tools/build/Android.host_config.mk
diff --git a/testcases/kernel/ltp/AndroidTest.xml b/testcases/kernel/ltp/stable/AndroidTest.xml
similarity index 98%
copy from testcases/kernel/ltp/AndroidTest.xml
copy to testcases/kernel/ltp/stable/AndroidTest.xml
index f437de7..9b5ea0f 100644
--- a/testcases/kernel/ltp/AndroidTest.xml
+++ b/testcases/kernel/ltp/stable/AndroidTest.xml
@@ -51,6 +51,6 @@
     <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
         <option name="test-timeout" value="3000000" />
         <option name="test-case-path" value="vts/testcases/kernel/ltp/KernelLtpTest" />
-        <option name="test-config-path" value="vts-config/testcases/kernel/ltp/KernelLtpTest.config" />
+        <option name="test-config-path" value="vts-config/testcases/kernel/ltp/stable/KernelLtpTest.config" />
     </test>
 </configuration>
diff --git a/testcases/kernel/ltp/KernelLtpTest.config b/testcases/kernel/ltp/stable/KernelLtpTest.config
similarity index 66%
copy from testcases/kernel/ltp/KernelLtpTest.config
copy to testcases/kernel/ltp/stable/KernelLtpTest.config
index b531d10..414f6fd 100644
--- a/testcases/kernel/ltp/KernelLtpTest.config
+++ b/testcases/kernel/ltp/stable/KernelLtpTest.config
@@ -7,6 +7,7 @@
         }
     ],
     "log_path": "/tmp/logs",
-    "test_paths": ["./"],
-    "use_gae_db": true
+    "test_paths": ["../"],
+    "use_gae_db": true,
+    "run_staging": false
 }
diff --git a/testcases/kernel/ltp/staging/Android.mk b/testcases/kernel/ltp/staging/Android.mk
new file mode 100644
index 0000000..172e707
--- /dev/null
+++ b/testcases/kernel/ltp/staging/Android.mk
@@ -0,0 +1,33 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := KernelLtpStagingTest
+LOCAL_MODULE_CLASS := FAKE
+LOCAL_IS_HOST_MODULE := true
+LOCAL_COMPATIBILITY_SUITE := vts
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE):
+	@echo "VTS host-driven test target: $(LOCAL_MODULE)"
+	$(hide) touch $@
+
+VTS_CONFIG_SRC_DIR := testcases/kernel/ltp/staging
+include test/vts/tools/build/Android.host_config.mk
diff --git a/testcases/kernel/ltp/AndroidTest.xml b/testcases/kernel/ltp/staging/AndroidTest.xml
similarity index 98%
rename from testcases/kernel/ltp/AndroidTest.xml
rename to testcases/kernel/ltp/staging/AndroidTest.xml
index f437de7..5621c5c 100644
--- a/testcases/kernel/ltp/AndroidTest.xml
+++ b/testcases/kernel/ltp/staging/AndroidTest.xml
@@ -51,6 +51,6 @@
     <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
         <option name="test-timeout" value="3000000" />
         <option name="test-case-path" value="vts/testcases/kernel/ltp/KernelLtpTest" />
-        <option name="test-config-path" value="vts-config/testcases/kernel/ltp/KernelLtpTest.config" />
+        <option name="test-config-path" value="vts-config/testcases/kernel/ltp/staging/KernelLtpTest.config" />
     </test>
 </configuration>
diff --git a/testcases/kernel/ltp/staging/KernelLtpStagingTest.config b/testcases/kernel/ltp/staging/KernelLtpStagingTest.config
new file mode 100644
index 0000000..eddb282
--- /dev/null
+++ b/testcases/kernel/ltp/staging/KernelLtpStagingTest.config
@@ -0,0 +1,13 @@
+{
+    "test_bed":
+    [
+        {
+            "name": "VTS-Kernel-LTP-Staging",
+            "AndroidDevice": "*"
+        }
+    ],
+    "log_path": "/tmp/logs",
+    "test_paths": ["../"],
+    "use_gae_db": true,
+    "run_staging": true
+}
diff --git a/testcases/kernel/ltp/test_case.py b/testcases/kernel/ltp/test_case.py
new file mode 100644
index 0000000..44309a8
--- /dev/null
+++ b/testcases/kernel/ltp/test_case.py
@@ -0,0 +1,115 @@
+#!/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
+
+from vts.testcases.kernel.ltp import ltp_enums
+
+
+class TestCase(object):
+    """Stores name, path, and param information for each test case.
+
+    Attributes:
+        testsuite: string, name of testsuite to which the testcase belongs
+        testname: string, name of the test case
+        path: string, test binary path
+        _args: list of string, test case command line arguments
+        requirement_state: RequirementState, enum representing requirement
+                            check results
+        note: string, a place to store additional note for the test case
+              such as what environment requirement did not satisfy.
+    """
+
+    def __init__(self, testsuite, testname, path, args):
+        self.testsuite = testsuite
+        self.testname = testname
+        self.path = path
+        self._args = args
+        self.requirement_state = ltp_enums.RequirementState.UNCHECKED
+        self.note = None
+
+    @property
+    def note(self):
+        """Get the note"""
+        return self._note
+
+    @note.setter
+    def note(self, note):
+        """Set the note"""
+        self._note = note
+
+    @property
+    def requirement_state(self):
+        """Get the requirement state"""
+        return self._requirement_state
+
+    @requirement_state.setter
+    def requirement_state(self, requirement_state):
+        """Set the requirement state"""
+        self._requirement_state = requirement_state
+
+    @property
+    def testsuite(self):
+        """Get the test suite's name."""
+        return self._testsuite
+
+    @testsuite.setter
+    def testsuite(self, testsuite):
+        """Set the test suite's name."""
+        self._testsuite = testsuite
+
+    @property
+    def testname(self):
+        """Get the test case's name."""
+        return self._testname
+
+    @testname.setter
+    def testname(self, testname):
+        """Set the test case's name."""
+        self._testname = testname
+
+    @property
+    def path(self):
+        """Get the test binary's file name."""
+        return self._path
+
+    @path.setter
+    def path(self, path):
+        """Set the test testbinary's name."""
+        self._path = path
+
+    def GetArgs(self, replace_string_from=None, replace_string_to=None):
+        """Get the case arguments in string format.
+
+        if replacement string is provided, arguments will be
+        filtered with the replacement string
+
+        Args:
+            replace_string_from: string, replacement string source, if any
+            replace_string_to: string, replacement string destination, if any
+
+        Returns:
+            string, arguments formated in space separated string
+        """
+        if replace_string_from is None or replace_string_to is None:
+            return ' '.join(self._args)
+        else:
+            return ' '.join([p.replace(replace_string_from, replace_string_to)
+                             for p in self._args])
+
+    def __str__(self):
+        return "%s-%s" % (self.testsuite, self.testname)
diff --git a/testcases/kernel/ltp/test_cases_parser.py b/testcases/kernel/ltp/test_cases_parser.py
new file mode 100644
index 0000000..2469349
--- /dev/null
+++ b/testcases/kernel/ltp/test_cases_parser.py
@@ -0,0 +1,70 @@
+#!/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 os
+
+from vts.testcases.kernel.ltp import ltp_configs
+from vts.testcases.kernel.ltp import test_case
+
+
+class TestCasesParser(object):
+    """Load a ltp vts testcase definition file and parse it into a generator.
+
+    Attributes:
+        _data_path: string, the vts data path on host side
+    """
+
+    def __init__(self, data_path):
+        self._data_path = data_path
+
+    def IsTestcaseInList(self, testcase, name_list, n_bit):
+        """Check whether a given testcase object is in a disabled test list"""
+        name_set = (testcase, testcase.testname,
+                    "{test_name}_%{n_bit}bit".format(
+                        test_name=testcase.testname, n_bit=n_bit))
+        return len(set(name_set).intersection(name_list)) > 0
+
+    def Load(self, ltp_dir, n_bit, run_staging=False):
+        """Read the definition file and return a TestCase generator."""
+        case_definition_path = os.path.join(self._data_path, n_bit, 'ltp',
+                                            'ltp_vts_testcases.txt')
+
+        with open(case_definition_path, 'r') as f:
+            for line in f:
+                items = line.split('\t')
+                if not len(items) == 4:
+                    continue
+
+                testsuite, testname, testbinary, arg = items
+                args = arg.strip().split(',')
+
+                if testname.startswith("DISABLED_"):
+                    continue
+
+                testcase = test_case.TestCase(
+                    testsuite, testname, os.path.join(ltp_dir, 'testcases/bin',
+                                                      testbinary), args)
+
+                if self.IsTestcaseInList(testcase, ltp_configs.DISABLED_TESTS,
+                                         n_bit):
+                    continue
+
+                if (not run_staging and self.IsTestcaseInList(
+                        testcase, ltp_configs.STAGING_TESTS, n_bit)):
+                    continue
+
+                yield testcase
diff --git a/testcases/kernel/ltp_adb/AndroidTest.xml b/testcases/kernel/ltp_adb/AndroidTest.xml
deleted file mode 100644
index e4fd54d..0000000
--- a/testcases/kernel/ltp_adb/AndroidTest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<configuration description="Config for VTS kernel LTP ADB test cases">
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
-        <option name="cleanup" value="true" />
-        <option name="append-bitness" value="false" />
-    </target_preparer>
-    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer">
-        <option name="dep-module" value="future" />
-        <option name="dep-module" value="futures" />
-        <option name="dep-module" value="enum" />
-        <option name="dep-module" value="protobuf" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
-        <option name="test-timeout" value="3000000" />
-        <option name="test-case-path" value="vts/testcases/kernel/ltp_adb/KernelLtpAdbTest" />
-        <option name="test-config-path" value="vts-config/testcases/kernel/ltp_adb/KernelLtpAdbTest.config" />
-    </test>
-</configuration>
diff --git a/testcases/kernel/ltp_adb/KernelLtpAdbTest.config b/testcases/kernel/ltp_adb/KernelLtpAdbTest.config
deleted file mode 100644
index 4954ca3..0000000
--- a/testcases/kernel/ltp_adb/KernelLtpAdbTest.config
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "test_bed":
-    [
-        {
-            "name": "VTS-Kernel-LTP-ADB",
-            "AndroidDevice": "*",
-            "use_vts_agent": false
-        }
-    ],
-    "log_path": "/tmp/logs",
-    "test_paths": ["./"],
-    "use_gae_db": true
-}
diff --git a/testcases/kernel/ltp_adb/KernelLtpAdbTest.py b/testcases/kernel/ltp_adb/KernelLtpAdbTest.py
deleted file mode 100644
index 7068d7b..0000000
--- a/testcases/kernel/ltp_adb/KernelLtpAdbTest.py
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/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 os
-import subprocess
-import types
-
-from vts.runners.host import const
-from vts.runners.host import keys
-from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
-
-from vts.testcases.kernel.ltp import KernelLtpTest
-from vts.testcases.kernel.ltp import KernelLtpTestHelper
-
-
-class DutWrapper(object):
-    """Wrapper class for AndroidDevice object."""
-    def __init__(self, dut):
-        self._dut = dut
-        self._shell = AdbWrapperForShell()
-
-    @property
-    def adb(self):
-        """Returns original adb member"""
-        return self._dut.adb
-
-    @property
-    def shell(self):
-        """Returns a adb wrapped shell that mimic behavior of a shell mirror"""
-        return self._shell
-
-
-class AdbWrapperForShell(object):
-    """A adb wrapped shell that mimic behavior of a shell mirror"""
-
-    def InvokeTerminal(self, name):
-        """Since we are using adb to execute shell commands, this method does nothing"""
-        pass
-
-    def ExecuteOneCommand(self, cmd):
-        """Execute one shell command using adb and return stdout, stderr, exit_code"""
-        p = subprocess.Popen("adb shell {}".format(cmd) , shell=True,
-                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        stdout, stderr = p.communicate()
-        return (stdout, stderr, p.returncode)
-
-    def Execute(self, command):
-        """Execute one shell command or a list of shell commands"""
-        if not isinstance(command, types.ListType):
-            command = [command]
-
-        results = [self.ExecuteOneCommand(cmd) for cmd in command]
-        stdout, stderr, exit_code = zip(*results)
-        return {const.STDOUT: stdout,
-                const.STDERR: stderr,
-                const.EXIT_CODE: exit_code}
-
-    def __getattr__(self, name):
-        return self
-
-
-class KernelLtpAdbTest(KernelLtpTest.KernelLtpTest):
-    """Runs the LTP (Linux Test Project) testcases against Android OS kernel.
-
-    This class is a child class of KernelLtpTest. The only difference is this class
-    uses adb shell to execute command instead of using target shell driver.
-
-    Attributes:
-        _TPASS: int, exit_code for Test pass
-        _TCONF: int, The test case is not for current configuration of kernel
-        _32BIT: int, for 32 bit tests
-        _64BIT: int, for 64 bit tests
-        _dut: AndroidDevice, the device under test
-        _shell: ShellMirrorObject, shell mirror object used to execute commands
-        _ltp_dir: string, ltp build root directory on target
-        _testcases: TestcasesParser, test case input parser
-        _env: dict<stirng, stirng>, dict of environment variable key value pair
-        _KEY_ENV__: constant strings starting with prefix "_KEY_ENV_" are used as dict
-                    key in environment variable dictionary
-    """
-    def setUpClass(self):
-        """Creates a remote shell instance, and copies data files."""
-        required_params = [keys.ConfigKeys.IKEY_DATA_FILE_PATH]
-        self.getUserParams(required_params)
-
-        logging.info("data_file_path: %s", self.data_file_path)
-        self._dut = DutWrapper(self.registerController(android_device)[0])
-        self._dut.shell.InvokeTerminal("one")
-        self._shell = self._dut.shell.one
-        self._ltp_dir = "/data/local/tmp/ltp"
-
-        self._requirement = KernelLtpTestHelper.EnvironmentRequirementChecker(
-            self._shell)
-
-        self._testcases = KernelLtpTestHelper.TestCasesParser(
-            self.data_file_path)
-        self._env = {self._KEY_ENV_TMPDIR: KernelLtpTestHelper.LTPTMP,
-                     self._KEY_ENV_TMP: "%s/tmp" % KernelLtpTestHelper.LTPTMP,
-                     self._KEY_ENV_LTP_DEV_FS_TYPE: "ext4",
-                     self._KEY_ENV_LTPROOT: self._ltp_dir,
-                     self._KEY_ENV_PATH:
-                     "/system/bin:%s/testcases/bin" % self._ltp_dir, }
-
-if __name__ == "__main__":
-    test_runner.main()
diff --git a/testcases/kernel/ltp_adb/__init__.pyc b/testcases/kernel/ltp_adb/__init__.pyc
deleted file mode 100644
index bee6be0..0000000
--- a/testcases/kernel/ltp_adb/__init__.pyc
+++ /dev/null
Binary files differ
diff --git a/testcases/system/Android.mk b/testcases/system/Android.mk
new file mode 100644
index 0000000..f9e3276
--- /dev/null
+++ b/testcases/system/Android.mk
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/system/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/system/__init__.py
diff --git a/testcases/system/qtaguid/Android.mk b/testcases/system/qtaguid/Android.mk
new file mode 100644
index 0000000..f9e3276
--- /dev/null
+++ b/testcases/system/qtaguid/Android.mk
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/system/qtaguid/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/system/qtaguid/__init__.py
diff --git a/testcases/kernel/ltp_adb/Android.mk b/testcases/system/qtaguid/sample/Android.mk
similarity index 78%
rename from testcases/kernel/ltp_adb/Android.mk
rename to testcases/system/qtaguid/sample/Android.mk
index 2168817..67a85aa 100644
--- a/testcases/kernel/ltp_adb/Android.mk
+++ b/testcases/system/qtaguid/sample/Android.mk
@@ -2,7 +2,7 @@
 
 include $(CLEAR_VARS)
 
-LOCAL_MODULE := KernelLtpAdbTest
+LOCAL_MODULE := sample_qtaguid_test
 LOCAL_MODULE_CLASS := FAKE
 LOCAL_IS_HOST_MODULE := true
 LOCAL_COMPATIBILITY_SUITE := vts
@@ -13,6 +13,5 @@
 	@echo "VTS host-driven test target: $(LOCAL_MODULE)"
 	$(hide) touch $@
 
-VTS_CONFIG_SRC_DIR := testcases/kernel/ltp_adb
+VTS_CONFIG_SRC_DIR := testcases/system/qtaguid/sample
 include test/vts/tools/build/Android.host_config.mk
-
diff --git a/testcases/kernel/ltp/AndroidTest.xml b/testcases/system/qtaguid/sample/AndroidTest.xml
similarity index 86%
copy from testcases/kernel/ltp/AndroidTest.xml
copy to testcases/system/qtaguid/sample/AndroidTest.xml
index f437de7..9f75855 100644
--- a/testcases/kernel/ltp/AndroidTest.xml
+++ b/testcases/system/qtaguid/sample/AndroidTest.xml
@@ -13,7 +13,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<configuration description="Config for VTS kernel LTP test cases">
+<configuration description="Config for VTS system sample qtaguid test cases">
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
         <option name="cleanup" value="true" />
         <option name="push" value="libvts_common.so->/data/local/tmp/32/libvts_common.so" />
@@ -32,14 +32,15 @@
         <option name="push" value="libvts_multidevice_proto64.so->/data/local/tmp/64/libvts_multidevice_proto.so" />
         <option name="push" value="libhwbinder.so->/data/local/tmp/32/libhwbinder.so" />
         <option name="push" value="libhwbinder64.so->/data/local/tmp/64/libhwbinder.so" />
-        <option name="push" value="libprotobuf-cpp-full.so->/data/local/tmp/32/libprotobuf-cpp-full.so" />
-        <option name="push" value="libprotobuf-cpp-full64.so->/data/local/tmp/64/libprotobuf-cpp-full.so" />
+        <option name="push" value="lights.bullhead-vts.so->/data/local/tmp/32/lights.bullhead-vts.so" />
+        <option name="push" value="lights.bullhead-vts64.so->/data/local/tmp/64/lights.bullhead-vts.so" />
         <option name="push" value="fuzzer32->/data/local/tmp/32/fuzzer32" />
         <option name="push" value="fuzzer64->/data/local/tmp/64/fuzzer64" />
         <option name="push" value="vts_shell_driver32->/data/local/tmp/32/vts_shell_driver32" />
         <option name="push" value="vts_shell_driver64->/data/local/tmp/64/vts_shell_driver64" />
         <option name="push" value="vts_hal_agent32->/data/local/tmp/32/vts_hal_agent32" />
         <option name="push" value="vts_hal_agent64->/data/local/tmp/64/vts_hal_agent64" />
+        <option name="push" value="libcutilsV1.vts->/data/local/tmp/spec/libcutilsV1.vts" />
         <option name="append-bitness" value="false" />
     </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer">
@@ -49,8 +50,7 @@
         <option name="dep-module" value="protobuf" />
     </target_preparer>
     <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
-        <option name="test-timeout" value="3000000" />
-        <option name="test-case-path" value="vts/testcases/kernel/ltp/KernelLtpTest" />
-        <option name="test-config-path" value="vts-config/testcases/kernel/ltp/KernelLtpTest.config" />
+        <option name="test-case-path" value="vts/testcases/system/qtaguid/sample/sample_qtaguid_test" />
+        <option name="test-config-path" value="vts-config/testcases/system/qtaguid/sample/sample_qtaguid_test.config" />
     </test>
 </configuration>
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/system/qtaguid/sample/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/system/qtaguid/sample/__init__.py
diff --git a/testcases/kernel/ltp/KernelLtpTest.config b/testcases/system/qtaguid/sample/sample_qtaguid_test.config
similarity index 76%
rename from testcases/kernel/ltp/KernelLtpTest.config
rename to testcases/system/qtaguid/sample/sample_qtaguid_test.config
index b531d10..f56e768 100644
--- a/testcases/kernel/ltp/KernelLtpTest.config
+++ b/testcases/system/qtaguid/sample/sample_qtaguid_test.config
@@ -2,7 +2,7 @@
     "test_bed":
     [
         {
-            "name": "VTS-Kernel-LTP",
+            "name": "VTS-System-Qtaguid-Sample",
             "AndroidDevice": "*"
         }
     ],
diff --git a/testcases/system/qtaguid/sample/sample_qtaguid_test.py b/testcases/system/qtaguid/sample/sample_qtaguid_test.py
new file mode 100644
index 0000000..16015e4
--- /dev/null
+++ b/testcases/system/qtaguid/sample/sample_qtaguid_test.py
@@ -0,0 +1,44 @@
+#!/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
+
+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 SampleQtaguidTest(base_test_with_webdb.BaseTestWithWebDbClass):
+    """A sample testcase for the libcutil's qtaguid module."""
+
+    def setUpClass(self):
+        self.dut = self.registerController(android_device)[0]
+        self.dut.lib.InitSharedLib(target_type="vndk_libcutils",
+                                   target_basepaths=["/system/lib64"],
+                                   target_version=1.0,
+                                   target_filename="libcutils.so",
+                                   bits=64,
+                                   handler_name="libcutils")
+
+    def testCall(self):
+        """A simple testcase which just calls a function."""
+        result = self.dut.lib.libcutils.qtaguid_tagSocket(0, 1, 2)
+        logging.info("result: %s", result)
+
+
+if __name__ == "__main__":
+    test_runner.main()
diff --git a/tools/vts-tradefed/res/config/vts-kernel.xml b/tools/vts-tradefed/res/config/vts-kernel.xml
index 5917aa2..6294b09 100644
--- a/tools/vts-tradefed/res/config/vts-kernel.xml
+++ b/tools/vts-tradefed/res/config/vts-kernel.xml
@@ -16,6 +16,6 @@
 <configuration description="Run VTS Kernel and Kernel Module Tests">
     <include name="everything" />
     <option name="compatibility:plan" value="vts" />
-    <option name="compatibility:include-filter" value="KernelLtpAdbTest" />
+    <option name="compatibility:include-filter" value="KernelLtpTest" />
     <template-include name="reporters" default="basic-reporters" />
 </configuration>
diff --git a/tools/vts-tradefed/res/config/vts-staging.xml b/tools/vts-tradefed/res/config/vts-staging.xml
index 8fb0e7c..80cfb09 100644
--- a/tools/vts-tradefed/res/config/vts-staging.xml
+++ b/tools/vts-tradefed/res/config/vts-staging.xml
@@ -17,6 +17,6 @@
     <include name="everything" />
     <option name="compatibility:plan" value="vts" />
     <option name="compatibility:include-filter" value="LightFuzzTest" />
-    <option name="compatibility:include-filter" value="KernelLtpTest" />
+    <option name="compatibility:include-filter" value="KernelLtpStagingTest" />
     <template-include name="reporters" default="basic-reporters" />
 </configuration>
diff --git a/utils/python/mirror/hal_mirror.py b/utils/python/mirror/hal_mirror.py
index cd1e348..3829e9d 100644
--- a/utils/python/mirror/hal_mirror.py
+++ b/utils/python/mirror/hal_mirror.py
@@ -41,7 +41,8 @@
                        "mobile": 6,
                        "bluetooth": 7,
                        "nfc": 8,
-                       "bionic_libm": 1001}
+                       "bionic_libm": 1001,
+                       "vndk_libcutils": 1101}
 
 VTS_CALLBACK_SERVER_TARGET_SIDE_PORT = 5010
 
diff --git a/utils/python/mirror/mirror_object.py b/utils/python/mirror/mirror_object.py
index 350ca33..952be04 100644
--- a/utils/python/mirror/mirror_object.py
+++ b/utils/python/mirror/mirror_object.py
@@ -193,8 +193,7 @@
                         # value_msg.type == "primitive_value"?
                         if isinstance(value_msg, int):
                             arg_msg.type = IfaceSpecMsg.TYPE_SCALAR
-                            arg_msg.scalar_value.int32_t = value_msg
-                            arg_msg.scalar_type = "int32_t"
+                            setattr(arg_msg.scalar_value, arg_msg.scalar_type, value_msg)
                         elif isinstance(value_msg, float):
                             arg_msg.type = IfaceSpecMsg.TYPE_SCALAR
                             arg_msg.scalar_value.float_t = value_msg
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/README.md b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/README.md
new file mode 100644
index 0000000..c155e87
--- /dev/null
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/README.md
@@ -0,0 +1,18 @@
+# Running Webdriver tests for VTS-Dashboard
+
+## Setup
+
+1. Create a new Java Project in Eclipse with root directory :
+    /vts/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test
+
+2. Download Selenium Client & WebDriver Language Bindings from:
+    http://selenium-release.storage.googleapis.com/3.0-beta2/selenium-java-3.0.0-beta2.zip
+
+3.  Extract it at some location and add the following files in the build path of the
+    project.
+    -- client-combined-3.0.0-beta2-nodeps.jar
+    -- Every jar in lib/ folder
+
+4.  Compile the project and run the tests.
+
+
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/src/com/google/android/vts/test/DashboardMainServletTest.java b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/src/com/google/android/vts/test/DashboardMainServletTest.java
index dd3207a..1b77c6a 100644
--- a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/src/com/google/android/vts/test/DashboardMainServletTest.java
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/src/com/google/android/vts/test/DashboardMainServletTest.java
@@ -31,13 +31,14 @@
     private static final String ASSERT_MESSAGE = "Title should start differently.";
     private static final String HOMEPAGE_TITLE = "VTS Dashboard";
     private static final String LOGIN_BUTTON_ID = "submit-login";
-    public static WebDriver driver = null;
+    private static WebDriver driver = null;
 
     /**
      * Runs once before running tests.
      */
     @Override
     public void setUp() {
+        System.setProperty("webdriver.chrome.driver", "chromedriver");
         driver = new ChromeDriver();
     }