split into seperate modules
updated dg