diff --git a/examples/complex_rail_benchmark.py b/examples/complex_rail_benchmark.py
index 624ad6697a017ef883e6c81fc0361b31ae62a06c..a8d5a78d03a3003c6e095ea5c0662c7777ff38e0 100644
--- a/examples/complex_rail_benchmark.py
+++ b/examples/complex_rail_benchmark.py
@@ -3,9 +3,9 @@ import random
 
 import numpy as np
 
-from flatland.envs.agent_generators import complex_rail_generator_agents_placer
-from flatland.envs.generators import complex_rail_generator
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.schedule_generators import complex_rail_generator_agents_placer
 
 
 def run_benchmark():
diff --git a/examples/custom_observation_example.py b/examples/custom_observation_example.py
index 401ff94a3b604ce366b55f2e0a55b61c2d81b536..4f3a18e52586662e69557adf3c986e518332c04d 100644
--- a/examples/custom_observation_example.py
+++ b/examples/custom_observation_example.py
@@ -5,11 +5,11 @@ import numpy as np
 
 from flatland.core.env_observation_builder import ObservationBuilder
 from flatland.core.grid.grid_utils import coordinate_to_position
-from flatland.envs.agent_generators import complex_rail_generator_agents_placer
-from flatland.envs.generators import random_rail_generator, complex_rail_generator
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.predictions import ShortestPathPredictorForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import random_rail_generator, complex_rail_generator
+from flatland.envs.schedule_generators import complex_rail_generator_agents_placer
 from flatland.utils.rendertools import RenderTool
 
 random.seed(100)
diff --git a/examples/custom_railmap_example.py b/examples/custom_railmap_example.py
index f6bd2bda9d4c0b8ebf0658759efa367ceeb0a098..f3350d697fa76849e5cfc07164825e4675dc5380 100644
--- a/examples/custom_railmap_example.py
+++ b/examples/custom_railmap_example.py
@@ -5,9 +5,9 @@ import numpy as np
 
 from flatland.core.grid.rail_env_grid import RailEnvTransitions
 from flatland.core.transition_map import GridTransitionMap
-from flatland.envs.agent_generators import AgentGenerator, AgentGeneratorProduct
-from flatland.envs.generators import RailGenerator, RailGeneratorProduct
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import RailGenerator, RailGeneratorProduct
+from flatland.envs.schedule_generators import ScheduleGenerator, ScheduleGeneratorProduct
 from flatland.utils.rendertools import RenderTool
 
 random.seed(100)
@@ -29,8 +29,8 @@ def custom_rail_generator() -> RailGenerator:
     return generator
 
 
-def custom_agent_generator() -> AgentGenerator:
-    def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> AgentGeneratorProduct:
+def custom_agent_generator() -> ScheduleGenerator:
+    def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> ScheduleGeneratorProduct:
         agents_positions = []
         agents_direction = []
         agents_target = []
diff --git a/examples/debugging_example_DELETE.py b/examples/debugging_example_DELETE.py
index 68fdc8ab5ec3c7a56ae023fdd134916764b6224d..c4eae5f42e323dc6fe39d265968461aa59fcab81 100644
--- a/examples/debugging_example_DELETE.py
+++ b/examples/debugging_example_DELETE.py
@@ -3,10 +3,10 @@ import time
 
 import numpy as np
 
-from flatland.envs.agent_generators import complex_rail_generator_agents_placer
-from flatland.envs.generators import complex_rail_generator
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.schedule_generators import complex_rail_generator_agents_placer
 from flatland.utils.rendertools import RenderTool
 
 random.seed(1)
diff --git a/examples/simple_example_1.py b/examples/simple_example_1.py
index 7956c34fd4a5b94859a4b64441450afe2114133c..fbadbd657c36fa1dadf0bca65cff3e9cccd269ea 100644
--- a/examples/simple_example_1.py
+++ b/examples/simple_example_1.py
@@ -1,5 +1,5 @@
-from flatland.envs.generators import rail_from_manual_specifications_generator
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import rail_from_manual_specifications_generator
 from flatland.utils.rendertools import RenderTool
 
 # Example generate a rail given a manual specification,
diff --git a/examples/simple_example_2.py b/examples/simple_example_2.py
index 994c7deda1569b77d4adac8a17fa9ebe14b27ef6..6db9ba5abbd0999ef3896e733516ed6b3e498bae 100644
--- a/examples/simple_example_2.py
+++ b/examples/simple_example_2.py
@@ -2,8 +2,8 @@ import random
 
 import numpy as np
 
-from flatland.envs.generators import random_rail_generator
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import random_rail_generator
 from flatland.utils.rendertools import RenderTool
 
 random.seed(100)
diff --git a/examples/simple_example_3.py b/examples/simple_example_3.py
index 1e20fcca7d799f52e48ae1511f6ffa3c55289355..66c44ed15a61a6e17d9e53ffe365396b26ca3b9b 100644
--- a/examples/simple_example_3.py
+++ b/examples/simple_example_3.py
@@ -2,10 +2,10 @@ import random
 
 import numpy as np
 
-from flatland.envs.agent_generators import complex_rail_generator_agents_placer
-from flatland.envs.generators import complex_rail_generator
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.schedule_generators import complex_rail_generator_agents_placer
 from flatland.utils.rendertools import RenderTool
 
 random.seed(1)
diff --git a/examples/training_example.py b/examples/training_example.py
index f339d32958423b90f6ed2c8b6e079737eeb919fe..3c1cddd03337e63b234f83cc98aca4993cd26de8 100644
--- a/examples/training_example.py
+++ b/examples/training_example.py
@@ -1,10 +1,10 @@
 import numpy as np
 
