diff --git a/boxes/Color.py b/boxes/Color.py
index d16940a..884c12b 100644
--- a/boxes/Color.py
+++ b/boxes/Color.py
@@ -1,12 +1,16 @@
 class Color:
-    BLACK = [ 0.0, 0.0, 0.0 ]
-    BLUE  = [ 0.0, 0.0, 1.0 ]
-    GREEN = [ 0.0, 1.0, 0.0 ]
-    RED   = [ 1.0, 0.0, 0.0 ]
-    WHITE = [ 1.0, 1.0, 1.0 ]
+    BLACK   = [ 0.0, 0.0, 0.0 ]
+    BLUE    = [ 0.0, 0.0, 1.0 ]
+    GREEN   = [ 0.0, 1.0, 0.0 ]
+    RED     = [ 1.0, 0.0, 0.0 ]
+    CYAN    = [ 0.0, 1.0, 1.0 ]
+    YELLOW  = [ 1.0, 1.0, 0.0 ]
+    MAGENTA = [ 1.0, 0.0, 1.0 ]
+    WHITE   = [ 1.0, 1.0, 1.0 ]
 
     # TODO: Make this configurable
     OUTER_CUT = BLACK
     INNER_CUT = BLUE
     ANNOTATIONS = RED
     ETCHING = GREEN
+    ETCHING_DEEP = CYAN
diff --git a/boxes/edges.py b/boxes/edges.py
index 97f67f3..7efad96 100644
--- a/boxes/edges.py
+++ b/boxes/edges.py
@@ -1608,7 +1608,7 @@ class CabinetHingeEdge(BaseEdge):
             th = 4*e+3*t+self.boxes.spacing
             tw = max(e, 2*t) * pairs
 
-        if self.move(tw, th, move, True):
+        if self.move(tw, th, move, True, label="hinges"):
             return
 
         if self.settings.style == "outside":
@@ -1631,7 +1631,7 @@ class CabinetHingeEdge(BaseEdge):
                               90, t, 90, (ax+t)-e, -90, l-3*t, (90, e))
                 self.moveTo(2*max(e, 1.5*t) + self.boxes.spacing)
 
-            self.move(tw, th, move)
+            self.move(tw, th, move, label="hinges")
             return
 
         if e <= 2*t:
@@ -1651,7 +1651,7 @@ class CabinetHingeEdge(BaseEdge):
             if i % 2:
                 self.moveTo(2*max(e, 2*t) + 2*self.boxes.spacing)
 
-        self.move(th, tw, move)
+        self.move(th, tw, move, label="hinges")
 
 #############################################################################
 ####     Slide-on lid
diff --git a/boxes/generators/bintray.py b/boxes/generators/bintray.py
index 682ebd0..e0760a8 100644
--- a/boxes/generators/bintray.py
+++ b/boxes/generators/bintray.py
@@ -117,28 +117,28 @@ class BinTray(Boxes):
         # outer walls
         e = ["F", "f", edges.SlottedEdge(self, self.sx[::-1], "G"), "f"]
 
-        self.rectangularWall(x, h, e, callback=[self.xHoles],  move="right")
-        self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ], move="up")
-        self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ])
-        self.rectangularWall(x, h, "Ffef", callback=[self.xHoles, ], move="left")
+        self.rectangularWall(x, h, e, callback=[self.xHoles],  move="right", label="bottom")
+        self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ], move="up", label="left")
+        self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ], label="right")
+        self.rectangularWall(x, h, "Ffef", callback=[self.xHoles, ], move="left", label="top")
         self.rectangularWall(y, h, "FFBF", move="up only")
 
         # floor
-        self.rectangularWall(x, y, "ffff", callback=[self.xSlots, self.ySlots],move="right")
+        self.rectangularWall(x, y, "ffff", callback=[self.xSlots, self.ySlots],move="right", label="back")
         # Inner walls
         for i in range(len(self.sx) - 1):
             e = [edges.SlottedEdge(self, self.sy, "f"), "f", "B", "f"]
