final completed version