refactor to make iterface more unified