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