diff --git a/examples/demo.py b/examples/demo.py
index 28dad21858a07e5703010571d097119403bb3e4c..e619475f1c2609c093fe04438d580b8c89edca8d 100644
--- a/examples/demo.py
+++ b/examples/demo.py
@@ -171,7 +171,12 @@ if False:
 
 
 
-demo_001 = Demo(Scenario_Generator.load_scenario('./env-data/railway/example_flatland_001.pkl'))
-demo_001.set_record_frames('./rendering/frame_{:04d}.bmp')
-demo_001.run_demo(60)
+demo_001 = Demo(Scenario_Generator.load_scenario('./env-data/railway/temp.pkl'))
+demo_001.run_demo(10)
 demo_001 = None
+
+if True:
+    demo_001 = Demo(Scenario_Generator.load_scenario('./env-data/railway/example_flatland_001.pkl'))
+    demo_001.set_record_frames('./rendering/frame_{:04d}.bmp')
+    demo_001.run_demo(60)
+    demo_001 = None
diff --git a/flatland/utils/editor.py b/flatland/utils/editor.py
index ccff0fa7ca68e9f91aca74ff65e6c84614700ed5..8b2233e5c737afc44f0f4ccc11752cc335a28984 100644
--- a/flatland/utils/editor.py
+++ b/flatland/utils/editor.py
@@ -134,19 +134,19 @@ class View(object):
 
         # abbreviated description of buttons and the methods they call
         ldButtons = [
-            dict(name="Refresh", method=self.controller.refresh, tip="Redraw only"),
-            dict(name="Clear", method=self.controller.clear, tip="Clear rails and agents"),
-            dict(name="Reset", method=self.controller.reset,
-                 tip="Standard env reset, including regen rail + agents"),
-            dict(name="Rotate Agent", method=self.controller.rotate_agent, tip="Rotate selected agent"),
-            dict(name="Restart Agents", method=self.controller.restartAgents,
-                 tip="Move agents back to start positions"),
-            dict(name="Regenerate", method=self.controller.regenerate,
-                 tip="Regenerate the rails using the method selected below"),
-            dict(name="Load", method=self.controller.load),
-            dict(name="Save", method=self.controller.save),
-            dict(name="Step", method=self.controller.step),
-            dict(name="Run Steps", method=self.controller.start_run)]
+                dict(name="Refresh", method=self.controller.refresh, tip="Redraw only"),
+                dict(name="Clear", method=self.controller.clear, tip="Clear rails and agents"),
+                dict(name="Reset", method=self.controller.reset,
+                     tip="Standard env reset, including regen rail + agents"),
+                dict(name="Rotate Agent", method=self.controller.rotate_agent, tip="Rotate selected agent"),
+                dict(name="Restart Agents", method=self.controller.restartAgents,
+                     tip="Move agents back to start positions"),
+                dict(name="Regenerate", method=self.controller.regenerate,
+                     tip="Regenerate the rails using the method selected below"),
+                dict(name="Load", method=self.controller.load),
+                dict(name="Save", method=self.controller.save),
+                dict(name="Step", method=self.controller.step)
+            ]
 
         self.lwButtons = []
         for dButton in ldButtons:
@@ -210,7 +210,11 @@ class View(object):
             self.writableData[(y - 2):(y + 2), (x - 2):(x + 2), :3] = 0
 
     def xy_to_rc(self, x, y):
-        rcCell = ((array([y, x]) - self.yxBase) / self.nPixCell).astype(int)
+        rcCell = ((array([y, x]) - self.yxBase))
+        nX = np.floor((self.yxSize[0] - self.yxBase[0])/ self.model.env.height)
+        nY = np.floor((self.yxSize[1] - self.yxBase[1])/ self.model.env.width)
+        rcCell[0] = max(0,min(np.floor(rcCell[0]/nY),self.model.env.height-1))
+        rcCell[1] = max(0,min(np.floor(rcCell[1]/nX),self.model.env.width-1))
         return rcCell
 
     def log(self, *args, **kwargs):
@@ -357,7 +361,17 @@ class Controller(object):
 
     def restartAgents(self, event):
         self.log("Restart Agents - nAgents:", self.view.wRegenNAgents.value)
-        self.model.restartAgents()
+        if self.model.init_agents_static is not None:
+            print("Restart Agents ...................")
+            print(self.model.env.agents_static)
+            self.model.env.agents_static = [EnvAgentStatic(d[0], d[1], d[2]) for d in self.model.init_agents_static ]
+            print(self.model.env.agents_static)
+            self.model.env.agents = None
+            self.model.init_agents_static = None
+            self.player = None
+            self.model.env.restart_agents()
+            self.model.env.reset(False,False)
+        self.refresh(event)
 
     def regenerate(self, event):
         method = self.view.wRegenMethod.value
