Hello, we are actually using setup as you describing it, with the api and impl modules. From gradle perspective there is nothing special, it is just modules as any other, we just use non written guidelines like nothing except from wiring module should have dependency on impl modules, impl modules have api module as api (configuration) dependency, some exceptions are that we sometimes have dependency on impl modules testFixtures to help with testing and reuse some mocks. Other modules should have dependency just on api modules if they need it and get the implementation injected from wiring module, either by something like spring or even manually works as wiring module has to have dependency on basically everything, So it should be as lightweight as possible as it can be recompiled a lot. It could be avoided by putting all modules just on runtime classpath and wiring using reflection (like spring do), but I remember there was some bug in intellij which was not recompiling modules if they were only on runtime classpath and I am not sure if it got fixed or not.