diff --git a/Database/RethinkDB.hs b/Database/RethinkDB.hs
--- a/Database/RethinkDB.hs
+++ b/Database/RethinkDB.hs
@@ -1,4 +1,4 @@
--- | Haskell client driver for RethinkDB
+-- | Haskell client driver for RethinkDB 
 --
 -- Based upon the official Javascript, Python and Ruby API: <http://www.rethinkdb.com/api/>
 --
@@ -9,7 +9,7 @@
 -- > import qualified Database.RethinkDB.NoClash
 
 module Database.RethinkDB (
-
+  
   -- * Accessing RethinkDB
 
   connect,
@@ -26,12 +26,12 @@
   ErrorCode(..),
   Response,
   Result(..),
-
+  
   -- * Cursors
-
+  
   next, collect, collect', each,
   Cursor,
-
+  
   -- * Manipulating databases
 
   Database(..),
@@ -60,7 +60,7 @@
 
   db, table,
   get, getAll,
-  filter, between,
+  filter, between, minval, maxval,
   Bound(..),
 
   -- * Joins
@@ -97,15 +97,15 @@
   setInsert, setUnion, setIntersection, setDifference,
   (!), (!?),
   hasFields,
-  insertAt, spliceAt, deleteAt, changeAt, keys,
+  insertAt, spliceAt, deleteAt, changeAt, keys,  
   literal, remove,
   Attribute(..),
 
   -- * String manipulation
-
+  
   match, upcase, downcase,
   split, splitOn, splitMax,
-
+  
   -- * Math and logic
 
   (+), (-), (*), (/), mod,
@@ -113,14 +113,14 @@
   (==), (/=), (>), (>=), (<), (<=),
   not,
   random, randomTo, randomFromTo,
-
+  
   -- * Dates and times
-
+  
   now, time, epochTime, iso8601, inTimezone, during,
   timezone, date, timeOfDay, year, month, day, dayOfWeek,
   dayOfYear, hours, minutes, seconds,
   toIso8601, toEpochTime,
-
+  
   -- * Control structures
 
   args, apply, js, branch, forEach,
@@ -132,28 +132,27 @@
   http,
   HttpOptions(..), HttpResultFormat(..),
   HttpMethod(..), PaginationStrategy(..),
-
+  
   -- * Geospatial commands
-
+  
   circle, distance, fill, geoJSON,
   toGeoJSON, getIntersecting,
   getNearest, includes, intersects,
   line, point, polygon, polygonSub,
-  LonLat(..), Line, Polygon,
+  LonLat(..), GeoLine(..), GeoPolygon(..),
   maxResults, maxDist, unit, numVertices,
   Unit(..),
-
+  
   -- * Administration
-
+  
   config, rebalance, reconfigure,
   status, wait,
-
-
+  
   -- * Helpers
 
   ex, str, num, (#), note, empty,
   def
-
+  
   ) where
 
 import Prelude ()
diff --git a/Database/RethinkDB/Datum.hs b/Database/RethinkDB/Datum.hs
--- a/Database/RethinkDB/Datum.hs
+++ b/Database/RethinkDB/Datum.hs
@@ -1,10 +1,15 @@
-{-# LANGUAGE OverloadedStrings, PatternGuards, DefaultSignatures,
-    FlexibleInstances, OverlappingInstances #-}
+{-# LANGUAGE CPP, OverloadedStrings, PatternGuards, DefaultSignatures, FlexibleInstances #-}
+#if __GLASGOW_HASKELL__ < 710
+{-# LANGUAGE OverlappingInstances #-}
+#define PRAGMA_OVERLAPPING
+#else
+#define PRAGMA_OVERLAPPING {-# OVERLAPPING #-}
+#endif
 
 module Database.RethinkDB.Datum (
   parse, Parser, Result(..),
   Datum(..), ToDatum(..), FromDatum(..), fromDatum,
-  LonLat(..), Array, Object, Line, Polygon,
+  LonLat(..), Array, Object, GeoLine(..), GeoPolygon(..),
   (.=), (.:), (.:?),
   encode, decode, eitherDecode,
   resultToMaybe, resultToEither,
@@ -48,8 +53,8 @@
   Object Object |
   Time ZonedTime |
   Point LonLat |
-  Line Line |
-  Polygon Polygon |
+  Line GeoLine |
+  Polygon GeoPolygon |
   Binary SB.ByteString
 
 class FromDatum a where
@@ -141,19 +146,24 @@
   parseDatum (Time t) = return $ zonedTimeToUTC t
   parseDatum d = errorExpected "Time" d
 
--- TODO: This instance breaks (fmap toDatum . fromDatum) == return
 instance FromDatum a => FromDatum (Vector a) where
   parseDatum (Array v) = fmap V.fromList . mapM parseDatum $ V.toList v
-  parseDatum (Line l) = fmap V.fromList . mapM (parseDatum . toDatum) $ V.toList l
-  parseDatum (Polygon p) = fmap V.fromList . mapM (parseDatum . toDatum) $ V.toList p
-  parseDatum d = errorExpected "Array, Line or Polygon" d
+  parseDatum d = errorExpected "Array" d
 
+instance FromDatum GeoLine where
+  parseDatum (Line l) = return l
+  parseDatum d = errorExpected "Line" d
+
+instance FromDatum GeoPolygon where
+  parseDatum (Polygon p) = return p
+  parseDatum d = errorExpected "Polygon" d
+
 instance FromDatum LonLat where
   parseDatum (Point l) = return l
   parseDatum d = errorExpected "Point" d
 
 instance FromDatum Float
-instance FromDatum String
+instance PRAGMA_OVERLAPPING FromDatum String
 instance FromDatum Int
 instance FromDatum Int8
 instance FromDatum Int16
@@ -175,8 +185,10 @@
 
 type Array = Vector Datum
 type Object = HM.HashMap ST.Text Datum
-type Line = Vector LonLat
-type Polygon = Vector (Vector LonLat)
+newtype GeoLine = GeoLine { geoLinePoints :: Vector LonLat } 
+            deriving (Eq, Ord)
+newtype GeoPolygon = GeoPolygon { geoPolygonLines :: Vector (Vector LonLat) }
+            deriving (Eq, Ord)
 
 data LonLat = LonLat { longitude, latitude :: Double }
             deriving (Eq, Ord)
@@ -208,8 +220,8 @@
   show (Object o) = "{" ++ intercalate "," (map (\(k,v) -> show k ++ ":" ++ show v) $ HM.toList o) ++ "}"
   show (Time t) = "Time<" ++ show t ++ ">"
   show (Point p) = "Point<" ++ showLonLat p ++ ">"
-  show (Line l) = "Line<[" ++ intercalate "],[" (map showLonLat $ V.toList l) ++ "]>"
-  show (Polygon p) = "Polygon<[" ++ intercalate "],[" (map (\x -> "[" ++ intercalate "],[" (map showLonLat $ V.toList x) ++ "]") (V.toList p)) ++ "]>"
+  show (Line l) = "Line<[" ++ intercalate "],[" (map showLonLat $ V.toList $ geoLinePoints l) ++ "]>"
+  show (Polygon p) = "Polygon<[" ++ intercalate "],[" (map (\x -> "[" ++ intercalate "],[" (map showLonLat $ V.toList x) ++ "]") (V.toList $ geoPolygonLines p)) ++ "]>"
   show (Binary b) = "Binary<" ++ show b ++ ">"
 
 showLonLat :: LonLat -> String
@@ -305,7 +317,7 @@
 instance ToDatum Word32
 instance ToDatum Word64
 instance ToDatum Char
-instance ToDatum [Char]
+instance PRAGMA_OVERLAPPING ToDatum [Char]
 instance ToDatum Integer
 instance ToDatum ST.Text
 instance ToDatum LT.Text
@@ -324,8 +336,8 @@
         Just c <- HM.lookup "coordinates" o ->
           case t of
             "Point" | Success [lon, lat] <- fromJSON c -> Point (LonLat lon lat)
-            "LineString" | Success l <- V.mapM toLonLat =<< fromJSON c -> Line l
-            "Polygon" | Success p <- V.mapM (V.mapM toLonLat) =<< fromJSON c -> Polygon p
+            "LineString" | Success l <- V.mapM toLonLat =<< fromJSON c -> Line (GeoLine l)
+            "Polygon" | Success p <- V.mapM (V.mapM toLonLat) =<< fromJSON c -> Polygon (GeoPolygon p)
             _ -> asObject
       Just "TIME" |
         Just (J.Number ts) <- HM.lookup "epoch_time" o,
@@ -366,11 +378,11 @@
   toJSON (Line l) = J.object [
     "$reql_type$" J..= ("GEOMETRY" :: ST.Text),
     "type" J..= ("LineString" :: ST.Text),
-    "coordinates" J..= V.map pointToPair l]
+    "coordinates" J..= V.map pointToPair (geoLinePoints l)]
   toJSON (Polygon p) = J.object [
     "$reql_type$" J..= ("GEOMETRY" :: ST.Text),
     "type" J..= ("Polygon" :: ST.Text),
-    "coordinates" J..= V.map (V.map pointToPair) p]
+    "coordinates" J..= V.map (V.map pointToPair) (geoPolygonLines p)]
   toJSON (Binary b) = J.object [
     "$reql_type$" J..= ("BINARY" :: ST.Text),
     "data" J..= Char8.unpack (Base64.encode b)]
diff --git a/Database/RethinkDB/Driver.hs b/Database/RethinkDB/Driver.hs
--- a/Database/RethinkDB/Driver.hs
+++ b/Database/RethinkDB/Driver.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE OverloadedStrings, FlexibleInstances, DefaultSignatures, GADTs #-}
+{-# LANGUAGE OverloadedStrings, FlexibleInstances, DefaultSignatures, GADTs, CPP #-}
 
 module Database.RethinkDB.Driver (
   run,
@@ -14,7 +14,9 @@
 import Control.Monad
 import Control.Concurrent.MVar (MVar, takeMVar)
 import Data.Text (Text)
+#if __GLASGOW_HASKELL__ < 710
 import Control.Applicative ((<$>), (<*>))
+#endif
 import Data.List
 import Data.Maybe
 import Control.Exception (throwIO)
diff --git a/Database/RethinkDB/Functions.hs b/Database/RethinkDB/Functions.hs
--- a/Database/RethinkDB/Functions.hs
+++ b/Database/RethinkDB/Functions.hs
@@ -111,10 +111,10 @@
 -- | Like map but for write queries
 --
 -- >>> _ <- run' h $ table "users" # replace (without ["post_count"])
--- >>> run h $ forEach (table "users") (\user -> table "users" # get (user!"name") # ex update [nonAtomic] (const ["post_count" := R.count (table "posts" # R.filter (\post -> post!"author" R.== user!"name"))])) :: IO WriteResponse
+-- >>> run h $ forEach (\user -> table "users" # get (user!"name") # ex update [nonAtomic] (const ["post_count" := R.count (table "posts" # R.filter (\post -> post!"author" R.== user!"name"))])) (table "users") :: IO WriteResponse
 -- {replaced:2}
-forEach :: (Expr s, Expr a) => s -> (ReQL -> a) -> ReQL
-forEach s f = op FOR_EACH (s, expr P.. f)
+forEach :: (Expr a, Expr s) => (ReQL -> a) -> s -> ReQL
+forEach f s = op FOR_EACH (s, expr P.. f)
 
 -- | A table
 --
@@ -189,14 +189,14 @@
 -- >>> run h $ True R.|| False
 -- true
 (||) :: (Expr a, Expr b) => a -> b -> ReQL
-a || b = op ANY (a, b)
+a || b = op OR (a, b)
 
 -- | Boolean and
 --
 -- >>> run h $ True R.&& False
 -- false
 (&&) :: (Expr a, Expr b) => a -> b -> ReQL
-a && b = op ALL (a, b)
+a && b = op AND (a, b)
 
 infix 4 ==, /=
 
@@ -549,8 +549,8 @@
 --
 -- >>> run' h $ dbCreate "dev"
 -- {"config_changes":[{"new_val":{"name":"dev","id":...},"old_val":null}],"dbs_created":1}
-dbCreate :: P.String -> ReQL
-dbCreate db_name = op DB_CREATE [str db_name]
+dbCreate :: Text -> ReQL
+dbCreate db_name = op DB_CREATE [expr db_name]
 
 -- | Drop a database
 --
@@ -573,8 +573,8 @@
 -- {"created":1}
 -- >>> run' h $ table "users" # ex indexCreate ["geo":=True] "location" (!"location")
 -- {"created":1}
-indexCreate :: (Expr fun) => P.String -> fun -> Table -> ReQL
-indexCreate name f tbl = op INDEX_CREATE (tbl, str name, f)
+indexCreate :: (Expr fun) => Text -> fun -> Table -> ReQL
+indexCreate name f tbl = op INDEX_CREATE (tbl, expr name, f)
 
 -- | Get the status of the given indexes
 --
@@ -681,7 +681,7 @@
 -- >>> run h $ indexesOf (match "ba.") [str "foo", "bar", "baz"]
 -- [1,2]
 indexesOf :: (Expr fun, Expr seq) => fun -> seq -> ReQL
-indexesOf f s = op INDEXES_OF (s, f)
+indexesOf f s = op OFFSETS_OF (s, f)
 
 -- | Test if a sequence is empty
 --
@@ -992,6 +992,10 @@
 -- {inserted:1,changes:[{"old_val":null,"new_val":{"name":"sabrina"}}]}
 returnChanges :: Attribute a
 returnChanges = "return_changes" := P.True
+
+-- | Optional argument for changes
+includeStates :: Attribute a
+includeStates = "include_states" := P.True
 
 data Durability = Hard | Soft
 
diff --git a/Database/RethinkDB/MapReduce.hs b/Database/RethinkDB/MapReduce.hs
--- a/Database/RethinkDB/MapReduce.hs
+++ b/Database/RethinkDB/MapReduce.hs
diff --git a/Database/RethinkDB/Network.hs b/Database/RethinkDB/Network.hs
--- a/Database/RethinkDB/Network.hs
+++ b/Database/RethinkDB/Network.hs
@@ -168,7 +168,7 @@
       else go (c : acc)
 
 magicNumber :: Word32
-magicNumber = fromIntegral $ toWire V0_3
+magicNumber = fromIntegral $ toWire V0_4
 
 withSocket :: RethinkDBHandle -> (Socket -> IO a) -> IO a
 withSocket RethinkDBHandle{ rdbSocket, rdbWriteLock } f =
@@ -263,8 +263,6 @@
   in case type_ of
   Just SUCCESS_ATOM -> ResponseSingle <!< atom
   Just SUCCESS_PARTIAL -> ResponseBatch (Just $ More False h t) <!< results
-  Just SUCCESS_FEED -> ResponseBatch (Just $ More True h t) <!< results
-  Just SUCCESS_ATOM_FEED -> ResponseBatch (Just $ More True h t) <!< results
   Just SUCCESS_SEQUENCE -> ResponseBatch Nothing <!< results
   Just CLIENT_ERROR -> ResponseError $ RethinkDBError ErrorBrokenClient q e bt
   Just COMPILE_ERROR -> ResponseError $ RethinkDBError ErrorBadQuery q e bt
diff --git a/Database/RethinkDB/NoClash.hs b/Database/RethinkDB/NoClash.hs
--- a/Database/RethinkDB/NoClash.hs
+++ b/Database/RethinkDB/NoClash.hs
diff --git a/Database/RethinkDB/ReQL.hs b/Database/RethinkDB/ReQL.hs
--- a/Database/RethinkDB/ReQL.hs
+++ b/Database/RethinkDB/ReQL.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE ExistentialQuantification, RecordWildCards,
              ScopedTypeVariables, FlexibleInstances,
              OverloadedStrings, PatternGuards, GADTs, 
-             EmptyDataDecls, DefaultSignatures #-}
+             EmptyDataDecls, DefaultSignatures, CPP #-}
 
 -- | Building RQL queries in Haskell
 module Database.RethinkDB.ReQL (
@@ -31,7 +31,9 @@
   WireBacktrace(..),
   note,
   (?:=),
-  Arr(arr)
+  Arr(arr),
+  minval,
+  maxval
   ) where
 
 import qualified Data.Aeson as J
@@ -45,7 +47,9 @@
 import Data.String (IsString(..))
 import Data.List (intercalate)
 import Control.Monad.State (State, get, put, runState)
+#if __GLASGOW_HASKELL__ < 710
 import Control.Applicative ((<$>), (<*>))
+#endif
 import Data.Default (Default, def)
 import qualified Data.Text as T
 import qualified Data.ByteString as SB
@@ -54,7 +58,9 @@
 import Data.Time
 import Control.Monad.Fix
 import Data.Int
+#if __GLASGOW_HASKELL__ < 710
 import Data.Monoid
+#endif
 import Data.Char
 import Data.Ratio
 import Data.Word
@@ -521,16 +527,35 @@
   Open { getBound :: a } -- ^ An inclusive bound
   | Closed { getBound :: a } -- ^ An exclusive bound
   | DefaultBound { getBound :: a }
+  | MinVal
+  | MaxVal
 
+instance Expr a => Expr (Bound a) where
+  expr (Open a) = expr a
+  expr (Closed a) = expr a
+  expr (DefaultBound a) = expr a
+  expr MinVal = op MINVAL ()
+  expr MaxVal = op MAXVAL ()
+
+minval :: Bound a
+minval = MinVal
+
+maxval :: Bound a
+maxval = MaxVal
+
 instance Functor Bound where
   fmap f (Open a) = Open (f a)
   fmap f (Closed a) = Closed (f a)
   fmap f (DefaultBound a) = DefaultBound (f a)
+  fmap _ MinVal = MinVal
+  fmap _ MaxVal = MaxVal
 
 closedOrOpen :: Bound a -> Maybe T.Text
 closedOrOpen Open{} = Just "open"
 closedOrOpen Closed{} = Just "closed"
 closedOrOpen DefaultBound{} = Nothing
+closedOrOpen MinVal = Nothing
+closedOrOpen MaxVal = Nothing
 
 boundOp :: (a -> a -> a) -> Bound a -> Bound a -> Bound a
 boundOp f (Closed a) (Closed b) = Closed $ f a b
@@ -539,14 +564,23 @@
 boundOp f (Open a) (Open b) = Open $ f a b
 boundOp f (DefaultBound a) b = fmap (f a) b
 boundOp f a (DefaultBound b) = fmap (flip f b) a
+boundOp _ MaxVal a = a
+boundOp _ MinVal a = a
+boundOp _ a MaxVal = a
+boundOp _ a MinVal = a
 
 instance Num a => Num (Bound a) where
   (+) = boundOp (+)
   (-) = boundOp (-)
   (*) = boundOp (*)
-  negate = fmap negate
-  abs = fmap abs
-  signum = fmap signum
+  negate MinVal = MaxVal
+  negate MaxVal = MaxVal 
+  negate a = fmap negate a
+  abs MinVal = MaxVal
+  abs a = fmap abs a
+  signum MinVal = Open (-1)
+  signum MaxVal = Open 1
+  signum a = fmap signum a
   fromInteger = DefaultBound . fromInteger
 
 -- | An empty object
diff --git a/Database/RethinkDB/Wire/Response.hs b/Database/RethinkDB/Wire/Response.hs
--- a/Database/RethinkDB/Wire/Response.hs
+++ b/Database/RethinkDB/Wire/Response.hs
@@ -1,27 +1,39 @@
 module Database.RethinkDB.Wire.Response where
 import Prelude (Maybe(..), Eq, Show)
 import Database.RethinkDB.Wire
-data ResponseType = SUCCESS_ATOM | SUCCESS_SEQUENCE | SUCCESS_PARTIAL | SUCCESS_FEED | WAIT_COMPLETE | SUCCESS_ATOM_FEED | CLIENT_ERROR | COMPILE_ERROR | RUNTIME_ERROR
+data ResponseType = SUCCESS_ATOM | SUCCESS_SEQUENCE | SUCCESS_PARTIAL | WAIT_COMPLETE | CLIENT_ERROR | COMPILE_ERROR | RUNTIME_ERROR
   deriving (Eq, Show)
 instance WireValue ResponseType where
   toWire SUCCESS_ATOM = 1
   toWire SUCCESS_SEQUENCE = 2
   toWire SUCCESS_PARTIAL = 3
-  toWire SUCCESS_FEED = 5
   toWire WAIT_COMPLETE = 4
-  toWire SUCCESS_ATOM_FEED = 6
   toWire CLIENT_ERROR = 16
   toWire COMPILE_ERROR = 17
   toWire RUNTIME_ERROR = 18
   fromWire 1 = Just SUCCESS_ATOM
   fromWire 2 = Just SUCCESS_SEQUENCE
   fromWire 3 = Just SUCCESS_PARTIAL
-  fromWire 5 = Just SUCCESS_FEED
   fromWire 4 = Just WAIT_COMPLETE
-  fromWire 6 = Just SUCCESS_ATOM_FEED
   fromWire 16 = Just CLIENT_ERROR
   fromWire 17 = Just COMPILE_ERROR
   fromWire 18 = Just RUNTIME_ERROR
+  fromWire _ = Nothing
+
+
+data ResponseNote = SEQUENCE_FEED | ATOM_FEED | ORDER_BY_LIMIT_FEED | UNIONED_FEED | INCLUDES_STATES
+  deriving (Eq, Show)
+instance WireValue ResponseNote where
+  toWire SEQUENCE_FEED = 1
+  toWire ATOM_FEED = 2
+  toWire ORDER_BY_LIMIT_FEED = 3
+  toWire UNIONED_FEED = 4
+  toWire INCLUDES_STATES = 5
+  fromWire 1 = Just SEQUENCE_FEED
+  fromWire 2 = Just ATOM_FEED
+  fromWire 3 = Just ORDER_BY_LIMIT_FEED
+  fromWire 4 = Just UNIONED_FEED
+  fromWire 5 = Just INCLUDES_STATES
   fromWire _ = Nothing
 
 
diff --git a/Database/RethinkDB/Wire/Term.hs b/Database/RethinkDB/Wire/Term.hs
--- a/Database/RethinkDB/Wire/Term.hs
+++ b/Database/RethinkDB/Wire/Term.hs
@@ -1,7 +1,7 @@
 module Database.RethinkDB.Wire.Term where
 import Prelude (Maybe(..), Eq, Show)
 import Database.RethinkDB.Wire
-data TermType = DATUM | MAKE_ARRAY | MAKE_OBJ | VAR | JAVASCRIPT | UUID | HTTP | ERROR | IMPLICIT_VAR | DB | TABLE | GET | GET_ALL | EQ | NE | LT | LE | GT | GE | NOT | ADD | SUB | MUL | DIV | MOD | APPEND | PREPEND | DIFFERENCE | SET_INSERT | SET_INTERSECTION | SET_UNION | SET_DIFFERENCE | SLICE | SKIP | LIMIT | INDEXES_OF | CONTAINS | GET_FIELD | KEYS | OBJECT | HAS_FIELDS | WITH_FIELDS | PLUCK | WITHOUT | MERGE | BETWEEN | REDUCE | MAP | FILTER | CONCAT_MAP | ORDER_BY | DISTINCT | COUNT | IS_EMPTY | UNION | NTH | BRACKET | INNER_JOIN | OUTER_JOIN | EQ_JOIN | ZIP | RANGE | INSERT_AT | DELETE_AT | CHANGE_AT | SPLICE_AT | COERCE_TO | TYPE_OF | UPDATE | DELETE | REPLACE | INSERT | DB_CREATE | DB_DROP | DB_LIST | TABLE_CREATE | TABLE_DROP | TABLE_LIST | CONFIG | STATUS | WAIT | RECONFIGURE | REBALANCE | SYNC | INDEX_CREATE | INDEX_DROP | INDEX_LIST | INDEX_STATUS | INDEX_WAIT | INDEX_RENAME | FUNCALL | BRANCH | ANY | ALL | FOR_EACH | FUNC | ASC | DESC | INFO | MATCH | UPCASE | DOWNCASE | SAMPLE | DEFAULT | JSON | TO_JSON_STRING | ISO8601 | TO_ISO8601 | EPOCH_TIME | TO_EPOCH_TIME | NOW | IN_TIMEZONE | DURING | DATE | TIME_OF_DAY | TIMEZONE | YEAR | MONTH | DAY | DAY_OF_WEEK | DAY_OF_YEAR | HOURS | MINUTES | SECONDS | TIME | MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY | SATURDAY | SUNDAY | JANUARY | FEBRUARY | MARCH | APRIL | MAY | JUNE | JULY | AUGUST | SEPTEMBER | OCTOBER | NOVEMBER | DECEMBER | LITERAL | GROUP | SUM | AVG | MIN | MAX | SPLIT | UNGROUP | RANDOM | CHANGES | ARGS | BINARY | GEOJSON | TO_GEOJSON | POINT | LINE | POLYGON | DISTANCE | INTERSECTS | INCLUDES | CIRCLE | GET_INTERSECTING | FILL | GET_NEAREST | POLYGON_SUB
+data TermType = DATUM | MAKE_ARRAY | MAKE_OBJ | VAR | JAVASCRIPT | UUID | HTTP | ERROR | IMPLICIT_VAR | DB | TABLE | GET | GET_ALL | EQ | NE | LT | LE | GT | GE | NOT | ADD | SUB | MUL | DIV | MOD | APPEND | PREPEND | DIFFERENCE | SET_INSERT | SET_INTERSECTION | SET_UNION | SET_DIFFERENCE | SLICE | SKIP | LIMIT | OFFSETS_OF | CONTAINS | GET_FIELD | KEYS | OBJECT | HAS_FIELDS | WITH_FIELDS | PLUCK | WITHOUT | MERGE | BETWEEN_DEPRECATED | BETWEEN | REDUCE | MAP | FILTER | CONCAT_MAP | ORDER_BY | DISTINCT | COUNT | IS_EMPTY | UNION | NTH | BRACKET | INNER_JOIN | OUTER_JOIN | EQ_JOIN | ZIP | RANGE | INSERT_AT | DELETE_AT | CHANGE_AT | SPLICE_AT | COERCE_TO | TYPE_OF | UPDATE | DELETE | REPLACE | INSERT | DB_CREATE | DB_DROP | DB_LIST | TABLE_CREATE | TABLE_DROP | TABLE_LIST | CONFIG | STATUS | WAIT | RECONFIGURE | REBALANCE | SYNC | INDEX_CREATE | INDEX_DROP | INDEX_LIST | INDEX_STATUS | INDEX_WAIT | INDEX_RENAME | FUNCALL | BRANCH | OR | AND | FOR_EACH | FUNC | ASC | DESC | INFO | MATCH | UPCASE | DOWNCASE | SAMPLE | DEFAULT | JSON | TO_JSON_STRING | ISO8601 | TO_ISO8601 | EPOCH_TIME | TO_EPOCH_TIME | NOW | IN_TIMEZONE | DURING | DATE | TIME_OF_DAY | TIMEZONE | YEAR | MONTH | DAY | DAY_OF_WEEK | DAY_OF_YEAR | HOURS | MINUTES | SECONDS | TIME | MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY | SATURDAY | SUNDAY | JANUARY | FEBRUARY | MARCH | APRIL | MAY | JUNE | JULY | AUGUST | SEPTEMBER | OCTOBER | NOVEMBER | DECEMBER | LITERAL | GROUP | SUM | AVG | MIN | MAX | SPLIT | UNGROUP | RANDOM | CHANGES | ARGS | BINARY | GEOJSON | TO_GEOJSON | POINT | LINE | POLYGON | DISTANCE | INTERSECTS | INCLUDES | CIRCLE | GET_INTERSECTING | FILL | GET_NEAREST | POLYGON_SUB | MINVAL | MAXVAL
   deriving (Eq, Show)
 instance WireValue TermType where
   toWire DATUM = 1
@@ -39,7 +39,7 @@
   toWire SLICE = 30
   toWire SKIP = 70
   toWire LIMIT = 71
-  toWire INDEXES_OF = 87
+  toWire OFFSETS_OF = 87
   toWire CONTAINS = 93
   toWire GET_FIELD = 31
   toWire KEYS = 94
@@ -49,7 +49,8 @@
   toWire PLUCK = 33
   toWire WITHOUT = 34
   toWire MERGE = 35
-  toWire BETWEEN = 36
+  toWire BETWEEN_DEPRECATED = 36
+  toWire BETWEEN = 182
   toWire REDUCE = 37
   toWire MAP = 38
   toWire FILTER = 39
@@ -96,8 +97,8 @@
   toWire INDEX_RENAME = 156
   toWire FUNCALL = 64
   toWire BRANCH = 65
-  toWire ANY = 66
-  toWire ALL = 67
+  toWire OR = 66
+  toWire AND = 67
   toWire FOR_EACH = 68
   toWire FUNC = 69
   toWire ASC = 73
@@ -173,6 +174,8 @@
   toWire FILL = 167
   toWire GET_NEAREST = 168
   toWire POLYGON_SUB = 171
+  toWire MINVAL = 180
+  toWire MAXVAL = 181
   fromWire 1 = Just DATUM
   fromWire 2 = Just MAKE_ARRAY
   fromWire 3 = Just MAKE_OBJ
@@ -208,7 +211,7 @@
   fromWire 30 = Just SLICE
   fromWire 70 = Just SKIP
   fromWire 71 = Just LIMIT
-  fromWire 87 = Just INDEXES_OF
+  fromWire 87 = Just OFFSETS_OF
   fromWire 93 = Just CONTAINS
   fromWire 31 = Just GET_FIELD
   fromWire 94 = Just KEYS
@@ -218,7 +221,8 @@
   fromWire 33 = Just PLUCK
   fromWire 34 = Just WITHOUT
   fromWire 35 = Just MERGE
-  fromWire 36 = Just BETWEEN
+  fromWire 36 = Just BETWEEN_DEPRECATED
+  fromWire 182 = Just BETWEEN
   fromWire 37 = Just REDUCE
   fromWire 38 = Just MAP
   fromWire 39 = Just FILTER
@@ -265,8 +269,8 @@
   fromWire 156 = Just INDEX_RENAME
   fromWire 64 = Just FUNCALL
   fromWire 65 = Just BRANCH
-  fromWire 66 = Just ANY
-  fromWire 67 = Just ALL
+  fromWire 66 = Just OR
+  fromWire 67 = Just AND
   fromWire 68 = Just FOR_EACH
   fromWire 69 = Just FUNC
   fromWire 73 = Just ASC
@@ -342,6 +346,8 @@
   fromWire 167 = Just FILL
   fromWire 168 = Just GET_NEAREST
   fromWire 171 = Just POLYGON_SUB
+  fromWire 180 = Just MINVAL
+  fromWire 181 = Just MAXVAL
   fromWire _ = Nothing
 
 
diff --git a/Database/RethinkDB/Wire/VersionDummy.hs b/Database/RethinkDB/Wire/VersionDummy.hs
--- a/Database/RethinkDB/Wire/VersionDummy.hs
+++ b/Database/RethinkDB/Wire/VersionDummy.hs
@@ -1,15 +1,17 @@
 module Database.RethinkDB.Wire.VersionDummy where
 import Prelude (Maybe(..), Eq, Show)
 import Database.RethinkDB.Wire
-data Version = V0_1 | V0_2 | V0_3
+data Version = V0_1 | V0_2 | V0_3 | V0_4
   deriving (Eq, Show)
 instance WireValue Version where
   toWire V0_1 = 0x3f61ba36
   toWire V0_2 = 0x723081e1
   toWire V0_3 = 0x5f75e83e
+  toWire V0_4 = 0x400c2d20
   fromWire 0x3f61ba36 = Just V0_1
   fromWire 0x723081e1 = Just V0_2
   fromWire 0x5f75e83e = Just V0_3
+  fromWire 0x400c2d20 = Just V0_4
   fromWire _ = Nothing
 
 
diff --git a/rethinkdb.cabal b/rethinkdb.cabal
--- a/rethinkdb.cabal
+++ b/rethinkdb.cabal
@@ -1,12 +1,12 @@
 name: rethinkdb
-version: 1.16.0.0
+version: 2.0.0.0
 cabal-version: >=1.8
 build-type: Simple
 license: Apache
 license-file: LICENSE
 maintainer: Etienne Laurin <etienne@atnnn.com>
 homepage: http://github.com/atnnn/haskell-rethinkdb
-synopsis: A driver for RethinkDB 1.16
+synopsis: A driver for RethinkDB 2.0
 description:
     A driver for the RethinkDB database server
 category: Database
@@ -22,18 +22,18 @@
 
 library
     build-depends:
-        base >=4 && <4.8,
+        base >=4 && <4.9,
         unordered-containers ==0.2.*,
         text >=0.11 && <1.3,
-        aeson >=0.7 && <0.9,
+        aeson >=0.7 && <0.10,
         bytestring ==0.10.*,
         containers ==0.5.*,
         data-default ==0.5.*,
         network >=2.4 && <2.7,
         mtl >=2.1 && <2.3,
         vector ==0.10.*,
-        time ==1.4.*,
-        utf8-string ==0.3.*,
+        time >=1.4 && <1.6,
+        utf8-string >=0.3 && <1.1,
         binary >=0.5 && <0.8,
         scientific ==0.3.*,
         base64-bytestring ==1.0.*
