Add implementation and docs