diff --git a/scripts/generate_schema_collections.py b/scripts/generate_schema_collections.py
index c44ca59..cf1f2f3 100755
--- a/scripts/generate_schema_collections.py
+++ b/scripts/generate_schema_collections.py
@@ -22,9 +22,6 @@
  ***************************************************************/"""
 
 SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
-REDFISH_SCHEMA_DIR = os.path.realpath(
-    os.path.join(SCRIPT_DIR, "..", "static", "redfish", "v1", "schema")
-)
 CPP_OUTFILE = os.path.realpath(
     os.path.join(
         SCRIPT_DIR, "..", "redfish-core", "include", "aggregation_utils.hpp"
@@ -39,8 +36,19 @@
 seen_paths = set()
 
 
+def resolve_filename(xml_file):
+    for root, dirs, files in os.walk(
+        os.path.join(SCRIPT_DIR, "..", "redfish-core", "schema")
+    ):
+        for csdl_file in files:
+            if csdl_file == xml_file:
+                return os.path.join(root, csdl_file)
+    raise Exception(f"Could not resolve {xml_file} in search folders")
+
+
 def parse_node(target_entitytype, path, top_collections, found_top, xml_file):
-    filepath = os.path.join(REDFISH_SCHEMA_DIR, xml_file)
+
+    filepath = resolve_filename(xml_file)
     tree = ET.parse(filepath)
     root = tree.getroot()
 
diff --git a/scripts/generate_schema_enums.py b/scripts/generate_schema_enums.py
index a2e7ee2..fb39b98 100755
--- a/scripts/generate_schema_enums.py
+++ b/scripts/generate_schema_enums.py
@@ -7,7 +7,7 @@
 
 SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
 REDFISH_SCHEMA_DIR = os.path.realpath(
-    os.path.join(SCRIPT_DIR, "..", "static", "redfish", "v1", "schema")
+    os.path.join(SCRIPT_DIR, "..", "redfish-core", "schema")
 )
 
 OUTFOLDER = os.path.realpath(
@@ -45,6 +45,7 @@
 
 
 def parse_file(filename):
+    print(f"Parsing {filename}")
     tree = ET.parse(filename)
     root = tree.getroot()
     results = []
@@ -135,12 +136,13 @@
 
 def main():
     print("Reading from {}".format(REDFISH_SCHEMA_DIR))
-    dir_list = os.listdir(REDFISH_SCHEMA_DIR)
 
-    filepaths = [
-        os.path.join(REDFISH_SCHEMA_DIR, filename) for filename in dir_list
-    ]
-
+    filepaths = []
+    for root, dirs, files in os.walk(REDFISH_SCHEMA_DIR):
+        for csdl_file in files:
+            if csdl_file.endswith(".xml"):
+                filepaths.append(os.path.join(root, csdl_file))
+    print(filepaths)
     enum_list = []
 
     for filepath in filepaths:
diff --git a/scripts/update_schemas.py b/scripts/update_schemas.py
index 2e8487d..ea17d04 100755
--- a/scripts/update_schemas.py
+++ b/scripts/update_schemas.py
@@ -23,132 +23,6 @@
  * github organization.
  ***************************************************************/"""
 
