add spec and implementation