<> <> <> GriffinKernel: CEDAR DEFINITIONS = BEGIN Data: TYPE = REF DataRec; DataRec: TYPE; -- opaque type defined in GriffinData. One DataRec exists per viewer. You need to do this "opaque" to get rid of compilation dependencies; interfaces can reference GriffinKernel.Data and their implementations can bind to the concrete type in GriffinData. GriffinData can, in turn, reference objects in other interfaces that can be compiled earlier. Any implementation module that wishes to go inside a DataRec will EXPORT a public type to this interface. For example: <> <> <> ClipBox: TYPE = REF Box; Box: TYPE = RECORD [enable: BOOL _ FALSE, x, y, w, h: INT] -- from Display, kept in Data END.