more abstract and some formatting