_DEFAULT_ link and node are built-in - the default defaults All others are initially empty, with just a reference to the parent. Per node: list of properties for each: name value config filename (if any) config line number (if any) type? (so we can use a standard parser/writer) special name/type for comments editor has set/get functions to alter the config. all map fns need to use the getter to get config info seperate array of nodes and links (as now) for *runtime* info - e.g. the width of the image, the calculated position, the ReadData results - also store some kind of reference to the appropriate place in the DOM To avoid PHP4 reference rubbish, each DOM item is just stored in an array with a UID. The UID is used as a reference whenever one is needed. No circular references, no accidental pass-by-value. Use uniqid(). WriteConfig then just enumerates the DOM. Maybe need a function to optimise the tree, making sure that the property value doesn't match the parent's value (i.e. it's redundant) LINK _DEFAULT_ LINK DEFAULT LINK l1 LINK l2 LINK l3 LINK template1 LINK l4 LINK l5 LINK l6 NODE _DEFAULT_ NODE DEFAULT NODE n1 NODE n2 NODE n3 NODE template1 NODE n4 NODE n5 NODE n6 NODE template2 NODE n7 NODE template2a NODE n8 NODE template3