diff --git a/route-planning.cabal b/route-planning.cabal
--- a/route-planning.cabal
+++ b/route-planning.cabal
@@ -1,5 +1,5 @@
 name:               route-planning
-version:            0.0.2
+version:            0.0.3
 license:            BSD3
 license-File:       etc/LICENCE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
diff --git a/src/Data/Geo/Route/Author.hs b/src/Data/Geo/Route/Author.hs
--- a/src/Data/Geo/Route/Author.hs
+++ b/src/Data/Geo/Route/Author.hs
@@ -4,6 +4,8 @@
 , mkAuthor'
 , authorEmail
 , authorLink
+, HasAuthor(..)
+, HasMaybeAuthor(..)
 ) where
 
 import Prelude(Show)
@@ -75,3 +77,7 @@
 instance HasAuthor Author where
   author =
     id
+
+class HasMaybeAuthor t where
+  mauthor ::
+    Lens' t (Maybe Author)
diff --git a/src/Data/Geo/Route/Copyright.hs b/src/Data/Geo/Route/Copyright.hs
--- a/src/Data/Geo/Route/Copyright.hs
+++ b/src/Data/Geo/Route/Copyright.hs
@@ -1,16 +1,19 @@
 module Data.Geo.Route.Copyright(
   Copyright
-, copyright
-, copyright'
+, mkCopyright
+, mkCopyright'
 , copyrightAuthor
 , copyrightYear
 , copyrightLicense
+, HasCopyright(..)
+, HasMaybeCopyright(..)
 ) where
 
 import Prelude(Show)
 import Control.Lens(Lens', lens)
 import Data.Eq(Eq)
 import Data.Foldable(Foldable(foldMap))
+import Data.Function(id)
 import Data.Geo.Route.Gpx(Gpx(gpx))
 import Data.List((++))
 import Data.Maybe(Maybe(Just, Nothing))
@@ -25,18 +28,18 @@
     (Maybe String) -- license
   deriving (Eq, Ord, Show)
 
-copyright ::
+mkCopyright ::
   String
   -> Copyright
-copyright a =
+mkCopyright a =
   Copyright a Nothing Nothing
 
-copyright' ::
+mkCopyright' ::
   String
   -> String
   -> String
   -> Copyright
-copyright' a y l =
+mkCopyright' a y l =
   Copyright a (Just y) (Just l)
 
 copyrightAuthor ::
@@ -57,3 +60,15 @@
 instance Gpx Copyright where
   gpx (Copyright a y l) =
     printf "<copyright author=\"%s\">%s%s</copyright>" a (foldMap (\y' -> "<year>" ++ y' ++ "</year>") y) (foldMap (\l' -> "<license>" ++ l' ++ "</license>") l)
+
+class HasCopyright t where
+  copyright ::
+    Lens' t Copyright
+
+instance HasCopyright Copyright where
+  copyright =
+    id
+
+class HasMaybeCopyright t where
+  mcopyright ::
+    Lens' t (Maybe Copyright)
diff --git a/src/Data/Geo/Route/Email.hs b/src/Data/Geo/Route/Email.hs
--- a/src/Data/Geo/Route/Email.hs
+++ b/src/Data/Geo/Route/Email.hs
@@ -1,13 +1,17 @@
 module Data.Geo.Route.Email(
   Email
-, email
+, mkEmail
 , emailId
 , emailDomain
+, HasEmail(..)
+, HasMaybeEmail(..)
 ) where
 
 import Prelude(Show)
 import Data.Geo.Route.Gpx(Gpx(gpx))
 import Control.Lens(Lens', lens)
+import Data.Function(id)
+import Data.Maybe(Maybe)
 import Data.String(String)
 import Data.Eq(Eq)
 import Data.Ord(Ord)
@@ -19,11 +23,11 @@
     String -- domain
   deriving (Eq, Ord, Show)
 
-email ::
+mkEmail ::
   String
   -> String
   -> Email
-email =
+mkEmail =
   Email
 
 emailId ::
@@ -39,3 +43,15 @@
 instance Gpx Email where
   gpx (Email i d) =
     printf "<email id=\"%s\" domain=\"%s\"/>" i d
+
+class HasEmail t where
+  email ::
+    Lens' t Email
+
+instance HasEmail Email where
+  email =
+    id
+
+class HasMaybeEmail t where
+  memail ::
+    Lens' t (Maybe Email)
diff --git a/src/Data/Geo/Route/Link.hs b/src/Data/Geo/Route/Link.hs
--- a/src/Data/Geo/Route/Link.hs
+++ b/src/Data/Geo/Route/Link.hs
@@ -1,6 +1,6 @@
 module Data.Geo.Route.Link(
   Link
-, link
+, mkLink
 , linkHref
 , linkText
 , linkType
@@ -21,12 +21,12 @@
     String -- type
   deriving (Eq, Ord, Show)
 
-link ::
+mkLink ::
   String
   -> String
   -> String
   -> Link
-link =
+mkLink =
   Link
 
 instance Gpx Link where
diff --git a/src/Data/Geo/Route/Plan.hs b/src/Data/Geo/Route/Plan.hs
--- a/src/Data/Geo/Route/Plan.hs
+++ b/src/Data/Geo/Route/Plan.hs
@@ -10,16 +10,18 @@
 import Data.Bool((&&))
 import Data.Eq(Eq)
 import Data.Foldable(Foldable(foldMap))
+import Data.Function((.))
 import Data.Ord(Ord)
 import Data.Maybe(Maybe(Nothing, Just), isNothing)
 import Data.String(String)
-import Data.Geo.Route.Author(Author)
-import Data.Geo.Route.Copyright(Copyright)
+import Data.Geo.Route.Author(Author, HasMaybeAuthor(mauthor))
+import Data.Geo.Route.Copyright(Copyright, HasMaybeCopyright(mcopyright))
 import Data.Geo.Route.Description(Description, HasMaybeDescription(mdescription))
 import Data.Geo.Route.Gpx(Gpx(gpx))
 import Data.Geo.Route.Name(Name, HasMaybeName(mname))
 import Data.Geo.Route.Osrm(Osrm(allCoordinates))
-import Data.Geo.Route.Track(Track, trackPoints)
+import Data.Geo.Route.Track(Track, HasTrack(track), trackPoints)
+import Data.Geo.Route.TrackHeader(HasTrackHeader(trackHeader))
 import Data.Geo.Route.Waypoint(gpxWaypoint)
 import Text.Printf(printf)
 
@@ -89,3 +91,19 @@
 instance HasMaybeDescription Plan where
   mdescription =
     lens (\(Plan _ d _ _ _) -> d) (\(Plan n _ a c t) d -> Plan n d a c t)
+
+instance HasMaybeAuthor Plan where
+  mauthor =
+    lens (\(Plan _ _ a _ _) -> a) (\(Plan n d _ c t) a -> Plan n d a c t)
+
+instance HasMaybeCopyright Plan where
+  mcopyright =
+    lens (\(Plan _ _ _ c _) -> c) (\(Plan n d a _ t) c -> Plan n d a c t)
+
+instance HasTrack Plan where
+  track =
+    lens (\(Plan _ _ _ _ t) -> t) (\(Plan n d a c _) t -> Plan n d a c t)
+
+instance HasTrackHeader Plan where
+  trackHeader =
+    track . trackHeader
diff --git a/src/Data/Geo/Route/Track.hs b/src/Data/Geo/Route/Track.hs
--- a/src/Data/Geo/Route/Track.hs
+++ b/src/Data/Geo/Route/Track.hs
@@ -116,7 +116,6 @@
 trackPoints (Track _ t) =
   concat t
 
-
 class HasTrack t where
   track ::
     Lens' t Track
