diff --git a/core/base_rules.mk b/core/base_rules.mk
index 0cdaabd..68ac08b 100644
--- a/core/base_rules.mk
+++ b/core/base_rules.mk
@@ -461,6 +461,33 @@
 endif  # LOCAL_COMPATIBILITY_SUITE
 
 ###########################################################
+## Test Data
+###########################################################
+my_test_data_pairs :=
+my_installed_test_data :=
+
+ifneq ($(filter NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),)
+ifneq ($(strip $(LOCAL_TEST_DATA)),)
+ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))
+
+my_test_data_pairs := $(strip $(foreach td,$(LOCAL_TEST_DATA), \
+    $(eval _file := $(call word-colon,2,$(td))) \
+    $(if $(_file), \
+      $(eval _base := $(call word-colon,1,$(td))), \
+      $(eval _base := $(LOCAL_PATH)) \
+        $(eval _file := $(call word-colon,1,$(td)))) \
+    $(if $(findstring ..,$(_file)),$(error $(LOCAL_MODULE_MAKEFILE): LOCAL_TEST_DATA may not include '..': $(_file))) \
+    $(if $(filter /%,$(_base) $(_file)),$(error $(LOCAL_MODULE_MAKEFILE): LOCAL_TEST_DATA may not include absolute paths: $(_base) $(_file))) \
+    $(call append-path,$(_base),$(_file)):$(call append-path,$(my_module_path),$(_file))))
+
+my_installed_test_data := $(call copy-many-files,$(my_test_data_pairs))
+$(LOCAL_INSTALLED_MODULE): $(my_installed_test_data)
+
+endif
+endif
+endif
+
+###########################################################
 ## Register with ALL_MODULES
 ###########################################################
 
@@ -481,11 +508,12 @@
 ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))
 ALL_MODULES.$(my_register_name).INSTALLED := \
     $(strip $(ALL_MODULES.$(my_register_name).INSTALLED) \
-    $(LOCAL_INSTALLED_MODULE) $(my_init_rc_installed) $(my_installed_symlinks))
+    $(LOCAL_INSTALLED_MODULE) $(my_init_rc_installed) $(my_installed_symlinks) \
+    $(my_installed_test_data))
 ALL_MODULES.$(my_register_name).BUILT_INSTALLED := \
     $(strip $(ALL_MODULES.$(my_register_name).BUILT_INSTALLED) \
     $(LOCAL_BUILT_MODULE):$(LOCAL_INSTALLED_MODULE) \
-    $(my_init_rc_pairs))
+    $(my_init_rc_pairs) $(my_test_data_pairs))
 endif
 ifdef LOCAL_PICKUP_FILES
 # Files or directories ready to pick up by the build system
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index 004cdb2..c0343a0 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -2,329 +2,333 @@
 ## Clear out values of all variables used by rule templates.
 ###########################################################
 
-LOCAL_MODULE:=
-LOCAL_MODULE_PATH:=
-LOCAL_MODULE_RELATIVE_PATH :=
-LOCAL_MODULE_STEM:=
-LOCAL_DONT_CHECK_MODULE:=
-LOCAL_CHECKED_MODULE:=
+LOCAL_32_BIT_ONLY:= # '',true
+LOCAL_AAPT_FLAGS:=
+LOCAL_AAPT_INCLUDE_ALL_RESOURCES:=
+LOCAL_ADDITIONAL_CERTIFICATES:=
+LOCAL_ADDITIONAL_DEPENDENCIES:=
+LOCAL_ADDITIONAL_HTML_DIR:=
+LOCAL_ADDITIONAL_JAVA_DIR:=
+LOCAL_AIDL_INCLUDES:=
+LOCAL_ALLOW_UNDEFINED_SYMBOLS:=
+LOCAL_APK_LIBRARIES:=
+LOCAL_ARM_MODE:=
+LOCAL_ASFLAGS:=
+LOCAL_ASSET_DIR:=
 LOCAL_BUILT_MODULE:=
 LOCAL_BUILT_MODULE_STEM:=
-OVERRIDE_BUILT_MODULE_PATH:=
-LOCAL_INSTALLED_MODULE:=
-LOCAL_INSTALLED_MODULE_STEM:=
-LOCAL_PICKUP_FILES:=
-LOCAL_UNINSTALLABLE_MODULE:=
-LOCAL_INTERMEDIATE_TARGETS:=
-LOCAL_UNSTRIPPED_PATH:=
-LOCAL_MODULE_CLASS:=
-LOCAL_MODULE_SUFFIX:=
-LOCAL_PACKAGE_NAME:=
-LOCAL_OVERRIDES_PACKAGES:=
-LOCAL_EXPORT_PACKAGE_RESOURCES:=
-LOCAL_MANIFEST_PACKAGE_NAME:=
-LOCAL_PACKAGE_SPLITS:=
-LOCAL_REQUIRED_MODULES:=
-LOCAL_MODULE_TAGS:=
-LOCAL_SRC_FILES:=
-LOCAL_SRC_FILES_EXCLUDE:=
-LOCAL_PREBUILT_OBJ_FILES:=
-LOCAL_STATIC_JAVA_LIBRARIES:=
-LOCAL_STATIC_JAVA_AAR_LIBRARIES:=
-LOCAL_STATIC_LIBRARIES:=
-# Group static libraries with "-Wl,--start-group" and "-Wl,--end-group" when linking.
-LOCAL_GROUP_STATIC_LIBRARIES:=
-LOCAL_WHOLE_STATIC_LIBRARIES:=
-LOCAL_EXPORT_SHARED_LIBRARY_HEADERS:=
-LOCAL_EXPORT_STATIC_LIBRARY_HEADERS:=
-LOCAL_SHARED_LIBRARIES:=
-LOCAL_IS_HOST_MODULE:=
 LOCAL_CC:=
-LOCAL_CXX:=
-LOCAL_CPP_EXTENSION:=
-LOCAL_NO_DEFAULT_COMPILER_FLAGS:=
-LOCAL_FDO_SUPPORT:=
-LOCAL_ARM_MODE:=
-LOCAL_YACCFLAGS:=
-LOCAL_ASFLAGS:=
+LOCAL_CERTIFICATE:=
 LOCAL_CFLAGS:=
-LOCAL_CPPFLAGS:=
+LOCAL_CHECKED_MODULE:=
+LOCAL_C_INCLUDES:=
+LOCAL_CLANG:=
 LOCAL_CLANG_ASFLAGS:=
 LOCAL_CLANG_CFLAGS:=
 LOCAL_CLANG_CONLYFLAGS:=
 LOCAL_CLANG_CPPFLAGS:=
-LOCAL_CONLYFLAGS:=
-LOCAL_RTTI_FLAG:=
-LOCAL_C_INCLUDES:=
-LOCAL_EXPORT_C_INCLUDE_DEPS:=
-LOCAL_EXPORT_C_INCLUDE_DIRS:=
-LOCAL_LDFLAGS:=
 LOCAL_CLANG_LDFLAGS:=
-LOCAL_LDLIBS:=
-LOCAL_AAPT_FLAGS:=
-LOCAL_AAPT_INCLUDE_ALL_RESOURCES:=
-LOCAL_SYSTEM_SHARED_LIBRARIES:=none
-LOCAL_PREBUILT_LIBS:=
-LOCAL_PREBUILT_EXECUTABLES:=
-LOCAL_PREBUILT_JAVA_LIBRARIES:=
-LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES:=
-LOCAL_PREBUILT_STRIP_COMMENTS:=
-LOCAL_INTERMEDIATE_SOURCES:=
-LOCAL_INTERMEDIATE_SOURCE_DIR:=
-LOCAL_JAVACFLAGS:=
-LOCAL_JAVA_LIBRARIES:=
-LOCAL_JAVA_LAYERS_FILE:=
-LOCAL_NO_STANDARD_LIBRARIES:=
 LOCAL_CLASSPATH:=
-LOCAL_JACK_CLASSPATH:=
-LOCAL_JACK_PLUGIN_PATH:=
-LOCAL_JACK_PLUGIN:=
-LOCAL_DROIDDOC_USE_STANDARD_DOCLET:=
-LOCAL_DROIDDOC_SOURCE_PATH:=
-LOCAL_DROIDDOC_TEMPLATE_DIR:=
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=
+LOCAL_COMPATIBILITY_SUITE:=
+LOCAL_COMPATIBILITY_SUPPORT_FILES:=
+LOCAL_CONLYFLAGS:=
+LOCAL_COPY_HEADERS:=
+LOCAL_COPY_HEADERS_TO:=
+LOCAL_COPY_TO_INTERMEDIATE_LIBRARIES:=
+LOCAL_CPP_EXTENSION:=
+LOCAL_CPPFLAGS:=
+LOCAL_CTS_TEST_PACKAGE:=
+LOCAL_CTS_TEST_RUNNER:=
+LOCAL_CXX:=
+LOCAL_CXX_STL := default
+LOCAL_DATA_BINDING:=
+LOCAL_DBUS_PROXY_PREFIX:=
+LOCAL_DEX_PREOPT_FLAGS:=
+LOCAL_DEX_PREOPT_IMAGE_LOCATION:=
+LOCAL_DEX_PREOPT:= # '',true,false,nostripping
+LOCAL_DONT_CHECK_MODULE:=
+# Don't delete the META_INF dir when merging static Java libraries.
+LOCAL_DONT_DELETE_JAR_META_INF:=
+LOCAL_DPI_FILE_STEM:=
+LOCAL_DPI_VARIANTS:=
 LOCAL_DROIDDOC_ASSET_DIR:=
 LOCAL_DROIDDOC_CUSTOM_ASSET_DIR:=
-LOCAL_DROIDDOC_OPTIONS:=
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=
 LOCAL_DROIDDOC_HTML_DIR:=
+LOCAL_DROIDDOC_OPTIONS:=
+LOCAL_DROIDDOC_SOURCE_PATH:=
 LOCAL_DROIDDOC_STUB_OUT_DIR:=
-LOCAL_ADDITIONAL_HTML_DIR:=
-LOCAL_ASSET_DIR:=
-LOCAL_RESOURCE_DIR:=
-LOCAL_JAVA_RESOURCE_DIRS:=
-LOCAL_JAVA_RESOURCE_FILES:=
-LOCAL_GENERATED_SOURCES:=
-LOCAL_COPY_HEADERS_TO:=
-LOCAL_COPY_HEADERS:=
+LOCAL_DROIDDOC_TEMPLATE_DIR:=
+LOCAL_DROIDDOC_USE_STANDARD_DOCLET:=
+LOCAL_EMMA_COVERAGE_FILTER:=
+LOCAL_EMMA_INSTRUMENT:=
+LOCAL_EXPORT_C_INCLUDE_DEPS:=
+LOCAL_EXPORT_C_INCLUDE_DIRS:=
+LOCAL_EXPORT_PACKAGE_RESOURCES:=
+LOCAL_EXPORT_SHARED_LIBRARY_HEADERS:=
+LOCAL_EXPORT_STATIC_LIBRARY_HEADERS:=
+LOCAL_EXTRACT_APK:=
+LOCAL_EXTRACT_DPI_APK:=
+LOCAL_FDO_SUPPORT:=
+LOCAL_FINDBUGS_FLAGS:=
 LOCAL_FORCE_STATIC_EXECUTABLE:=
-LOCAL_ADDITIONAL_DEPENDENCIES:=
-LOCAL_STRIP_MODULE:=
-LOCAL_PACK_MODULE_RELOCATIONS:=
-LOCAL_JNI_SHARED_LIBRARIES:=
-LOCAL_JNI_SHARED_LIBRARIES_ABI:=
-LOCAL_PREBUILT_JNI_LIBS:=
-LOCAL_JAR_MANIFEST:=
+LOCAL_FULL_LIBS_MANIFEST_FILES:=
+LOCAL_FULL_MANIFEST_FILE:=
+LOCAL_GCNO_FILES:=
+LOCAL_GENERATED_SOURCES:=
+# Group static libraries with "-Wl,--start-group" and "-Wl,--end-group" when linking.
+LOCAL_GROUP_STATIC_LIBRARIES:=
+LOCAL_HAL_STATIC_LIBRARIES:=
+LOCAL_INIT_RC:=
+LOCAL_INSTALLED_MODULE:=
+LOCAL_INSTALLED_MODULE_STEM:=
 LOCAL_INSTRUMENTATION_FOR:=
-LOCAL_APK_LIBRARIES:=
-LOCAL_RES_LIBRARIES:=
-LOCAL_MANIFEST_INSTRUMENTATION_FOR:=
-LOCAL_AIDL_INCLUDES:=
-LOCAL_VTS_INCLUDES:=
-LOCAL_JARJAR_RULES:=
-LOCAL_ADDITIONAL_JAVA_DIR:=
-LOCAL_ALLOW_UNDEFINED_SYMBOLS:=
+LOCAL_INTERMEDIATE_SOURCE_DIR:=
+LOCAL_INTERMEDIATE_SOURCES:=
+LOCAL_INTERMEDIATE_TARGETS:=
+LOCAL_IS_HOST_MODULE:=
+LOCAL_IS_RUNTIME_RESOURCE_OVERLAY:=
+LOCAL_JACK_CLASSPATH:=
+LOCAL_JACK_COVERAGE_EXCLUDE_FILTER:=
+LOCAL_JACK_COVERAGE_INCLUDE_FILTER:=
 # full or incremental
 LOCAL_JACK_ENABLED:=full
 LOCAL_JACK_FLAGS:=
-LOCAL_JACK_COVERAGE_INCLUDE_FILTER:=
-LOCAL_JACK_COVERAGE_EXCLUDE_FILTER:=
-LOCAL_CERTIFICATE:=
-LOCAL_SDK_VERSION:=
-LOCAL_MIN_SDK_VERSION:=
-LOCAL_SDK_RES_VERSION:=
-LOCAL_NDK_STL_VARIANT:=
-LOCAL_EMMA_INSTRUMENT:=
-LOCAL_PROGUARD_ENABLED:= # '',full,custom,nosystem,disabled,obfuscation,optimization
-LOCAL_PROGUARD_FLAGS:=
+LOCAL_JACK_PLUGIN:=
+LOCAL_JACK_PLUGIN_PATH:=
 LOCAL_JACK_PROGUARD_FLAGS:=
