full implementation complete