-from flatland.envs.agent_generators import complex_rail_generator_agents_placer
-from flatland.envs.generators import complex_rail_generator
 from flatland.envs.observations import TreeObsForRailEnv, LocalObsForRailEnv
 from flatland.envs.predictions import ShortestPathPredictorForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.schedule_generators import complex_rail_generator_agents_placer
 from flatland.utils.rendertools import RenderTool
 
 np.random.seed(1)
diff --git a/flatland/cli.py b/flatland/cli.py
index 56b2feab0bb46472b5dff916ac74f6760080ebe3..b2509287185a1582573a6eba347ef7d6ec27f10f 100644
--- a/flatland/cli.py
+++ b/flatland/cli.py
@@ -8,9 +8,9 @@ import click
 import numpy as np
 import redis
 
-from flatland.envs.agent_generators import complex_rail_generator_agents_placer
-from flatland.envs.generators import complex_rail_generator
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.schedule_generators import complex_rail_generator_agents_placer
 from flatland.evaluators.service import FlatlandRemoteEvaluationService
 from flatland.utils.rendertools import RenderTool
 
diff --git a/flatland/envs/rail_env.py b/flatland/envs/rail_env.py
index 27664403b40ac358009218b94a16a31c97d187ed..322bbf096dd1e88e7edab808624c861c6cb408d0 100644
--- a/flatland/envs/rail_env.py
+++ b/flatland/envs/rail_env.py
@@ -11,10 +11,10 @@ import numpy as np
 
 from flatland.core.env import Environment
 from flatland.core.grid.grid4_utils import get_new_position
-from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail, AgentGenerator
 from flatland.envs.agent_utils import EnvAgentStatic, EnvAgent
-from flatland.envs.generators import random_rail_generator, RailGenerator
 from flatland.envs.observations import TreeObsForRailEnv
+from flatland.envs.rail_generators import random_rail_generator, RailGenerator
+from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail, ScheduleGenerator
 
 m.patch()
 
@@ -93,7 +93,7 @@ class RailEnv(Environment):
                  width,
                  height,
                  rail_generator: RailGenerator = random_rail_generator(),
-                 agent_generator: AgentGenerator = get_rnd_agents_pos_tgt_dir_on_rail(),
+                 agent_generator: ScheduleGenerator = get_rnd_agents_pos_tgt_dir_on_rail(),
                  number_of_agents=1,
                  obs_builder_object=TreeObsForRailEnv(max_depth=2),
                  max_episode_steps=None,
@@ -110,11 +110,11 @@ class RailEnv(Environment):
             the env has been reset, and returns a GridTransitionMap object and a list of
             starting positions, targets, and initial orientations for agent handle.
             The rail_generator can pass a distance map in the hints or information for specific agent_generators.
-            Implementations can be found in flatland/envs/generators.py
+            Implementations can be found in flatland/envs/rail_generators.py
         agent_generator : function
             The agent_generator function is a function that takes the grid, the number of agents and optional hints
             and returns a list of starting positions, targets, initial orientations and speed for all agent handles.
-            Implementations can be found in flatland/envs/agent_generators.py
+            Implementations can be found in flatland/envs/schedule_generators.py
         width : int
             The width of the rail map. Potentially in the future,
             a range of widths to sample from.
