Previous work on introns and code growth in genetic programming is expanded on and tested experimentally. Explicitly defined introns are introduced to tree-based representations as an aid to measuring and evaluating intron behavior. Although it is shown that introns do create code growth, they are not its only cause. Removing introns merely decreases the growth rate; it does not eliminate it. By systematically negating various forms of intron behavior, a deeper understanding of the causes of code growth is obtained, leading to the development of a system that keeps unnecessary bloat to a minimum. Alternative selection schemes and recombination operators are examined and improvements demonstrated over the standard selection methods in terms of both performance and parsimony.