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)])
