implementation structure slightly changed