-LOCAL_PROGUARD_FLAG_FILES:=
-LOCAL_TEST_MODULE_TO_PROGUARD_WITH:=
-LOCAL_EMMA_COVERAGE_FILTER:=
-LOCAL_WARNINGS_ENABLE:=
-LOCAL_FULL_MANIFEST_FILE:=
+LOCAL_JAR_EXCLUDE_FILES:=
+LOCAL_JAR_EXCLUDE_PACKAGES:=
+LOCAL_JARJAR_RULES:=
+LOCAL_JAR_MANIFEST:=
+LOCAL_JAR_PACKAGES:=
+LOCAL_JAVACFLAGS:=
+LOCAL_JAVA_LANGUAGE_VERSION:=
+LOCAL_JAVA_LAYERS_FILE:=
+LOCAL_JAVA_LIBRARIES:=
+LOCAL_JAVA_RESOURCE_DIRS:=
+LOCAL_JAVA_RESOURCE_FILES:=
+LOCAL_JNI_SHARED_LIBRARIES:=
+LOCAL_JNI_SHARED_LIBRARIES_ABI:=
+LOCAL_LDFLAGS:=
+LOCAL_LDLIBS:=
+LOCAL_LOGTAGS_FILES:=
 LOCAL_MANIFEST_FILE:=
-LOCAL_FULL_LIBS_MANIFEST_FILES:=
-LOCAL_RENDERSCRIPT_INCLUDES:=
-LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE:=
-LOCAL_RENDERSCRIPT_CC:=
-LOCAL_RENDERSCRIPT_COMPATIBILITY:=
-LOCAL_RENDERSCRIPT_FLAGS:=
-LOCAL_RENDERSCRIPT_TARGET_API:=
-LOCAL_DEX_PREOPT:= # '',true,false,nostripping
-LOCAL_DEX_PREOPT_IMAGE_LOCATION:=
-LOCAL_DEX_PREOPT_FLAGS:=
-LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,nano,full,nanopb-c,nanopb-c-enable_malloc
-LOCAL_PROTOC_FLAGS:=
-LOCAL_PROTO_JAVA_OUTPUT_PARAMS:=
-LOCAL_VTSC_FLAGS:=
+LOCAL_MANIFEST_INSTRUMENTATION_FOR:=
+LOCAL_MANIFEST_PACKAGE_NAME:=
+LOCAL_MIN_SDK_VERSION:=
+LOCAL_MODULE:=
+LOCAL_MODULE_CLASS:=
+LOCAL_MODULE_HOST_ARCH:=
+LOCAL_MODULE_HOST_ARCH_WARN:=
+LOCAL_MODULE_HOST_CROSS_ARCH:=
+LOCAL_MODULE_HOST_CROSS_ARCH_WARN:=
+LOCAL_MODULE_HOST_OS:=
+LOCAL_MODULE_OWNER:=
+LOCAL_MODULE_PATH:=
+LOCAL_MODULE_RELATIVE_PATH :=
+LOCAL_MODULE_STEM:=
+LOCAL_MODULE_SUFFIX:=
+LOCAL_MODULE_SYMLINKS:=
+LOCAL_MODULE_TAGS:=
+LOCAL_MODULE_TARGET_ARCH:=
+LOCAL_MODULE_TARGET_ARCH_WARN:=
+LOCAL_MODULE_UNSUPPORTED_HOST_ARCH:=
+LOCAL_MODULE_UNSUPPORTED_HOST_ARCH_WARN:=
+LOCAL_MODULE_UNSUPPORTED_HOST_CROSS_ARCH:=
+LOCAL_MODULE_UNSUPPORTED_HOST_CROSS_ARCH_WARN:=
+LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH:=
+LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN:=
+LOCAL_MULTILIB:=
+LOCAL_NDK_STL_VARIANT:=
+LOCAL_NDK_VERSION:=current
 LOCAL_NO_CRT:=
+LOCAL_NO_DEFAULT_COMPILER_FLAGS:=
+LOCAL_NO_FPIE :=
 LOCAL_NO_LIBCOMPILER_RT:=
 LOCAL_NO_LIBGCC:=
 LOCAL_NO_PIC:=
-LOCAL_PROPRIETARY_MODULE:=
-LOCAL_OEM_MODULE:=
-LOCAL_ODM_MODULE:=
-LOCAL_PRIVILEGED_MODULE:=
-LOCAL_MODULE_OWNER:=
-LOCAL_COMPATIBILITY_SUITE:=
-LOCAL_COMPATIBILITY_SUPPORT_FILES:=
-LOCAL_CTS_TEST_PACKAGE:=
-LOCAL_CTS_TEST_RUNNER:=
-LOCAL_CLANG:=
-LOCAL_JAR_EXCLUDE_FILES:=
-LOCAL_JAR_PACKAGES:=
-LOCAL_JAR_EXCLUDE_PACKAGES:=
-LOCAL_SOURCE_FILES_ALL_GENERATED:= # '',true
-# Don't delete the META_INF dir when merging static Java libraries.
-LOCAL_DONT_DELETE_JAR_META_INF:=
-LOCAL_ADDITIONAL_CERTIFICATES:=
-LOCAL_PREBUILT_MODULE_FILE:=
-LOCAL_POST_LINK_CMD:=
-LOCAL_POST_INSTALL_CMD:=
-LOCAL_HAL_STATIC_LIBRARIES:=
-LOCAL_RMTYPEDEFS:=
-LOCAL_NO_STATIC_ANALYZER:=
-LOCAL_TIDY:=
-LOCAL_TIDY_CHECKS:=
-LOCAL_TIDY_FLAGS:=
-LOCAL_32_BIT_ONLY:= # '',true
-LOCAL_MULTILIB:=
-LOCAL_MODULE_TARGET_ARCH:=
-LOCAL_MODULE_TARGET_ARCH_WARN:=
-LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH:=
-LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN:=
-LOCAL_MODULE_HOST_ARCH:=
-LOCAL_MODULE_HOST_ARCH_WARN:=
-LOCAL_MODULE_UNSUPPORTED_HOST_ARCH:=
-LOCAL_MODULE_UNSUPPORTED_HOST_ARCH_WARN:=
-LOCAL_MODULE_HOST_CROSS_ARCH:=
-LOCAL_MODULE_HOST_CROSS_ARCH_WARN:=
-LOCAL_MODULE_UNSUPPORTED_HOST_CROSS_ARCH:=
-LOCAL_MODULE_UNSUPPORTED_HOST_CROSS_ARCH_WARN:=
-LOCAL_NO_FPIE :=
-LOCAL_CXX_STL := default
-LOCAL_DPI_VARIANTS:=
-LOCAL_DPI_FILE_STEM:=
-LOCAL_SANITIZE:=
-LOCAL_SANITIZE_RECOVER:=
-LOCAL_SANITIZE_DIAG:=
 LOCAL_NOSANITIZE:=
-LOCAL_DATA_BINDING:=
-LOCAL_DBUS_PROXY_PREFIX:=
-LOCAL_INIT_RC:=
-LOCAL_MODULE_SYMLINKS:=
-LOCAL_MODULE_HOST_OS:=
-LOCAL_FINDBUGS_FLAGS:=
+LOCAL_NO_STANDARD_LIBRARIES:=
+LOCAL_NO_STATIC_ANALYZER:=
 LOCAL_NOTICE_FILE:=
-LOCAL_USE_AAPT2:=$(USE_AAPT2)
-LOCAL_STATIC_ANDROID_LIBRARIES:=
-LOCAL_SHARED_ANDROID_LIBRARIES:=
+LOCAL_ODM_MODULE:=
+LOCAL_OEM_MODULE:=
+LOCAL_OVERRIDES_PACKAGES:=
+LOCAL_PACKAGE_NAME:=
+LOCAL_PACKAGE_SPLITS:=
+LOCAL_PACK_MODULE_RELOCATIONS:=
+LOCAL_PICKUP_FILES:=
+LOCAL_POST_INSTALL_CMD:=
+LOCAL_POST_LINK_CMD:=
+LOCAL_PREBUILT_EXECUTABLES:=
+LOCAL_PREBUILT_JAVA_LIBRARIES:=
+LOCAL_PREBUILT_JNI_LIBS:=
+LOCAL_PREBUILT_LIBS:=
+LOCAL_PREBUILT_MODULE_FILE:=
+LOCAL_PREBUILT_OBJ_FILES:=
+LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES:=
+LOCAL_PREBUILT_STRIP_COMMENTS:=
+LOCAL_PRIVILEGED_MODULE:=
+LOCAL_PROGUARD_ENABLED:= # '',full,custom,nosystem,disabled,obfuscation,optimization
+LOCAL_PROGUARD_FLAG_FILES:=
+LOCAL_PROGUARD_FLAGS:=
+LOCAL_PROPRIETARY_MODULE:=
+LOCAL_PROTOC_FLAGS:=
+LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,nano,full,nanopb-c,nanopb-c-enable_malloc
+LOCAL_PROTO_JAVA_OUTPUT_PARAMS:=
+LOCAL_RECORDED_MODULE_TYPE:=
+LOCAL_RENDERSCRIPT_CC:=
+LOCAL_RENDERSCRIPT_COMPATIBILITY:=
+LOCAL_RENDERSCRIPT_FLAGS:=
+LOCAL_RENDERSCRIPT_INCLUDES:=
+LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE:=
+LOCAL_RENDERSCRIPT_TARGET_API:=
 # Used to replace the installed file of a presigned prebuilt apk in PDK fusion build,
 # to avoid installing the presigned apks with classes.dex unstripped.
 LOCAL_REPLACE_PREBUILT_APK_INSTALLED:=
-LOCAL_NDK_VERSION:=current
-LOCAL_COPY_TO_INTERMEDIATE_LIBRARIES:=
-LOCAL_LOGTAGS_FILES:=
-LOCAL_EXTRACT_APK:=
-LOCAL_EXTRACT_DPI_APK:=
-LOCAL_RECORDED_MODULE_TYPE:=
+LOCAL_REQUIRED_MODULES:=
+LOCAL_RES_LIBRARIES:=
+LOCAL_RESOURCE_DIR:=
+LOCAL_RMTYPEDEFS:=
+LOCAL_RRO_SKU:=
+LOCAL_RTTI_FLAG:=
+LOCAL_SANITIZE:=
+LOCAL_SANITIZE_DIAG:=
+LOCAL_SANITIZE_RECOVER:=
+LOCAL_SDK_RES_VERSION:=
+LOCAL_SDK_VERSION:=
+LOCAL_SHARED_ANDROID_LIBRARIES:=
+LOCAL_SHARED_LIBRARIES:=
+LOCAL_SOURCE_FILES_ALL_GENERATED:= # '',true
+LOCAL_SRC_FILES:=
+LOCAL_SRC_FILES_EXCLUDE:=
+LOCAL_STATIC_ANDROID_LIBRARIES:=
+LOCAL_STATIC_JAVA_AAR_LIBRARIES:=
+LOCAL_STATIC_JAVA_LIBRARIES:=
+LOCAL_STATIC_LIBRARIES:=
+LOCAL_STRIP_MODULE:=
+LOCAL_SYSTEM_SHARED_LIBRARIES:=none
+LOCAL_TEST_DATA:=
+LOCAL_TEST_MODULE_TO_PROGUARD_WITH:=
+LOCAL_TIDY:=
+LOCAL_TIDY_CHECKS:=
+LOCAL_TIDY_FLAGS:=
+LOCAL_UNINSTALLABLE_MODULE:=
+LOCAL_UNSTRIPPED_PATH:=
+LOCAL_USE_AAPT2:=$(USE_AAPT2)
 LOCAL_USE_VNDK:=
+LOCAL_VTSC_FLAGS:=
+LOCAL_VTS_INCLUDES:=
+LOCAL_WARNINGS_ENABLE:=
+LOCAL_WHOLE_STATIC_LIBRARIES:=
+LOCAL_YACCFLAGS:=
+OVERRIDE_BUILT_MODULE_PATH:=
 
 # arch specific variables
-LOCAL_SRC_FILES_$(TARGET_ARCH):=
-LOCAL_SRC_FILES_EXCLUDE_$(TARGET_ARCH):=
-LOCAL_CFLAGS_$(TARGET_ARCH):=
-LOCAL_CLANG_CFLAGS_$(TARGET_ARCH):=
-LOCAL_CPPFLAGS_$(TARGET_ARCH):=
-LOCAL_CLANG_CPPFLAGS_$(TARGET_ARCH):=
-LOCAL_C_INCLUDES_$(TARGET_ARCH):=
 LOCAL_ASFLAGS_$(TARGET_ARCH):=
+LOCAL_CFLAGS_$(TARGET_ARCH):=
+LOCAL_C_INCLUDES_$(TARGET_ARCH):=
 LOCAL_CLANG_ASFLAGS_$(TARGET_ARCH):=
-LOCAL_LDFLAGS_$(TARGET_ARCH):=
+LOCAL_CLANG_CFLAGS_$(TARGET_ARCH):=
+LOCAL_CLANG_CPPFLAGS_$(TARGET_ARCH):=
 LOCAL_CLANG_LDFLAGS_$(TARGET_ARCH):=
-LOCAL_SHARED_LIBRARIES_$(TARGET_ARCH):=
-LOCAL_STATIC_LIBRARIES_$(TARGET_ARCH):=
-LOCAL_WHOLE_STATIC_LIBRARIES_$(TARGET_ARCH):=
-LOCAL_GENERATED_SOURCES_$(TARGET_ARCH):=
-LOCAL_REQUIRED_MODULES_$(TARGET_ARCH):=
 LOCAL_CLANG_$(TARGET_ARCH):=
-LOCAL_PREBUILT_JNI_LIBS_$(TARGET_ARCH):=
-LOCAL_STRIP_MODULE_$(TARGET_ARCH):=
+LOCAL_CPPFLAGS_$(TARGET_ARCH):=
+LOCAL_GENERATED_SOURCES_$(TARGET_ARCH):=
+LOCAL_LDFLAGS_$(TARGET_ARCH):=
 LOCAL_PACK_MODULE_RELOCATIONS_$(TARGET_ARCH):=
