Using simple but proven design principles, this presentation explains the “Layered Module” architecture style, an approach to manage dependencies between the modules which compose a program. We will discuss the single responsibility principle. We will see how to use abstract classes and interfaces as a mean to reduce dependency surface. In the same way, we will present the techniques of dependency injection and inversion of control to reduce the coupling between classes. Lastly, we will discuss benefits to modularize and decouple with layers using namespaces (packages).