diff --git a/Currency/Rates.hs b/Currency/Rates.hs
new file mode 100644
--- /dev/null
+++ b/Currency/Rates.hs
@@ -0,0 +1,28 @@
+module Currency.Rates where
+
+import Prelude hiding (lookup)
+import Data.Map (Map, empty, lookup, insert)
+
+-- | A map from currency to exchange rate against some reference currency
+data Rates a b = Rates {
+		reference :: a,
+		rates :: Map a b
+	} deriving (Show, Read, Eq)
+
+-- | Change the reference currency to a different one found in the 'Map'
+rebase :: (Ord a, Fractional b) => a -> Rates a b -> Rates a b
+rebase new rs@(Rates old m)
+	| new == old = rs
+	| otherwise = Rates new $ maybe empty
+		(\newRate -> fmap (/newRate) $ insert old 1 m) $
+		lookup new m
+
+-- | Convenience function for getting a single exchange rate
+--
+-- If you're doing a lot of conversions, use 'rebase' and 'lookup'
+exchangeRate :: (Ord a, Fractional b) =>
+	Rates a b
+	-> a -- ^ Source currency
+	-> a -- ^ Target currency
+	-> Maybe b
+exchangeRate rs source target = lookup target $ rates (rebase source rs)
diff --git a/currency.cabal b/currency.cabal
--- a/currency.cabal
+++ b/currency.cabal
@@ -1,5 +1,5 @@
 name:            currency
-version:         0.1.0.0
+version:         0.2.0.0
 cabal-version:   >=1.8
 license:         OtherLicense
 license-file:     COPYING
@@ -26,10 +26,12 @@
 
 library
         exposed-modules:
-                Currency
+                Currency,
+                Currency.Rates
 
         build-depends:
                 base == 4.*,
+                containers,
                 hashable,
                 iso3166-country-codes >= 0.20111111
 
