diff --git a/coordinate.cabal b/coordinate.cabal
--- a/coordinate.cabal
+++ b/coordinate.cabal
@@ -1,5 +1,5 @@
 name:               coordinate
-version:            0.0.6
+version:            0.0.7
 license:            BSD3
 license-File:       etc/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
@@ -1,6 +1,7 @@
 module Data.Geo.Coordinate.Coordinate(
   Coordinate
 , (.#.)
+, (..#..)
 , HasCoordinate(..)
 , coordinateLatLon
 , coordinateLonLat
@@ -9,8 +10,9 @@
 , coordinateDMSLatDMSLon
 ) where
 
-import Prelude(Eq, Show, Ord, id, (.))
-import Control.Lens(Iso', Lens', iso, lens, mapping, swapped, withIso)
+import Prelude(Eq, Show, Ord, Double, id, return, (.))
+import Data.Maybe(Maybe)
+import Control.Lens(Iso', Lens', iso, lens, mapping, swapped, withIso, (^?))
 import Data.Geo.Coordinate.Latitude
 import Data.Geo.Coordinate.Longitude
 import Data.Geo.Coordinate.DegreesLatitude
@@ -24,12 +26,24 @@
     Longitude
   deriving (Eq, Ord, Show)
 
+-- | Build a coordinate from a latitude and longitude.
 (.#.) ::
   Latitude
   -> Longitude
   -> Coordinate
 (.#.) =
   Coordinate
+
+-- | Build a coordinate from a fractional latitude and fractional longitude. Fails
+-- if either are out of range.
+(..#..) ::
+  Double
+  -> Double
+  -> Maybe Coordinate
+lat ..#.. lon =
+  do lat' <- lat ^? fracLatitude
+     lon' <- lon ^? fracLongitude
+     return (lat' .#. lon')
 
 coordinateLatLon ::
   Iso' (Latitude, Longitude) Coordinate
diff --git a/src/Data/Geo/Coordinate/Minutes.hs b/src/Data/Geo/Coordinate/Minutes.hs
--- a/src/Data/Geo/Coordinate/Minutes.hs
+++ b/src/Data/Geo/Coordinate/Minutes.hs
@@ -2,11 +2,13 @@
   Minutes
 , HasMinutes(..)
 , nMinutes
+, modMinutes
 ) where
 
 import Prelude(Functor, Int, Bool(..), Eq, Show, Ord(..), (&&), id)
 import Data.Maybe(Maybe(..))
 import Control.Lens(Prism', Lens', prism')
+import Data.Fixed(mod')
 
 -- $setup
 -- >>> import Control.Lens((#), (^?))
@@ -16,6 +18,29 @@
 newtype Minutes =
   Minutes Int
   deriving (Eq, Ord, Show)
+
+-- | Construct minutes such that if the given value is out of bounds,
+-- a modulus is taken to keep it within 0 inclusive and 59 inclusive.
+--
+-- >>> modMinutes 7
+-- Minutes 7
+--
+-- >>> modMinutes 0
+-- Minutes 0
+--
+-- >>> modMinutes 60
+-- Minutes 0
+--
+-- >>> modMinutes 61
+-- Minutes 1
+--
+-- >>> modMinutes 59
+-- Minutes 59
+modMinutes ::
+  Int
+  -> Minutes
+modMinutes x =
+  Minutes (x `mod'` 60)
 
 -- | A prism on minutes to an integer between 0 and 59 inclusive.
 --
diff --git a/src/Data/Geo/Coordinate/Seconds.hs b/src/Data/Geo/Coordinate/Seconds.hs
--- a/src/Data/Geo/Coordinate/Seconds.hs
+++ b/src/Data/Geo/Coordinate/Seconds.hs
@@ -1,6 +1,7 @@
 module Data.Geo.Coordinate.Seconds(
   Seconds
 , HasSeconds(..)
+, modSeconds
 , nSeconds
 ) where
 
@@ -8,6 +9,7 @@
 import Data.Maybe(Maybe(..))
 import Control.Lens(Prism', Lens', prism')
 import Text.Printf(printf)
+import Data.Fixed(mod')
 
 -- $setup
 -- >>> import Control.Lens((#), (^?))
@@ -23,6 +25,32 @@
 instance Show Seconds where
   showsPrec n (Seconds d) =
     showParen (n > 10) (showString ("Seconds " ++ printf "%0.4f" d))
+
+-- | Construct seconds such that if the given value is out of bounds,
+-- a modulus is taken to keep it within 0 inclusive and 60 exclusive.
+--
+-- >>> modSeconds 7
+-- Seconds 7.0000
+--
+-- >>> modSeconds 0
+-- Seconds 0.0000
+--
+-- >>> modSeconds (-0.0001)
+-- Seconds 59.9999
+--
+-- >>> modSeconds 60
+-- Seconds 0.0000
+--
+-- >>> modSeconds 59.99999
+-- Seconds 60.0000
+--
+-- >>> modSeconds 59.999
+-- Seconds 59.9990
+modSeconds ::
+  Double
+  -> Seconds
+modSeconds x =
+  Seconds (x `mod'` 60)
 
 -- | A prism on seconds to a double between 0 inclusive and 60 exclusive.
 --
