Great explanation! I like to put a suffix of "Struct" on all my UDTs, e.g. RecipeStruct. Then I can name CurrentRecipe heap item that is a RecipeStruct, along with a block of 100 recipes called Recipe that are also RecipeStruct (use Array index V0 to move Recipe[V0] into CurrentRecipe heap-item, then have all the control code reference the CurrentRecipe heap-item). Some people confuse the UDT definition with the actual MEMORY VARIABLE (a block and/or heap item). You only need to create ONE RecipeStruct UDT, then create as many data blocks or heap items of that UDT as you need. The example you gave of nesting multiple Timers or Counters or Strings within a UDT is VERY powerful (e.g. both a .CookTimer and .ChillTimer as Timer Struct members, along with a .Name String member).