We present the construction of a family of erasure correcting codes for distributed storage systems that achieve low repair bandwidth and low repair complexity. The construction is based on two classes of codes, where the primary goal of the first class of codes is to achieve a good fault tolerance, while the second class of codes aims at reducing the repair bandwidth and the repair complexity. The repair procedure is a two-step procedure where parts of the failed node are repaired in the first step using the first code. The downloaded symbols during the first step are cached in the memory and used to repair the remaining erased data symbols at no additional read cost during the second step of the repair process. The first class of codes is based on maximum distance separable (MDS) codes modified using piggybacks, while the second class of codes is designed to reduce the number of additional symbols that need to be downloaded to repair the remaining erased symbols. We show that the proposed codes achieve better repair bandwidth compared to MDS, Piggyback, and local reconstruction codes, while a better repair complexity is achieved when compared to MDS, Zigzag, and Piggyback codes.