diff --git a/CHANGES.markdown b/CHANGES.markdown
--- a/CHANGES.markdown
+++ b/CHANGES.markdown
@@ -1,10 +1,91 @@
+1.2 (27 May 2014)
+-----------------
+
+* **New features**
+
+    - Several attributes (such as line width, dashing size, arrowhead
+      size, and font size) that formerly had a value of type `Double`
+      now have the more general type `Measure R2`. This allows the
+      attributes to be specified relative to one of four measurement
+      frames: `Local`, `Global`, `Normalized`, and `Output`.
+
+    - New DSL for specifying measurements.
+
+    - New synonyms for specifying measurements, *e.g.* `thin`,
+      `thick`, and `medium`, `large`.
+
+    - Support for radial and linear gradients for fills and strokes.
+
+    - New `DImage` type that supports both embedded and external images in
+      Backends that support them.
+
+    - New `lengths` Traversal for setting `headLength` and `tailLength`
+      simultaneously.
+
+    - `Frustrum` and `Box` shapes added to `Diagrams.ThreeD.Shapes`.
+
+    - New function `quartForm` to find roots of quartic polynomials.
+
+    - New Lenses for polar coordinates.
+
+    - New trig functions, `sinA`, `atanA`, etc. which take `Angle` as
+      input or output.
+
+* **New instances**
+
+    - `Transformable` instances for `LineWidth`, `Dashing`,
+      `LineTexture`, and  `FillTexture`.
+
+* **API changes**
+
+    - `FillColor` and `LineColor` attributes have been replaced with
+      the more general `FillTexture` and `LineTexture`. Use the `solid`
+      function to convert a color to a texture.
+
+    - The size of arrow heads and tails is now specified in terms of
+      length instead of the radius of their circumcircle.
+
+    - Gaps at the ends of arrows are now specified using `Measure R2`.
+
+    - The `gap` traversal has been replaced by `gaps` for consistency
+      in naming, though `gap` is still provided for backwards compatibility.
+
+    - `fontSize` now takes a value of type `Measure R2`.
+
+    - Get rid of (bitrotted) `Show` backend.
+
+    - Functions in `TwoD.Adjust` now return the adjustment
+      transformation itself in addition to the resized `Diagram` and
+      `Options` record; this can be used, *e.g.* to convert screen
+      coordinates back into diagram coordinates.
+
+    - Export `pathLocSegments`.
+
+    - The `avgScale` function has been moved to `Diagrams.Core`.
+
+    - The `Angle` definition and related functions (*e.g.*
+      `angleBetween`) have moved to a separate module, `Diagrams.Angle`.
+
+    - A separate `Diagrams.TwoD.Attributes` module now contains most
+      of the attributes that require 2D transformation instances.
+
+    - The `splitColorFills` function has been replaced by `splitTextureFills`.
+
+* **Dependency/version changes**
+
+  - Allow `semigroups-0.15`
+
+  - Allow `opt-parse-applicative-0.9.0
+
+  - Allow `lens-4.2`
+
 1.1.0.7 (15 May 2014)
 ------------------------
 
     - Allow `semigroups-0.14`
 
 1.1.0.6 (10 April 2014)
-----------------------
+------------------------
 
     - Allow `semigroups-0.13`
 
diff --git a/diagrams-lib.cabal b/diagrams-lib.cabal
--- a/diagrams-lib.cabal
+++ b/diagrams-lib.cabal
@@ -1,5 +1,5 @@
 Name:                diagrams-lib
-Version:             1.1.0.7
+Version:             1.2
 Synopsis:            Embedded domain-specific language for declarative graphics
 Description:         Diagrams is a flexible, extensible EDSL for creating
                      graphics of many types.  Graphics can be created
@@ -28,6 +28,7 @@
   Exposed-modules:     Diagrams.Prelude,
                        Diagrams.Prelude.ThreeD,
                        Diagrams.Align,
+                       Diagrams.Angle,
                        Diagrams.Combinators,
                        Diagrams.Coordinates,
                        Diagrams.Attributes,
@@ -56,6 +57,7 @@
                        Diagrams.TwoD.Align,
                        Diagrams.TwoD.Arrow,
                        Diagrams.TwoD.Arrowheads,
+                       Diagrams.TwoD.Attributes,
                        Diagrams.TwoD.Combinators,
                        Diagrams.TwoD.Deform,
                        Diagrams.TwoD.Transform,
@@ -75,6 +77,7 @@
                        Diagrams.TwoD.Image,
                        Diagrams.TwoD.Adjust,
                        Diagrams.ThreeD.Align,
+                       Diagrams.ThreeD.Attributes,
                        Diagrams.ThreeD.Camera,
                        Diagrams.ThreeD.Deform,
                        Diagrams.ThreeD.Light,
@@ -86,30 +89,31 @@
                        Diagrams.Animation,
                        Diagrams.Animation.Active,
                        Diagrams.Util,
-                       Diagrams.Backend.Show,
                        Diagrams.Backend.CmdLine
   Build-depends:       base >= 4.2 && < 4.8,
                        containers >= 0.3 && < 0.6,
                        array >= 0.3 && < 0.6,
-                       semigroups >= 0.3.4 && < 0.15,
+                       semigroups >= 0.3.4 && < 0.16,
                        monoid-extras >= 0.3 && < 0.4,
-                       diagrams-core >= 1.1 && < 1.2,
+                       dual-tree >= 0.2 && < 0.3,
+                       diagrams-core >= 1.2 && < 1.3,
                        active >= 0.1 && < 0.2,
                        vector-space >= 0.7.7 && < 0.9,
                        vector-space-points >= 0.1.2 && < 0.3,
                        MemoTrie >= 0.6 && < 0.7,
                        colour >= 2.3.2 && < 2.4,
                        data-default-class < 0.1,
-                       pretty >= 1.0.1.2 && < 1.2,
                        fingertree >= 0.1 && < 0.2,
                        intervals >= 0.7 && < 0.8,
-                       lens >= 4.0 && < 4.2,
+                       lens >= 4.0 && < 4.3,
                        tagged >= 0.7,
-                       optparse-applicative >= 0.7 && < 0.9,
+                       optparse-applicative >= 0.7 && < 0.10,
                        filepath,
                        safe >= 0.2 && < 0.4,
+                       JuicyPixels >= 3.1.5 && < 3.2,
                        hashable >= 1.1 && < 1.3
   if impl(ghc < 7.6)
     Build-depends: ghc-prim
   Hs-source-dirs:      src
+  ghc-options: -Wall
   default-language:    Haskell2010
diff --git a/diagrams/src_Diagrams_Combinators_appendsEx.svg b/diagrams/src_Diagrams_Combinators_appendsEx.svg
--- a/diagrams/src_Diagrams_Combinators_appendsEx.svg
+++ b/diagrams/src_Diagrams_Combinators_appendsEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200.0" height="182.15600114617723" font-size="1" viewBox="0 0 200 182"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(30.3030303030303,0.0,0.0,30.3030303030303,100.0,91.07800057308862)"><g><g><path d="M 2.0001669752541407,1.732340017192659 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g><g><path d="M -1.669752541431091e-4,1.7323400171926577 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g><g><path d="M -1.0,-7.771561172376096e-16 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g><g><path d="M -1.6697525414155479e-4,-1.7323400171926586 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g><g><path d="M 2.0001669752541424,-1.7323400171926582 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g><g><path d="M 3.0,0.0 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g><g><path d="M 1.0,0.0 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200.0" height="182.15600114617723" font-size="1" viewBox="0 0 200 182" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.7634783583493163" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><path d="M 160.6111204622467,143.5731526092298 c 0.0,-16.735901510024043 -13.567128793006255,-30.3030303030303 -30.303030303030294 -30.3030303030303c -16.735901510024043,-1.024778410754815e-15 -30.3030303030303,13.567128793006253 -30.3030303030303 30.30303030303029c -2.04955682150963e-15,16.735901510024043 13.567128793006251,30.3030303030303 30.303030303030287 30.3030303030303c 16.735901510024043,3.0743352322644448e-15 30.3030303030303,-13.56712879300625 30.303030303030308 -30.30303030303029Z" /></g><g><path d="M 99.99494014381385,143.57315260922977 c 0.0,-16.735901510024043 -13.567128793006255,-30.3030303030303 -30.303030303030294 -30.3030303030303c -16.735901510024043,-1.024778410754815e-15 -30.3030303030303,13.567128793006253 -30.3030303030303 30.30303030303029c -2.04955682150963e-15,16.735901510024043 13.567128793006251,30.3030303030303 30.303030303030287 30.3030303030303c 16.735901510024043,3.0743352322644448e-15 30.3030303030303,-13.56712879300625 30.303030303030308 -30.30303030303029Z" /></g><g><path d="M 69.6969696969697,91.07800057308859 c 0.0,-16.735901510024043 -13.567128793006255,-30.3030303030303 -30.303030303030294 -30.3030303030303c -16.735901510024043,-1.024778410754815e-15 -30.3030303030303,13.567128793006253 -30.3030303030303 30.30303030303029c -2.04955682150963e-15,16.735901510024043 13.567128793006251,30.3030303030303 30.303030303030287 30.3030303030303c 16.735901510024043,3.0743352322644448e-15 30.3030303030303,-13.56712879300625 30.303030303030308 -30.30303030303029Z" /></g><g><path d="M 99.99494014381389,38.58284853694745 c 0.0,-16.735901510024043 -13.567128793006255,-30.3030303030303 -30.303030303030294 -30.3030303030303c -16.735901510024043,-1.024778410754815e-15 -30.3030303030303,13.567128793006253 -30.3030303030303 30.30303030303029c -2.04955682150963e-15,16.735901510024043 13.567128793006251,30.3030303030303 30.303030303030287 30.3030303030303c 16.735901510024043,3.0743352322644448e-15 30.3030303030303,-13.56712879300625 30.303030303030308 -30.30303030303029Z" /></g><g><path d="M 160.61112046224676,38.58284853694746 c 0.0,-16.735901510024043 -13.567128793006255,-30.3030303030303 -30.303030303030294 -30.3030303030303c -16.735901510024043,-1.024778410754815e-15 -30.3030303030303,13.567128793006253 -30.3030303030303 30.30303030303029c -2.04955682150963e-15,16.735901510024043 13.567128793006251,30.3030303030303 30.303030303030287 30.3030303030303c 16.735901510024043,3.0743352322644448e-15 30.3030303030303,-13.56712879300625 30.303030303030308 -30.30303030303029Z" /></g><g><path d="M 190.9090909090909,91.07800057308862 c 0.0,-16.735901510024043 -13.567128793006255,-30.3030303030303 -30.303030303030294 -30.3030303030303c -16.735901510024043,-1.024778410754815e-15 -30.3030303030303,13.567128793006253 -30.3030303030303 30.30303030303029c -2.04955682150963e-15,16.735901510024043 13.567128793006251,30.3030303030303 30.303030303030287 30.3030303030303c 16.735901510024043,3.0743352322644448e-15 30.3030303030303,-13.56712879300625 30.303030303030308 -30.30303030303029Z" /></g><g><path d="M 130.3030303030303,91.07800057308862 c 0.0,-16.735901510024043 -13.567128793006255,-30.3030303030303 -30.303030303030294 -30.3030303030303c -16.735901510024043,-1.024778410754815e-15 -30.3030303030303,13.567128793006253 -30.3030303030303 30.30303030303029c -2.04955682150963e-15,16.735901510024043 13.567128793006251,30.3030303030303 30.303030303030287 30.3030303030303c 16.735901510024043,3.0743352322644448e-15 30.3030303030303,-13.56712879300625 30.303030303030308 -30.30303030303029Z" /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Combinators_besideEx.svg b/diagrams/src_Diagrams_Combinators_besideEx.svg
--- a/diagrams/src_Diagrams_Combinators_besideEx.svg
+++ b/diagrams/src_Diagrams_Combinators_besideEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="169.72067997066802" height="200.0" font-size="1" viewBox="0 0 170 200"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(39.69528724072871,0.0,0.0,39.69528724072871,84.86033998533402,99.99999999999999)"><g><g fill="rgb(128,0,128)" fill-opacity="1.0"><path d="M 1.9434489327457674,-0.7901733991186513 c 0.0,-0.8284271247461902 -0.6715728752538097,-1.5 -1.4999999999999996 -1.5c -0.8284271247461902,-5.072653133236334e-17 -1.5,0.6715728752538096 -1.5 1.4999999999999996c -1.0145306266472669e-16,0.8284271247461902 0.6715728752538095,1.5 1.4999999999999993 1.5c 0.8284271247461902,1.5217959399709003e-16 1.5,-0.6715728752538094 1.5000000000000002 -1.4999999999999996Z" /></g><g fill="rgb(255,165,0)" fill-opacity="1.0"><path d="M 5.655106725423198e-2,1.2901733991186521 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M -0.8518419967810219,1.2901733991186521 c 0.0,-5.05931137120553e-2 -4.101382225269076e-2,-9.160693596474608e-2 -9.160693596474606e-2 -9.160693596474608e-2c -5.05931137120553e-2,-3.0979347383183296e-18 -9.160693596474608e-2,4.1013822252690756e-2 -9.160693596474608e-2 9.160693596474605e-2c -6.195869476636659e-18,5.05931137120553e-2 4.1013822252690756e-2,9.160693596474608e-2 9.160693596474603e-2 9.160693596474608e-2c 5.05931137120553e-2,9.293804214954989e-18 9.160693596474608e-2,-4.101382225269075e-2 9.160693596474609e-2 -9.160693596474605e-2Z" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="169.72067997066802" height="200.0" font-size="1" viewBox="0 0 170 200" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.7369573772655632" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g fill="rgb(128,0,128)" fill-opacity="1.0"><g fill="rgb(128,0,128)" fill-opacity="1.0"><g fill="rgb(128,0,128)" fill-opacity="1.0"><path d="M 162.00610360836492,68.63383995200215 c 0.0,-32.884652674811015 -26.658278186282047,-59.54293086109307 -59.542930861093055 -59.54293086109307c -32.884652674811015,-2.0136042319639878e-15 -59.54293086109307,26.658278186282043 -59.54293086109307 59.54293086109305c -4.0272084639279756e-15,32.884652674811015 26.65827818628204,59.54293086109307 59.54293086109304 59.54293086109307c 32.884652674811015,6.0408126958919634e-15 59.54293086109307,-26.658278186282036 59.54293086109308 -59.54293086109305Z" /></g></g></g><g fill="rgb(255,165,0)" fill-opacity="1.0"><g fill="rgb(255,165,0)" fill-opacity="1.0"><g fill="rgb(255,165,0)" fill-opacity="1.0"><path d="M 87.10515084376053,151.2138036683622 c 0.0,-21.923101783207343 -17.772185457521363,-39.69528724072871 -39.6952872407287 -39.69528724072871c -21.923101783207343,-1.342402821309325e-15 -39.69528724072871,17.77218545752136 -39.69528724072871 39.695287240728696c -2.68480564261865e-15,21.923101783207343 17.77218545752136,39.69528724072871 39.695287240728696 39.69528724072871c 21.923101783207343,4.0272084639279756e-15 39.69528724072871,-17.772185457521356 39.69528724072871 -39.695287240728696Z" /></g></g></g><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><path d="M 51.04622723939545,151.2138036683622 c 0.0,-2.0083081812028856 -1.628055455160751,-3.6363636363636367 -3.6363636363636362 -3.6363636363636367c -2.0083081812028856,-1.2297340929057781e-16 -3.6363636363636367,1.6280554551607507 -3.6363636363636367 3.636363636363636c -2.4594681858115563e-16,2.0083081812028856 1.6280554551607507,3.6363636363636367 3.6363636363636354 3.6363636363636367c 2.0083081812028856,3.689202278717335e-16 3.6363636363636367,-1.6280554551607502 3.636363636363638 -3.636363636363636Z" /></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Combinators_positionEx.svg b/diagrams/src_Diagrams_Combinators_positionEx.svg
--- a/diagrams/src_Diagrams_Combinators_positionEx.svg
+++ b/diagrams/src_Diagrams_Combinators_positionEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="204.25531914893568" height="300.0" font-size="1" viewBox="0 0 204 300"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(31.91489361702117,0.0,0.0,31.91489361702117,102.12765957446776,293.6170212765958)"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 3.2000000000000055,-9.000000000000032 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 3.0000000000000053,-7.840000000000029 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 2.800000000000005,-6.7600000000000255 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 2.600000000000005,-5.760000000000023 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 2.400000000000005,-4.84000000000002 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 2.2000000000000046,-4.000000000000018 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 2.0000000000000044,-3.2400000000000153 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.800000000000004,-2.560000000000013 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.6000000000000039,-1.9600000000000108 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.4000000000000037,-1.440000000000009 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.2000000000000035,-1.000000000000007 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.0000000000000033,-0.6400000000000055 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.8000000000000032,-0.3600000000000038 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.600000000000003,-0.16000000000000242 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.40000000000000285,-4.000000000000114e-2 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.20000000000000268,-7.099748146989106e-30 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 2.4980018054066022e-15,-3.999999999999901e-2 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.19999999999999768,-0.15999999999999814 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.39999999999999786,-0.35999999999999743 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.5999999999999981,-0.6399999999999969 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.7999999999999983,-0.9999999999999964 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.9999999999999984,-1.4399999999999962 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -1.1999999999999986,-1.959999999999996 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -1.3999999999999988,-2.559999999999996 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -1.599999999999999,-3.239999999999996 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -1.7999999999999992,-3.9999999999999964 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -1.9999999999999993,-4.839999999999997 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -2.1999999999999993,-5.759999999999997 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -2.3999999999999995,-6.759999999999998 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -2.5999999999999996,-7.839999999999999 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -2.8,-9.0 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="204.25531914893568" height="300.0" font-size="1" viewBox="0 0 204 300" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.9901643964084406" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 204.25531914893565,6.3829787234042215 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 197.87234042553143,43.40425531914886 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 191.48936170212718,77.87234042553186 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 185.10638297872293,109.78723404255311 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 178.7234042553187,139.14893617021266 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 172.34042553191446,165.95744680851053 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 165.9574468085102,190.2127659574467 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 159.574468085106,211.91489361702116 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 153.19148936170174,231.06382978723394 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 146.8085106382975,247.659574468085 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 140.42553191489327,261.7021276595744 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 134.04255319148902,273.19148936170205 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 127.6595744680848,282.12765957446805 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 121.27659574468056,288.51063829787233 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 114.89361702127631,292.3404255319149 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 108.51063829787208,293.6170212765958 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 102.12765957446784,292.34042553191495 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 95.74468085106359,288.51063829787245 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 89.36170212765936,282.1276595744682 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 82.97872340425512,273.19148936170234 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 76.59574468085087,261.7021276595747 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 70.21276595744663,247.65957446808542 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 63.8297872340424,231.0638297872344 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 57.44680851063816,211.9148936170217 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 51.06382978723392,190.2127659574473 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 44.68085106382968,165.9574468085112 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 38.29787234042544,139.1489361702134 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 31.914893617021193,109.78723404255393 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 25.531914893616957,77.87234042553271 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 19.14893617021272,43.404255319149826 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 12.765957446808471,6.382978723405245 c 0.0,-3.525221807430585 -2.857756915973649,-6.382978723404235 -6.382978723404233 -6.382978723404235c -3.525221807430585,-2.1585758013771565e-16 -6.382978723404235,2.8577569159736487 -6.382978723404235 6.382978723404233c -4.317151602754313e-16,3.525221807430585 2.8577569159736482,6.382978723404235 6.382978723404232 6.382978723404235c 3.525221807430585,6.47572740413147e-16 6.382978723404235,-2.857756915973648 6.382978723404236 -6.382978723404233Z" /></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Combinators_strutEx.svg b/diagrams/src_Diagrams_Combinators_strutEx.svg
--- a/diagrams/src_Diagrams_Combinators_strutEx.svg
+++ b/diagrams/src_Diagrams_Combinators_strutEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="119.99999999999999" font-size="1" viewBox="0 0 300 120"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(54.54545454545455,0.0,0.0,54.54545454545455,150.0,59.99999999999999)"><g><g><path d="M 2.5,1.1102230246251565e-16 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g><g></g><g><path d="M -0.5000000000000002,1.1102230246251565e-16 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="119.99999999999999" font-size="1" viewBox="0 0 300 120" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.758946638440411" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><path d="M 286.3636363636364,60.0 c 0.0,-30.12462271804328 -24.42083182741126,-54.54545454545455 -54.54545454545453 -54.54545454545455c -30.12462271804328,-1.844601139358667e-15 -54.54545454545455,24.42083182741126 -54.54545454545455 54.545454545454525c -3.689202278717334e-15,30.12462271804328 24.420831827411256,54.54545454545455 54.545454545454525 54.54545454545455c 30.12462271804328,5.533803418076001e-15 54.54545454545455,-24.420831827411252 54.545454545454554 -54.545454545454525Z" /></g><g></g><g><path d="M 122.72727272727272,60.0 c 0.0,-30.12462271804328 -24.42083182741126,-54.54545454545455 -54.54545454545453 -54.54545454545455c -30.12462271804328,-1.844601139358667e-15 -54.54545454545455,24.42083182741126 -54.54545454545455 54.545454545454525c -3.689202278717334e-15,30.12462271804328 24.420831827411256,54.54545454545455 54.545454545454525 54.54545454545455c 30.12462271804328,5.533803418076001e-15 54.54545454545455,-24.420831827411252 54.545454545454554 -54.545454545454525Z" /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Combinators_withEnvelopeEx.svg b/diagrams/src_Diagrams_Combinators_withEnvelopeEx.svg
--- a/diagrams/src_Diagrams_Combinators_withEnvelopeEx.svg
+++ b/diagrams/src_Diagrams_Combinators_withEnvelopeEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="166.66666666666669" font-size="1" viewBox="0 0 300 167"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(55.555555555555564,0.0,0.0,55.555555555555564,150.0,83.33333333333334)"><g><g><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 2.0,1.0 l -2.220446049250313e-16,-2.0 h -2.0 l -2.220446049250313e-16,2.0 h 2.0 Z" /></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" stroke-dasharray="0.1,0.1" stroke-dashoffset="0.0"><path d="M 1.7999999999999998,1.1102230246251565e-16 c 0.0,-0.4418277998646348 -0.35817220013536516,-0.8 -0.7999999999999998 -0.8c -0.4418277998646348,-2.7054150043927117e-17 -0.8,0.3581722001353651 -0.8 0.7999999999999998c -5.4108300087854235e-17,0.4418277998646348 0.3581722001353651,0.8 0.7999999999999997 0.8c 0.4418277998646348,8.116245013178136e-17 0.8,-0.35817220013536505 0.8000000000000002 -0.7999999999999998Z" /></g></g><g fill="rgb(0,128,0)" fill-opacity="1.0"><path d="M 0.19999999999999996,1.1102230246251565e-16 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.5522847498307935,-3.3817687554908895e-17 -1.0,0.4477152501692064 -1.0 0.9999999999999997c -6.763537510981779e-17,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.5522847498307935,1.0145306266472669e-16 1.0,-0.44771525016920627 1.0000000000000002 -0.9999999999999997Z" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="166.66666666666669" font-size="1" viewBox="0 0 300 167" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.894427190999916" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"></g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"></g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 261.11111111111114,138.8888888888889 l -1.2335811384723963e-14,-111.11111111111113 h -111.11111111111113 l -1.2335811384723963e-14,111.11111111111113 Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0"></g></g></g></g></g></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" stroke-dasharray="5.555555555555557,5.555555555555557" stroke-dashoffset="0.0"><path d="M 250.0,83.33333333333334 c 0.0,-24.545988881368604 -19.898455563075846,-44.44444444444446 -44.44444444444445 -44.44444444444446c -24.545988881368604,-1.503008335773729e-15 -44.44444444444446,19.898455563075846 -44.44444444444446 44.44444444444444c -3.006016671547458e-15,24.545988881368604 19.898455563075842,44.44444444444446 44.444444444444436 44.44444444444446c 24.545988881368604,4.509025007321188e-15 44.44444444444446,-19.89845556307584 44.44444444444448 -44.44444444444444Z" /></g></g><g fill="rgb(0,128,0)" fill-opacity="1.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><path d="M 161.11111111111111,83.33333333333334 c 0.0,-30.68248610171075 -24.873069453844806,-55.555555555555564 -55.55555555555555 -55.555555555555564c -30.68248610171075,-1.878760419717161e-15 -55.555555555555564,24.873069453844803 -55.555555555555564 55.55555555555554c -3.757520839434322e-15,30.68248610171075 24.8730694538448,55.555555555555564 55.55555555555554 55.555555555555564c 30.68248610171075,5.636281259151484e-15 55.555555555555564,-24.873069453844796 55.55555555555557 -55.55555555555554Z" /></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_CubicSpline_cubicSplineEx.svg b/diagrams/src_Diagrams_CubicSpline_cubicSplineEx.svg
--- a/diagrams/src_Diagrams_CubicSpline_cubicSplineEx.svg
+++ b/diagrams/src_Diagrams_CubicSpline_cubicSplineEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600.0" height="150.9864382575878" font-size="1" viewBox="0 0 600 151"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(25.279963015185068,0.0,0.0,25.279963015185068,300.0,75.4932191287939)"><g><g><g stroke-width="5.0e-2"><path d="M 5.30560144347186,0.514806155640732 c -0.27272727272727276,-0.27272727272727276 0.27272727272727276,-3.3636363636363633 2.0 -2.999999999999999c 1.727272727272727,0.36363636363636376 4.636363636363636,4.181818181818182 3.0 4.999999999999998c -1.6363636363636362,0.8181818181818183 -7.818181818181818,-1.3636363636363633 -8.999999999999998 -3.0c -1.1818181818181825,-1.6363636363636367 2.636363636363636,-2.727272727272727 4.000000000000001 -1.9999999999999996c 1.363636363636364,0.7272727272727271 0.27272727272727276,3.272727272727273 -2.6645352591003757e-15 3.000000000000001Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M 5.5056014434718605,-2.485193844359268 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M 1.5056014434718603,-0.48519384435926804 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M 10.50560144347186,2.514806155640732 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M 7.5056014434718605,-2.485193844359268 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M 5.5056014434718605,0.514806155640732 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g></g><g></g><g fill-opacity="0.0" stroke-width="5.0e-2"><path d="M -6.333419254268965,0.514806155640732 c 0.2142857142857144,-1.9107142857142858 0.4285714285714288,-3.8214285714285716 2.0 -3.0c 1.5714285714285712,0.8214285714285716 4.5,4.375 2.999999999999999 5.0c -1.5,0.625 -7.428571428571427,-1.6785714285714282 -9.0 -2.999999999999999c -1.571428571428572,-1.3214285714285716 1.214285714285714,-1.660714285714286 4.0 -2.0" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M -6.133419254268965,-2.485193844359268 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M -10.133419254268965,-0.48519384435926804 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M -1.1334192542689652,2.514806155640732 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M -4.133419254268965,-2.485193844359268 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><path d="M -6.133419254268965,0.514806155640732 c 0.0,-0.1104569499661587 -8.954305003384129e-2,-0.2 -0.19999999999999996 -0.2c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996c -1.3527075021963559e-17,0.1104569499661587 8.954305003384128e-2,0.2 0.19999999999999993 0.2c 0.1104569499661587,2.029061253294534e-17 0.2,-8.954305003384126e-2 0.20000000000000004 -0.19999999999999996Z" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600.0" height="150.9864382575878" font-size="1" viewBox="0 0 600 151" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.2039392872038202" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><path d="M 434.12540826428113,88.50749970338121 c -6.894535367777746,-6.894535367777746 6.894535367777746,-85.03260286925885 50.559926030370136 -75.83988904555518c 43.66539066259239,9.192713823703665 117.20710125222166,105.7162089725921 75.8398890455552 126.39981507592529c -41.36721220666647,20.68360610333324 -197.64334720962873,-34.472676838888724 -227.51966713666556 -75.8398890455552c -29.876319927036917,-41.36721220666648 66.64717522185153,-68.94535367777745 101.1198520607403 -50.55992603037012c 34.47267683888874,18.385427647407315 6.894535367777746,82.73442441333296 -7.105427357601002e-14 75.83988904555521Z" /><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 439.18140086731813,12.667610657826017 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 338.0615488065779,63.227536688196146 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 565.5812159432435,139.06742573375135 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 489.7413268976883,12.667610657826017 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 439.18140086731813,88.50749970338121 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g></g><g></g><path d="M 139.89139549241958,88.50749970338121 c 5.417134931825375,-48.3027864754429 10.83426986365075,-96.6055729508858 50.559926030370136 -75.8398890455552c 39.72565616671939,20.765683905330597 113.75983356833281,110.59983819143467 75.83988904555518 126.39981507592535c -37.9199445227776,15.799976884490668 -187.79401096994619,-42.43422363263207 -227.51966713666562 -75.83988904555518c -39.72565616671941,-33.40566541292313 30.69709794701043,-41.98279572164664 101.11985206074027 -50.559926030370136" /><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 144.9473880954566,12.667610657826017 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 43.82753603471632,63.227536688196146 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 271.3472031713819,139.06742573375135 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 195.50731412582675,12.667610657826017 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 144.9473880954566,88.50749970338121 c 0.0,-2.7923476099146396 -2.263644993122374,-5.055992603037014 -5.055992603037013 -5.055992603037014c -2.7923476099146396,-1.7098197812943627e-16 -5.055992603037014,2.2636449931223734 -5.055992603037014 5.055992603037012c -3.4196395625887253e-16,2.7923476099146396 2.2636449931223734,5.055992603037014 5.055992603037011 5.055992603037014c 2.7923476099146396,5.129459343883088e-16 5.055992603037014,-2.263644993122373 5.055992603037017 -5.055992603037012Z" /></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TrailLike_explodeTrailEx.svg b/diagrams/src_Diagrams_TrailLike_explodeTrailEx.svg
--- a/diagrams/src_Diagrams_TrailLike_explodeTrailEx.svg
+++ b/diagrams/src_Diagrams_TrailLike_explodeTrailEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="285.31695488854604" font-size="1" viewBox="0 0 300 285"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(168.5547242045168,0.0,0.0,168.5547242045168,150.0,142.65847744427302)"><g fill-opacity="0.0"><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -0.49999999999999956,0.7694208842938132 l 0.9999999999999996,1.1102230246251565e-16 " /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -0.8090169943749475,-0.18163563200134014 l 0.3090169943749479,0.9510565162951533 " /></g><g stroke="rgb(255,255,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -1.1102230246251565e-16,-0.7694208842938133 l -0.8090169943749473,0.5877852522924731 " /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 0.8090169943749473,-0.18163563200134036 l -0.8090169943749475,-0.5877852522924729 " /></g><g stroke="rgb(255,165,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 0.5000000000000002,0.7694208842938133 l 0.3090169943749471,-0.9510565162951536 " /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="285.3169548885461" font-size="1" viewBox="0 0 300 285" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.1702655183611206" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g stroke="rgb(0,0,255)" stroke-opacity="1.0"><path d="M 65.72263789774158,272.34800239361215 l 168.5547242045168,-1.871333357211977e-14 " /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 13.636363636363626,112.04293358657401 l 52.086274261377966,160.30506880703814 " /></g><g stroke="rgb(255,255,0)" stroke-opacity="1.0"><path d="M 150.0,12.968952494933887 l -136.36363636363637,99.0739810916401 " /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 286.3636363636364,112.04293358657402 l -136.36363636363635,-99.07398109164014 " /></g><g stroke="rgb(255,165,0)" stroke-opacity="1.0"><path d="M 234.2773621022584,272.34800239361215 l 52.086274261377966,-160.30506880703814 " /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TrailLike_fromOffsetsEx.svg b/diagrams/src_Diagrams_TrailLike_fromOffsetsEx.svg
--- a/diagrams/src_Diagrams_TrailLike_fromOffsetsEx.svg
+++ b/diagrams/src_Diagrams_TrailLike_fromOffsetsEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="86.60254037844385" font-size="1" viewBox="0 0 300 87"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(90.9090909090909,0.0,0.0,90.9090909090909,150.0,43.301270189221924)"><g fill-opacity="0.0"><path d="M -1.5,0.4330127018922193 h 1.0 l 0.5000000000000001,-0.8660254037844386 l 0.5000000000000001,0.8660254037844386 h 1.0 " /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="86.60254037844385" font-size="1" viewBox="0 0 300 87" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.644741959094125" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><path d="M 13.636363636363626,82.66606127033276 h 90.9090909090909 l 45.45454545454546,-78.72958216222169 l 45.45454545454546,78.72958216222169 h 90.9090909090909 " /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TrailLike_fromSegmentsEx.svg b/diagrams/src_Diagrams_TrailLike_fromSegmentsEx.svg
--- a/diagrams/src_Diagrams_TrailLike_fromSegmentsEx.svg
+++ b/diagrams/src_Diagrams_TrailLike_fromSegmentsEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="247.48737341529161" height="200.00000000000003" font-size="1" viewBox="0 0 247 200"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(128.564869306645,0.0,0.0,128.564869306645,123.74368670764581,100.00000000000001)"><g fill-opacity="0.0"><path d="M -0.875,0.7071067811865476 l 1.0,-1.0 c 1.0,-1.0 1.0,0.0 0.0 1.0h -1.0 " /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="247.48737341529161" height="200.00000000000003" font-size="1" viewBox="0 0 247 200" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.8899211172508118" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><path d="M 11.249426064331445,190.90909090909093 l 128.564869306645,-128.564869306645 c 128.564869306645,-128.564869306645 128.564869306645,0.0 0.0 128.564869306645h -128.564869306645 " /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TrailLike_fromVerticesEx.svg b/diagrams/src_Diagrams_TrailLike_fromVerticesEx.svg
--- a/diagrams/src_Diagrams_TrailLike_fromVerticesEx.svg
+++ b/diagrams/src_Diagrams_TrailLike_fromVerticesEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="305.02203183512904" font-size="1" viewBox="0 0 300 305"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(114.88022467370443,0.0,0.0,114.88022467370443,150.0,152.51101591756452)"><g><path d="M 0.41802076667285704,0.6469755613042312 l 0.457690772717425,-0.1352679348067608 l 0.311295508610812,-0.4195471927671871 l -0.45996928695328987,-0.39624138872120573 l 1.2786776094528052e-2,-0.47708988249036255 l -0.3028174891412384,-0.4257068344650894 l -0.5189862813282371,0.315011464662979 l -0.44978811048447176,-0.15958982826097634 l -0.49844700928799934,0.1564458998246363 l 0.13921812539752376,0.5909291807288132 l -0.29077111610952444,0.3784579443663209 l -5.239704189479388e-3,0.5223957179572758 l 0.6050278146739517,5.020285397155655e-2 l 0.2700816777820438,0.3934897011917795 l 0.49520869400790596,0.16641240945036362 l 0.2347096282100502,-0.5599021106421431 Z" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="305.0220318351292" font-size="1" viewBox="0 0 300 305" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.21000237719131" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><path d="M 198.02231959365204,226.8357137585907 l 52.57961880085914,-15.539610741748685 l 35.761697969125166,-48.197675766316436 l -52.84137502819749,-45.52029976131276 l 1.4689477105917228,-54.80819289004408 l -34.78774118767253,-48.905296788481024 l -59.62126060155821,36.18858783527575 l -51.671759188017134,-18.33371532625888 l -57.261704414941406,17.972540121134063 l 15.9934095243195,67.88607704837416 l -33.40385114728599,43.47733367835122 l -0.601938394511168,60.012937447513 l 69.50573128358397,5.767315143513668 l 31.02704382385218,45.20418527970044 l 56.88968602799999,19.11749498615032 Z" /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TrailLike_twiddleEx.svg b/diagrams/src_Diagrams_TrailLike_twiddleEx.svg
--- a/diagrams/src_Diagrams_TrailLike_twiddleEx.svg
+++ b/diagrams/src_Diagrams_TrailLike_twiddleEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="259.80762113533166" font-size="1" viewBox="0 0 300 260"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(136.36363636363635,0.0,0.0,136.36363636363635,150.0,129.90381056766583)"><g fill-opacity="0.0"><path d="M -0.5000000000000007,0.8660254037844385 h 0.0 " /><path d="M -0.5000000000000007,0.8660254037844385 l -0.49999999999999933,-0.866025403784439 " /><path d="M -0.5000000000000007,0.8660254037844385 l 9.992007221626409e-16,-1.7320508075688774 " /><path d="M -0.5000000000000007,0.8660254037844385 l 1.0000000000000009,-1.732050807568877 " /><path d="M -0.5000000000000007,0.8660254037844385 l 1.5000000000000004,-0.8660254037844382 " /><path d="M -0.5000000000000007,0.8660254037844385 l 1.0000000000000004,3.3306690738754696e-16 " /><path d="M -1.0,-5.551115123125783e-16 l 0.49999999999999933,0.866025403784439 " /><path d="M -1.0,-5.551115123125783e-16 h 0.0 " /><path d="M -1.0,-5.551115123125783e-16 l 0.5000000000000003,-0.8660254037844384 " /><path d="M -1.0,-5.551115123125783e-16 l 1.5000000000000002,-0.8660254037844379 " /><path d="M -1.0,-5.551115123125783e-16 l 2.0,8.881784197001252e-16 " /><path d="M -1.0,-5.551115123125783e-16 l 1.4999999999999996,0.8660254037844394 " /><path d="M -0.49999999999999967,-0.8660254037844389 l -9.992007221626409e-16,1.7320508075688774 " /><path d="M -0.49999999999999967,-0.8660254037844389 l -0.5000000000000003,0.8660254037844384 " /><path d="M -0.49999999999999967,-0.8660254037844389 h 0.0 " /><path d="M -0.49999999999999967,-0.8660254037844389 l 0.9999999999999999,4.440892098500626e-16 " /><path d="M -0.49999999999999967,-0.8660254037844389 l 1.4999999999999996,0.8660254037844393 " /><path d="M -0.49999999999999967,-0.8660254037844389 l 0.9999999999999993,1.7320508075688776 " /><path d="M 0.5000000000000002,-0.8660254037844385 l -1.0000000000000009,1.732050807568877 " /><path d="M 0.5000000000000002,-0.8660254037844385 l -1.5000000000000002,0.8660254037844379 " /><path d="M 0.5000000000000002,-0.8660254037844385 l -0.9999999999999999,-4.440892098500626e-16 " /><path d="M 0.5000000000000002,-0.8660254037844385 h 0.0 " /><path d="M 0.5000000000000002,-0.8660254037844385 l 0.49999999999999967,0.8660254037844388 " /><path d="M 0.5000000000000002,-0.8660254037844385 l -5.551115123125783e-16,1.7320508075688772 " /><path d="M 0.9999999999999999,3.3306690738754696e-16 l -1.5000000000000004,0.8660254037844382 " /><path d="M 0.9999999999999999,3.3306690738754696e-16 l -2.0,-8.881784197001252e-16 " /><path d="M 0.9999999999999999,3.3306690738754696e-16 l -1.4999999999999996,-0.8660254037844393 " /><path d="M 0.9999999999999999,3.3306690738754696e-16 l -0.49999999999999967,-0.8660254037844388 " /><path d="M 0.9999999999999999,3.3306690738754696e-16 h 0.0 " /><path d="M 0.9999999999999999,3.3306690738754696e-16 l -0.5000000000000002,0.8660254037844385 " /><path d="M 0.49999999999999967,0.8660254037844388 l -1.0000000000000004,-3.3306690738754696e-16 " /><path d="M 0.49999999999999967,0.8660254037844388 l -1.4999999999999996,-0.8660254037844394 " /><path d="M 0.49999999999999967,0.8660254037844388 l -0.9999999999999993,-1.7320508075688776 " /><path d="M 0.49999999999999967,0.8660254037844388 l 5.551115123125783e-16,-1.7320508075688772 " /><path d="M 0.49999999999999967,0.8660254037844388 l 0.5000000000000002,-0.8660254037844385 " /><path d="M 0.49999999999999967,0.8660254037844388 h 0.0 " /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="259.80762113533166" font-size="1" viewBox="0 0 300 260" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.1167258309225196" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><path d="M 81.81818181818174,247.99818381099834 h 0.0 " /><path d="M 81.81818181818174,247.99818381099834 l -68.18181818181809,-118.09437324333258 " /><path d="M 81.81818181818174,247.99818381099834 l 1.3625464393126918e-13,-236.18874648666508 " /><path d="M 81.81818181818174,247.99818381099834 l 136.36363636363646,-236.188746486665 " /><path d="M 81.81818181818174,247.99818381099834 l 204.5454545454546,-118.09437324333246 " /><path d="M 81.81818181818174,247.99818381099834 l 136.3636363636364,4.5418214643756395e-14 " /><path d="M 13.636363636363654,129.90381056766577 l 68.18181818181809,118.09437324333258 " /><path d="M 13.636363636363654,129.90381056766577 h 0.0 " /><path d="M 13.636363636363654,129.90381056766577 l 68.18181818181822,-118.09437324333248 " /><path d="M 13.636363636363654,129.90381056766577 l 204.54545454545456,-118.09437324333243 " /><path d="M 13.636363636363654,129.90381056766577 l 272.7272727272727,1.2111523905001706e-13 " /><path d="M 13.636363636363654,129.90381056766577 l 204.54545454545445,118.09437324333263 " /><path d="M 81.81818181818187,11.809437324333274 l -1.3625464393126918e-13,236.18874648666508 " /><path d="M 81.81818181818187,11.809437324333274 l -68.18181818181822,118.09437324333248 " /><path d="M 81.81818181818187,11.809437324333274 h 0.0 " /><path d="M 81.81818181818187,11.809437324333274 l 136.36363636363632,6.055761952500853e-14 " /><path d="M 81.81818181818187,11.809437324333274 l 204.54545454545445,118.09437324333261 " /><path d="M 81.81818181818187,11.809437324333274 l 136.36363636363626,236.1887464866651 " /><path d="M 218.1818181818182,11.80943732433333 l -136.36363636363646,236.188746486665 " /><path d="M 218.1818181818182,11.80943732433333 l -204.54545454545456,118.09437324333243 " /><path d="M 218.1818181818182,11.80943732433333 l -136.36363636363632,-6.055761952500853e-14 " /><path d="M 218.1818181818182,11.80943732433333 h 0.0 " /><path d="M 218.1818181818182,11.80943732433333 l 68.18181818181813,118.09437324333256 " /><path d="M 218.1818181818182,11.80943732433333 l -7.569702440626067e-14,236.18874648666505 " /><path d="M 286.3636363636363,129.9038105676659 l -204.5454545454546,118.09437324333246 " /><path d="M 286.3636363636363,129.9038105676659 l -272.7272727272727,-1.2111523905001706e-13 " /><path d="M 286.3636363636363,129.9038105676659 l -204.54545454545445,-118.09437324333261 " /><path d="M 286.3636363636363,129.9038105676659 l -68.18181818181813,-118.09437324333256 " /><path d="M 286.3636363636363,129.9038105676659 h 0.0 " /><path d="M 286.3636363636363,129.9038105676659 l -68.1818181818182,118.0943732433325 " /><path d="M 218.18181818181813,247.9981838109984 l -136.3636363636364,-4.5418214643756395e-14 " /><path d="M 218.18181818181813,247.9981838109984 l -204.54545454545445,-118.09437324333263 " /><path d="M 218.18181818181813,247.9981838109984 l -136.36363636363626,-236.1887464866651 " /><path d="M 218.18181818181813,247.9981838109984 l 7.569702440626067e-14,-236.18874648666505 " /><path d="M 218.18181818181813,247.9981838109984 l 68.1818181818182,-118.0943732433325 " /><path d="M 218.18181818181813,247.9981838109984 h 0.0 " /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Trail_closeLineEx.svg b/diagrams/src_Diagrams_Trail_closeLineEx.svg
--- a/diagrams/src_Diagrams_Trail_closeLineEx.svg
+++ b/diagrams/src_Diagrams_Trail_closeLineEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500.0" height="68.18181818181819" font-size="1" viewBox="0 0 500 68"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(41.32231404958678,0.0,0.0,41.32231404958678,250.0,34.09090909090909)"><g fill-opacity="0.0"><g><path d="M 3.5,-0.75 l 2.0,1.0 l -3.0,0.5 l -2.0,-1.0 l 1.0,-0.5 h 2.0 Z" /></g><path d="M -2.5,-0.75 l 2.0,1.0 l -3.0,0.5 l -2.0,-1.0 l 1.0,-0.5 " /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500.0" height="68.18181818181819" font-size="1" viewBox="0 0 500 68" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.7385489458759964" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><path d="M 394.6280991735537,3.099173553719009 l 82.64462809917356,41.32231404958678 l -123.96694214876034,20.66115702479339 l -82.64462809917356,-41.32231404958678 l 41.32231404958678,-20.66115702479339 Z" /></g><path d="M 146.69421487603304,3.099173553719009 l 82.64462809917356,41.32231404958678 l -123.96694214876034,20.66115702479339 l -82.64462809917356,-41.32231404958678 l 41.32231404958678,-20.66115702479339 " /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Trail_glueLineEx.svg b/diagrams/src_Diagrams_Trail_glueLineEx.svg
--- a/diagrams/src_Diagrams_Trail_glueLineEx.svg
+++ b/diagrams/src_Diagrams_Trail_glueLineEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500.0" height="68.18181818181819" font-size="1" viewBox="0 0 500 68"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(41.32231404958677,0.0,0.0,41.32231404958677,136.36363636363637,0.0)"><g><path d="M 6.0,0.0 l 2.0,1.0 l -3.0,0.5 l -2.0,-1.0 l 3.0,-0.5 Z" /></g><path d="M 0.0,0.0 l 2.0,1.0 l -3.0,0.5 l -2.0,-1.0 l 1.0,-0.5 " /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500.0" height="68.18181818181819" font-size="1" viewBox="0 0 500 68" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.7385489458759964" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><path d="M 384.297520661157,0.0 l 82.64462809917354,41.32231404958677 l -123.96694214876032,20.661157024793386 l -82.64462809917354,-41.32231404958677 Z" /></g><path d="M 136.36363636363637,0.0 l 82.64462809917354,41.32231404958677 l -123.96694214876032,20.661157024793386 l -82.64462809917354,-41.32231404958677 l 41.32231404958677,-20.661157024793386 " /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Trail_lineFromOffsetsEx.svg b/diagrams/src_Diagrams_Trail_lineFromOffsetsEx.svg
--- a/diagrams/src_Diagrams_Trail_lineFromOffsetsEx.svg
+++ b/diagrams/src_Diagrams_Trail_lineFromOffsetsEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="50.0" font-size="1" viewBox="0 0 300 50"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(50.0,0.0,0.0,50.0,0.0,50.0)"><path d="M 0.0,0.0 l 2.0,-1.0 l 2.0,1.0 l 2.0,-0.5 " /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="50.0" font-size="1" viewBox="0 0 300 50" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 0.0,50.0 l 100.0,-50.0 l 100.0,50.0 l 100.0,-25.0 " /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Trail_lineFromVerticesEx.svg b/diagrams/src_Diagrams_Trail_lineFromVerticesEx.svg
--- a/diagrams/src_Diagrams_Trail_lineFromVerticesEx.svg
+++ b/diagrams/src_Diagrams_Trail_lineFromVerticesEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="120.00000000000001" font-size="1" viewBox="0 0 300 120"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(54.54545454545455,0.0,0.0,54.54545454545455,150.0,60.00000000000001)"><g fill-opacity="0.0"><path d="M -2.5,1.0 v -1.0 l 1.0,-1.0 l 4.0,1.0 " /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="120.00000000000001" font-size="1" viewBox="0 0 300 120" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.7589466384404111" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><path d="M 13.636363636363626,114.54545454545456 v -54.54545454545455 l 54.54545454545455,-54.54545454545455 l 218.1818181818182,54.54545454545455 " /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_Trail_trailOffsetEx.svg b/diagrams/src_Diagrams_Trail_trailOffsetEx.svg
--- a/diagrams/src_Diagrams_Trail_trailOffsetEx.svg
+++ b/diagrams/src_Diagrams_Trail_trailOffsetEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="90.00000000000001" font-size="1" viewBox="0 0 300 90"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(54.54545454545455,0.0,0.0,54.54545454545455,150.0,45.00000000000001)"><g fill-opacity="0.0"><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="5.0e-2"><path d="M 0.5,-0.75 h -2.0 " /></g><path d="M 0.5,-0.75 l 2.0,1.0 l -3.0,0.5 l -2.0,-1.0 l 1.0,-0.5 " /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="90.00000000000001" font-size="1" viewBox="0 0 300 90" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.6572670690061994" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 177.27272727272728,4.090909090909101 h -109.0909090909091 " /></g><path d="M 177.27272727272728,4.090909090909101 l 109.0909090909091,54.54545454545455 l -163.63636363636363,27.272727272727273 l -109.0909090909091,-54.54545454545455 l 54.54545454545455,-27.272727272727273 " /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arc_annularWedgeEx.svg b/diagrams/src_Diagrams_TwoD_Arc_annularWedgeEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arc_annularWedgeEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arc_annularWedgeEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="178.54130895779457" font-size="1" viewBox="0 0 400 179"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(81.15495782275252,0.0,0.0,81.15495782275252,200.0,89.27065447889727)"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g><path d="M 2.0282508910505657,-0.49497249665864596 l 0.2121320343559643,-0.21213203435596428 c -0.39052429175126996,-0.39052429175127 -1.023689270621825,-0.3905242917512702 -1.414213562373095 -2.220446049250313e-16c -0.39052429175127,0.39052429175126996 -0.3905242917512702,1.023689270621825 -3.3306690738754696e-16 1.414213562373095c 0.3905242917512699,0.39052429175127007 1.0236892706218248,0.39052429175127024 1.4142135623730947 4.440892098500626e-16l -0.21213203435596423,-0.21213203435596434 c -0.2733670042258889,0.27336700422588883 -0.7165824894352774,0.2733670042258887 -0.9899494936611662 -3.108624468950438e-16c -0.2733670042258889,-0.2733670042258889 -0.2733670042258888,-0.7165824894352775 2.3314683517128283e-16 -0.9899494936611664c 0.2733670042258889,-0.27336700422588894 0.7165824894352775,-0.27336700422588883 0.9899494936611667 1.1102230246251565e-16Z" /></g><g><path d="M -3.989378006737523e-2,-0.29835431843854476 l 7.316992428735741e-2,-0.6961653267577913 c -0.28185620611337825,-2.9624280998431504e-2 -0.5630453243913867,6.173960189645773e-2 -0.7736590696265117 0.25137706989087893l 0.4683914244512005,0.5202013778341761 c 6.31841235705375e-2,-5.689124039832636e-2 0.14754085905394002,-8.430040526679312e-2 0.23209772088795366 -7.541312096726371e-2Z" /></g><path d="M -1.7403829254065295,2.250171937223655e-6 h 0.5 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0l -3.061616997868383e-17,0.5 c 0.27614237491539667,0.0 0.4999999999999999,0.22385762508460327 0.49999999999999983 0.5Z" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="178.54130895779457" font-size="1" viewBox="0 0 400 179" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.0689548060277785" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 364.6026155171688,49.10118238914234 l 17.215566301012974,-17.21556630101297 c -31.692982425834614,-31.692982425834618 -83.0774595809185,-31.692982425834632 -114.77044200675311 -1.8020020547460663e-14c -31.692982425834618,31.692982425834614 -31.692982425834632,83.0774595809185 -2.7030030821190994e-14 114.77044200675311c 31.69298242583461,31.69298242583462 83.07745958091849,31.692982425834636 114.77044200675309 3.6040041094921325e-14l -17.215566301012966,-17.215566301012974 c -22.185087698084224,22.185087698084217 -58.154221706642936,22.18508769808421 -80.33930940472716 -2.5228028766444926e-14c -22.185087698084224,-22.185087698084224 -22.185087698084214,-58.15422170664295 1.8921021574833692e-14 -80.33930940472717c 22.185087698084224,-22.185087698084228 58.15422170664295,-22.185087698084217 80.3393094047272 1.4210854715202004e-14Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 196.76242196124196,65.05772234978109 l 5.938102119434486,-56.49726773069128 c -22.87402851921224,-2.4041572749570763 -45.693919553281,5.0104747879005584 -62.78626916472949 20.400495504601384l 38.01228629587615,42.21692087747031 c 5.127704883434549,-4.617006215010248 11.973672193655174,-6.841395833867538 18.83588074941885 -6.120148651380411Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 58.75929709319445,89.27083709150592 h 40.57747891137626 c 0.0,-44.820645578667474 -36.33431224408504,-81.15495782275252 -81.15495782275251 -81.15495782275252l -2.4846539833143083e-15,40.57747891137626 c 22.41032278933373,0.0 40.577478911376254,18.167156122042524 40.57747891137625 40.57747891137626Z" /></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arc_arc'Ex.svg b/diagrams/src_Diagrams_TwoD_Arc_arc'Ex.svg
--- a/diagrams/src_Diagrams_TwoD_Arc_arc'Ex.svg
+++ b/diagrams/src_Diagrams_TwoD_Arc_arc'Ex.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="299.99999999999994" font-size="1" viewBox="0 0 300 300"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(109.09090909090911,0.0,0.0,109.09090909090911,150.0,149.99999999999997)"><g fill-opacity="0.0"><path d="M 1.2499999999999998,0.25000000000000033 c 0.0,-0.8284271247461902 -0.6715728752538097,-1.5 -1.4999999999999996 -1.5" /><path d="M 0.7499999999999998,0.25000000000000033 c 0.0,0.5522847498307932 -0.44771525016920655,0.9999999999999996 -1.0 0.9999999999999994c -0.5522847498307932,0.0 -0.9999999999999997,-0.44771525016920655 -0.9999999999999996 -1.0c 0.0,-0.5522847498307932 0.44771525016920655,-0.9999999999999997 1.0 -0.9999999999999997" /><path d="M 0.24999999999999978,0.25000000000000033 c 0.0,-0.2761423749153967 -0.22385762508460322,-0.5 -0.4999999999999999 -0.5" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="299.99999999999994" font-size="1" viewBox="0 0 300 300" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><path d="M 286.3636363636364,177.27272727272728 c 0.0,-90.37386815412985 -73.2624954822338,-163.63636363636365 -163.63636363636363 -163.63636363636365" /><path d="M 231.8181818181818,177.27272727272728 c 0.0,60.24924543608655 -48.84166365482254,109.09090909090907 -109.09090909090911 109.09090909090905c -60.24924543608655,0.0 -109.09090909090907,-48.84166365482254 -109.09090909090907 -109.09090909090911c 0.0,-60.24924543608655 48.84166365482254,-109.09090909090907 109.09090909090911 -109.09090909090907" /><path d="M 177.27272727272725,177.27272727272728 c 0.0,-30.124622718043284 -24.420831827411263,-54.545454545454554 -54.54545454545454 -54.545454545454554" /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arc_arcBetweenEx.svg b/diagrams/src_Diagrams_TwoD_Arc_arcBetweenEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arc_arcBetweenEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arc_arcBetweenEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="149.99999999999991" font-size="1" viewBox="0 0 300 150"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(136.363636363636,0.0,0.0,136.363636363636,150.0,74.99999999999997)"><g fill-opacity="0.0"><path d="M -0.9999999999999991,0.4999999999999992 c 0.5260763745333457,-0.5611805842666443 1.2354097078666786,-0.9158472509333104 2.0000000000000013 -0.9999999999999992" /><path d="M -0.9999999999999979,0.5000000000000004 c 0.6017048539333386,-0.44992362546665604 1.2790381872666725,-0.7885902921333223 2.0000000000000004 -0.9999999999999998" /><path d="M -0.9999999999999987,0.5 l 2.0000000000000004,-0.9999999999999999 " /><path d="M -1.0000000000000027,0.500000000000001 c 0.720961812733329,-0.21140970786667745 1.3982951460666655,-0.5500763745333455 2.000000000000005 -1.000000000000002" /><path d="M -0.9999999999999994,0.5000000000000004 c 0.7645902921333227,-8.415274906668882e-2 1.4739236254666557,-0.4388194157333549 2.0000000000000013 -0.999999999999999" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="150.0" font-size="1" viewBox="0 0 300 150" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.8485281374238571" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><path d="M 13.636363636364111,143.18181818181793 c 71.7376874363651,-76.52462512726947 168.46496016363756,-124.88826149090566 272.7272727272722 -136.36363636363595" /><path d="M 13.636363636364266,143.1818181818181 c 82.05066190000052,-61.353221654543866 174.4142982636367,-107.53503983636188 272.72727272727207 -136.363636363636" /><path d="M 13.636363636364166,143.18181818181804 l 272.72727272727207,-136.36363636363603 " /><path d="M 13.636363636363624,143.1818181818182 c 98.31297446363554,-28.82859652727414 190.67661082727207,-75.01041470909239 272.72727272727275 -136.36363636363635" /><path d="M 13.636363636364058,143.1818181818181 c 104.26231256363465,-11.475374872730281 200.9895852909071,-59.83901123636646 272.7272727272722 -136.36363636363592" /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arc_wedgeEx.svg b/diagrams/src_Diagrams_TwoD_Arc_wedgeEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arc_wedgeEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arc_wedgeEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="178.54130895779457" font-size="1" viewBox="0 0 400 179"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(81.15495782275252,0.0,0.0,81.15495782275252,200.0,89.27065447889727)"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g><path d="M 1.5332761442199825,2.250171937223655e-6 l 0.7071067811865476,-0.7071067811865475 c -0.39052429175126996,-0.39052429175127 -1.023689270621825,-0.3905242917512702 -1.414213562373095 -2.220446049250313e-16c -0.39052429175127,0.39052429175126996 -0.3905242917512702,1.023689270621825 -3.3306690738754696e-16 1.414213562373095c 0.3905242917512699,0.39052429175127007 1.0236892706218248,0.39052429175127024 1.4142135623730947 4.440892098500626e-16l -0.707106781186547,-0.7071067811865477 Z" /></g><g><path d="M -7.125231904767126e-2,2.250171937223655e-6 l 0.10452846326765346,-0.9945218953682733 c -0.28185620611337825,-2.9624280998431504e-2 -0.5630453243913867,6.173960189645773e-2 -0.7736590696265117 0.25137706989087893l 0.6691306063588582,0.7431448254773944 Z" /></g><path d="M -2.2403829254065295,2.250171937223655e-6 h 1.0 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0l -2.220446049250313e-16,1.0 Z" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="178.54130895779457" font-size="1" viewBox="0 0 400 179" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.0689548060277785" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 324.43296081480526,89.27083709150592 l 57.385221003376564,-57.38522100337656 c -31.692982425834614,-31.692982425834618 -83.0774595809185,-31.692982425834632 -114.77044200675311 -1.8020020547460663e-14c -31.692982425834618,31.692982425834614 -31.692982425834632,83.0774595809185 -2.7030030821190994e-14 114.77044200675311c 31.69298242583461,31.69298242583462 83.07745958091849,31.692982425834636 114.77044200675309 3.6040041094921325e-14Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g><g fill="rgb(0,0,255)" fill-opacity="1.0"><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 194.21752105291293,89.27083709150592 l 8.483003027763553,-80.71038247241611 c -22.87402851921224,-2.4041572749570763 -45.693919553281,5.0104747879005584 -62.78626916472949 20.400495504601384Z" /></g></g></g><g fill="rgb(0,0,255)" fill-opacity="1.0"><path d="M 18.181818181818187,89.27083709150592 h 81.15495782275252 c 0.0,-44.820645578667474 -36.33431224408504,-81.15495782275252 -81.15495782275251 -81.15495782275252Z" /></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrow_example1.svg b/diagrams/src_Diagrams_TwoD_Arrow_example1.svg
--- a/diagrams/src_Diagrams_TwoD_Arrow_example1.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrow_example1.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="499.99999999999994" height="142.85714285714286" font-size="1" viewBox="0 0 500 143"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(64.93506493506493,0.0,0.0,64.93506493506493,71.42857142857139,71.42857142857143)"><g><g stroke="rgb(169,169,169)" stroke-opacity="1.0" stroke-width="7.0e-2"><path d="M 6.0,1.0 l -2.220446049250313e-16,-2.0 h -2.0 l -2.220446049250313e-16,2.0 h 2.0 Z" /><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M 5.04,0.0 c 0.0,-2.209138999323174e-2 -1.7908610006768258e-2,-4.0e-2 -3.9999999999999994e-2 -4.0e-2c -2.209138999323174e-2,-1.3527075021963559e-18 -4.0e-2,1.7908610006768255e-2 -4.0e-2 3.999999999999999e-2c -2.7054150043927117e-18,2.209138999323174e-2 1.7908610006768255e-2,4.0e-2 3.999999999999998e-2 4.0e-2c 2.209138999323174e-2,4.0581225065890676e-18 4.0e-2,-1.790861000676825e-2 4.000000000000001e-2 -3.999999999999999e-2Z" /></g></g></g><g></g><g stroke="rgb(169,169,169)" stroke-opacity="1.0" stroke-width="7.0e-2"><path d="M 1.0000000000000002,1.0 l -2.220446049250313e-16,-2.0 h -2.0 l -2.220446049250313e-16,2.0 h 2.0 Z" /><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M 4.0e-2,0.0 c 0.0,-2.209138999323174e-2 -1.7908610006768258e-2,-4.0e-2 -3.9999999999999994e-2 -4.0e-2c -2.209138999323174e-2,-1.3527075021963559e-18 -4.0e-2,1.7908610006768255e-2 -4.0e-2 3.999999999999999e-2c -2.7054150043927117e-18,2.209138999323174e-2 1.7908610006768255e-2,4.0e-2 3.999999999999998e-2 4.0e-2c 2.209138999323174e-2,4.0581225065890676e-18 4.0e-2,-1.790861000676825e-2 4.000000000000001e-2 -3.999999999999999e-2Z" /></g></g><g><g><g fill-opacity="0.0" stroke-width="2.0e-2"><path d="M 0.29748256273725837,3.878304871039902e-2 c 0.9519443557972225,0.12410577608570911 1.903888711594445,0.24821155217141821 2.15046054898094 0.17171496874379844c 0.24657183738649566,-7.649658342761977e-2 -0.21222884363773598,-0.35359552636856845 3.4342993748759695e-2 -0.43009210979618817c 0.24657183738649566,-7.649658342761977e-2 1.198516193183718,4.760919265808934e-2 2.1504605489809396 0.1717149687437984" /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.29748256273725837,3.878304871039902e-2 l -1.2927682903466336e-3,9.916085424575276e-3 l -9.430757659181744e-3,-1.2294957065939064e-3 l 1.0723525949528377e-2,-8.68658971798137e-3 l -8.137989368835107e-3,-1.1145581131169199e-2 l 9.43075765918174e-3,1.2294957065939237e-3 l -1.2927682903466336e-3,9.916085424575276e-3 h -0.0 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.29748256273725837,3.878304871039902e-2 l -0.15757826014270998,0.12764623322362204 l -0.30987766951797735,-4.03990090733323e-2 l 0.16997336692342907,-0.12603027286068874 l -0.13197986013857382,-0.16539616579119604 l 0.30987766951797735,4.03990090733323e-2 l 0.11958475335785472,0.16378020542826274 l 1.3877787807814457e-17,2.7755575615628914e-17 Z" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 5.0,-2.7755575615628914e-17 l -0.5609471155928247,0.10469666898034764 l 0.2039680403081149,-0.15123632743282647 l -0.15837583216628864,-0.19847539894943522 l 0.5153549074509984,0.24501505740191404 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 4.64302092471529,-4.653965845247886e-2 l -1.1567038557738623e-2,8.57662027886182e-3 l 2.5855365806932637e-3,-1.9832170849150513e-2 l 8.981501977045359e-3,1.1255550570288693e-2 h -0.0 Z" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="499.99999999999994" height="142.85714285714286" font-size="1" viewBox="0 0 500 143" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.0690449676496976" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g stroke="rgb(169,169,169)" stroke-opacity="1.0" stroke-width="5.345224838248488"><path d="M 461.03896103896096,136.36363636363637 l -1.4418480839287746e-14,-129.87012987012986 h -129.87012987012986 l -1.4418480839287746e-14,129.87012987012986 Z" /><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><path d="M 398.70129870129864,71.42857142857143 c 0.0,-1.4345058437163465 -1.1628967536862505,-2.5974025974025974 -2.597402597402597 -2.5974025974025974c -1.4345058437163465,-8.783814949326985e-17 -2.5974025974025974,1.1628967536862502 -2.5974025974025974 2.5974025974025965c -1.756762989865397e-16,1.4345058437163465 1.1628967536862502,2.5974025974025974 2.597402597402596 2.5974025974025974c 1.4345058437163465,2.6351444847980957e-16 2.5974025974025974,-1.16289675368625 2.5974025974025987 -2.5974025974025965Z" /></g></g></g></g></g><g></g><g stroke="rgb(169,169,169)" stroke-opacity="1.0" stroke-width="5.345224838248488"><path d="M 136.36363636363632,136.36363636363637 l -1.4418480839287746e-14,-129.87012987012986 h -129.87012987012986 l -1.4418480839287746e-14,129.87012987012986 Z" /><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><path d="M 74.02597402597398,71.42857142857143 c 0.0,-1.4345058437163465 -1.1628967536862505,-2.5974025974025974 -2.597402597402597 -2.5974025974025974c -1.4345058437163465,-8.783814949326985e-17 -2.5974025974025974,1.1628967536862502 -2.5974025974025974 2.5974025974025965c -1.756762989865397e-16,1.4345058437163465 1.1628967536862502,2.5974025974025974 2.597402597402596 2.5974025974025974c 1.4345058437163465,2.6351444847980957e-16 2.5974025974025974,-1.16289675368625 2.5974025974025987 -2.5974025974025965Z" /></g></g></g></g><g><g><g><path d="M 89.9819766975543,73.83089383093066 c 61.406842947188636,7.951049003214775 122.81368589437727,15.90209800642955 138.71310687684397 10.954204913391047c 15.89942098246672,-4.947893093038505 -13.70857999978851,-22.794728282330297 2.1908409826782096 -27.742621375368802c 15.89942098246672,-4.947893093038505 77.30626392965536,3.0031559101762695 138.71310687684394 10.954204913391044" /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 89.9819766975543,73.83089383093066 l -6.420476687285677e-2,0.49586061338928916 l -0.47159146753799513,-6.106236191164162e-2 l 0.5357962344108519,-0.43479825147764756 l -0.4073867006651384,-0.5569229753009308 l 0.47159146753799513,6.106236191164162e-2 l -6.420476687285677e-2,0.49586061338928916 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 89.9819766975543,73.83089383093066 l -9.81976544020477,7.968732456689302 l -19.326463821857203,-2.5024191691242024 l 10.592823993079056,-7.868635689924334 l -8.239407860814753,-10.307060971598373 l 19.326463821857203,2.5024191691242024 l 7.466349307940467,10.206964204833405 Z" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 396.103896103896,71.42857142857143 l -32.982355078418344,6.185770522810794 l 6.7381797601759725,-9.583905225546857 l -4.075015142080604,-10.984013721974463 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 369.8597207856536,68.03043672583537 l -0.26068935173322666,-3.375444349141672e-2 l -6.420476687285682e-2,0.49586061338928916 l 0.32489411860608347,-0.46210616989787245 l -0.26068935173322666,-3.375444349141672e-2 l 6.420476687285682e-2,-0.49586061338928916 Z" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrow_example2.svg b/diagrams/src_Diagrams_TwoD_Arrow_example2.svg
--- a/diagrams/src_Diagrams_TwoD_Arrow_example2.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrow_example2.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500.0" height="191.60937134592436" font-size="1" viewBox="0 0 500 192"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(58.063445862401316,0.0,0.0,58.063445862401316,250.0,95.80468567296218)"><g><g><g><g fill-opacity="0.0"><path d="M -2.707106781186548,0.0 l 4.98932980156782e-17,0.8148193920143483 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -2.707106781186548,1.0 l -8.8167787843871e-2,-0.2713525491562421 l 8.816778784387098e-2,9.13525491562421e-2 l 8.816778784387096e-2,-9.135254915624214e-2 l -8.816778784387094e-2,0.27135254915624213 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -2.707106781186548,0.8200000000000001 l -4.9999999999999906e-3,-5.180607985651786e-3 l 9.999999999999981e-3,-6.123233995736754e-19 l -4.9999999999999906e-3,5.180607985651786e-3 v 8.673617379884035e-19 Z" /></g></g></g></g><g><g stroke="rgb(169,169,169)" stroke-opacity="1.0" stroke-width="0.1"><path d="M 3.9142135623730954,0.4999999999999996 l -2.220446049250313e-16,-1.0 l -0.7071067811865476,-0.7071067811865475 l -1.0,1.6081226496766364e-16 l -0.7071067811865475,0.7071067811865476 l 9.957992501029599e-17,1.0 l 0.7071067811865476,0.7071067811865476 l 1.0,-3.834758505292834e-17 l 0.7071067811865477,-0.7071067811865477 Z" /></g><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M 2.75539105243401,0.0 c 0.0,-2.6666666666666675e-2 -2.161760458079523e-2,-4.828427124746191e-2 -4.8284271247461895e-2 -4.828427124746191e-2c -2.6666666666666675e-2,-1.632862398863138e-18 -4.828427124746191e-2,2.1617604580795226e-2 -4.828427124746191e-2 4.8284271247461895e-2c -3.265724797726276e-18,2.6666666666666675e-2 2.1617604580795223e-2,4.828427124746191e-2 4.828427124746189e-2 4.828427124746191e-2c 2.6666666666666675e-2,4.898587196589414e-18 4.828427124746191e-2,-2.1617604580795223e-2 4.8284271247461916e-2 -4.8284271247461895e-2Z" /></g></g><g></g><g stroke="rgb(169,169,169)" stroke-opacity="1.0" stroke-width="0.1"><path d="M -1.5000000000000004,0.4999999999999996 l -2.220446049250313e-16,-1.0 l -0.7071067811865476,-0.7071067811865475 l -1.0,1.6081226496766364e-16 l -0.7071067811865475,0.7071067811865476 l 9.957992501029599e-17,1.0 l 0.7071067811865476,0.7071067811865476 l 1.0,-3.834758505292834e-17 l 0.7071067811865477,-0.7071067811865477 Z" /></g><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M -2.658822509939086,0.0 c 0.0,-2.6666666666666675e-2 -2.161760458079523e-2,-4.828427124746191e-2 -4.8284271247461895e-2 -4.828427124746191e-2c -2.6666666666666675e-2,-1.632862398863138e-18 -4.828427124746191e-2,2.1617604580795226e-2 -4.828427124746191e-2 4.8284271247461895e-2c -3.265724797726276e-18,2.6666666666666675e-2 2.1617604580795223e-2,4.828427124746191e-2 4.828427124746189e-2 4.828427124746191e-2c 2.6666666666666675e-2,4.898587196589414e-18 4.828427124746191e-2,-2.1617604580795223e-2 4.8284271247461916e-2 -4.8284271247461895e-2Z" /></g><g><g><g fill-opacity="0.0"><path d="M -2.707106781186548,0.0 h 5.229032954387444 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 2.7071067811865483,0.0 l -0.2713525491562421,8.816778784387098e-2 l 9.13525491562421e-2,-8.816778784387098e-2 l -9.135254915624214e-2,-8.816778784387096e-2 l 0.27135254915624213,8.816778784387096e-2 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 2.527106781186548,0.0 l -5.180607985651786e-3,4.9999999999999906e-3 v -9.999999999999981e-3 l 5.180607985651786e-3,4.9999999999999906e-3 h -0.0 Z" /></g></g></g></g><g><g><g fill-opacity="0.0"><path d="M -1.5000000000000016,0.5000000000000004 l 2.81481939201435,-4.687615948763571e-16 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.5,0.49999999999999994 l -0.2713525491562421,8.816778784387103e-2 l 9.135254915624208e-2,-8.8167787843871e-2 l -9.135254915624215e-2,-8.816778784387094e-2 l 0.27135254915624213,8.816778784387092e-2 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.32,0.5 l -5.180607985651785e-3,4.999999999999991e-3 l -1.6653345369377307e-18,-9.999999999999981e-3 l 5.180607985651787e-3,4.99999999999999e-3 h -0.0 Z" /></g></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500.0" height="191.60937134592436" font-size="1" viewBox="0 0 500 192" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.238093280317519" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><g><g><path d="M 92.8160519668354,95.80468567296218 l 2.89201135554859e-15,47.23012965962302 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 92.8160519668354,153.86813153536352 l -4.14210333348447,-12.748083238743886 l 4.142103333484469,2.1776325920251587 l 4.142103333484469,-2.1776325920251596 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 92.8160519668354,143.29768088864478 l -1.6095873091721878e-17,-0.26286555605956674 l -0.5,3.061616997868383e-17 l 0.5,0.2628655560595667 l -1.6095873091721878e-17,-0.26286555605956674 l 0.5,-3.061616997868383e-17 Z" /></g></g></g></g></g></g><g><g stroke="rgb(169,169,169)" stroke-opacity="1.0" stroke-width="6.190466401587595"><path d="M 477.2727272727272,124.83640860416281 l -1.2892674897102844e-14,-58.063445862401316 l -41.05705630836196,-41.05705630836195 l -58.063445862401316,9.337314240960074e-15 l -41.05705630836195,41.05705630836196 l 5.781953584817304e-15,58.063445862401316 l 41.05705630836196,41.05705630836196 l 58.063445862401316,-2.2265929286745346e-15 Z" /></g><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><path d="M 409.98749920274713,95.80468567296218 c 0.0,-1.5483585563307023 -1.2551926132518025,-2.803551169582505 -2.803551169582504 -2.803551169582505c -1.5483585563307023,-9.480961749714055e-17 -2.803551169582505,1.2551926132518023 -2.803551169582505 2.803551169582504c -1.896192349942811e-16,1.5483585563307023 1.255192613251802,2.803551169582505 2.8035511695825037 2.803551169582505c 1.5483585563307023,2.844288524914217e-16 2.803551169582505,-1.255192613251802 2.8035511695825055 -2.803551169582504Z" /></g></g></g></g><g></g><g stroke="rgb(169,169,169)" stroke-opacity="1.0" stroke-width="6.190466401587595"><path d="M 162.904831206398,124.83640860416281 l -1.2892674897102844e-14,-58.063445862401316 l -41.05705630836196,-41.05705630836195 l -58.063445862401316,9.337314240960074e-15 l -41.05705630836195,41.05705630836196 l 5.781953584817304e-15,58.063445862401316 l 41.05705630836196,41.05705630836196 l 58.063445862401316,-2.2265929286745346e-15 Z" /></g><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><path d="M 95.61960313641791,95.80468567296218 c 0.0,-1.5483585563307023 -1.2551926132518025,-2.803551169582505 -2.803551169582504 -2.803551169582505c -1.5483585563307023,-9.480961749714055e-17 -2.803551169582505,1.2551926132518023 -2.803551169582505 2.803551169582504c -1.896192349942811e-16,1.5483585563307023 1.255192613251802,2.803551169582505 2.8035511695825037 2.803551169582505c 1.5483585563307023,2.844288524914217e-16 2.803551169582505,-1.255192613251802 2.8035511695825055 -2.803551169582504Z" /></g></g></g><g><g><g><path d="M 92.8160519668354,95.80468567296218 h 292.70126366077255 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 407.18394803316454,95.80468567296218 l -25.81318531625282,8.387212331760587 l 4.4094184667558025,-8.387212331760587 l -4.4094184667558025,-8.387212331760587 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 385.78018118366754,95.80468567296218 h -0.26286555605956674 v 0.5 l 0.26286555605956674,-0.5 h -0.26286555605956674 v -0.5 Z" /></g></g></g></g></g></g><g><g><g><path d="M 162.90483120639794,124.83640860416287 l 152.52370518164744,-2.4886480444135933e-14 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 337.095168793602,124.83640860416284 l -25.81318531625282,8.38721233176059 l 4.409418466755801,-8.387212331760587 l -4.409418466755804,-8.387212331760587 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 315.691401944105,124.83640860416284 l -0.26286555605956674,4.2890372434385847e-17 l 8.15823363800974e-17,0.5 l 0.2628655560595667,-0.5 l -0.26286555605956674,4.2890372434385847e-17 l -8.15823363800974e-17,-0.5 Z" /></g></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_blockEx.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_blockEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_blockEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_blockEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(200.0,0.0,0.0,200.0,0.0,50.0)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.2427050983124842,0.0 h -0.2417050983124837 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.2427050983124842,-8.816778784387098e-2 l -2.6945678834043217e-17,0.17633557568774197 h -0.24270509831248419 l -2.6945678834043217e-17,-0.17633557568774197 h 0.24270509831248424 Z" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 3.500000000000001,50.0 h -3.3000000000000007 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 3.500000000000001,48.660607986722184 l -3.8857805861880484e-16,2.6787840265556295 h -3.5000000000000004 l -3.8857805861880484e-16,-2.6787840265556295 Z" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_dart'Ex.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_dart'Ex.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_dart'Ex.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_dart'Ex.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(200.0,0.0,0.0,200.0,0.0,50.0)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.18,0.0 h -0.1789999999999995 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.18,0.0 h 0.0 h 0.0 h 0.0 h -0.0 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.0,0.0 l 0.2713525491562421,8.816778784387098e-2 l -9.13525491562421e-2,-8.816778784387098e-2 l 9.135254915624214e-2,-8.816778784387096e-2 l -0.27135254915624213,8.816778784387096e-2 Z" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 3.5000000000000013,50.0 h -3.3000000000000087 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 3.5000000000000013,50.0 h 0.0 h 0.0 h 0.0 h 0.0 h 0.0 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 4.440892098500626e-16,50.0 l 4.221039653541545,1.371498922015771 l -0.7210396535415439,-1.371498922015771 l 0.7210396535415439,-1.371498922015771 Z" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_dartEx.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_dartEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_dartEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_dartEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="73.63770250368194" font-size="1" viewBox="0 0 100 74"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(147.27540500736387,0.0,0.0,147.27540500736387,26.36229749631806,36.81885125184097)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.0,0.0 h -0.1789999999999995 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.0000000000005005e-3,0.0 l -0.2713525491562421,8.816778784387098e-2 l 9.13525491562421e-2,-8.816778784387098e-2 l -9.135254915624214e-2,-8.816778784387096e-2 l 0.27135254915624213,8.816778784387096e-2 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.1789999999999995,0.0 h 0.0 h 0.0 h 0.0 h -0.0 Z" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 0.0,50.0 h -3.3000000000000087 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.19999999999999218,50.0 l -4.221039653541545,1.371498922015771 l 0.7210396535415439,-1.371498922015771 l -0.7210396535415439,-1.371498922015771 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -3.3000000000000087,50.0 h 0.0 h 0.0 h 0.0 h 0.0 h 0.0 Z" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_missile'Ex.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_missile'Ex.svg
deleted file mode 100644
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_missile'Ex.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(200.0,0.0,0.0,200.0,0.0,50.0)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.18000000000000005,0.0 h -0.17899999999999955 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.18000000000000005,0.0 h 0.0 h 0.0 h 0.0 h -0.0 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 5.551115123125783e-17,0.0 c -2.7755575615628914e-17,4.408389392193548e-2 0.22635254915624206,8.816778784387098e-2 0.27135254915624213 8.8167787843871e-2c 4.500000000000001e-2,0.0 -9.135254915624212e-2,-4.40838939219355e-2 -9.135254915624208e-2 -8.816778784387098e-2c 1.2721305490496585e-17,-4.4083893921935485e-2 0.13635254915624218,-8.816778784387096e-2 9.13525491562421e-2 -8.816778784387094e-2c -4.5000000000000005e-2,0.0 -0.27135254915624213,4.408389392193548e-2 -0.27135254915624213 8.816778784387093e-2Z" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_missileEx.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_missileEx.svg
deleted file mode 100644
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_missileEx.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="99.99999999999999" height="73.63770250368192" font-size="1" viewBox="0 0 100 74"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(147.27540500736384,0.0,0.0,147.27540500736384,26.362297496318064,36.81885125184096)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.0,0.0 h -0.17899999999999955 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.000000000000445e-3,0.0 c 2.7755575615628914e-17,4.408389392193548e-2 -0.22635254915624206,8.816778784387098e-2 -0.27135254915624213 8.8167787843871e-2c -4.500000000000001e-2,0.0 9.135254915624212e-2,-4.40838939219355e-2 9.135254915624208e-2 -8.816778784387098e-2c -1.2721305490496585e-17,-4.4083893921935485e-2 -0.13635254915624218,-8.816778784387096e-2 -9.13525491562421e-2 -8.816778784387094e-2c 4.5000000000000005e-2,0.0 0.27135254915624213,4.408389392193548e-2 0.27135254915624213 8.816778784387093e-2Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.17899999999999955,0.0 h 0.0 h 0.0 h 0.0 h -0.0 Z" /></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_quillEx.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_quillEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_quillEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_quillEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(200.0,0.0,0.0,200.0,0.0,50.0)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.18000000000000002,0.0 h -0.17899999999999952 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.18000000000000002,0.0 h 0.0 h 0.0 h 0.0 h 0.0 h 0.0 h 0.0 h -0.0 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.18000000000000002,0.0 l -8.38525491562421e-2,8.816778784387098e-2 h -0.1875 l 9.13525491562421e-2,-8.816778784387098e-2 l -9.13525491562421e-2,-8.816778784387098e-2 h 0.1875 l 8.38525491562421e-2,8.816778784387098e-2 h -2.7755575615628914e-17 Z" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 3.5000000000000004,50.0 h -3.3000000000000007 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 3.5000000000000004,50.0 h 0.0 h 0.0 h 0.0 h 0.0 h 0.0 h 0.0 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 3.5000000000000004,50.0 l -1.6304662335935967,1.7143736525197137 h -3.645833333333334 l 1.7762995669269297,-1.7143736525197137 l -1.7762995669269297,-1.7143736525197137 h 3.645833333333334 l 1.6304662335935967,1.7143736525197137 Z" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_spike'Ex.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_spike'Ex.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_spike'Ex.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_spike'Ex.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(200.0,0.0,0.0,200.0,0.0,50.0)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.21213203435596423,0.0 h -0.21113203435596373 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.21213203435596423,0.0 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.0,0.0 l 0.2560660171779821,0.10606601717798213 c -5.85786437626905e-2,-5.8578643762690494e-2 -5.857864376269052e-2,-0.15355339059327375 -3.3306690738754695e-17 -0.21213203435596423l -0.2560660171779821,0.10606601717798213 l 5.551115123125783e-17,-2.7755575615628914e-17 Z" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 3.500000000000001,50.0 h -3.3000000000000007 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 3.500000000000001,50.0 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 4.440892098500626e-16,50.0 l 4.224873734152917,1.7500000000000004 c -0.9664983122038887,-0.9664983122038886 -0.9664983122038892,-2.533501687796112 -5.495323605393214e-16 -3.5000000000000004l -4.224873734152917,1.7500000000000004 Z" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_spikeEx.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_spikeEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_spikeEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_spikeEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="70.31043123416943" font-size="1" viewBox="0 0 100 70"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(140.62086246833886,0.0,0.0,140.62086246833886,29.689568765830572,35.155215617084714)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.0,0.0 h -0.21113203435596373 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.0000000000005005e-3,0.0 l -0.2560660171779821,0.10606601717798213 c 5.85786437626905e-2,-5.8578643762690494e-2 5.857864376269052e-2,-0.15355339059327375 3.3306690738754695e-17 -0.21213203435596423l 0.2560660171779821,0.10606601717798213 l -5.551115123125783e-17,-2.7755575615628914e-17 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.21113203435596373,0.0 Z" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 0.0,50.0 h -3.3000000000000007 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.19999999999999973,50.0 l -4.224873734152917,1.7500000000000004 c 0.9664983122038887,-0.9664983122038886 0.9664983122038892,-2.533501687796112 5.495323605393214e-16 -3.5000000000000004l 4.224873734152917,1.7500000000000004 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -3.3000000000000007,50.0 Z" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_thorn'Ex.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_thorn'Ex.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_thorn'Ex.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_thorn'Ex.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(200.0,0.0,0.0,200.0,0.0,50.0)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.21213203435596423,0.0 h -0.21113203435596373 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.21213203435596423,0.0 h 0.0 h 0.0 h 0.0 h -0.0 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.0,0.0 c 7.5e-2,0.0 0.20303300858899107,5.3033008588991064e-2 0.2560660171779821 0.10606601717798213l -4.393398282201788e-2,-0.10606601717798213 l 4.393398282201788e-2,-0.10606601717798213 c -5.303300858899106e-2,5.3033008588991064e-2 -0.18106601717798212,0.10606601717798213 -0.2560660171779821 0.10606601717798211v 1.3877787807814457e-17 Z" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 3.500000000000001,50.0 h -3.3000000000000007 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 3.500000000000001,50.0 h 0.0 h 0.0 h 0.0 h 0.0 h 0.0 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 8.881784197001252e-16,50.0 c 2.3333333333333335,0.0 3.9832491561019445,1.649915822768611 3.9832491561019445 1.649915822768611l -0.48324915610194413,-1.649915822768611 h -3.5 c 2.3333333333333335,0.0 3.9832491561019445,-1.649915822768611 3.9832491561019445 -1.649915822768611l -0.48324915610194413,1.649915822768611 Z" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_thornEx.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_thornEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_thornEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_thornEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="70.31043123416943" font-size="1" viewBox="0 0 100 70"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(140.62086246833886,0.0,0.0,140.62086246833886,29.689568765830572,35.155215617084714)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.0,0.0 h -0.21113203435596373 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.0000000000005005e-3,0.0 c -7.5e-2,0.0 -0.20303300858899107,5.3033008588991064e-2 -0.2560660171779821 0.10606601717798213l 4.393398282201788e-2,-0.10606601717798213 l -4.393398282201788e-2,-0.10606601717798213 c 5.303300858899106e-2,5.3033008588991064e-2 0.18106601717798212,0.10606601717798213 0.2560660171779821 0.10606601717798211v 1.3877787807814457e-17 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -0.21113203435596373,0.0 h 0.0 h 0.0 h 0.0 h -0.0 Z" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 0.0,50.0 h -3.2999999478459427 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.20000005215405725,50.0 c -2.3333333333333335,0.0 -3.9832491561019445,1.649915822768611 -3.9832491561019445 1.649915822768611l 0.48324915610194413,-1.649915822768611 h 3.5 c -2.3333333333333335,0.0 -3.9832491561019445,-1.649915822768611 -3.9832491561019445 -1.649915822768611l 0.48324915610194413,1.649915822768611 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M -3.2999999478459427,50.0 h 0.0 h 0.0 h 0.0 h 0.0 h 0.0 Z" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_tri'Ex.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_tri'Ex.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_tri'Ex.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_tri'Ex.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(200.0,0.0,0.0,200.0,0.0,50.0)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.22499999999999998,0.0 h -0.22399999999999948 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.0,0.0 l 0.22499999999999998,0.1299038105676658 v -0.2598076211353316 l -0.22499999999999998,0.1299038105676658 Z" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 3.5,50.0 h -3.300000000000003 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.0,50.0 l 3.5,2.0207259421636903 v -4.041451884327381 Z" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_tri25Ex.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_tri25Ex.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_tri25Ex.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_tri25Ex.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="119.99999999999999" height="82.72509808789549" font-size="1" viewBox="0 0 120 83"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(137.87516347982583,0.0,0.0,137.87516347982583,37.274901912104454,41.362549043947745)"><g stroke-width="0.0"><path d="M 0.6000000000000002,0.3 l -6.661338147750939e-17,-0.6 h -0.6 l -6.661338147750939e-17,0.6 h 0.6000000000000002 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.0,0.0 h -0.2703525491562416 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.0000000000005005e-3,0.0 l -0.2713525491562421,8.816778784387098e-2 v -0.17633557568774197 l 0.2713525491562421,8.816778784387098e-2 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="120.0" height="119.99999999999996" font-size="1" viewBox="0 0 120 120" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 120.0,119.99999999999996 l -1.3322676295501874e-14,-119.99999999999996 h -119.99999999999996 l -1.3322676295501874e-14,119.99999999999996 Z" /></g><g><g><g stroke-width="0.0"><path d="M 0.0,59.99999999999998 h -3.999999999999999 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.20000000000000018,59.99999999999998 l -4.199999999999999,1.3646627241782066 v -2.729325448356413 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Arrowheads_triEx.svg b/diagrams/src_Diagrams_TwoD_Arrowheads_triEx.svg
--- a/diagrams/src_Diagrams_TwoD_Arrowheads_triEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Arrowheads_triEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="69.06077348066303" font-size="1" viewBox="0 0 100 69"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(138.12154696132606,0.0,0.0,138.12154696132606,30.939226519336966,34.530386740331515)"><g stroke-width="0.0"><path d="M 0.5,0.25 l -5.551115123125783e-17,-0.5 h -0.5 l -5.551115123125783e-17,0.5 h 0.5 Z" /></g><g><g><g fill-opacity="0.0" stroke-width="0.0"><path d="M 0.0,0.0 h -0.22399999999999948 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 1.0000000000005005e-3,0.0 l -0.22499999999999998,0.1299038105676658 v -0.2598076211353316 l 0.22499999999999998,0.1299038105676658 Z" /></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="0.0"><path d="M 100.0,100.0 l -1.1102230246251565e-14,-100.0 h -100.0 l -1.1102230246251565e-14,100.0 Z" /></g><g><g><g stroke-width="0.0"><path d="M 0.0,50.0 h -3.300000000000003 " /></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g><g stroke-width="0.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="M 0.19999999999999707,50.0 l -3.5,2.0207259421636903 v -4.041451884327381 Z" /></g></g></g><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><g fill="rgb(0,0,0)" fill-opacity="1.0"><path d="" /></g></g></g></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Curvature_diagramA.svg b/diagrams/src_Diagrams_TwoD_Curvature_diagramA.svg
--- a/diagrams/src_Diagrams_TwoD_Curvature_diagramA.svg
+++ b/diagrams/src_Diagrams_TwoD_Curvature_diagramA.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="200.0" font-size="1" viewBox="0 0 400 200"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(18.181818181818183,0.0,0.0,18.181818181818183,200.0,100.0)"><g fill-opacity="0.0" stroke-width="0.1"><path d="M -10.0,4.132231404958677 c 12.0,0.0 8.0,-10.0 20.0 -8.0" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="200.0" font-size="1" viewBox="0 0 400 200" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.0285189544531599" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="1.9284730395996748"><path d="M 18.18181818181816,175.13148009015777 c 218.1818181818182,0.0 145.45454545454547,-181.81818181818184 363.6363636363637 -145.45454545454547" /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Curvature_diagramNeg.svg b/diagrams/src_Diagrams_TwoD_Curvature_diagramNeg.svg
--- a/diagrams/src_Diagrams_TwoD_Curvature_diagramNeg.svg
+++ b/diagrams/src_Diagrams_TwoD_Curvature_diagramNeg.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="200.0" font-size="1" viewBox="0 0 400 200"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(18.181818181818183,0.0,0.0,18.181818181818183,200.0,100.0)"><g fill-opacity="0.0"><g stroke="rgb(255,0,0)" stroke-opacity="1.0" stroke-width="5.0e-2"><g><path d="M 4.464000000000002,-3.8037685950413227 l 2.077770135746605,7.445342986425346 " /><g><path d="M 14.271599430272687,3.6415743913840233 c 0.0,-4.269066838162075 -3.4607624563640047,-7.7298292945260805 -7.729829294526079 -7.7298292945260805c -4.269066838162075,-2.614049519350648e-16 -7.7298292945260805,3.4607624563640043 -7.7298292945260805 7.729829294526078c -5.228099038701296e-16,4.269066838162075 3.460762456364004,7.7298292945260805 7.729829294526077 7.7298292945260805c 4.269066838162075,7.842148558051945e-16 7.7298292945260805,-3.4607624563640034 7.729829294526082 -7.729829294526078Z" /></g></g></g><g fill-opacity="0.0" stroke-width="0.1"><path d="M -10.0,4.132231404958677 c 12.0,0.0 8.0,-10.0 20.0 -8.0" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="200.0" font-size="1" viewBox="0 0 400 200" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.0285189544531599" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><g><path d="M 281.16363636363644,30.840570999248655 l 37.77763883175646,135.36987248046086 " /><g><path d="M 459.483626004958,166.2104434797095 c 0.0,-77.61939705749228 -62.922953752072814,-140.5423508095651 -140.54235080956508 -140.5423508095651c -77.61939705749228,-4.75281730791027e-15 -140.5423508095651,62.92295375207281 -140.5423508095651 140.54235080956505c -9.50563461582054e-15,77.61939705749228 62.9229537520728,140.5423508095651 140.54235080956505 140.5423508095651c 77.61939705749228,1.425845192373081e-14 140.5423508095651,-62.92295375207279 140.54235080956516 -140.54235080956505Z" /></g></g></g><g stroke-width="1.9284730395996748"><path d="M 18.18181818181816,175.13148009015777 c 218.1818181818182,0.0 145.45454545454547,-181.81818181818184 363.6363636363637 -145.45454545454547" /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Curvature_diagramPos.svg b/diagrams/src_Diagrams_TwoD_Curvature_diagramPos.svg
--- a/diagrams/src_Diagrams_TwoD_Curvature_diagramPos.svg
+++ b/diagrams/src_Diagrams_TwoD_Curvature_diagramPos.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="200.0" font-size="1" viewBox="0 0 400 200"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(18.181818181818183,0.0,0.0,18.181818181818183,200.0,100.0)"><g fill-opacity="0.0"><g stroke="rgb(255,0,0)" stroke-opacity="1.0" stroke-width="5.0e-2"><g><path d="M -4.463999999999999,3.1082314049586772 l -3.900145794392522,-8.6003214953271 " /><g><path d="M 1.079194030081819,-5.492090090368422 c 0.0,-5.215412572526979 -4.227927251947359,-9.44333982447434 -9.443339824474338 -9.44333982447434c -5.215412572526979,-3.193519156589014e-16 -9.44333982447434,4.227927251947358 -9.44333982447434 9.443339824474336c -6.387038313178028e-16,5.215412572526979 4.227927251947357,9.44333982447434 9.443339824474336 9.44333982447434c 5.215412572526979,9.580557469767042e-16 9.44333982447434,-4.227927251947357 9.443339824474343 -9.443339824474336Z" /></g></g></g><g fill-opacity="0.0" stroke-width="0.1"><path d="M -10.0,4.132231404958677 c 12.0,0.0 8.0,-10.0 20.0 -8.0" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="200.0" font-size="1" viewBox="0 0 400 200" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.0285189544531599" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><g><path d="M 118.83636363636364,156.51329827197594 l -70.91174171622768,-156.36948173322 " /><g><path d="M 219.62170963785124,0.14381653875594225 c 0.0,-94.82568313685418 -76.87140458086108,-171.69708771771528 -171.69708771771525 -171.69708771771528c -94.82568313685418,-5.806398466525481e-15 -171.69708771771528,76.87140458086107 -171.69708771771528 171.69708771771522c -1.1612796933050962e-14,94.82568313685418 76.87140458086105,171.69708771771528 171.6970877177152 171.69708771771528c 94.82568313685418,1.741919539957644e-14 171.69708771771528,-76.87140458086105 171.6970877177153 -171.69708771771522Z" /></g></g></g><g stroke-width="1.9284730395996748"><path d="M 18.18181818181816,175.13148009015777 c 218.1818181818182,0.0 145.45454545454547,-181.81818181818184 363.6363636363637 -145.45454545454547" /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Curvature_diagramZero.svg b/diagrams/src_Diagrams_TwoD_Curvature_diagramZero.svg
--- a/diagrams/src_Diagrams_TwoD_Curvature_diagramZero.svg
+++ b/diagrams/src_Diagrams_TwoD_Curvature_diagramZero.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="200.0" font-size="1" viewBox="0 0 400 200"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(18.181818181818183,0.0,0.0,18.181818181818183,200.0,100.0)"><g fill-opacity="0.0"><g stroke="rgb(255,0,0)" stroke-opacity="1.0" stroke-width="5.0e-2"><g><path d="M -0.6039999999999992,6.1981404958677544e-2 l -33.11407551269532,-29.72616679687502 " /><g><path d="M 10.781216498483047,-29.66418539191634 c 0.0,-24.57628035604107 -19.923011655137294,-44.49929201117837 -44.49929201117836 -44.49929201117837c -24.57628035604107,-1.5048631536486836e-15 -44.49929201117837,19.92301165513729 -44.49929201117837 44.499292011178355c -3.0097263072973672e-15,24.57628035604107 19.923011655137287,44.49929201117837 44.49929201117835 44.49929201117837c 24.57628035604107,4.514589460946051e-15 44.49929201117837,-19.923011655137284 44.49929201117839 -44.499292011178355Z" /></g></g></g><g fill-opacity="0.0" stroke-width="0.1"><path d="M -10.0,4.132231404958677 c 12.0,0.0 8.0,-10.0 20.0 -8.0" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="200.0" font-size="1" viewBox="0 0 400 200" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.0285189544531599" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><g><path d="M 189.01818181818183,101.12693463561232 l -602.0741002308241,-540.4757599431822 " /><g><path d="M 396.0221181542372,-439.3488253075699 c 0.0,-446.8414610189286 -362.2365755479508,-809.0780365668795 -809.0780365668793 -809.0780365668795c -446.8414610189286,-2.7361148248157886e-14 -809.0780365668795,362.2365755479508 -809.0780365668795 809.0780365668793c -5.472229649631577e-14,446.8414610189286 362.23657554795074,809.0780365668795 809.0780365668792 809.0780365668795c 446.8414610189286,8.208344474447366e-14 809.0780365668795,-362.2365755479507 809.0780365668796 -809.0780365668793Z" /></g></g></g><g stroke-width="1.9284730395996748"><path d="M 18.18181818181816,175.13148009015777 c 218.1818181818182,0.0 145.45454545454547,-181.81818181818184 363.6363636363637 -145.45454545454547" /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Offset_cubicOffsetExample.svg b/diagrams/src_Diagrams_TwoD_Offset_cubicOffsetExample.svg
--- a/diagrams/src_Diagrams_TwoD_Offset_cubicOffsetExample.svg
+++ b/diagrams/src_Diagrams_TwoD_Offset_cubicOffsetExample.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600.0" height="302.85875688987323" font-size="1" viewBox="0 0 600 303"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(13.155574898915939,0.0,0.0,13.155574898915939,72.35566194403765,151.42937844493662)"><g fill-opacity="0.0"><g fill-opacity="0.0"><g fill-opacity="0.0"><g fill-opacity="0.0" stroke-width="0.1"><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 33.417476733497544,-1.6473872989404432 c 0.8062160672722944,1.9056016135526965 2.600074197059385,4.243483864433998 6.1181079451566704 6.588839696498854" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 32.86092310128323,-3.934973324746485 c 2.5438939233202618e-2,0.6274938344190009 0.18344919012734362,1.405702799055014 0.5565536322143174 2.287586025806042" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 33.000311673428904,-5.029283712603787 c -0.11129079091128213,0.22258158182256516 -0.16025559544153944,0.5795904798926212 -0.13938857214567424 1.094310387857302" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 32.97862528132407,-5.004468823346231 c 5.153156049894747e-3,-5.8414837533096176e-3 1.692390853525705e-2,-1.5289922118400412e-2 2.1686392104834695e-2 -2.4814889257555706e-2" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 32.70873785722833,-4.826371179429538 c 8.358937623750418e-2,-3.149744611848071e-2 0.18599518779940638,-8.299958544359143e-2 0.26988742409574185 -0.17809764391669347" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 32.05535699332027,-4.853120624705527 c 0.22391741974384205,0.10443579260780034 0.4091073150965916,0.11879455062523725 0.6533808639080556 2.6749445275989103e-2" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 31.72347357921467,-5.143549245977104 c 9.378804941573238e-2,0.1587182374727778 0.21780468092203975,0.23722193939149783 0.33188341410559863 0.29042862127157676" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 31.691808767395802,-5.205805672754547 c 5.879553721364061e-3,2.493597961259475e-2 2.2991427605793202e-2,4.75783919553141e-2 3.16648118188696e-2 6.225642677744325e-2" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 31.711972577462916,-5.04232626692882 c -3.953664939657209e-3,-6.508340746820274e-2 -9.44329551919676e-3,-0.11801225901966994 -2.0163810067113097e-2 -0.1634794058257274" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 31.661929314384686,-4.205360512837057 c 4.7781656372351655e-2,-0.35039881339724666 6.298412834573863e-2,-0.6239392027650261 5.004326307822682e-2 -0.8369657540917625" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 28.08645729142907,5.326289096396298 c 2.4270875082384364,-4.854175016476873 3.347932569058263,-7.86302694731943 3.5754720229556165 -9.531649609233355" /></g></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="0.1"><path d="M 28.980884482428987,5.773502691896256 c 10.0,-20.0 -5.0,-10.0 10.0 0.0" /></g></g></g><g fill-opacity="0.0"><g fill-opacity="0.0" stroke-width="0.1"><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 22.22681744227194,-4.975977707743981 c 0.0,1.1652184940288226 4.6232805071259264e-2,5.8820192426981635 4.707106781186548 10.542893218813452" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 22.22527234029002,-5.190961309967571 c 1.3596945248055547e-3,5.336801009862491e-2 1.5451019819199274e-3,0.12796315263602231 1.5451019819199274e-3 0.21498360222359025" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 22.219061458808028,-5.310773112363485 c 2.6673527761378324e-3,3.11932088542779e-2 5.02539135926483e-3,7.328131507884272e-2 6.210881481992558e-3 0.1198118023959136" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 22.17283082599389,-5.555708087831505 c 1.5097180450167613e-2,4.906583646304519e-2 3.7738468810918135e-2,0.14562383531926137 4.623063281413753e-2 0.2449349754680199" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 21.98765210484117,-5.902700770832826 c 5.9159862296237264e-2,7.248909052964869e-2 0.13843512625198873,0.19507599957394817 0.1851787211527185 0.34699268300132147" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 21.651201254320615,-6.170110768106992 c 0.11662169140991807,5.7260927430492714e-2 0.231782074850714,0.13915844190093196 0.33645085052055723 0.26740999727416614" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 21.098403476790917,-6.26695624580832 c 0.20191976907307563,-2.2211174598037786e-2 0.37056518594124643,7.369780030821005e-3 0.5527977775296966 9.684547770132745e-2" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 20.68717773824717,-6.127488517764908 c 0.1437020759541605,-8.692183392465402e-2 0.28088371953770785,-0.12513010595274743 0.41122573854374966 -0.139467728043412" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 20.48926554076378,-5.97114444896771 c 6.721861761310333e-2,-6.819078770254983e-2 0.1366654818483104,-0.1192974443172492 0.19791219748339017 -0.15634406879719798" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 20.34021917756031,-5.779740302591861 c 4.9921581199019904e-2,-8.181592474283761e-2 0.10709836789040317,-0.14884946518015596 0.14904636320346842 -0.19140414637584868" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 20.208899018783505,-5.493502020830686 c 4.542742635734065e-2,-0.12492542248268634 0.10576723145080269,-0.244359873088003 0.13132015877680647 -0.2862382817611753" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 19.662024018783505,-3.911470770830686 c 0.30680648873951233,-0.8437178440336588 0.4701733778151218,-1.3711017889915862 0.546875 -1.58203125" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 15.332390251272024,5.826808696756061 c 2.472343200154557,-4.944686400309114 3.7115479674728395,-8.03854351748049 4.329633767511479 -9.738279467586747" /></g></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="0.1"><path d="M 16.22681744227194,6.274022292256019 c 10.0,-20.0 0.0,-10.0 10.0 0.0" /></g></g></g><g fill-opacity="0.0"><g fill-opacity="0.0"><g fill-opacity="0.0" stroke-width="0.1"><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 13.009770219789226,-2.4104743608548738 c -0.2855399505357896,9.691052866669203e-2 -0.6461909532308479,0.16047436085487377 -1.0892105128500127 0.16047436085487377" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 13.893839526646092,-2.982120392131481 c -0.20403353302645844,0.23318118060166704 -0.4832891526977514,0.4356236759256369 -0.8840693068568655 0.5716460312766074" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 14.185013884508258,-4.851123441588392 c 0.2650946123717697,0.7069189663247197 0.17274121378843077,1.3388138247133696 -0.2911743578621664 1.8690030494569108" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 11.295559706939214,-6.75 c 1.352827876148151,0.0 2.551247208532007,0.9969913076461747 2.8894541775690445 1.898876558411608" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 9.203810396758112,-5.989978417355905 c 0.7131947941382997,-0.5593684659908238 1.4205071509921137,-0.7600215826440948 2.0917493101811013 -0.7600215826440948" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 7.49586988404493,-3.666654710493214 c 0.5144343791036887,-1.1224022816807757 1.1116643005702709,-1.8556560894957013 1.707940512713183 -2.3233237068626913" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 5.920559706939214,6.75 c 0.0,-5.2028660713222505 0.6810675710972038,-8.46557993374737 1.5753101771057156 -10.416654710493214" /></g></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="0.1"><path d="M 6.920559706939214,6.75 c 0.0,-20.0 10.0,-10.0 5.0 -10.0" /></g></g></g><g fill-opacity="0.0"><g fill-opacity="0.0" stroke-width="0.1"><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 2.660826934705069,-8.569475230141833 c 0.4889565094920343,-0.9250528557957409 1.1220197779275782,-1.556458070895495 1.9677823889408277 -1.8947631153007976" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 1.7534960535105757,-5.761630493146541 c 0.21565993096084224,-1.0869260520426458 0.5083600089169344,-2.0530349786323434 0.9073308811944933 -2.8078447369952926" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 0.8835457044574557,1.0837838328712444 c 0.31486663625486244,-2.3929864355369546 0.4763670537345419,-4.86175451761215 0.86995034905312 -6.845414326017785" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -0.7828015282143159,7.11175903331599 c 0.9591837382060433,-1.6232340185025347 1.3712137747622197,-3.7849609203321535 1.6663472326717716 -6.027975200444746" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -5.0,9.46423834544263 c 2.0016683287913244,0.0 3.404020713214209,-0.9763323360826055 4.217198471785684 -2.3524793121266407" /></g></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="0.1"><path d="M -5.0,10.46423834544263 c 10.0,0.0 5.0,-18.0 10.0 -20.0" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600.0" height="302.85875688987323" font-size="1" viewBox="0 0 600 303" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.7051228888683605" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><g><g stroke-width="3.1971054166281756"><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 511.9817800443453,129.7570514462028 c 10.606235857710121,25.069284754587564 34.20547084215346,55.8254698109027 80.48722731216127 86.67997412424124" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 504.6599970504862,99.66254214599796 c 0.33466387043136825,8.255042137307122 2.4133795608657396,18.492828458584018 7.321782993859167 30.094509300204834" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 506.49373385140154,85.26625987587948 c -1.4640943353929654,2.9281886707859424 -2.1082544888015438,7.624845968926011 -1.8337368009153654 14.396282270118487" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 506.20843689577913,85.59271401011557 c 6.779273038019215e-2,-7.684807703746527e-2 0.22264374631797684,-0.20114771562720807 0.2852969556224121 -0.3264541342360786" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 502.6579126738121,87.93569090398208 c 1.0996662998461504,-0.4143670115362421 2.4468736239330267,-1.09190726288214 3.550524221967022 -2.3429768938665214" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 494.06231178115127,87.58378657314935 c 2.9457623866121128,1.3739128917795689 5.382041925447614,1.56281060833337 8.595600892660828 0.35190433083272776" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 489.69619466917715,83.76303109322222 c 1.2338357087118965,2.0880296608970546 2.8653457932043813,3.120790991330947 4.3661171119741375 3.820755479927119" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 489.27962586563393,82.94401200781272 c 7.734890935360485e-2,0.32804714747133107 0.30246544790101604,0.6259210989381142 0.4165688035432176 0.8190190854095305" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 489.54489237921933,85.09467757558335 c -5.201273523887837e-2,-0.8562096416246061 -0.12423198149539025,-1.552519112523536 -0.2652665135854216 -2.1506655677706314" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 488.88654448360757,96.10544324136518 c 0.6285951592007363,-4.609697834138748 0.828592417895299,-8.2082789143452 0.6583478956117675 -11.010765665781841" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 441.84915448663645,221.4997735858574 c 31.929731500854007,-63.859463001708015 44.04397766876603,-103.4426399376551 47.0373899969711 -125.39433034449225" /></g></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" stroke-width="3.1971054166281756"><path d="M 453.61585838946286,227.38312553727062 c 131.55574898915938,-263.11149797831877 -65.77787449457969,-131.55574898915938 131.55574898915938 0.0" /></g></g></g><g><g stroke-width="3.1971054166281756"><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 364.7622235703774,85.96753101537462 c 0.0,15.32911917179821 0.6082191299019319,77.38134470418049 61.92469581709475 138.6978213913733" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 364.7418968655278,83.13929813428342 c 1.788756316072539e-2,0.7020868540585622 2.0326704849611067e-2,1.6834288388046041 2.0326704849611067e-2 2.8282328810911928" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 364.66018914900314,81.56310499408985 c 3.509055922831261e-2,0.4103645954199807 6.611191242317345e-2,0.9640578292107734 8.170771652464312e-2 1.5761931401935576" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 364.0519985963925,78.3408445789562 c 0.1986120881746295,0.6454892865675517 0.49647125301243666,1.9157652726099432 0.6081905526106672 3.222260415133674" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 361.61586606058245,73.77595634835652 c 0.7782819994477024,0.9536356598170914 1.821193672048922,2.5663369233759687 2.4361325358100574 4.56488823059968" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 357.18966169675525,70.25802410049732 c 1.5342253961814387,0.7533004195932371 3.0492264459247083,1.8307093052441525 4.4262043638271615 3.5179322478592" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 349.91728913050906,68.98396616497621 c 2.6563706456126566,-0.29220077101738523 4.874998058580779,9.695369318400074e-2 7.272372566246194 1.2740579355211068" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 344.50737812673475,70.81874430723295 c 1.8904834233446657,-1.1435066965469183 3.695186810264414,-1.646158480970656 5.409911003774321 -1.8347781422567455" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 341.90372938933297,72.87554041429576 c 0.8842995586107709,-0.8970890150369701 1.797912982551884,-1.5694264639648254 2.603648737401782 -2.0567961070628042" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 339.9429387947987,75.39357199790629 c 0.6567471005360201,-1.07633552587847 1.4089406003338527,-1.9582002878411218 1.9607905945342574 -2.518031583610547" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 338.2153466102729,79.15920115255244 c 0.597623909908983,-1.6434657522496974 1.3914287352020123,-3.2146946126988167 1.7275921845258109 -3.7656291546461453" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 331.02089158742825,99.97173175435304 c 4.036215742086064,-11.099593290736674 6.185401087323137,-18.037632279116448 7.194455022844654 -20.812530601800606" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 274.0620702740554,228.08439667676572 c 32.5250961454588,-65.0501922909176 48.82754727700816,-105.75166132240976 56.95882131337286 -128.11266492241268" /></g></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" stroke-width="3.1971054166281756"><path d="M 285.8287741768818,233.96774862817892 c 131.55574898915938,-263.11149797831877 0.0,-131.55574898915938 131.55574898915938 0.0" /></g></g></g><g><g><g stroke-width="3.1971054166281756"><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 243.50666848816087,119.71820244879379 c -3.7564422059063327,1.274913718368207 -8.501013484230306,2.111132473581956 -14.329190482484984 2.111132473581956" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 255.13710847034906,112.19787026866632 c -2.6841784256200127,3.067632486422875 -6.357946646148891,5.7308798963808005 -11.630439982188191 7.520332180127452" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 258.96767454384855,87.61006066523365 c 3.4874720283559038,9.299925408949084 2.272509976123352,17.612865546720847 -3.830566073499483 24.58780960343268" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 220.95524369385342,62.629247877254016 c 17.797228450008376,0.0 33.56312373749303,13.115993821307395 38.01243084999512 24.980812787979637" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 193.4370789740102,72.62776873252105 c 9.382487531803335,-7.358813750433995 18.687588219322443,-9.998520855267019 27.518164719843227 -9.998520855267019" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 170.96813963611902,103.1924277725802 c 6.767680004875894,-14.76584728336559 14.6245829686032,-24.412222671990158 22.468939337891168 -30.564659040059155" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 150.24402861218024,240.2295090126192 c 0.0,-68.44669429030839 8.959835442792022,-111.36957088117335 20.724111023938775 -137.037081240039" /></g></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" stroke-width="3.1971054166281756"><path d="M 163.3996035110962,240.2295090126192 c 0.0,-263.11149797831877 131.55574898915938,-131.55574898915938 65.77787449457969 -131.55574898915938" /></g></g></g><g><g stroke-width="3.1971054166281756"><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 107.3603699766031,38.693005210400855 c 6.432503982934959,-12.169602129876955 14.760815226591284,-20.476100728687896 25.887308602478793 -24.92669807904294" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 95.42391061094953,75.63181695246936 c 2.8371303744504006,-14.299137087230031 6.687768172920306,-27.008855431492076 11.936459365653556 -36.938811742068495" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 83.97921363564316,165.6871778325085 c 4.142251616420563,-31.481112284796282 6.26688245478068,-63.95917569658957 11.444696975306384 -90.05536088003915" /></g><g stroke="rgb(255,0,0)" stroke-opacity="1.0"><path d="M 62.05745780862836,244.98865707076718 c 12.61861350979178,-21.354576708878394 18.039105516309633,-49.793336876899446 21.921755827014795 -79.30147923825866" /></g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 6.577787449457958,275.93687485959947 c 26.333097622202164,0.0 44.78184945015078,-12.844213173568285 55.4796703591704 -30.94821778883227" /></g></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" stroke-width="3.1971054166281756"><path d="M 6.577787449457958,289.0924497585154 c 131.55574898915938,0.0 65.77787449457969,-236.8003481804869 131.55574898915938 -263.11149797831877" /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Offset_expandLoopExample.svg b/diagrams/src_Diagrams_TwoD_Offset_expandLoopExample.svg
--- a/diagrams/src_Diagrams_TwoD_Offset_expandLoopExample.svg
+++ b/diagrams/src_Diagrams_TwoD_Offset_expandLoopExample.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="300.0" font-size="1" viewBox="0 0 300 300"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(22.727272727272723,0.0,0.0,22.727272727272723,150.0,150.00000000000003)"><g><g fill="rgb(0,128,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M -5.000000000000001,5.999999999999998 h 5.0 c 0.2652164898395441,-1.2726212873067038e-16 0.5195704027385128,-0.10535684036541806 0.7071067811865477 -0.2928932188134526l 5.0,-5.0 c 0.1875363784480345,-0.1875363784480347 0.29289321881345226,-0.44189029134700364 0.2928932188134524 -0.7071067811865477v -5.0 c 0.0,-0.5522847498307935 -0.44771525016920644,-1.0 -0.9999999999999998 -1.0c -0.26521648983954393,9.478247619436096e-17 -0.5195704027385128,0.10535684036541801 -0.7071067811865476 0.2928932188134525l -10.0,10.0 c -0.39052429175127,0.39052429175126996 -0.3905242917512702,1.023689270621825 -2.220446049250313e-16 1.414213562373095c 0.18753637844803464,0.18753637844803456 0.4418902913470036,0.2928932188134523 0.7071067811865476 0.2928932188134526l 3.3306690738754696e-16,1.7763568394002505e-15 ZM -5.000000000000001,3.9999999999999982 l 2.6645352591003757e-15,7.771561172376096e-16 c -0.5522847498307935,0.0 -1.0,0.44771525016920644 -1.0 0.9999999999999997c -1.1102230246251565e-16,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999996 1.0c 0.26521648983954393,-5.551115123125783e-17 0.5195704027385128,-0.10535684036541795 0.7071067811865476 -0.29289321881345237l 10.0,-10.0 c 0.39052429175126996,-0.3905242917512699 0.39052429175127,-1.023689270621825 0.0 -1.414213562373095c -0.3905242917512699,-0.39052429175126996 -1.023689270621825,-0.39052429175127 -1.414213562373095 -1.1102230246251565e-16c -0.18753637844803453,0.18753637844803472 -0.2928932188134523,0.4418902913470036 -0.2928932188134525 0.7071067811865476v 5.0 c -1.1102230246251565e-16,0.5522847498307935 0.4477152501692063,1.0 0.9999999999999997 1.0000000000000002c 0.5522847498307935,1.1102230246251565e-16 1.0,-0.4477152501692063 1.0000000000000002 -0.9999999999999996c 1.1102230246251565e-16,-0.5522847498307935 -0.4477152501692062,-1.0 -0.9999999999999994 -1.0000000000000002c -0.26521648983954393,5.551115123125783e-17 -0.5195704027385128,0.10535684036541787 -0.7071067811865476 0.29289321881345226l -5.0,5.0 c -0.39052429175126985,0.3905242917512701 -0.3905242917512697,1.023689270621825 4.440892098500626e-16 1.414213562373095c 0.3905242917512701,0.39052429175126985 1.023689270621825,0.39052429175126974 1.414213562373095 -3.3306690738754696e-16c 0.3905242917512699,-0.3905242917512701 0.39052429175126974,-1.023689270621825 -2.220446049250313e-16 -1.4142135623730947c -0.18753637844803472,-0.18753637844803447 -0.44189029134700375,-0.2928932188134522 -0.7071067811865476 -0.2928932188134523l -5.000000000000001,-2.886579864025407e-15 Z" /></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" stroke-width="0.2"><path d="M -5.000000000000001,4.999999999999998 h 5.0 l 5.0,-5.0 v -5.0 l -10.0,10.0 Z" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="300.00000000000006" font-size="1" viewBox="0 0 300 300" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g fill="rgb(0,128,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><path d="M 36.363636363636374,286.3636363636364 h 113.63636363636363 c 6.027647496353275,-2.892321107515236e-15 11.80841824405711,-2.3944736446685924 16.070608663330628 -6.656664063942104l 113.63636363636363,-113.63636363636363 c 4.262190419273511,-4.262190419273516 6.656664063942097,-10.042961166977355 6.656664063942101 -16.070608663330628v -113.63636363636363 c 0.0,-12.551926132518032 -10.175346594754691,-22.727272727272727 -22.727272727272723 -22.727272727272727c -6.027647496353271,2.1541471862354763e-15 -11.80841824405711,2.394473644668591 -16.070608663330628 6.6566640639421015l -227.27272727272725,227.27272727272725 c -8.875552085256137,8.875552085256135 -8.87555208525614,23.265665241405113 -5.0464682937507114e-15 32.14121732666125c 4.262190419273514,4.262190419273512 10.042961166977355,6.656664063942098 16.07060866333063 6.656664063942117ZM 36.363636363636374,240.9090909090909 c -12.551926132518032,3.7848512203130333e-14 -22.727272727272727,10.17534659475473 -22.727272727272727 22.72727272727276c -2.5232341468753557e-15,12.551926132518032 10.17534659475469,22.727272727272727 22.727272727272716 22.727272727272727c 6.027647496353271,-1.2616170734376779e-15 11.80841824405711,-2.3944736446685897 16.070608663330628 -6.656664063942099l 227.27272727272725,-227.27272727272725 c 8.875552085256135,-8.875552085256134 8.875552085256137,-23.265665241405113 0.0 -32.14121732666125c -8.875552085256134,-8.875552085256135 -23.265665241405113,-8.875552085256137 -32.14121732666125 -2.5232341468753557e-15c -4.262190419273512,4.262190419273517 -6.656664063942098,10.042961166977355 -6.6566640639421015 16.070608663330628v 113.63636363636363 c -2.5232341468753557e-15,12.551926132518032 10.17534659475469,22.727272727272727 22.72727272727272 22.72727272727273c 12.551926132518032,2.5232341468753557e-15 22.727272727272727,-10.17534659475469 22.72727272727273 -22.727272727272716c 2.5232341468753557e-15,-12.551926132518032 -10.175346594754686,-22.727272727272727 -22.727272727272712 -22.72727272727273c -6.027647496353266,1.2616170734376779e-15 -11.808418244057094,2.3944736446685777 -16.07060866333061 6.656664063942079l -113.63636363636363,113.63636363636363 c -8.875552085256132,8.875552085256139 -8.875552085256128,23.265665241405113 1.0092936587501423e-14 32.14121732666125c 8.875552085256139,8.875552085256132 23.265665241405113,8.87555208525613 32.14121732666125 -7.569702440626068e-15c 8.875552085256134,-8.875552085256139 8.87555208525613,-23.265665241405113 -5.0464682937507114e-15 -32.14121732666124c -4.262190419273514,-4.262190419273507 -10.042961166977339,-6.656664063942092 -16.070608663330603 -6.656664063942101Z" /></g></g></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" stroke-width="3.0"><path d="M 36.363636363636374,263.6363636363636 h 113.63636363636363 l 113.63636363636363,-113.63636363636363 v -113.63636363636363 Z" /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Offset_expandTrailExample.svg b/diagrams/src_Diagrams_TwoD_Offset_expandTrailExample.svg
--- a/diagrams/src_Diagrams_TwoD_Offset_expandTrailExample.svg
+++ b/diagrams/src_Diagrams_TwoD_Offset_expandTrailExample.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600.0" height="197.3830287816636" font-size="1" viewBox="0 0 600 197"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(12.98696646675048,0.0,0.0,12.98696646675048,300.0,98.6915143908318)"><g fill-opacity="0.0"><g fill-opacity="0.0"><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><text transform="matrix(1.0,0.0,0.0,1.0,14.00005014902262,5.408430753773163)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineCapSquare</text></g></g><g fill-opacity="0.0"><g fill="rgb(0,128,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M 9.000025074511312,-9.161939524945151e-2 h -2.0 v 4.0 h 2.0 h 10.0 c 1.104569499661587,-6.763537510981779e-17 2.0,-0.895430500338413 1.9999999999999998 -1.9999999999999998c 0.0,-0.4678730100377969 -0.16403243875498852,-0.9209387968686479 -0.4635574408052485 -1.28036879932896l -5.0,-6.0 l -1.2803687993289596,-1.536442559194752 l -3.072885118389502,2.5607375986579175 l 1.2803687993289596,1.536442559194752 l 5.0,6.0 c 0.7071281620285479,0.8485537944342576 1.9682575640894535,0.9632019218943404 2.8168113585237107 0.2560737598657927c 0.8485537944342576,-0.7071281620285479 0.9632019218943405,-1.9682575640894533 0.25607375986579295 -2.8168113585237107c -0.37998765062862305,-0.4559851807543475 -0.9428828741606051,-0.7196312006710406 -1.5364425591947515 -0.7196312006710406l -10.000000000000002,8.881784197001252e-16 Z" /></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="0.2"><path d="M 9.000025074511312,1.9083806047505485 h 10.0 l -5.0,-6.0 " /></g></g></g><g fill-opacity="0.0"><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><text transform="matrix(1.0,0.0,0.0,1.0,-0.9999999999999947,5.000050149022616)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineCapRound</text></g></g><g fill-opacity="0.0"><g fill="rgb(0,128,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M -6.000025074511304,-0.4999999999999991 c -1.104569499661587,-6.763537510981779e-17 -2.0,0.8954305003384128 -2.0 1.9999999999999993c -1.3527075021963558e-16,1.104569499661587 0.8954305003384126,2.0 1.9999999999999991 2.0h 10.0 c 1.104569499661587,-6.763537510981779e-17 2.0,-0.895430500338413 1.9999999999999998 -1.9999999999999998c 0.0,-0.4678730100377969 -0.16403243875498852,-0.9209387968686479 -0.4635574408052485 -1.28036879932896l -5.0,-6.0 c -0.7071281620285479,-0.8485537944342575 -1.9682575640894537,-0.9632019218943401 -2.8168113585237107 -0.2560737598657923c -0.848553794434257,0.7071281620285474 -0.9632019218943398,1.9682575640894528 -0.2560737598657927 2.8168113585237107l 5.0,6.0 c 0.7071281620285479,0.8485537944342576 1.9682575640894535,0.9632019218943404 2.8168113585237107 0.2560737598657927c 0.8485537944342576,-0.7071281620285479 0.9632019218943405,-1.9682575640894533 0.25607375986579295 -2.8168113585237107c -0.37998765062862305,-0.4559851807543475 -0.9428828741606051,-0.7196312006710406 -1.5364425591947515 -0.7196312006710406h -10.000000000000004 Z" /></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="0.2"><path d="M -6.000025074511304,1.5000000000000009 h 10.0 l -5.0,-6.0 " /></g></g></g><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><text transform="matrix(1.0,0.0,0.0,1.0,-15.000050149022613,4.640209474175787)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineCapButt</text></g></g><g fill-opacity="0.0"><g fill="rgb(0,128,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M -21.000075223533923,-0.8598406748468275 v 4.0 h 10.0 c 1.104569499661587,-6.763537510981779e-17 2.0,-0.895430500338413 1.9999999999999998 -1.9999999999999998c 0.0,-0.4678730100377969 -0.16403243875498852,-0.9209387968686479 -0.4635574408052485 -1.28036879932896l -5.0,-6.0 l -3.072885118389502,2.5607375986579175 l 5.0,6.0 c 0.7071281620285479,0.8485537944342576 1.9682575640894535,0.9632019218943404 2.8168113585237107 0.2560737598657927c 0.8485537944342576,-0.7071281620285479 0.9632019218943405,-1.9682575640894533 0.25607375986579295 -2.8168113585237107c -0.37998765062862305,-0.4559851807543475 -0.9428828741606051,-0.7196312006710406 -1.5364425591947515 -0.7196312006710406l -10.000000000000002,8.881784197001252e-16 Z" /></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="0.2"><path d="M -21.000075223533923,1.1401593251531725 h 10.0 l -5.0,-6.0 " /></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600.0" height="197.3830287816636" font-size="1" viewBox="0 0 600 197" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.376545341172593" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><g fill="rgb(0,0,0)" fill-opacity="1.0"><text transform="matrix(12.98696646675048,0.0,0.0,12.98696646675048,481.81818181818187,168.9306232278259)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineCapSquare</text></g></g></g><g><g fill="rgb(0,128,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><path d="M 416.8830238425919,97.50165637702322 h -25.97393293350096 v 51.94786586700192 h 25.97393293350096 h 129.86966466750482 c 14.345007052300385,-8.783783485172937e-16 25.97393293350096,-11.628925881200574 25.973932933500958 -25.973932933500958c 0.0,-6.076251092058475 -2.130283781570332,-11.960201272862653 -6.020204939150425 -16.62810666195877l -64.93483233375241,-77.92179880050288 l -16.628106661958775,-19.953727994350533 l -39.907455988701045,33.25621332391753 l 16.628106661958775,19.953727994350533 l 64.93483233375241,77.92179880050288 c 9.183449727959651,11.020139673551585 25.561694982757718,12.509071060351415 36.5818346563093 3.325621332391765c 11.020139673551585,-9.183449727959651 12.509071060351415,-25.561694982757714 3.3256213323917683 -36.5818346563093c -4.934886876493225,-5.921864251791868 -12.245188268797092,-9.34582627154219 -19.95372799435053 -9.34582627154219Z" /></g></g></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" stroke-width="3.4413633529314827"><path d="M 416.8830238425919,123.47558931052419 h 129.86966466750482 l -64.93483233375241,-77.92179880050288 " /></g></g></g><g><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><g fill="rgb(0,0,0)" fill-opacity="1.0"><text transform="matrix(12.98696646675048,0.0,0.0,12.98696646675048,287.0130335332496,163.62699800825925)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineCapRound</text></g></g></g><g><g fill="rgb(0,128,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><path d="M 222.07787555765964,92.19803115745658 c -14.345007052300385,-8.783783485172937e-16 -25.97393293350096,11.628925881200571 -25.97393293350096 25.973932933500954c -1.7567566970345874e-15,14.345007052300385 11.628925881200571,25.97393293350096 25.97393293350095 25.97393293350096h 129.86966466750482 c 14.345007052300385,-8.783783485172937e-16 25.97393293350096,-11.628925881200574 25.973932933500958 -25.973932933500958c 0.0,-6.076251092058475 -2.130283781570332,-11.960201272862653 -6.020204939150425 -16.62810666195877l -64.93483233375241,-77.92179880050288 c -9.183449727959651,-11.020139673551583 -25.56169498275772,-12.50907106035141 -36.5818346563093 -3.3256213323917594c -11.020139673551583,9.183449727959651 -12.509071060351411,25.56169498275772 -3.3256213323917625 36.5818346563093l 64.93483233375241,77.92179880050288 c 9.183449727959651,11.020139673551585 25.561694982757718,12.509071060351415 36.5818346563093 3.325621332391765c 11.020139673551585,-9.183449727959651 12.509071060351415,-25.561694982757714 3.3256213323917683 -36.5818346563093c -4.934886876493225,-5.921864251791868 -12.245188268797092,-9.34582627154219 -19.95372799435053 -9.34582627154219Z" /></g></g></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" stroke-width="3.4413633529314827"><path d="M 222.07787555765964,118.17196409095754 h 129.86966466750482 l -64.93483233375241,-77.92179880050288 " /></g></g></g><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><g fill="rgb(0,0,0)" fill-opacity="1.0"><text transform="matrix(12.98696646675048,0.0,0.0,12.98696646675048,105.19485171506778,158.95375923065063)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineCapButt</text></g></g></g><g><g fill="rgb(0,128,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><g fill="rgb(0,128,0)" fill-opacity="1.0"><path d="M 27.272727272727366,87.52479237984795 v 51.94786586700192 h 129.86966466750482 c 14.345007052300385,-8.783783485172937e-16 25.97393293350096,-11.628925881200574 25.973932933500958 -25.973932933500958c 0.0,-6.076251092058475 -2.130283781570332,-11.960201272862653 -6.020204939150425 -16.62810666195877l -64.93483233375241,-77.92179880050288 l -39.907455988701045,33.25621332391753 l 64.93483233375241,77.92179880050288 c 9.183449727959651,11.020139673551585 25.561694982757718,12.509071060351415 36.5818346563093 3.325621332391765c 11.020139673551585,-9.183449727959651 12.509071060351415,-25.561694982757714 3.3256213323917683 -36.5818346563093c -4.934886876493225,-5.921864251791868 -12.245188268797092,-9.34582627154219 -19.95372799435053 -9.34582627154219Z" /></g></g></g><g stroke="rgb(255,255,255)" stroke-opacity="1.0" stroke-width="3.4413633529314827"><path d="M 27.272727272727366,113.49872531334891 h 129.86966466750482 l -64.93483233375241,-77.92179880050288 " /></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Offset_offsetTrailExample.svg b/diagrams/src_Diagrams_TwoD_Offset_offsetTrailExample.svg
--- a/diagrams/src_Diagrams_TwoD_Offset_offsetTrailExample.svg
+++ b/diagrams/src_Diagrams_TwoD_Offset_offsetTrailExample.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600.0" height="185.1008379753402" font-size="1" viewBox="0 0 600 185"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(13.702641330909062,0.0,0.0,13.702641330909062,300.0,92.5504189876701)"><g fill-opacity="0.0" stroke-width="0.2"><g fill-opacity="0.0"><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><text transform="matrix(1.0,0.0,0.0,1.0,14.135041612651108,4.64018439966448)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineJoinBevel</text></g></g><g fill-opacity="0.0"><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 8.366820333053731,3.14018439966448 h 10.0 l 1.536442559194752,-3.2803687993289596 l -5.0,-6.0 " /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M 8.366820333053731,1.1401843996644798 h 10.0 l -5.0,-6.0 " /></g></g></g><g fill-opacity="0.0"><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><text transform="matrix(1.0,0.0,0.0,1.0,1.366820333053731,4.64018439966448)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineJoinRound</text></g></g><g fill-opacity="0.0"><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -4.633179666946269,3.14018439966448 h 10.0 c 1.104569499661587,-6.763537510981779e-17 2.0,-0.895430500338413 1.9999999999999998 -1.9999999999999998c 0.0,-0.4678730100377969 -0.16403243875498852,-0.9209387968686479 -0.4635574408052485 -1.28036879932896l -5.0,-6.0 " /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -4.633179666946269,1.1401843996644798 h 10.0 l -5.0,-6.0 " /></g></g></g><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><text transform="matrix(1.0,0.0,0.0,1.0,-12.768221279597377,4.64018439966448)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineJoinMiter</text></g></g><g fill-opacity="0.0"><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -19.903262892248485,3.14018439966448 h 10.0 h 4.270083225302217 l -2.7336406661074655,-3.2803687993289596 l -5.0,-6.0 " /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -19.903262892248485,1.1401843996644798 h 10.0 l -5.0,-6.0 " /></g></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600.0" height="185.1008379753402" font-size="1" viewBox="0 0 600 185" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.333029648793779" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="3.0"><g><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><g fill="rgb(0,0,0)" fill-opacity="1.0"><text transform="matrix(13.702641330909062,0.0,0.0,13.702641330909062,493.6874054156325,156.13320152555207)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineJoinBevel</text></g></g></g><g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 414.64753810399236,135.57923952918844 h 137.02641330909063 l 21.0533213141897,-44.949717090309534 l -68.51320665454531,-82.21584798545437 " /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0"><path d="M 414.64753810399236,108.17395686737032 h 137.02641330909063 l -68.51320665454531,-82.21584798545437 " /></g></g></g><g><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><g fill="rgb(0,0,0)" fill-opacity="1.0"><text transform="matrix(13.702641330909062,0.0,0.0,13.702641330909062,318.7290487876289,156.13320152555207)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineJoinRound</text></g></g></g><g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 236.51320080217454,135.57923952918844 h 137.02641330909063 c 15.135519678924403,-9.267832864113272e-16 27.405282661818124,-12.269762982893718 27.40528266181812 -27.40528266181812c 0.0,-6.411096044960741 -2.247677674893909,-12.619294021209988 -6.3519613476284205 -17.54443442849141l -68.51320665454531,-82.21584798545437 " /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0"><path d="M 236.51320080217454,108.17395686737032 h 137.02641330909063 l -68.51320665454531,-82.21584798545437 " /></g></g></g><g><g fill="rgb(0,0,0)" fill-opacity="1.0" font-weight="bold" font-family="Helvetica"><g fill="rgb(0,0,0)" fill-opacity="1.0"><text transform="matrix(13.702641330909062,0.0,0.0,13.702641330909062,125.0416433719964,156.13320152555207)" dominant-baseline="middle" text-anchor="middle" stroke="none">LineJoinMiter</text></g></g></g><g><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 27.27272727272728,135.57923952918844 h 137.02641330909063 h 58.51141888944763 l -37.45809757525794,-44.949717090309534 l -68.51320665454531,-82.21584798545437 " /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0"><path d="M 27.27272727272728,108.17395686737032 h 137.02641330909063 l -68.51320665454531,-82.21584798545437 " /></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Offset_offsetTrailLeftExample.svg b/diagrams/src_Diagrams_TwoD_Offset_offsetTrailLeftExample.svg
--- a/diagrams/src_Diagrams_TwoD_Offset_offsetTrailLeftExample.svg
+++ b/diagrams/src_Diagrams_TwoD_Offset_offsetTrailLeftExample.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200.0" height="154.67216693398285" font-size="1" viewBox="0 0 200 155"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(15.151451832306767,0.0,0.0,15.151451832306767,100.0,77.33608346699143)"><g fill-opacity="0.0" stroke-width="0.2"><g stroke="rgb(0,128,0)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -6.000025074511308,-4.64018439966448 h 10.0 c 0.4678730100377967,1.6653345369377348e-16 0.9209387968686479,0.16403243875498819 1.28036879932896 0.46355744080524836c 0.8485537944342573,0.7071281620285479 0.9632019218943395,1.9682575640894537 0.2560737598657916 2.816811358523711l -5.0,6.0 " /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0" fill-opacity="0.0"><path d="M -6.000025074511308,-2.64018439966448 h 10.0 l -5.0,6.0 " /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200.0" height="154.67216693398285" font-size="1" viewBox="0 0 200 155" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.7035274935556856" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="3.0"><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 9.090909090909093,7.030553042453764 h 151.51451832306768 c 7.088955375224059,5.0464472042177966e-15 13.953559821257857,2.4853295947320184 19.399446190621173 7.023568235868117c 12.856821943491788,10.714018286243158 14.59390752436739,29.82195967587481 3.8798892381242314 42.678781619366596l -75.75725916153384,90.9087109938406 " /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0"><path d="M 9.090909090909093,37.3334567070673 h 151.51451832306768 l -75.75725916153384,90.9087109938406 " /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Offset_offsetTrailOuterExample.svg b/diagrams/src_Diagrams_TwoD_Offset_offsetTrailOuterExample.svg
--- a/diagrams/src_Diagrams_TwoD_Offset_offsetTrailOuterExample.svg
+++ b/diagrams/src_Diagrams_TwoD_Offset_offsetTrailOuterExample.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="271.2911579538083" font-size="1" viewBox="0 0 300 271"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(19.48051948051948,0.0,0.0,19.48051948051948,150.0,135.64557897690415)"><g stroke-width="0.2"><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 4.232050807568877,5.330127018922195 l 2.500000000000001,-4.330127018922193 c 0.35726558990816415,-0.6188021535170062 0.35726558990816465,-1.3811978464829942 1.1102230246251565e-15 -2.0000000000000004l -2.4999999999999982,-4.330127018922194 c -0.35726558990816315,-0.6188021535170058 -1.0175196277525493,-0.9999999999999999 -1.7320508075688763 -1.0000000000000004l -5.0,-2.220446049250313e-15 c -0.714531179816327,-3.61068003170518e-16 -1.3747852176607136,0.381197846482993 -1.7320508075688776 0.9999999999999987l -2.5000000000000013,4.330127018922193 c -0.35726558990816415,0.6188021535170058 -0.357265589908165,1.381197846482994 -1.4432899320127035e-15 2.0l 2.4999999999999964,4.3301270189221945 c 0.35726558990816343,0.6188021535170066 1.0175196277525498,1.0000000000000009 1.7320508075688772 1.000000000000001h 5.000000000000002 c 0.714531179816327,2.735631709452133e-16 1.3747852176607136,-0.3811978464829932 1.7320508075688776 -0.9999999999999989l 8.881784197001252e-16,6.661338147750939e-16 Z" /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0"><path d="M 2.4999999999999996,4.3301270189221945 l 2.500000000000001,-4.330127018922193 l -2.4999999999999982,-4.330127018922194 l -5.0,-2.220446049250313e-15 l -2.5000000000000013,4.330127018922193 l 2.4999999999999964,4.3301270189221945 h 5.000000000000002 Z" /></g></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="271.2911579538083" font-size="1" viewBox="0 0 300 271" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="1.141138711190835" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g stroke-width="3.0"><g stroke="rgb(0,128,0)" stroke-opacity="1.0"><path d="M 232.44254819939368,239.47922220266122 l 48.701298701298725,-84.35312374523753 c 6.959719283925273,-12.05458740617544 6.959719283925287,-26.906451554863526 1.9464949133038462e-14 -38.961038961038966l -48.701298701298676,-84.35312374523755 c -6.959719283925259,-12.054587406175445 -19.82181093024447,-19.480519480519487 -33.741249498095 -19.4805194805195l -97.40259740259742,-4.325544251786325e-14 c -13.919438567850523,-7.0337922695555446e-15 -26.781530214169745,7.42593207434402 -33.741249498095016 19.480519480519458l -48.70129870129873,84.35312374523753 c -6.959719283925277,12.05458740617544 -6.959719283925293,26.906451554863523 -2.811603763661111e-14 38.961038961038966l 48.70129870129864,84.35312374523757 c 6.9597192839252635,12.054587406175456 19.82181093024449,19.480519480519504 33.74124949809503 19.4805194805195h 97.40259740259745 c 13.919438567850523,2.238416443174295e-15 26.78153021416974,-7.42593207434403 33.74124949809499 -19.480519480519447Z" /></g><g stroke="rgb(0,0,255)" stroke-opacity="1.0"><path d="M 198.70129870129864,219.99870272214173 l 48.701298701298725,-84.35312374523753 l -48.701298701298676,-84.35312374523755 l -97.40259740259742,-4.325544251786325e-14 l -48.70129870129873,84.35312374523753 l 48.70129870129864,84.35312374523757 Z" /></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_decagonEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_decagonEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_decagonEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_decagonEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="95.10565162951534" font-size="1" viewBox="0 0 100 95"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(28.092454034086124,0.0,0.0,28.092454034086124,49.99999999999999,47.55282581475767)"><path d="M 1.3090169943749481,0.9510565162951532 l 0.3090169943749472,-0.9510565162951536 l -0.3090169943749477,-0.9510565162951534 l -0.8090169943749475,-0.5877852522924729 l -1.0,4.440892098500626e-16 l -0.8090169943749473,0.5877852522924731 l -0.3090169943749473,0.9510565162951536 l 0.3090169943749475,0.9510565162951535 l 0.8090169943749475,0.587785252292473 l 1.0,-5.551115123125783e-17 l 0.8090169943749477,-0.5877852522924736 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="95.10565162951534" font-size="1" viewBox="0 0 100 95" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 86.7734997443158,74.27033728259734 l 8.681045710229654,-26.717511467839685 l -8.681045710229668,-26.717511467839678 l -22.727272727272723,-16.512330181940012 l -28.092454034086124,4.678333393029941e-15 l -22.72727272727272,16.51233018194002 l -8.681045710229657,26.717511467839685 l 8.681045710229663,26.71751146783968 l 22.727272727272723,16.512330181940015 l 28.092454034086124,-1.5594444643433139e-15 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_dodecagonEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_dodecagonEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_dodecagonEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_dodecagonEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="99.99999999999999" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(24.35901749373842,0.0,0.0,24.35901749373842,50.0,49.99999999999999)"><path d="M 1.8660254037844393,0.4999999999999996 l -2.220446049250313e-16,-1.0 l -0.5000000000000001,-0.8660254037844386 l -0.8660254037844387,-0.49999999999999994 l -1.0,1.6081226496766364e-16 l -0.8660254037844386,0.49999999999999994 l -0.5000000000000001,0.8660254037844386 l -3.4450928483976665e-16,1.0 l 0.49999999999999956,0.8660254037844389 l 0.8660254037844385,0.5000000000000002 l 1.0,-3.834758505292834e-17 l 0.8660254037844385,-0.5000000000000003 l 0.5000000000000021,-0.8660254037844389 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="99.99999999999999" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 95.45454545454545,62.179508746869196 l -5.408788415759074e-15,-24.35901749373842 l -12.179508746869214,-21.09552796080702 l -21.095527960807022,-12.179508746869208 l -24.35901749373842,3.917228775555017e-15 l -21.09552796080702,12.179508746869208 l -12.179508746869214,21.09552796080702 l -8.391907696167188e-15,24.35901749373842 l 12.1795087468692,21.095527960807026 l 21.095527960807015,12.179508746869216 l 24.35901749373842,-9.341094951469035e-16 l 21.095527960807015,-12.17950874686922 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_hendecagonEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_hendecagonEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_hendecagonEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_hendecagonEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="98.98214418809323" font-size="1" viewBox="0 0 100 99"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(25.875425140597297,0.0,0.0,25.875425140597297,50.00000000000001,50.5141613269018)"><path d="M 1.7566685458330673,0.2525708066345108 l -0.1423148382732844,-0.9898214418809328 l -0.6548607339452844,-0.7557495743542588 l -0.9594929736144971,-0.28173255684143045 l -0.9594929736144977,0.28173255684142884 l -0.6548607339452855,0.7557495743542577 l -0.14231483827328584,0.9898214418809326 l 0.4154150130018858,0.9096319953545187 l 0.841253532831181,0.5406408174555977 l 0.9999999999999999,-2.7755575615628914e-17 l 0.8412535328311814,-0.5406408174555973 l 0.41541501300188677,-0.9096319953545157 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="98.98214418809326" font-size="1" viewBox="0 0 100 99" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 95.45454545454545,57.04953832667333 l -3.6824569441366046,-25.612050621948153 l -16.94479989871783,-19.55534153624188 l -24.827288611691024,-7.289949684219485 l -24.827288611691028,7.289949684219488 l -16.944799898717825,19.55534153624188 l -3.6824569441365966,25.612050621948153 l 10.74904007121057,23.537114601287985 l 21.767792813036245,13.989311000023635 l 25.875425140597297,-1.4363746381527874e-15 l 21.767792813036245,-13.989311000023637 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_heptagonEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_heptagonEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_heptagonEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_heptagonEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="97.49279121818235" font-size="1" viewBox="0 0 100 97"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(40.45835162842079,0.0,0.0,40.45835162842079,50.0,51.28584316362768)"><path d="M 1.1234898018587336,0.2564292158181373 l -0.22252093395631548,-0.9749279121818234 l -0.9009688679024197,-0.4338837391175572 l -0.9009688679024187,0.43388373911755906 l -0.22252093395631345,0.9749279121818237 l 0.6234898018587343,0.7818314824680291 l 1.0,-2.7755575615628914e-17 l 0.6234898018587329,-0.7818314824680312 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="97.49279121818235" font-size="1" viewBox="0 0 100 97" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 95.45454545454544,61.66054654499813 l -9.002830190689187,-39.443976283414365 l -36.45171526385628,-17.554220883072148 l -36.45171526385627,17.554220883072173 l -9.002830190689156,39.443976283414365 l 25.22536964033506,31.631613031861047 l 40.45835162842079,-1.0106503541157029e-14 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_hexagonEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_hexagonEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_hexagonEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_hexagonEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="86.6025403784439" font-size="1" viewBox="0 0 100 87"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(45.45454545454546,0.0,0.0,45.45454545454546,50.0,43.30127018922196)"><path d="M 0.49999999999999967,0.8660254037844387 l 0.5000000000000002,-0.8660254037844385 l -0.4999999999999996,-0.8660254037844388 l -0.9999999999999999,-4.440892098500626e-16 l -0.5000000000000003,0.8660254037844384 l 0.49999999999999933,0.866025403784439 l 1.0000000000000002,2.220446049250313e-16 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="86.6025403784439" font-size="1" viewBox="0 0 100 87" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 72.72727272727272,82.66606127033282 l 22.72727272727274,-39.364791081110845 l -22.727272727272712,-39.36479108111086 l -45.45454545454545,-2.018587317500285e-14 l -22.727272727272744,39.36479108111084 l 22.727272727272698,39.36479108111087 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_hruleEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_hruleEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_hruleEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_hruleEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="48.00000000000001" font-size="1" viewBox="0 0 300 48"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(54.54545454545455,0.0,0.0,54.54545454545455,150.0,24.000000000000004)"><g fill-opacity="0.0"><g fill-opacity="0.0"><path d="M -2.5,0.4 h 5.0 " /></g><g fill-opacity="0.0"><g fill-opacity="0.0"><path d="M -2.0,0.2 h 4.0 " /></g><path d="M -1.5,0.0 h 3.0 " /></g><g fill-opacity="0.0"><path d="M -1.0,-0.2 h 2.0 " /></g><path d="M -0.5,-0.4 h 1.0 " /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="48.00000000000001" font-size="1" viewBox="0 0 300 48" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><path d="M 13.636363636363626,45.81818181818183 h 272.72727272727275 " /></g><g><g><path d="M 40.90909090909091,34.909090909090914 h 218.1818181818182 " /></g><path d="M 68.18181818181819,24.000000000000004 h 163.63636363636363 " /></g><g><path d="M 95.45454545454545,13.090909090909093 h 109.0909090909091 " /></g><path d="M 122.72727272727272,2.1818181818181834 h 54.54545454545455 " /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_nonagonEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_nonagonEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_nonagonEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_nonagonEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="98.48077530122075" font-size="1" viewBox="0 0 100 98"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(31.572395939441876,0.0,0.0,31.572395939441876,50.0,50.771330594287235)"><path d="M 1.266044443118978,0.7309511000407727 l 0.1736481776669308,-0.984807753012208 l -0.49999999999999956,-0.8660254037844388 l -0.9396926207859082,-0.3420201433256692 l -0.9396926207859086,0.3420201433256681 l -0.5000000000000006,0.8660254037844384 l 0.17364817766692983,0.9848077530122082 l 0.766044443118978,0.6427876096865394 l 1.0,-2.7755575615628914e-17 l 0.7660444431189786,-0.6427876096865375 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="98.48077530122083" font-size="1" viewBox="0 0 100 98" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 89.97205643508258,73.84920813714508 l 5.482489019462867,-31.09274030233352 l -15.786197969720943,-27.342496941897323 l -29.668347484824512,-10.798395384342669 l -29.668347484824512,10.798395384342673 l -15.786197969720938,27.342496941897327 l 5.4824890194628795,31.09274030233352 l 24.185858465361633,20.294344917990855 l 31.57239593944188,5.257860137182526e-15 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_octagonEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_octagonEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_octagonEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_octagonEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="99.99999999999999" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(37.65577839755409,0.0,0.0,37.65577839755409,50.00000000000001,50.00000000000001)"><path d="M 1.2071067811865475,0.4999999999999996 l -2.220446049250313e-16,-1.0 l -0.7071067811865476,-0.7071067811865475 l -1.0,1.6081226496766364e-16 l -0.7071067811865475,0.7071067811865476 l 9.957992501029599e-17,1.0 l 0.7071067811865476,0.7071067811865476 l 1.0,-3.834758505292834e-17 l 0.7071067811865477,-0.7071067811865477 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="99.99999999999999" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 95.45454545454544,68.82788919877703 l -8.361262437429426e-15,-37.65577839755409 l -26.626656255768403,-26.6266562557684 l -37.65577839755409,6.0555110132310925e-15 l -26.6266562557684,26.626656255768403 l 3.74975958903276e-15,37.65577839755409 l 26.626656255768403,26.626656255768403 l 37.65577839755409,-1.4440081648344269e-15 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_pentagonEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_pentagonEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_pentagonEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_pentagonEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="95.10565162951538" font-size="1" viewBox="0 0 100 95"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(56.18490806817227,0.0,0.0,56.18490806817227,50.00000000000001,52.573111211913364)"><path d="M 0.5000000000000001,0.6881909602355868 l 0.3090169943749472,-0.9510565162951536 l -0.8090169943749475,-0.5877852522924729 l -0.8090169943749473,0.5877852522924731 l 0.3090169943749479,0.9510565162951533 l 0.9999999999999996,1.1102230246251565e-16 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="95.10565162951536" font-size="1" viewBox="0 0 100 95" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 78.09245403408613,91.239057046097 l 17.362091420459326,-53.43502293567938 l -45.45454545454545,-33.024660363880045 l -45.45454545454546,33.02466036388004 l 17.362091420459322,53.435022935679385 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_rectEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_rectEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_rectEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_rectEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="150.0" height="104.99999999999999" font-size="1" viewBox="0 0 150 105"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(136.36363636363635,0.0,0.0,136.36363636363635,74.99999999999999,52.49999999999999)"><path d="M 0.5000000000000001,0.35 l -1.1102230246251565e-16,-0.7 h -1.0 l -1.1102230246251565e-16,0.7 h 1.0 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="150.0" height="104.99999999999999" font-size="1" viewBox="0 0 150 105" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5019960159204453" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 143.1818181818182,100.22727272727272 l -1.5139404881252133e-14,-95.45454545454544 h -136.36363636363635 l -1.5139404881252133e-14,95.45454545454544 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_roundedRectEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_roundedRectEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_roundedRectEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_roundedRectEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="76.19047619047622" font-size="1" viewBox="0 0 400 76"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(173.1601731601732,0.0,0.0,173.1601731601732,199.99999999999997,38.09523809523811)"><g><g><path d="M 1.0499999999999998,0.10000000000000003 v -0.1 c -0.11045694996615868,-4.4408920985006264e-17 -0.19999999999999996,-8.954305003384136e-2 -0.19999999999999996 -0.20000000000000007h -0.29999999999999993 c -0.1104569499661587,-6.763537510981779e-18 -0.2,8.954305003384128e-2 -0.2 0.19999999999999996v 0.2 h 0.6 c 5.522847498307935e-2,1.014530626647267e-17 0.1,-4.477152501692063e-2 9.999999999999992e-2 -9.999999999999992e-2Z" /></g><g><path d="M 0.15000000000000013,0.10000000000000003 v -0.20000000000000004 c -5.522847498307934e-2,-2.2204460492503132e-17 -9.999999999999998e-2,-4.477152501692068e-2 -9.999999999999998e-2 -0.10000000000000003h -0.3 c -2.2204460492503132e-17,5.5228474983079326e-2 -4.477152501692068e-2,9.999999999999998e-2 -0.10000000000000003 9.999999999999996e-2v 0.2 c 5.522847498307934e-2,2.2204460492503132e-17 9.999999999999998e-2,4.477152501692068e-2 9.999999999999996e-2 0.10000000000000003h 0.30000000000000004 c 0.0,-5.522847498307934e-2 4.477152501692068e-2,-9.999999999999998e-2 9.999999999999998e-2 -9.999999999999998e-2Z" /></g><path d="M -0.5499999999999998,0.10000000000000003 v -0.20000000000000004 c 0.0,-5.522847498307935e-2 -4.4771525016920645e-2,-0.1 -9.999999999999998e-2 -0.1h -0.3 c -5.522847498307935e-2,-3.3817687554908897e-18 -0.1,4.477152501692064e-2 -0.1 9.999999999999998e-2v 0.2 c -6.763537510981779e-18,5.522847498307935e-2 4.477152501692064e-2,0.1 9.999999999999998e-2 0.10000000000000003h 0.30000000000000004 c 5.522847498307935e-2,1.014530626647267e-17 0.1,-4.477152501692063e-2 9.999999999999998e-2 -9.999999999999998e-2Z" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="400.0" height="76.19047619047622" font-size="1" viewBox="0 0 400 76" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.6982972487551757" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><path d="M 381.81818181818187,55.41125541125544 v -17.31601731601732 c -19.126744582884623,-7.689856447620133e-15 -34.63203463203463,-15.505290049150023 -34.63203463203463 -34.63203463203465h -51.94805194805195 c -19.126744582884626,-1.1711753265769319e-15 -34.63203463203464,15.505290049150009 -34.63203463203464 34.63203463203463v 34.63203463203464 h 103.89610389610392 c 9.563372291442313,1.7567629898653979e-15 17.31601731601732,-7.752645024575003 17.31601731601728 -17.316017316017295Z" /></g><g><path d="M 225.97402597402595,55.41125541125544 v -34.632034632034646 c -9.563372291442311,-3.844928223810067e-15 -17.316017316017316,-7.752645024575012 -17.316017316017316 -17.316017316017327h -51.94805194805196 c -3.844928223810067e-15,9.56337229144231 -7.752645024575012,17.316017316017316 -17.316017316017327 17.316017316017312v 34.63203463203464 c 9.563372291442311,3.844928223810067e-15 17.316017316017316,7.752645024575012 17.316017316017312 17.316017316017327h 51.94805194805197 c 0.0,-9.563372291442311 7.752645024575012,-17.316017316017316 17.316017316017323 -17.31601731601731Z" /></g><path d="M 104.76190476190474,55.41125541125544 v -34.632034632034646 c 0.0,-9.563372291442313 -7.752645024575005,-17.31601731601732 -17.316017316017316 -17.31601731601732h -51.94805194805196 c -9.563372291442313,-5.855876632884659e-16 -17.31601731601732,7.7526450245750045 -17.31601731601732 17.316017316017316v 34.63203463203464 c -1.1711753265769319e-15,9.563372291442313 7.7526450245750045,17.31601731601732 17.316017316017316 17.316017316017327h 51.94805194805197 c 9.563372291442313,1.7567629898653979e-15 17.31601731601732,-7.752645024575003 17.31601731601731 -17.316017316017316Z" /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_squareEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_squareEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_squareEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_squareEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200.0" height="85.71428571428572" font-size="1" viewBox="0 0 200 86"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="3.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(25.974025974025974,0.0,0.0,25.974025974025974,100.0,42.85714285714286)"><g><g><path d="M 3.5000000000000004,1.5 l -3.3306690738754696e-16,-3.0 h -3.0 l -3.3306690738754696e-16,3.0 h 3.000000000000001 Z" /></g><g><path d="M 2.220446049250313e-16,1.0 l -2.220446049250313e-16,-2.0 h -2.0 l -2.220446049250313e-16,2.0 h 2.0 Z" /></g><path d="M -2.5,0.5 l -1.1102230246251565e-16,-1.0 h -1.0 l -1.1102230246251565e-16,1.0 h 1.0 Z" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200.0" height="85.71428571428572" font-size="1" viewBox="0 0 200 86" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5237229365663817" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><path d="M 190.90909090909093,81.81818181818181 l -8.651088503572648e-15,-77.92207792207792 h -77.92207792207792 l -8.651088503572648e-15,77.92207792207792 Z" /></g><g><path d="M 100.0,68.83116883116884 l -5.767392335715099e-15,-51.94805194805195 h -51.94805194805195 l -5.767392335715099e-15,51.94805194805195 Z" /></g><path d="M 35.06493506493507,55.84415584415585 l -2.8836961678575494e-15,-25.974025974025974 h -25.974025974025974 l -2.8836961678575494e-15,25.974025974025974 Z" /></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_triangleEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_triangleEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_triangleEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_triangleEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="86.60254037844385" font-size="1" viewBox="0 0 100 87"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(90.9090909090909,0.0,0.0,90.9090909090909,50.0,57.73502691896257)"><path d="M 0.5,0.28867513459481275 l -0.5000000000000002,-0.8660254037844385 l -0.4999999999999999,0.8660254037844386 l 1.0,-1.1102230246251565e-16 Z" /></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="86.60254037844385" font-size="1" viewBox="0 0 100 87" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 95.45454545454545,83.97822097303646 l -45.454545454545475,-78.72958216222167 l -45.454545454545446,78.72958216222169 Z" /></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_unitSquareEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_unitSquareEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_unitSquareEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_unitSquareEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill="rgb(0,0,0)" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(90.9090909090909,0.0,0.0,90.9090909090909,49.99999999999999,50.0)"><path d="M 0.5000000000000001,0.5 l -1.1102230246251565e-16,-1.0 h -1.0 l -1.1102230246251565e-16,1.0 h 1.0 Z" /><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><path d="M 2.2000000000000002e-2,0.0 c 0.0,-1.2150264496277458e-2 -9.849735503722543e-3,-2.2000000000000002e-2 -2.2e-2 -2.2000000000000002e-2c -1.2150264496277458e-2,-7.439891262079958e-19 -2.2000000000000002e-2,9.849735503722541e-3 -2.2000000000000002e-2 2.1999999999999995e-2c -1.4879782524159916e-18,1.2150264496277458e-2 9.84973550372254e-3,2.2000000000000002e-2 2.1999999999999992e-2 2.2000000000000002e-2c 1.2150264496277458e-2,2.2319673786239874e-18 2.2000000000000002e-2,-9.84973550372254e-3 2.2000000000000006e-2 -2.1999999999999995e-2Z" /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="100.0" height="100.0" font-size="1" viewBox="0 0 100 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><path d="M 95.45454545454545,95.45454545454545 l -1.0092936587501423e-14,-90.9090909090909 h -90.9090909090909 l -1.0092936587501423e-14,90.9090909090909 Z" /><g fill="rgb(255,0,0)" fill-opacity="1.0" stroke-width="0.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><g fill="rgb(255,0,0)" fill-opacity="1.0"><path d="M 51.99999999999999,50.0 c 0.0,-1.104569499661587 -0.895430500338413,-2.0 -1.9999999999999998 -2.0c -1.104569499661587,-6.76353751098178e-17 -2.0,0.8954305003384128 -2.0 1.9999999999999996c -1.352707502196356e-16,1.104569499661587 0.8954305003384126,2.0 1.9999999999999991 2.0c 1.104569499661587,2.029061253294534e-16 2.0,-0.8954305003384126 2.000000000000001 -1.9999999999999996Z" /></g></g></g></g></g></g></svg>
diff --git a/diagrams/src_Diagrams_TwoD_Shapes_vruleEx.svg b/diagrams/src_Diagrams_TwoD_Shapes_vruleEx.svg
--- a/diagrams/src_Diagrams_TwoD_Shapes_vruleEx.svg
+++ b/diagrams/src_Diagrams_TwoD_Shapes_vruleEx.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="50.00000000000001" height="100.0" font-size="1" viewBox="0 0 50 100"><g><g stroke="rgb(0,0,0)" stroke-opacity="1.0" fill-opacity="0.0" stroke-width="1.0e-2" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g transform="matrix(45.45454545454546,0.0,0.0,45.45454545454546,25.000000000000004,50.0)"><g fill-opacity="0.0"><g fill-opacity="0.0"><g fill-opacity="0.0"><path d="M 0.5,-0.9999999999999999 v 1.9999999999999998 " /></g><path d="M 0.30000000000000004,-0.8999999999999999 v 1.7999999999999998 " /></g><g fill-opacity="0.0"><g fill-opacity="0.0"><path d="M 0.10000000000000003,-0.7999999999999999 v 1.5999999999999999 " /></g><path d="M -9.999999999999998e-2,-0.7 v 1.4 " /></g><g fill-opacity="0.0"><path d="M -0.3,-0.6 v 1.2 " /></g><path d="M -0.5,-0.5 v 1.0 " /></g></g></g></g></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="50.00000000000001" height="100.0" font-size="1" viewBox="0 0 50 100" stroke="rgb(0,0,0)" stroke-opacity="1"><g><g fill="rgb(0,0,0)" fill-opacity="0.0"><g stroke="rgb(0,0,0)" stroke-opacity="1.0" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" font-size="1.0em" stroke-miterlimit="10.0"><g><g><g><path d="M 47.727272727272734,4.545454545454547 v 90.9090909090909 " /></g><path d="M 38.63636363636364,9.090909090909086 v 81.81818181818183 " /></g><g><g><path d="M 29.545454545454547,13.636363636363633 v 72.72727272727273 " /></g><path d="M 20.454545454545457,18.18181818181818 v 63.63636363636364 " /></g><g><path d="M 11.363636363636365,22.727272727272723 v 54.545454545454554 " /></g><path d="M 2.2727272727272734,27.27272727272727 v 45.45454545454546 " /></g></g></g></g></svg>
diff --git a/src/Diagrams/Angle.hs b/src/Diagrams/Angle.hs
new file mode 100644
--- /dev/null
+++ b/src/Diagrams/Angle.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE RankNTypes                 #-}
+{-# LANGUAGE TypeFamilies               #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Diagrams.Angle
+-- Copyright   :  (c) 2013 diagrams-lib team (see LICENSE)
+-- License     :  BSD-style (see LICENSE)
+-- Maintainer  :  diagrams-discuss@googlegroups.com
+--
+-- Type for representing angles, independent of vector-space
+--
+-----------------------------------------------------------------------------
+
+module Diagrams.Angle
+       (
+         Angle
+       , rad, turn, deg
+       , fullTurn, fullCircle, angleRatio
+       , sinA, cosA, tanA, asinA, acosA, atanA
+       , (@@)
+       , angleBetween
+       , HasTheta(..)
+       ) where
+
+import           Control.Lens            (Iso', Lens', iso, review, (^.))
+                                         -- , review , (^.), _1, _2, Lens', lens)
+
+import           Data.VectorSpace
+
+-- | Angles can be expressed in a variety of units.  Internally,
+-- they are represented in radians.
+newtype Angle = Radians Double
+              deriving (Read, Show, Eq, Ord, Enum, AdditiveGroup)
+
+instance VectorSpace Angle where
+  type Scalar Angle = Double
+  s *^ Radians t = Radians (s*t)
+
+-- | The radian measure of an @Angle@ @a@ can be accessed as @a
+-- ^. rad@.  A new @Angle@ can be defined in radians as @pi \@\@ rad@.
+rad :: Iso' Angle Double
+rad = iso (\(Radians r) -> r) Radians
+
+-- | The measure of an @Angle@ @a@ in full circles can be accessed as
+-- @a ^. turn@.  A new @Angle@ of one-half circle can be defined in as
+-- @1/2 \@\@ turn@.
+turn :: Iso' Angle Double
+turn = iso (\(Radians r) -> r/2/pi) (Radians . (*(2*pi)))
+
+-- | The degree measure of an @Angle@ @a@ can be accessed as @a
+-- ^. deg@.  A new @Angle@ can be defined in degrees as @180 \@\@
+-- deg@.
+deg :: Iso' Angle Double
+deg = iso (\(Radians r) -> r/2/pi*360) (Radians . (*(2*pi/360)))
+
+-- | An angle representing one full turn.
+fullTurn :: Angle
+fullTurn = 1 @@ turn
+
+-- | Deprecated synonym for 'fullTurn', retained for backwards compatibility.
+fullCircle :: Angle
+fullCircle = fullTurn
+
+-- | Calculate ratio between two angles.
+angleRatio :: Angle -> Angle -> Double
+angleRatio a b = (a^.rad) / (b^.rad)
+
+-- | The sine of the given @Angle@.
+sinA :: Angle -> Double
+sinA (Radians r) = sin r
+
+-- | The cosine of the given @Angle@.
+cosA :: Angle -> Double
+cosA (Radians r) = cos r
+
+-- | The tangent function of the given @Angle@.
+tanA :: Angle -> Double
+tanA (Radians r) = tan r
+
+-- | The @Angle@ with the given sine.
+asinA :: Double -> Angle
+asinA = Radians . asin
+
+-- | The @Angle@ with the given cosine.
+acosA :: Double -> Angle
+acosA = Radians . acos
+
+-- | The @Angle@ with the given tangent.
+atanA :: Double -> Angle
+atanA = Radians . atan
+
+-- | @30 \@\@ deg@ is an @Angle@ of the given measure and units.
+--
+-- More generally, @\@\@@ reverses the @Iso\'@ on its right, and
+-- applies the @Iso\'@ to the value on the left.  @Angle@s are the
+-- motivating example where this order improves readability.
+(@@) :: b -> Iso' a b -> a
+-- The signature above is slightly specialized, in favor of readability
+a @@ i = review i a
+
+infixl 5 @@
+
+-- | compute the positive angle between the two vectors in their common plane
+angleBetween  :: (InnerSpace v, Scalar v ~ Double) => v -> v -> Angle
+angleBetween v1 v2 = acos (normalized v1 <.> normalized v2) @@ rad
+
+------------------------------------------------------------
+-- Polar Coordinates
+
+-- | The class of types with at least one angle coordinate, called _theta.
+class HasTheta t where
+    _theta :: Lens' t Angle
diff --git a/src/Diagrams/Attributes.hs b/src/Diagrams/Attributes.hs
--- a/src/Diagrams/Attributes.hs
+++ b/src/Diagrams/Attributes.hs
@@ -29,22 +29,13 @@
 
     Color(..), SomeColor(..), someToAlpha
 
-  -- ** Line color
-  , LineColor, getLineColor, mkLineColor, styleLineColor, lineColor, lineColorA, lc, lcA
-
-  -- ** Fill color
-  , FillColor, getFillColor, mkFillColor, styleFillColor, recommendFillColor, fillColor, fc, fcA
-
   -- ** Opacity
   , Opacity, getOpacity, opacity
 
   -- ** Converting colors
   , colorToSRGBA, colorToRGBA
 
-  -- * Lines
-  -- ** Width
-  , LineWidth, getLineWidth, lineWidth, lineWidthA, lw
-
+  -- * Line stuff
   -- ** Cap style
   , LineCap(..), LineCapA, getLineCap, lineCap
 
@@ -54,31 +45,17 @@
   -- ** Miter limit
   , LineMiterLimit(..), getLineMiterLimit, lineMiterLimit, lineMiterLimitA
 
-  -- ** Dashing
-  , Dashing(..), DashingA, getDashing, dashing
-
-  -- * Compilation utilities
-  , splitFills
-
   ) where
 
-import           Control.Lens                (Setter, sets)
 import           Data.Colour
 import           Data.Colour.RGBSpace        (RGB (..))
 import           Data.Colour.SRGB            (toSRGB)
 import           Data.Default.Class
-import           Data.Maybe                  (fromMaybe)
-import           Data.Monoid.Recommend
+
 import           Data.Semigroup
 import           Data.Typeable
 
-import           Diagrams.Attributes.Compile
 import           Diagrams.Core
-import           Diagrams.Core.Style         (setAttr)
-import           Diagrams.Core.Types         (RTree)
-import           Diagrams.Located            (unLoc)
-import           Diagrams.Path               (Path, pathTrails)
-import           Diagrams.Trail              (isLoop)
 
 ------------------------------------------------------------
 --  Color  -------------------------------------------------
@@ -112,110 +89,6 @@
 someToAlpha :: SomeColor -> AlphaColour Double
 someToAlpha (SomeColor c) = toAlphaColour c
 
--- | The color with which lines (strokes) are drawn.  Note that child
---   colors always override parent colors; that is, @'lineColor' c1
---   . 'lineColor' c2 $ d@ is equivalent to @'lineColor' c2 $ d@.
---   More precisely, the semigroup structure on line color attributes
---   is that of 'Last'.
-newtype LineColor = LineColor (Last SomeColor)
-  deriving (Typeable, Semigroup)
-instance AttributeClass LineColor
-
-instance Default LineColor where
-    def = LineColor (Last (SomeColor (black :: Colour Double)))
-
-getLineColor :: LineColor -> SomeColor
-getLineColor (LineColor (Last c)) = c
-
-mkLineColor :: Color c => c -> LineColor
-mkLineColor = LineColor . Last . SomeColor
-
-styleLineColor :: (Color c, Color c') => Setter (Style v) (Style v) c c'
-styleLineColor = sets modifyLineColor
-  where
-    modifyLineColor f s
-      = flip setAttr s
-      . mkLineColor
-      . f
-      . fromAlphaColour . someToAlpha
-      . getLineColor
-      . fromMaybe def . getAttr
-      $ s
-
--- | Set the line (stroke) color.  This function is polymorphic in the
---   color type (so it can be used with either 'Colour' or
---   'AlphaColour'), but this can sometimes create problems for type
---   inference, so the 'lc' and 'lcA' variants are provided with more
---   concrete types.
-lineColor :: (Color c, HasStyle a) => c -> a -> a
-lineColor = applyAttr . mkLineColor
-
--- | Apply a 'lineColor' attribute.
-lineColorA :: HasStyle a => LineColor -> a -> a
-lineColorA = applyAttr
-
--- | A synonym for 'lineColor', specialized to @'Colour' Double@
---   (i.e. opaque colors).
-lc :: HasStyle a => Colour Double -> a -> a
-lc = lineColor
-
--- | A synonym for 'lineColor', specialized to @'AlphaColour' Double@
---   (i.e. colors with transparency).
-lcA :: HasStyle a => AlphaColour Double -> a -> a
-lcA = lineColor
-
--- | The color with which shapes are filled. Note that child
---   colors always override parent colors; that is, @'fillColor' c1
---   . 'fillColor' c2 $ d@ is equivalent to @'lineColor' c2 $ d@.
---   More precisely, the semigroup structure on fill color attributes
---   is that of 'Last'.
-newtype FillColor = FillColor (Recommend (Last SomeColor))
-  deriving (Typeable, Semigroup)
-instance AttributeClass FillColor
-
-instance Default FillColor where
-  def = FillColor (Recommend (Last (SomeColor (transparent :: AlphaColour Double))))
-
-mkFillColor :: Color c => c -> FillColor
-mkFillColor = FillColor . Commit . Last . SomeColor
-
-styleFillColor :: (Color c, Color c') => Setter (Style v) (Style v) c c'
-styleFillColor = sets modifyFillColor
-  where
-    modifyFillColor f s
-      = flip setAttr s
-      . mkFillColor
-      . f
-      . fromAlphaColour . someToAlpha
-      . getFillColor
-      . fromMaybe def . getAttr
-      $ s
-
--- | Set the fill color.  This function is polymorphic in the color
---   type (so it can be used with either 'Colour' or 'AlphaColour'),
---   but this can sometimes create problems for type inference, so the
---   'fc' and 'fcA' variants are provided with more concrete types.
-fillColor :: (Color c, HasStyle a) => c -> a -> a
-fillColor = applyAttr . mkFillColor
-
--- | Set a \"recommended\" fill color, to be used only if no explicit
---   calls to 'fillColor' (or 'fc', or 'fcA') are used.
-recommendFillColor :: (Color c, HasStyle a) => c -> a -> a
-recommendFillColor = applyAttr . FillColor . Recommend . Last . SomeColor
-
-getFillColor :: FillColor -> SomeColor
-getFillColor (FillColor c) = getLast . getRecommend $ c
-
--- | A synonym for 'fillColor', specialized to @'Colour' Double@
---   (i.e. opaque colors).
-fc :: HasStyle a => Colour Double -> a -> a
-fc = fillColor
-
--- | A synonym for 'fillColor', specialized to @'AlphaColour' Double@
---   (i.e. colors with transparency).
-fcA :: HasStyle a => AlphaColour Double -> a -> a
-fcA = fillColor
-
 instance (Floating a, Real a) => Color (Colour a) where
   toAlphaColour   = opaque . colourConvert
   fromAlphaColour = colourConvert . (`over` black)
@@ -228,14 +101,6 @@
   toAlphaColour (SomeColor c) = toAlphaColour c
   fromAlphaColour c = SomeColor c
 
-instance Color LineColor where
-  toAlphaColour (LineColor c) = toAlphaColour . getLast $ c
-  fromAlphaColour = LineColor . Last . fromAlphaColour
-
-instance Color FillColor where
-  toAlphaColour (FillColor c) = toAlphaColour . getLast . getRecommend $ c
-  fromAlphaColour = FillColor . Commit . Last . fromAlphaColour
-
 -- | Convert to sRGBA.
 colorToSRGBA, colorToRGBA :: Color c => c -> (Double, Double, Double, Double)
 colorToSRGBA col = (r, g, b, a)
@@ -277,43 +142,9 @@
 opacity = applyAttr . Opacity . Product
 
 ------------------------------------------------------------
---  Lines and stuff    -------------------------------------
+--  Line stuff    -------------------------------------
 ------------------------------------------------------------
 
--- | The width of lines.  By default, the line width is measured with
---   respect to the /final/ coordinate system of a rendered diagram,
---   as opposed to the local coordinate systems in effect at the time
---   the line width was set for various subdiagrams.  This is so that
---   it is easy to combine a variety of shapes (some created by
---   scaling) and have them all drawn using a consistent line width.
---   However, sometimes it is desirable for scaling to affect line
---   width; the 'freeze' operation is provided for this purpose.  The
---   line width of frozen diagrams is affected by transformations.
---
---   Line widths specified on child nodes always override line widths
---   specified at parent nodes.
-newtype LineWidth = LineWidth (Last Double)
-  deriving (Typeable, Semigroup)
-instance AttributeClass LineWidth
-
-instance Default LineWidth where
-    def = LineWidth (Last 0.01)
-
-getLineWidth :: LineWidth -> Double
-getLineWidth (LineWidth (Last w)) = w
-
--- | Set the line (stroke) width.
-lineWidth :: HasStyle a => Double -> a -> a
-lineWidth = applyAttr . LineWidth . Last
-
--- | Apply a 'LineWidth' attribute.
-lineWidthA ::  HasStyle a => LineWidth -> a -> a
-lineWidthA = applyAttr
-
--- | A convenient synonym for 'lineWidth'.
-lw :: HasStyle a => Double -> a -> a
-lw = lineWidth
-
 -- | What sort of shape should be placed at the endpoints of lines?
 data LineCap = LineCapButt   -- ^ Lines end precisely at their endpoints.
              | LineCapRound  -- ^ Lines are capped with semicircles
@@ -379,43 +210,3 @@
 -- | Apply a 'LineMiterLimit' attribute.
 lineMiterLimitA :: HasStyle a => LineMiterLimit -> a -> a
 lineMiterLimitA = applyAttr
-
--- | Create lines that are dashing... er, dashed.
-data Dashing = Dashing [Double] Double
-  deriving (Typeable, Eq)
-
-newtype DashingA = DashingA (Last Dashing)
-  deriving (Typeable, Semigroup, Eq)
-instance AttributeClass DashingA
-
-getDashing :: DashingA -> Dashing
-getDashing (DashingA (Last d)) = d
-
--- | Set the line dashing style.
-dashing :: HasStyle a =>
-           [Double]  -- ^ A list specifying alternate lengths of on
-                     --   and off portions of the stroke.  The empty
-                     --   list indicates no dashing.
-        -> Double    -- ^ An offset into the dash pattern at which the
-                     --   stroke should start.
-        -> a -> a
-dashing ds offs = applyAttr (DashingA (Last (Dashing ds offs)))
-
-------------------------------------------------------------
-
-data FillLoops v = FillLoops
-
-instance Typeable v => SplitAttribute (FillLoops v) where
-  type AttrType (FillLoops v) = FillColor
-  type PrimType (FillLoops v) = Path v
-
-  primOK _ = all (isLoop . unLoc) . pathTrails
-
--- | Push fill attributes down until they are at the root of subtrees
---   containing only loops. This makes life much easier for backends,
---   which typically have a semantics where fill attributes are
---   applied to lines/non-closed paths as well as loops/closed paths,
---   whereas in the semantics of diagrams, fill attributes only apply
---   to loops.
-splitFills :: forall b v a. Typeable v => RTree b v a -> RTree b v a
-splitFills = splitAttr (FillLoops :: FillLoops v)
diff --git a/src/Diagrams/Attributes/Compile.hs b/src/Diagrams/Attributes/Compile.hs
--- a/src/Diagrams/Attributes/Compile.hs
+++ b/src/Diagrams/Attributes/Compile.hs
@@ -83,7 +83,7 @@
   --   * is some sort of prim not under consideration: don't apply the attribute; return True
   --   * is unsafe: don't apply the attribute; return False
   --   * is safe  :  do   apply the attribute; return True
-  splitAttr' mattr (Node rp@(RPrim _ (Prim prm)) _) =
+  splitAttr' mattr (Node rp@(RPrim (Prim prm)) _) =
       case cast prm :: Maybe (PrimType code) of
         Nothing  -> (Node rp [], True)
         Just p ->
diff --git a/src/Diagrams/Backend/CmdLine.hs b/src/Diagrams/Backend/CmdLine.hs
--- a/src/Diagrams/Backend/CmdLine.hs
+++ b/src/Diagrams/Backend/CmdLine.hs
@@ -423,13 +423,15 @@
     -- that users will call from their program @main@.  For instance an expected
     -- user program would take the following form.
     --
-    -- > import Diagrams.Prelude
-    -- > import Diagrams.Backend.TheBestBackend.CmdLine
-    -- >
-    -- > d :: Diagram B R2
-    -- > d = ...
-    -- >
-    -- > main = mainWith d
+    -- @
+    -- import Diagrams.Prelude
+    -- import Diagrams.Backend.TheBestBackend.CmdLine
+    -- 
+    -- d :: Diagram B R2
+    -- d = ...
+    -- 
+    -- main = mainWith d
+    -- @
     --
     -- Most backends should be able to use the default implementation.  A different
     -- implementation should be used to handle more complex interactions with the user.
@@ -449,7 +451,7 @@
 -- TODO: why can't we get away with: instance (Parseable (Args (a -> d)), Mainable (ResultOf d)) => ...
 --       Doesn't `Args (a -> d)` imply `ToResult (a -> d)` which implies `ToResult d` ?
 
--- | With this instance we can perform IO to produce something 
+-- | With this instance we can perform IO to produce something
 --   'Mainable' before rendering.
 instance Mainable d => Mainable (IO d) where
     type MainOpts (IO d) = MainOpts d
@@ -464,9 +466,11 @@
 --
 --   Typically a backend can write its @[(String,Diagram B V)]@ instance as
 --
---   > instance Mainable [(String,Diagram B V)] where
---   >     type MainOpts [(String,Diagram B V)] = (DiagramOpts, DiagramMultiOpts)
---   >     mainRender = defaultMultiMainRender
+--   @
+--   instance Mainable [(String,Diagram B V)] where
+--       type MainOpts [(String,Diagram B V)] = (DiagramOpts, DiagramMultiOpts)
+--       mainRender = defaultMultiMainRender
+--   @
 --
 --   We do not provide this instance in general so that backends can choose to
 --   opt-in to this form or provide a different instance that makes more sense.
@@ -508,9 +512,11 @@
 --   implementation works by modifying the output field and running the base @mainRender@.
 --   Typically a backend can write its @Animation B V@ instance as
 --
---   > instance Mainable (Animation B V) where
---   >     type MainOpts (Animation B V) = (DiagramOpts, DiagramAnimOpts)
---   >     mainRender = defaultAnimMainRender output
+--   @
+--   instance Mainable (Animation B V) where
+--       type MainOpts (Animation B V) = (DiagramOpts, DiagramAnimOpts)
+--       mainRender = defaultAnimMainRender output
+--   @
 --
 --   We do not provide this instance in general so that backends can choose to
 --   opt-in to this form or provide a different instance that makes more sense.
diff --git a/src/Diagrams/Backend/Show.hs b/src/Diagrams/Backend/Show.hs
deleted file mode 100644
--- a/src/Diagrams/Backend/Show.hs
+++ /dev/null
@@ -1,68 +0,0 @@
-{-# LANGUAGE FlexibleContexts           #-}
-{-# LANGUAGE FlexibleInstances          #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE MultiParamTypeClasses      #-}
-{-# LANGUAGE ScopedTypeVariables        #-}
-{-# LANGUAGE TypeFamilies               #-}
-{-# LANGUAGE TypeSynonymInstances       #-}
------------------------------------------------------------------------------
--- |
--- Module      :  Diagrams.Backend.Show
--- Copyright   :  (c) 2011 diagrams-lib team (see LICENSE)
--- License     :  BSD-style (see LICENSE)
--- Maintainer  :  diagrams-discuss@googlegroups.com
---
--- A simple Show-based diagrams backend, for testing purposes.
---
------------------------------------------------------------------------------
-module Diagrams.Backend.Show where
-
-import           Diagrams.Core.Transform (onBasis)
-import           Diagrams.Prelude
-
-import           Data.Basis
-
-import           Text.PrettyPrint        (Doc, empty, hsep, parens, ($+$))
-import qualified Text.PrettyPrint        as PP
-
-import           Data.List               (transpose)
-
--- | Token for identifying this backend.
-data ShowBackend = ShowBackend
-
-instance HasLinearMap v => Backend ShowBackend v where
-  data Render  ShowBackend v = SR Doc
-  type Result  ShowBackend v = String
-  data Options ShowBackend v = SBOpt
-
-  withStyle _ _ _ r = r -- XXX FIXME
-
-  doRender _ _ (SR r) = PP.render r
-
-instance Monoid (Render ShowBackend v) where
-  mempty = SR empty
-  (SR d1) `mappend` (SR d2) = SR (d1 $+$ d2)
-
-renderTransf :: forall v. (Num (Scalar v), HasLinearMap v, Show (Scalar v))
-             => Transformation v -> Doc
-renderTransf t = renderMat mat
-  where vmat :: [v]
-        (vmat, _) = onBasis t
-        mat :: [[Scalar v]]
-        mat = map decompV vmat
---        mat' :: [[Scalar v]]
---        mat'  = map (++[0]) mat ++ [decompV tr ++ [1]]
-        decompV = map snd . decompose
-
-renderMat :: Show a => [[a]] -> Doc
-renderMat = PP.vcat . map renderRow . transpose
-  where renderRow = parens . hsep . map (PP.text . show)
-
-instance (Show v, HasLinearMap v) => Renderable (Segment o v) ShowBackend where
-  render _ s = SR $ PP.text (show s)
-
-instance (Show v, OrderedField (Scalar v), InnerSpace v, HasLinearMap v) => Renderable (Trail v) ShowBackend where
-  render _ t = SR $ PP.text (show t)
-
-instance (Show v, OrderedField (Scalar v), InnerSpace v, HasLinearMap v) => Renderable (Path v) ShowBackend where
-  render _ p = SR $ PP.text (show p)
diff --git a/src/Diagrams/Combinators.hs b/src/Diagrams/Combinators.hs
--- a/src/Diagrams/Combinators.hs
+++ b/src/Diagrams/Combinators.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE Rank2Types            #-}
@@ -39,21 +40,27 @@
 
 import           Data.Typeable
 
-import           Control.Lens       (Lens', generateSignatures, lensField,
-                                     lensRules, makeLensesWith, (%~), (&), (.~),
-                                     (^.), _Wrapping)
+import           Control.Lens          (Lens', generateSignatures, lensField,
+                                        lensRules, makeLensesWith, (%~), (&),
+                                        (.~), (^.), _Wrapping)
 import           Data.AdditiveGroup
-import           Data.AffineSpace   ((.+^))
+import           Data.AffineSpace      ((.+^))
 import           Data.Default.Class
+import           Data.Monoid.Deletable (toDeletable)
+import           Data.Monoid.MList     (inj)
+#if __GLASGOW_HASKELL__ < 707
 import           Data.Proxy
+#endif
 import           Data.Semigroup
+import qualified Data.Tree.DUAL        as D
 import           Data.VectorSpace
 
 import           Diagrams.Core
+import           Diagrams.Core.Types   (QDiagram (QD))
 import           Diagrams.Located
 import           Diagrams.Path
-import           Diagrams.Segment   (straight)
-import           Diagrams.Trail     (Trail, trailVertices)
+import           Diagrams.Segment      (straight)
+import           Diagrams.Trail        (Trail, trailVertices)
 import           Diagrams.Util
 
 ------------------------------------------------------------
@@ -68,7 +75,7 @@
 --   > sqNewEnv =
 --   >     circle 1 # fc green
 --   >     |||
---   >     (    c # dashing [0.1,0.1] 0 # lc white
+--   >     (    c # dashingG [0.1,0.1] 0 # lc white
 --   >       <> square 2 # withEnvelope (c :: D R2) # fc blue
 --   >     )
 --   > c = circle 0.8
@@ -86,7 +93,7 @@
 -- | @phantom x@ produces a \"phantom\" diagram, which has the same
 --   envelope and trace as @x@ but produces no output.
 phantom :: (Backend b (V a), Typeable (V a), Enveloped a, Traced a, Monoid' m) => a -> QDiagram b (V a) m
-phantom a = mkQD nullPrim (getEnvelope a) (getTrace a) mempty mempty
+phantom a = QD $ D.leafU ((inj . toDeletable . getEnvelope $ a) <> (inj . toDeletable . getTrace $ a))
 
 -- | @pad s@ \"pads\" a diagram, expanding its envelope by a factor of
 --   @s@ (factors between 0 and 1 can be used to shrink the envelope).
@@ -127,7 +134,7 @@
          , Monoid' m
          )
       => v -> QDiagram b v m
-strut v = mkQD nullPrim env mempty mempty mempty
+strut v = QD $ D.leafU (inj . toDeletable $ env)
   where env = translate ((-0.5) *^ v) . getEnvelope $ straight v
   -- note we can't use 'phantom' here because it tries to construct a
   -- trace as well, and segments do not have a trace in general (only
diff --git a/src/Diagrams/Coordinates.hs b/src/Diagrams/Coordinates.hs
--- a/src/Diagrams/Coordinates.hs
+++ b/src/Diagrams/Coordinates.hs
@@ -16,7 +16,7 @@
     ( (:&)(..), Coordinates(..)
 
     -- * Lenses for particular axes
-    , HasX(..), HasY(..), HasZ(..)
+    , HasX(..), HasY(..), HasZ(..), HasR(..)
     )
     where
 
@@ -121,3 +121,8 @@
 -- | The class of types with at least three coordinates, the third called _z.
 class HasZ t where
     _z :: Lens' t Double
+
+-- | The class of types with a single length coordinate _r.  _r is
+-- magnitude of a vector, or the distance from the origin of a point.
+class HasR t where
+    _r :: Lens' t Double
diff --git a/src/Diagrams/CubicSpline.hs b/src/Diagrams/CubicSpline.hs
--- a/src/Diagrams/CubicSpline.hs
+++ b/src/Diagrams/CubicSpline.hs
@@ -41,9 +41,9 @@
 --   <<diagrams/src_Diagrams_CubicSpline_cubicSplineEx.svg#diagram=cubicSplineEx&width=600>>
 --
 --   > pts = map p2 [(0,0), (2,3), (5,-2), (-4,1), (0,3)]
---   > dot = circle 0.2 # fc blue # lw 0
+--   > dot = circle 0.2 # fc blue # lw none
 --   > mkPath closed = position (zip pts (repeat dot))
---   >              <> cubicSpline closed pts # lw 0.05
+--   >              <> cubicSpline closed pts
 --   > cubicSplineEx = (mkPath False ||| strutX 2 ||| mkPath True)
 --   >               # centerXY # pad 1.1
 --
diff --git a/src/Diagrams/Deform.hs b/src/Diagrams/Deform.hs
--- a/src/Diagrams/Deform.hs
+++ b/src/Diagrams/Deform.hs
@@ -1,25 +1,26 @@
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE GADTs #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UndecidableInstances       #-}
+{-# LANGUAGE FlexibleContexts     #-}
+{-# LANGUAGE FlexibleInstances    #-}
+{-# LANGUAGE GADTs                #-}
+{-# LANGUAGE ScopedTypeVariables  #-}
+{-# LANGUAGE TypeFamilies         #-}
+{-# LANGUAGE UndecidableInstances #-}
 
 module Diagrams.Deform (Deformation(..), Deformable(..), asDeformation) where
 
-import Control.Lens (under, _Unwrapped)
-import Data.AffineSpace
-import Data.Basis
-import Data.MemoTrie
-import Data.Monoid hiding ((<>))
-import Data.Semigroup
-import Data.VectorSpace
+import           Control.Lens        (under, _Unwrapped)
+import           Data.AffineSpace
+import           Data.Basis
+import           Data.MemoTrie
+import           Data.Monoid         hiding ((<>))
+import           Data.Semigroup
+import           Data.VectorSpace
 
-import Diagrams.Core
-import Diagrams.Located
-import Diagrams.Parametric
-import Diagrams.Path
-import Diagrams.Segment
-import Diagrams.Trail
+import           Diagrams.Core
+import           Diagrams.Located
+import           Diagrams.Parametric
+import           Diagrams.Path
+import           Diagrams.Segment
+import           Diagrams.Trail
 
 ------------------------------------------------------------
 -- Deformations
diff --git a/src/Diagrams/Path.hs b/src/Diagrams/Path.hs
--- a/src/Diagrams/Path.hs
+++ b/src/Diagrams/Path.hs
@@ -44,7 +44,7 @@
        , pathVertices
        , pathOffsets
        , pathCentroid
-       , fixPath
+       , pathLocSegments, fixPath
 
          -- * Modifying paths
 
@@ -130,8 +130,6 @@
 of the v's are inside Points and hence ought to be translated.
 -}
 
-instance (HasLinearMap v, InnerSpace v, OrderedField (Scalar v)) => IsPrim (Path v)
-
 instance (InnerSpace v, OrderedField (Scalar v)) => Enveloped (Path v) where
   getEnvelope = F.foldMap trailEnvelope . op Path --view pathTrails
           -- this type signature is necessary to work around an apparent bug in ghc 6.12.1
@@ -188,6 +186,11 @@
 --   its vertices).
 pathCentroid :: (InnerSpace v, OrderedField (Scalar v)) => Path v -> Point v
 pathCentroid = centroid . concat . pathVertices
+
+-- | Convert a path into a list of lists of located segments.
+pathLocSegments :: (InnerSpace v, OrderedField (Scalar v))
+                 => Path v -> [[Located (Segment Closed v)]]
+pathLocSegments = map trailLocSegments . op Path
 
 -- | Convert a path into a list of lists of 'FixedSegment's.
 fixPath :: (InnerSpace v, OrderedField (Scalar v)) => Path v -> [[FixedSegment v]]
diff --git a/src/Diagrams/Prelude.hs b/src/Diagrams/Prelude.hs
--- a/src/Diagrams/Prelude.hs
+++ b/src/Diagrams/Prelude.hs
@@ -84,8 +84,10 @@
          -- | Utilities for working with points.
        , module Diagrams.Points
 
+         -- | Angles
+       , module Diagrams.Angle
          -- | Convenience infix operators for working with coordinates.
-        , module Diagrams.Coordinates
+       , module Diagrams.Coordinates
 
          -- | A wide range of things (shapes, transformations,
          --   combinators) specific to creating two-dimensional
@@ -123,6 +125,7 @@
 import           Diagrams.Core
 
 import           Diagrams.Align
+import           Diagrams.Angle
 import           Diagrams.Animation
 import           Diagrams.Attributes
 import           Diagrams.Combinators
diff --git a/src/Diagrams/Prelude/ThreeD.hs b/src/Diagrams/Prelude/ThreeD.hs
--- a/src/Diagrams/Prelude/ThreeD.hs
+++ b/src/Diagrams/Prelude/ThreeD.hs
@@ -80,8 +80,11 @@
          -- | Utilities for working with points.
        , module Diagrams.Points
 
+         -- | Angles
+       , module Diagrams.Angle
+
          -- | Convenience infix operators for working with coordinates.
-        , module Diagrams.Coordinates
+       , module Diagrams.Coordinates
 
          -- | things (shapes, transformations, combinators) specific
          -- to creating three-dimensional diagrams.
@@ -118,6 +121,7 @@
 import           Diagrams.Core
 
 import           Diagrams.Align
+import           Diagrams.Angle
 import           Diagrams.Animation
 import           Diagrams.Attributes
 import           Diagrams.Combinators
diff --git a/src/Diagrams/Segment.hs b/src/Diagrams/Segment.hs
--- a/src/Diagrams/Segment.hs
+++ b/src/Diagrams/Segment.hs
@@ -493,7 +493,7 @@
   (OffsetEnvelope o1 e1) <> (OffsetEnvelope o2 e2)
     = let !negOff = negateV . op TotalOffset $ o1
           e2Off = moveOriginBy negOff e2
-          !() = maybe () (\f -> f `seq` ()) $ appEnvelope e2Off
+          !_unused = maybe () (\f -> f `seq` ()) $ appEnvelope e2Off
       in OffsetEnvelope
           (o1 <> o2)
           (e1 <> e2Off)
diff --git a/src/Diagrams/Solve.hs b/src/Diagrams/Solve.hs
--- a/src/Diagrams/Solve.hs
+++ b/src/Diagrams/Solve.hs
@@ -1,4 +1,3 @@
-{-# OPTIONS_GHC -fno-warn-unused-binds #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Diagrams.Solve
@@ -6,12 +5,15 @@
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
--- Exact solving of low-degree (n <= 3) polynomials.
+-- Exact solving of low-degree (n <= 4) polynomials.
 --
 -----------------------------------------------------------------------------
 module Diagrams.Solve
        ( quadForm
        , cubForm
+       , quartForm
+       , cubForm'
+       , quartForm'
        ) where
 
 import           Data.List     (maximumBy)
@@ -19,6 +21,20 @@
 
 import           Diagrams.Util (tau)
 
+import           Prelude hiding ((^))
+import qualified Prelude as P ((^))
+
+-- | A specialization of (^) to Integer
+--   c.f. http://comments.gmane.org/gmane.comp.lang.haskell.libraries/21164
+--   for discussion. "The choice in (^) and (^^) to overload on the
+--   power's Integral type... was a genuinely bad idea." - Edward Kmett
+(^) :: (Num a) => a -> Integer -> a
+(^) = (P.^)
+
+-- | Utility function used to avoid singularities
+aboutZero' :: (Ord a, Num a) => a -> a -> Bool
+aboutZero' toler x = abs x < toler
+
 ------------------------------------------------------------
 -- Quadratic formula
 ------------------------------------------------------------
@@ -48,14 +64,12 @@
 
     -- see http://www.mpi-hd.mpg.de/astrophysik/HEA/internal/Numerical_Recipes/f5-6.pdf
   | otherwise = [q/a, c/q]
- where d = b*b - 4*a*c
+ where d = b^2 - 4*a*c
        q = -1/2*(b + signum b * sqrt d)
 
-quadForm_prop :: Double -> Double -> Double -> Bool
-quadForm_prop a b c = all (aboutZero . eval) (quadForm a b c)
-  where eval x = a*x*x + b*x + c
-        aboutZero x = abs x < tolerance
-        tolerance = 1e-10
+_quadForm_prop :: Double -> Double -> Double -> Bool
+_quadForm_prop a b c = all (aboutZero' 1e-10 . eval) (quadForm a b c)
+  where eval x = a*x^2 + b*x + c
 
 ------------------------------------------------------------
 -- Cubic formula
@@ -64,10 +78,10 @@
 -- See http://en.wikipedia.org/wiki/Cubic_formula#General_formula_of_roots
 
 -- | Solve the cubic equation ax^3 + bx^2 + cx + d = 0, returning a
---   list of all real roots.
-cubForm :: (Floating d, Ord d) => d -> d -> d -> d -> [d]
-cubForm a b c d
-  | aboutZero a             = quadForm b c d
+--   list of all real roots. First argument is tolerance.
+cubForm' :: (Floating d, Ord d) => d -> d -> d -> d -> d -> [d]
+cubForm' toler a b c d
+  | aboutZero' toler a      = quadForm b c d
 
     -- three real roots, use trig method to avoid complex numbers
   | delta >  0              = map trig [0,1,2]
@@ -77,35 +91,35 @@
 
     -- two real roots, one of multiplicity 2
   | delta == 0 && disc /= 0 = [ (b*c - 9*a*d)/(2*disc)
-                              , (9*a*a*d - 4*a*b*c + b*b*b)/(a * disc)
+                              , (9*a^2*d - 4*a*b*c + b^3)/(a * disc)
                               ]
 
     -- one real root (and two complex)
   | otherwise               = [-b/(3*a) - cc/(3*a) + disc/(3*a*cc)]
 
- where delta  = 18*a*b*c*d - 4*b*b*b*d + b*b*c*c - 4*a*c*c*c - 27*a*a*d*d
-       disc   = 3*a*c - b*b
-       qq     = sqrt(-27*a*a*delta)
-       qq'    | aboutZero disc = maximumBy (comparing (abs . (+xx))) [qq, -qq]
+ where delta  = 18*a*b*c*d - 4*b^3*d + b^2*c^2 - 4*a*c^3 - 27*a^2*d^2
+       disc   = 3*a*c - b^2
+       qq     = sqrt(-27*(a^2)*delta)
+       qq'    | aboutZero' toler disc = maximumBy (comparing (abs . (+xx))) [qq, -qq]
               | otherwise = qq
        cc     = cubert (1/2*(qq' + xx))
-       xx     = 2*b*b*b - 9*a*b*c + 27*a*a*d
-       p      = disc/(3*a*a)
-       q      = xx/(27*a*a*a)
-       trig k = 2 * sqrt(-p/3) * cos(1/3*acos(3*q/(2*p)*sqrt(-3/p)) - k*tau/3)
-                - b/(3*a)
-
+       xx     = 2*b^3 - 9*a*b*c + 27*a^2*d
+       p      = disc/(3*a^2)
+       q      = xx/(27*a^3)
+       phi = 1/3*acos(3*q/(2*p)*sqrt(-3/p))
+       trig k = 2 * sqrt(-p/3) * cos(phi - k*tau/3) - b/(3*a)
        cubert x | x < 0     = -((-x)**(1/3))
                 | otherwise = x**(1/3)
 
-       aboutZero x = abs x < toler
-       toler = 1e-10
+-- | Solve the cubic equation ax^3 + bx^2 + cx + d = 0, returning a
+--   list of all real roots within 1e-10 tolerance
+--   (although currently it's closer to 1e-5)
+cubForm :: (Floating d, Ord d) => d -> d -> d -> d -> [d]
+cubForm = cubForm' 1e-10
 
-cubForm_prop :: Double -> Double -> Double -> Double -> Bool
-cubForm_prop a b c d = all (aboutZero . eval) (cubForm a b c d)
-  where eval x = a*x*x*x + b*x*x + c*x + d
-        aboutZero x = abs x < tolerance
-        tolerance = 1e-5
+_cubForm_prop :: Double -> Double -> Double -> Double -> Bool
+_cubForm_prop a b c d = all (aboutZero' 1e-5 . eval) (cubForm a b c d)
+  where eval x = a*x^3 + b*x^2 + c*x + d
            -- Basically, however large you set the tolerance it seems
            -- that quickcheck can always come up with examples where
            -- the returned solutions evaluate to something near zero
@@ -116,3 +130,58 @@
            -- issue in practice we could, say, use the solutions
            -- generated here as very good guesses to a numerical
            -- solver which can give us a more precise answer?
+           
+------------------------------------------------------------
+-- Quartic formula
+------------------------------------------------------------
+
+-- Based on http://tog.acm.org/resources/GraphicsGems/gems/Roots3b/and4.c
+-- as of 5/12/14, with help from http://en.wikipedia.org/wiki/Quartic_function
+
+-- | Solve the quartic equation c4 x^4 + c3 x^3 + c2 x^2 + c1 x + c0 = 0, returning a
+--   list of all real roots. First argument is tolerance.
+quartForm' :: (Floating d, Ord d) => d -> d -> d -> d -> d -> d -> [d]
+quartForm' toler c4 c3 c2 c1 c0
+  -- obvious cubic
+  | aboutZero' toler c4 = cubForm c3 c2 c1 c0
+  -- x(ax^3+bx^2+cx+d)
+  | aboutZero' toler c0 = 0 : cubForm c4 c3 c2 c1
+  -- substitute solutions of y back to x
+  | otherwise = map (\x->x-(a/4)) roots
+    where
+      -- eliminate c4: x^4+ax^3+bx^2+cx+d
+      [a,b,c,d] = map (/c4) [c3,c2,c1,c0]
+      -- eliminate cubic term via x = y - a/4
+      -- reduced quartic: y^4 + py^2 + qy + r = 0
+      p = b - 3/8*a^2
+      q = 1/8*a^3-a*b/2+c
+      r = (-3/256)*a^4+a^2*b/16-a*c/4+d
+
+      -- | roots of the reduced quartic
+      roots | aboutZero' toler r =
+                0 : cubForm 1 0 p q   -- no constant term: y(y^3 + py + q) = 0
+            | u < 0 || v < 0 = []     -- no real solutions due to square root
+            | otherwise      = s1++s2 -- solutions of the quadratics
+
+      -- solve the resolvent cubic - only one solution is needed
+      z:_ = cubForm 1 (-p/2) (-r) (p*r/2 - q^2/8)
+      
+      -- solve the two quadratic equations
+      -- y^2 ± v*y-(±u-z)
+      u = z^2 - r
+      v = 2*z - p
+      u' = if aboutZero' toler u then 0 else sqrt u
+      v' = if aboutZero' toler v then 0 else sqrt v
+      s1 = quadForm 1 (if q<0 then -v' else v') (z-u')
+      s2 = quadForm 1 (if q<0 then v' else -v') (z+u')
+
+-- | Solve the quartic equation c4 x^4 + c3 x^3 + c2 x^2 + c1 x + c0 = 0, returning a
+--   list of all real roots within 1e-10 tolerance
+--   (although currently it's closer to 1e-5)
+quartForm :: (Floating d, Ord d) => d -> d -> d -> d -> d -> [d]
+quartForm = quartForm' 1e-10
+
+_quartForm_prop :: Double -> Double -> Double -> Double -> Double -> Bool
+_quartForm_prop a b c d e = all (aboutZero' 1e-5 . eval) (quartForm a b c d e)
+  where eval x = a*x^4 + b*x^3 + c*x^2 + d*x + e
+           -- Same note about tolerance as for cubic
diff --git a/src/Diagrams/ThreeD.hs b/src/Diagrams/ThreeD.hs
--- a/src/Diagrams/ThreeD.hs
+++ b/src/Diagrams/ThreeD.hs
@@ -31,7 +31,9 @@
 --     for rendering 3D geometry to (2D) images.
 -----------------------------------------------------------------------------
 module Diagrams.ThreeD
-       ( module Diagrams.ThreeD.Align
+       (
+         module Diagrams.ThreeD.Align
+       , module Diagrams.ThreeD.Attributes
        , module Diagrams.ThreeD.Camera
        , module Diagrams.ThreeD.Light
        , module Diagrams.ThreeD.Shapes
@@ -41,6 +43,7 @@
        ) where
 
 import Diagrams.ThreeD.Align
+import Diagrams.ThreeD.Attributes
 import Diagrams.ThreeD.Camera
 import Diagrams.ThreeD.Light
 import Diagrams.ThreeD.Shapes
diff --git a/src/Diagrams/ThreeD/Attributes.hs b/src/Diagrams/ThreeD/Attributes.hs
new file mode 100644
--- /dev/null
+++ b/src/Diagrams/ThreeD/Attributes.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveDataTypeable         #-}
+{-# LANGUAGE ExistentialQuantification  #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE TemplateHaskell            #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Diagrams.ThreeD.Attributes
+-- Copyright   :  (c) 2014 diagrams-lib team (see LICENSE)
+-- License     :  BSD-style (see LICENSE)
+-- Maintainer  :  diagrams-discuss@googlegroups.com
+--
+-- Diagrams may have /attributes/ which affect the way they are
+-- rendered.  This module defines some common attributes relevant in
+-- 3D; particular backends may also define more backend-specific
+-- attributes.
+--
+-- Every attribute type must have a /semigroup/ structure, that is, an
+-- associative binary operation for combining two attributes into one.
+-- Unless otherwise noted, all the attributes defined here use the
+-- 'Last' structure, that is, combining two attributes simply keeps
+-- the second one and throws away the first.  This means that child
+-- attributes always override parent attributes.
+--
+-----------------------------------------------------------------------------
+
+module Diagrams.ThreeD.Attributes where
+
+import Control.Lens
+import Data.Semigroup
+import Data.Typeable
+
+import Data.Colour
+
+import Diagrams.Core
+
+-- | @SurfaceColor@ is the inherent pigment of an object, assumed to
+-- be opaque.
+newtype SurfaceColor = SurfaceColor (Last (Colour Double))
+                     deriving (Typeable, Semigroup)
+instance AttributeClass SurfaceColor
+
+surfaceColor :: Iso' SurfaceColor (Colour Double)
+surfaceColor = iso (\(SurfaceColor (Last c)) -> c) (SurfaceColor . Last)
+
+-- | Set the surface color.
+sc :: HasStyle d => Colour Double -> d -> d
+sc = applyAttr . review surfaceColor
+
+-- | @Diffuse@ is the fraction of incident light reflected diffusely,
+-- that is, in all directions.  The actual light reflected is the
+-- product of this value, the incident light, and the @SurfaceColor@
+-- Attribute.  For physical reasonableness, @Diffuse@ should have a
+-- value between 0 and 1; this is not checked.
+newtype Diffuse = Diffuse (Last Double)
+                deriving (Typeable, Semigroup)
+instance AttributeClass Diffuse
+
+_Diffuse :: Iso' Diffuse Double
+_Diffuse = iso (\(Diffuse (Last d)) -> d) (Diffuse . Last)
+
+-- | Set the diffuse reflectance.
+diffuse :: HasStyle d => Double -> d -> d
+diffuse = applyAttr . review _Diffuse
+
+-- | @Ambient@ is an ad-hoc representation of indirect lighting.  The
+-- product of @Ambient@ and @SurfaceColor@ is added to the light
+-- leaving an object due to diffuse and specular terms.  @Ambient@ can
+-- be set per-object, and can be loosely thought of as the product of
+-- indirect lighting incident on that object and the diffuse
+-- reflectance.
+newtype Ambient = Ambient (Last Double)
+                deriving (Typeable, Semigroup)
+instance AttributeClass Ambient
+
+_Ambient :: Iso' Ambient Double
+_Ambient = iso (\(Ambient (Last d)) -> d) (Ambient . Last)
+
+-- | Set the emittance due to ambient light.
+ambient :: HasStyle d => Double -> d -> d
+ambient = applyAttr . review _Ambient
+
+-- | A specular highlight has two terms, the intensity, between 0 and
+-- 1, and the size.  The highlight size is assumed to be the exponent
+-- in a Phong shading model (though Backends are free to use a
+-- different shading model).  In this model, reasonable values are
+-- between 1 and 50 or so, with higher values for shinier objects.
+-- Physically, the intensity and the value of @Diffuse@ must add up to
+-- less than 1; this is not enforced.
+data Specular = Specular { _specularIntensity :: Double
+                         , _specularSize :: Double
+                         }
+
+makeLenses ''Specular
+
+newtype Highlight = Highlight (Last Specular)
+                    deriving (Typeable, Semigroup)
+instance AttributeClass Highlight
+
+_Highlight :: Iso' Highlight Specular
+_Highlight = iso (\(Highlight (Last s)) -> s) (Highlight . Last)
+
+-- | Set the specular highlight.
+highlight :: HasStyle d => Specular -> d -> d
+highlight = applyAttr . review _Highlight
diff --git a/src/Diagrams/ThreeD/Camera.hs b/src/Diagrams/ThreeD/Camera.hs
--- a/src/Diagrams/ThreeD/Camera.hs
+++ b/src/Diagrams/ThreeD/Camera.hs
@@ -34,6 +34,7 @@
 import           Data.Monoid
 import           Data.Typeable
 
+import           Diagrams.Angle
 import           Diagrams.Core
 import           Diagrams.ThreeD.Types
 import           Diagrams.ThreeD.Vector
@@ -85,8 +86,6 @@
              (transform t u)
              l
 
-instance IsPrim (Camera l)
-
 instance Renderable (Camera l) NullBackend where
     render _ _ = mempty
 
@@ -119,13 +118,13 @@
 -- aspect ratio of 4:3, for VGA and similar computer resulotions.
 mm50Narrow = PerspectiveLens (36 @@ deg) (27 @@ deg)
 
-camForward :: Direction d => Camera l -> d
+camForward :: Camera l -> Direction
 camForward = direction . forward
 
-camUp :: Direction d => Camera l -> d
+camUp :: Camera l -> Direction
 camUp = direction . up
 
-camRight :: Direction d => Camera l -> d
+camRight :: Camera l -> Direction
 camRight c = direction right where
   right = cross3 (forward c) (up c)
 
diff --git a/src/Diagrams/ThreeD/Light.hs b/src/Diagrams/ThreeD/Light.hs
--- a/src/Diagrams/ThreeD/Light.hs
+++ b/src/Diagrams/ThreeD/Light.hs
@@ -22,7 +22,6 @@
 
 import           Diagrams.Core
 import           Diagrams.ThreeD.Types
-import           Diagrams.ThreeD.Vector
 
 data PointLight = PointLight P3 (Colour Double)
   deriving Typeable
@@ -39,9 +38,6 @@
 instance Transformable ParallelLight where
     transform t (ParallelLight v c) = ParallelLight (transform t v) c
 
-instance IsPrim PointLight
-instance IsPrim ParallelLight
-
 -- | Construct a Diagram with a single PointLight at the origin, which
 -- takes up no space.
 pointLight :: (Backend b R3, Renderable PointLight b)
@@ -51,8 +47,8 @@
                (Query . const . Any $ False)
 
 -- | Construct a Diagram with a single ParallelLight, which takes up no space.
-parallelLight :: (Direction d, Backend b R3, Renderable ParallelLight b)
-                 => d -- ^ The direction in which the light travels.
+parallelLight :: (Backend b R3, Renderable ParallelLight b)
+                 => Direction -- ^ The direction in which the light travels.
                  -> Colour Double -- ^ The color of the light.
                  -> Diagram b R3
 parallelLight d c = mkQD (Prim $ ParallelLight (fromDirection d) c)
diff --git a/src/Diagrams/ThreeD/Shapes.hs b/src/Diagrams/ThreeD/Shapes.hs
--- a/src/Diagrams/ThreeD/Shapes.hs
+++ b/src/Diagrams/ThreeD/Shapes.hs
@@ -15,18 +15,24 @@
 
 module Diagrams.ThreeD.Shapes
        (
-         Ellipsoid(..)
-       , sphere
+         Ellipsoid(..), sphere
+       , Box(..), cube
+       , Frustum(..) , frustum, cone, cylinder
        ) where
 
+import           Control.Applicative
+import           Control.Lens           (review, (^.), _1)
 import           Data.Typeable
 
 import           Data.AffineSpace
 import           Data.Semigroup
 import           Data.VectorSpace
+import           Diagrams.Angle
+import           Diagrams.Coordinates
 import           Diagrams.Core
 import           Diagrams.Solve
 import           Diagrams.ThreeD.Types
+import           Diagrams.ThreeD.Vector
 
 data Ellipsoid = Ellipsoid T3
   deriving Typeable
@@ -36,11 +42,10 @@
 instance Transformable Ellipsoid where
   transform t1 (Ellipsoid t2) = Ellipsoid (t1 <> t2)
 
-instance IsPrim Ellipsoid
-
 instance Renderable Ellipsoid NullBackend where
   render _ _ = mempty
 
+-- | A sphere of radius 1 with its center at the origin.
 sphere :: (Backend b R3, Renderable Ellipsoid b) => Diagram b R3
 sphere = mkQD (Prim $ Ellipsoid mempty)
               (mkEnvelope sphereEnv)
@@ -54,3 +59,104 @@
                 c = p' <.> p' - 1
                 p' = p .-. origin
         sphereQuery v = Any $ magnitudeSq (v .-. origin) <= 1
+
+data Box = Box T3
+         deriving (Typeable)
+
+type instance V Box = R3
+
+instance Transformable Box where
+    transform t1 (Box t2) = Box (t1 <> t2)
+
+instance Renderable Box NullBackend where
+    render _ _ = mempty
+
+-- | A cube with side length 1, in the positive octant, with one
+-- vertex at the origin.
+cube :: (Backend b R3, Renderable Box b) => Diagram b R3
+cube = mkQD (Prim $ Box mempty)
+            (mkEnvelope boxEnv)
+            (mkTrace boxTrace)
+            mempty
+            (Query boxQuery)
+  where
+    corners = mkR3 <$> [0,1] <*> [0,1] <*> [0,1]
+    boxEnv v = maximum (map (v <.>) corners) / magnitudeSq v
+    -- ts gives all intersections with the planes forming the box
+    -- filter keeps only those actually on the box surface
+    boxTrace p v = mkSortedList . filter (range . atT) $ ts where
+      (x0, y0, z0) = unp3 p
+      (vx, vy, vz) = unr3 v
+      intersections f d = case d of
+          0 -> []
+          _ -> [-f/d, (1-f)/d]
+      ts = concat $ zipWith intersections [x0,y0,z0] [vx,vy,vz]
+      atT t = p .+^ (t*^v)
+    range u = and [x >= 0, x <= 1, y >= 0, y <= 1, z >= 0, z <= 1] where
+      (x, y, z) = unp3 u
+    boxQuery = Any . range
+
+data Frustum = Frustum Double Double T3
+         deriving (Typeable)
+
+type instance V Frustum = R3
+
+instance Transformable Frustum where
+    transform t1 (Frustum r0 r1 t2) = Frustum r0 r1 (t1 <> t2)
+
+instance Renderable Frustum NullBackend where
+    render _ _ = mempty
+
+-- | A frustum of a right circular cone.  It has height 1 oriented
+-- along the positive z axis, and radii r0 and r1 at Z=0 and Z=1.
+-- 'cone' and 'cylinder' are special cases.
+frustum :: (Backend b R3, Renderable Frustum b) => Double -> Double -> Diagram b R3
+frustum r0 r1 = mkQD (Prim $ Frustum r0 r1 mempty)
+                 (mkEnvelope frEnv)
+                 (mkTrace frTrace)
+                 mempty
+                 (Query frQuery)
+  where
+    projectXY u = u ^-^ project unitZ u
+    frQuery p = Any $ x >= 0 && x <= 1 && a <= r where
+      (x, _, z) = unp3 p
+      r = r0 + (r1-r0)*z
+      v = p .-. origin
+      a = magnitude $ projectXY v
+    -- The plane containing v and the z axis intersects the frustum in a trapezoid
+    -- Test the four corners of this trapezoid; one must determine the Envelope
+    frEnv v = maximum . map (magnitude . project v . review cylindrical) $ corners
+      where
+        θ = v^._theta
+        corners = [(r1,θ,1), (-r1,θ,1), (r0,θ,0), (-r0,θ,0)]
+    -- The trace can intersect the sides of the cone or one of the end
+    -- caps The sides are described by a quadric equation; substitute
+    -- in the parametric form of the ray but disregard any
+    -- intersections outside z = [0,1] Similarly, find intersections
+    -- with the planes z=0, z=1, but disregard any r>r0, r>r1
+    frTrace p v = mkSortedList $ filter zbounds (quadForm a b c) ++ ends
+      where
+        (px, py, pz) = unp3 p
+        (vx, vy, vz) = unr3 v
+        ray t = p .+^ t*^v
+        dr = r1-r0
+        a = vx**2 + vy**2 - vz**2 * dr**2
+        b = 2 * (px * vx + py * vy - (r0+pz*dr) * dr  * vz)
+        c = px**2 + py**2 - (r0 + dr*pz)**2
+        zbounds t = (ray t)^._z >= 0 && (ray t)^._z <= 1
+        ends = concatMap cap [0,1]
+        cap z = if (ray t)^.cylindrical._1 < r0 + z*dr
+                then [t]
+                else []
+          where
+            t = (z - pz) / vz
+
+-- | A cone with its base centered on the origin, with radius 1 at the
+-- base, height 1, and it's apex on the positive Z axis.
+cone :: (Backend b R3, Renderable Frustum b) => Diagram b R3
+cone = frustum 1 0
+
+-- | A circular cylinder of radius 1 with one end cap centered on the
+-- origin, and extending to Z=1.
+cylinder :: (Backend b R3, Renderable Frustum b) => Diagram b R3
+cylinder = frustum 1 1
diff --git a/src/Diagrams/ThreeD/Transform.hs b/src/Diagrams/ThreeD/Transform.hs
--- a/src/Diagrams/ThreeD/Transform.hs
+++ b/src/Diagrams/ThreeD/Transform.hs
@@ -46,9 +46,9 @@
 import           Diagrams.Core
 import qualified Diagrams.Core.Transform as T
 
+import           Diagrams.Angle
 import           Diagrams.Transform
 import           Diagrams.ThreeD.Types
-import           Diagrams.ThreeD.Vector
 import           Diagrams.Coordinates
 
 import           Control.Lens                   (view, (*~), (//~))
@@ -102,11 +102,10 @@
 
 -- | @rotationAbout p d a@ is a rotation about a line parallel to @d@
 --   passing through @p@.
-rotationAbout
-  :: Direction d
-  => P3     -- ^ origin of rotation
-  -> d      -- ^ direction of rotation axis
-  -> Angle      -- ^ angle of rotation
+rotationAbout ::
+     P3        -- ^ origin of rotation
+  -> Direction -- ^ direction of rotation axis
+  -> Angle     -- ^ angle of rotation
   -> T3
 rotationAbout p d a
   = mconcat [translation (negateV t),
@@ -128,7 +127,7 @@
 -- without tilting, it will be, otherwise if only tilting is
 -- necessary, no panning will occur.  The tilt will always be between
 -- ± 1/4 turn.
-pointAt :: Direction d => d -> d -> d -> T3
+pointAt :: Direction -> Direction -> Direction -> T3
 pointAt a i f = pointAt' (fromDirection a) (fromDirection i) (fromDirection f)
 
 -- | pointAt' has the same behavior as 'pointAt', but takes vectors
@@ -137,9 +136,9 @@
 pointAt' about initial final = tilt <> pan where
   inPanPlane    = final ^-^ project final initial
   panAngle      = angleBetween initial inPanPlane
-  pan           = rotationAbout origin (direction about :: Spherical) panAngle
+  pan           = rotationAbout origin (direction about) panAngle
   tiltAngle     = angleBetween initial inPanPlane
-  tiltDir       = direction $ cross3 inPanPlane about :: Spherical
+  tiltDir       = direction $ cross3 inPanPlane about
   tilt          = rotationAbout origin tiltDir tiltAngle
 
 -- Scaling -------------------------------------------------
@@ -261,4 +260,4 @@
 --   useful for implementing backends.
 onBasis :: T3 -> ((R3, R3, R3), R3)
 onBasis t = ((x, y, z), v)
-  where ((x:y:z:[]), v) = T.onBasis t
+  where (x:y:z:[], v) = T.onBasis t
diff --git a/src/Diagrams/ThreeD/Types.hs b/src/Diagrams/ThreeD/Types.hs
--- a/src/Diagrams/ThreeD/Types.hs
+++ b/src/Diagrams/ThreeD/Types.hs
@@ -1,13 +1,13 @@
 {-# LANGUAGE FlexibleInstances          #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses      #-}
+{-# LANGUAGE RankNTypes                 #-}
 {-# LANGUAGE TypeFamilies               #-}
 {-# LANGUAGE TypeOperators              #-}
 {-# LANGUAGE TypeSynonymInstances       #-}
+{-# LANGUAGE UndecidableInstances       #-}
 {-# LANGUAGE ViewPatterns               #-}
 
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Diagrams.ThreeD.Types
@@ -21,28 +21,23 @@
 
 module Diagrams.ThreeD.Types
        ( -- * 3D Euclidean space
-         R3, r3, unr3, mkR3
+         R3(..), r3, unr3, mkR3
        , P3, p3, unp3, mkP3
        , T3
        , r3Iso, p3Iso
 
-         -- * Two-dimensional angles
-         -- | These are defined in "Diagrams.TwoD.Types" but
-         --   reëxported here for convenience.
-       , Angle, rad, turn, deg, (@@)
-       , fullTurn, angleRatio
-
          -- * Directions in 3D
-       , Direction(..)
-       , Spherical(..)
-       , asSpherical
+       , Direction, direction, fromDirection, angleBetweenDirs
+       -- * other coördinate systems
+       , Spherical(..), Cylindrical(..), HasPhi(..)
        ) where
 
-import           Control.Lens           (Iso', iso, over, Wrapped(..), Rewrapped
-                                        , _1, _2, _3)
+import           Control.Lens           (Iso', Lens', iso, over
+                                        , _1, _2, _3, (^.))
 
 import           Diagrams.Core
-import           Diagrams.TwoD.Types
+import           Diagrams.Angle
+import           Diagrams.TwoD.Types    (R2)
 import           Diagrams.Coordinates
 
 import           Data.AffineSpace.Point
@@ -54,31 +49,28 @@
 -- 3D Euclidean space
 
 -- | The three-dimensional Euclidean vector space R^3.
-newtype R3 = R3 { unR3 :: (Double, Double, Double) }
-  deriving (AdditiveGroup, Eq, Ord, Show, Read)
+data R3 = R3 !Double !Double !Double
+  deriving (Eq, Ord, Show, Read)
 
 r3Iso :: Iso' R3 (Double, Double, Double)
-r3Iso = iso unR3 R3
+r3Iso = iso unr3 r3
 
 -- | Construct a 3D vector from a triple of components.
 r3 :: (Double, Double, Double) -> R3
-r3 = R3
+r3 (x,y,z) = R3 x y z
 
 -- | Curried version of `r3`.
 mkR3 :: Double -> Double -> Double -> R3
-mkR3 x y z = r3 (x, y, z)
+mkR3 = R3
 
 -- | Convert a 3D vector back into a triple of components.
 unr3 :: R3 -> (Double, Double, Double)
-unr3 = unR3
-
--- | Lens wrapped isomorphisms for R3.
-instance Wrapped R3 where
-    type Unwrapped R3 = (Double, Double, Double)
-    _Wrapped' = iso unr3 r3
-    {-# INLINE _Wrapped' #-}
+unr3 (R3 x y z) = (x,y,z)
 
-instance Rewrapped R3 R3
+instance AdditiveGroup R3 where
+    zeroV = R3 0 0 0
+    R3 x1 y1 z1 ^+^ R3 x2 y2 z2 = R3 (x1 + x2) (y1 + y2) (z1 + z2)
+    negateV (R3 x y z) = R3 (-x) (-y) (-z)
 
 type instance V R3 = R3
 
@@ -88,31 +80,31 @@
 
 instance HasBasis R3 where
   type Basis R3 = Either () (Either () ()) -- = Basis (Double, Double, Double)
-  basisValue = R3 . basisValue
-  decompose  = decompose  . unR3
-  decompose' = decompose' . unR3
+  basisValue = r3 . basisValue
+  decompose  = decompose  . unr3
+  decompose' = decompose' . unr3
 
 instance InnerSpace R3 where
-  (unR3 -> vec1) <.> (unR3 -> vec2) = vec1 <.> vec2
+    (R3 x1 y1 z1) <.> (R3 x2 y2 z2) = x1*x2 + y1*y2 + z1*z2
 
 instance Coordinates R3 where
   type FinalCoord R3       = Double
   type PrevDim R3          = R2
   type Decomposition R3    = Double :& Double :& Double
 
-  (coords -> x :& y) ^& z   = r3 (x,y,z)
-  coords (unR3 -> (x,y,z)) = x :& y :& z
+  (coords -> x :& y) ^& z   = R3 x y z
+  coords (R3 x y z) = x :& y :& z
 
 -- | Points in R^3.
 type P3 = Point R3
 
 -- | Construct a 3D point from a triple of coordinates.
 p3 :: (Double, Double, Double) -> P3
-p3 = P . R3
+p3 = P . r3
 
 -- | Convert a 3D point back into a triple of coordinates.
 unp3 :: P3 -> (Double, Double, Double)
-unp3 = unR3 . unPoint
+unp3 = unr3 . unPoint
 
 p3Iso :: Iso' P3 (Double, Double, Double)
 p3Iso = iso unp3 p3
@@ -133,33 +125,14 @@
 --------------------------------------------------------------------------------
 -- Direction
 
--- | Direction is a type class representing directions in R3.  The interface is
--- based on that of the Angle class in 2D.
-
-class Direction d where
-    -- | Convert to spherical coördinates
-    toSpherical :: d -> Spherical
-
-    -- | Convert from spherical coördinates
-    fromSpherical :: Spherical -> d
-
--- | A direction expressed as a pair of spherical coordinates.
--- `Spherical 0 0` is the direction of `unitX`.  The first coordinate
--- represents rotation about the Z axis, the second rotation towards the Z axis.
-data Spherical = Spherical Angle Angle
-                   deriving (Show, Read, Eq)
-
-instance Direction Spherical where
-    toSpherical = id
-    fromSpherical = id
+-- | A @Direction@ represents directions in R3.  The constructor is
+-- not exported; @Direction@s can be used with 'fromDirection' and the
+-- lenses provided by its instances.
+data Direction = Direction R3
 
--- | The identity function with a restricted type, for conveniently
--- restricting unwanted polymorphism.  For example, @fromDirection
--- . asSpherical . camForward@ gives a unit vector pointing in the
--- direction of the camera view.  Without @asSpherical@, the
--- intermediate type would be ambiguous.
-asSpherical :: Spherical -> Spherical
-asSpherical = id
+-- | Not exported
+_Dir :: Iso' Direction R3
+_Dir = iso (\(Direction v) -> v) Direction
 
 instance HasX R3 where
     _x = r3Iso . _1
@@ -178,3 +151,73 @@
 
 instance HasZ P3 where
     _z = p3Iso . _3
+
+-- | Types which can be expressed in spherical 3D coordinates, as a
+-- triple (r,θ,φ), where θ is rotation about the Z axis, and φ is the
+-- angle from the Z axis.
+class Spherical t where
+    spherical :: Iso' t (Double, Angle, Angle)
+
+-- | Types which can be expressed in cylindrical 3D coordinates.
+class Cylindrical t where
+    cylindrical :: Iso' t (Double, Angle, Double) -- r, θ, z
+
+instance Cylindrical R3 where
+    cylindrical = iso (\(R3 x y z) -> (sqrt (x^(2::Int)+y^(2::Int)), atanA (y/x), z))
+                      (\(r,θ,z) -> R3 (r*cosA θ) (r*sinA θ) z)
+
+instance Spherical R3 where
+    spherical = iso
+      (\v@(R3 x y z) -> (magnitude v, atanA (y/x), atanA (v^._r/z)))
+      (\(r,θ,φ) -> R3 (r*cosA θ*sinA φ) (r*sinA θ*sinA φ) (r*cosA φ))
+
+-- We'd like to write: instance Spherical t => HasR t
+-- But GHC can't work out that the instance won't overlap.  Just write them explicitly:
+
+instance HasR R3 where
+    _r = spherical . _1
+
+instance HasR P3 where
+    _r = spherical . _1
+
+instance HasTheta R3 where
+    _theta = cylindrical . _2
+
+instance HasTheta P3 where
+    _theta = cylindrical . _2
+
+-- | The class of types with at least two angle coordinates, the
+-- second called _phi.
+class HasPhi t where
+    _phi :: Lens' t Angle
+
+instance HasPhi R3 where
+    _phi = spherical . _3
+
+instance HasPhi P3 where
+    _phi = spherical . _3
+
+instance Cylindrical P3 where
+    cylindrical = _relative origin . cylindrical
+
+instance Spherical P3 where
+    spherical = _relative origin . spherical
+
+instance HasTheta Direction where
+    _theta = _Dir . _theta
+
+instance HasPhi Direction where
+    _phi = _Dir . _phi
+
+-- | @direction v@ is the direction in which @v@ points.  Returns an
+--   unspecified value when given the zero vector as input.
+direction :: R3 -> Direction
+direction = Direction
+
+-- | @fromDirection d@ is the unit vector in the direction @d@.
+fromDirection :: Direction -> R3
+fromDirection (Direction v) = normalized v
+
+-- | compute the positive angle between the two directions in their common plane
+angleBetweenDirs  :: Direction -> Direction -> Angle
+angleBetweenDirs d1 d2 = angleBetween (fromDirection d1) (fromDirection d2)
diff --git a/src/Diagrams/ThreeD/Vector.hs b/src/Diagrams/ThreeD/Vector.hs
--- a/src/Diagrams/ThreeD/Vector.hs
+++ b/src/Diagrams/ThreeD/Vector.hs
@@ -15,17 +15,10 @@
 module Diagrams.ThreeD.Vector
        ( -- * Special 2D vectors
          unitX, unitY, unitZ, unit_X, unit_Y, unit_Z,
-
-         -- * Converting between vectors and angles
-         direction, fromDirection, angleBetween, angleBetweenDirs
        ) where
 
-import Control.Lens ((^.))
-import Data.VectorSpace
-import Data.Cross
-
-import Diagrams.ThreeD.Types
 import Diagrams.Coordinates
+import Diagrams.ThreeD.Types
 
 
 -- | The unit vector in the positive X direction.
@@ -51,33 +44,3 @@
 -- | The unit vector in the negative Z direction.
 unit_Z :: R3
 unit_Z = 0 ^& 0 ^& (-1)
-
-
--- | @direction v@ is the direction in which @v@ points.  Returns an
---   unspecified value when given the zero vector as input.
-direction :: Direction d => R3 -> d
-direction v
-  | r == 0 = fromSpherical $ Spherical zero zero
-  | otherwise = fromSpherical $ Spherical θ φ where
-  r = magnitude v
-  (x,y,z) = unr3 v
-  φ = asin (z / r) @@ rad
-  θ = atan2 y x @@ rad
-  zero = 0 @@ rad
-
--- | @fromDirection d@ is the unit vector in the direction @d@.
-fromDirection :: Direction d => d -> R3
-fromDirection (toSpherical -> (Spherical θ' φ')) = r3 (x,y,z) where
-  θ = θ'^.rad
-  φ = φ'^.rad
-  x = cos θ * cos φ
-  y = sin θ * cos φ
-  z = sin φ
-
--- | compute the positive angle between the two vectors in their common plane
-angleBetween  :: R3 -> R3 -> Angle
-angleBetween v1 v2 = atan2 (magnitude $ cross3 v1 v2) (v1 <.> v2) @@ rad
-
--- | compute the positive angle between the two vectors in their common plane
-angleBetweenDirs  :: Direction d => d -> d -> Angle
-angleBetweenDirs d1 d2 = angleBetween (fromDirection d1) (fromDirection d2)
diff --git a/src/Diagrams/Trail.hs b/src/Diagrams/Trail.hs
--- a/src/Diagrams/Trail.hs
+++ b/src/Diagrams/Trail.hs
@@ -77,7 +77,7 @@
        , trailOffsets, trailOffset
        , lineOffsets, lineOffset, loopOffsets
        , trailVertices, lineVertices, loopVertices
-       , fixTrail
+       , trailLocSegments, fixTrail
 
          -- * Modifying trails
 
@@ -163,10 +163,8 @@
   => Monoid (SegTree v)
 deriving instance (OrderedField (Scalar v), InnerSpace v)
   => FT.Measured (SegMeasure v) (SegTree v)
-
-instance (HasLinearMap v, InnerSpace v, OrderedField (Scalar v))
-  => Transformable (SegTree v) where
-  transform t = SegTree . transform t . op SegTree
+deriving instance (HasLinearMap v, InnerSpace v, OrderedField (Scalar v))
+  => Transformable (SegTree v)
 
 type instance Codomain (SegTree v) = v
 
@@ -938,7 +936,7 @@
 --
 --   > trailOffsetEx = (strokeLine almostClosed <> showOffset) # centerXY # pad 1.1
 --   >   where showOffset = fromOffsets [trailOffset (wrapLine almostClosed)]
---   >                    # stroke # lc red # lw 0.05
+--   >                    # stroke # lc red
 trailOffset :: (InnerSpace v, OrderedField (Scalar v)) => Trail v -> v
 trailOffset = withLine lineOffset
 
@@ -993,8 +991,12 @@
 -- | Convert a concretely located trail into a list of fixed segments.
 fixTrail :: (InnerSpace v, OrderedField (Scalar v))
          => Located (Trail v) -> [FixedSegment v]
-fixTrail t = zipWith ((mkFixedSeg .) . at)
-               (trailSegments (unLoc t)) (trailVertices t)
+fixTrail t = map mkFixedSeg (trailLocSegments t)
+
+-- | Convert a concretely located trail into a list of located segments.
+trailLocSegments :: (InnerSpace v, OrderedField (Scalar v))
+                  => Located (Trail v) -> [Located (Segment Closed v)]
+trailLocSegments t = zipWith at (trailSegments (unLoc t)) (trailVertices t)
 
 ------------------------------------------------------------
 --  Modifying trails  --------------------------------------
diff --git a/src/Diagrams/Transform.hs b/src/Diagrams/Transform.hs
--- a/src/Diagrams/Transform.hs
+++ b/src/Diagrams/Transform.hs
@@ -11,6 +11,8 @@
 --
 -----------------------------------------------------------------------------
 
+{-# LANGUAGE TypeFamilies #-}
+
 module Diagrams.Transform
     ( -- * Transformations
       Transformation, inv, transl, apply, papply
@@ -52,5 +54,5 @@
 --   @
 --
 --   for all transformations @t1@ and @t2@.
-under :: Transformable a => (a -> a) -> Transformation (V a) -> a -> a
+under :: (Transformable a, Transformable b, V a ~ V b) => (a -> b) -> Transformation (V a) -> a -> b
 f `under` t = transform (inv t) . f . transform t
diff --git a/src/Diagrams/TwoD.hs b/src/Diagrams/TwoD.hs
--- a/src/Diagrams/TwoD.hs
+++ b/src/Diagrams/TwoD.hs
@@ -65,14 +65,10 @@
        , P2, p2, unp2, mkP2
        , T2
        , unitX, unitY, unit_X, unit_Y
-       , direction, angleBetween, fromDirection
+       , direction, fromDirection
 
          -- * Angles
        , tau
-       , Angle
-       , rad, turn, deg
-       , fullTurn, fullCircle, angleRatio
-       , (@@)
 
          -- * Paths
          -- ** Stroking
@@ -148,24 +144,33 @@
        , arrowHead
        , arrowTail
        , arrowShaft
-       , headSize
-       , tailSize
        , headGap
        , tailGap
-       , gap
-       , headColor
+       , gaps, gap
+       , headTexture
        , headStyle
-       , tailColor
+       , tailTexture
        , tailStyle
-       , shaftColor
+       , shaftTexture
        , shaftStyle
+       , headLength
+       , tailLength
+       , lengths
 
          -- * Text
        , text, topLeftText, alignedText, baselineText
-       , font, fontSize, italic, oblique, bold
+       , font, italic, oblique, bold, fontSize
+       , fontSizeO, fontSizeL, fontSizeN, fontSizeG
 
          -- * Images
-       , Image, image
+       , DImage(..), ImageData(..)
+       , Embedded, External
+       , image
+       , loadImageEmb
+       , loadImageExt
+       , uncheckedImageRef
+       , raster
+       , rasterDia
 
          -- * Transformations
          -- ** Rotation
@@ -233,6 +238,33 @@
          -- ** Adjusting size
        , sized, sizedAs
 
+        -- * Textures
+      , Texture(..), solid 
+      , SpreadMethod(..), GradientStop(..), mkStops, getFillTexture
+      , fillTexture, getLineTexture, lineTexture, lineTextureA
+      , stopFraction, stopColor
+
+      , LGradient(..), lGradStops, lGradTrans, lGradStart, lGradEnd
+      , lGradSpreadMethod, defaultLG, _LG, mkLinearGradient
+
+      , RGradient(..)
+      , rGradStops, rGradCenter0, rGradRadius0, rGradCenter1, rGradRadius1
+      , rGradTrans, rGradSpreadMethod, defaultRG, _RG, mkRadialGradient
+
+        -- ** Colors
+      , fillColor, fc, fcA, recommendFillColor
+      , lineColor, lc, lcA, _SC
+
+       -- ** Width
+       , LineWidth, getLineWidth, lineWidth, lineWidthA
+       , lw, lwN, lwO, lwL, lwG
+       , ultraThin, veryThin, thin, medium, thick, veryThick, ultraThick, none
+       , tiny, verySmall, small, normal, large, veryLarge, huge
+
+       -- ** Dashing
+       , Dashing(..), DashingA, getDashing
+       , dashing, dashingO, dashingL, dashingN, dashingG
+
          -- * Visual aids for understanding the internal model
        , showOrigin
        , showOrigin'
@@ -245,13 +277,14 @@
 import           Diagrams.TwoD.Arc
 import           Diagrams.TwoD.Arrow
 import           Diagrams.TwoD.Arrowheads
+import           Diagrams.TwoD.Attributes
 import           Diagrams.TwoD.Combinators
+import           Diagrams.TwoD.Deform
 import           Diagrams.TwoD.Ellipse
 import           Diagrams.TwoD.Image
 import           Diagrams.TwoD.Model
 import           Diagrams.TwoD.Path
 import           Diagrams.TwoD.Polygons
-import           Diagrams.TwoD.Deform
 import           Diagrams.TwoD.Shapes
 import           Diagrams.TwoD.Size
 import           Diagrams.TwoD.Text
diff --git a/src/Diagrams/TwoD/Adjust.hs b/src/Diagrams/TwoD/Adjust.hs
--- a/src/Diagrams/TwoD/Adjust.hs
+++ b/src/Diagrams/TwoD/Adjust.hs
@@ -1,5 +1,4 @@
-{-# LANGUAGE ViewPatterns
-  #-}
+{-# LANGUAGE Rank2Types #-}
 
 -----------------------------------------------------------------------------
 -- |
@@ -18,27 +17,22 @@
       setDefault2DAttributes
     , adjustDiaSize2D
     , adjustDia2D
-    , adjustSize     -- for backwards compatibility
-    , requiredScale  -- re-exported for backwards compatibility
     ) where
 
-import Diagrams.Core
-
-import Diagrams.Attributes  (lineWidthA, lineColorA, lineCap
-                            , lineJoin, lineMiterLimitA
-                            )
-import Diagrams.Util        ((#))
-
-import Diagrams.TwoD.Types  (R2, p2)
-import Diagrams.TwoD.Size   ( size2D, center2D, SizeSpec2D(..)
-                            , requiredScaleT, requiredScale
-                            )
-import Diagrams.TwoD.Text   (fontSizeA)
-
-import Data.AffineSpace     ((.-.))
-import Data.Semigroup
+import           Diagrams.Attributes      (lineCap, lineJoin,
+                                           lineMiterLimitA)
+import           Diagrams.Core
+import           Diagrams.TwoD.Attributes (lineWidthA, lineTextureA)
+import           Diagrams.TwoD.Size       (SizeSpec2D (..), center2D,
+                                           requiredScale, size2D)
+import           Diagrams.TwoD.Text       (fontSizeA)
+import           Diagrams.TwoD.Types      (R2, T2, p2)
+import           Diagrams.Util            (( # ))
 
-import Data.Default.Class
+import           Control.Lens             (Lens', (&), (.~), (^.))
+import           Data.AffineSpace         ((.-.))
+import           Data.Default.Class
+import           Data.Semigroup
 
 -- | Set default attributes of a 2D diagram (in case they have not
 --   been set):
@@ -55,62 +49,58 @@
 --
 --       * Miter limit 10
 setDefault2DAttributes :: Semigroup m => QDiagram b R2 m -> QDiagram b R2 m
-setDefault2DAttributes d = d # lineWidthA def # lineColorA def # fontSizeA def
+setDefault2DAttributes d = d # lineWidthA def # lineTextureA def # fontSizeA def
                              # lineCap def # lineJoin def # lineMiterLimitA def
 
+
 -- | Adjust the size and position of a 2D diagram to fit within the
---   requested size. The first two arguments specify a method for
---   extracting the requested output size from the rendering options,
---   and a way of updating the rendering options with a new (more
---   specific) size.
+--   requested size. The first argument is a lens into the output
+--   size contained in the rendering options.  Returns an updated
+--   options record, any transformation applied to the diagram (the
+--   inverse of which can be used, say, to translate output/device
+--   coordinates back into local diagram coordinates), and the
+--   modified diagram itself.
 adjustDiaSize2D :: Monoid' m
-                => (Options b R2 -> SizeSpec2D)
-                -> (SizeSpec2D -> Options b R2 -> Options b R2)
+                => Lens' (Options b R2) SizeSpec2D
                 -> b -> Options b R2 -> QDiagram b R2 m
-                -> (Options b R2, QDiagram b R2 m)
-adjustDiaSize2D getSize setSize _ opts d =
+                -> (Options b R2, T2, QDiagram b R2 m)
+adjustDiaSize2D szL _ opts d =
   ( case spec of
-       Dims _ _ -> opts
-       _        -> setSize (uncurry Dims . scale s $ size) opts
-
-  , d # scale s
-      # translate tr
+     Dims _ _ -> opts
+     _        -> opts & szL .~ (uncurry Dims . scale s $ size)
+  , adjustT
+  , d # transform adjustT
   )
-  where spec = getSize opts
+  where spec = opts ^. szL
         size = size2D d
         s    = requiredScale spec size
         finalSz = case spec of
                     Dims w h -> (w,h)
                     _        -> scale s size
         tr = (0.5 *. p2 finalSz) .-. (s *. center2D d)
+        adjustT = translation tr <> scaling s
 
 -- | @adjustDia2D@ provides a useful default implementation of
 --   the 'adjustDia' method from the 'Backend' type class.
 --
---   As its first two arguments it requires a method for extracting
---   the requested output size from the rendering options, and a way
---   of updating the rendering options with a new (more specific) size.
+--   As its first argument it requires a lens into the output size
+--   contained in the rendering options.
 --
 --   It then performs the following adjustments:
 --
 --   * Set default attributes (see 'setDefault2DAttributes')
 --
---   * Freeze the diagram in its final form
---
 --   * Scale and translate the diagram to fit within the requested
 --     size (see 'adjustDiaSize2D')
 --
---   * Also return the actual adjusted size of the diagram.
+--   It returns an updated options record, any transformation applied
+--   to the diagram (the inverse of which can be used, say, to
+--   translate output/device coordinates back into local diagram
+--   coordinates), and the modified diagram itself.
 adjustDia2D :: Monoid' m
-            => (Options b R2 -> SizeSpec2D)
-            -> (SizeSpec2D -> Options b R2 -> Options b R2)
+            => Lens' (Options b R2) SizeSpec2D
             -> b -> Options b R2 -> QDiagram b R2 m
-            -> (Options b R2, QDiagram b R2 m)
-adjustDia2D getSize setSize b opts d
-  = adjustDiaSize2D getSize setSize b opts (d # setDefault2DAttributes # freeze)
+            -> (Options b R2, T2, QDiagram b R2 m)
+adjustDia2D szL b opts d
+  = adjustDiaSize2D szL b opts (d # setDefault2DAttributes)
 
-{-# DEPRECATED adjustSize "Use Diagrams.TwoD.Size.requiredScaleT instead." #-}
--- | Re-export 'requiredScaleT' with the name 'adjustSize' for
---   backwards compatibility.
-adjustSize :: SizeSpec2D -> (Double, Double) -> Transformation R2
-adjustSize = requiredScaleT
diff --git a/src/Diagrams/TwoD/Arc.hs b/src/Diagrams/TwoD/Arc.hs
--- a/src/Diagrams/TwoD/Arc.hs
+++ b/src/Diagrams/TwoD/Arc.hs
@@ -23,6 +23,7 @@
     , annularWedge
     ) where
 
+import           Diagrams.Angle
 import           Diagrams.Core
 import           Diagrams.Located        (at)
 import           Diagrams.Segment
@@ -130,7 +131,7 @@
 --
 --   <<diagrams/src_Diagrams_TwoD_Arc_arc'Ex.svg#diagram=arc'Ex&width=300>>
 --
---   > arc'Ex = mconcat [ arc' r 0 (1/4 \@\@ turn) | r <- [0.5,-1,1.5] ]
+--   > arc'Ex = mconcat [ arc' r (0 @@ turn) (1/4 @@ turn) | r <- [0.5,-1,1.5] ]
 --   >        # centerXY # pad 1.1
 arc' :: (TrailLike p, V p ~ R2) => Double -> Angle -> Angle -> p
 arc' r start end = trailLike $ scale (abs r) ts `at` (rotate start $ p2 (abs r,0))
@@ -143,9 +144,9 @@
 --   <<diagrams/src_Diagrams_TwoD_Arc_wedgeEx.svg#diagram=wedgeEx&width=400>>
 --
 --   > wedgeEx = hcat' (with & sep .~ 0.5)
---   >   [ wedge 1 (0 \@\@ turn) (1/4)
---   >   , wedge 1 (7/30 \@\@ turn) (11/30)
---   >   , wedge 1 (1/8 \@\@ turn) (7/8)
+--   >   [ wedge 1 (0 @@ turn) (1/4 @@ turn)
+--   >   , wedge 1 (7/30 @@ turn) (11/30 @@ turn)
+--   >   , wedge 1 (1/8 @@ turn) (7/8 @@ turn)
 --   >   ]
 --   >   # fc blue
 --   >   # centerXY # pad 1.1
@@ -195,9 +196,9 @@
 --   <<diagrams/src_Diagrams_TwoD_Arc_annularWedgeEx.svg#diagram=annularWedgeEx&width=400>>
 --
 --   > annularWedgeEx = hcat' (with & sep .~ 0.50)
---   >   [ annularWedge 1 0.5 (0 \@\@ turn) (1/4)
---   >   , annularWedge 1 0.3 (7/30 \@\@ turn) (11/30)
---   >   , annularWedge 1 0.7 (1/8 \@\@ turn) (7/8)
+--   >   [ annularWedge 1 0.5 (0 @@ turn) (1/4 @@ turn)
+--   >   , annularWedge 1 0.3 (7/30 @@ turn) (11/30 @@ turn)
+--   >   , annularWedge 1 0.7 (1/8 @@ turn) (7/8 @@ turn)
 --   >   ]
 --   >   # fc blue
 --   >   # centerXY # pad 1.1
diff --git a/src/Diagrams/TwoD/Arrow.hs b/src/Diagrams/TwoD/Arrow.hs
--- a/src/Diagrams/TwoD/Arrow.hs
+++ b/src/Diagrams/TwoD/Arrow.hs
@@ -1,8 +1,10 @@
-{-# LANGUAGE FlexibleContexts      #-}
-{-# LANGUAGE GADTs                 #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TemplateHaskell       #-}
-{-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE DeriveDataTypeable         #-}
+{-# LANGUAGE FlexibleContexts           #-}
+{-# LANGUAGE GADTs                      #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
+{-# LANGUAGE TemplateHaskell            #-}
+{-# LANGUAGE TypeFamilies               #-}
 
 -----------------------------------------------------------------------------
 -- |
@@ -25,14 +27,14 @@
 --
 --   > -- Connecting two diagrams at their origins.
 --   >
---   > sq = square 2 # showOrigin # lc darkgray # lw 0.07
+--   > sq = square 2 # showOrigin # lc darkgray # lw ultraThick
 --   > ds = (sq # named "left") ||| strutX 3 ||| (sq # named "right")
 --   >
 --   > shaft  = cubicSpline False ( map p2 [(0, 0), (1, 0), (1, 0.2), (2, 0.2)])
 --   >
---   > example1 = ds # connect' (with & arrowHead .~ dart & headSize .~ 0.6
---   >                                & tailSize .~ 0.5 & arrowTail .~ quill
---   >                                & shaftStyle %~ lw 0.02 & arrowShaft .~ shaft)
+--   > example1 = ds # connect' (with & arrowHead .~ dart & arrowTail .~ quill
+--   >                                & arrowShaft .~ shaft
+--   >                                & headLength .~ huge & tailLength .~ veryLarge)
 --   >                                "left" "right" # pad 1.1
 
          -- ** Example 2
@@ -41,12 +43,13 @@
 --
 --   > -- Comparing connect, connectPerim, and arrowAt.
 --   >
---   > oct  = octagon 1 # lc darkgray # lw 0.10 # showOrigin
+--   > oct  = octagon 1 # lc darkgray # lw ultraThick # showOrigin
 --   > dias = oct # named "first" ||| strut 3 ||| oct # named "second"
 --   >
 --   > -- Connect two diagrams and two points on their trails.
---   > ex12 = dias # connect "first" "second"
---   >             # connectPerim "first" "second" (15/16 \@\@ turn) (9/16 \@\@ turn)
+--   > ex12 = dias # connect' (with & lengths .~ veryLarge) "first" "second"
+--   >             # connectPerim' (with & lengths .~ veryLarge)
+--   >        "first" "second" (15/16 @@ turn) (9/16 @@ turn)
 --   >
 --   > -- Place an arrow at (0,0) the size and direction of (0,1).
 --   > ex3 = arrowAt origin unit_Y
@@ -76,16 +79,17 @@
        , arrowHead
        , arrowTail
        , arrowShaft
-       , headSize
-       , tailSize
        , headGap
        , tailGap
-       , gap
-       , headColor
+       , gaps, gap
+       , headTexture
        , headStyle
-       , tailColor
+       , headLength
+       , tailTexture
        , tailStyle
-       , shaftColor
+       , tailLength
+       , lengths
+       , shaftTexture
        , shaftStyle
        , straightShaft
 
@@ -94,51 +98,49 @@
        , module Diagrams.TwoD.Arrowheads
        ) where
 
-import           Control.Applicative              ((<*>))
-import           Control.Arrow                    (first)
-import           Control.Lens                     (Lens', Setter', Traversal',
-                                                   generateSignatures,
-                                                   lensRules, makeLensesWith,
-                                                   (%~), (&), (.~), (^.))
+import           Control.Applicative      ((<*>))
+import           Control.Lens             (Lens', Setter', Traversal',
+                                           generateSignatures, lensRules,
+                                           makeLensesWith, (%~), (&), (.~),
+                                           (^.))
 import           Data.AffineSpace
 import           Data.Default.Class
-import           Data.Functor                     ((<$>))
-import           Data.Maybe                       (fromMaybe)
-import           Data.Monoid                      (mempty, (<>))
-import           Data.Monoid.Coproduct            (untangle)
-import           Data.Monoid.Split
-import           Data.Semigroup                   (option)
+import           Data.Functor             ((<$>))
+import           Data.Maybe               (fromMaybe)
+import           Data.Monoid.Coproduct    (untangle)
+import           Data.Semigroup
 import           Data.VectorSpace
 
-import           Data.Colour                      hiding (atop)
-import           Diagrams.Attributes
+import           Data.Colour              hiding (atop)
 import           Diagrams.Core
-import           Diagrams.Core.Types              (QDiaLeaf (..), mkQD')
+import           Diagrams.Core.Types      (QDiaLeaf (..), mkQD')
 
+import           Diagrams.Angle
+import           Diagrams.Attributes
 import           Diagrams.Parametric
 import           Diagrams.Path
-import           Diagrams.Solve                   (quadForm)
-import           Diagrams.Tangent                 (tangentAtEnd, tangentAtStart)
+import           Diagrams.Solve           (quadForm)
+import           Diagrams.Tangent         (tangentAtEnd, tangentAtStart)
 import           Diagrams.Trail
 import           Diagrams.TwoD.Arrowheads
-import           Diagrams.TwoD.Path               (strokeT)
-import           Diagrams.TwoD.Transform          (rotate, translateX)
-import           Diagrams.TwoD.Transform.ScaleInv (scaleInvPrim)
+import           Diagrams.TwoD.Attributes
+import           Diagrams.TwoD.Path       (stroke, strokeT)
+import           Diagrams.TwoD.Transform  (rotate, translateX)
 import           Diagrams.TwoD.Types
-import           Diagrams.TwoD.Vector             (direction, unitX, unit_X)
-import           Diagrams.Util                    (( # ))
+import           Diagrams.TwoD.Vector     (direction, unitX, unit_X)
+import           Diagrams.Util            (( # ))
 
 data ArrowOpts
   = ArrowOpts
     { _arrowHead  :: ArrowHT
     , _arrowTail  :: ArrowHT
     , _arrowShaft :: Trail R2
-    , _headSize   :: Double
-    , _tailSize   :: Double
-    , _headGap    :: Double
-    , _tailGap    :: Double
+    , _headGap    :: Measure R2
+    , _tailGap    :: Measure R2
     , _headStyle  :: Style R2
+    , _headLength :: Measure R2
     , _tailStyle  :: Style R2
+    , _tailLength :: Measure R2
     , _shaftStyle :: Style R2
     }
 
@@ -150,15 +152,15 @@
   def = ArrowOpts
         { _arrowHead    = dart
         , _arrowTail    = noTail
-        , _arrowShaft   = trailFromOffsets [unitX]
-        , _headSize     = 0.3
-        , _tailSize     = 0.3
-        , _headGap      = 0
-        , _tailGap      = 0
+        , _arrowShaft   = straightShaft
+        , _headGap      = none
+        , _tailGap      = none
 
         -- See note [Default arrow style attributes]
         , _headStyle    = mempty
+        , _headLength     = normal
         , _tailStyle    = mempty
+        , _tailLength     = normal
         , _shaftStyle   = mempty
         }
 
@@ -173,21 +175,22 @@
 -- | The trail to use for the arrow shaft.
 arrowShaft :: Lens' ArrowOpts (Trail R2)
 
--- | Radius of a circumcircle around the head.
-headSize :: Lens' ArrowOpts Double
-
--- | Radius of a circumcircle around the tail.
-tailSize :: Lens' ArrowOpts Double
-
 -- | Distance to leave between the head and the target point.
-headGap :: Lens' ArrowOpts Double
+headGap :: Lens' ArrowOpts (Measure R2)
 
 -- | Distance to leave between the starting point and the tail.
-tailGap :: Lens' ArrowOpts Double
+tailGap :: Lens' ArrowOpts (Measure R2)
 
-gap :: Traversal' ArrowOpts Double
-gap f opts = (\h t -> opts & headGap .~ h & tailGap .~ t) <$> f (opts ^. headGap) <*> f (opts ^. tailGap)
+-- | Set both the @headGap@ and @tailGap@ simultaneously.
+gaps :: Traversal' ArrowOpts (Measure R2) 
+gaps f opts = (\h t -> opts & headGap .~ h & tailGap .~ t)
+        <$> f (opts ^. headGap)
+        <*> f (opts ^. tailGap)
 
+-- | Same as gaps, provided for backward compatiiblity.
+gap :: Traversal' ArrowOpts (Measure R2)
+gap = gaps
+
 -- | Style to apply to the head. @headStyle@ is modified by using the lens
 --   combinator @%~@ to change the current style. For example, to change
 --   an opaque black arrowhead to translucent orange:
@@ -200,37 +203,36 @@
 -- | Style to apply to the shaft. See `headStyle`.
 shaftStyle :: Lens' ArrowOpts (Style R2)
 
--- | A lens for setting or modifying the color of an arrowhead. For
---   example, one may write @... (with & headColor .~ blue)@ to get an
---   arrow with a blue head, or @... (with & headColor %~ blend 0.5
---   white)@ to make an arrow's head a lighter color.  For more general
---   control over the style of arrowheads, see 'headStyle'.
---
---   Note that the most general type of @headColor@ would be
---
--- @
---   (Color c, Color c') => Setter ArrowOpts ArrowOpts c c'
--- @
---
---   but that can cause problems for type inference when setting the
---   color.  However, using it at that more general type may
---   occasionally be useful, for example, if you want to apply some
---   opacity to a color, as in @... (with & headColor %~
---   (\`withOpacity\` 0.5))@.  If you want the more general type, you
---   can use @'headStyle' . 'styleFillColor'@ in place of @headColor@.
-headColor :: Color c => Setter' ArrowOpts c
-headColor = headStyle . styleFillColor
+-- | The length from the start of the joint to the tip of the head.
+headLength :: Lens' ArrowOpts (Measure R2)
 
--- | A lens for setting or modifying the color of an arrow
---   tail. See 'headColor'.
-tailColor :: Color c => Setter' ArrowOpts c
-tailColor = tailStyle . styleFillColor
+-- | The length of the tail plus its joint. 
+tailLength :: Lens' ArrowOpts (Measure R2)
 
--- | A lens for setting or modifying the color of an arrow
---   shaft. See 'headColor'.
-shaftColor :: Color c => Setter' ArrowOpts c
-shaftColor = shaftStyle . styleLineColor
+-- | Set both the @headLength@ and @tailLength@ simultaneously.
+lengths :: Traversal' ArrowOpts (Measure R2)
+lengths f opts = (\h t -> opts & headLength .~ h & tailLength .~ t) <$> f (opts ^. headLength)
+             <*> f (opts ^. tailLength)
 
+-- | A lens for setting or modifying the texture of an arrowhead. For
+--   example, one may write @... (with & headTexture .~ grad)@ to get an
+--   arrow with a head filled with a gradient, assuming grad has been
+--   defined. Or @... (with & headTexture .~ solid blue@ to set the head
+--   color to blue. For more general control over the style of arrowheads,
+--   see 'headStyle'.
+headTexture :: Setter' ArrowOpts Texture
+headTexture = headStyle . styleFillTexture
+
+-- | A lens for setting or modifying the texture of an arrow
+--   tail.
+tailTexture :: Setter' ArrowOpts Texture
+tailTexture = tailStyle . styleFillTexture
+
+-- | A lens for setting or modifying the texture of an arrow
+--   shaft.
+shaftTexture :: Setter' ArrowOpts Texture
+shaftTexture = shaftStyle . styleLineTexture
+
 -- Set the default shaft style of an `ArrowOpts` record by applying the
 -- default style after all other styles have been applied.
 -- The semigroup stucture of the lw attribute will insure that the default
@@ -246,6 +248,10 @@
 tailSty :: ArrowOpts -> Style R2
 tailSty opts = fc black (opts^.tailStyle)
 
+fromMeasure :: Double -> Double -> Measure R2 -> Double
+fromMeasure g n m = u
+  where Output u = toOutput g n m
+
 -- | Calculate the length of the portion of the horizontal line that passes
 --   through the origin and is inside of p.
 xWidth :: (Traced t, V t ~ R2) => t -> Double
@@ -255,45 +261,52 @@
     b = fromMaybe 0 (magnitude <$> traceV origin unit_X p)
 
 -- | Get the line color from the shaft to use as the fill color for the joint.
-colorJoint :: Style v -> Style v
+--   And set the opacity of the shaft to the current opacity.
+colorJoint :: Style R2 -> Style R2
 colorJoint sStyle =
-    let c = fmap getLineColor . getAttr $ sStyle in
-    case c of
-        Nothing -> fillColor (black :: Colour Double)   -- default color for joints
-                   $ mempty
-        Just c' -> fillColor c' $ mempty
+    let c = fmap getLineTexture . getAttr $ sStyle
+        o = fmap getOpacity . getAttr $ sStyle
+    in
+    case (c, o) of
+        (Nothing, Nothing) -> fillColor (black :: Colour Double) $ mempty
+        (Just t, Nothing) -> fillTexture t $ mempty
+        (Nothing, Just o') -> opacity o' . fillColor (black :: Colour Double)  $ mempty
+        (Just t, Just o') -> opacity o' . fillTexture t $ mempty
 
 -- | Get line width from a style.
-widthOfJoint :: Style v -> Double
-widthOfJoint sStyle =
-    let w = fmap getLineWidth . getAttr $ sStyle in
-    case w of
-        Nothing -> 0.01 -- this case should never happen.
-        Just w' -> w'
+widthOfJoint :: Style v -> Double -> Double  -> Double
+widthOfJoint sStyle gToO nToO =
+  maybe (fromMeasure gToO nToO (Output 1)) -- Should be same as default line width
+        (fromMeasure gToO nToO)
+        (fmap getLineWidth . getAttr $ sStyle)
 
 -- | Combine the head and its joint into a single scale invariant diagram
 --   and move the origin to the attachment point. Return the diagram
 --   and its width.
-mkHead :: Renderable (Path R2) b => ArrowOpts -> (Diagram b R2, Double)
-mkHead opts = ( (j <> h) # moveOriginBy (jWidth *^ unit_X) # lw 0
+mkHead :: Renderable (Path R2) b =>
+          Double -> ArrowOpts -> Double -> Double -> (Diagram b R2, Double)
+mkHead size opts gToO nToO = ((j <> h) # moveOriginBy (jWidth *^ unit_X) # lwO 0
               , hWidth + jWidth)
   where
-    (h', j') = (opts^.arrowHead) (opts^.headSize) (widthOfJoint $ shaftSty opts)
+    (h', j') = (opts^.arrowHead) size
+               (widthOfJoint (shaftSty opts) gToO nToO)
     hWidth = xWidth h'
     jWidth = xWidth j'
-    h = scaleInvPrim h' unitX # applyStyle (headSty opts)
-    j = scaleInvPrim j' unitX # applyStyle (colorJoint (opts^.shaftStyle))
+    h = stroke h' # applyStyle (headSty opts)
+    j = stroke j' # applyStyle (colorJoint (opts^.shaftStyle))
 
 -- | Just like mkHead only the attachment point is on the right.
-mkTail :: Renderable (Path R2) b => ArrowOpts -> (Diagram b R2, Double)
-mkTail opts = ( (t <> j) # moveOriginBy (jWidth *^ unitX) # lw 0
+mkTail :: Renderable (Path R2) b =>
+          Double -> ArrowOpts -> Double -> Double -> (Diagram b R2, Double)
+mkTail size opts gToO nToO = ((t <> j) # moveOriginBy (jWidth *^ unitX) # lwO 0
               , tWidth + jWidth)
   where
-    (t', j') = (opts^.arrowTail) (opts^.tailSize) (widthOfJoint $ shaftSty opts)
+    (t', j') = (opts^.arrowTail) size
+               (widthOfJoint (shaftSty opts) gToO nToO)
     tWidth = xWidth t'
     jWidth = xWidth j'
-    t = scaleInvPrim t' unitX # applyStyle (tailSty opts)
-    j = scaleInvPrim j' unitX # applyStyle (colorJoint (opts^.shaftStyle))
+    t = stroke t' # applyStyle (tailSty opts)
+    j = stroke j' # applyStyle (colorJoint (opts^.shaftStyle))
 
 -- | Make a trail with the same angles and offset as an arrow with tail width
 --   tw, head width hw and shaft of tr, such that the magnituted of the shaft
@@ -337,6 +350,16 @@
     hv = hw *^ (tangentAtEnd   tr # normalized)
     v  = trailOffset tr
 
+-- Calculate the approximate envelope of a horizontal arrow
+-- as if the arrow were made only of a shaft.
+arrowEnv :: ArrowOpts -> Double -> Envelope R2
+arrowEnv opts len = getEnvelope horizShaft
+  where
+    horizShaft = shaft # rotate (negateV direction v) # scale (len / m)
+    m = magnitude v
+    v = trailOffset shaft
+    shaft = opts ^. arrowShaft
+
 -- | @arrow len@ creates an arrow of length @len@ with default
 --   parameters, starting at the origin and ending at the point
 --   @(len,0)@.
@@ -350,15 +373,13 @@
 arrow' :: Renderable (Path R2) b => ArrowOpts -> Double -> Diagram b R2
 arrow' opts len = mkQD' (DelayedLeaf delayedArrow)
 
-    -- We must approximate the envelope and trace by just drawing the
-    -- arrow from the origin to (len,0) and using its envelope and
-    -- trace.  That may not end up being exactly right (if the arrow
-    -- gets scaled, the shaft may get a bit longer or shorter, and so
-    -- on) but it's close enough.
-    (getEnvelope approx) (getTrace approx) mempty mempty
+      -- Currently arrows have an empty envelope and trace.
+      (arrowEnv opts len) mempty mempty mempty
+
   where
 
-    -- Once we learn the global transformation context this arrow is
+    -- Once we learn the global transformation context (da) and the two scale
+    -- factors, normal to output (n) and global to output (g), this arrow is
     -- drawn in, we can apply it to the origin and (len,0) to find out
     -- the actual final points between which this arrow should be
     -- drawn.  We need to know this to draw it correctly, since the
@@ -366,22 +387,12 @@
     -- between which we need to draw the shaft do not transform
     -- uniformly as the transformation applied to the entire arrow.
     -- See https://github.com/diagrams/diagrams-lib/issues/112.
-    delayedArrow da =
-
-      -- Note we only take the *unfrozen* transformation.  The frozen
-      -- transformation *do* affect scale-invariant objects like
-      -- arrowheads, and will still be higher up in the tree (so we
-      -- don't need to apply it here).
-      let (unfrozenTr, globalSty) = option mempty (first unsplitR . untangle) . fst $ da
-      in  dArrow globalSty unfrozenTr len
-
-    unsplitR (M    m) = m
-    unsplitR (_ :| m) = m
-
-    approx = dArrow mempty mempty len
+    delayedArrow da g n =
+      let (trans, globalSty) = option mempty untangle . fst $ da
+      in  dArrow globalSty trans len g n
 
     -- Build an arrow and set its endpoints to the image under tr of origin and (len,0).
-    dArrow sty tr ln = (h' <> t' <> shaft)
+    dArrow sty tr ln gToO nToO = (h' <> t' <> shaft)
                # moveOriginBy (tWidth *^ (unit_X # rotate tAngle))
                # rotate (direction (q .-. p) ^-^ dir)
                # moveTo p
@@ -393,15 +404,22 @@
         -- Use the existing line color for head, tail, and shaft by
         -- default (can be overridden by explicitly setting headStyle,
         -- tailStyle, or shaftStyle).
-        globalLC = getLineColor <$> getAttr sty
+        globalLC = getLineTexture <$> getAttr sty
         opts' = opts
-          & headStyle  %~ maybe id fillColor globalLC
-          & tailStyle  %~ maybe id fillColor globalLC
-          & shaftStyle %~ maybe id lineColor globalLC
+          & headStyle  %~ maybe id fillTexture globalLC
+          & tailStyle  %~ maybe id fillTexture globalLC
+          & shaftStyle %~ maybe id lineTexture globalLC
 
+        -- The head size, tail size, head gap, and tail gap are obtained
+        -- from the style and converted to output units.
+        hSize = fromMeasure gToO nToO (opts ^. headLength)
+        tSize = fromMeasure gToO nToO (opts ^. tailLength)
+        hGap = fromMeasure gToO nToO (opts ^. headGap)
+        tGap = fromMeasure gToO nToO (opts ^. tailGap)
+
         -- Make the head and tail and save their widths.
-        (h, hWidth') = mkHead opts'
-        (t, tWidth') = mkTail opts'
+        (h, hWidth') = mkHead hSize opts' gToO nToO
+        (t, tWidth') = mkTail tSize opts' gToO nToO
 
         rawShaftTrail = opts^.arrowShaft
         shaftTrail
@@ -414,8 +432,8 @@
           # transform tr
 
         -- Adjust the head width and tail width to take gaps into account
-        tWidth = tWidth' + opts^.tailGap
-        hWidth = hWidth' + opts^.headGap
+        tWidth = tWidth' + tGap
+        hWidth = hWidth' + hGap
 
         -- Calculate the angles that the head and tail should point.
         tAngle = direction . tangentAtStart $ shaftTrail
@@ -459,7 +477,8 @@
 arrowAt'
   :: Renderable (Path R2) b =>
      ArrowOpts -> P2 -> R2 -> Diagram b R2
-arrowAt' opts s v = arrow' opts len # rotate dir # moveTo s
+arrowAt' opts s v = arrow' opts len
+                  # rotate dir # moveTo s
   where
     len = magnitude v
     dir = direction v
diff --git a/src/Diagrams/TwoD/Arrowheads.hs b/src/Diagrams/TwoD/Arrowheads.hs
--- a/src/Diagrams/TwoD/Arrowheads.hs
+++ b/src/Diagrams/TwoD/Arrowheads.hs
@@ -22,7 +22,7 @@
        , dart
        , spike
        , thorn
-       , missile
+       , lineHead
        , noHead
 
        -- ** Configurable arrowheads
@@ -33,7 +33,6 @@
        , arrowheadDart
        , arrowheadSpike
        , arrowheadThorn
-       , arrowheadMissile
 
        -- * Arrow tails
        -- ** Standard arrow tails
@@ -41,7 +40,7 @@
        , dart'
        , spike'
        , thorn'
-       , missile'
+       , lineTail
        , noTail
        , quill
        , block
@@ -55,19 +54,20 @@
        , ArrowHT
        ) where
 
-import           Control.Lens            ((&), (.~))
+import           Control.Lens            ((&), (.~), (^.))
 import           Data.AffineSpace
 import           Data.Default.Class
-import           Data.Functor            ((<$>))
-import           Data.Maybe              (fromMaybe)
 import           Data.Monoid             (mempty, (<>))
 import           Data.VectorSpace
 
+import           Diagrams.Angle
 import           Diagrams.Core
-import           Diagrams.CubicSpline    (cubicSpline)
+
+import           Diagrams.Coordinates    ((^&))
 import           Diagrams.Path
 import           Diagrams.Segment
 import           Diagrams.Trail
+import           Diagrams.TrailLike      (fromOffsets)
 import           Diagrams.TwoD.Align
 import           Diagrams.TwoD.Arc       (arc')
 import           Diagrams.TwoD.Path      ()
@@ -75,139 +75,115 @@
 import           Diagrams.TwoD.Shapes
 import           Diagrams.TwoD.Transform
 import           Diagrams.TwoD.Types
-import           Diagrams.TwoD.Vector    (e, unitX, unit_X)
+import           Diagrams.TwoD.Vector    (fromDirection, direction, unit_X)
 import           Diagrams.Util           (( # ))
 
 -----------------------------------------------------------------------------
 
 type ArrowHT = Double -> Double -> (Path R2, Path R2)
 
-htRadius :: Double
-htRadius = 0.5
-
-scaleR :: (Transformable t, Scalar (V t) ~ Double) => t -> t
-scaleR = scale htRadius
-
-unit_X2 :: R2
-unit_X2 = scaleR unit_X
-
 closedPath :: (Floating (Scalar v), Ord (Scalar v), InnerSpace v) => Trail v -> Path v
 closedPath = pathFromTrail . closeTrail
 
 -- Heads ------------------------------------------------------------------
---   > drawHead h = arrowAt' (with & arrowHead .~ h & shaftStyle %~ lw 0)
+--   > drawHead h = arrowAt' (with & arrowHead .~ h & shaftStyle %~ lw none)
 --   >         origin (r2 (0.001, 0))
---   >      <> square 0.5 # alignL # lw 0
+--   >      <> square 0.5 # alignL # lw none
 
 -- | Isoceles triangle style. The above example specifies an angle of `2/5 Turn`.
 
 -- | <<diagrams/src_Diagrams_TwoD_Arrowheads_tri25Ex.svg#diagram=tri25Ex&width=120>>
 
---   > tri25Ex = arrowAt' (with & arrowHead .~ arrowheadTriangle (2/5 \@\@ turn) & shaftStyle %~ lw 0)
+--   > tri25Ex = arrowAt' (with & arrowHead .~ arrowheadTriangle (2/5 @@ turn) & shaftStyle %~ lw none)
 --   >           origin (r2 (0.001, 0))
---   >        <> square 0.6 # alignL # lw 0
+--   >        <> square 0.6 # alignL # lw none
 arrowheadTriangle :: Angle -> ArrowHT
 arrowheadTriangle theta = aHead
   where
-    aHead size _ = (p, mempty)
+    aHead len _ = (p, mempty)
       where
+        psi = pi - (theta ^. rad)
+        r = len / (1 + cos psi)
         p = polygon (def & polyType .~ PolyPolar [theta, (negateV 2 *^ theta)]
-            (repeat (htRadius * size)) & polyOrient .~ NoOrient)  # alignL
+            (repeat r) & polyOrient .~ NoOrient)  # alignL
 
+
 -- | Isoceles triangle with linear concave base. Inkscape type 1 - dart like.
 arrowheadDart :: Angle -> ArrowHT
-arrowheadDart theta = aHead
+arrowheadDart theta len shaftWidth = (hd # scale size, jt)
   where
-    aHead size shaftWidth = (dartP # moveOriginTo (dartVertices !! 2), joint)
-      where
-        r = htRadius * size
-        dartP = polygon
-                ( def & polyType .~ PolyPolar [theta, (1/2 @@ turn) ^-^ theta, (1/2 @@ turn) ^-^ theta]
-                                              [r, r, 0.1 * size, r]
-                      & polyOrient .~ NoOrient
-                )
-        dartVertices =  (concat . pathVertices) $ dartP
-        m = magnitude (dartVertices !! 1 .-. dartVertices !! 3)
-        s = 1 - shaftWidth / m
-        v1 = (dartVertices !! 1 .-. dartVertices !! 2) # scale s
-        v2 = (dartVertices !! 3 .-. dartVertices !! 2) # scale s
-        joint = (closedPath $ trailFromVertices [ dartVertices !! 2
-                             , dartVertices !! 1 .-^ v1
-                             , dartVertices !! 3 .-^ v2
-                             , dartVertices !! 2 ]) # alignR
+    hd = snugL . pathFromTrail . glueTrail $ fromOffsets [t1, t2, b2, b1]
+    jt = pathFromTrail . glueTrail $ j <> reflectY j
+    j = closeTrail $ fromOffsets [(-jLength ^& 0), (0 ^& shaftWidth / 2)]
+    v = fromDirection theta
+    (t1, t2) = (unit_X ^+^ v, (-0.5 ^& 0) ^-^ v)
+    [b1, b2] = map (reflectY . negateV) [t1, t2]
+    psi = pi - (direction . negateV $ t2) ^. rad
+    jLength = shaftWidth / (2 * tan psi)
 
+    -- If the shaft if too wide, set the size to a default value of 1.
+    size = max 1 ((len - jLength) / (1.5))
+
 -- | Isoceles triangle with curved concave base. Inkscape type 2.
 arrowheadSpike :: Angle -> ArrowHT
-arrowheadSpike theta = aHead
+arrowheadSpike theta len shaftWidth  = (hd # scale r, jt # scale r)
   where
-    aHead size shaftWidth = (barb # moveOriginBy (m *^ unit_X) , joint)
-      where
-        a  = e theta # scaleR
-        a' = reflectY a
-        l1 = trailFromSegments [straight (unit_X2 ^+^ a)]
-        l2 = trailFromSegments [reverseSegment . straight $ (unit_X2 ^+^ a')]
-        c  = reflectX $ arc' htRadius theta (negateV theta)
-        barb = (closedPath $ (l1 <> c <> l2)) # scale size
-        m = xWidth barb --c `atParam` 0.5
-        b =  asin ((shaftWidth / 2) / (htRadius  * size)) @@ rad
-        c' = arc' htRadius (negateV b) b # scale size
-        joint = (closedPath $ (c')) # centerY # alignR
-        xWidth p = pa + pb
-          where
-            pa = fromMaybe 0 (magnitude <$> traceV origin unitX p)
-            pb = fromMaybe 0 (magnitude <$> traceV origin unit_X p)
+    hd = snugL . closedPath $ l1 <> c <> l2
+    jt = alignR . centerY . pathFromTrail
+                . closeTrail $ arc' 1 (negateV phi) phi
+    l1 = trailFromSegments [straight $ unit_X ^+^ v]
+    l2 = trailFromSegments [reverseSegment . straight $ (unit_X ^+^ (reflectY v))]
+    c = reflectX $ arc' 1 theta (negateV theta)
+    v = fromDirection theta
 
+    -- The length of the head without its joint is, -2r cos theta and
+    -- the length of the joint is r - sqrt (r^2 - y^2). So the total
+    -- length of the arrow head is given by r(1 - 2 cos theta)-sqrt (r^2-y^2).
+    -- Solving the quadratic gives two roots, we want the larger one.
+
+    -- 1/4 turn < theta < 2/3 turn.
+    a = 1 - 2 * cos (theta ^. rad)
+    y = shaftWidth / 2
+
+    -- If the shaft is too wide for the head, we default the radius r to
+    -- 2/3 * len by setting d=1 and phi=pi/2.
+    d = max 1 (len**2 + (1 - a**2) * y**2)
+    r = (a * len + sqrt d) / (a**2 -1)
+    phi = asin (min 1 (y/r)) @@ rad
+
 -- | Curved sides, linear concave base. Illustrator CS5 #3
-arrowheadThorn :: Angle -> Double -> ArrowHT
-arrowheadThorn theta r = aHead
+arrowheadThorn :: Angle -> ArrowHT
+arrowheadThorn theta len shaftWidth = (hd # scale size, jt)
   where
-    aHead size shaftWidth = (thornP # moveOriginTo (thornVertices !! 2), joint)
-      where
-        a  = e theta # scaleR
-        c1 = curvedSide theta
-        l1 = straight $ (reflectY a) ^-^ (unit_X2 # scale r)
-        l2 = straight $ unit_X2 # scale r ^-^ a
-        c2 = c1 # rotate (negateV theta)
-        thornP = (closedPath $ trailFromSegments [c1, l1, l2, c2]) # scale size
-        thornVertices =  (concat . pathVertices) $ thornP
-        m = magnitude (thornVertices !! 1 .-. thornVertices !! 3)
-        s = 1 - shaftWidth / m
-        v1 = (thornVertices !! 1 .-. thornVertices !! 2) # scale s
-        v2 = (thornVertices !! 3 .-. thornVertices !! 2) # scale s
-        joint = (closedPath $ trailFromVertices [ thornVertices !! 2
-                             , thornVertices !! 1 .-^ v1
-                             , thornVertices !! 3 .-^ v2
-                             , thornVertices !! 2 ]) # alignR
+    hd = snugL . pathFromTrail . glueTrail $ hTop <> reflectY hTop
+    hTop = closeTrail . trailFromSegments $ [c, l]
+    jt = pathFromTrail . glueTrail $ j <> reflectY j
+    j = closeTrail $ fromOffsets [(-jLength ^& 0), (0 ^& shaftWidth / 2)]
+    c = curvedSide theta
+    v = fromDirection theta
+    l = reverseSegment . straight $ t
+    t = v ^-^ (-0.5 ^& 0)
+    psi = pi - (direction . negateV $ t) ^. rad
+    jLength = shaftWidth / (2 * tan psi)
 
+    -- If the shaft if too wide, set the size to a default value of 1.    
+    size = max 1 ((len - jLength) / (1.5))
+
 -- | Make a side for the thorn head.
 curvedSide :: Angle -> Segment Closed R2
 curvedSide theta = bezier3 ctrl1 ctrl2 end
   where
-    v0    = scaleR unit_X
-    v1    = e theta # scaleR
-    ctrl1 = v0 # scaleR
-    ctrl2 = v0 ^+^ (v1 # scaleR)
+    v0    = unit_X
+    v1    = fromDirection theta
+    ctrl1 = v0
+    ctrl2 = v0 ^+^ v1
     end   = v0 ^+^ v1
 
--- | Transform an arrowhead/tail by fitting a cubic spline to it's vertices.
---   XXX Rear vertices of the arrowhead will extend outside of the unit circle.
---   XXX and the joint is a rectancgle as opposed to the correct shape.
-smoothArrowhead :: ArrowHT -> ArrowHT
-smoothArrowhead f = aHead
-  where
-    aHead size shaftWidth = (h, j)
-      where
-        (h', _) = f size shaftWidth
-        h = smooth $ pathVertices h'
-        -- XXX replace square joint with actual shape
-        j = square shaftWidth # scaleX 0.25 alignR
-        smooth [] = mempty
-        smooth (x:xs) = cubicSpline True x <> smooth xs
-
-arrowheadMissile :: Angle -> ArrowHT
-arrowheadMissile theta = smoothArrowhead $ arrowheadDart theta
-
 -- Standard heads ---------------------------------------------------------
+-- | A line the same width as the shaft.
+lineHead :: ArrowHT
+lineHead s w = (square 1 # scaleX s # scaleY w # alignL, mempty)
+
 noHead :: ArrowHT
 noHead _ _ = (mempty, mempty)
 
@@ -227,7 +203,7 @@
 
 --   > thornEx = drawHead thorn
 thorn :: ArrowHT
-thorn = arrowheadThorn (3/8 @@ turn) 1
+thorn = arrowheadThorn (3/8 @@ turn) 
 
 -- | <<diagrams/src_Diagrams_TwoD_Arrowheads_dartEx.svg#diagram=dartEx&width=100>>
 
@@ -235,16 +211,10 @@
 dart :: ArrowHT
 dart = arrowheadDart (2/5 @@ turn)
 
--- | <<diagrams/src_Diagrams_TwoD_Arrowheads_missileEx.svg#diagram=missileEx&width=100>>
-
---   > missileEx = drawHead missile
-missile :: ArrowHT
-missile = arrowheadMissile (2/5 @@ turn)
-
 -- Tails ------------------------------------------------------------------
---   > drawTail t = arrowAt' (with  & arrowTail .~ t & shaftStyle %~ lw 0 & arrowHead .~ noHead)
+--   > drawTail t = arrowAt' (with  & arrowTail .~ t & shaftStyle %~ lw none & arrowHead .~ noHead)
 --   >         origin (r2 (0.001, 0))
---   >      <> square 0.5 # alignL # lw 0
+--   >      <> square 0.5 # alignL # lw none
 
 -- | Utility function to convert any arrowhead to an arrowtail, i.e.
 --   attached at the start of the trail.
@@ -260,29 +230,28 @@
 arrowtailBlock :: Angle -> ArrowHT
 arrowtailBlock theta = aTail
   where
-   aTail size _ = (t, mempty)
+   aTail len _ = (t, mempty)
       where
-        t = square 1 # scaleX x # scaleY y # scale size # alignR
-        a'  = e theta # scaleR
+        t = rect len (len * x) # alignR
+        a'  = fromDirection theta
         a = a' ^-^ (reflectY a')
-        y = magnitude a
-        b = a' ^-^ (reflectX a')
-        x = magnitude b
+        x = magnitude a
 
 -- | The angle is where the top left corner intersects the circle.
 arrowtailQuill :: Angle -> ArrowHT
-arrowtailQuill theta =aTail
+arrowtailQuill theta = aTail
   where
-   aTail size shaftWidth = (t, j)
+   aTail len shaftWidth = (t, j)
       where
         t = ( closedPath $ trailFromVertices [v0, v1, v2, v3, v4, v5, v0] )
             # scale size # alignR
+        size = len / 0.6
         v0 = p2 (0.5, 0)
-        v2 = p2 (unr2 $ e theta # scaleR)
-        v1 = v2 # translateX (5/4 * htRadius)
+        v2 = p2 (unr2 $ fromDirection theta # scale 0.5)
+        v1 = v2 # translateX (5/8)
         v3 = p2 (-0.1, 0)
         v4 = v2 # reflectY
-        v5 = v4 # translateX (5/4 * htRadius)
+        v5 = v4 # translateX (5/8)
         s = 1 - shaftWidth / magnitude (v1 .-. v5)
         n1 = v0 # translateY (0.5 * shaftWidth)
         n2 = v1 .-^ ((v1 .-. v0) # scale s)
@@ -292,6 +261,9 @@
                 [ v0, n1, n2, v0, n3, n4, v0 ])
 
 -- Standard tails ---------------------------------------------------------
+-- | A line the same width as the shaft.
+lineTail :: ArrowHT
+lineTail s w = (square 1 # scaleY w # scaleX s # alignR, mempty)
 
 noTail :: ArrowHT
 noTail _ _ = (mempty, mempty)
@@ -320,12 +292,6 @@
 dart' :: ArrowHT
 dart' = headToTail dart
 
--- | <<diagrams/src_Diagrams_TwoD_Arrowheads_missile'Ex.svg#diagram=missile'Ex&width=100>>
-
---   > missile'Ex = drawTail missile'
-missile' :: ArrowHT
-missile' = headToTail missile
-
 -- | <<diagrams/src_Diagrams_TwoD_Arrowheads_quillEx.svg#diagram=quillEx&width=100>>
 
 --   > quillEx = drawTail quill
@@ -336,4 +302,4 @@
 
 --   > blockEx = drawTail block
 block :: ArrowHT
-block = arrowtailBlock (2/5 @@ turn)
+block = arrowtailBlock (7/16 @@ turn)
diff --git a/src/Diagrams/TwoD/Attributes.hs b/src/Diagrams/TwoD/Attributes.hs
new file mode 100644
--- /dev/null
+++ b/src/Diagrams/TwoD/Attributes.hs
@@ -0,0 +1,514 @@
+{-# LANGUAGE DeriveDataTypeable         #-}
+{-# LANGUAGE ExistentialQuantification  #-}
+{-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE ScopedTypeVariables        #-}
+{-# LANGUAGE TemplateHaskell            #-}
+{-# LANGUAGE TypeFamilies               #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Diagrams.TwoD.Attributes
+-- Copyright   :  (c) 2013 diagrams-lib team (see LICENSE)
+-- License     :  BSD-style (see LICENSE)
+-- Maintainer  :  diagrams-discuss@googlegroups.com
+--
+-- Diagrams may have /attributes/ which affect the way they are
+-- rendered. This module defines /Textures/ (Gradients and Colors) in two
+-- dimensions. Like the attriubtes defined in the Diagrams.Attributes module,
+-- all attributes defined here use the 'Last' or 'Recommend' /semigroup/ structure.
+-- 'FillColor' and 'LineColor' attributes are provided so that backends that
+-- don't support gradients need not be concerned with using textures. Backends
+-- should only implement color attributes or textures attributes, not both.
+--
+-----------------------------------------------------------------------------
+
+module Diagrams.TwoD.Attributes (
+    -- ** Width
+    LineWidth, getLineWidth, lineWidth, lineWidthA
+  , lw, lwN, lwO, lwL, lwG
+  , ultraThin, veryThin, thin, medium, thick, veryThick, ultraThick, none
+  , tiny, verySmall, small, normal, large, veryLarge, huge
+
+    -- ** Dashing
+  , Dashing(..), DashingA, getDashing
+  , dashing, dashingN, dashingO, dashingL, dashingG
+
+  -- * Textures
+  , Texture(..), solid, _SC, _LG, _RG, defaultLG, defaultRG
+  , GradientStop(..), stopColor, stopFraction, mkStops
+  , SpreadMethod(..), lineLGradient, lineRGradient
+
+  -- ** Linear Gradients
+  , LGradient(..), lGradStops, lGradTrans, lGradStart, lGradEnd
+  , lGradSpreadMethod, mkLinearGradient
+
+  -- ** Radial Gradients
+  , RGradient(..), rGradStops, rGradTrans
+  , rGradCenter0, rGradRadius0, rGradCenter1, rGradRadius1
+  , rGradSpreadMethod, mkRadialGradient
+
+  -- ** Line texture
+  ,  LineTexture(..), getLineTexture, lineTexture, lineTextureA
+  ,  mkLineTexture, styleLineTexture
+
+  -- ** Line color
+  , lineColor, lc, lcA
+
+  -- ** Fill texture
+  , FillTexture(..), getFillTexture, fillTexture
+  , mkFillTexture, styleFillTexture
+
+  -- ** Fill color
+  , fillColor, fc, fcA, recommendFillColor
+
+  -- * Compilation utilities
+  , splitTextureFills
+
+  ) where
+
+import           Diagrams.Core
+import           Diagrams.Core.Style         (setAttr)
+import           Diagrams.Attributes
+import           Diagrams.Attributes.Compile
+import           Diagrams.TwoD.Types
+
+import           Diagrams.Core.Types         (RTree)
+import           Diagrams.Located            (unLoc)
+import           Diagrams.Path               (Path, pathTrails)
+import           Diagrams.Trail              (isLoop)
+
+import           Control.Lens ( makeLensesWith, generateSignatures, lensRules
+                              , makePrisms, Lens', (&), (%~), (.~), Setter', sets)
+
+import           Data.Colour hiding (AffineSpace)
+import           Data.Data
+import           Data.Default.Class
+import           Data.Maybe                  (fromMaybe)
+
+import           Data.Monoid.Recommend
+import           Data.Semigroup
+
+-- | Standard 'Measures'.
+none, ultraThin, veryThin, thin, medium, thick, veryThick, ultraThick,
+  tiny, verySmall, small, normal, large, veryLarge, huge :: Measure R2
+none       = Output 0
+ultraThin  = Normalized 0.0005 `atLeast` Output 0.5
+veryThin   = Normalized 0.001  `atLeast` Output 0.5
+thin       = Normalized 0.002  `atLeast` Output 0.5
+medium     = Normalized 0.004  `atLeast` Output 0.5
+thick      = Normalized 0.0075 `atLeast` Output 0.5
+veryThick  = Normalized 0.01   `atLeast` Output 0.5
+ultraThick = Normalized 0.02   `atLeast` Output 0.5
+
+tiny      = Normalized 0.01
+verySmall = Normalized 0.015
+small     = Normalized 0.023
+normal    = Normalized 0.035
+large     = Normalized 0.05
+veryLarge = Normalized 0.07
+huge      = Normalized 0.10
+
+-----------------------------------------------------------------
+--  Line Width  -------------------------------------------------
+-----------------------------------------------------------------
+
+-- | Line widths specified on child nodes always override line widths
+--   specified at parent nodes.
+newtype LineWidth = LineWidth (Last (Measure R2))
+  deriving (Typeable, Data, Semigroup)
+instance AttributeClass LineWidth
+
+type instance V LineWidth = R2
+
+instance Transformable LineWidth where
+  transform t (LineWidth (Last w)) =
+    LineWidth (Last (transform t w))
+
+instance Default LineWidth where
+    def = LineWidth (Last medium)
+
+getLineWidth :: LineWidth -> Measure R2
+getLineWidth (LineWidth (Last w)) = w
+
+-- | Set the line (stroke) width.
+lineWidth :: (HasStyle a, V a ~ R2) => Measure R2 -> a -> a
+lineWidth = applyGTAttr . LineWidth . Last
+
+-- | Apply a 'LineWidth' attribute.
+lineWidthA ::  (HasStyle a, V a ~ R2) => LineWidth -> a -> a
+lineWidthA = applyGTAttr
+
+-- | Default for 'lineWidth'.
+lw :: (HasStyle a, V a ~ R2) => Measure R2 -> a -> a
+lw = lineWidth
+
+-- | A convenient synonym for 'lineWidth (Global w)'.
+lwG :: (HasStyle a, V a ~ R2) => Double -> a -> a
+lwG w = lineWidth (Global w)
+
+-- | A convenient synonym for 'lineWidth (Normalized w)'.
+lwN :: (HasStyle a, V a ~ R2) => Double -> a -> a
+lwN w = lineWidth (Normalized w)
+
+-- | A convenient synonym for 'lineWidth (Output w)'.
+lwO :: (HasStyle a, V a ~ R2) => Double -> a -> a
+lwO w = lineWidth (Output w)
+
+-- | A convenient sysnonym for 'lineWidth (Local w)'.
+lwL :: (HasStyle a, V a ~ R2) => Double -> a -> a
+lwL w = lineWidth (Local w)
+
+-----------------------------------------------------------------
+--  Dashing  ----------------------------------------------------
+-----------------------------------------------------------------
+
+-- | Create lines that are dashing... er, dashed.
+data Dashing = Dashing [Measure R2] (Measure R2)
+  deriving (Typeable, Data, Eq)
+
+newtype DashingA = DashingA (Last Dashing)
+  deriving (Typeable, Data, Semigroup, Eq)
+instance AttributeClass DashingA
+
+type instance V DashingA = R2
+
+instance Transformable DashingA where
+  transform t (DashingA (Last (Dashing w v))) =
+    DashingA (Last (Dashing r s))
+    where
+      r = map (transform t) w
+      s = transform t v
+
+getDashing :: DashingA -> Dashing
+getDashing (DashingA (Last d)) = d
+
+-- | Set the line dashing style.
+dashing :: (HasStyle a, V a ~ R2) =>
+           [Measure R2]  -- ^ A list specifying alternate lengths of on
+                         --   and off portions of the stroke.  The empty
+                         --   list indicates no dashing.
+        -> Measure R2    -- ^ An offset into the dash pattern at which the
+                         --   stroke should start.
+        -> a -> a
+dashing ds offs = applyGTAttr (DashingA (Last (Dashing ds offs)))
+
+-- | A convenient synonym for 'dashing (Global w)'.
+dashingG :: (HasStyle a, V a ~ R2) => [Double] -> Double -> a -> a
+dashingG w v = dashing (map Global w) (Global v)
+
+-- | A convenient synonym for 'dashing (Normalized w)'.
+dashingN :: (HasStyle a, V a ~ R2) => [Double] -> Double -> a -> a
+dashingN w v = dashing (map Normalized w) (Normalized v)
+
+-- | A convenient synonym for 'dashing (Output w)'.
+dashingO :: (HasStyle a, V a ~ R2) => [Double] -> Double -> a -> a
+dashingO w v = dashing (map Output w) (Output v)
+
+-- | A convenient sysnonym for 'dashing (Local w)'.
+dashingL :: (HasStyle a, V a ~ R2) => [Double] -> Double -> a -> a
+dashingL w v = dashing (map Local w) (Local v)
+
+-- | A gradient stop contains a color and fraction (usually between 0 and 1)
+data GradientStop = GradientStop
+     { _stopColor    :: SomeColor
+     , _stopFraction :: Double}
+
+makeLensesWith (lensRules & generateSignatures .~ False) ''GradientStop
+
+-- | A color for the stop.
+stopColor :: Lens' GradientStop SomeColor
+
+-- | The fraction for stop.
+stopFraction :: Lens' GradientStop Double
+
+-- | The 'SpreadMethod' determines what happens before 'lGradStart' and after
+--   'lGradEnd'. 'GradPad' fills the space before the start of the gradient
+--   with the color of the first stop and the color after end of the gradient
+--   with the color of the last stop. 'GradRepeat' restarts the gradient and
+--   'GradReflect' restarts the gradient with the stops in reverse order.
+data SpreadMethod = GradPad | GradReflect | GradRepeat
+
+-- | Linear Gradient
+data LGradient = LGradient
+    { _lGradStops        :: [GradientStop]
+    , _lGradStart        :: P2
+    , _lGradEnd          :: P2
+    , _lGradTrans        :: T2
+    , _lGradSpreadMethod :: SpreadMethod }
+
+makeLensesWith (lensRules & generateSignatures .~ False) ''LGradient
+
+-- | A list of stops (colors and fractions).
+lGradStops :: Lens' LGradient [GradientStop]
+
+-- | A transformation to be applied to the gradient. Usually this field will
+--   start as the identity transform and capture the transforms that are applied
+--   to the gradient.
+lGradTrans :: Lens' LGradient T2
+
+-- | The starting point for the first gradient stop. The coordinates are in
+--   'Local' units and the default is (-0.5, 0).
+lGradStart :: Lens' LGradient P2
+
+-- | The ending point for the last gradient stop.The coordinates are in
+--   'Local' units and the default is (0.5, 0).
+lGradEnd :: Lens' LGradient P2
+
+-- | For setting the spread method.
+lGradSpreadMethod :: Lens' LGradient SpreadMethod
+
+-- | Radial Gradient
+data RGradient = RGradient
+    { _rGradStops        :: [GradientStop]
+    , _rGradCenter0      :: P2
+    , _rGradRadius0      :: Double
+    , _rGradCenter1      :: P2
+    , _rGradRadius1      :: Double
+    , _rGradTrans        :: T2
+    , _rGradSpreadMethod :: SpreadMethod }
+
+makeLensesWith (lensRules & generateSignatures .~ False) ''RGradient
+
+-- | A list of stops (colors and fractions).
+rGradStops :: Lens' RGradient [GradientStop]
+
+-- | The center point of the inner circle.
+rGradCenter0 :: Lens' RGradient P2
+
+-- | The radius of the inner cirlce in 'Local' coordinates.
+rGradRadius0 :: Lens' RGradient Double
+
+-- | The center of the outer circle.
+rGradCenter1  :: Lens' RGradient P2
+
+-- | The radius of the outer circle in 'Local' coordinates.
+rGradRadius1 :: Lens' RGradient Double
+
+-- | A transformation to be applied to the gradient. Usually this field will
+--   start as the identity transform and capture the transforms that are applied
+--   to the gradient.
+rGradTrans :: Lens' RGradient T2
+
+-- | For setting the spread method.
+rGradSpreadMethod :: Lens' RGradient SpreadMethod
+
+-- | A Texture is either a color 'SC', linear gradient 'LG', or radial gradient 'RG'.
+--   An object can have only one texture which is determined by the 'Last'
+--   semigroup structure.
+data Texture = SC SomeColor | LG LGradient | RG RGradient
+  deriving (Typeable)
+
+makePrisms ''Texture
+
+-- | Convert a solid colour into a texture.
+solid :: Color a => a -> Texture
+solid = SC . SomeColor
+
+-- | A default is provided so that linear gradients can easily be created using
+--   lenses. For example, @lg = defaultLG & lGradStart .~ (0.25 ^& 0.33)@. Note that
+--   no default value is provided for @lGradStops@, this must be set before
+--   the gradient value is used, otherwise the object will appear transparent.
+defaultLG :: Texture
+defaultLG = LG (LGradient
+    { _lGradStops        = []
+    , _lGradStart        = mkP2 (-0.5) 0
+    , _lGradEnd          = mkP2 (0.5)  0
+    , _lGradTrans        = mempty
+    , _lGradSpreadMethod = GradPad
+    })
+
+-- | A default is provided so that radial gradients can easily be created using
+--   lenses. For example, @rg = defaultRG & rGradRadius1 .~ 0.25@. Note that
+--   no default value is provided for @rGradStops@, this must be set before
+--   the gradient value is used, otherwise the object will appear transparent.
+defaultRG :: Texture
+defaultRG = RG (RGradient
+    { _rGradStops        = []
+    , _rGradCenter0      = mkP2 0 0
+    , _rGradRadius0      = 0.0
+    , _rGradCenter1      = mkP2 0 0
+    , _rGradRadius1      = 0.5
+    , _rGradTrans        = mempty
+    , _rGradSpreadMethod = GradPad
+    })
+
+-- | A convenient function for making gradient stops from a list of triples.
+--   (An opaque color, a stop fraction, an opacity).
+mkStops :: [(Colour Double, Double, Double)] -> [GradientStop]
+mkStops = map (\(x, y, z) -> GradientStop (SomeColor (withOpacity x z)) y)
+
+-- | Make a linear gradient texture from a stop list, start point, end point,
+--   and 'SpreadMethod'. The 'lGradTrans' field is set to the identity
+--   transfrom, to change it use the 'lGradTrans' lens.
+mkLinearGradient :: [GradientStop]  -> P2 -> P2 -> SpreadMethod -> Texture
+mkLinearGradient stops  start end spreadMethod
+  = LG (LGradient stops start end mempty spreadMethod)
+
+-- | Make a radial gradient texture from a stop list, radius, start point,
+--   end point, and 'SpreadMethod'. The 'rGradTrans' field is set to the identity
+--   transfrom, to change it use the 'rGradTrans' lens.
+mkRadialGradient :: [GradientStop] -> P2 -> Double
+                  -> P2 -> Double -> SpreadMethod -> Texture
+mkRadialGradient stops c0 r0 c1 r1 spreadMethod
+  = RG (RGradient stops c0 r0 c1 r1 mempty spreadMethod)
+
+-- | The texture with which lines are drawn.  Note that child
+--   textures always override parent textures.
+--   More precisely, the semigroup structure on line texture attributes
+--   is that of 'Last'.
+newtype LineTexture = LineTexture (Last Texture)
+  deriving (Typeable, Semigroup)
+instance AttributeClass LineTexture
+
+type instance V LineTexture = R2
+
+-- Only gradients get transformed. The transform is applied to the gradients
+-- transform field. Colors are left unchanged.
+instance Transformable LineTexture where
+  transform t (LineTexture (Last texture)) = LineTexture (Last tx)
+    where
+      tx = texture & lgt . rgt
+      lgt = _LG . lGradTrans %~ f
+      rgt = _RG . rGradTrans %~ f
+      f = transform t
+
+instance Default LineTexture where
+    def = LineTexture (Last (SC (SomeColor (black :: Colour Double))))
+
+getLineTexture :: LineTexture -> Texture
+getLineTexture (LineTexture (Last t)) = t
+
+lineTexture :: (HasStyle a, V a ~ R2) => Texture-> a -> a
+lineTexture = applyTAttr . LineTexture . Last
+
+lineTextureA :: (HasStyle a, V a ~ R2) => LineTexture -> a -> a
+lineTextureA = applyTAttr
+
+mkLineTexture :: Texture  -> LineTexture
+mkLineTexture = LineTexture . Last
+
+styleLineTexture :: Setter' (Style v) Texture
+styleLineTexture = sets modifyLineTexture
+  where
+    modifyLineTexture f s
+      = flip setAttr s
+      . mkLineTexture
+      . f
+      . getLineTexture
+      . fromMaybe def . getAttr
+      $ s
+
+-- | Set the line (stroke) color.  This function is polymorphic in the
+--   color type (so it can be used with either 'Colour' or
+--   'AlphaColour'), but this can sometimes create problems for type
+--   inference, so the 'lc' and 'lcA' variants are provided with more
+--   concrete types.
+lineColor :: (Color c, HasStyle a, V a ~ R2) => c -> a -> a
+lineColor = lineTexture . SC . SomeColor
+
+-- | A synonym for 'lineColor', specialized to @'Colour' Double@
+--   (i.e. opaque colors).  See comment in 'lineColor' about backends.
+lc :: (HasStyle a, V a ~ R2) => Colour Double -> a -> a
+lc = lineColor
+
+-- | A synonym for 'lineColor', specialized to @'AlphaColour' Double@
+--   (i.e. colors with transparency).  See comment in 'lineColor'
+--   about backends.
+lcA :: (HasStyle a, V a ~ R2) => AlphaColour Double -> a -> a
+lcA = lineColor
+
+-- | Apply a linear gradient.
+lineLGradient :: (HasStyle a, V a ~ R2) => LGradient -> a -> a
+lineLGradient g = lineTexture (LG g)
+
+-- | Apply a radial gradient.
+lineRGradient :: (HasStyle a, V a ~ R2) => RGradient -> a -> a
+lineRGradient g = lineTexture (RG g)
+
+-- | The texture with which objects are filled.
+--   The semigroup structure on fill texture attributes
+--   is that of 'Recommed . Last'.
+newtype FillTexture = FillTexture (Recommend (Last Texture))
+  deriving (Typeable, Semigroup)
+
+instance AttributeClass FillTexture
+
+type instance V FillTexture = R2
+
+-- Only gradients get transformed. The transform is applied to the gradients
+-- transform field. Colors are left unchanged.
+instance Transformable FillTexture where
+  transform _ tx@(FillTexture (Recommend _)) = tx
+  transform t (FillTexture (Commit (Last texture))) = FillTexture (Commit (Last tx))
+    where
+      tx = texture & lgt . rgt
+      lgt = _LG . lGradTrans %~ f
+      rgt = _RG . rGradTrans %~ f
+      f = transform t
+
+instance Default FillTexture where
+    def = FillTexture (Recommend (Last (SC
+                      (SomeColor (transparent :: AlphaColour Double)))))
+
+getFillTexture :: FillTexture -> Texture
+getFillTexture (FillTexture tx) = getLast . getRecommend $ tx
+
+fillTexture :: (HasStyle a, V a ~ R2) => Texture -> a -> a
+fillTexture = applyTAttr . FillTexture . Commit . Last
+
+mkFillTexture :: Texture  -> FillTexture
+mkFillTexture = FillTexture . Commit . Last
+
+styleFillTexture :: Setter' (Style v) Texture
+styleFillTexture = sets modifyFillTexture
+  where
+    modifyFillTexture f s
+      = flip setAttr s
+      . mkFillTexture
+      . f
+      . getFillTexture
+      . fromMaybe def . getAttr
+      $ s
+
+-- | Set the fill color.  This function is polymorphic in the color
+--   type (so it can be used with either 'Colour' or 'AlphaColour'),
+--   but this can sometimes create problems for type inference, so the
+--   'fc' and 'fcA' variants are provided with more concrete types.
+fillColor :: (Color c, HasStyle a, V a ~ R2) => c -> a -> a
+fillColor = fillTexture . SC . SomeColor
+
+-- | Set a \"recommended\" fill color, to be used only if no explicit
+--   calls to 'fillColor' (or 'fc', or 'fcA') are used.
+--   See comment after 'fillColor' about backends.
+recommendFillColor :: (Color c, HasStyle a, V a ~ R2) => c -> a -> a
+recommendFillColor =
+  applyTAttr . FillTexture . Recommend . Last . SC . SomeColor
+
+-- | A synonym for 'fillColor', specialized to @'Colour' Double@
+--   (i.e. opaque colors). See comment after 'fillColor' about backends.
+fc :: (HasStyle a, V a ~ R2) => Colour Double -> a -> a
+fc = fillColor
+
+-- | A synonym for 'fillColor', specialized to @'AlphaColour' Double@
+--   (i.e. colors with transparency). See comment after 'fillColor' about backends.
+fcA :: (HasStyle a, V a ~ R2) => AlphaColour Double -> a -> a
+fcA = fillColor
+------------------------------------------------------------
+
+data FillTextureLoops v = FillTextureLoops
+
+instance Typeable v => SplitAttribute (FillTextureLoops v) where
+  type AttrType (FillTextureLoops v) = FillTexture
+  type PrimType (FillTextureLoops v) = Path v
+
+  primOK _ = all (isLoop . unLoc) . pathTrails
+
+-- | Push fill attributes down until they are at the root of subtrees
+--   containing only loops. This makes life much easier for backends,
+--   which typically have a semantics where fill attributes are
+--   applied to lines/non-closed paths as well as loops/closed paths,
+--   whereas in the semantics of diagrams, fill attributes only apply
+--   to loops.
+splitTextureFills :: forall b v a. Typeable v => RTree b v a -> RTree b v a
+splitTextureFills = splitAttr (FillTextureLoops :: FillTextureLoops v)
diff --git a/src/Diagrams/TwoD/Combinators.hs b/src/Diagrams/TwoD/Combinators.hs
--- a/src/Diagrams/TwoD/Combinators.hs
+++ b/src/Diagrams/TwoD/Combinators.hs
@@ -45,7 +45,7 @@
 
 import           Diagrams.Core
 
-import           Diagrams.Attributes     (fc, lw)
+import           Diagrams.Angle
 import           Diagrams.BoundingBox
 import           Diagrams.Combinators
 import           Diagrams.Coordinates
@@ -53,12 +53,13 @@
 import           Diagrams.Segment
 import           Diagrams.TrailLike
 import           Diagrams.TwoD.Align
-import           Diagrams.TwoD.Path      ()
+import           Diagrams.TwoD.Attributes (lineWidth, fc)
+import           Diagrams.TwoD.Path       ()
 import           Diagrams.TwoD.Shapes
-import           Diagrams.TwoD.Transform (scaleX, scaleY)
+import           Diagrams.TwoD.Transform  (scaleX, scaleY)
 import           Diagrams.TwoD.Types
-import           Diagrams.TwoD.Vector    (fromDirection, unitX, unitY)
-import           Diagrams.Util           (( # ))
+import           Diagrams.TwoD.Vector     (fromDirection, unitX, unitY)
+import           Diagrams.Util            (( # ))
 
 
 infixl 6 ===
@@ -247,4 +248,4 @@
 -- | \"Set the background color\" of a diagram.  That is, place a
 --   diagram atop a bounding rectangle of the given color.
 bg :: (Renderable (Path R2) b) => Colour Double -> Diagram b R2 -> Diagram b R2
-bg c d = d <> boundingRect d # lw 0 # fc c
+bg c d = d <> boundingRect d # lineWidth (Output 0) # fc c
diff --git a/src/Diagrams/TwoD/Curvature.hs b/src/Diagrams/TwoD/Curvature.hs
--- a/src/Diagrams/TwoD/Curvature.hs
+++ b/src/Diagrams/TwoD/Curvature.hs
@@ -70,7 +70,7 @@
 -- >
 -- > segmentA = Cubic (12 ^& 0) (8 ^& 10) (OffsetClosed (20 ^& 8))
 -- >
--- > curveA = lw 0.1 . stroke . fromSegments $ [segmentA]
+-- > curveA = lw thick . stroke . fromSegments $ [segmentA]
 -- >
 -- > diagramA = pad 1.1 . centerXY $ curveA
 -- >
@@ -84,11 +84,11 @@
 -- >          $ curveA
 -- >         <> showCurvature segmentA t
 -- >          # withEnvelope (curveA :: D R2)
--- >          # lw 0.05 # lc red
+-- >          # lc red
 -- >
 -- > showCurvature bez@(Cubic b c (OffsetClosed d)) t
--- >   | v == 0    = mempty
--- >   | otherwise = go (radiusOfCurvature bez t)
+-- >   | v == (0,0) = mempty
+-- >   | otherwise  = go (radiusOfCurvature bez t)
 -- >   where
 -- >     v@(x,y) = unr2 $ firstDerivative b c d t
 -- >     vp = (-y) ^& x
diff --git a/src/Diagrams/TwoD/Ellipse.hs b/src/Diagrams/TwoD/Ellipse.hs
--- a/src/Diagrams/TwoD/Ellipse.hs
+++ b/src/Diagrams/TwoD/Ellipse.hs
@@ -26,6 +26,7 @@
 
 import           Diagrams.Core
 
+import           Diagrams.Angle
 import           Diagrams.Located        (at)
 import           Diagrams.TrailLike
 import           Diagrams.TwoD.Arc
diff --git a/src/Diagrams/TwoD/Image.hs b/src/Diagrams/TwoD/Image.hs
--- a/src/Diagrams/TwoD/Image.hs
+++ b/src/Diagrams/TwoD/Image.hs
@@ -1,7 +1,8 @@
 {-# LANGUAGE DeriveDataTypeable    #-}
+{-# LANGUAGE EmptyDataDecls        #-}
 {-# LANGUAGE FlexibleContexts      #-}
+{-# LANGUAGE GADTs                 #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TemplateHaskell       #-}
 {-# LANGUAGE TypeFamilies          #-}
 -----------------------------------------------------------------------------
 -- |
@@ -11,78 +12,125 @@
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
 -- Importing external images into diagrams.
---
+-- Usage: To create a diagram from an embedded image with width 1 and height
+--   set according to the aspect ratio: 'image img # scaleUToX 1`
+--   where 'img' is a 'DImage Embedded'
 -----------------------------------------------------------------------------
 
 module Diagrams.TwoD.Image
     (
-      Image(..), imgFile, imgSize, imgTransf
+      DImage(..), ImageData(..)
+    , Embedded, External
     , image
+    , loadImageEmb
+    , loadImageExt
+    , uncheckedImageRef
+    , raster
+    , rasterDia
     ) where
 
-import           Control.Lens         (makeLenses)
-import           Data.Typeable
 
+import           Codec.Picture
+import           Codec.Picture.Types  (dynamicMap)
+
+import           Data.Typeable        (Typeable)
+import           Data.Colour          (AlphaColour)
+
 import           Diagrams.Core
 
-import           Diagrams.Path
-import           Diagrams.TwoD.Path
-import           Diagrams.TwoD.Shapes
-import           Diagrams.TwoD.Size   (SizeSpec2D (..))
-import           Diagrams.TwoD.Types
+import           Diagrams.Attributes  (colorToSRGBA)
+import           Diagrams.Path        (Path)
+import           Diagrams.TwoD.Path   (isInsideEvenOdd)
+import           Diagrams.TwoD.Shapes (rect)
+import           Diagrams.TwoD.Types  (R2, T2)
 
 import           Data.AffineSpace     ((.-.))
-
 import           Data.Semigroup
 
--- | An external image primitive, representing an image the backend
---   should import from another file when rendering.
-data Image = Image { _imgFile   :: FilePath
-                   , _imgSize   :: SizeSpec2D
-                   , _imgTransf :: T2
-                   }
-  deriving Typeable
+data Embedded deriving Typeable
+data External deriving Typeable
 
-makeLenses ''Image
+-- | 'ImageData' is either a JuicyPixels @DynamicImage@ tagged as 'Embedded' or
+--   a reference tagged as 'External'.
+data ImageData :: * -> * where
+  ImageRaster :: DynamicImage -> ImageData Embedded
+  ImageRef :: FilePath -> ImageData External
 
-type instance V Image = R2
+-------------------------------------------------------------------------------
+-- | An image primitive, the two ints are width followed by height.
+--   Will typically be created by @loadImageEmb@ or @loadImageExt@ which,
+--   will handle setting the width and heigh to the actual width and height
+--   of the image.
+data DImage :: * -> * where
+  DImage :: ImageData t -> Int -> Int -> T2 -> DImage t
+  deriving Typeable
 
-instance Transformable Image where
-  transform t1 (Image file sz t2) = Image file sz (t1 <> t2)
+type instance V (DImage a) = R2
 
-instance IsPrim Image
+instance Transformable (DImage a) where
+  transform t1 (DImage iD w h t2) = DImage iD w h (t1 <> t2)
 
-instance HasOrigin Image where
+instance HasOrigin (DImage a) where
   moveOriginTo p = translate (origin .-. p)
 
-instance Renderable Image NullBackend where
-  render _ _ = mempty
+-- | Make a 'DImage' into a 'Diagram'.
+image :: (Typeable a, Renderable (DImage a) b) => DImage a -> Diagram b R2
+image img = mkQD (Prim (img)) (getEnvelope r) (getTrace r) mempty
+                  (Query $ \p -> Any (isInsideEvenOdd p r))
+  where
+    r :: Path R2
+    r = rect (fromIntegral w) (fromIntegral h)
+    DImage _ w h _ = img
 
--- See Note [Image size specification]
+-- | Use JuicyPixels to read an image in any format and wrap it in a 'DImage'.
+--   The width and height of the image are set to their actual values.
+loadImageEmb :: FilePath -> IO (Either String (DImage Embedded))
+loadImageEmb path = do
+    dImg <- readImage path
+    return $ case dImg of
+      Left msg  -> Left msg
+      Right img -> Right (DImage (ImageRaster img) w h mempty)
+        where
+          w = dynamicMap imageWidth img
+          h = dynamicMap imageHeight img
 
--- | Take an external image from the specified file and turn it into a
---   diagram with the specified width and height, centered at the
---   origin.  Note that the image's aspect ratio will be preserved; if
---   the specified width and height have a different ratio than the
---   image's aspect ratio, there will be extra space in one dimension.
-image :: (Renderable Image b) => FilePath -> Double -> Double -> Diagram b R2
-image file w h = mkQD (Prim (Image file (Dims w h) mempty))
-                      (getEnvelope r)
-                      (getTrace r)
-                      mempty
-                      (Query $ \p -> Any (isInsideEvenOdd p r))
-  where r :: Path R2
-        r = rect w h
+-- | Check that a file exists, and use JuicyPixels to figure out
+--   the right size, but save a reference to the image instead
+--   of the raster data
+loadImageExt :: FilePath -> IO (Either String (DImage External))
+loadImageExt path = do
+  dImg <- readImage path
+  return $ case dImg of
+    Left msg  -> Left msg
+    Right img -> Right $ DImage (ImageRef path) w h mempty
+      where
+        w = dynamicMap imageWidth img
+        h = dynamicMap imageHeight img
 
-{- ~~~~ Note [Image size specification]
+-- | Make an "unchecked" image reference; have to specify a
+--   width and height. Unless the aspect ratio of the external
+--   image is the w :: h, then the image will be distorted.
+uncheckedImageRef :: FilePath -> Int -> Int -> DImage External
+uncheckedImageRef path w h = DImage (ImageRef path) w h mempty
 
-It's tempting to make 'image' take a SizeSpec2D instead of two
-Doubles.  For example, if I know I want the image to be x units wide
-but I don't know the original aspect ratio of the image, I'd like to
-be able to just say "make it x units wide".  The problem is that
-diagrams would then not know how tall the image is until rendering
-time (at least, not without unsafePerformIO yuckiness).  A more
-general solution will have to wait until we can specify constraints
-and solve them later.
+-- | Crate a diagram from raw raster data.
+rasterDia :: Renderable (DImage Embedded) b
+          => (Int -> Int -> AlphaColour Double) -> Int -> Int -> Diagram b R2
+rasterDia f w h = image $ raster f w h
 
--}
+-- | Create an image "from scratch" by specifying the pixel data
+raster :: (Int -> Int -> AlphaColour Double) -> Int -> Int -> DImage Embedded
+raster f w h = DImage (ImageRaster (ImageRGBA8 img)) w h mempty
+  where
+    img = generateImage g w h
+    g x y = fromAlphaColour $ f x y
+
+fromAlphaColour :: AlphaColour Double -> PixelRGBA8
+fromAlphaColour c = PixelRGBA8 r g b a
+  where
+    (r, g, b, a) = (int r', int g', int b', int a')
+    (r', g', b', a') = colorToSRGBA c
+    int x = round (255 * x)
+
+instance Renderable (DImage a) NullBackend where
+  render _ _ = mempty
diff --git a/src/Diagrams/TwoD/Model.hs b/src/Diagrams/TwoD/Model.hs
--- a/src/Diagrams/TwoD/Model.hs
+++ b/src/Diagrams/TwoD/Model.hs
@@ -23,7 +23,7 @@
 import           Control.Lens          (makeLenses, (^.))
 
 import           Diagrams.Core
-import           Diagrams.Attributes
+import           Diagrams.TwoD.Attributes
 import           Diagrams.Path
 import           Diagrams.TwoD.Ellipse
 import           Diagrams.TwoD.Path
@@ -69,7 +69,7 @@
 showOrigin' oo d = o <> d
   where o     = stroke (circle sz)
                 # fc (oo^.oColor)
-                # lw 0
+                # lineWidth (Output 0)
                 # fmap (const mempty)
         (w,h) = size2D d ^* oo^.oScale
         sz = maximum [w, h, oo^.oMinSize]
diff --git a/src/Diagrams/TwoD/Offset.hs b/src/Diagrams/TwoD/Offset.hs
--- a/src/Diagrams/TwoD/Offset.hs
+++ b/src/Diagrams/TwoD/Offset.hs
@@ -208,7 +208,7 @@
 -- > import Diagrams.TwoD.Offset
 -- >
 -- > showExample :: Segment Closed R2 -> Diagram SVG R2
--- > showExample s = pad 1.1 . centerXY $ d # lc blue # lw 0.1 <> d' # lw 0.1
+-- > showExample s = pad 1.1 . centerXY $ d # lc blue # lw thick <> d' # lw thick
 -- >   where
 -- >       d  = stroke . fromSegments $ [s]
 -- >       d' = mconcat . zipWith lc colors . map stroke . explodeTrail
@@ -298,7 +298,7 @@
 -- > corner = fromVertices (map p2 [(0, 0), (10, 0), (5, 6)]) `at` origin
 -- >
 -- > offsetTrailExample :: Diagram SVG R2
--- > offsetTrailExample = pad 1.1 . centerXY . lw 0.2 . hcat' (def & sep .~ 1 )
+-- > offsetTrailExample = pad 1.1 . centerXY . lwO 3 . hcat' (def & sep .~ 1 )
 -- >                    . map (uncurry showStyle)
 -- >                    $ [ (LineJoinMiter, "LineJoinMiter")
 -- >                      , (LineJoinRound, "LineJoinRound")
@@ -310,7 +310,7 @@
 -- >            === (strutY 3 <> text s # font "Helvetica" # bold)
 -- >
 -- > offsetTrailLeftExample :: Diagram SVG R2
--- > offsetTrailLeftExample = pad 1.1 . centerXY . lw 0.2
+-- > offsetTrailLeftExample = pad 1.1 . centerXY . lwO 3
 -- >                        $ (trailLike c # lc blue)
 -- >                        <> (lc green . trailLike
 -- >                         . offsetTrail' (def & offsetJoin .~ LineJoinRound) (-2) $ c)
@@ -318,7 +318,7 @@
 -- >     c = reflectY corner
 -- >
 -- > offsetTrailOuterExample :: Diagram SVG R2
--- > offsetTrailOuterExample = pad 1.1 . centerXY . lw 0.2
+-- > offsetTrailOuterExample = pad 1.1 . centerXY . lwO 3
 -- >                         $ (trailLike c # lc blue)
 -- >                         <> (lc green . trailLike
 -- >                          . offsetTrail' (def & offsetJoin .~ LineJoinRound) 2 $ c)
@@ -401,17 +401,17 @@
 -- >                      , (LineCapSquare, "LineCapSquare")
 -- >                      ]
 -- >  where
--- >    showStyle c s = centerXY (trailLike corner # lc white # lw 0.2
+-- >    showStyle c s = centerXY (trailLike corner # lc white # lw veryThick
 -- >                               <> stroke (expandTrail'
 -- >                                              (def & expandJoin .~ LineJoinRound
 -- >                                                   & expandCap .~ c
 -- >                                                   ) 2 corner)
--- >                                      # lw 0 # fc green)
+-- >                                      # lw none # fc green)
 -- >               === (strutY 3 <> text s # font "Helvetica" # bold)
 -- >
 -- > expandLoopExample :: Diagram SVG R2
--- > expandLoopExample = pad 1.1 . centerXY $ ((strokeLocT t # lw 0.2 # lc white)
--- >                                        <> (stroke t' # lw 0 # fc green))
+-- > expandLoopExample = pad 1.1 . centerXY $ ((strokeLocT t # lw veryThick # lc white)
+-- >                                        <> (stroke t' # lw none # fc green))
 -- >   where
 -- >     t  = mapLoc glueTrail $ fromVertices (map p2 [(0, 0), (5, 0), (10, 5), (10, 10), (0, 0)])
 -- >     t' = expandTrail' (def & expandJoin .~ LineJoinRound) 1 t
diff --git a/src/Diagrams/TwoD/Path.hs b/src/Diagrams/TwoD/Path.hs
--- a/src/Diagrams/TwoD/Path.hs
+++ b/src/Diagrams/TwoD/Path.hs
@@ -45,9 +45,9 @@
        ) where
 
 import           Control.Applicative   (liftA2)
-import           Control.Lens          ( makeWrapped, makeLensesWith, (.~), (^.)
-                                       , generateSignatures, lensRules, op
-                                       , Lens, Lens', _Wrapped')
+import           Control.Lens          (Lens, Lens', generateSignatures,
+                                        lensRules, makeLensesWith, makeWrapped,
+                                        op, (.~), (^.), _Wrapped')
 import qualified Data.Foldable         as F
 import           Data.Semigroup
 import           Data.Typeable
diff --git a/src/Diagrams/TwoD/Polygons.hs b/src/Diagrams/TwoD/Polygons.hs
--- a/src/Diagrams/TwoD/Polygons.hs
+++ b/src/Diagrams/TwoD/Polygons.hs
@@ -60,6 +60,7 @@
 import           Data.Default.Class
 import           Data.VectorSpace
 
+import           Diagrams.Angle
 import           Diagrams.Core
 import           Diagrams.Located
 import           Diagrams.Path
diff --git a/src/Diagrams/TwoD/Shapes.hs b/src/Diagrams/TwoD/Shapes.hs
--- a/src/Diagrams/TwoD/Shapes.hs
+++ b/src/Diagrams/TwoD/Shapes.hs
@@ -47,6 +47,7 @@
 
 import           Diagrams.Core
 
+import           Diagrams.Angle
 import           Diagrams.Located        (at)
 import           Diagrams.Path
 import           Diagrams.Segment
@@ -99,7 +100,7 @@
 square d = rect d d
 
 -- > squareEx = hcat' (with & sep .~ 0.5) [square 1, square 2, square 3]
--- >          # centerXY # pad 1.1 # lw 0.03
+-- >          # centerXY # pad 1.1
 
 -- | @rect w h@ is an axis-aligned rectangle of width @w@ and height
 --   @h@, centered at the origin.
diff --git a/src/Diagrams/TwoD/Size.hs b/src/Diagrams/TwoD/Size.hs
--- a/src/Diagrams/TwoD/Size.hs
+++ b/src/Diagrams/TwoD/Size.hs
@@ -27,7 +27,7 @@
        , requiredScaleT, requiredScale
 
          -- ** Changing the size of things
-       , sized, sizedAs
+       , sized, sizedAs, sizePair
        ) where
 
 import           Diagrams.Core
@@ -148,3 +148,10 @@
            , Enveloped b, V b ~ R2)
         => b -> a -> a
 sizedAs other = sized (sizeSpec2D other)
+
+-- | Make width and height of `SizeSpec2D` into a tuple.
+sizePair :: SizeSpec2D -> (Double, Double)
+sizePair (Width w')   = (w',w')
+sizePair (Height h')  = (h',h')
+sizePair (Dims w' h') = (w',h')
+sizePair Absolute     = (100,100)
diff --git a/src/Diagrams/TwoD/Text.hs b/src/Diagrams/TwoD/Text.hs
--- a/src/Diagrams/TwoD/Text.hs
+++ b/src/Diagrams/TwoD/Text.hs
@@ -23,45 +23,47 @@
   -- ** Font family
   , Font(..), getFont, font
   -- ** Font size
-  , FontSize(..), getFontSize, fontSize, fontSizeA
+  , FontSize(..), getFontSize, getFontSizeIsLocal, fontSizeA, fontSize
+  , fontSizeN, fontSizeO, fontSizeL, fontSizeG
   -- ** Font slant
   , FontSlant(..), FontSlantA, getFontSlant, fontSlant, italic, oblique
   -- ** Font weight
   , FontWeight(..), FontWeightA, getFontWeight, fontWeight, bold
   ) where
 
-import           Diagrams.Attributes
 import           Diagrams.Core
-import           Diagrams.Core.Envelope (pointEnvelope)
+import           Diagrams.Core.Envelope   (pointEnvelope)
+import           Diagrams.TwoD.Attributes (recommendFillColor)
 import           Diagrams.TwoD.Types
 
-import           Data.AffineSpace       ((.-.))
-
-import           Data.Semigroup
-
+import           Data.AffineSpace         ((.-.))
 import           Data.Colour
-
+import           Data.Data
 import           Data.Default.Class
-
-import           Data.Typeable
+import           Data.Semigroup
 
 ------------------------------------------------------------
 -- Text diagrams
 ------------------------------------------------------------
 
 -- | A text primitive consists of the string contents and alignment
---   specification, along with a transformation mapping from the local
---   vector space of the text to the vector space in which it is
---   embedded.
-data Text = Text T2 TextAlignment String
+--   specification, along with two transformations: the first
+--   accumulates all transformations which have been applied to the
+--   text; the second accumulates normalized, "anti-scaled" versions
+--   of the transformations which have had their average scaling
+--   component removed.
+data Text = Text T2 T2 TextAlignment String
   deriving Typeable
 
 type instance V Text = R2
 
 instance Transformable Text where
-  transform t (Text tt a s) = Text (t <> tt) a s
-
-instance IsPrim Text
+  transform t (Text tt tn a s) = Text (t <> tt) (t <> tn <> t') a s
+    where
+      t' = scaling (1 / avgScale t)
+      -- It's important that the anti-scaling is applied *first*,
+      -- followed by the old transformation tn and then the new
+      -- transformation t.  That way translation is handled properly.
 
 instance HasOrigin Text where
   moveOriginTo p = translate (origin .-. p)
@@ -76,7 +78,7 @@
 mkText a t = recommendFillColor (black :: Colour Double)
              -- See Note [recommendFillColor]
 
-           $ mkQD (Prim (Text mempty a t))
+           $ mkQD (Prim (Text mempty mempty a t))
                        (pointEnvelope origin)
                        mempty
                        mempty
@@ -166,28 +168,64 @@
 -- Font size
 
 -- | The @FontSize@ attribute specifies the size of a font's
---   em-square, measured with respect to the current local vector space.
---   Inner @FontSize@ attributes override outer ones.
-newtype FontSize = FontSize (Last Double)
-  deriving (Typeable, Semigroup, Eq)
+--   em-square.  Inner @FontSize@ attributes override outer ones.
+newtype FontSize = FontSize (Last (Measure R2, Bool))
+  deriving (Typeable, Data, Semigroup)
 instance AttributeClass FontSize
 
+-- Note, the Bool stored in the FontSize indicates whether it started
+-- life as Local.  Typically, if the Bool is True, backends should use
+-- the first T2 value stored in a Text object; otherwise, the second
+-- (anti-scaled) T2 value should be used.
+
+type instance V FontSize = R2
+
 instance Default FontSize where
-    def = FontSize (Last 1)
+    def = FontSize (Last (Local 1, True))
 
+-- FontSize has to be Transformable + also have an instance of Data,
+-- so the Measure inside it will be automatically converted to Output.
+-- However, we don't actually want the Transformable instance to do
+-- anything.  All the scaling of text happens not by manipulating the
+-- font size but by accumulating T2 values in Text objects.
+instance Transformable FontSize where
+  transform _ f = f
+
 -- | Extract the size from a @FontSize@ attribute.
-getFontSize :: FontSize -> Double
-getFontSize (FontSize (Last s)) = s
+getFontSize :: FontSize -> Measure R2
+getFontSize (FontSize (Last (s,_))) = s
 
+-- | Determine whether a @FontSize@ attribute began its life measured
+--   in 'Local' units.
+getFontSizeIsLocal :: FontSize -> Bool
+getFontSizeIsLocal (FontSize (Last (_,b))) = b
+
 -- | Set the font size, that is, the size of the font's em-square as
 --   measured within the current local vector space.  The default size
 --   is @1@.
-fontSize :: HasStyle a => Double -> a -> a
-fontSize = applyAttr . FontSize . Last
+fontSize :: (HasStyle a, V a ~ R2) => Measure R2 -> a -> a
+fontSize m@(Local {}) = applyGTAttr . FontSize . Last $ (m,True)
+fontSize m            = applyGTAttr . FontSize . Last $ (m,False)
 
+-- | A convenient synonym for 'fontSize (Global w)'.
+fontSizeG :: (HasStyle a, V a ~ R2) => Double -> a -> a
+fontSizeG w = fontSize (Global w)
+
+-- | A convenient synonym for 'fontSize (Normalized w)'.
+fontSizeN :: (HasStyle a, V a ~ R2) => Double -> a -> a
+fontSizeN w = fontSize (Normalized w)
+
+-- | A convenient synonym for 'fontSize (Output w)'.
+fontSizeO :: (HasStyle a, V a ~ R2) => Double -> a -> a
+fontSizeO w = fontSize (Output w)
+
+-- | A convenient sysnonym for 'fontSize (Local w)'.
+fontSizeL :: (HasStyle a, V a ~ R2) => Double -> a -> a
+fontSizeL w = fontSize (Local w)
+
 -- | Apply a 'FontSize' attribute.
-fontSizeA :: HasStyle a => FontSize -> a -> a
-fontSizeA = applyAttr
+fontSizeA :: (HasStyle a, V a ~ R2) => FontSize -> a -> a
+fontSizeA = applyGTAttr
 
 --------------------------------------------------
 -- Font slant
diff --git a/src/Diagrams/TwoD/Transform.hs b/src/Diagrams/TwoD/Transform.hs
--- a/src/Diagrams/TwoD/Transform.hs
+++ b/src/Diagrams/TwoD/Transform.hs
@@ -47,12 +47,12 @@
 
          -- * Utilities
        , onBasis
-       , avgScale
        ) where
 
 import           Diagrams.Core
 import qualified Diagrams.Core.Transform as T
 
+import           Diagrams.Angle
 import           Diagrams.Transform
 import           Diagrams.TwoD.Size      (height, width)
 import           Diagrams.TwoD.Types
@@ -249,41 +249,3 @@
 onBasis :: Transformation R2 -> ((R2, R2), R2)
 onBasis t = ((x, y), v)
   where ((x:y:[]), v) = T.onBasis t
-
--- | Compute the \"average\" amount of scaling performed by a
---   transformation.  Satisfies the properties
---
---   @
---   avgScale (scaling k) == k
---   avgScale (t1 <> t2)  == avgScale t1 * avgScale t2
---   @
---
---   Backends which do not support stroking in the context of an
---   arbitrary transformation may instead call 'avgScale' on
---   \"frozen\" transformations and multiply the line width by the
---   resulting value.
-avgScale :: T2 -> Double
-avgScale t = sqrt (abs (x1*y2 - y1*x2))
-  where ((unr2 -> (x1,y1), unr2 -> (x2,y2)), _) = onBasis t
-
-{-
-
-avgScale is computed as the square root of the positive
-determinant. Proofs for the specified properties:
-
-1. sqrt (|det (scaling k)|) = sqrt (k^2) = k
-2. sqrt (|det t1|) * sqrt (|det t2|)
-   = sqrt (|det t1| * |det t2|)
-   = sqrt (|det t1 * det t2|)
-   = sqrt (|det (t1 * t2)|)
-
-From wikipedia:
-
-     A geometric interpretation can be given to the value of the
-     determinant of a square matrix with real entries: the absolute
-     value of the determinant gives the scale factor by which area or
-     volume (or a higher dimensional analogue) is multiplied under the
-     associated linear transformation, while its sign indicates whether
-     the transformation preserves orientation.
-
--}
diff --git a/src/Diagrams/TwoD/Transform/ScaleInv.hs b/src/Diagrams/TwoD/Transform/ScaleInv.hs
--- a/src/Diagrams/TwoD/Transform/ScaleInv.hs
+++ b/src/Diagrams/TwoD/Transform/ScaleInv.hs
@@ -150,24 +150,6 @@
 
 -}
 
--- This is how we handle freezing properly with ScaleInv wrappers.
--- Normal transformations are applied ignoring scaling; "frozen"
--- transformations (i.e. transformations applied after a freeze) are
--- applied directly to the underlying object, scales and all.  We must
--- take care to transform the reference point and direction vector
--- appropriately.
-instance (V t ~ R2, Transformable t) => IsPrim (ScaleInv t) where
-  transformWithFreeze t1 t2 s = ScaleInv t'' d'' origin''
-    where
-      -- first, apply t2 normally, i.e. ignoring scaling
-      s'@(ScaleInv t' _ _)      = transform t2 s
-
-      -- now apply t1 to get the new direction and origin
-      (ScaleInv _ d'' origin'') = transform t1 s'
-
-      -- but apply t1 directly to the underlying thing, scales and all.
-      t''                       = transform t1 t'
-
 instance (Renderable t b, V t ~ R2) => Renderable (ScaleInv t) b where
   render b = render b . view scaleInvObj
 
diff --git a/src/Diagrams/TwoD/Types.hs b/src/Diagrams/TwoD/Types.hs
--- a/src/Diagrams/TwoD/Types.hs
+++ b/src/Diagrams/TwoD/Types.hs
@@ -25,25 +25,21 @@
        , P2, p2, mkP2, unp2, p2Iso
        , T2
 
-         -- * Angles
-       , Angle
-       , rad, turn, deg
-       , fullTurn, fullCircle, angleRatio
-       , (@@)
        ) where
 
-import           Control.Lens            (Iso', Wrapped(..), Rewrapped, iso
-                                         , review , (^.), _1, _2)
+import           Control.Lens           (Iso', Rewrapped, Wrapped (..), iso,
+                                         lens, (^.), _1, _2)
 
+import           Diagrams.Angle
 import           Diagrams.Coordinates
 import           Diagrams.Core
 
 import           Data.AffineSpace.Point
 import           Data.Basis
-import           Data.MemoTrie           (HasTrie (..))
+import           Data.MemoTrie          (HasTrie (..))
 import           Data.VectorSpace
 
-import           Data.Typeable
+import           Data.Data
 ------------------------------------------------------------
 -- 2D Euclidean space
 
@@ -77,7 +73,7 @@
 
 data R2 = R2 {-# UNPACK #-} !Double
              {-# UNPACK #-} !Double
-  deriving (Eq, Ord, Typeable)
+  deriving (Eq, Ord, Typeable, Data)
 
 instance AdditiveGroup R2 where
   zeroV = R2 0 0
@@ -184,6 +180,13 @@
 instance HasY R2 where
     _y = r2Iso . _2
 
+instance HasTheta R2 where
+    _theta = lens (\v -> atanA (v^._y / v^._x))
+      (\v θ -> let r = magnitude v in R2 (r * cosA θ) (r * sinA θ))
+
+instance HasR R2 where
+    _r = lens magnitude (\v r -> let s = r/magnitude v in s *^ v)
+
 -- | Points in R^2.  This type is intentionally abstract.
 --
 --   * To construct a point, use 'p2', or '^&' (see
@@ -235,55 +238,9 @@
 
 instance HasY P2 where
     _y = p2Iso . _2
-------------------------------------------------------------
--- Angles
 
--- | Angles can be expressed in a variety of units.  Internally,
--- they are represented in radians.
-newtype Angle = Radians Double
-              deriving (Read, Show, Eq, Ord, Enum, AdditiveGroup)
-
-instance VectorSpace Angle where
-  type Scalar Angle = Double
-  s *^ Radians t = Radians (s*t)
-
--- | The radian measure of an @Angle@ @a@ can be accessed as @a
--- ^. rad@.  A new @Angle@ can be defined in radians as @pi \@\@ rad@.
-rad :: Iso' Angle Double
-rad = iso (\(Radians r) -> r) Radians
-
--- | The measure of an @Angle@ @a@ in full circles can be accessed as
--- @a ^. turn@.  A new @Angle@ of one-half circle can be defined in as
--- @1/2 \@\@ turn@.
-turn :: Iso' Angle Double
-turn = iso (\(Radians r) -> r/2/pi) (Radians . (*(2*pi)))
-
--- | The degree measure of an @Angle@ @a@ can be accessed as @a
--- ^. deg@.  A new @Angle@ can be defined in degrees as @180 \@\@
--- deg@.
-deg :: Iso' Angle Double
-deg = iso (\(Radians r) -> r/2/pi*360) (Radians . (*(2*pi/360)))
-
--- | An angle representing one full turn.
-fullTurn :: Angle
-fullTurn = 1 @@ turn
-
--- | Deprecated synonym for 'fullTurn', retained for backwards compatibility.
-fullCircle :: Angle
-fullCircle = fullTurn
-
--- | Calculate ratio between two angles.
-angleRatio :: Angle -> Angle -> Double
-angleRatio a b = (a^.rad) / (b^.rad)
-
-
--- | @30 \@\@ deg@ is an @Angle@ of the given measure and units.
---
--- More generally, @\@\@@ reverses the @Iso\'@ on its right, and
--- applies the @Iso\'@ to the value on the left.  @Angle@s are the
--- motivating example where this order improves readability.
-(@@) :: b -> Iso' a b -> a
--- The signature above is slightly specialized, in favor of readability
-a @@ i = review i a
+instance HasR P2 where
+    _r = _relative origin . _r
 
-infixl 5 @@
+instance HasTheta P2 where
+    _theta = _relative origin . _theta
diff --git a/src/Diagrams/TwoD/Vector.hs b/src/Diagrams/TwoD/Vector.hs
--- a/src/Diagrams/TwoD/Vector.hs
+++ b/src/Diagrams/TwoD/Vector.hs
@@ -23,8 +23,9 @@
        ) where
 
 import           Control.Lens         ((^.))
-import           Data.AdditiveGroup
 import           Data.VectorSpace     ((<.>))
+
+import           Diagrams.Angle
 import           Diagrams.TwoD.Types
 import           Diagrams.Coordinates
 
@@ -49,15 +50,6 @@
 --   vector is arbitrarily assigned the direction 0.
 direction :: R2 -> Angle
 direction (coords -> x :& y) = atan2 y x @@ rad
-
--- | Compute the counterclockwise angle from the first vector to the second.
-angleBetween :: R2 -> R2 -> Angle
-angleBetween v1 v2
-  | d2 > d1   = d2 ^-^ d1
-  | otherwise = fullTurn ^+^ d2 ^-^ d1
-  where
-    d1 = direction v1
-    d2 = direction v2
 
 -- | Convert an angle into a unit vector pointing in that direction.
 fromDirection :: Angle -> R2
