Add first implementation with tests and docs