In real world applications, software engineers recognise the use of memory must be organised via data structures and that software using the data must be independant of the data structures' implementation details. They achieve this by using abstract data structures, such as records, files and buffers. We demonstrate that genetic programming can automatically implement simple abstract data structures, considering in detail the task of evolving a list. We show general and reasonably efficient implementations can be automatically generated from simple primitives. A model for maintaining evolved code is demonstrated using the list problem. Syntax rules restrict for while loops so they are not nested. Run time data used to guide location of crossover points CPU and memory usage included in fitness via Pareto tournament selection. Pass by reference and call by reference used inconjunction with ADFs. Scoping rules allow ADFs access to caller's argument directly.