abstracted more layers