-LOCAL_GCNO_FILES:=
+LOCAL_PREBUILT_JNI_LIBS_$(TARGET_ARCH):=
+LOCAL_REQUIRED_MODULES_$(TARGET_ARCH):=
+LOCAL_SHARED_LIBRARIES_$(TARGET_ARCH):=
+LOCAL_SRC_FILES_EXCLUDE_$(TARGET_ARCH):=
+LOCAL_SRC_FILES_$(TARGET_ARCH):=
+LOCAL_STATIC_LIBRARIES_$(TARGET_ARCH):=
+LOCAL_STRIP_MODULE_$(TARGET_ARCH):=
+LOCAL_WHOLE_STATIC_LIBRARIES_$(TARGET_ARCH):=
 ifdef TARGET_2ND_ARCH
-LOCAL_SRC_FILES_$(TARGET_2ND_ARCH):=
-LOCAL_SRC_FILES_EXCLUDE_$(TARGET_2ND_ARCH):=
-LOCAL_CFLAGS_$(TARGET_2ND_ARCH):=
-LOCAL_CLANG_CFLAGS_$(TARGET_2ND_ARCH):=
-LOCAL_CPPFLAGS_$(TARGET_2ND_ARCH):=
-LOCAL_CLANG_CPPFLAGS_$(TARGET_2ND_ARCH):=
-LOCAL_C_INCLUDES_$(TARGET_2ND_ARCH):=
 LOCAL_ASFLAGS_$(TARGET_2ND_ARCH):=
+LOCAL_CFLAGS_$(TARGET_2ND_ARCH):=
+LOCAL_C_INCLUDES_$(TARGET_2ND_ARCH):=
 LOCAL_CLANG_ASFLAGS_$(TARGET_2ND_ARCH):=
-LOCAL_LDFLAGS_$(TARGET_2ND_ARCH):=
+LOCAL_CLANG_CFLAGS_$(TARGET_2ND_ARCH):=
+LOCAL_CLANG_CPPFLAGS_$(TARGET_2ND_ARCH):=
 LOCAL_CLANG_LDFLAGS_$(TARGET_2ND_ARCH):=
-LOCAL_SHARED_LIBRARIES_$(TARGET_2ND_ARCH):=
-LOCAL_STATIC_LIBRARIES_$(TARGET_2ND_ARCH):=
-LOCAL_WHOLE_STATIC_LIBRARIES_$(TARGET_2ND_ARCH):=
-LOCAL_GENERATED_SOURCES_$(TARGET_2ND_ARCH):=
-LOCAL_REQUIRED_MODULES_$(TARGET_2ND_ARCH):=
 LOCAL_CLANG_$(TARGET_2ND_ARCH):=
-LOCAL_PREBUILT_JNI_LIBS_$(TARGET_2ND_ARCH):=
-LOCAL_STRIP_MODULE_$(TARGET_2ND_ARCH):=
+LOCAL_CPPFLAGS_$(TARGET_2ND_ARCH):=
+LOCAL_GENERATED_SOURCES_$(TARGET_2ND_ARCH):=
+LOCAL_LDFLAGS_$(TARGET_2ND_ARCH):=
 LOCAL_PACK_MODULE_RELOCATIONS_$(TARGET_2ND_ARCH):=
+LOCAL_PREBUILT_JNI_LIBS_$(TARGET_2ND_ARCH):=
+LOCAL_REQUIRED_MODULES_$(TARGET_2ND_ARCH):=
+LOCAL_SHARED_LIBRARIES_$(TARGET_2ND_ARCH):=
+LOCAL_SRC_FILES_EXCLUDE_$(TARGET_2ND_ARCH):=
+LOCAL_SRC_FILES_$(TARGET_2ND_ARCH):=
+LOCAL_STATIC_LIBRARIES_$(TARGET_2ND_ARCH):=
+LOCAL_STRIP_MODULE_$(TARGET_2ND_ARCH):=
+LOCAL_WHOLE_STATIC_LIBRARIES_$(TARGET_2ND_ARCH):=
 endif
-LOCAL_SRC_FILES_$(HOST_ARCH):=
-LOCAL_SRC_FILES_EXCLUDE_$(HOST_ARCH):=
-LOCAL_CFLAGS_$(HOST_ARCH):=
-LOCAL_CLANG_CFLAGS_$(HOST_ARCH):=
-LOCAL_CPPFLAGS_$(HOST_ARCH):=
-LOCAL_CLANG_CPPFLAGS_$(HOST_ARCH):=
-LOCAL_C_INCLUDES_$(HOST_ARCH):=
 LOCAL_ASFLAGS_$(HOST_ARCH):=
+LOCAL_CFLAGS_$(HOST_ARCH):=
+LOCAL_C_INCLUDES_$(HOST_ARCH):=
 LOCAL_CLANG_ASFLAGS_$(HOST_ARCH):=
-LOCAL_LDFLAGS_$(HOST_ARCH):=
+LOCAL_CLANG_CFLAGS_$(HOST_ARCH):=
+LOCAL_CLANG_CPPFLAGS_$(HOST_ARCH):=
+LOCAL_CLANG_$(HOST_ARCH):=
 LOCAL_CLANG_LDFLAGS_$(HOST_ARCH):=
+LOCAL_CPPFLAGS_$(HOST_ARCH):=
+LOCAL_GENERATED_SOURCES_$(HOST_ARCH):=
+LOCAL_LDFLAGS_$(HOST_ARCH):=
+LOCAL_REQUIRED_MODULES_$(HOST_ARCH):=
 LOCAL_SHARED_LIBRARIES_$(HOST_ARCH):=
+LOCAL_SRC_FILES_EXCLUDE_$(HOST_ARCH):=
+LOCAL_SRC_FILES_$(HOST_ARCH):=
 LOCAL_STATIC_LIBRARIES_$(HOST_ARCH):=
 LOCAL_WHOLE_STATIC_LIBRARIES_$(HOST_ARCH):=
-LOCAL_GENERATED_SOURCES_$(HOST_ARCH):=
-LOCAL_REQUIRED_MODULES_$(HOST_ARCH):=
-LOCAL_CLANG_$(HOST_ARCH):=
 ifdef HOST_2ND_ARCH
-LOCAL_SRC_FILES_$(HOST_2ND_ARCH):=
-LOCAL_SRC_FILES_EXCLUDE_$(HOST_2ND_ARCH):=
-LOCAL_CFLAGS_$(HOST_2ND_ARCH):=
-LOCAL_CLANG_CFLAGS_$(HOST_2ND_ARCH):=
-LOCAL_CPPFLAGS_$(HOST_2ND_ARCH):=
-LOCAL_CLANG_CPPFLAGS_$(HOST_2ND_ARCH):=
-LOCAL_C_INCLUDES_$(HOST_2ND_ARCH):=
 LOCAL_ASFLAGS_$(HOST_2ND_ARCH):=
+LOCAL_CFLAGS_$(HOST_2ND_ARCH):=
+LOCAL_C_INCLUDES_$(HOST_2ND_ARCH):=
 LOCAL_CLANG_ASFLAGS_$(HOST_2ND_ARCH):=
-LOCAL_LDFLAGS_$(HOST_2ND_ARCH):=
+LOCAL_CLANG_CFLAGS_$(HOST_2ND_ARCH):=
+LOCAL_CLANG_CPPFLAGS_$(HOST_2ND_ARCH):=
+LOCAL_CLANG_$(HOST_2ND_ARCH):=
 LOCAL_CLANG_LDFLAGS_$(HOST_2ND_ARCH):=
+LOCAL_CPPFLAGS_$(HOST_2ND_ARCH):=
+LOCAL_GENERATED_SOURCES_$(HOST_2ND_ARCH):=
+LOCAL_LDFLAGS_$(HOST_2ND_ARCH):=
+LOCAL_REQUIRED_MODULES_$(HOST_2ND_ARCH):=
 LOCAL_SHARED_LIBRARIES_$(HOST_2ND_ARCH):=
+LOCAL_SRC_FILES_EXCLUDE_$(HOST_2ND_ARCH):=
+LOCAL_SRC_FILES_$(HOST_2ND_ARCH):=
 LOCAL_STATIC_LIBRARIES_$(HOST_2ND_ARCH):=
 LOCAL_WHOLE_STATIC_LIBRARIES_$(HOST_2ND_ARCH):=
-LOCAL_GENERATED_SOURCES_$(HOST_2ND_ARCH):=
-LOCAL_REQUIRED_MODULES_$(HOST_2ND_ARCH):=
-LOCAL_CLANG_$(HOST_2ND_ARCH):=
 endif
 
-LOCAL_SRC_FILES_$(HOST_OS):=
-LOCAL_STATIC_LIBRARIES_$(HOST_OS):=
-LOCAL_SHARED_LIBRARIES_$(HOST_OS):=
+LOCAL_ASFLAGS_$(HOST_OS):=
 LOCAL_CFLAGS_$(HOST_OS):=
+LOCAL_C_INCLUDES_$(HOST_OS):=
 LOCAL_CPPFLAGS_$(HOST_OS):=
+LOCAL_GENERATED_SOURCES_$(HOST_OS):=
 LOCAL_LDFLAGS_$(HOST_OS):=
 LOCAL_LDLIBS_$(HOST_OS):=
-LOCAL_ASFLAGS_$(HOST_OS):=
-LOCAL_C_INCLUDES_$(HOST_OS):=
-LOCAL_GENERATED_SOURCES_$(HOST_OS):=
 LOCAL_REQUIRED_MODULES_$(HOST_OS):=
+LOCAL_SHARED_LIBRARIES_$(HOST_OS):=
+LOCAL_SRC_FILES_$(HOST_OS):=
+LOCAL_STATIC_LIBRARIES_$(HOST_OS):=
 
 ifdef HOST_CROSS_OS
-LOCAL_SRC_FILES_$(HOST_CROSS_OS):=
-LOCAL_STATIC_LIBRARIES_$(HOST_CROSS_OS):=
-LOCAL_SHARED_LIBRARIES_$(HOST_CROSS_OS):=
+LOCAL_ASFLAGS_$(HOST_CROSS_OS):=
 LOCAL_CFLAGS_$(HOST_CROSS_OS):=
+LOCAL_C_INCLUDES_$(HOST_CROSS_OS):=
 LOCAL_CPPFLAGS_$(HOST_CROSS_OS):=
+LOCAL_GENERATED_SOURCES_$(HOST_CROSS_OS):=
 LOCAL_LDFLAGS_$(HOST_CROSS_OS):=
 LOCAL_LDLIBS_$(HOST_CROSS_OS):=
-LOCAL_ASFLAGS_$(HOST_CROSS_OS):=
-LOCAL_C_INCLUDES_$(HOST_CROSS_OS):=
-LOCAL_GENERATED_SOURCES_$(HOST_CROSS_OS):=
 LOCAL_REQUIRED_MODULES_$(HOST_CROSS_OS):=
+LOCAL_SHARED_LIBRARIES_$(HOST_CROSS_OS):=
+LOCAL_SRC_FILES_$(HOST_CROSS_OS):=
+LOCAL_STATIC_LIBRARIES_$(HOST_CROSS_OS):=
 endif
 
 LOCAL_SRC_FILES_$(HOST_OS)_$(HOST_ARCH):=
@@ -338,59 +342,57 @@
 endif
 endif
 
-LOCAL_SRC_FILES_32:=
-LOCAL_SRC_FILES_64:=
-LOCAL_SRC_FILES_EXCLUDE_32:=
-LOCAL_SRC_FILES_EXCLUDE_64:=
-LOCAL_SHARED_LIBRARIES_32:=
-LOCAL_SHARED_LIBRARIES_64:=
-LOCAL_STATIC_LIBRARIES_32:=
-LOCAL_STATIC_LIBRARIES_64:=
-LOCAL_WHOLE_STATIC_LIBRARIES_32:=
-LOCAL_WHOLE_STATIC_LIBRARIES_64:=
-LOCAL_GENERATED_SOURCES_32:=
-LOCAL_GENERATED_SOURCES_64:=
-LOCAL_CFLAGS_32:=
-LOCAL_CFLAGS_64:=
-LOCAL_CPPFLAGS_32:=
-LOCAL_CPPFLAGS_64:=
-LOCAL_LDFLAGS_32:=
-LOCAL_LDFLAGS_64:=
 LOCAL_ASFLAGS_32:=
 LOCAL_ASFLAGS_64:=
+LOCAL_CFLAGS_32:=
+LOCAL_CFLAGS_64:=
+LOCAL_C_INCLUDES_32:=
+LOCAL_C_INCLUDES_64:=
+LOCAL_CLANG_32:=
+LOCAL_CLANG_64:=
+LOCAL_CLANG_ASFLAGS_32:=
+LOCAL_CLANG_ASFLAGS_64:=
 LOCAL_CLANG_CFLAGS_32:=
 LOCAL_CLANG_CFLAGS_64:=
 LOCAL_CLANG_CPPFLAGS_32:=
 LOCAL_CLANG_CPPFLAGS_64:=
 LOCAL_CLANG_LDFLAGS_32:=
 LOCAL_CLANG_LDFLAGS_64:=
-LOCAL_CLANG_ASFLAGS_32:=
-LOCAL_CLANG_ASFLAGS_64:=
-LOCAL_C_INCLUDES_32:=
-LOCAL_C_INCLUDES_64:=
+LOCAL_CPPFLAGS_32:=
+LOCAL_CPPFLAGS_64:=
+LOCAL_GENERATED_SOURCES_32:=
+LOCAL_GENERATED_SOURCES_64:=
+LOCAL_INIT_RC_32:=
+LOCAL_INIT_RC_64:=
+LOCAL_LDFLAGS_32:=
+LOCAL_LDFLAGS_64:=
 LOCAL_MODULE_PATH_32:=
 LOCAL_MODULE_PATH_64:=
 LOCAL_MODULE_STEM_32:=
 LOCAL_MODULE_STEM_64:=
-LOCAL_CLANG_32:=
-LOCAL_CLANG_64:=
-LOCAL_INIT_RC_32:=
-LOCAL_INIT_RC_64:=
 LOCAL_MODULE_SYMLINKS_32:=
 LOCAL_MODULE_SYMLINKS_64:=
