factored out modules into their own directory