-# To use a new schema, add to list and rerun tool
-include_list = [
-    "AccountService",
-    "ActionInfo",
-    "AggregationService",
-    "AggregationSource",
-    "AggregationSourceCollection",
-    "Assembly",
-    "AttributeRegistry",
-    "Bios",
-    "Cable",
-    "CableCollection",
-    "Certificate",
-    "CertificateCollection",
-    "CertificateLocations",
-    "CertificateService",
-    "Chassis",
-    "ChassisCollection",
-    "ComputerSystem",
-    "ComputerSystemCollection",
-    "ComponentIntegrity",
-    "ComponentIntegrityCollection",
-    "Drive",
-    "DriveCollection",
-    "EnvironmentMetrics",
-    "EthernetInterface",
-    "EthernetInterfaceCollection",
-    "Event",
-    "EventDestination",
-    "EventDestinationCollection",
-    "EventService",
-    "FabricAdapter",
-    "FabricAdapterCollection",
-    "Fan",
-    "FanCollection",
-    "IPAddresses",
-    "JsonSchemaFile",
-    "JsonSchemaFileCollection",  # redfish/v1/JsonSchemas
-    "LogEntry",
-    "LogEntryCollection",
-    "LogService",
-    "LogServiceCollection",
-    "Manager",
-    "ManagerAccount",
-    "ManagerAccountCollection",
-    "ManagerCollection",
-    "ManagerDiagnosticData",
-    "ManagerNetworkProtocol",
-    "Memory",
-    "MemoryCollection",
-    "Message",
-    "MessageRegistry",
-    "MessageRegistryCollection",
-    "MessageRegistryFile",
-    "MessageRegistryFileCollection",
-    "MetricDefinition",
-    "MetricDefinitionCollection",
-    "MetricReport",
-    "MetricReportCollection",
-    "MetricReportDefinition",
-    "MetricReportDefinitionCollection",
-    "OperatingConfig",
-    "OperatingConfigCollection",
-    "PCIeDevice",
-    "PCIeDeviceCollection",
-    "PCIeFunction",
-    "PCIeFunctionCollection",
-    "PhysicalContext",
-    "PCIeSlots",
-    "Port",
-    "PortCollection",
-    "Power",
-    "PowerSubsystem",
-    "PowerSupply",
-    "PowerSupplyCollection",
-    "Privileges",  # Used in Role
-    "Processor",
-    "ProcessorCollection",
-    "Protocol",
-    "RedfishError",
-    "RedfishExtensions",
-    "Redundancy",
-    "Resource",
-    "Role",
-    "RoleCollection",
-    "Sensor",
-    "SensorCollection",
-    "ServiceRoot",
-    "Session",
-    "SessionCollection",
-    "SessionService",
-    "Settings",
-    "SoftwareInventory",
-    "SoftwareInventoryCollection",
-    "Storage",
-    "StorageCollection",
-    "StorageController",
-    "StorageControllerCollection",
-    "Task",
-    "TaskCollection",
-    "TaskService",
-    "TelemetryService",
-    "Thermal",
-    "ThermalMetrics",
-    "ThermalSubsystem",
-    "Triggers",
-    "TriggersCollection",
-    "UpdateService",
-    "VirtualMedia",
-    "VirtualMediaCollection",
-    "odata",
-    "odata-v4",
-    "redfish-error",
-    "redfish-payload-annotations",
-    "redfish-schema",
-    "redfish-schema-v1",
-]
-
-# OEM schemas
-oem_schema_names = [
-    "OemManager",
-    "OemComputerSystem",
-    "OemVirtualMedia",
-    "OpenBMCAccountService",
-]
-
 SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
 
 proxies = {"https": os.environ.get("https_proxy", None)}
@@ -173,8 +47,12 @@
 )
 
 
-schema_path = os.path.join(static_path, "schema")
-json_schema_path = os.path.join(static_path, "JsonSchemas")
+schema_path = os.path.join(
+    SCRIPT_DIR, "..", "redfish-core", "schema", "dmtf", "csdl"
+)
+json_schema_path = os.path.join(
+    SCRIPT_DIR, "..", "redfish-core", "schema", "dmtf", "json-schema"
+)
 metadata_index_path = os.path.join(static_path, "$metadata", "index.xml")
 
 zipBytesIO = BytesIO(r.content)
@@ -249,9 +127,6 @@
     elif zip_file.filename.startswith("json-schema/"):
         filename = os.path.basename(zip_file.filename)
         filenamesplit = filename.split(".")
-        # exclude schemas again to save flash space
-        if filenamesplit[0] not in include_list:
-            continue
         json_schema_files[filenamesplit[0]].append(filename)
     elif zip_file.filename.startswith("openapi/"):
         pass
@@ -266,16 +141,11 @@
 json_schema_files = OrderedDict(
     sorted(json_schema_files.items(), key=lambda x: SchemaVersion(x[0]))
 )
-
-csdl_filenames.sort(key=SchemaVersion)
-
-# Create oem filenames - from oem json names
-oem_csdl_filenames = []
-for filename in oem_schema_names:
-    oem_csdl_filenames.append(filename + "_v1.xml")
-
-# Append Oem csdl files
-csdl_filenames += oem_csdl_filenames
+for csdl_file in csdl_filenames:
+    with open(os.path.join(schema_path, csdl_file), "wb") as schema_out:
+        content = zip_ref.read(os.path.join("csdl", csdl_file))
+        content = content.replace(b"\r\n", b"\n")
+        schema_out.write(content)
 
 with open(metadata_index_path, "w") as metadata_index:
     metadata_index.write('<?xml version="1.0" encoding="UTF-8"?>\n')
