Over-layered AOT models translated into extension packages and Chain of Command

How the AX 2012 layer stack, model store and over-layering development philosophy map to D365's extension-only model — Chain of Command, event handlers, table and form extensions — and a triage method for deciding what to keep, rewrite, retire or move to Power Platform.

What you will be able to do

Introduction

AX 2012 developers approaching D365 are in a position unlike any other source-system developer on this site. The language is still X++. The metadata concepts — tables, classes, forms, EDTs, enums, queries — are recognisably the same. The financial and supply-chain data model is largely identity-mapped.

The AOT, the model store and the layer stack

The AX 2012 Application Object Tree (AOT) is the metadata repository for every development artefact in the system: tables, extended data types, base enums, classes, forms, queries, menus, reports, workflows and security objects. In MorphX (the AX 2012 IDE), the AOT presents these as a tree;

The D365 extension model

In D365, a model is a collection of related metadata and X++ source code that compiles into a single assembly. Models are grouped into packages (the unit of deployment). The standard application is shipped as a set of packages — ApplicationSuite, ApplicationFoundation, ApplicationPlatform and others.

Triaging the customisation estate

For every over-layered object in the AX 2012 model store, the programme must answer: what happens to this? Six disposition buckets cover the full range:

The Upgrade analyzer and the code upgrade service

The Upgrade analyzer runs against the AX 2012 R3 environment and identifies blockers and issues that would prevent or complicate the upgrade:

Sizing the code workstream

The temptation is to multiply the object count by a standard hours-per-object factor. This consistently overestimates, because it treats every object as if it requires fresh implementation. In practice:

Knowledge check

Summary

The transition from AX 2012 to D365 is not a language migration — it is a philosophy migration. The X++ you already know still works. The metadata model is still recognisable. But the rules changed: you extend, you do not replace.