implementation seems to be the same as base