@@ -285,28 +155,20 @@
         ' Version="4.0">\n'
     )
 
-    for filename in csdl_filenames:
-        # filename looks like Zone_v1.xml
-        if filename in oem_csdl_filenames:
-            with open(
-                os.path.join(schema_path, filename), "rb"
-            ) as oem_csdl_in:
-                content = oem_csdl_in.read()
-                content = content.replace(b"\r\n", b"\n")
-        else:
-            with open(os.path.join(schema_path, filename), "wb") as schema_out:
-                content = zip_ref.read(os.path.join("csdl", filename))
-                content = content.replace(b"\r\n", b"\n")
-                schema_out.write(content)
-                filenamesplit = filename.split("_")
-                if filenamesplit[0] not in include_list:
-                    continue
+    schema_static_dir = os.path.join(
+        SCRIPT_DIR, "..", "static", "redfish", "v1", "schema"
+    )
+    for filename in sorted(os.listdir(schema_static_dir), key=SchemaVersion):
+        if not filename.endswith(".xml"):
+            continue
 
         metadata_index.write(
             '    <edmx:Reference Uri="/redfish/v1/schema/' + filename + '">\n'
         )
 
-        xml_root = ET.fromstring(content)
+        xml_root = ET.parse(
+            os.path.join(schema_static_dir, filename)
+        ).getroot()
         edmx = "{http://docs.oasis-open.org/odata/ns/edmx}"
         edm = "{http://docs.oasis-open.org/odata/ns/edm}"
         for edmx_child in xml_root:
@@ -344,13 +206,18 @@
 
 for schema, version in json_schema_files.items():
     zip_filepath = os.path.join("json-schema", version[0])
-    schemadir = os.path.join(json_schema_path, schema)
-    os.makedirs(schemadir)
 
-    with open(os.path.join(schemadir, schema + ".json"), "wb") as schema_file:
+    with open(os.path.join(json_schema_path, version[0]), "wb") as schema_file:
         schema_file.write(zip_ref.read(zip_filepath).replace(b"\r\n", b"\n"))
 
 with open(os.path.join(cpp_path, "schemas.hpp"), "w") as hpp_file:
+    schemas = []
+    for root, dirs, files in os.walk(
+        os.path.join(SCRIPT_DIR, "..", "static", "redfish", "v1", "schema")
+    ):
+        for csdl_file in sorted(files, key=SchemaVersion):
+            if csdl_file.endswith(".xml"):
+                schemas.append(csdl_file.replace("_v1.xml", ""))
     hpp_file.write(
         "#pragma once\n"
         "{WARNING}\n"
@@ -362,14 +229,11 @@
         "{{\n"
         "    constexpr std::array<std::string_view,{SIZE}> schemas {{\n".format(
             WARNING=WARNING,
-            SIZE=len(json_schema_files) + len(oem_schema_names),
+            SIZE=len(schemas),
         )
     )
-    for schema_file in json_schema_files:
-        hpp_file.write('        "{}",\n'.format(schema_file))
-
-    for schema_file in oem_schema_names:
-        hpp_file.write('        "{}",\n'.format(schema_file))
+    for schema in schemas:
+        hpp_file.write('        "{}",\n'.format(schema))
 
     hpp_file.write("    };\n}\n")
 
@@ -377,19 +241,3 @@
 
 generate_schema_enums.main()
 generate_top_collections()
-
-# Now delete the xml schema files we aren't supporting
-if os.path.exists(schema_path):
-    files = [
-        os.path.join(schema_path, f)
-        for f in os.listdir(schema_path)
-        if not any([f.startswith(prefix) for prefix in skip_prefixes])
-    ]
-    for filename in files:
-        # filename will include the absolute path
-        filenamesplit = filename.split("/")
-        name = filenamesplit.pop()
-        namesplit = name.split("_")
-        if namesplit[0] not in include_list:
-            print("excluding schema: " + filename)
-            os.remove(filename)
