diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+0.0.19
+
+* Add lenses from latitude, longitude minutes, seconds.
+* Add traversals from coordinate to minutes, seconds.
+* Generalise coordinate operators.
+
 0.0.18
 
 * Update dependency on `radian`.
diff --git a/coordinate.cabal b/coordinate.cabal
--- a/coordinate.cabal
+++ b/coordinate.cabal
@@ -1,5 +1,5 @@
 name:               coordinate
-version:            0.0.18
+version:            0.0.19
 license:            BSD3
 license-file:       LICENCE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
diff --git a/src/Data/Geo/Coordinate/Coordinate.hs b/src/Data/Geo/Coordinate/Coordinate.hs
--- a/src/Data/Geo/Coordinate/Coordinate.hs
+++ b/src/Data/Geo/Coordinate/Coordinate.hs
@@ -8,22 +8,26 @@
 module Data.Geo.Coordinate.Coordinate(
   Coordinate
 , AsCoordinate(..)
+, latitudeMinutes
+, latitudeSeconds
+, longitudeMinutes
+, longitudeSeconds
 , (.#.)
 , (<°>)
 ) where
 
-import Control.Applicative(Applicative)
+import Control.Applicative(Applicative((<*>)))
 import Control.Category(Category(id, (.)))
-import Control.Lens(Identity, Const, Prism', Choice, swapped, Profunctor, Optic', (^.), iso, lens, prism', swapped, (^?), (#))
+import Control.Lens(Identity, Const, Prism', Choice, swapped, Profunctor, Optic', (^.), iso, from, lens, prism', swapped, (^?), (#))
 import Control.Monad(Monad(return))
 import Data.Eq(Eq)
-import Data.Functor(Functor)
+import Data.Functor(Functor, (<$>))
 import Data.Geo.Coordinate.Latitude(AsLatitude(_Latitude), Latitude)
 import Data.Geo.Coordinate.Longitude(AsLongitude(_Longitude), Longitude)
 import Data.Geo.Coordinate.DegreesLatitude(AsDegreesLatitude(_DegreesLatitude), DegreesLatitude)
 import Data.Geo.Coordinate.DegreesLongitude(AsDegreesLongitude(_DegreesLongitude), DegreesLongitude)
-import Data.Geo.Coordinate.Minutes(Minutes)
-import Data.Geo.Coordinate.Seconds(Seconds)
+import Data.Geo.Coordinate.Minutes(Minutes, AsMinutes(_Minutes))
+import Data.Geo.Coordinate.Seconds(Seconds, AsSeconds(_Seconds))
 import Data.Maybe(Maybe)
 import Data.Monoid(First)
 import Data.Ord(Ord)
@@ -39,11 +43,17 @@
 
 -- | Build a coordinate from a latitude and longitude.
 (.#.) ::
-  Latitude
-  -> Longitude
+  (  
+    AsLatitude (->) (Const Latitude) lat
+  , AsLongitude (->) (Const Longitude) lon
+  ) =>
+  lat
+  -> lon
   -> Coordinate
-(.#.) =
+lat .#. lon =
   Coordinate
+    (lat ^. _Latitude)
+    (lon ^. _Longitude)
 
 -- | Build a coordinate from a fractional latitude and fractional longitude. Fails
 -- if either are out of range.
@@ -159,3 +169,45 @@
 instance (p ~ (->), Functor f) => AsDegreesLongitude p f Coordinate where
   _DegreesLongitude =
     _Longitude . _DegreesLongitude
+
+instance (p ~ (->), Applicative f) => AsMinutes p f Coordinate where
+  _Minutes f (Coordinate lat lon) =
+    (\m1 m2 ->
+      Coordinate
+        (from _Latitude # (lat ^. _DegreesLatitude, m1, lat ^. _Seconds))
+        (from _Longitude # (lon ^. _DegreesLongitude, m2, lon ^. _Seconds))) <$> 
+    f (lat ^. _Minutes) <*> 
+    f (lon ^. _Minutes)
+    
+instance (p ~ (->), Applicative f) => AsSeconds p f Coordinate where
+  _Seconds f (Coordinate lat lon) =
+    (\s1 s2 ->
+      Coordinate
+        (from _Latitude # (lat ^. _DegreesLatitude, lat ^. _Minutes, s1))
+        (from _Longitude # (lon ^. _DegreesLongitude, lon ^. _Minutes, s2))) <$> 
+    f (lat ^. _Seconds) <*> 
+    f (lon ^. _Seconds)
+
+latitudeMinutes ::  
+  (AsCoordinate (->) f coord, Functor f) =>
+  Optic' (->) f coord Minutes  
+latitudeMinutes =
+  _Coordinate . _Latitude . _Minutes
+
+latitudeSeconds ::
+  (AsCoordinate (->) f coord, Functor f) =>
+  Optic' (->) f coord Seconds
+latitudeSeconds =
+  _Coordinate . _Latitude . _Seconds
+
+longitudeMinutes ::
+  (AsCoordinate (->) f coord, Functor f) =>
+  Optic' (->) f coord Minutes  
+longitudeMinutes =
+  _Coordinate . _Longitude . _Minutes
+
+longitudeSeconds ::
+  (AsCoordinate (->) f coord, Functor f) =>
+  Optic' (->) f coord Seconds
+longitudeSeconds =
+  _Coordinate . _Longitude . _Seconds
