decomposed into 3 modules