diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+0.0.20
+
+* fix modulo arithmetic for latitude and longitude.
+
 0.0.19
 
 * Add lenses from latitude, longitude minutes, seconds.
diff --git a/coordinate.cabal b/coordinate.cabal
--- a/coordinate.cabal
+++ b/coordinate.cabal
@@ -1,5 +1,5 @@
 name:               coordinate
-version:            0.0.19
+version:            0.0.20
 license:            BSD3
 license-file:       LICENCE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
diff --git a/src/Data/Geo/Coordinate/DegreesLatitude.hs b/src/Data/Geo/Coordinate/DegreesLatitude.hs
--- a/src/Data/Geo/Coordinate/DegreesLatitude.hs
+++ b/src/Data/Geo/Coordinate/DegreesLatitude.hs
@@ -5,18 +5,18 @@
 module Data.Geo.Coordinate.DegreesLatitude(
   DegreesLatitude
 , AsDegreesLatitude(..)
-, remDegreesLatitude
+, modDegreesLatitude
 ) where
 
 import Control.Applicative(Applicative)
 import Control.Category(Category(id))
 import Control.Lens(Optic', Choice, prism')
 import Data.Bool((&&))
-import Data.Eq(Eq)
+import Data.Eq(Eq((==)))
 import Data.Int(Int)
 import Data.Maybe(Maybe(Just, Nothing))
 import Data.Ord(Ord((<), (>)))
-import Prelude(Show, rem)
+import Prelude(Show, mod, Num((+), (-)))
 
 -- $setup
 -- >>> import Control.Lens((#), (^?))
@@ -66,22 +66,37 @@
 
 -- | Setting a value @>= 90@ will get that value @(`rem` 90)@.
 --
--- >>> remDegreesLatitude 7
+-- >>> modDegreesLatitude 7
 -- DegreesLatitude 7
 --
--- >>> remDegreesLatitude 0
+-- >>> modDegreesLatitude 0
 -- DegreesLatitude 0
 --
--- >>> remDegreesLatitude 90
--- DegreesLatitude 0
+-- >>> modDegreesLatitude 90
+-- DegreesLatitude 90
 --
--- >>> remDegreesLatitude 1
+-- >>> modDegreesLatitude (-90)
+-- DegreesLatitude (-90)
+--
+-- >>> modDegreesLatitude 1
 -- DegreesLatitude 1
 --
--- >>> remDegreesLatitude 89
+-- >>> modDegreesLatitude 89
 -- DegreesLatitude 89 
-remDegreesLatitude ::
+--
+-- >>> modDegreesLatitude 91
+-- DegreesLatitude (-89)
+--
+-- >>> modDegreesLatitude (-91)
+-- DegreesLatitude 89
+--
+-- >>> modDegreesLatitude 300
+-- DegreesLatitude (-60)
+--
+-- >>> modDegreesLatitude (-300)
+-- DegreesLatitude 60
+modDegreesLatitude ::
   Int
   -> DegreesLatitude
-remDegreesLatitude x =
-  DegreesLatitude (x `rem` 90)
+modDegreesLatitude x =
+  DegreesLatitude (if x == 90 then 90 else mod (x + 90) 180 - 90)
diff --git a/src/Data/Geo/Coordinate/DegreesLongitude.hs b/src/Data/Geo/Coordinate/DegreesLongitude.hs
--- a/src/Data/Geo/Coordinate/DegreesLongitude.hs
+++ b/src/Data/Geo/Coordinate/DegreesLongitude.hs
@@ -5,18 +5,18 @@
 module Data.Geo.Coordinate.DegreesLongitude(
   DegreesLongitude
 , AsDegreesLongitude(..)
-, remDegreesLongitude
+, modDegreesLongitude
 ) where
 
 import Control.Applicative(Applicative)
 import Control.Category(Category(id))
 import Control.Lens(Optic', Choice, prism')
 import Data.Bool((&&))
-import Data.Eq(Eq)
+import Data.Eq(Eq((==)))
 import Data.Int(Int)
 import Data.Maybe(Maybe(Just, Nothing))
 import Data.Ord(Ord((<), (>)))
-import Prelude(Show, rem)
+import Prelude(Show, mod, Num((+), (-)))
 
 -- $setup
 -- >>> import Control.Lens((#), (^?))
@@ -66,22 +66,37 @@
 
 -- | Setting a value @>= 180@ will get that value @(`rem` 180)@.
 --
--- >>> remDegreesLongitude 7
+-- >>> modDegreesLongitude 7
 -- DegreesLongitude 7
 --
--- >>> remDegreesLongitude 0
+-- >>> modDegreesLongitude 0
 -- DegreesLongitude 0
 --
--- >>> remDegreesLongitude 180
--- DegreesLongitude 0
+-- >>> modDegreesLongitude 180
+-- DegreesLongitude 180
 --
--- >>> remDegreesLongitude 1
+-- >>> modDegreesLongitude (-180)
+-- DegreesLongitude (-180)
+--
+-- >>> modDegreesLongitude 1
 -- DegreesLongitude 1
 --
--- >>> remDegreesLongitude 179
+-- >>> modDegreesLongitude 179
 -- DegreesLongitude 179 
-remDegreesLongitude ::
+--
+-- >>> modDegreesLongitude 181
+-- DegreesLongitude (-179)
+--
+-- >>> modDegreesLongitude (-181)
+-- DegreesLongitude 179
+--
+-- >>> modDegreesLongitude 600
+-- DegreesLongitude (-120)
+--
+-- >>> modDegreesLongitude (-600)
+-- DegreesLongitude 120
+modDegreesLongitude ::
   Int
   -> DegreesLongitude
-remDegreesLongitude x =
-  DegreesLongitude (x `rem` 180)
+modDegreesLongitude x =
+  DegreesLongitude (if x == 180 then 180 else mod (x + 180) 360 - 180)
