diff --git a/flatland/utils/jupyter_utils.py b/flatland/utils/jupyter_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..a2f37dfb6716ef5288f3b9e6be10fd89ae7a59f9
--- /dev/null
+++ b/flatland/utils/jupyter_utils.py
@@ -0,0 +1,48 @@
+
+
+import PIL
+from IPython import display
+from ipycanvas import canvas
+import time
+
+from flatland.envs import malfunction_generators as malgen
+from flatland.envs.agent_utils import EnvAgent
+#from flatland.envs import sparse_rail_gen as spgen
+from flatland.envs import rail_generators as rail_gen
+from flatland.envs import agent_chains as ac
+from flatland.envs.rail_env import RailEnv, RailEnvActions
+from flatland.envs.persistence import RailEnvPersister
+from flatland.utils.rendertools import RenderTool
+from flatland.utils import env_edit_utils as eeu
+
+
+class Behaviour():
+    def __init__(self, env):
+        self.env = env
+
+    def getActions(self):
+        return {}
+    
+
+class AlwaysForward():
+    pass    
+
+
+class EnvCanvas():
+
+    def __init__(self, env):
+        self.env = env
+        self.oRT = RenderTool(env, show_debug=True)
+        self.render()
+        self.oCan = canvas.Canvas(size=(600,300))
+        self.oCan.put_image_data(self.oRT.get_image())
+
+    def render(self):
+        self.oRT.render_env(show_rowcols=True,  show_inactive_agents=True, show_observations=False)
+
+    def show(self):
+        self.render()
+        self.oCan.put_image_data(self.oRT.get_image())
+        display.display(self.oCan)
+
+
diff --git a/requirements_dev.txt b/requirements_dev.txt
index 1008d6efc08cb68a0315df22b6203f04daa95dc7..b35f5d03c18118e586702b8aa494b999178ce5b1 100644
--- a/requirements_dev.txt
+++ b/requirements_dev.txt
@@ -20,3 +20,4 @@ timeout-decorator>=0.4.1
 attrs
 gym==0.14.0
 networkx
+ipycanvas