implementation with duplicated API