-            self.rectangularWall(y, hi, e, move="up")
+            self.rectangularWall(y, hi, e, move="up", label="inner vertical " + str(i+1))
 
         for i in range(len(self.sy) - 1):
             e = [edges.SlottedEdge(self, self.sx, "f", slots=0.5 * hi), "f",
                  edges.SlottedEdge(self, self.sx[::-1], "G"), "f"]
-            self.rectangularWall(x, hi, e, move="up")
+            self.rectangularWall(x, hi, e, move="up", label="inner horizontal " + str(i+1))
 
         # Front walls
         for i in range(len(self.sy)):
             e = [edges.SlottedEdge(self, self.sx, "g"), "F", "e", "F"]
-            self.rectangularWall(x, self.sy[i]*self.front*2**0.5, e, callback=[self.frontHoles(i)], move="up")
+            self.rectangularWall(x, self.sy[i]*self.front*2**0.5, e, callback=[self.frontHoles(i)], move="up", label="retainer " + str(i+1))
 
 
 
diff --git a/boxes/generators/storageshelf.py b/boxes/generators/storageshelf.py
index 7cc30d4..96c226e 100644
--- a/boxes/generators/storageshelf.py
+++ b/boxes/generators/storageshelf.py
@@ -31,7 +31,7 @@ class StorageShelf(_TopEdge):
                             "top_edge")
         self.argparser.add_argument(
             "--retainer",  action="store", type=float, default=0.0,
-            help="height of wall atthe front edges")
+            help="height of retaining wall at the front edges")
         self.argparser.add_argument(
             "--retainer_hole_edge",  action="store", type=boolarg, default=False,
             help="use finger hole edge for retainer walls")
@@ -92,15 +92,15 @@ class StorageShelf(_TopEdge):
 
         # outer walls
         # XXX retainer
-        self.rectangularWall(x, h, [b, "F", t1, "e"], callback=[None, self.hHoles, ], move="up")
-        self.rectangularWall(x, h, [b, "e", t3, "F"], callback=[None, self.hHoles, ], move="up")
+        self.rectangularWall(x, h, [b, "F", t1, "e"], callback=[None, self.hHoles, ], move="up", label="left")
+        self.rectangularWall(x, h, [b, "e", t3, "F"], callback=[None, self.hHoles, ], move="up", label="right")
 
         # floor
         if b != "e":
             e = "fffe"
             if self.retainer:
                 e = "ffff"
-            self.rectangularWall(x, y, e, callback=[None, self.yHoles], move="up")
+            self.rectangularWall(x, y, e, callback=[None, self.yHoles], move="up", label="bottom")
 
         # inner walls
 
@@ -111,22 +111,22 @@ class StorageShelf(_TopEdge):
             if self.retainer:
                 e[3] = "f"
 
-            self.rectangularWall(x, y, e, move="up")
+            self.rectangularWall(x, y, e, move="up", label="inner horizontal " + str(i+1))
 
         # top / lid
         if self.closedtop:
             e = "FFFe" if self.top_edge == "f" else "fffe"
-            self.rectangularWall(x, y, e, callback=[None, self.yHoles, ], move="up")
+            self.rectangularWall(x, y, e, callback=[None, self.yHoles, ], move="up", label="top")
         else:
             self.drawLid(x, y, self.top_edge)
 
         self.ctx.restore()
-        self.rectangularWall(x, h, "ffff", move="right only")
+        self.rectangularWall(x, h, "ffff", move="right only", label="invisible")
 
         # y walls
 
         # outer walls
-        self.rectangularWall(y, h, [b, "f", t2, "f"],  callback=[self.ySlots, self.hSlots,], move="up")
+        self.rectangularWall(y, h, [b, "f", t2, "f"],  callback=[self.ySlots, self.hSlots,], move="up", label="back")
 
         # inner walls
         for i in range(len(self.sy) - 1):
@@ -135,7 +135,7 @@ class StorageShelf(_TopEdge):
                  "e", "f"]
             if self.closedtop:
                 e = [be, edges.SlottedEdge(self, self.sh, "e", slots=0.5 * x),"f", "f"]
