The overall planning process undertaken by a bus company is traditionally composed of five sub-processes: timetabling, vehicle scheduling, maintenance scheduling, crew scheduling, and crew rostering. Solving the full optimization problem is believed to be computationally intractable, and therefore in practice the five sub-processes are usually optimized in sequence. In this paper, we present a model that integrates the problems of vehicle scheduling and maintenance scheduling. The objective is to minimize the differences in mileage between buses, the total distance traveled, and the daily differences in the number of maintenance tasks. We propose a heuristic algorithm using the framework of greedy randomized adaptive search procedure (GRASP), and we improve the neighborhood search procedure by using an ordered list of possible trips. We compare the neighborhood search procedure with and without this mechanism and show that the ordered list reduces the number of neighbors to be checked by more than 95%, and it reduces the time to obtain solutions of the same or better quality by an average of 70%. Through computational experiments on instances generated from real-world data, we show that the proposed algorithm finds solutions that are as good as or better than those obtained by a commercial solver in less than 5% of the time required by the latter.