@@ -379,8 +393,6 @@ class Controller(object):
     def step(self, event):
         self.model.step()
 
-    def start_run(self, event):
-        self.model.start_run()
 
     def log(self, *args, **kwargs):
         if self.view is None:
@@ -411,6 +423,7 @@ class EditorModel(object):
         self.set_env(env)
         self.iSelectedAgent = None
         self.player = None
+        self.init_agents_static = None
         self.thread = None
 
     def set_env(self, env):
@@ -637,12 +650,12 @@ class EditorModel(object):
         # if replace_agents:
         #    self.env.agents_handles = range(nAgents)
         self.env.reset(regen_rail=True, replace_agents=replace_agents)
-        self.player = Player(self.env)
+        self.player = None
         self.redraw()
 
     def restartAgents(self):
         self.env.agents = EnvAgent.list_from_static(self.env.agents_static)
-        self.player = Player(self.env)
+        self.player = None
         self.redraw()
 
     def setFilename(self, filename):
@@ -654,13 +667,15 @@ class EditorModel(object):
             self.log("load file: ", self.env_filename)
             # self.env.rail.load_transition_map(self.env_filename, override_gridsize=True)
             self.env.load(self.env_filename)
-
-            if not self.regen_size_height == self.env.height and not self.regen_size_width == self.env.width:
+            if not self.regen_size_height == self.env.height or not self.regen_size_width == self.env.width:
                 self.regen_size_height = self.env.height
                 self.regen_size_width = self.env.width
                 self.regenerate(None, 0, self.env)
                 self.env.load(self.env_filename)
 
+            self.env.restart_agents()
+            self.env.reset(False,False)
+            self.init_agents_static = None
             self.fix_env()
             self.set_env(self.env)
             self.redraw()
@@ -670,7 +685,12 @@ class EditorModel(object):
     def save(self):
         self.log("save to ", self.env_filename, " working dir: ", os.getcwd())
         # self.env.rail.save_transition_map(self.env_filename)
+        temp_store = self.env.agents
+        # clear agents before save , because we want the "init" position of the agent to expert
+        self.env.agents = []
         self.env.save(self.env_filename)
