Functional modules

* [ ] add tests