An agile irrigation controller enables any number of programs to be added, limited only by available memory, and is similarly adaptable to control any number of valves or similar irrigation devices in a network. Stored programs within the memory include pointers to next programs in memory, linking the programs together. The memory further stores groups of valves, with links to additional groups of valves.