+        # reset agents current (current position)
+        self.env.agents = temp_store
 
     def regenerate(self, method=None, nAgents=0, env=None):
         self.log("Regenerate size",
@@ -696,7 +716,7 @@ class EditorModel(object):
         self.env.reset(regen_rail=True)
         self.fix_env()
         self.set_env(self.env)
-        self.player = Player(self.env)
+        self.player = None
         self.view.new_env()
         # self.view.init_canvas() # Can't do init_canvas - need to keep the same canvas widget!
         self.redraw()
@@ -745,26 +765,24 @@ class EditorModel(object):
                 # No - select the agent
                 self.iSelectedAgent = iAgent
 
+        self.init_agents_static = None
         self.redraw()
 
     def add_target(self, rcCell):
         if self.iSelectedAgent is not None:
             self.env.agents_static[self.iSelectedAgent].target = rcCell
+            self.init_agents_static = None
             self.redraw()
 
     def step(self):
+        if self.init_agents_static is None:
+            self.init_agents_static = [agent.to_list() for agent in self.env.agents_static]
         if self.player is None:
             self.player = Player(self.env)
             self.env.reset(regen_rail=False, replace_agents=False)
         self.player.step()
         self.redraw()
 
-    def start_run(self):
-        if self.thread is None:
-            self.thread = threading.Thread(target=self.bg_updater, args=(self.view.wProg_steps,))
-            self.thread.start()
-        else:
-            self.log("thread already present")
 
     def bg_updater(self, wProg_steps):
         try:
diff --git a/flatland/utils/graphics_layer.py b/flatland/utils/graphics_layer.py
index 327cf4f61605c247538000e83877f9658bbbcad5..de88b023e41acbdd20558d3bed30cb4baf69000d 100644
--- a/flatland/utils/graphics_layer.py
+++ b/flatland/utils/graphics_layer.py
@@ -68,7 +68,7 @@ class GraphicsLayer(object):
     def get_cmap(self, *args, **kwargs):
         return plt.get_cmap(*args, **kwargs)
 
-    def setRailAt(self, row, col, binTrans, iTarget=None):
+    def setRailAt(self, row, col, binTrans, iTarget=None,isSelected=False):
         """ Set the rail at cell (row, col) to have transitions binTrans.
             The target argument can contain the index of the agent to indicate
             that agent's target is at that cell, so that a station can be
@@ -76,7 +76,7 @@ class GraphicsLayer(object):
         """
         pass
 
-    def setAgentAt(self, iAgent, row, col, iDirIn, iDirOut):
+    def setAgentAt(self, iAgent, row, col, iDirIn, iDirOut,isSelected=False):
         pass
 
     def resize(self, env):
diff --git a/flatland/utils/graphics_pil.py b/flatland/utils/graphics_pil.py
index 2a06f40176c206b90b78c0fdbbd3ad3c17239347..0593543cb76fe6438bddc5613ed0b1d5c446107d 100644
--- a/flatland/utils/graphics_pil.py
+++ b/flatland/utils/graphics_pil.py
@@ -193,6 +193,13 @@ class PILGL(GraphicsLayer):
         img = Image.new("RGBA", (self.widthPx, self.heightPx), (255, 255, 255, opacity))
         return img
 
+    def clear_layer(self,iLayer=0, opacity = None):
+        if opacity is None:
+            opacity = 0 if iLayer > 0 else 255
+        self.layers[iLayer] = img = self.create_image(opacity)
+        # We also need to maintain a Draw object for each layer
+        self.draws[iLayer] = ImageDraw.Draw(img)
+
     def create_layer(self, iLayer=0, clear=True):
         # If we don't have the layers already, create them
         if len(self.layers) <= iLayer:
@@ -207,14 +214,13 @@ class PILGL(GraphicsLayer):
         else:
             # We do already have this iLayer.  Clear it if requested.
             if clear:
-                opacity = 0 if iLayer > 0 else 255
-                self.layers[iLayer] = img = self.create_image(opacity)
-                # We also need to maintain a Draw object for each layer
-                self.draws[iLayer] = ImageDraw.Draw(img)
+                self.clear_layer(iLayer)
 
     def create_layers(self, clear=True):        
-        self.create_layer(0, clear=clear)
-        self.create_layer(1, clear=clear)
+        self.create_layer(0, clear=clear) # rail / background (scene)
+        self.create_layer(1, clear=clear) # agents
+        self.create_layer(2, clear=clear) # drawing layer for selected agent
+        self.create_layer(3, clear=clear) # drawing layer for selected agent's target
 
 
 class PILSVG(PILGL):
@@ -344,7 +350,7 @@ class PILSVG(PILGL):
                     lTrans16[iTrans] = "1"
             sTrans16 = "".join(lTrans16)
             binTrans = int(sTrans16, 2)
-            print(sTrans, sTrans16, sFile)
+            # print(sTrans, sTrans16, sFile)
 
             # Merge the transition svg image with the background colour.
             # This is a shortcut / hack and will need re-working.
@@ -373,7 +379,7 @@ class PILSVG(PILGL):
 
         return dPil
 
-    def setRailAt(self, row, col, binTrans, iTarget=None):
+    def setRailAt(self, row, col, binTrans, iTarget=None,isSelected=False):
         if iTarget is None:
             if binTrans in self.dPilRail:
                 pilTrack = self.dPilRail[binTrans]
@@ -387,6 +393,12 @@ class PILSVG(PILGL):
             else:
                 print("Illegal target rail:", row, col, format(binTrans, "#018b")[2:])
 
+            if isSelected:
+                svgBG = self.pilFromSvgFile("./svg/Selected_Agent.svg")
+                self.clear_layer(3,0)
+                self.drawImageRC(svgBG,(row,col),layer=3)
+
+
     def recolorImage(self, pil, a3BaseColor, ltColors):
         rgbaImg = array(pil)
         lPils = []
@@ -435,7 +447,7 @@ class PILSVG(PILGL):
                 for iColor, pilZug3 in enumerate(lPils):
                     self.dPilZug[(iDirIn2, iDirOut2, iColor)] = lPils[iColor]
 
-    def setAgentAt(self, iAgent, row, col, iDirIn, iDirOut):
+    def setAgentAt(self, iAgent, row, col, iDirIn, iDirOut,isSelected):
         delta_dir = (iDirOut - iDirIn) % 4
         iColor = iAgent % self.nAgentColors
         # when flipping direction at a dead end, use the "iDirOut" direction.
@@ -444,6 +456,11 @@ class PILSVG(PILGL):
         pilZug = self.dPilZug[(iDirIn % 4, iDirOut % 4, iColor)]
         self.drawImageRC(pilZug, (row, col), layer=1)
 
+        if isSelected:
+            svgBG = self.pilFromSvgFile("./svg/Selected_Agent.svg")
+            self.clear_layer(2,0)
+            self.drawImageRC(svgBG,(row,col),layer=2)
+
 
 def main2():
     gl = PILSVG(10, 10)
diff --git a/flatland/utils/rendertools.py b/flatland/utils/rendertools.py
index 1c2185b69d8b3c7ba7163534a0986c19c68890f8..787ce10fa69b49266dd4196fb93d745ea4201781 100644
--- a/flatland/utils/rendertools.py
+++ b/flatland/utils/rendertools.py
@@ -757,10 +757,13 @@ class RenderTool(object):
 
             # store the targets
             dTargets = {}
+            dSelected = {}
             for iAgent, agent in enumerate(self.env.agents_static):
                 if agent is None:
                     continue
                 dTargets[tuple(agent.target)] = iAgent
+                dSelected[tuple(agent.target)] = (iAgent==iSelectedAgent)
+
 
             # Draw each cell independently
             for r in range(env.height):
@@ -768,9 +771,13 @@ class RenderTool(object):
                     binTrans = env.rail.grid[r, c]
                     if (r, c) in dTargets:
                         target = dTargets[(r, c)]
+                        isSelected = dSelected[(r, c)]
+                        print("isSelected=", isSelected)
                     else:
                         target = None
-                    self.gl.setRailAt(r, c, binTrans, iTarget=target)
+                        isSelected = False
+
+                    self.gl.setRailAt(r, c, binTrans, iTarget=target,isSelected=isSelected)
 
         for iAgent, agent in enumerate(self.env.agents):
 
@@ -788,7 +795,7 @@ class RenderTool(object):
 
             # setAgentAt uses the agent index for the color
             # cmap = self.gl.get_cmap('hsv', lut=max(len(self.env.agents), len(self.env.agents_static) + 1))
-            self.gl.setAgentAt(iAgent, *position, old_direction, direction)  # ,color=cmap(iAgent))
+            self.gl.setAgentAt(iAgent, *position, old_direction, direction, iSelectedAgent==iAgent)  # ,color=cmap(iAgent))
 
         if show_observations:
             self.renderObs(range(env.get_num_agents()), env.dev_obs_dict)
diff --git a/notebooks/Editor2.ipynb b/notebooks/Editor2.ipynb
index 5218e6d9538238f56b6187cbc1d8f40e07954953..0645909b911be07a5cf53d75225350ad01723def 100644
--- a/notebooks/Editor2.ipynb
+++ b/notebooks/Editor2.ipynb
@@ -78,34 +78,8 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "<flatland.utils.graphics_pil.PILSVG object at 0x000001C03C7A3080> <class 'flatland.utils.graphics_pil.PILSVG'>\n",
+      "<flatland.utils.graphics_pil.PILSVG object at 0x0000022C5FB44198> <class 'flatland.utils.graphics_pil.PILSVG'>\n",
       "<super: <class 'PILSVG'>, <PILSVG object>> <class 'super'>\n",
-      " 0000000000000000 Background_#91D1DD.svg\n",
-      "WE 0000000000000100 Gleis_Deadend.svg\n",
-      "WW EE NN SS 1000010000100001 Gleis_Diamond_Crossing.svg\n",
-      "WW EE 0000010000000001 Gleis_horizontal.svg\n",
-      "EN SW 0000100000010000 Gleis_Kurve_oben_links.svg\n",
-      "WN SE 0000000001001000 Gleis_Kurve_oben_rechts.svg\n",
-      "ES NW 0001001000000000 Gleis_Kurve_unten_links.svg\n",
-      "NE WS 0100000000000010 Gleis_Kurve_unten_rechts.svg\n",
-      "NN SS 1000000000100000 Gleis_vertikal.svg\n",
-      "NN SS EE WW ES NW SE WN 1001011001101001 Weiche_Double_Slip.svg\n",
-      "EE WW EN SW 0000110000010001 Weiche_horizontal_oben_links.svg\n",
-      "EE WW SE WN 0000010001001001 Weiche_horizontal_oben_rechts.svg\n",
-      "EE WW ES NW 0001011000000001 Weiche_horizontal_unten_links.svg\n",
-      "EE WW NE WS 0100010000000011 Weiche_horizontal_unten_rechts.svg\n",
-      "NN SS EE WW NW ES 1001011000100001 Weiche_Single_Slip.svg\n",
-      "NE NW ES WS 0101001000000010 Weiche_Symetrical.svg\n",
-      "NN SS EN SW 1000100000110000 Weiche_vertikal_oben_links.svg\n",
-      "NN SS SE WN 1000000001101000 Weiche_vertikal_oben_rechts.svg\n",
-      "NN SS NW ES 1001001000100000 Weiche_vertikal_unten_links.svg\n",
-      "NN SS NE WS 1100000000100010 Weiche_vertikal_unten_rechts.svg\n",
-      "EW 0000000100000000 Bahnhof_#d50000_Deadend_links.svg\n",
-      "NS 0010000000000000 Bahnhof_#d50000_Deadend_oben.svg\n",
-      "WE 0000000000000100 Bahnhof_#d50000_Deadend_rechts.svg\n",
-      "SN 0000000010000000 Bahnhof_#d50000_Deadend_unten.svg\n",
-      "EE WW 0000010000000001 Bahnhof_#d50000_Gleis_horizontal.svg\n",
-      "NN SS 1000000000100000 Bahnhof_#d50000_Gleis_vertikal.svg\n",
       "Clear rails\n"
      ]
     },