-            self.rectangularWall(x, h, e, move="up")
+            self.rectangularWall(x, h, e, move="up", label="inner vertical " + str(i+1))
 
 
         if self.retainer:
@@ -144,4 +144,4 @@ class StorageShelf(_TopEdge):
                 e = "FEeE"
                 if self.retainer_hole_edge or (i == 0 and b == "h"):
                     e = "hEeE"
-                self.rectangularWall(y, self.retainer, e, move="up")
+                self.rectangularWall(y, self.retainer, e, move="up", label="retainer " + str(i+1))
diff --git a/boxes/generators/trafficlight.py b/boxes/generators/trafficlight.py
index 2d9e4cf..2ba76ea 100644
--- a/boxes/generators/trafficlight.py
+++ b/boxes/generators/trafficlight.py
@@ -85,13 +85,13 @@ When turned by 90°, it can be also used to create a bottle holder."""
     def frontCB(self):
         self.hole(self.h/2, self.h/2, self.h/2-self.thickness)
 
-    def wall(self, h1, h2, w, edges="ffef", callback=None, move=""):
+    def wall(self, h1, h2, w, edges="ffef", callback=None, move="", label = ""):
         edges = [self.edges.get(e, e) for e in edges]
         edges += edges  # append for wrapping around
         overallwidth = w + edges[-1].spacing() + edges[1].spacing()
         overallheight = max(h1, h2) + edges[0].spacing() + edges[2].spacing()
 
-        if self.move(overallwidth, overallheight, move, before=True):
+        if self.move(overallwidth, overallheight, move, before=True, label= label):
             return
 
         a = math.atan((h2-h1)/float(w))
@@ -112,7 +112,7 @@ When turned by 90°, it can be also used to create a bottle holder."""
         edges[3](h1)
         self.edgeCorner(edges[3], edges[3 + 1], 90)
 
-        self.move(overallwidth, overallheight, move)
+        self.move(overallwidth, overallheight, move, label = label)
     
     def render(self):
         # adjust to the variables you want in the local scope
