The central object in BasisOpt is the Basis. This defines a general collection of properties and routines that run and store the results of a basis set optimization. The abstract Basis class has the following three core parts: methods to set up and run the optimization; containers for the molecule(s) and result(s) of the optimization; a collection of tests to be run on the optimized set. In addition, there are basic utility functions for, for example: uncontracting a basis, making an even-tempered expansion, and fixing the ratio between exponents. Subclasses of the Basis object implement the specific functionality for the type of basis being optimized, within this general framework. As the simplest case, we describe in more detail the atomic basis; summaries of a few other example types are given in Table .