@@ -149,7 +123,7 @@
     {
      "data": {
       "application/vnd.jupyter.widget-view+json": {
-       "model_id": "82d6d69b02d14d51b773a3c2257844e6",
+       "model_id": "094a0a3e4351403d8d119b0696abaee4",
        "version_major": 2,
        "version_minor": 0
       },
@@ -159,6 +133,14 @@
      },
      "metadata": {},
      "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<flatland.utils.graphics_pil.PILSVG object at 0x0000022C6066EC50> <class 'flatland.utils.graphics_pil.PILSVG'>\n",
+      "<super: <class 'PILSVG'>, <PILSVG object>> <class 'super'>\n"
+     ]
     }
    ],
    "source": [
@@ -175,7 +157,7 @@
     {
      "data": {
       "application/vnd.jupyter.widget-view+json": {
-       "model_id": "047cd0c1a66e47ae9fcdbcef6eb6773d",
+       "model_id": "98b1504729884d8a9362dbf246d81f78",
        "version_major": 2,
        "version_minor": 0
       },
diff --git a/svg/Selected_Agent.svg b/svg/Selected_Agent.svg
new file mode 100644
index 0000000000000000000000000000000000000000..15761df861dd79c22a7099e04e4d76aefefb58f7
--- /dev/null
+++ b/svg/Selected_Agent.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Ebene_1"
+   x="0px"
+   y="0px"
+   viewBox="0 0 240 240"
+   style="enable-background:new 0 0 240 240;"
+   xml:space="preserve"
+   sodipodi:docname="Selected_Agent.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
+   id="metadata11"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+   id="defs9" /><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1920"
+   inkscape:window-height="1137"
+   id="namedview7"
+   showgrid="false"
+   inkscape:zoom="2.7812867"
+   inkscape:cx="205.50339"
+   inkscape:cy="161.549"
+   inkscape:window-x="-8"
+   inkscape:window-y="-8"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="Ebene_1" />
+<style
+   type="text/css"
+   id="style2">
+	.st0{fill:#9CCB89;}
+</style>
+
+<rect
+   id="rect13"
+   width="23.389822"
+   height="23.38983"
+   x="1.697217e-07"
+   y="-0.23616901" /><rect
+   id="rect13-0"
+   width="23.389822"
+   height="23.38983"
+   x="216.82077"
+   y="0.26172119" /><rect
+   id="rect13-0-0"
+   width="23.389822"
+   height="23.38983"
+   x="216.75911"
+   y="216.39955" /><rect
+   id="rect13-0-0-4"
+   width="23.389822"
+   height="23.38983"
+   x="0.50847793"
+   y="216.6974" /><rect
+   id="rect60"
+   width="2.5168207"
+   height="198.4693"
+   x="10.067283"
+   y="22.474777" /><rect
+   id="rect60-8"
+   width="2.5168207"
+   height="198.4693"
+   x="228.49136"
+   y="22.115229" /><rect
+   id="rect60-8-5"
+   width="2.5168207"
+   height="198.4693"
+   x="-11.868174"
+   y="19.775019"
+   transform="rotate(-90)" /><rect
+   id="rect60-8-5-1"
+   width="2.5168207"
+   height="198.4693"
+   x="-230.11249"
+   y="20.853657"
+   transform="rotate(-90)" /></svg>
\ No newline at end of file