-LOCAL_JAVA_LANGUAGE_VERSION:=
-LOCAL_IS_RUNTIME_RESOURCE_OVERLAY:=
-LOCAL_RRO_SKU:=
+LOCAL_SHARED_LIBRARIES_32:=
+LOCAL_SHARED_LIBRARIES_64:=
+LOCAL_SRC_FILES_32:=
+LOCAL_SRC_FILES_64:=
+LOCAL_SRC_FILES_EXCLUDE_32:=
+LOCAL_SRC_FILES_EXCLUDE_64:=
+LOCAL_STATIC_LIBRARIES_32:=
+LOCAL_STATIC_LIBRARIES_64:=
+LOCAL_WHOLE_STATIC_LIBRARIES_32:=
+LOCAL_WHOLE_STATIC_LIBRARIES_64:=
 
-LOCAL_IS_AUX_MODULE :=
-LOCAL_AUX_TOOLCHAIN :=
-LOCAL_AUX_OS :=
+# Aux specific variables
 LOCAL_AUX_ARCH :=
-LOCAL_AUX_SUBARCH :=
 LOCAL_AUX_CPU :=
+LOCAL_AUX_OS :=
 LOCAL_AUX_OS_VARIANT :=
+LOCAL_AUX_SUBARCH :=
+LOCAL_AUX_TOOLCHAIN :=
 LOCAL_CUSTOM_BUILD_STEP_INPUT:=
 LOCAL_CUSTOM_BUILD_STEP_OUTPUT:=
+LOCAL_IS_AUX_MODULE :=
 
 # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to
 # iterate over thousands of entries every time.
diff --git a/core/definitions.mk b/core/definitions.mk
index 698f52c..969260b 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -469,6 +469,20 @@
 endef
 
 ###########################################################
+## Find test data in a form required by LOCAL_TEST_DATA
+## $(1): the base dir, relative to the root of the source tree.
+## $(3): the file name pattern to be passed to find as "-name"
+## $(2): a list of subdirs of the base dir
+###########################################################
+
+define find-test-data-in-subdirs
+$(foreach f,$(sort $(patsubst ./%,%, \
+  $(shell cd $(1) ; \
+          find -L $(3) -type f -and -name $(2) -and -not -name ".*") \
+)),$(1):$(f))
+endef
+
+###########################################################
 ## Function we can evaluate to introduce a dynamic dependency
 ###########################################################
 
diff --git a/core/tasks/check_boot_jars/package_whitelist.txt b/core/tasks/check_boot_jars/package_whitelist.txt
index 601017b..ae69099 100644
--- a/core/tasks/check_boot_jars/package_whitelist.txt
+++ b/core/tasks/check_boot_jars/package_whitelist.txt
@@ -116,9 +116,11 @@
 
 
 ###################################################
-# core-junit.jar
+# legacy-test.jar
 junit\.extensions
 junit\.framework
+android\.test
+android\.test\.suitebuilder\.annotation
 
 
 ###################################################
diff --git a/target/product/embedded.mk b/target/product/embedded.mk
index 6bc6b62..78b61a6 100644
--- a/target/product/embedded.mk
+++ b/target/product/embedded.mk
@@ -87,14 +87,6 @@
     sepolicy \
     service_contexts
 
-# AID Generation for
-# <pwd.h> and <grp.h>
-PRODUCT_PACKAGES += \
-    passwd \
-    group \
-    fs_config_files \
-    fs_config_dirs
-
 # Ensure that this property is always defined so that bionic_systrace.cpp
 # can rely on it being initially set by init.
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
diff --git a/tools/fs_config/Android.mk b/tools/fs_config/Android.mk
index 3d784a7..fb4a0c4 100644
--- a/tools/fs_config/Android.mk
+++ b/tools/fs_config/Android.mk
@@ -72,19 +72,6 @@
 my_fs_config_h := $(LOCAL_PATH)/default/$(ANDROID_FS_CONFIG_H)
 endif
 
-# We only include targets for:
-# fs_config_files
-# fs_config_dirs
-# If TARGET_FS_CONFIG_GEN or TARGET_ANDROID_FILESYSTEM_CONFIG_H
-# is set.
-#
-# We only include targets for:
-# passwd
-# group
-# If TARGET_FS_CONFIG_GEN is set.
-#
-ifneq ($(TARGET_FS_CONFIG_GEN)$(TARGET_ANDROID_FILESYSTEM_CONFIG_H),)
-
 ##################################
 include $(CLEAR_VARS)
 LOCAL_SRC_FILES := fs_config_generate.c
@@ -94,35 +81,19 @@
 LOCAL_CFLAGS := -Werror -Wno-error=\#warnings
 
 ifneq ($(TARGET_FS_CONFIG_GEN),)
-system_android_filesystem_config := system/core/include/private/android_filesystem_config.h
-
-# Generate the "generated_oem_aid.h" file
-oem := $(local-generated-sources-dir)/generated_oem_aid.h
-$(oem): PRIVATE_LOCAL_PATH := $(LOCAL_PATH)
-$(oem): PRIVATE_TARGET_FS_CONFIG_GEN := $(TARGET_FS_CONFIG_GEN)
-$(oem): PRIVATE_ANDROID_FS_HDR := $(system_android_filesystem_config)
-$(oem): PRIVATE_CUSTOM_TOOL = $(PRIVATE_LOCAL_PATH)/fs_config_generator.py oemaid --aid-header=$(PRIVATE_ANDROID_FS_HDR) $(PRIVATE_TARGET_FS_CONFIG_GEN) > $@
-$(oem): $(TARGET_FS_CONFIG_GEN) $(LOCAL_PATH)/fs_config_generator.py
-	$(transform-generated-source)
-
-# Generate the fs_config header
 gen := $(local-generated-sources-dir)/$(ANDROID_FS_CONFIG_H)
 $(gen): PRIVATE_LOCAL_PATH := $(LOCAL_PATH)
 $(gen): PRIVATE_TARGET_FS_CONFIG_GEN := $(TARGET_FS_CONFIG_GEN)
-$(gen): PRIVATE_ANDROID_FS_HDR := $(system_android_filesystem_config)
-$(gen): PRIVATE_CUSTOM_TOOL = $(PRIVATE_LOCAL_PATH)/fs_config_generator.py fsconfig --aid-header=$(PRIVATE_ANDROID_FS_HDR) $(PRIVATE_TARGET_FS_CONFIG_GEN) > $@
-$(gen): $(TARGET_FS_CONFIG_GEN) $(system_android_filesystem_config) $(LOCAL_PATH)/fs_config_generator.py
+$(gen): PRIVATE_CUSTOM_TOOL = $(PRIVATE_LOCAL_PATH)/fs_config_generator.py $(PRIVATE_TARGET_FS_CONFIG_GEN) > $@
+$(gen): $(TARGET_FS_CONFIG_GEN) $(LOCAL_PATH)/fs_config_generator.py
 	$(transform-generated-source)
 
-LOCAL_GENERATED_SOURCES := $(oem) $(gen)
-
+LOCAL_GENERATED_SOURCES := $(gen)
 my_fs_config_h := $(gen)
-my_gen_oem_aid := $(oem)
 gen :=
-oem :=
 endif
 
-LOCAL_C_INCLUDES := $(dir $(my_fs_config_h)) $(dir $(my_gen_oem_aid))
+LOCAL_C_INCLUDES := $(dir $(my_fs_config_h))
 
 include $(BUILD_HOST_EXECUTABLE)
 fs_config_generate_bin := $(LOCAL_INSTALLED_MODULE)
@@ -151,62 +122,6 @@
 	@mkdir -p $(dir $@)
 	$< -F -o $@
 
-endif # TARGET_FS_CONFIG_GEN or TARGET_ANDROID_FILESYSTEM_CONFIG_H
-
-# The newer passwd/group targets are only generated if you
-# use the new TARGET_FS_CONFIG_GEN method.
-ifneq ($(TARGET_FS_CONFIG_GEN),)
-
-##################################
-# Build the oemaid library when fs config files are present.
-# Intentionally break build if you require generated AIDS
-# header file, but are not using any fs config files.
-include $(CLEAR_VARS)
-LOCAL_MODULE := liboemaids
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(dir $(my_gen_oem_aid))
-LOCAL_EXPORT_C_INCLUDE_DEPS := $(my_gen_oem_aid)
-include $(BUILD_STATIC_LIBRARY)
-
-##################################
-# Generate the system/etc/passwd text file for the target
-# This file may be empty if no AIDs are defined in
-# TARGET_FS_CONFIG_GEN files.
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := passwd
-LOCAL_MODULE_CLASS := ETC
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-$(LOCAL_BUILT_MODULE): PRIVATE_LOCAL_PATH := $(LOCAL_PATH)
-$(LOCAL_BUILT_MODULE): PRIVATE_TARGET_FS_CONFIG_GEN := $(TARGET_FS_CONFIG_GEN)
-$(LOCAL_BUILT_MODULE): PRIVATE_ANDROID_FS_HDR := $(system_android_filesystem_config)
-$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/fs_config_generator.py $(TARGET_FS_CONFIG_GEN) $(system_android_filesystem_config)
-	@mkdir -p $(dir $@)
-	$(hide) $< passwd --aid-header=$(PRIVATE_ANDROID_FS_HDR) $(PRIVATE_TARGET_FS_CONFIG_GEN) > $@
-
-##################################
-# Generate the system/etc/group text file for the target
-# This file may be empty if no AIDs are defined in
-# TARGET_FS_CONFIG_GEN files.
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := group
-LOCAL_MODULE_CLASS := ETC
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-$(LOCAL_BUILT_MODULE): PRIVATE_LOCAL_PATH := $(LOCAL_PATH)
-$(LOCAL_BUILT_MODULE): PRIVATE_TARGET_FS_CONFIG_GEN := $(TARGET_FS_CONFIG_GEN)
-$(LOCAL_BUILT_MODULE): PRIVATE_ANDROID_FS_HDR := $(system_android_filesystem_config)
-$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/fs_config_generator.py $(TARGET_FS_CONFIG_GEN) $(system_android_filesystem_config)
-	@mkdir -p $(dir $@)
-	$(hide) $< group --aid-header=$(PRIVATE_ANDROID_FS_HDR) $(PRIVATE_TARGET_FS_CONFIG_GEN) > $@
-
-system_android_filesystem_config :=
-endif
-
 ANDROID_FS_CONFIG_H :=
 my_fs_config_h :=
 fs_config_generate_bin :=
-my_gen_oem_aid :=
diff --git a/tools/fs_config/README b/tools/fs_config/README
index d884e32..0258687 100644
--- a/tools/fs_config/README
+++ b/tools/fs_config/README
@@ -50,12 +50,12 @@
   prefixed with a 0, else mode is used as is.
 
 user:
-  Either the C define for a valid AID or the friendly name. For instance both
-  AID_RADIO and radio are acceptable. Note custom AIDs can be defined in the
+  The exact, C define for a valid AID. Note custom AIDs can be defined in the
   AID section documented below.
 
 group:
-  Same as user.
+  The exact, C define for a valid AID. Note custom AIDs can be defined in the
+  AID section documented below.
 
 caps:
   The name as declared in
@@ -82,8 +82,7 @@
 Where:
 
 [AID_<name>]
-  The <name> can contain characters in the set uppercase, numbers
-  and underscores.
+  The <name> can be any valid character for a #define identifier in C.
 
 value:
   A valid C style number string. Hex, octal, binary and decimal are supported.
@@ -119,24 +118,3 @@
 representation of value is preserved. Both choices were made for maximum readability of the generated
 file and to line up files. Sync lines are placed with the source file as comments in the generated
 header file.
-
-For OEMs wishing to use the define AIDs in their native code, one can access the generated header
-file like so:
-  1. In your C code just #include "generated_oem_aid.h" and start using the declared identifiers.
-  2. In your Makefile add this static library like so: LOCAL_STATIC_LIBRARIES := liboemaids
-
-Unit Tests:
-
-From within the fs_config directory, unit tests can be executed like so:
-$ python -m unittest test_fs_config_generator.Tests
-.............
-----------------------------------------------------------------------
-Ran 13 tests in 0.004s
-
-OK
-
-One could also use nose if they would like:
-$ nose2
-
-To add new tests, simply add a test_<xxx> method to the test class. It will automatically
-get picked up and added to the test suite.
diff --git a/tools/fs_config/default/android_filesystem_config.h b/tools/fs_config/default/android_filesystem_config.h
index b7d936a..820b04a 100644
--- a/tools/fs_config/default/android_filesystem_config.h
+++ b/tools/fs_config/default/android_filesystem_config.h
@@ -19,6 +19,13 @@
 ** by the device side of adb.
 */
 
