implements 3 && 4