diff --git a/src/poke_env/environment/abstract_battle.py b/src/poke_env/environment/abstract_battle.py
index eb70606..ed07d0d 100644
--- a/src/poke_env/environment/abstract_battle.py
+++ b/src/poke_env/environment/abstract_battle.py
@@ -241,6 +241,14 @@ class AbstractBattle(ABC):
 
     def _field_start(self, field):
         field = Field.from_showdown_message(field)
+
+        if field.is_terrain:
+            self._fields = {
+                field: turn
+                for field, turn in self._fields.items()
+                if not field.is_terrain
+            }
+
         self._fields[field] = self.turn
 
     def _parse_message(self, split_message: List[str]) -> None:
diff --git a/src/poke_env/environment/field.py b/src/poke_env/environment/field.py
index 8822656..de213ff 100644
--- a/src/poke_env/environment/field.py
+++ b/src/poke_env/environment/field.py
@@ -54,3 +54,8 @@ class Field(Enum):
                 message,
             )
             return Field._UNKNOWN
+
+    @property
+    def is_terrain(self) -> bool:
+        """Wheter this field is a terrain."""
+        return self.name.endswith("_TERRAIN")

diff --git a/unit_tests/environment/test_battle.py b/unit_tests/environment/test_battle.py
index 4fc832b..2dbb7bc 100644
--- a/unit_tests/environment/test_battle.py
+++ b/unit_tests/environment/test_battle.py
@@ -524,3 +524,23 @@ def test_rules_are_tracked():
     battle._parse_message(["", "rule", "this is a rule!"])
 
     assert battle._rules == ["hello", "hi", "this is a rule!"]
+
+
+def test_field_terrain_interactions():
+    logger = MagicMock()
+    battle = Battle("tag", "username", logger)
+
+    battle._field_start("electricterrain")
+    assert battle.fields == {Field.ELECTRIC_TERRAIN: 0}
+    battle.turn = battle.turn + 1
+
+    battle._field_start("mistyterrain")
+    assert battle.fields == {Field.MISTY_TERRAIN: 1}
+    battle.turn = battle.turn + 1
+
+    battle._field_start("gravity")
+    assert battle.fields == {Field.MISTY_TERRAIN: 1, Field.GRAVITY: 2}
+    battle.turn = battle.turn + 1
+
+    battle._field_start("psychicterrain")
+    assert battle.fields == {Field.GRAVITY: 2, Field.PSYCHIC_TERRAIN: 3}
diff --git a/unit_tests/environment/test_enumerations.py b/unit_tests/environment/test_enumerations.py
index 6d20556..5e700b4 100644
--- a/unit_tests/environment/test_enumerations.py
+++ b/unit_tests/environment/test_enumerations.py
@@ -26,6 +26,18 @@ def test_field_str():
     assert str(Field["ELECTRIC_TERRAIN"])
 
 
+def test_field_is_terrain():
+    terrains = {
+        Field.ELECTRIC_TERRAIN,
+        Field.MISTY_TERRAIN,
+        Field.PSYCHIC_TERRAIN,
+        Field.GRASSY_TERRAIN,
+    }
+
+    for field in Field:
+        assert field.is_terrain == (field in terrains)
+
+
 def test_field_build():
     assert Field["ELECTRIC_TERRAIN"] == Field.from_showdown_message("electric terrain")
     assert Field["ELECTRIC_TERRAIN"] == Field.from_showdown_message(

battle.fields
Hi Haris,

It seems to me like sometimes more than one terrain is returned by battle.fields
Could you please look into it

unit_tests/environment/test_battle.py::test_field_terrain_interactions unit_tests/environment/test_enumerations.py::test_field_is_terrain
unit_tests/environment/test_battle.py::test_battle_get_pokemon unit_tests/environment/test_battle.py::test_battle_side_start_end unit_tests/environment/test_battle.py::test_battle_field_interactions unit_tests/environment/test_battle.py::test_battle_weather_interactions unit_tests/environment/test_battle.py::test_battle_player_role_interaction unit_tests/environment/test_battle.py::test_battle_tag unit_tests/environment/test_battle.py::test_battle_request_parsing unit_tests/environment/test_battle.py::test_battle_request_and_interactions unit_tests/environment/test_battle.py::test_end_illusion unit_tests/environment/test_battle.py::test_toxic_counter unit_tests/environment/test_battle.py::test_sleep_counter unit_tests/environment/test_battle.py::test_rules_are_tracked unit_tests/environment/test_enumerations.py::test_effect_str unit_tests/environment/test_enumerations.py::test_effect_build unit_tests/environment/test_enumerations.py::test_field_str unit_tests/environment/test_enumerations.py::test_field_build unit_tests/environment/test_enumerations.py::test_move_category_str unit_tests/environment/test_enumerations.py::test_pokemon_gender_str unit_tests/environment/test_enumerations.py::test_pokemon_gender_build unit_tests/environment/test_enumerations.py::test_status_str unit_tests/environment/test_enumerations.py::test_side_condition_str unit_tests/environment/test_enumerations.py::test_side_condition_build unit_tests/environment/test_enumerations.py::test_weather_str