added interface and implementation