+/*
+** Resorting to the default file means someone requested fs_config_dirs or
+** fs_config_files in their device configuration without providing an
+** associated header.
+*/
+#warning No device-supplied android_filesystem_config.h, using empty default.
+
 /* Rules for directories.
 ** These rules are applied based on "first match", so they
 ** should start with the most specific path and work their
diff --git a/tools/fs_config/fs_config_generator.py b/tools/fs_config/fs_config_generator.py
index 8609657..6a16fea 100755
--- a/tools/fs_config/fs_config_generator.py
+++ b/tools/fs_config/fs_config_generator.py
@@ -1,1317 +1,294 @@
 #!/usr/bin/env python
-"""Generates config files for Android file system properties.
 
-This script is used for generating configuration files for configuring
-Android filesystem properties. Internally, its composed of a plug-able
-interface to support the understanding of new input and output parameters.
-
-Run the help for a list of supported plugins and their capabilities.
-
-Further documentation can be found in the README.
-"""
-
-import argparse
 import ConfigParser
 import re
 import sys
-import textwrap
-
-# Keep the tool in one file to make it easy to run.
-# pylint: disable=too-many-lines
 
 
-# Lowercase generator used to be inline with @staticmethod.
-class generator(object):  # pylint: disable=invalid-name
-    """A decorator class to add commandlet plugins.
+GENERATED = '''
+/*
+ * THIS IS AN AUTOGENERATED FILE! DO NOT MODIFY
+ */
+'''
 
-    Used as a decorator to classes to add them to
-    the internal plugin interface. Plugins added
-    with @generator() are automatically added to
-    the command line.
+INCLUDE = '#include <private/android_filesystem_config.h>'
 
-    For instance, to add a new generator
-    called foo and have it added just do this:
+DEFINE_NO_DIRS = '#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS\n'
+DEFINE_NO_FILES = '#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES\n'
 
-        @generator("foo")
-        class FooGen(object):
-            ...
-    """
-    _generators = {}
+DEFAULT_WARNING = '#warning No device-supplied android_filesystem_config.h, using empty default.'
 
-    def __init__(self, gen):
-        """
-        Args:
-            gen (str): The name of the generator to add.
+NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS_ENTRY = '{ 00000, AID_ROOT,      AID_ROOT,      0, "system/etc/fs_config_dirs" },'
+NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES_ENTRY = '{ 00000, AID_ROOT,      AID_ROOT,      0, "system/etc/fs_config_files" },'
 
-        Raises:
-            ValueError: If there is a similarly named generator already added.
+IFDEF_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS = '#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS'
+ENDIF = '#endif'
 
-        """
-        self._gen = gen
+OPEN_FILE_STRUCT = 'static const struct fs_path_config android_device_files[] = {'
+OPEN_DIR_STRUCT = 'static const struct fs_path_config android_device_dirs[] = {'
+CLOSE_FILE_STRUCT = '};'
 
-        if gen in generator._generators:
-            raise ValueError('Duplicate generator name: ' + gen)
+GENERIC_DEFINE = "#define %s\t%s"
 
-        generator._generators[gen] = None
+FILE_COMMENT = '// Defined in file: \"%s\"'
 
-    def __call__(self, cls):
-
-        generator._generators[self._gen] = cls()
-        return cls
-
-    @staticmethod
-    def get():
-        """Gets the list of generators.
-
-        Returns:
-           The list of registered generators.
-        """
-        return generator._generators
+# from system/core/include/private/android_filesystem_config.h
+AID_OEM_RESERVED_RANGES = [
+    (2900, 2999),
+    (5000, 5999),
+]
 
 
-class Utils(object):
-    """Various assorted static utilities."""
+AID_MATCH = re.compile('AID_[a-zA-Z]+')
 
-    @staticmethod
-    def in_any_range(value, ranges):
-        """Tests if a value is in a list of given closed range tuples.
+def handle_aid(file_name, section_name, config, aids, seen_aids):
+    value = config.get(section_name, 'value')
 
-        A range tuple is a closed range. That means it's inclusive of its
-        start and ending values.
+    errmsg = '%s for: \"' + section_name + '" file: \"' + file_name + '\"'
 
-        Args:
-            value (int): The value to test.
-            range [(int, int)]: The closed range list to test value within.
+    if not value:
+        raise Exception(errmsg % 'Found specified but unset "value"')
 
-        Returns:
-            True if value is within the closed range, false otherwise.
-        """
+    v = convert_int(value)
+    if not v:
+        raise Exception(errmsg % ('Invalid "value", not a number, got: \"%s\"' % value))
 
-        return any(lower <= value <= upper for (lower, upper) in ranges)
+    # Values must be within OEM range
+    if not any(lower <= v <= upper for (lower, upper) in AID_OEM_RESERVED_RANGES):
+        s = '"value" not in valid range %s, got: %s'
+        s = s % (str(AID_OEM_RESERVED_RANGES), value)
+        raise Exception(errmsg % s)
 
-    @staticmethod
-    def get_login_and_uid_cleansed(aid):
-        """Returns a passwd/group file safe logon and uid.
+    # use the normalized int value in the dict and detect
+    # duplicate definitions of the same vallue
+    v = str(v)
+    if v in seen_aids[1]:
+        # map of value to aid name
+        a = seen_aids[1][v]
 
-        This checks that the logon and uid of the AID do not
-        contain the delimiter ":" for a passwd/group file.
+        # aid name to file
+        f = seen_aids[0][a]
 
-        Args:
-            aid (AID): The aid to check
+        s = 'Duplicate AID value "%s" found on AID: "%s".' % (value, seen_aids[1][v])
+        s += ' Previous found in file: "%s."' % f
+        raise Exception(errmsg % s)
 
-        Returns:
-            logon, uid of the AID after checking its safe.
+    seen_aids[1][v] = section_name
 
-        Raises:
-            ValueError: If there is a delimiter charcter found.
-        """
-        logon = aid.friendly
-        uid = aid.normalized_value
-        if ':' in uid:
-            raise ValueError(
-                'Cannot specify delimiter character ":" in uid: "%s"' % uid)
-        if ':' in logon:
-            raise ValueError(
-                'Cannot specify delimiter character ":" in logon: "%s"' % logon)
-        return logon, uid
+    # Append a tuple of (AID_*, base10(value), str(value))
+    # We keep the str version of value so we can print that out in the
+    # generated header so investigating parties can identify parts.
+    # We store the base10 value for sorting, so everything is ascending
+    # later.
+    aids.append((file_name, section_name, v, value))
 
-
-class AID(object):
-    """This class represents an Android ID or an AID.
-
-    Attributes:
-        identifier (str): The identifier name for a #define.
-        value (str) The User Id (uid) of the associate define.
-        found (str) The file it was found in, can be None.
-        normalized_value (str): Same as value, but base 10.
-        friendly (str): The friendly name of aid.
-    """
-
-    PREFIX = 'AID_'
-
-    # Some of the AIDS like AID_MEDIA_EX had names like mediaex
-    # list a map of things to fixup until we can correct these
-    # at a later date.
-    _FIXUPS = {
-        'media_drm': 'mediadrm',
-        'media_ex': 'mediaex',
-        'media_codec': 'mediacodec'
-    }
-
-    def __init__(self, identifier, value, found):
-        """
-        Args:
-            identifier: The identifier name for a #define <identifier>.
-            value: The value of the AID, aka the uid.
-            found (str): The file found in, not required to be specified.
-
-        Raises:
-            ValueError: if value is not a valid string number as processed by
-                int(x, 0)
-        """
-        self.identifier = identifier
-        self.value = value
-        self.found = found
-        self.normalized_value = str(int(value, 0))
-
-        # Where we calculate the friendly name
-        friendly = identifier[len(AID.PREFIX):].lower()
-        self.friendly = AID._fixup_friendly(friendly)
-
-    def __eq__(self, other):
-
-        return self.identifier == other.identifier \
-            and self.value == other.value and self.found == other.found \
-            and self.normalized_value == other.normalized_value
-
-    @staticmethod
-    def is_friendly(name):
-        """Determines if an AID is a freindly name or C define.
-
-        For example if name is AID_SYSTEM it returns false, if name
-        was system, it would return true.
-
-        Returns:
-            True if name is a friendly name False otherwise.
-        """
-
-        return not name.startswith(AID.PREFIX)
-
-    @staticmethod
-    def _fixup_friendly(friendly):
-        """Fixup friendly names that historically don't follow the convention.
-
-        Args:
-            friendly (str): The friendly name.
-
-        Returns:
-            The fixedup friendly name as a str.
-        """
-
-        if friendly in AID._FIXUPS:
-            return AID._FIXUPS[friendly]
-
-        return friendly
-
-
-class FSConfig(object):
-    """Represents a filesystem config array entry.
-
-    Represents a file system configuration entry for specifying
-    file system capabilities.
-
-    Attributes:
-        mode (str): The mode of the file or directory.
-        user (str): The uid or #define identifier (AID_SYSTEM)
-        group (str): The gid or #define identifier (AID_SYSTEM)
-        caps (str): The capability set.
-        filename (str): The file it was found in.
-    """
-
-    def __init__(self, mode, user, group, caps, path, filename):
-        """
-        Args:
-            mode (str): The mode of the file or directory.
-            user (str): The uid or #define identifier (AID_SYSTEM)
-            group (str): The gid or #define identifier (AID_SYSTEM)
-            caps (str): The capability set as a list.
-            filename (str): The file it was found in.
-        """
-        self.mode = mode
-        self.user = user
-        self.group = group
-        self.caps = caps
-        self.path = path
-        self.filename = filename
-
-    def __eq__(self, other):
-
-        return self.mode == other.mode and self.user == other.user \
-            and self.group == other.group and self.caps == other.caps \
-            and self.path == other.path and self.filename == other.filename
-
-
-class AIDHeaderParser(object):
-    """Parses an android_filesystem_config.h file.
-
-    Parses a C header file and extracts lines starting with #define AID_<name>
-    It provides some basic sanity checks. The information extracted from this
-    file can later be used to sanity check other things (like oem ranges) as
-    well as generating a mapping of names to uids. It was primarily designed to
-    parse the private/android_filesystem_config.h, but any C header should
-    work.
-    """
-
-    _SKIPWORDS = ['UNUSED']
-    _AID_DEFINE = re.compile(r'\s*#define\s+%s.*' % AID.PREFIX)
-    _OEM_START_KW = 'START'
-    _OEM_END_KW = 'END'
-    _OEM_RANGE = re.compile('AID_OEM_RESERVED_[0-9]*_{0,1}(%s|%s)' %
-                            (_OEM_START_KW, _OEM_END_KW))
-
-    def __init__(self, aid_header):
-        """
-        Args:
-            aid_header (str): file name for the header
-                file containing AID entries.
-        """
-        self._aid_header = aid_header
-        self._aid_name_to_value = {}
-        self._aid_value_to_name = {}
-        self._oem_ranges = {}
-
-        with open(aid_header) as open_file:
-            self._parse(open_file)
+def convert_int(num):
 
         try:
-            self._process_and_check()
-        except ValueError as exception:
-            sys.exit('Error processing parsed data: "%s"' % (str(exception)))
-
-    def _parse(self, aid_file):
-        """Parses an AID header file. Internal use only.
-
-        Args:
-            aid_file (file): The open AID header file to parse.
-        """
-
-        for lineno, line in enumerate(aid_file):
-            def error_message(msg):
-                """Creates an error message with the current parsing state."""
-                return 'Error "{}" in file: "{}" on line: {}'.format(
-                    msg, self._aid_header, str(lineno))
-
-            if AIDHeaderParser._AID_DEFINE.match(line):
-                chunks = line.split()
-
-                if any(x in chunks[1] for x in AIDHeaderParser._SKIPWORDS):
-                    continue
-
-                identifier = chunks[1]
-                value = chunks[2]
-
-                try:
-                    if AIDHeaderParser._is_oem_range(identifier):
-                        self._handle_oem_range(identifier, value)
-                    else:
-                        self._handle_aid(identifier, value)
-                except ValueError as exception:
-                    sys.exit(error_message(
-                        '{} for "{}"'.format(exception, identifier)))
-
-    def _handle_aid(self, identifier, value):
-        """Handle an AID C #define.
-
-        Handles an AID, sanity checking, generating the friendly name and
-        adding it to the internal maps. Internal use only.
-
-        Args:
-            identifier (str): The name of the #define identifier. ie AID_FOO.
-            value (str): The value associated with the identifier.
-
-        Raises:
-            ValueError: With message set to indicate the error.
-        """
-
-        aid = AID(identifier, value, self._aid_header)
-
-        # duplicate name
-        if aid.friendly in self._aid_name_to_value:
-            raise ValueError('Duplicate aid "%s"' % identifier)
-
-        if value in self._aid_value_to_name:
-            raise ValueError('Duplicate aid value "%u" for %s' % value,
-                             identifier)
-
-        self._aid_name_to_value[aid.friendly] = aid
-        self._aid_value_to_name[value] = aid.friendly
-
-    def _handle_oem_range(self, identifier, value):
-        """Handle an OEM range C #define.
-
-        When encountering special AID defines, notably for the OEM ranges
-        this method handles sanity checking and adding them to the internal
-        maps. For internal use only.
-
-        Args:
-            identifier (str): The name of the #define identifier.
-                ie AID_OEM_RESERVED_START/END.
-            value (str): The value associated with the identifier.
-
-        Raises:
-            ValueError: With message set to indicate the error.
-        """
-
-        try:
-            int_value = int(value, 0)
+            if num.startswith('0x'):
+                return int(num, 16)
+            elif num.startswith('0b'):
+                return int(num, 2)
+            elif num.startswith('0'):
+                return int(num, 8)
+            else:
+                return int(num, 10)
         except ValueError:
-            raise ValueError(
-                'Could not convert "%s" to integer value, got: "%s"' %
-                (identifier, value))
+            pass
+        return None
 
-        # convert AID_OEM_RESERVED_START or AID_OEM_RESERVED_<num>_START
-        # to AID_OEM_RESERVED or AID_OEM_RESERVED_<num>
-        is_start = identifier.endswith(AIDHeaderParser._OEM_START_KW)
+def handle_path(file_name, section_name, config, files, dirs):
 
-        if is_start:
-            tostrip = len(AIDHeaderParser._OEM_START_KW)
-        else:
-            tostrip = len(AIDHeaderParser._OEM_END_KW)
+            mode = config.get(section_name, 'mode')
+            user = config.get(section_name, 'user')
+            group = config.get(section_name, 'group')
+            caps = config.get(section_name, 'caps')
 
-        # ending _
-        tostrip = tostrip + 1
+            errmsg = 'Found specified but unset option: \"%s" in file: \"' + file_name + '\"'
 
-        strip = identifier[:-tostrip]
-        if strip not in self._oem_ranges:
-            self._oem_ranges[strip] = []
+            if not mode:
+                raise Exception(errmsg % 'mode')
 
-        if len(self._oem_ranges[strip]) > 2:
-            raise ValueError('Too many same OEM Ranges "%s"' % identifier)
+            if not user:
+                raise Exception(errmsg % 'user')
 
-        if len(self._oem_ranges[strip]) == 1:
-            tmp = self._oem_ranges[strip][0]
+            if not group:
+                raise Exception(errmsg % 'group')
 
-            if tmp == int_value:
-                raise ValueError('START and END values equal %u' % int_value)
-            elif is_start and tmp < int_value:
-                raise ValueError('END value %u less than START value %u' %
-                                 (tmp, int_value))
-            elif not is_start and tmp > int_value:
-                raise ValueError('END value %u less than START value %u' %
-                                 (int_value, tmp))
+            if not caps:
+                raise Exception(errmsg % 'caps')
 
-        # Add START values to the head of the list and END values at the end.
-        # Thus, the list is ordered with index 0 as START and index 1 as END.
-        if is_start:
-            self._oem_ranges[strip].insert(0, int_value)
-        else:
-            self._oem_ranges[strip].append(int_value)
+            caps = caps.split()
 
-    def _process_and_check(self):
-        """Process, check and populate internal data structures.
+            tmp = []
+            for x in caps:
+                if convert_int(x):
+                    tmp.append('(' + x + ')')
+                else:
+                    tmp.append('(1ULL << CAP_' + x.upper() + ')')
 
-        After parsing and generating the internal data structures, this method
-        is responsible for sanity checking ALL of the acquired data.
+            caps = tmp
 
-        Raises:
-            ValueError: With the message set to indicate the specific error.
-        """
+            path = '"' + section_name + '"'
 
-        # tuplefy the lists since range() does not like them mutable.
-        self._oem_ranges = [
-            AIDHeaderParser._convert_lst_to_tup(k, v)
-            for k, v in self._oem_ranges.iteritems()
-        ]
+            if len(mode) == 3:
+                mode = '0' + mode
 
-        # Check for overlapping ranges
-        for i, range1 in enumerate(self._oem_ranges):
-            for range2 in self._oem_ranges[i + 1:]:
-                if AIDHeaderParser._is_overlap(range1, range2):
-                    raise ValueError("Overlapping OEM Ranges found %s and %s" %
-                                     (str(range1), str(range2)))
+            try:
+                int(mode, 8)
+            except:
+                raise Exception('Mode must be octal characters, got: "' + mode + '"')
 
-        # No core AIDs should be within any oem range.
-        for aid in self._aid_value_to_name:
-
-            if Utils.in_any_range(aid, self._oem_ranges):
-                name = self._aid_value_to_name[aid]
-                raise ValueError(
-                    'AID "%s" value: %u within reserved OEM Range: "%s"' %
-                    (name, aid, str(self._oem_ranges)))
-
-    @property
-    def oem_ranges(self):
-        """Retrieves the OEM closed ranges as a list of tuples.
-
-        Returns:
-            A list of closed range tuples: [ (0, 42), (50, 105) ... ]
-        """
-        return self._oem_ranges
-
-    @property
-    def aids(self):
-        """Retrieves the list of found AIDs.
-
-        Returns:
-            A list of AID() objects.
-        """
-        return self._aid_name_to_value.values()
-
-    @staticmethod
-    def _convert_lst_to_tup(name, lst):
-        """Converts a mutable list to a non-mutable tuple.
-
-        Used ONLY for ranges and thus enforces a length of 2.
-
-        Args:
-            lst (List): list that should be "tuplefied".
-
-        Raises:
-            ValueError if lst is not a list or len is not 2.
-
-        Returns:
-            Tuple(lst)
-        """
-        if not lst or len(lst) != 2:
-            raise ValueError('Mismatched range for "%s"' % name)
-
-        return tuple(lst)
-
-    @staticmethod
-    def _is_oem_range(aid):
-        """Detects if a given aid is within the reserved OEM range.
-
-        Args:
-            aid (int): The aid to test
-
-        Returns:
-            True if it is within the range, False otherwise.
-        """
-
-        return AIDHeaderParser._OEM_RANGE.match(aid)
-
-    @staticmethod
-    def _is_overlap(range_a, range_b):
-        """Calculates the overlap of two range tuples.
-
-        A range tuple is a closed range. A closed range includes its endpoints.
-        Note that python tuples use () notation which collides with the
-        mathematical notation for open ranges.
-
-        Args:
-            range_a: The first tuple closed range eg (0, 5).
-            range_b: The second tuple closed range eg (3, 7).
-
-        Returns:
-            True if they overlap, False otherwise.
-        """
-
-        return max(range_a[0], range_b[0]) <= min(range_a[1], range_b[1])
+            if len(mode) != 4:
+                raise Exception('Mode must be 3 or 4 characters, got: "' + mode + '"')
 
 
-class FSConfigFileParser(object):
-    """Parses a config.fs ini format file.
+            caps = '|'.join(caps)
 
-    This class is responsible for parsing the config.fs ini format files.
-    It collects and checks all the data in these files and makes it available
-    for consumption post processed.
-    """
+            x = [ mode, user, group, caps, section_name ]
+            if section_name[-1] == '/':
+                dirs.append((file_name, x))
+            else:
+                files.append((file_name, x))
 
-    # These _AID vars work together to ensure that an AID section name
-    # cannot contain invalid characters for a C define or a passwd/group file.
-    # Since _AID_PREFIX is within the set of _AID_MATCH the error logic only
-    # checks end, if you change this, you may have to update the error
-    # detection code.
-    _AID_MATCH = re.compile('%s[A-Z0-9_]+' % AID.PREFIX)
-    _AID_ERR_MSG = 'Expecting upper case, a number or underscore'
+def handle_dup(name, file_name, section_name, seen):
+        if section_name in seen:
+            dups = '"' + seen[section_name] + '" and '
+            dups += file_name
+            raise Exception('Duplicate ' + name + ' "' + section_name + '" found in files: ' + dups)
 
-    # list of handler to required options, used to identify the
-    # parsing section
-    _SECTIONS = [('_handle_aid', ('value',)),
-                 ('_handle_path', ('mode', 'user', 'group', 'caps'))]
-
-    def __init__(self, config_files, oem_ranges):
-        """
-        Args:
-            config_files ([str]): The list of config.fs files to parse.
-                Note the filename is not important.
-            oem_ranges ([(),()]): range tuples indicating reserved OEM ranges.
-        """
-
-        self._files = []
-        self._dirs = []
-        self._aids = []
-
-        self._seen_paths = {}
-        # (name to file, value to aid)
-        self._seen_aids = ({}, {})
-
-        self._oem_ranges = oem_ranges
-
-        self._config_files = config_files
-
-        for config_file in self._config_files:
-            self._parse(config_file)
-
-    def _parse(self, file_name):
-        """Parses and verifies config.fs files. Internal use only.
-
-        Args:
-            file_name (str): The config.fs (PythonConfigParser file format)
-                file to parse.
-
-        Raises:
-            Anything raised by ConfigParser.read()
-        """
-
-        # Separate config parsers for each file found. If you use
-        # read(filenames...) later files can override earlier files which is
-        # not what we want. Track state across files and enforce with
-        # _handle_dup(). Note, strict ConfigParser is set to true in
-        # Python >= 3.2, so in previous versions same file sections can
-        # override previous
-        # sections.
+def parse(file_name, files, dirs, aids, seen_paths, seen_aids):
 
         config = ConfigParser.ConfigParser()
         config.read(file_name)
 
-        for section in config.sections():
+        for s in config.sections():
 
-            found = False
+            if AID_MATCH.match(s) and config.has_option(s, 'value'):
+                handle_dup('AID', file_name, s, seen_aids[0])
+                seen_aids[0][s] = file_name
+                handle_aid(file_name, s, config, aids, seen_aids)
+            else:
+                handle_dup('path', file_name, s, seen_paths)
+                seen_paths[s] = file_name
+                handle_path(file_name, s, config, files, dirs)
 
-            for test in FSConfigFileParser._SECTIONS:
-                handler = test[0]
-                options = test[1]
+def generate(files, dirs, aids):
+    print GENERATED
+    print INCLUDE
+    print
 
-                if all([config.has_option(section, item) for item in options]):
-                    handler = getattr(self, handler)
-                    handler(file_name, section, config)
-                    found = True
-                    break
+    are_dirs = len(dirs) > 0
+    are_files = len(files) > 0
+    are_aids = len(aids) > 0
 
-            if not found:
-                sys.exit('Invalid section "%s" in file: "%s"' %
-                         (section, file_name))
-
-            # sort entries:
-            # * specified path before prefix match
-            # ** ie foo before f*
-            # * lexicographical less than before other
-            # ** ie boo before foo
-            # Given these paths:
-            # paths=['ac', 'a', 'acd', 'an', 'a*', 'aa', 'ac*']
-            # The sort order would be:
-            # paths=['a', 'aa', 'ac', 'acd', 'an', 'ac*', 'a*']
-            # Thus the fs_config tools will match on specified paths before
-            # attempting prefix, and match on the longest matching prefix.
-            self._files.sort(key=FSConfigFileParser._file_key)
-
-            # sort on value of (file_name, name, value, strvalue)
-            # This is only cosmetic so AIDS are arranged in ascending order
-            # within the generated file.
-            self._aids.sort(key=lambda item: item.normalized_value)
-
-    def _handle_aid(self, file_name, section_name, config):
-        """Verifies an AID entry and adds it to the aid list.
-
-        Calls sys.exit() with a descriptive message of the failure.
-
-        Args:
-            file_name (str): The filename of the config file being parsed.
-            section_name (str): The section name currently being parsed.
-            config (ConfigParser): The ConfigParser section being parsed that
-                the option values will come from.
-        """
-
-        def error_message(msg):
-            """Creates an error message with current parsing state."""
-            return '{} for: "{}" file: "{}"'.format(msg, section_name,
-                                                    file_name)
-
-        FSConfigFileParser._handle_dup_and_add('AID', file_name, section_name,
-                                               self._seen_aids[0])
-
-        match = FSConfigFileParser._AID_MATCH.match(section_name)
-        invalid = match.end() if match else len(AID.PREFIX)
-        if invalid != len(section_name):
-            tmp_errmsg = ('Invalid characters in AID section at "%d" for: "%s"'
-                          % (invalid, FSConfigFileParser._AID_ERR_MSG))
-            sys.exit(error_message(tmp_errmsg))
-
-        value = config.get(section_name, 'value')
-
-        if not value:
-            sys.exit(error_message('Found specified but unset "value"'))
-
-        try:
-            aid = AID(section_name, value, file_name)
-        except ValueError:
-            sys.exit(
-                error_message('Invalid "value", not aid number, got: \"%s\"' %
-                              value))
-
-        # Values must be within OEM range
-        if not Utils.in_any_range(int(aid.value, 0), self._oem_ranges):
-            emsg = '"value" not in valid range %s, got: %s'
-            emsg = emsg % (str(self._oem_ranges), value)
-            sys.exit(error_message(emsg))
-
-        # use the normalized int value in the dict and detect
-        # duplicate definitions of the same value
-        FSConfigFileParser._handle_dup_and_add(
-            'AID', file_name, aid.normalized_value, self._seen_aids[1])
-
-        # Append aid tuple of (AID_*, base10(value), _path(value))
-        # We keep the _path version of value so we can print that out in the
-        # generated header so investigating parties can identify parts.
-        # We store the base10 value for sorting, so everything is ascending
-        # later.
-        self._aids.append(aid)
-
-    def _handle_path(self, file_name, section_name, config):
-        """Add a file capability entry to the internal list.
-
-        Handles a file capability entry, verifies it, and adds it to
-        to the internal dirs or files list based on path. If it ends
-        with a / its a dir. Internal use only.
-
-        Calls sys.exit() on any validation error with message set.
-
-        Args:
-            file_name (str): The current name of the file being parsed.
-            section_name (str): The name of the section to parse.
-            config (str): The config parser.
-        """
-
-        FSConfigFileParser._handle_dup_and_add('path', file_name, section_name,
-                                               self._seen_paths)
-
-        mode = config.get(section_name, 'mode')
-        user = config.get(section_name, 'user')
-        group = config.get(section_name, 'group')
-        caps = config.get(section_name, 'caps')
-
-        errmsg = ('Found specified but unset option: \"%s" in file: \"' +
-                  file_name + '\"')
-
-        if not mode:
-            sys.exit(errmsg % 'mode')
-
-        if not user:
-            sys.exit(errmsg % 'user')
-
-        if not group:
-            sys.exit(errmsg % 'group')
-
-        if not caps:
-            sys.exit(errmsg % 'caps')
-
-        caps = caps.split()
-
-        tmp = []
-        for cap in caps:
-            try:
-                # test if string is int, if it is, use as is.
-                int(cap, 0)
-                tmp.append('(' + cap + ')')
-            except ValueError:
-                tmp.append('(1ULL << CAP_' + cap.upper() + ')')
-
-        caps = tmp
-
-        if len(mode) == 3:
-            mode = '0' + mode
-
-        try:
-            int(mode, 8)
-        except ValueError:
-            sys.exit('Mode must be octal characters, got: "%s"' % mode)
-
-        if len(mode) != 4:
-            sys.exit('Mode must be 3 or 4 characters, got: "%s"' % mode)
-
-        caps_str = '|'.join(caps)
-
-        entry = FSConfig(mode, user, group, caps_str, section_name, file_name)
-        if section_name[-1] == '/':
-            self._dirs.append(entry)
-        else:
-            self._files.append(entry)
-
-    @property
-    def files(self):
-        """Get the list of FSConfig file entries.
-
-        Returns:
-             a list of FSConfig() objects for file paths.
-        """
-        return self._files
-
-    @property
-    def dirs(self):
-        """Get the list of FSConfig dir entries.
-
-        Returns:
-            a list of FSConfig() objects for directory paths.
-        """
-        return self._dirs
-
-    @property
-    def aids(self):
-        """Get the list of AID entries.
-
-        Returns:
-            a list of AID() objects.
-        """
-        return self._aids
-
-    @staticmethod
-    def _file_key(fs_config):
-        """Used as the key paramter to sort.
-
-        This is used as a the function to the key parameter of a sort.
-        it wraps the string supplied in a class that implements the
-        appropriate __lt__ operator for the sort on path strings. See
-        StringWrapper class for more details.
-
-        Args:
-            fs_config (FSConfig): A FSConfig entry.
-
-        Returns:
-            A StringWrapper object
-        """
-
-        # Wrapper class for custom prefix matching strings
-        class StringWrapper(object):
-            """Wrapper class used for sorting prefix strings.
-
-            The algorithm is as follows:
-              - specified path before prefix match
-                - ie foo before f*
-              - lexicographical less than before other
-                - ie boo before foo
-
-            Given these paths:
-            paths=['ac', 'a', 'acd', 'an', 'a*', 'aa', 'ac*']
-            The sort order would be:
-            paths=['a', 'aa', 'ac', 'acd', 'an', 'ac*', 'a*']
-            Thus the fs_config tools will match on specified paths before
-            attempting prefix, and match on the longest matching prefix.
-            """
-
-            def __init__(self, path):
-                """
-                Args:
-                    path (str): the path string to wrap.
-                """
-                self.is_prefix = path[-1] == '*'
-                if self.is_prefix:
-                    self.path = path[:-1]
-                else:
-                    self.path = path
-
-            def __lt__(self, other):
-
-                # if were both suffixed the smallest string
-                # is 'bigger'
-                if self.is_prefix and other.is_prefix:
-                    result = len(self.path) > len(other.path)
-                # If I am an the suffix match, im bigger
-                elif self.is_prefix:
-                    result = False
-                # If other is the suffix match, he's bigger
-                elif other.is_prefix:
-                    result = True
-                # Alphabetical
-                else:
-                    result = self.path < other.path
-                return result
-
-        return StringWrapper(fs_config.path)
-
-    @staticmethod
-    def _handle_dup_and_add(name, file_name, section_name, seen):
-        """Tracks and detects duplicates. Internal use only.
-
-        Calls sys.exit() on a duplicate.
-
-        Args:
-            name (str): The name to use in the error reporting. The pretty
-                name for the section.
-            file_name (str): The file currently being parsed.
-            section_name (str): The name of the section. This would be path
-                or identifier depending on what's being parsed.
-            seen (dict): The dictionary of seen things to check against.
-        """
-        if section_name in seen:
-            dups = '"' + seen[section_name] + '" and '
-            dups += file_name
-            sys.exit('Duplicate %s "%s" found in files: %s' %
-                     (name, section_name, dups))
-
-        seen[section_name] = file_name
-
-
-class BaseGenerator(object):
-    """Interface for Generators.
-
-    Base class for generators, generators should implement
-    these method stubs.
-    """
-
-    def add_opts(self, opt_group):
-        """Used to add per-generator options to the command line.
-
-        Args:
-            opt_group (argument group object): The argument group to append to.
-                See the ArgParse docs for more details.
-        """
-
-        raise NotImplementedError("Not Implemented")
-
-    def __call__(self, args):
-        """This is called to do whatever magic the generator does.
-
-        Args:
-            args (dict): The arguments from ArgParse as a dictionary.
-                ie if you specified an argument of foo in add_opts, access
-                it via args['foo']
-        """
-
-        raise NotImplementedError("Not Implemented")
-
-
-@generator('fsconfig')
-class FSConfigGen(BaseGenerator):
-    """Generates the android_filesystem_config.h file.
-
-    Output is  used in generating fs_config_files and fs_config_dirs.
-    """
-
-    _GENERATED = textwrap.dedent("""\
-        /*
-         * THIS IS AN AUTOGENERATED FILE! DO NOT MODIFY
-         */
-        """)
-
-    _INCLUDES = [
-        '<private/android_filesystem_config.h>', '"generated_oem_aid.h"'
-    ]
-
-    _DEFINE_NO_DIRS = '#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS'
-    _DEFINE_NO_FILES = '#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES'
-
-    _DEFAULT_WARNING = (
-        '#warning No device-supplied android_filesystem_config.h,'
-        ' using empty default.')
-
-    # Long names.
-    # pylint: disable=invalid-name
-    _NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS_ENTRY = (
-        '{ 00000, AID_ROOT, AID_ROOT, 0,'
-        '"system/etc/fs_config_dirs" },')
-
-    _NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES_ENTRY = (
-        '{ 00000, AID_ROOT, AID_ROOT, 0,'
-        '"system/etc/fs_config_files" },')
-
-    _IFDEF_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS = (
-        '#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS')
-    # pylint: enable=invalid-name
-
-    _ENDIF = '#endif'
-
-    _OPEN_FILE_STRUCT = (
-        'static const struct fs_path_config android_device_files[] = {')
-
-    _OPEN_DIR_STRUCT = (
-        'static const struct fs_path_config android_device_dirs[] = {')
-
-    _CLOSE_FILE_STRUCT = '};'
-
-    _GENERIC_DEFINE = "#define %s\t%s"
-
-    _FILE_COMMENT = '// Defined in file: \"%s\"'
-
-    def __init__(self, *args, **kwargs):
-        BaseGenerator.__init__(args, kwargs)
-
-        self._oem_parser = None
-        self._base_parser = None
-        self._friendly_to_aid = None
-
-    def add_opts(self, opt_group):
-
-        opt_group.add_argument(
-            'fsconfig', nargs='+', help='The list of fsconfig files to parse')
-
-        opt_group.add_argument(
-            '--aid-header',
-            required=True,
-            help='An android_filesystem_config.h file'
-            ' to parse AIDs and OEM Ranges from')
-
-    def __call__(self, args):
-
-        self._base_parser = AIDHeaderParser(args['aid_header'])
-        self._oem_parser = FSConfigFileParser(args['fsconfig'],
-                                              self._base_parser.oem_ranges)
-        base_aids = self._base_parser.aids
-        oem_aids = self._oem_parser.aids
-
-        # Detect name collisions on AIDs. Since friendly works as the
-        # identifier for collision testing and we need friendly later on for
-        # name resolution, just calculate and use friendly.
-        # {aid.friendly: aid for aid in base_aids}
-        base_friendly = {aid.friendly: aid for aid in base_aids}
-        oem_friendly = {aid.friendly: aid for aid in oem_aids}
-
-        base_set = set(base_friendly.keys())
-        oem_set = set(oem_friendly.keys())
-
-        common = base_set & oem_set
-
-        if len(common) > 0:
-            emsg = 'Following AID Collisions detected for: \n'
-            for friendly in common:
-                base = base_friendly[friendly]
-                oem = oem_friendly[friendly]
-                emsg += (
-                    'Identifier: "%s" Friendly Name: "%s" '
-                    'found in file "%s" and "%s"' %
-                    (base.identifier, base.friendly, base.found, oem.found))
-                sys.exit(emsg)
-
-        self._friendly_to_aid = oem_friendly
-        self._friendly_to_aid.update(base_friendly)
-
-        self._generate()
-
-    def _to_fs_entry(self, fs_config):
-        """Converts an FSConfig entry to an fs entry.
-
-        Prints '{ mode, user, group, caps, "path" },'.
-
-        Calls sys.exit() on error.
-
-        Args:
-            fs_config (FSConfig): The entry to convert to
-                a valid C array entry.
-        """
-
-        # Get some short names
-        mode = fs_config.mode
-        user = fs_config.user
-        group = fs_config.group
-        fname = fs_config.filename
-        caps = fs_config.caps
-        path = fs_config.path
-
-        emsg = 'Cannot convert friendly name "%s" to identifier!'
-
-        # remap friendly names to identifier names
-        if AID.is_friendly(user):
-            if user not in self._friendly_to_aid:
-                sys.exit(emsg % user)
-            user = self._friendly_to_aid[user].identifier
-
-        if AID.is_friendly(group):
-            if group not in self._friendly_to_aid:
-                sys.exit(emsg % group)
-            group = self._friendly_to_aid[group].identifier
-
-        fmt = '{ %s, %s, %s, %s, "%s" },'
-
-        expanded = fmt % (mode, user, group, caps, path)
-
-        print FSConfigGen._FILE_COMMENT % fname
-        print '    ' + expanded
-
-    @staticmethod
-    def _gen_inc():
-        """Generate the include header lines and print to stdout."""
-        for include in FSConfigGen._INCLUDES:
-            print '#include %s' % include
-
-    def _generate(self):
-        """Generates an OEM android_filesystem_config.h header file to stdout.
+    if are_aids:
+        for a in aids:
+            # use the preserved str value
+            print FILE_COMMENT % a[0]
+            print GENERIC_DEFINE % (a[1], a[2])
 
-        Args:
-            files ([FSConfig]): A list of FSConfig objects for file entries.
-            dirs ([FSConfig]): A list of FSConfig objects for directory
-                entries.
-            aids ([AIDS]): A list of AID objects for Android Id entries.
-        """
-        print FSConfigGen._GENERATED
         print
 
-        FSConfigGen._gen_inc()
-        print
+    if not are_dirs:
+        print DEFINE_NO_DIRS
 
-        dirs = self._oem_parser.dirs
-        files = self._oem_parser.files
-        aids = self._oem_parser.aids
+    if not are_files:
+        print DEFINE_NO_FILES
 
-        are_dirs = len(dirs) > 0
-        are_files = len(files) > 0
-        are_aids = len(aids) > 0
+    if not are_files and not are_dirs and not are_aids:
+        print DEFAULT_WARNING
+        return
 
-        if are_aids:
-            for aid in aids:
-                # use the preserved _path value
-                print FSConfigGen._FILE_COMMENT % aid.found
-                print FSConfigGen._GENERIC_DEFINE % (aid.identifier, aid.value)
-
-            print
+    if are_files:
+        print OPEN_FILE_STRUCT
+        for tup in files:
+            f = tup[0]
+            c = tup[1]
+            c[4] = '"' + c[4] + '"'
+            c = '{ ' + '    ,'.join(c) + ' },'
+            print FILE_COMMENT % f
+            print '    ' + c
 
         if not are_dirs:
-            print FSConfigGen._DEFINE_NO_DIRS + '\n'
+            print IFDEF_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+            print '    ' + NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS_ENTRY
+            print ENDIF
+        print CLOSE_FILE_STRUCT
 
-        if not are_files:
-            print FSConfigGen._DEFINE_NO_FILES + '\n'
+    if are_dirs:
+        print OPEN_DIR_STRUCT
+        for d in dirs:
+            f[4] = '"' + f[4] + '"'
+            d = '{ ' + '    ,'.join(d) + ' },'
+            print '    ' + d
 
-        if not are_files and not are_dirs and not are_aids:
-            return
+        print CLOSE_FILE_STRUCT
 
-        if are_files:
-            print FSConfigGen._OPEN_FILE_STRUCT
-            for fs_config in files:
-                self._to_fs_entry(fs_config)
+def file_key(x):
 
-            if not are_dirs:
-                print FSConfigGen._IFDEF_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
-                print(
-                    '    ' +
-                    FSConfigGen._NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS_ENTRY)
-                print FSConfigGen._ENDIF
-            print FSConfigGen._CLOSE_FILE_STRUCT
+    # Wrapper class for custom prefix matching strings
+    class S(object):
+        def __init__(self, str):
 
-        if are_dirs:
-            print FSConfigGen._OPEN_DIR_STRUCT
-            for dir_entry in dirs:
-                self._to_fs_entry(dir_entry)
+            self.orig = str
+            self.is_prefix = str[-1] == '*'
+            if self.is_prefix:
+                self.str = str[:-1]
+            else:
+                self.str = str
 
-            print FSConfigGen._CLOSE_FILE_STRUCT
+        def __lt__(self, other):
 
+            # if were both suffixed the smallest string
+            # is 'bigger'
+            if self.is_prefix and other.is_prefix:
+                b = len(self.str) > len(other.str)
+            # If I am an the suffix match, im bigger
+            elif self.is_prefix:
+                b = False
+            # If other is the suffix match, he's bigger
+            elif other.is_prefix:
+                b = True
+            # Alphabetical
+            else:
+                b = self.str < other.str
+            return b
 
-@generator('aidarray')
-class AIDArrayGen(BaseGenerator):
-    """Generates the android_id static array."""
-
-    _GENERATED = ('/*\n'
-                  ' * THIS IS AN AUTOGENERATED FILE! DO NOT MODIFY!\n'
-                  ' */')
-
-    _INCLUDE = '#include <private/android_filesystem_config.h>'
-
-    _STRUCT_FS_CONFIG = textwrap.dedent("""
-                         struct android_id_info {
-                             const char *name;
-                             unsigned aid;
-                         };""")
-
-    _OPEN_ID_ARRAY = 'static const struct android_id_info android_ids[] = {'
-
-    _ID_ENTRY = '    { "%s", %s },'
-
-    _CLOSE_FILE_STRUCT = '};'
-
-    _COUNT = ('#define android_id_count \\\n'
-              '    (sizeof(android_ids) / sizeof(android_ids[0]))')
-
-    def add_opts(self, opt_group):
-
-        opt_group.add_argument(
-            'hdrfile', help='The android_filesystem_config.h'
-            'file to parse')
-
-    def __call__(self, args):
-
-        hdr = AIDHeaderParser(args['hdrfile'])
-
-        print AIDArrayGen._GENERATED
-        print
-        print AIDArrayGen._INCLUDE
-        print
-        print AIDArrayGen._STRUCT_FS_CONFIG
-        print
-        print AIDArrayGen._OPEN_ID_ARRAY
-
-        for aid in hdr.aids:
-            print AIDArrayGen._ID_ENTRY % (aid.friendly, aid.identifier)
-
-        print AIDArrayGen._CLOSE_FILE_STRUCT
-        print
-        print AIDArrayGen._COUNT
-        print
-
-
-@generator('oemaid')
-class OEMAidGen(BaseGenerator):
-    """Generates the OEM AID_<name> value header file."""
-
-    _GENERATED = ('/*\n'
-                  ' * THIS IS AN AUTOGENERATED FILE! DO NOT MODIFY!\n'
-                  ' */')
-
-    _GENERIC_DEFINE = "#define %s\t%s"
-
-    _FILE_COMMENT = '// Defined in file: \"%s\"'
-
-    # Intentional trailing newline for readability.
-    _FILE_IFNDEF_DEFINE = ('#ifndef GENERATED_OEM_AIDS_H_\n'
-                           '#define GENERATED_OEM_AIDS_H_\n')
-
-    _FILE_ENDIF = '#endif'
-
-    def __init__(self):
-
-        self._old_file = None
-
-    def add_opts(self, opt_group):
-
-        opt_group.add_argument(
-            'fsconfig', nargs='+', help='The list of fsconfig files to parse.')
-
-        opt_group.add_argument(
-            '--aid-header',
-            required=True,
-            help='An android_filesystem_config.h file'
-            'to parse AIDs and OEM Ranges from')
-
-    def __call__(self, args):
-
-        hdr_parser = AIDHeaderParser(args['aid_header'])
-
-        parser = FSConfigFileParser(args['fsconfig'], hdr_parser.oem_ranges)
-
-        print OEMAidGen._GENERATED
-
-        print OEMAidGen._FILE_IFNDEF_DEFINE
-
-        for aid in parser.aids:
-            self._print_aid(aid)
-            print
-
-        print OEMAidGen._FILE_ENDIF
-
-    def _print_aid(self, aid):
-        """Prints a valid #define AID identifier to stdout.
-
-        Args:
-            aid to print
-        """
-
-        # print the source file location of the AID
-        found_file = aid.found
-        if found_file != self._old_file:
-            print OEMAidGen._FILE_COMMENT % found_file
-            self._old_file = found_file
-
-        print OEMAidGen._GENERIC_DEFINE % (aid.identifier, aid.value)
-
-
-@generator('passwd')
-class PasswdGen(BaseGenerator):
-    """Generates the /etc/passwd file per man (5) passwd."""
-
-    _GENERATED = ('#\n# THIS IS AN AUTOGENERATED FILE! DO NOT MODIFY!\n#')
-
-    _FILE_COMMENT = '# Defined in file: \"%s\"'
-
-    def __init__(self):
-
-        self._old_file = None
-
-    def add_opts(self, opt_group):
-
-        opt_group.add_argument(
-            'fsconfig', nargs='+', help='The list of fsconfig files to parse.')
-
-        opt_group.add_argument(
-            '--aid-header',
-            required=True,
-            help='An android_filesystem_config.h file'
-            'to parse AIDs and OEM Ranges from')
-
-    def __call__(self, args):
-
-        hdr_parser = AIDHeaderParser(args['aid_header'])
-
-        parser = FSConfigFileParser(args['fsconfig'], hdr_parser.oem_ranges)
-
-        aids = parser.aids
-
-        # nothing to do if no aids defined
-        if len(aids) == 0:
-            return
-
-        print PasswdGen._GENERATED
-
-        for aid in aids:
-            self._print_formatted_line(aid)
-
-    def _print_formatted_line(self, aid):
-        """Prints the aid to stdout in the passwd format. Internal use only.
-
-        Colon delimited:
-            login name, friendly name
-            encrypted password (optional)
-            uid (int)
-            gid (int)
-            User name or comment field
-            home directory
-            interpreter (optional)
-
-        Args:
-            aid (AID): The aid to print.
-        """
-        if self._old_file != aid.found:
-            self._old_file = aid.found
-            print PasswdGen._FILE_COMMENT % aid.found
-
-        try:
-            logon, uid = Utils.get_login_and_uid_cleansed(aid)
-        except ValueError as exception:
-            sys.exit(exception)
-
-        print "%s::%s:%s::/:/system/bin/sh" % (logon, uid, uid)
-
-
-@generator('group')
-class GroupGen(PasswdGen):
-    """Generates the /etc/group file per man (5) group."""
-
-    # Overrides parent
-    def _print_formatted_line(self, aid):
-        """Prints the aid to stdout in the group format. Internal use only.
-
-        Formatted (per man 5 group) like:
-            group_name:password:GID:user_list
-
-        Args:
-            aid (AID): The aid to print.
-        """
-        if self._old_file != aid.found:
-            self._old_file = aid.found
-            print PasswdGen._FILE_COMMENT % aid.found
-
-        try:
-            logon, uid = Utils.get_login_and_uid_cleansed(aid)
-        except ValueError as exception:
-            sys.exit(exception)
-
-        print "%s::%s:" % (logon, uid)
-
+    return S(x[4])
 
 def main():
-    """Main entry point for execution."""
 
-    opt_parser = argparse.ArgumentParser(
-        description='A tool for parsing fsconfig config files and producing' +
-        'digestable outputs.')
-    subparser = opt_parser.add_subparsers(help='generators')
+    files = []
+    dirs = []
+    aids = []
+    seen_paths = {}
 
-    gens = generator.get()
+    # (name to file, value to aid)
+    seen_aids = ({}, {})
 
-    # for each gen, instantiate and add them as an option
-    for name, gen in gens.iteritems():
+    for x in sys.argv[1:]:
+        parse(x, files, dirs, aids, seen_paths, seen_aids)
 
-        generator_option_parser = subparser.add_parser(name, help=gen.__doc__)
-        generator_option_parser.set_defaults(which=name)
+    # sort entries:
+    # * specified path before prefix match
+    # ** ie foo before f*
+    # * lexicographical less than before other
+    # ** ie boo before foo
+    # Given these paths:
+    # paths=['ac', 'a', 'acd', 'an', 'a*', 'aa', 'ac*']
+    # The sort order would be:
+    # paths=['a', 'aa', 'ac', 'acd', 'an', 'ac*', 'a*']
+    # Thus the fs_config tools will match on specified paths before attempting
+    # prefix, and match on the longest matching prefix.
+    files.sort(key= lambda x: file_key(x[1]))
 
-        opt_group = generator_option_parser.add_argument_group(name +
-                                                               ' options')
-        gen.add_opts(opt_group)
+    # sort on value of (file_name, name, value, strvalue)
+    # This is only cosmetic so AIDS are arranged in ascending order
+    # within the generated file.
+    aids.sort(key=lambda x: x[2])
 
-    args = opt_parser.parse_args()
-
-    args_as_dict = vars(args)
-    which = args_as_dict['which']
-    del args_as_dict['which']
-
-    gens[which](args_as_dict)
-
+    generate(files, dirs, aids)
 
 if __name__ == '__main__':
     main()
diff --git a/tools/fs_config/pylintrc b/tools/fs_config/pylintrc
deleted file mode 100644
index 3e44870..0000000
--- a/tools/fs_config/pylintrc
+++ /dev/null
@@ -1,5 +0,0 @@
-[MESSAGES CONTROL]
-disable=fixme,design,locally-disabled,too-many-lines
-
-[VARIABLES]
-dummy-variables-rgx=_|dummy
diff --git a/tools/fs_config/test_fs_config_generator.py b/tools/fs_config/test_fs_config_generator.py
deleted file mode 100755
index a911aae..0000000
--- a/tools/fs_config/test_fs_config_generator.py
+++ /dev/null
@@ -1,257 +0,0 @@
-#!/usr/bin/env python
-"""Unit test suite for the fs_config_genertor.py tool."""
-
-import tempfile
-import textwrap
-import unittest
-
-from fs_config_generator import AID
-from fs_config_generator import AIDHeaderParser
-from fs_config_generator import FSConfigFileParser
-from fs_config_generator import FSConfig
-from fs_config_generator import Utils
-
-
-# Disable protected access so we can test class internal
-# methods. Also, disable invalid-name as some of the
-# class method names are over length.
-# pylint: disable=protected-access,invalid-name
-class Tests(unittest.TestCase):
-    """Test class for unit tests"""
-
-    def test_is_overlap(self):
-        """Test overlap detection helper"""
-
-        self.assertTrue(AIDHeaderParser._is_overlap((0, 1), (1, 2)))
-
-        self.assertTrue(AIDHeaderParser._is_overlap((0, 100), (90, 200)))
-
-        self.assertTrue(AIDHeaderParser._is_overlap((20, 50), (1, 101)))
-
-        self.assertFalse(AIDHeaderParser._is_overlap((0, 100), (101, 200)))
-
-        self.assertFalse(AIDHeaderParser._is_overlap((-10, 0), (10, 20)))
-
-    def test_in_any_range(self):
-        """Test if value in range"""
-
-        self.assertFalse(Utils.in_any_range(50, [(100, 200), (1, 2), (1, 1)]))
-        self.assertFalse(Utils.in_any_range(250, [(100, 200), (1, 2), (1, 1)]))
-
-        self.assertTrue(Utils.in_any_range(100, [(100, 200), (1, 2), (1, 1)]))
-        self.assertTrue(Utils.in_any_range(200, [(100, 200), (1, 2), (1, 1)]))
-        self.assertTrue(Utils.in_any_range(150, [(100, 200)]))
-
-    def test_aid(self):
-        """Test AID class constructor"""
-
-        aid = AID('AID_FOO_BAR', '0xFF', 'myfakefile')
-        self.assertEquals(aid.identifier, 'AID_FOO_BAR')
-        self.assertEquals(aid.value, '0xFF')
-        self.assertEquals(aid.found, 'myfakefile')
-        self.assertEquals(aid.normalized_value, '255')
-        self.assertEquals(aid.friendly, 'foo_bar')
-
-        aid = AID('AID_MEDIA_EX', '1234', 'myfakefile')
-        self.assertEquals(aid.identifier, 'AID_MEDIA_EX')
-        self.assertEquals(aid.value, '1234')
-        self.assertEquals(aid.found, 'myfakefile')
-        self.assertEquals(aid.normalized_value, '1234')
-        self.assertEquals(aid.friendly, 'mediaex')
-
-    def test_aid_header_parser_good(self):
-        """Test AID Header Parser good input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                #define AID_FOO 1000
-                #define AID_BAR 1001
-                #define SOMETHING "something"
-                #define AID_OEM_RESERVED_START 2900
-                #define AID_OEM_RESERVED_END   2999
-                #define AID_OEM_RESERVED_1_START  7000
-                #define AID_OEM_RESERVED_1_END    8000
-            """))
-            temp_file.flush()
-
-            parser = AIDHeaderParser(temp_file.name)
-            oem_ranges = parser.oem_ranges
-            aids = parser.aids
-
-            self.assertTrue((2900, 2999) in oem_ranges)
-            self.assertFalse((5000, 6000) in oem_ranges)
-
-            for aid in aids:
-                self.assertTrue(aid.normalized_value in ['1000', '1001'])
-                self.assertFalse(aid.normalized_value in ['1', '2', '3'])
-
-    def test_aid_header_parser_good_unordered(self):
-        """Test AID Header Parser good unordered input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                #define AID_FOO 1000
-                #define AID_OEM_RESERVED_1_END    8000
-                #define AID_BAR 1001
-                #define SOMETHING "something"
-                #define AID_OEM_RESERVED_END   2999
-                #define AID_OEM_RESERVED_1_START  7000
-                #define AID_OEM_RESERVED_START 2900
-            """))
-            temp_file.flush()
-
-            parser = AIDHeaderParser(temp_file.name)
-            oem_ranges = parser.oem_ranges
-            aids = parser.aids
-
-            self.assertTrue((2900, 2999) in oem_ranges)
-            self.assertFalse((5000, 6000) in oem_ranges)
-
-            for aid in aids:
-                self.assertTrue(aid.normalized_value in ['1000', '1001'])
-                self.assertFalse(aid.normalized_value in ['1', '2', '3'])
-
-    def test_aid_header_parser_bad_aid(self):
-        """Test AID Header Parser bad aid input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                #define AID_FOO "bad"
-            """))
-            temp_file.flush()
-
-            with self.assertRaises(SystemExit):
-                AIDHeaderParser(temp_file.name)
-
-    def test_aid_header_parser_bad_oem_range(self):
-        """Test AID Header Parser bad oem range input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                #define AID_OEM_RESERVED_START 2900
-                #define AID_OEM_RESERVED_END   1800
-            """))
-            temp_file.flush()
-
-            with self.assertRaises(SystemExit):
-                AIDHeaderParser(temp_file.name)
-
-    def test_aid_header_parser_bad_oem_range_no_end(self):
-        """Test AID Header Parser bad oem range (no end) input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                #define AID_OEM_RESERVED_START 2900
-            """))
-            temp_file.flush()
-
-            with self.assertRaises(SystemExit):
-                AIDHeaderParser(temp_file.name)
-
-    def test_aid_header_parser_bad_oem_range_no_start(self):
-        """Test AID Header Parser bad oem range (no start) input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                #define AID_OEM_RESERVED_END 2900
-            """))
-            temp_file.flush()
-
-            with self.assertRaises(SystemExit):
-                AIDHeaderParser(temp_file.name)
-
-    def test_aid_header_parser_bad_oem_range_mismatch_start_end(self):
-        """Test AID Header Parser bad oem range mismatched input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                #define AID_OEM_RESERVED_START 2900
-                #define AID_OEM_RESERVED_2_END 2900
-            """))
-            temp_file.flush()
-
-            with self.assertRaises(SystemExit):
-                AIDHeaderParser(temp_file.name)
-
-    def test_fs_config_file_parser_good(self):
-        """Test FSConfig Parser good input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                [/system/bin/file]
-                user: AID_FOO
-                group: AID_SYSTEM
-                mode: 0777
-                caps: BLOCK_SUSPEND
-
-                [/vendor/path/dir/]
-                user: AID_FOO
-                group: AID_SYSTEM
-                mode: 0777
-                caps: 0
-
-                [AID_OEM1]
-                # 5001 in base16
-                value: 0x1389
-            """))
-            temp_file.flush()
-
-            parser = FSConfigFileParser([temp_file.name], [(5000, 5999)])
-            files = parser.files
-            dirs = parser.dirs
-            aids = parser.aids
-
-            self.assertEquals(len(files), 1)
-            self.assertEquals(len(dirs), 1)
-            self.assertEquals(len(aids), 1)
-
-            aid = aids[0]
-            fcap = files[0]
-            dcap = dirs[0]
-
-            self.assertEqual(fcap,
-                             FSConfig('0777', 'AID_FOO', 'AID_SYSTEM',
-                                      '(1ULL << CAP_BLOCK_SUSPEND)',
-                                      '/system/bin/file', temp_file.name))
-
-            self.assertEqual(dcap,
-                             FSConfig('0777', 'AID_FOO', 'AID_SYSTEM', '(0)',
-                                      '/vendor/path/dir/', temp_file.name))
-
-            self.assertEqual(aid, AID('AID_OEM1', '0x1389', temp_file.name))
-
-    def test_fs_config_file_parser_bad(self):
-        """Test FSConfig Parser bad input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                [/system/bin/file]
-                caps: BLOCK_SUSPEND
-            """))
-            temp_file.flush()
-
-            with self.assertRaises(SystemExit):
-                FSConfigFileParser([temp_file.name], [(5000, 5999)])
-
-    def test_fs_config_file_parser_bad_aid_range(self):
-        """Test FSConfig Parser bad aid range value input file"""
-
-        with tempfile.NamedTemporaryFile() as temp_file:
-            temp_file.write(
-                textwrap.dedent("""
-                [AID_OEM1]
-                value: 25
-            """))
-            temp_file.flush()
-
-            with self.assertRaises(SystemExit):
-                FSConfigFileParser([temp_file.name], [(5000, 5999)])