@@ -133,7 +133,7 @@ class RailEnv(Environment):
         """
 
         self.rail_generator: RailGenerator = rail_generator
-        self.agent_generator: AgentGenerator = agent_generator
+        self.agent_generator: ScheduleGenerator = agent_generator
         self.rail = None
         self.width = width
         self.height = height
diff --git a/flatland/envs/generators.py b/flatland/envs/rail_generators.py
similarity index 100%
rename from flatland/envs/generators.py
rename to flatland/envs/rail_generators.py
diff --git a/flatland/envs/agent_generators.py b/flatland/envs/schedule_generators.py
similarity index 93%
rename from flatland/envs/agent_generators.py
rename to flatland/envs/schedule_generators.py
index c03511bc186bb41554eecb8c1c62b73482012ed0..50f313781acdd6e70f71ef5f82d6ddb0b8c2181d 100644
--- a/flatland/envs/agent_generators.py
+++ b/flatland/envs/schedule_generators.py
@@ -1,4 +1,4 @@
-"""Agent generators (railway undertaking, "EVU")."""
+"""Schedule generators (railway undertaking, "EVU")."""
 from typing import Tuple, List, Callable, Mapping, Optional, Any
 
 import msgpack
@@ -9,8 +9,8 @@ from flatland.core.transition_map import GridTransitionMap
 from flatland.envs.agent_utils import EnvAgentStatic
 
 AgentPosition = Tuple[int, int]
-AgentGeneratorProduct = Tuple[List[AgentPosition], List[AgentPosition], List[AgentPosition], List[float]]
-AgentGenerator = Callable[[GridTransitionMap, int, Optional[Any]], AgentGeneratorProduct]
+ScheduleGeneratorProduct = Tuple[List[AgentPosition], List[AgentPosition], List[AgentPosition], List[float]]
+ScheduleGenerator = Callable[[GridTransitionMap, int, Optional[Any]], ScheduleGeneratorProduct]
 
 
 def speed_initialization_helper(nb_agents: int, speed_ratio_map: Mapping[float, float] = None) -> List[float]:
@@ -37,7 +37,7 @@ def speed_initialization_helper(nb_agents: int, speed_ratio_map: Mapping[float,
     return list(map(lambda index: speeds[index], np.random.choice(nb_classes, nb_agents, p=speed_ratios)))
 
 
-def complex_rail_generator_agents_placer(speed_ratio_map: Mapping[float, float] = None) -> AgentGenerator:
+def complex_rail_generator_agents_placer(speed_ratio_map: Mapping[float, float] = None) -> ScheduleGenerator:
     def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None):
         start_goal = hints['start_goal']
         start_dir = hints['start_dir']
@@ -55,7 +55,7 @@ def complex_rail_generator_agents_placer(speed_ratio_map: Mapping[float, float]
     return generator
 
 
-def get_rnd_agents_pos_tgt_dir_on_rail(speed_ratio_map: Mapping[float, float] = None) -> AgentGenerator:
+def get_rnd_agents_pos_tgt_dir_on_rail(speed_ratio_map: Mapping[float, float] = None) -> ScheduleGenerator:
     """
     Given a `rail' GridTransitionMap, return a random placement of agents (initial position, direction and target).
 
@@ -73,7 +73,7 @@ def get_rnd_agents_pos_tgt_dir_on_rail(speed_ratio_map: Mapping[float, float] =
         initial positions, directions, targets speeds
     """
 
-    def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> AgentGeneratorProduct:
+    def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> ScheduleGeneratorProduct:
         def _path_exists(rail, start, direction, end):
             # BFS - Check if a path exists between the 2 nodes
 
@@ -151,7 +151,7 @@ def get_rnd_agents_pos_tgt_dir_on_rail(speed_ratio_map: Mapping[float, float] =
     return generator
 
 
-def agents_from_file(filename) -> AgentGenerator:
+def agents_from_file(filename) -> ScheduleGenerator:
     """
     Utility to load pickle file
 
@@ -165,7 +165,7 @@ def agents_from_file(filename) -> AgentGenerator:
         initial positions, directions, targets speeds
     """
 
-    def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> AgentGeneratorProduct:
+    def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> ScheduleGeneratorProduct:
         with open(filename, "rb") as file_in:
             load_data = file_in.read()
         data = msgpack.unpackb(load_data, use_list=False)
diff --git a/flatland/evaluators/client.py b/flatland/evaluators/client.py
index a4968c0c8e827c060e0e3f7de0cf28cc0658089b..f2dac1c8705a651e2a7be026b4bd82a961efbbdd 100644
--- a/flatland/evaluators/client.py
+++ b/flatland/evaluators/client.py
@@ -1,18 +1,21 @@
-import redis
+import hashlib
 import json
+import logging
 import os
-import numpy as np
+import random
+import time
+
 import msgpack
 import msgpack_numpy as m
-import hashlib
-import random
-from flatland.evaluators import messages
-from flatland.envs.rail_env import RailEnv
-from flatland.envs.generators import rail_from_file
+import numpy as np
+import redis
+
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.predictions import ShortestPathPredictorForRailEnv
-import time
-import logging
+from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import rail_from_file
+from flatland.evaluators import messages
+
 logger = logging.getLogger(__name__)
 logger.setLevel(logging.INFO)
 m.patch()
@@ -22,8 +25,8 @@ def are_dicts_equal(d1, d2):
     """ return True if all keys and values are the same """
     return all(k in d2 and d1[k] == d2[k]
                for k in d1) \
-        and all(k in d1 and d1[k] == d2[k]
-               for k in d2)
+           and all(k in d1 and d1[k] == d2[k]
+                   for k in d2)
 
 
 class FlatlandRemoteClient(object):
@@ -41,39 +44,40 @@ class FlatlandRemoteClient(object):
         where `service_id` is either provided as an `env` variable or is
         instantiated to "flatland_rl_redis_service_id"
     """
-    def __init__(self,  
-                remote_host='127.0.0.1',
-                remote_port=6379,
-                remote_db=0,
-                remote_password=None,
-                test_envs_root=None,
-                verbose=False):
+
+    def __init__(self,
+                 remote_host='127.0.0.1',
+                 remote_port=6379,
+                 remote_db=0,
+                 remote_password=None,
+                 test_envs_root=None,
+                 verbose=False):
 
         self.remote_host = remote_host
         self.remote_port = remote_port
         self.remote_db = remote_db
         self.remote_password = remote_password
         self.redis_pool = redis.ConnectionPool(
-                                host=remote_host,
-                                port=remote_port,
-                                db=remote_db,
-                                password=remote_password)
+            host=remote_host,
+            port=remote_port,
+            db=remote_db,
+            password=remote_password)
         self.namespace = "flatland-rl"
         self.service_id = os.getenv(
-                            'FLATLAND_RL_SERVICE_ID',
-                            'FLATLAND_RL_SERVICE_ID'
-                            )
+            'FLATLAND_RL_SERVICE_ID',
+            'FLATLAND_RL_SERVICE_ID'
+        )
         self.command_channel = "{}::{}::commands".format(
-                                    self.namespace,
-                                    self.service_id
-                                )
+            self.namespace,
+            self.service_id
+        )
         if test_envs_root:
             self.test_envs_root = test_envs_root
         else:
             self.test_envs_root = os.getenv(
-                                'AICROWD_TESTS_FOLDER',
-                                '/tmp/flatland_envs'
-                                )
+                'AICROWD_TESTS_FOLDER',
+                '/tmp/flatland_envs'
+            )
 
         self.verbose = verbose
 
@@ -85,12 +89,12 @@ class FlatlandRemoteClient(object):
 
     def _generate_response_channel(self):
         random_hash = hashlib.md5(
-                        "{}".format(
-                                random.randint(0, 10**10)
-                            ).encode('utf-8')).hexdigest()
+            "{}".format(
+                random.randint(0, 10 ** 10)
+            ).encode('utf-8')).hexdigest()
         response_channel = "{}::{}::response::{}".format(self.namespace,
-                                                        self.service_id,
-                                                        random_hash)
+                                                         self.service_id,
+                                                         random_hash)
         return response_channel
 
     def _blocking_request(self, _request):
@@ -124,9 +128,9 @@ class FlatlandRemoteClient(object):
         if self.verbose:
             print("Response : ", _response)
         _response = msgpack.unpackb(
-                        _response, 
-                        object_hook=m.decode, 
-                        encoding="utf8")
+            _response,
+            object_hook=m.decode,
+            encoding="utf8")
         if _response['type'] == messages.FLATLAND_RL.ERROR:
             raise Exception(str(_response["payload"]))
         else:
@@ -181,7 +185,7 @@ class FlatlandRemoteClient(object):
                 "Did you remember to set the AICROWD_TESTS_FOLDER environment variable "
                 "to point to the location of the Tests folder ? \n"
                 "We are currently looking at `{}` for the tests".format(self.test_envs_root)
-                )
+            )
         print("Current env path : ", test_env_file_path)
         self.env = RailEnv(
             width=1,
@@ -207,7 +211,7 @@ class FlatlandRemoteClient(object):
         _request['payload']['action'] = action
         _response = self._blocking_request(_request)
         _payload = _response['payload']
-        
+
         # remote_observation = _payload['observation']
         remote_reward = _payload['reward']
         remote_done = _payload['done']
@@ -216,14 +220,14 @@ class FlatlandRemoteClient(object):
         # Replicate the action in the local env
         local_observation, local_reward, local_done, local_info = \
             self.env.step(action)
-        
+
         print(local_reward)
         if not are_dicts_equal(remote_reward, local_reward):
             raise Exception("local and remote `reward` are diverging")
             print(remote_reward, local_reward)
         if not are_dicts_equal(remote_done, local_done):
             raise Exception("local and remote `done` are diverging")
-        
+
         # Return local_observation instead of remote_observation
         # as the remote_observation is build using a dummy observation
         # builder
@@ -250,21 +254,23 @@ class FlatlandRemoteClient(object):
 if __name__ == "__main__":
     remote_client = FlatlandRemoteClient()
 
+
     def my_controller(obs, _env):
         _action = {}
         for _idx, _ in enumerate(_env.agents):
             _action[_idx] = np.random.randint(0, 5)
         return _action
-    
+
+
     my_observation_builder = TreeObsForRailEnv(max_depth=3,
-                                predictor=ShortestPathPredictorForRailEnv())
+                                               predictor=ShortestPathPredictorForRailEnv())
 
     episode = 0
     obs = True
-    while obs:        
+    while obs:
         obs = remote_client.env_create(
-                    obs_builder_object=my_observation_builder
-                    )
+            obs_builder_object=my_observation_builder
+        )
         if not obs:
             """
             The remote env returns False as the first obs
@@ -285,7 +291,5 @@ if __name__ == "__main__":
                 print("Reward : ", sum(list(all_rewards.values())))
                 break
 
-    print("Evaluation Complete...")       
+    print("Evaluation Complete...")
     print(remote_client.submit())
-
-
diff --git a/flatland/evaluators/service.py b/flatland/evaluators/service.py
index 3ad0a97598c8beb66fc164eb45b670c87f3c96f9..8967b52d9d6ee70a7eb8af257ef6b4e25b531314 100644
--- a/flatland/evaluators/service.py
+++ b/flatland/evaluators/service.py
@@ -1,24 +1,26 @@
 #!/usr/bin/env python
 from __future__ import print_function
-import redis
-from flatland.envs.generators import rail_from_file
-from flatland.envs.rail_env import RailEnv
-from flatland.core.env_observation_builder import DummyObservationBuilder
-from flatland.evaluators import messages
-from flatland.evaluators import aicrowd_helpers
-from flatland.utils.rendertools import RenderTool
-import numpy as np
-import msgpack
-import msgpack_numpy as m
-import os
+
 import glob
+import os
+import random
 import shutil
 import time
 import traceback
+
 import crowdai_api
+import msgpack
+import msgpack_numpy as m
+import numpy as np
+import redis
 import timeout_decorator
-import random
 
+from flatland.core.env_observation_builder import DummyObservationBuilder
+from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import rail_from_file
+from flatland.evaluators import aicrowd_helpers
+from flatland.evaluators import messages
+from flatland.utils.rendertools import RenderTool
 
 use_signals_in_timeout = True
 if os.name == 'nt':
@@ -35,7 +37,7 @@ m.patch()
 ########################################################
 # CONSTANTS
 ########################################################
-PER_STEP_TIMEOUT = 10*60  # 5 minutes
+PER_STEP_TIMEOUT = 10 * 60  # 5 minutes
 
 
 class FlatlandRemoteEvaluationService:
@@ -59,17 +61,18 @@ class FlatlandRemoteEvaluationService:
     unpacked with `msgpack` (a patched version of msgpack which also supports
     numpy arrays).
     """
+
     def __init__(self,
-                test_env_folder="/tmp",
-                flatland_rl_service_id='FLATLAND_RL_SERVICE_ID',
-                remote_host='127.0.0.1',
-                remote_port=6379,
-                remote_db=0,
-                remote_password=None,
-                visualize=False,
-                video_generation_envs=[],
-                report=None,
-                verbose=False):
+                 test_env_folder="/tmp",
+                 flatland_rl_service_id='FLATLAND_RL_SERVICE_ID',
+                 remote_host='127.0.0.1',
+                 remote_port=6379,
+                 remote_db=0,
+                 remote_password=None,
+                 visualize=False,
+                 video_generation_envs=[],
+                 report=None,
+                 verbose=False):
 
         # Test Env folder Paths
         self.test_env_folder = test_env_folder
@@ -83,15 +86,15 @@ class FlatlandRemoteEvaluationService:
         # Logging and Reporting related vars
         self.verbose = verbose
         self.report = report
-        
+
         # Communication Protocol Related vars
         self.namespace = "flatland-rl"
         self.service_id = flatland_rl_service_id
         self.command_channel = "{}::{}::commands".format(
-                                    self.namespace, 
-                                    self.service_id
-                                )
-        
+            self.namespace,
+            self.service_id
+        )
+
         # Message Broker related vars
         self.remote_host = remote_host
         self.remote_port = remote_port
@@ -114,7 +117,7 @@ class FlatlandRemoteEvaluationService:
                 "normalized_reward": 0.0
             }
         }
-        
+
         # RailEnv specific variables
         self.env = False
         self.env_renderer = False
@@ -156,7 +159,7 @@ class FlatlandRemoteEvaluationService:
             ├── .......
             ├── .......
             └── Level_99.pkl 
-        """            
+        """
         env_paths = sorted(glob.glob(
             os.path.join(
                 self.test_env_folder,
@@ -179,16 +182,16 @@ class FlatlandRemoteEvaluationService:
         """
         if self.verbose or self.report:
             print("Attempting to connect to redis server at {}:{}/{}".format(
-                    self.remote_host, 
-                    self.remote_port, 
-                    self.remote_db))
+                self.remote_host,
+                self.remote_port,
+                self.remote_db))
 
         self.redis_pool = redis.ConnectionPool(
-                            host=self.remote_host, 
-                            port=self.remote_port, 
-                            db=self.remote_db, 
-                            password=self.remote_password
-                        )
+            host=self.remote_host,
+            port=self.remote_port,
+            db=self.remote_db,
+            password=self.remote_password
+        )
 
     def get_redis_connection(self):
         """
@@ -200,13 +203,13 @@ class FlatlandRemoteEvaluationService:
             redis_conn.ping()
         except Exception as e:
             raise Exception(
-                    "Unable to connect to redis server at {}:{} ."
-                    "Are you sure there is a redis-server running at the "
-                    "specified location ?".format(
-                        self.remote_host,
-                        self.remote_port
-                        )
-                    )
+                "Unable to connect to redis server at {}:{} ."
+                "Are you sure there is a redis-server running at the "
+                "specified location ?".format(
+                    self.remote_host,
+                    self.remote_port
+                )
+            )
         return redis_conn
 
     def _error_template(self, payload):
@@ -220,8 +223,8 @@ class FlatlandRemoteEvaluationService:
         return _response
 
     @timeout_decorator.timeout(
-                        PER_STEP_TIMEOUT,
-                        use_signals=use_signals_in_timeout)  # timeout for each command
+        PER_STEP_TIMEOUT,
+        use_signals=use_signals_in_timeout)  # timeout for each command
     def _get_next_command(self, _redis):
         """
         A low level wrapper for obtaining the next command from a 
@@ -231,7 +234,7 @@ class FlatlandRemoteEvaluationService:
         """
         command = _redis.brpop(self.command_channel)[1]
         return command
-    
+
     def get_next_command(self):
         """
         A helper function to obtain the next command, which transparently 
@@ -246,18 +249,18 @@ class FlatlandRemoteEvaluationService:
                 print("Command Service: ", command)
         except timeout_decorator.timeout_decorator.TimeoutError:
             raise Exception(
-                    "Timeout in step {} of simulation {}".format(
-                            self.current_step,
-                            self.simulation_count
-                            ))
+                "Timeout in step {} of simulation {}".format(
+                    self.current_step,
+                    self.simulation_count
+                ))
         command = msgpack.unpackb(
-                    command, 
-                    object_hook=m.decode, 
-                    encoding="utf8"
-                )
+            command,
+            object_hook=m.decode,
+            encoding="utf8"
+        )
         if self.verbose:
             print("Received Request : ", command)
-        
+
         return command
 
     def send_response(self, _command_response, command, suppress_logs=False):
@@ -266,15 +269,15 @@ class FlatlandRemoteEvaluationService:
 
         if self.verbose and not suppress_logs:
             print("Responding with : ", _command_response)
-        
+
         _redis.rpush(
-            command_response_channel, 
+            command_response_channel,
             msgpack.packb(
-                _command_response, 
-                default=m.encode, 
+                _command_response,
+                default=m.encode,
                 use_bin_type=True)
         )
-        
+
     def handle_ping(self, command):
         """
         Handles PING command from the client.
@@ -313,9 +316,9 @@ class FlatlandRemoteEvaluationService:
             )
             if self.visualize:
                 if self.env_renderer:
-                    del self.env_renderer     
+                    del self.env_renderer
                 self.env_renderer = RenderTool(self.env, gl="PILSVG", )
-            
+
             # Set max episode steps allowed
             self.env._max_episode_steps = \
                 int(1.5 * (self.env.width + self.env.height))
@@ -323,7 +326,7 @@ class FlatlandRemoteEvaluationService:
             if self.begin_simulation:
                 # If begin simulation has already been initialized 
                 # atleast once
-                self.simulation_times.append(time.time()-self.begin_simulation)
+                self.simulation_times.append(time.time() - self.begin_simulation)
             self.begin_simulation = time.time()
 
             self.simulation_rewards.append(0)
@@ -348,15 +351,15 @@ class FlatlandRemoteEvaluationService:
             _command_response['type'] = messages.FLATLAND_RL.ENV_CREATE_RESPONSE
             _command_response['payload'] = {}
             _command_response['payload']['observation'] = False
-            _command_response['payload']['env_file_path'] = False            
+            _command_response['payload']['env_file_path'] = False
 
         self.send_response(_command_response, command)
         #####################################################################
         # Update evaluation state
         #####################################################################
         progress = np.clip(
-                    self.simulation_count * 1.0 / len(self.env_file_paths),
-                    0, 1)
+            self.simulation_count * 1.0 / len(self.env_file_paths),
+            0, 1)
         mean_reward = round(np.mean(self.simulation_rewards), 2)
         mean_normalized_reward = round(np.mean(self.simulation_rewards_normalized), 2)
         mean_percentage_complete = round(np.mean(self.simulation_percentage_complete), 3)
@@ -399,9 +402,9 @@ class FlatlandRemoteEvaluationService:
         """
         self.simulation_rewards_normalized[-1] += \
             cumulative_reward / (
-                        self.env._max_episode_steps + 
-                        self.env.get_num_agents()
-                    )
+                self.env._max_episode_steps +
+                self.env.get_num_agents()
+            )
 
         if done["__all__"]:
             # Compute percentage complete
@@ -412,14 +415,14 @@ class FlatlandRemoteEvaluationService:
                     complete += 1
             percentage_complete = complete * 1.0 / self.env.get_num_agents()
             self.simulation_percentage_complete[-1] = percentage_complete
-        
+
         # Record Frame
         if self.visualize:
             self.env_renderer.render_env(
-                                show=False, 
-                                show_observations=False, 
-                                show_predictions=False
-                                )
+                show=False,
+                show_observations=False,
+                show_predictions=False
+            )
             """
             Only save the frames for environments which are separately provided 
             in video_generation_indices param
@@ -427,10 +430,10 @@ class FlatlandRemoteEvaluationService:
             current_env_path = self.env_file_paths[self.simulation_count]
             if current_env_path in self.video_generation_envs:
                 self.env_renderer.gl.save_image(
-                        os.path.join(
-                            self.vizualization_folder_name,
-                            "flatland_frame_{:04d}.png".format(self.record_frame_step)
-                        ))
+                    os.path.join(
+                        self.vizualization_folder_name,
+                        "flatland_frame_{:04d}.png".format(self.record_frame_step)
+                    ))
                 self.record_frame_step += 1
 
         # Build and send response
@@ -453,7 +456,7 @@ class FlatlandRemoteEvaluationService:
         _payload = command['payload']
 
         # Register simulation time of the last episode
-        self.simulation_times.append(time.time()-self.begin_simulation)
+        self.simulation_times.append(time.time() - self.begin_simulation)
 
         if len(self.simulation_rewards) != len(self.env_file_paths):
             raise Exception(
@@ -461,7 +464,7 @@ class FlatlandRemoteEvaluationService:
                 to operate on all the test environments.
                 """
             )
-        
+
         mean_reward = round(np.mean(self.simulation_rewards), 2)
         mean_normalized_reward = round(np.mean(self.simulation_rewards_normalized), 2)
         mean_percentage_complete = round(np.mean(self.simulation_percentage_complete), 3)
@@ -473,7 +476,7 @@ class FlatlandRemoteEvaluationService:
             # install it by : 
             #
             # conda install -c conda-forge x264 ffmpeg
-            
+
             print("Generating Video from thumbnails...")
             video_output_path, video_thumb_output_path = \
                 aicrowd_helpers.generate_movie_from_frames(
@@ -518,14 +521,14 @@ class FlatlandRemoteEvaluationService:
         self.evaluation_state["score"]["score_secondary"] = mean_reward
         self.evaluation_state["meta"]["normalized_reward"] = mean_normalized_reward
         self.handle_aicrowd_success_event(self.evaluation_state)
-        print("#"*100)
+        print("#" * 100)
         print("EVALUATION COMPLETE !!")
-        print("#"*100)
+        print("#" * 100)
         print("# Mean Reward : {}".format(mean_reward))
         print("# Mean Normalized Reward : {}".format(mean_normalized_reward))
         print("# Mean Percentage Complete : {}".format(mean_percentage_complete))
-        print("#"*100)
-        print("#"*100)
+        print("#" * 100)
+        print("#" * 100)
 
     def report_error(self, error_message, command_response_channel):
         """
@@ -536,16 +539,16 @@ class FlatlandRemoteEvaluationService:
         _command_response['type'] = messages.FLATLAND_RL.ERROR
         _command_response['payload'] = error_message
         _redis.rpush(
-            command_response_channel, 
+            command_response_channel,
             msgpack.packb(
-                _command_response, 
-                default=m.encode, 
+                _command_response,
+                default=m.encode,
                 use_bin_type=True)
-            )
+        )
         self.evaluation_state["state"] = "ERROR"
         self.evaluation_state["error"] = error_message
         self.handle_aicrowd_error_event(self.evaluation_state)
-    
+
     def handle_aicrowd_info_event(self, payload):
         self.oracle_events.register_event(
             event_type=self.oracle_events.CROWDAI_EVENT_INFO,
@@ -577,17 +580,17 @@ class FlatlandRemoteEvaluationService:
                 print("Self.Reward : ", self.reward)
                 print("Current Simulation : ", self.simulation_count)
                 if self.env_file_paths and \
-                        self.simulation_count < len(self.env_file_paths):
+                    self.simulation_count < len(self.env_file_paths):
                     print("Current Env Path : ",
-                        self.env_file_paths[self.simulation_count])
+                          self.env_file_paths[self.simulation_count])
 
-            try:                
+            try:
                 if command['type'] == messages.FLATLAND_RL.PING:
                     """
                         INITIAL HANDSHAKE : Respond with PONG
                     """
                     self.handle_ping(command)
-                
+
                 elif command['type'] == messages.FLATLAND_RL.ENV_CREATE:
                     """
                         ENV_CREATE
@@ -612,8 +615,8 @@ class FlatlandRemoteEvaluationService:
                     self.handle_env_submit(command)
                 else:
                     _error = self._error_template(
-                                    "UNKNOWN_REQUEST:{}".format(
-                                        str(command)))
+                        "UNKNOWN_REQUEST:{}".format(
+                            str(command)))
                     if self.verbose:
                         print("Responding with : ", _error)
                     self.report_error(
@@ -631,10 +634,11 @@ class FlatlandRemoteEvaluationService:
 
 if __name__ == "__main__":
     import argparse
+
     parser = argparse.ArgumentParser(description='Submit the result to AIcrowd')
-    parser.add_argument('--service_id', 
-                        dest='service_id', 
-                        default='FLATLAND_RL_SERVICE_ID', 
+    parser.add_argument('--service_id',
+                        dest='service_id',
+                        default='FLATLAND_RL_SERVICE_ID',
                         required=False)
     parser.add_argument('--test_folder',
                         dest='test_folder',
@@ -642,16 +646,16 @@ if __name__ == "__main__":
                         help="Folder containing the files for the test envs",
                         required=False)
     args = parser.parse_args()
-    
+
     test_folder = args.test_folder
 
     grader = FlatlandRemoteEvaluationService(
-                test_env_folder=test_folder,
-                flatland_rl_service_id=args.service_id,
-                verbose=True,
-                visualize=True,
-                video_generation_envs=["Test_0/Level_1.pkl"]
-                )
+        test_env_folder=test_folder,
+        flatland_rl_service_id=args.service_id,
+        verbose=True,
+        visualize=True,
+        video_generation_envs=["Test_0/Level_1.pkl"]
+    )
     result = grader.run()
     if result['type'] == messages.FLATLAND_RL.ENV_SUBMIT_RESPONSE:
         cumulative_results = result['payload']
diff --git a/flatland/utils/editor.py b/flatland/utils/editor.py
index 69be59ae2a957f6a2aaa948d9830472d7824516a..af1aad222919b00b716dd9da0f3be9534d54e411 100644
--- a/flatland/utils/editor.py
+++ b/flatland/utils/editor.py
@@ -11,9 +11,9 @@ from numpy import array
 import flatland.utils.rendertools as rt
 from flatland.core.grid.grid4_utils import mirror
 from flatland.envs.agent_utils import EnvAgent, EnvAgentStatic
-from flatland.envs.generators import complex_rail_generator, empty_rail_generator
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.rail_env import RailEnv, random_rail_generator
+from flatland.envs.rail_generators import complex_rail_generator, empty_rail_generator
 
 
 class EditorMVC(object):
diff --git a/tests/test_distance_map.py b/tests/test_distance_map.py
index dbeb2fb46513d3badcc7694365b9204ad379380a..566505b7fa5c8389fd31e90ec565a5728c10a2b0 100644
--- a/tests/test_distance_map.py
+++ b/tests/test_distance_map.py
@@ -2,11 +2,11 @@ import numpy as np
 
 from flatland.core.grid.grid4 import Grid4Transitions
 from flatland.core.transition_map import GridTransitionMap
-from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail
-from flatland.envs.generators import rail_from_grid_transition_map
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.predictions import ShortestPathPredictorForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import rail_from_grid_transition_map
+from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail
 
 
 def test_walker():
diff --git a/tests/test_flatland_envs_observations.py b/tests/test_flatland_envs_observations.py
index c0e28534673ba1bdd9fccfde6259c1cb89fa39d6..63f4a9a52c147f0bd8181181d84ff8b8ead529c6 100644
--- a/tests/test_flatland_envs_observations.py
+++ b/tests/test_flatland_envs_observations.py
@@ -4,12 +4,12 @@
 import numpy as np
 
 from flatland.core.grid.grid4 import Grid4TransitionsEnum
-from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail
 from flatland.envs.agent_utils import EnvAgent
-from flatland.envs.generators import rail_from_grid_transition_map
 from flatland.envs.observations import GlobalObsForRailEnv, TreeObsForRailEnv
 from flatland.envs.predictions import ShortestPathPredictorForRailEnv
 from flatland.envs.rail_env import RailEnv, RailEnvActions
+from flatland.envs.rail_generators import rail_from_grid_transition_map
+from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail
 from flatland.utils.rendertools import RenderTool
 from flatland.utils.simple_rail import make_simple_rail
 
diff --git a/tests/test_flatland_envs_predictions.py b/tests/test_flatland_envs_predictions.py
index 8c67a42aab026563a11981175395ca7e3180fd42..b58be79bc9db0cee5c2a523c965ec6cd96f18e52 100644
--- a/tests/test_flatland_envs_predictions.py
+++ b/tests/test_flatland_envs_predictions.py
@@ -5,11 +5,11 @@ import pprint
 import numpy as np
 
 from flatland.core.grid.grid4 import Grid4TransitionsEnum
-from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail
-from flatland.envs.generators import rail_from_grid_transition_map
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.predictions import DummyPredictorForRailEnv, ShortestPathPredictorForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import rail_from_grid_transition_map
+from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail
 from flatland.utils.rendertools import RenderTool
 from flatland.utils.simple_rail import make_simple_rail
 
diff --git a/tests/test_flatland_envs_rail_env.py b/tests/test_flatland_envs_rail_env.py
index 9108d614e0b98ab7e302c285c8d0b9805b7b37ce..a812e01f5ed8e2f78be0411f0a29667c01981876 100644
--- a/tests/test_flatland_envs_rail_env.py
+++ b/tests/test_flatland_envs_rail_env.py
@@ -5,13 +5,13 @@ import numpy as np
 from flatland.core.grid.grid4 import Grid4Transitions
 from flatland.core.grid.rail_env_grid import RailEnvTransitions
 from flatland.core.transition_map import GridTransitionMap
-from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail, complex_rail_generator_agents_placer
 from flatland.envs.agent_utils import EnvAgent
 from flatland.envs.agent_utils import EnvAgentStatic
-from flatland.envs.generators import complex_rail_generator
-from flatland.envs.generators import rail_from_grid_transition_map
 from flatland.envs.observations import GlobalObsForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.rail_generators import rail_from_grid_transition_map
+from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail, complex_rail_generator_agents_placer
 
 """Tests for `flatland` package."""
 
diff --git a/tests/test_flatland_malfunction.py b/tests/test_flatland_malfunction.py
index 60a15bb7d40fde7dcab4f06d2292d3bdc63f1fca..0877e63c1f049a35dbfd5b3686810d0ddb1833bc 100644
--- a/tests/test_flatland_malfunction.py
+++ b/tests/test_flatland_malfunction.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from flatland.envs.agent_generators import complex_rail_generator_agents_placer
-from flatland.envs.generators import complex_rail_generator
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.schedule_generators import complex_rail_generator_agents_placer
 
 
 class SingleAgentNavigationObs(TreeObsForRailEnv):
diff --git a/tests/test_flatland_utils_rendertools.py b/tests/test_flatland_utils_rendertools.py
index ac5d7f4132b5c224206af3602b6c1341fe026d8b..8248c675995fc5c906e82d8650a5b619e7b038f2 100644
--- a/tests/test_flatland_utils_rendertools.py
+++ b/tests/test_flatland_utils_rendertools.py
@@ -11,9 +11,9 @@ from importlib_resources import path
 
 import flatland.utils.rendertools as rt
 import images.test
-from flatland.envs.generators import empty_rail_generator
 from flatland.envs.observations import TreeObsForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import empty_rail_generator
 
 
 def checkFrozenImage(oRT, sFileImage, resave=False):
diff --git a/tests/test_multi_speed.py b/tests/test_multi_speed.py
index 8703800ec80c72659a11cc520c7f20df39cde158..dff0d2c2cacc8debdf7aa95867b004ba965373c2 100644
--- a/tests/test_multi_speed.py
+++ b/tests/test_multi_speed.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from flatland.envs.agent_generators import complex_rail_generator_agents_placer
-from flatland.envs.generators import complex_rail_generator
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.schedule_generators import complex_rail_generator_agents_placer
 
 np.random.seed(1)
 
diff --git a/tests/test_speed_classes.py b/tests/test_speed_classes.py
index 67054c81706cd8147c1f9bfc9e2387c4f5fb2823..d2754c2a1ff356d91c90fd473184f6d23639fd35 100644
--- a/tests/test_speed_classes.py
+++ b/tests/test_speed_classes.py
@@ -1,9 +1,9 @@
 """Test speed initialization by a map of speeds and their corresponding ratios."""
 import numpy as np
 
-from flatland.envs.agent_generators import speed_initialization_helper, complex_rail_generator_agents_placer
-from flatland.envs.generators import complex_rail_generator
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import complex_rail_generator
+from flatland.envs.schedule_generators import speed_initialization_helper, complex_rail_generator_agents_placer
 
 
 def test_speed_initialization_helper():
diff --git a/tests/tests_generators.py b/tests/tests_generators.py
index 46109c55a643f3a822acf1ba23f81241d2b26ef5..31cc8d1f29166b3366e606e2fb4c4e2d04567275 100644
--- a/tests/tests_generators.py
+++ b/tests/tests_generators.py
@@ -3,13 +3,13 @@
 
 import numpy as np
 
-from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail, complex_rail_generator_agents_placer, \
-    agents_from_file
-from flatland.envs.generators import rail_from_grid_transition_map, rail_from_file, complex_rail_generator, \
-    random_rail_generator, empty_rail_generator
 from flatland.envs.observations import TreeObsForRailEnv, GlobalObsForRailEnv
 from flatland.envs.predictions import ShortestPathPredictorForRailEnv
 from flatland.envs.rail_env import RailEnv
+from flatland.envs.rail_generators import rail_from_grid_transition_map, rail_from_file, complex_rail_generator, \
+    random_rail_generator, empty_rail_generator
+from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail, complex_rail_generator_agents_placer, \
+    agents_from_file
 from flatland.utils.simple_rail import make_simple_rail