Truncation error is used to drive mesh adaptation in order to reduce the discretization error in solutions to a variety of 1D and 2D flow problems. The adaptation is performed using r-adaptation to move the mesh nodes in the domain in an attempt to reduce the truncation error since it is the local source of discretization error. Here, we present a new set of r-adaptation methods called mesh optimization along with three different ways of performing this type of adaptation. Each of these techniques uses a finite difference gradient-based local optimization technique with different sets of design variables to create a mesh that minimizes a functional based on truncation error. These new truncation error based mesh optimization techniques are compared to a more common truncation error based mesh equidistribution technique. Some observations on the performance and behavior of the different adaptation methods and best practices for their use are presented. All of the optimization methods are shown to reduce the truncation error one or two orders of magnitude and the discretization error by roughly one order of magnitude for the 1D problems tested. In two dimensions, the optimization-based adaptation methods are able to reduce the discretization error by up to a factor of seven. Mesh equidistribution achieved similar levels of improvement for much less cost compared to the mesh optimization techniques.