Given a program and an input change , we wish to obtain an incremental program that computes efficiently by making use of the value of , the intermediate results computed in computing , and auxiliary information about that can be inexpensively maintained. Obtaining such incremental programs is an essential part of the transformational-programming approach to software development and enhancement. This paper presents a systematic approach that discovers a general class of useful auxiliary information, combines it with useful intermediate results, and obtains an efficient incremental program that uses and maintains these intermediate results and auxiliary information. We give a number of examples from list processing, VLSI circuit design, image processing, {\it etc}.