@@ -126,44 +126,44 @@ When turned by 90°, it can be also used to create a bottle holder."""
         self.addPart(ShadyEdge(self, None))
 
         # back
-        self.rectangularWall(th, h, "FFFF", callback=[self.backCB], move="up")
+        self.rectangularWall(th, h, "FFFF", callback=[self.backCB], move="up", label = "back")
 
         if self.upright:
             # sides
-            self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up")
-            self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up")
+            self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up", label = "left")
+            self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up", label = "right")
 
             # horizontal Walls / blinds tops
             e = edges.CompoundEdge(self, "fF", (d, s))
             e2 = edges.CompoundEdge(self, "Ff", (s, d))
             for i in range(n):
                 self.rectangularWall(h, d+s, ['f', e, 'e', e2],
-                                     move="right" if i<n-1 else "right up")
+                                     move="right" if i<n-1 else "right up", label="horizontal Wall " + str(i+1))
         else:
             # bottom
             self.rectangularWall(th, d, "fFeF", callback=[self.sideCB],
-                                 move="up")
+                                 move="up", label="bottom")
             # top
             self.rectangularWall(th, d+s, "fFeF", callback=[self.topCB],
-                                 move="up")
+                                 move="up", label="top")
             # vertical walls
             for i in range(n):
-                self.wall(d, d+s, h, move="right" if i<n-1 else "right up")
+                self.wall(d, d+s, h, move="right" if i<n-1 else "right up", label="vertical wall " + str(i+1))
 
         # fronts
         for i in range(n):
             self.rectangularWall(h, h, "efef", callback=[self.frontCB],
-                                 move="left" if i<n-1 else "left up")
+                                 move="left" if i<n-1 else "left up", label="front " + str(i+1))
 
         if self.upright:
             # bottom wall
-            self.rectangularWall(h, d, "ffef", move="up")
+            self.rectangularWall(h, d, "ffef", move="up", label="bottom wall")
         else:
             # vertical wall
-            self.wall(d, d+s, h, move="up")
+            self.wall(d, d+s, h, move="up", label="vertical wall")
 
         # Colored windows
         for i in range(n):
-            self.parts.disc(h-2*t, move="right")
+            self.parts.disc(h-2*t, move="right", label="colored window " + str(i+1))
         
 
diff --git a/boxes/generators/ubox.py b/boxes/generators/ubox.py
index 77dbebc..dc4fc5b 100644
--- a/boxes/generators/ubox.py
+++ b/boxes/generators/ubox.py
@@ -37,14 +37,14 @@ class UBox(_TopEdge, _ChestLid):
             help="additional lid")
         self.angle = 0
 
-    def U(self, x, y, r, edge="e", move=None):
+    def U(self, x, y, r, edge="e", move=None, label=""):
 
         e = self.edges.get(edge, edge)
 
         w = self.edges["f"].spacing()
         tw = x+2*w
         th = y+w+e.spacing()
-        if self.move(tw, th, move, True):
+        if self.move(tw, th, move, True, label=label):
             return
 
         self.moveTo(w+r, w)
@@ -57,9 +57,9 @@ class UBox(_TopEdge, _ChestLid):
         self.edges["f"](y-r)
         self.corner(90, r)
 
-        self.move(tw, th, move)
+        self.move(tw, th, move, label=label)
 
-    def Uwall(self, x, y, h, r, edges="ee", move=None):
+    def Uwall(self, x, y, h, r, edges="ee", move=None, label=""):
 
         e = [self.edges.get(edge, edge) for edge in edges]
 
@@ -68,7 +68,7 @@ class UBox(_TopEdge, _ChestLid):
 
         tw = 2*y + x - 4*(cl-r) + e[0].spacing() + e[1].spacing()
         th = h + 2*w
-        if self.move(tw, th, move, True):
+        if self.move(tw, th, move, True, label=label):
             return
 
         self.moveTo(e[0].spacing())
@@ -86,7 +86,7 @@ class UBox(_TopEdge, _ChestLid):
             e[nr](h)
             self.edgeCorner(e[nr], "F")
         
-        self.move(tw, th, move)
+        self.move(tw, th, move, label=label)
 
     def render(self):
         x, y, h, r = self.x, self.y, self.h, self.radius
@@ -96,10 +96,10 @@ class UBox(_TopEdge, _ChestLid):
 
         t1, t2, t3, t4 = self.topEdges(self.top_edge)
 
-        self.U(x, y, r, t1, move="right")
-        self.U(x, y, r, t3, move="up")
-        self.U(x, y, r, t3, move="left only")
-        self.Uwall(x, y, h, r, [t2, t4], move="up")
+        self.U(x, y, r, t1, move="right", label="left")
+        self.U(x, y, r, t3, move="up", label="right")
+        self.U(x, y, r, t3, move="left only", label="invisible")
+        self.Uwall(x, y, h, r, [t2, t4], move="up", label="wall")
 
         self.drawLid(x, h, self.top_edge)
         self.drawAddOnLid(x, h, self.lid)
diff --git a/boxes/generators/universalbox.py b/boxes/generators/universalbox.py
index 42cb876..35407f4 100644
--- a/boxes/generators/universalbox.py
+++ b/boxes/generators/universalbox.py
@@ -80,29 +80,29 @@ class UniversalBox(_TopEdge, _ChestLid):
         with self.saved_context():
             self.rectangularWall(x, h, [b, sideedge, t1, sideedge],
                                  ignore_widths=[1, 6],
-                                 bedBolts=[d2], move="up")
+                                 bedBolts=[d2], move="up", label="left")
             self.rectangularWall(x, h, [b, sideedge, t3, sideedge],
                                  ignore_widths=[1, 6],
-                                 bedBolts=[d2], move="up")
+                                 bedBolts=[d2], move="up", label="right")
 
             if self.bottom_edge != "e":
-                self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], move="up")
+                self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], move="up", label="bottom")
             if self.top_edge in "fF":
-                self.set_source_color(Color.RED)
+                self.set_source_color(Color.MAGENTA)    # I don't know why this part has a different color, but RED is not a good choice because RED is used for annotations
                 self.rectangularWall(x+4*t, y+4*t, callback=[
-                    lambda:self.top_hole(x, y, self.top_edge)], move="up")
+                    lambda:self.top_hole(x, y, self.top_edge)], move="up", label="top hole")
                 self.set_source_color(Color.BLACK)
             self.drawLid(x, y, self.top_edge, [d2, d3])
             self.drawAddOnLid(x, y, self.lid)
 
         self.rectangularWall(x, h, [b, sideedge, t3, sideedge],
                              ignore_widths=[1, 6],
-                             bedBolts=[d2], move="right only")
+                             bedBolts=[d2], move="right only", label="invisible")
         self.rectangularWall(y, h, [b, "f", t2, "f"],
                              ignore_widths=[1, 6],
-                             bedBolts=[d3], move="up")
+                             bedBolts=[d3], move="up", label="back")
         self.rectangularWall(y, h, [b, "f", t4, "f"],
                              ignore_widths=[1, 6],
-                             bedBolts=[d3], move="up")
+                             bedBolts=[d3], move="up", label="front")
 
 
diff --git a/boxes/lids.py b/boxes/lids.py
index 23f2e5a..5bd7ec5 100644
--- a/boxes/lids.py
+++ b/boxes/lids.py
@@ -24,7 +24,7 @@ class _ChestLid(Boxes):
         r = d / 2.0 / math.cos(math.radians(angle))
         return r
 
-    def side(self, x, angle=0, move=""):
+    def side(self, x, angle=0, move="", label=""):
         if "a" not in self.edges:
             s = edges.FingerJointSettings(self.thickness, True,
                                           finger=1.0, space=1.0)
@@ -32,7 +32,7 @@ class _ChestLid(Boxes):
 
         t = self.thickness
         r = self.getR(x, angle)
-        if self.move(x+2*t, 0.5*x+3*t, move, True):
+        if self.move(x+2*t, 0.5*x+3*t, move, True, label=label):
             return
 
         self.moveTo(t, 0)
@@ -43,9 +43,9 @@ class _ChestLid(Boxes):
         self.edges["a"](3*t)
         self.corner(90+angle)
 
-        self.move(x+2*t, 0.5*x+3*t, move, False)
+        self.move(x+2*t, 0.5*x+3*t, move, False, label=label)
 
-    def top(self, x, y, angle=0, move=None):
+    def top(self, x, y, angle=0, move=None, label=""):
         if "a" not in self.edges:
             s = edges.FingerJointSettings(self.thickness, True,
                                           finger=1.0, space=1.0)
@@ -57,7 +57,7 @@ class _ChestLid(Boxes):
         tw = l + 6*t
         th = y+2*t
 
-        if self.move(tw, th, move, True):
+        if self.move(tw, th, move, True, label=label):
             return
 
         self.edges["A"](3*t)
@@ -73,17 +73,17 @@ class _ChestLid(Boxes):
         self.edge(y+2*t)
         self.corner(90)
 
-        self.move(tw, th, move)
+        self.move(tw, th, move, label=label)
 
     def drawAddOnLid(self, x, y, style):
         if style == "flat":
-            self.rectangularWall(x, y, "eeee", move="right")
-            self.rectangularWall(x, y, "EEEE", move="up")
+            self.rectangularWall(x, y, "eeee", move="right", label="lid bottom")
+            self.rectangularWall(x, y, "EEEE", move="up", label="lid top")
         elif style == "chest":
-            self.side(x, move="right")
-            self.side(x, move="up")
-            self.side(x, move="left only")
-            self.top(x, y, move="up")
+            self.side(x, move="right", label="lid right")
+            self.side(x, move="up", label="lid left")
+            self.side(x, move="left only", label="invisible")
+            self.top(x, y, move="up", label="lid top")
         else:
             return False
         return True
@@ -122,32 +122,32 @@ class _TopEdge(Boxes):
     def drawLid(self, x, y, top_edge, bedBolts=[None, None]):
         d2, d3 = bedBolts
         if top_edge == "c":
-            self.rectangularWall(x, y, "CCCC", bedBolts=[d2, d3, d2, d3], move="up")
+            self.rectangularWall(x, y, "CCCC", bedBolts=[d2, d3, d2, d3], move="up", label="top")
         elif top_edge == "f":
-            self.rectangularWall(x, y, "FFFF", move="up")
+            self.rectangularWall(x, y, "FFFF", move="up", label="top")
         elif top_edge in "FhŠ":
-            self.rectangularWall(x, y, "ffff", move="up")
+            self.rectangularWall(x, y, "ffff", move="up", label="top")
         elif top_edge == "L":
-            self.rectangularWall(x, y, "nlmE", move="up")
+            self.rectangularWall(x, y, "nlmE", move="up", label="lid top")
         elif top_edge == "i":
-            self.rectangularWall(x, y, "IEJe", move="up")
+            self.rectangularWall(x, y, "IEJe", move="up", label="lid top")
         elif top_edge == "k":
             outset =  self.edges["k"].settings.outset
             self.edges["k"].settings.setValues(self.thickness, outset=True)
             lx = x/2.0-0.1*self.thickness
             self.edges['k'].settings.setValues(self.thickness, grip_length=5)
-            self.rectangularWall(lx, y, "IeJe", move="right")
-            self.rectangularWall(lx, y, "IeJe", move="up")
-            self.rectangularWall(lx, y, "IeJe", move="left only")
+            self.rectangularWall(lx, y, "IeJe", move="right", label="lid top left")
+            self.rectangularWall(lx, y, "IeJe", move="up", label="lid top right")
+            self.rectangularWall(lx, y, "IeJe", move="left only", label="invisible")
             self.edges["k"].settings.setValues(self.thickness, outset=outset)
         elif top_edge == "S":
-            self.rectangularWall(x, y, "ffff", move="up")
-            self.rectangularWall(x, 0, "sFeF", move="up")
-            self.rectangularWall(x, 0, "sFeF", move="up")
-            self.rectangularWall(y, 0, "sfef", move="up")
-            self.rectangularWall(y, 0, "sfef", move="up")
+            self.rectangularWall(x, y, "ffff", move="up", label="lid top")
+            self.rectangularWall(x, 0, "sFeF", move="up", label="lid top left")
+            self.rectangularWall(x, 0, "sFeF", move="up", label="lid top right")
+            self.rectangularWall(y, 0, "sfef", move="up", label="lid top front")
+            self.rectangularWall(y, 0, "sfef", move="up", label="lid top back")
         elif top_edge == "v":
-            self.rectangularWall(x, y, "VEEE", move="up")
+            self.rectangularWall(x, y, "VEEE", move="up", label="lid top")
             self.edges["v"].parts(move="up")
         else:
             return False
diff --git a/boxes/parts.py b/boxes/parts.py
index 5731439..9487bb3 100644
--- a/boxes/parts.py
+++ b/boxes/parts.py
@@ -25,7 +25,7 @@ class Parts:
     def __getattr__(self, name):
         return getattr(self.boxes, name)
 
-    def disc(self, diameter, hole=0, callback=None, move=""):
+    def disc(self, diameter, hole=0, callback=None, move="", label=""):
         """Simple disc
 
         :param diameter: diameter of the disc
@@ -36,7 +36,7 @@ class Parts:
         size = diameter
         r = diameter / 2.0
 
-        if self.move(size, size, move, before=True):
+        if self.move(size, size, move, before=True, label=label):
             return
 
         self.moveTo(size / 2, size / 2)
@@ -47,7 +47,7 @@ class Parts:
         self.cc(callback, None, 0, 0)
         self.moveTo(r + self.burn, 0, 90)
         self.corner(360, r, tabs=6)
-        self.move(size, size, move)
+        self.move(size, size, move, label=label)
 
     def waivyKnob(self, diameter, n=20, angle=45, hole=0, callback=None, move=""):
         """Disc with a waivy edge to be easier to be gripped