diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+0.0.13
+
+* Tidy up imports
+:
+* Tidy up code duplication
+
 0.0.12
 
 * Remove extraneous frac Prism
diff --git a/coordinate.cabal b/coordinate.cabal
--- a/coordinate.cabal
+++ b/coordinate.cabal
@@ -1,5 +1,5 @@
 name:               coordinate
-version:            0.0.12
+version:            0.0.13
 license:            BSD3
 license-file:       LICENCE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
@@ -28,6 +28,7 @@
   build-depends:
                       base < 5 && >= 3
                     , lens >= 4.0
+                    , tagged >= 0.7
                     , transformers >= 0.3.0.0
 
   ghc-options:
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
@@ -2,6 +2,7 @@
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE GADTs #-}
 
 module Data.Geo.Coordinate.Coordinate(
@@ -13,9 +14,10 @@
 
 import Control.Applicative(Applicative)
 import Control.Category(Category(id, (.)))
-import Control.Lens(Choice, swapped, Profunctor, Optic', (^.), iso, lens, prism', swapped, (^?), (#))
+import Control.Lens(Identity, Const, Prism', Choice, swapped, Profunctor, Optic', (^.), iso, lens, prism', swapped, (^?), (#))
 import Control.Monad(Monad(return))
 import Data.Eq(Eq)
+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)
@@ -23,9 +25,11 @@
 import Data.Geo.Coordinate.Minutes(Minutes)
 import Data.Geo.Coordinate.Seconds(Seconds)
 import Data.Maybe(Maybe)
+import Data.Monoid(First)
 import Data.Ord(Ord)
+import Data.Tagged(Tagged)
 import Data.Tuple(curry, uncurry)
-import Prelude(Double, Functor, Show, Double)
+import Prelude(Show, Double)
 
 data Coordinate =
   Coordinate
@@ -96,48 +100,49 @@
   _Coordinate =
     swapped . _Coordinate
 
-instance (Choice p, Applicative f) => AsCoordinate p f (Double, Double) where
-  _Coordinate =
-    prism'
-      (\(Coordinate lat lon) -> (_Latitude # lat, _Longitude # lon))
+coordinatePrism' ::
+  (
+    AsLatitude Tagged Identity lat
+  , AsLatitude (->) (Const (First Latitude)) lat
+  , AsLongitude Tagged Identity lon
+  , AsLongitude (->) (Const (First Longitude)) lon) =>
+  Prism' (lat, lon) Coordinate
+coordinatePrism' =
+  coordinatePrism (_Latitude #) (_Longitude #) (^? _Latitude) (^? _Longitude)
+
+coordinatePrism ::
+  (Latitude -> lat)
+  -> (Longitude -> lon)
+  -> (lat -> Maybe Latitude)
+  -> (lon -> Maybe Longitude)
+  -> Prism' (lat, lon) Coordinate
+coordinatePrism f g h i =
+  prism'
+      (\(Coordinate lat lon) -> (f lat, g lon))
       (\(lat, lon) ->
-        do lat' <- lat ^? _Latitude
-           lon' <- lon ^? _Longitude
+        do lat' <- h lat
+           lon' <- i lon
            return (Coordinate lat' lon'))
 
-instance (Choice p, Applicative f) => AsCoordinate p f (Latitude, Double) where
+instance (Choice p, Applicative f) => AsCoordinate p f (Double, Double) where
   _Coordinate =
-    prism'
-      (\(Coordinate lat lon) -> (lat, _Longitude # lon))
-      (\(lat, lon) ->
-        do lon' <- lon ^? _Longitude
-           return (Coordinate lat lon'))
+    coordinatePrism'
 
+instance (Choice p, Applicative f) => AsCoordinate p f (Latitude, Double) where
+  _Coordinate =
+    coordinatePrism id (_Longitude #) return (^? _Longitude)
+    
 instance (Choice p, Applicative f) => AsCoordinate p f (Double, Longitude) where
   _Coordinate =
-    prism'
-      (\(Coordinate lat lon) -> (_Latitude # lat, lon))
-      (\(lat, lon) ->
-        do lat' <- lat ^? _Latitude
-           return (Coordinate lat' lon))
+    coordinatePrism (_Latitude #) id (^? _Latitude) return
 
 instance (Choice p, Applicative f) => AsCoordinate p f ((DegreesLatitude, Minutes, Seconds), Double) where
   _Coordinate =
-    prism'
-      (\(Coordinate lat lon) -> (_Latitude # lat, _Longitude # lon))
-      (\(lat, lon) ->
-        do lat' <- lat ^? _Latitude
-           lon' <- lon ^? _Longitude
-           return (Coordinate lat' lon'))
+    coordinatePrism'
 
 instance (Choice p, Applicative f) => AsCoordinate p f (Double, (DegreesLongitude, Minutes, Seconds)) where
   _Coordinate =
-    prism'
-      (\(Coordinate lat lon) -> (_Latitude # lat, _Longitude # lon))
-      (\(lat, lon) ->
-        do lat' <- lat ^? _Latitude
-           lon' <- lon ^? _Longitude
-           return (Coordinate lat' lon'))
+    coordinatePrism'
 
 instance (p ~ (->), Functor f) => AsLatitude p f Coordinate where
   _Latitude =
diff --git a/src/Data/Geo/Coordinate/Latitude.hs b/src/Data/Geo/Coordinate/Latitude.hs
--- a/src/Data/Geo/Coordinate/Latitude.hs
+++ b/src/Data/Geo/Coordinate/Latitude.hs
@@ -13,11 +13,12 @@
 import Control.Lens(Choice, Profunctor, Optic', iso, prism', lens, (#), (^?))
 import Control.Monad(Monad(return))
 import Data.Eq(Eq)
+import Data.Functor(Functor)
 import Data.Geo.Coordinate.DegreesLatitude(DegreesLatitude, AsDegreesLatitude(_DegreesLatitude))
 import Data.Geo.Coordinate.Minutes(AsMinutes(_Minutes), Minutes)
 import Data.Geo.Coordinate.Seconds(AsSeconds(_Seconds), Seconds)
 import Data.Ord(Ord((<)))
-import Prelude(Functor, Double, Show, Int, Num((+), (*), (-), abs), Fractional((/)), properFraction, fromIntegral)
+import Prelude(Double, Show, Int, Num((+), (*), (-), abs), Fractional((/)), properFraction, fromIntegral)
 
 -- $setup
 -- >>> import Prelude(Functor(..))
diff --git a/src/Data/Geo/Coordinate/Longitude.hs b/src/Data/Geo/Coordinate/Longitude.hs
--- a/src/Data/Geo/Coordinate/Longitude.hs
+++ b/src/Data/Geo/Coordinate/Longitude.hs
@@ -10,14 +10,15 @@
 
 import Control.Applicative(Applicative)
 import Control.Category(Category(id))
-import Control.Lens(Choice, Profunctor, Optic', Prism', iso, prism', lens, (#), (^?))
+import Control.Lens(Choice, Profunctor, Optic', iso, prism', lens, (#), (^?))
 import Control.Monad(Monad(return))
 import Data.Eq(Eq)
+import Data.Functor(Functor)
 import Data.Geo.Coordinate.DegreesLongitude(DegreesLongitude, AsDegreesLongitude(_DegreesLongitude))
 import Data.Geo.Coordinate.Minutes(AsMinutes(_Minutes), Minutes)
 import Data.Geo.Coordinate.Seconds(AsSeconds(_Seconds), Seconds)
 import Data.Ord(Ord((<)))
-import Prelude(Functor, Double, Show, Int, Num((+), (*), (-), abs), Fractional((/)), properFraction, fromIntegral)
+import Prelude(Double, Show, Int, Num((+), (*), (-), abs), Fractional((/)), properFraction, fromIntegral)
 
 -- $setup
 -- >>> import Prelude(Functor(..))
