diff --git a/hedis.cabal b/hedis.cabal
--- a/hedis.cabal
+++ b/hedis.cabal
@@ -1,5 +1,5 @@
 name:               hedis
-version:            0.6.9
+version:            0.6.10
 synopsis:
     Client library for the Redis datastore: supports full command set,  
     pipelining.
diff --git a/src/Database/Redis/Commands.hs b/src/Database/Redis/Commands.hs
--- a/src/Database/Redis/Commands.hs
+++ b/src/Database/Redis/Commands.hs
@@ -55,6 +55,11 @@
 hsetnx, -- |Set the value of a hash field, only if the field does not exist (<http://redis.io/commands/hsetnx>).
 hvals, -- |Get all the values in a hash (<http://redis.io/commands/hvals>).
 
+-- ** HyperLogLogs
+pfadd, -- |Adds all the elements arguments to the HyperLogLog data structure stored at the variable name specified as first argument. (<http://redis.io/commands/pfadd>).
+pfcount, -- |Returns the approximated cardinality for the union of the HyperLogLogs stored in the specified keys. (<http://redis.io/commands/pfcount>).
+pfmerge, -- |Merge multiple HyperLogLog values into an unique value that will approximate the cardinality of the union of the observed Sets of the source HyperLogLog structures. (<http://redis.io/commands/pfmerge>).
+
 -- ** Lists
 blpop, -- |Remove and get the first element in a list, or block until one is available (<http://redis.io/commands/blpop>).
 brpop, -- |Remove and get the last element in a list, or block until one is available (<http://redis.io/commands/brpop>).
@@ -201,49 +206,31 @@
 import Database.Redis.Types
 import Database.Redis.Core
 
-bgrewriteaof
-    :: (RedisCtx m f)
-    => m (f Status)
-bgrewriteaof  = sendRequest (["BGREWRITEAOF"] )
-
-sinter
-    :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> m (f [ByteString])
-sinter key = sendRequest (["SINTER"] ++ map encode key )
-
-scriptExists
-    :: (RedisCtx m f)
-    => [ByteString] -- ^ script
-    -> m (f [Bool])
-scriptExists script = sendRequest (["SCRIPT","EXISTS"] ++ map encode script )
-
-sunionstore
+ttl
     :: (RedisCtx m f)
-    => ByteString -- ^ destination
-    -> [ByteString] -- ^ key
+    => ByteString -- ^ key
     -> m (f Integer)
-sunionstore destination key = sendRequest (["SUNIONSTORE"] ++ [encode destination] ++ map encode key )
+ttl key = sendRequest (["TTL"] ++ [encode key] )
 
-setex
+setnx
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ seconds
     -> ByteString -- ^ value
-    -> m (f Status)
-setex key seconds value = sendRequest (["SETEX"] ++ [encode key] ++ [encode seconds] ++ [encode value] )
+    -> m (f Bool)
+setnx key value = sendRequest (["SETNX"] ++ [encode key] ++ [encode value] )
 
-hlen
+pttl
     :: (RedisCtx m f)
     => ByteString -- ^ key
     -> m (f Integer)
-hlen key = sendRequest (["HLEN"] ++ [encode key] )
+pttl key = sendRequest (["PTTL"] ++ [encode key] )
 
-scard
+zrank
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f Integer)
-scard key = sendRequest (["SCARD"] ++ [encode key] )
+    -> ByteString -- ^ member
+    -> m (f (Maybe Integer))
+zrank key member = sendRequest (["ZRANK"] ++ [encode key] ++ [encode member] )
 
 zremrangebyscore
     :: (RedisCtx m f)
@@ -253,12 +240,11 @@
     -> m (f Integer)
 zremrangebyscore key min max = sendRequest (["ZREMRANGEBYSCORE"] ++ [encode key] ++ [encode min] ++ [encode max] )
 
-rpushx
+hkeys
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ value
-    -> m (f Integer)
-rpushx key value = sendRequest (["RPUSHX"] ++ [encode key] ++ [encode value] )
+    -> m (f [ByteString])
+hkeys key = sendRequest (["HKEYS"] ++ [encode key] )
 
 spop
     :: (RedisCtx m f)
@@ -266,18 +252,19 @@
     -> m (f (Maybe ByteString))
 spop key = sendRequest (["SPOP"] ++ [encode key] )
 
-pttl
+slaveof
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> m (f Integer)
-pttl key = sendRequest (["PTTL"] ++ [encode key] )
+    => ByteString -- ^ host
+    -> ByteString -- ^ port
+    -> m (f Status)
+slaveof host port = sendRequest (["SLAVEOF"] ++ [encode host] ++ [encode port] )
 
-rpush
+rpushx
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ value
+    -> ByteString -- ^ value
     -> m (f Integer)
-rpush key value = sendRequest (["RPUSH"] ++ [encode key] ++ map encode value )
+rpushx key value = sendRequest (["RPUSHX"] ++ [encode key] ++ [encode value] )
 
 debugObject
     :: (RedisCtx m f)
@@ -285,170 +272,182 @@
     -> m (f ByteString)
 debugObject key = sendRequest (["DEBUG","OBJECT"] ++ [encode key] )
 
-randomkey
-    :: (RedisCtx m f)
-    => m (f (Maybe ByteString))
-randomkey  = sendRequest (["RANDOMKEY"] )
-
 bgsave
     :: (RedisCtx m f)
     => m (f Status)
 bgsave  = sendRequest (["BGSAVE"] )
 
-getrange
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ start
-    -> Integer -- ^ end
-    -> m (f ByteString)
-getrange key start end = sendRequest (["GETRANGE"] ++ [encode key] ++ [encode start] ++ [encode end] )
-
-zcount
+hlen
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Double -- ^ min
-    -> Double -- ^ max
     -> m (f Integer)
-zcount key min max = sendRequest (["ZCOUNT"] ++ [encode key] ++ [encode min] ++ [encode max] )
+hlen key = sendRequest (["HLEN"] ++ [encode key] )
 
-sdiffstore
+rpoplpush
     :: (RedisCtx m f)
-    => ByteString -- ^ destination
-    -> [ByteString] -- ^ key
-    -> m (f Integer)
-sdiffstore destination key = sendRequest (["SDIFFSTORE"] ++ [encode destination] ++ map encode key )
+    => ByteString -- ^ source
+    -> ByteString -- ^ destination
+    -> m (f (Maybe ByteString))
+rpoplpush source destination = sendRequest (["RPOPLPUSH"] ++ [encode source] ++ [encode destination] )
 
-blpop
+brpop
     :: (RedisCtx m f)
     => [ByteString] -- ^ key
     -> Integer -- ^ timeout
     -> m (f (Maybe (ByteString,ByteString)))
-blpop key timeout = sendRequest (["BLPOP"] ++ map encode key ++ [encode timeout] )
+brpop key timeout = sendRequest (["BRPOP"] ++ map encode key ++ [encode timeout] )
 
-migrate
+bgrewriteaof
     :: (RedisCtx m f)
-    => ByteString -- ^ host
-    -> ByteString -- ^ port
-    -> ByteString -- ^ key
-    -> Integer -- ^ destinationDb
-    -> Integer -- ^ timeout
-    -> m (f Status)
-migrate host port key destinationDb timeout = sendRequest (["MIGRATE"] ++ [encode host] ++ [encode port] ++ [encode key] ++ [encode destinationDb] ++ [encode timeout] )
+    => m (f Status)
+bgrewriteaof  = sendRequest (["BGREWRITEAOF"] )
 
-sismember
+zincrby
     :: (RedisCtx m f)
     => ByteString -- ^ key
+    -> Integer -- ^ increment
     -> ByteString -- ^ member
-    -> m (f Bool)
-sismember key member = sendRequest (["SISMEMBER"] ++ [encode key] ++ [encode member] )
+    -> m (f Double)
+zincrby key increment member = sendRequest (["ZINCRBY"] ++ [encode key] ++ [encode increment] ++ [encode member] )
 
-incr
+hgetall
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f Integer)
-incr key = sendRequest (["INCR"] ++ [encode key] )
+    -> m (f [(ByteString,ByteString)])
+hgetall key = sendRequest (["HGETALL"] ++ [encode key] )
 
-hget
+hmset
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> m (f (Maybe ByteString))
-hget key field = sendRequest (["HGET"] ++ [encode key] ++ [encode field] )
+    -> [(ByteString,ByteString)] -- ^ fieldValue
+    -> m (f Status)
+hmset key fieldValue = sendRequest (["HMSET"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])fieldValue )
 
-expireat
+sinter
     :: (RedisCtx m f)
+    => [ByteString] -- ^ key
+    -> m (f [ByteString])
+sinter key = sendRequest (["SINTER"] ++ map encode key )
+
+pfadd
+    :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ timestamp
-    -> m (f Bool)
-expireat key timestamp = sendRequest (["EXPIREAT"] ++ [encode key] ++ [encode timestamp] )
+    -> [ByteString] -- ^ value
+    -> m (f Integer)
+pfadd key value = sendRequest (["PFADD"] ++ [encode key] ++ map encode value )
 
-info
+zremrangebyrank
     :: (RedisCtx m f)
-    => m (f ByteString)
-info  = sendRequest (["INFO"] )
+    => ByteString -- ^ key
+    -> Integer -- ^ start
+    -> Integer -- ^ stop
+    -> m (f Integer)
+zremrangebyrank key start stop = sendRequest (["ZREMRANGEBYRANK"] ++ [encode key] ++ [encode start] ++ [encode stop] )
 
-sdiff
+flushdb
     :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> m (f [ByteString])
-sdiff key = sendRequest (["SDIFF"] ++ map encode key )
+    => m (f Status)
+flushdb  = sendRequest (["FLUSHDB"] )
 
-append
+sadd
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ value
+    -> [ByteString] -- ^ member
     -> m (f Integer)
-append key value = sendRequest (["APPEND"] ++ [encode key] ++ [encode value] )
+sadd key member = sendRequest (["SADD"] ++ [encode key] ++ map encode member )
 
-lset
+lindex
     :: (RedisCtx m f)
     => ByteString -- ^ key
     -> Integer -- ^ index
+    -> m (f (Maybe ByteString))
+lindex key index = sendRequest (["LINDEX"] ++ [encode key] ++ [encode index] )
+
+set
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
     -> ByteString -- ^ value
     -> m (f Status)
-lset key index value = sendRequest (["LSET"] ++ [encode key] ++ [encode index] ++ [encode value] )
+set key value = sendRequest (["SET"] ++ [encode key] ++ [encode value] )
 
-get
+lpush
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f (Maybe ByteString))
-get key = sendRequest (["GET"] ++ [encode key] )
+    -> [ByteString] -- ^ value
+    -> m (f Integer)
+lpush key value = sendRequest (["LPUSH"] ++ [encode key] ++ map encode value )
 
-scriptFlush
+smove
     :: (RedisCtx m f)
-    => m (f Status)
-scriptFlush  = sendRequest (["SCRIPT","FLUSH"] )
+    => ByteString -- ^ source
+    -> ByteString -- ^ destination
+    -> ByteString -- ^ member
+    -> m (f Bool)
+smove source destination member = sendRequest (["SMOVE"] ++ [encode source] ++ [encode destination] ++ [encode member] )
 
-lpop
+zscore
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f (Maybe ByteString))
-lpop key = sendRequest (["LPOP"] ++ [encode key] )
+    -> ByteString -- ^ member
+    -> m (f (Maybe Double))
+zscore key member = sendRequest (["ZSCORE"] ++ [encode key] ++ [encode member] )
 
-lastsave
+configResetstat
     :: (RedisCtx m f)
-    => m (f Integer)
-lastsave  = sendRequest (["LASTSAVE"] )
+    => m (f Status)
+configResetstat  = sendRequest (["CONFIG","RESETSTAT"] )
 
-dbsize
+pfcount
     :: (RedisCtx m f)
-    => m (f Integer)
-dbsize  = sendRequest (["DBSIZE"] )
+    => [ByteString] -- ^ key
+    -> m (f Integer)
+pfcount key = sendRequest (["PFCOUNT"] ++ map encode key )
 
-zadd
+hdel
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [(Double,ByteString)] -- ^ scoreMember
+    -> [ByteString] -- ^ field
     -> m (f Integer)
-zadd key scoreMember = sendRequest (["ZADD"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])scoreMember )
+hdel key field = sendRequest (["HDEL"] ++ [encode key] ++ map encode field )
 
-hmget
+incrbyfloat
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ field
-    -> m (f [Maybe ByteString])
-hmget key field = sendRequest (["HMGET"] ++ [encode key] ++ map encode field )
+    -> Double -- ^ increment
+    -> m (f Double)
+incrbyfloat key increment = sendRequest (["INCRBYFLOAT"] ++ [encode key] ++ [encode increment] )
 
-expire
+setbit
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ seconds
-    -> m (f Bool)
-expire key seconds = sendRequest (["EXPIRE"] ++ [encode key] ++ [encode seconds] )
+    -> Integer -- ^ offset
+    -> ByteString -- ^ value
+    -> m (f Integer)
+setbit key offset value = sendRequest (["SETBIT"] ++ [encode key] ++ [encode offset] ++ [encode value] )
 
-mget
+flushall
     :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> m (f [Maybe ByteString])
-mget key = sendRequest (["MGET"] ++ map encode key )
+    => m (f Status)
+flushall  = sendRequest (["FLUSHALL"] )
 
-hexists
+incrby
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> m (f Bool)
-hexists key field = sendRequest (["HEXISTS"] ++ [encode key] ++ [encode field] )
+    -> Integer -- ^ increment
+    -> m (f Integer)
+incrby key increment = sendRequest (["INCRBY"] ++ [encode key] ++ [encode increment] )
 
+time
+    :: (RedisCtx m f)
+    => m (f (Integer,Integer))
+time  = sendRequest (["TIME"] )
+
+smembers
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> m (f [ByteString])
+smembers key = sendRequest (["SMEMBERS"] ++ [encode key] )
+
 exists
     :: (RedisCtx m f)
     => ByteString -- ^ key
@@ -461,6 +460,24 @@
     -> m (f [ByteString])
 sunion key = sendRequest (["SUNION"] ++ map encode key )
 
+sinterstore
+    :: (RedisCtx m f)
+    => ByteString -- ^ destination
+    -> [ByteString] -- ^ key
+    -> m (f Integer)
+sinterstore destination key = sendRequest (["SINTERSTORE"] ++ [encode destination] ++ map encode key )
+
+ping
+    :: (RedisCtx m f)
+    => m (f Status)
+ping  = sendRequest (["PING"] )
+
+hvals
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> m (f [ByteString])
+hvals key = sendRequest (["HVALS"] ++ [encode key] )
+
 configSet
     :: (RedisCtx m f)
     => ByteString -- ^ parameter
@@ -468,142 +485,161 @@
     -> m (f Status)
 configSet parameter value = sendRequest (["CONFIG","SET"] ++ [encode parameter] ++ [encode value] )
 
-smembers
+restore
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f [ByteString])
-smembers key = sendRequest (["SMEMBERS"] ++ [encode key] )
+    -> Integer -- ^ timeToLive
+    -> ByteString -- ^ serializedValue
+    -> m (f Status)
+restore key timeToLive serializedValue = sendRequest (["RESTORE"] ++ [encode key] ++ [encode timeToLive] ++ [encode serializedValue] )
 
-ping
+scriptFlush
     :: (RedisCtx m f)
     => m (f Status)
-ping  = sendRequest (["PING"] )
+scriptFlush  = sendRequest (["SCRIPT","FLUSH"] )
 
-brpoplpush
+dbsize
     :: (RedisCtx m f)
-    => ByteString -- ^ source
-    -> ByteString -- ^ destination
-    -> Integer -- ^ timeout
-    -> m (f (Maybe ByteString))
-brpoplpush source destination timeout = sendRequest (["BRPOPLPUSH"] ++ [encode source] ++ [encode destination] ++ [encode timeout] )
+    => m (f Integer)
+dbsize  = sendRequest (["DBSIZE"] )
 
-rpop
+lpop
     :: (RedisCtx m f)
     => ByteString -- ^ key
     -> m (f (Maybe ByteString))
-rpop key = sendRequest (["RPOP"] ++ [encode key] )
+lpop key = sendRequest (["LPOP"] ++ [encode key] )
 
-incrbyfloat
+expire
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Double -- ^ increment
-    -> m (f Double)
-incrbyfloat key increment = sendRequest (["INCRBYFLOAT"] ++ [encode key] ++ [encode increment] )
+    -> Integer -- ^ seconds
+    -> m (f Bool)
+expire key seconds = sendRequest (["EXPIRE"] ++ [encode key] ++ [encode seconds] )
 
-setrange
+mget
     :: (RedisCtx m f)
+    => [ByteString] -- ^ key
+    -> m (f [Maybe ByteString])
+mget key = sendRequest (["MGET"] ++ map encode key )
+
+lastsave
+    :: (RedisCtx m f)
+    => m (f Integer)
+lastsave  = sendRequest (["LASTSAVE"] )
+
+zadd
+    :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ offset
-    -> ByteString -- ^ value
+    -> [(Double,ByteString)] -- ^ scoreMember
     -> m (f Integer)
-setrange key offset value = sendRequest (["SETRANGE"] ++ [encode key] ++ [encode offset] ++ [encode value] )
+zadd key scoreMember = sendRequest (["ZADD"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])scoreMember )
 
-hincrbyfloat
+pexpire
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> Double -- ^ increment
-    -> m (f Double)
-hincrbyfloat key field increment = sendRequest (["HINCRBYFLOAT"] ++ [encode key] ++ [encode field] ++ [encode increment] )
+    -> Integer -- ^ milliseconds
+    -> m (f Bool)
+pexpire key milliseconds = sendRequest (["PEXPIRE"] ++ [encode key] ++ [encode milliseconds] )
 
-zrevrank
+renamenx
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ member
-    -> m (f (Maybe Integer))
-zrevrank key member = sendRequest (["ZREVRANK"] ++ [encode key] ++ [encode member] )
+    -> ByteString -- ^ newkey
+    -> m (f Bool)
+renamenx key newkey = sendRequest (["RENAMENX"] ++ [encode key] ++ [encode newkey] )
 
-lindex
+pfmerge
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ index
-    -> m (f (Maybe ByteString))
-lindex key index = sendRequest (["LINDEX"] ++ [encode key] ++ [encode index] )
+    => ByteString -- ^ destkey
+    -> [ByteString] -- ^ sourcekey
+    -> m (f ByteString)
+pfmerge destkey sourcekey = sendRequest (["PFMERGE"] ++ [encode destkey] ++ map encode sourcekey )
 
-sadd
+lrem
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ member
+    -> Integer -- ^ count
+    -> ByteString -- ^ value
     -> m (f Integer)
-sadd key member = sendRequest (["SADD"] ++ [encode key] ++ map encode member )
+lrem key count value = sendRequest (["LREM"] ++ [encode key] ++ [encode count] ++ [encode value] )
 
-srandmember
+sdiff
     :: (RedisCtx m f)
+    => [ByteString] -- ^ key
+    -> m (f [ByteString])
+sdiff key = sendRequest (["SDIFF"] ++ map encode key )
+
+get
+    :: (RedisCtx m f)
     => ByteString -- ^ key
     -> m (f (Maybe ByteString))
-srandmember key = sendRequest (["SRANDMEMBER"] ++ [encode key] )
+get key = sendRequest (["GET"] ++ [encode key] )
 
-zscore
+getrange
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ member
-    -> m (f (Maybe Double))
-zscore key member = sendRequest (["ZSCORE"] ++ [encode key] ++ [encode member] )
+    -> Integer -- ^ start
+    -> Integer -- ^ end
+    -> m (f ByteString)
+getrange key start end = sendRequest (["GETRANGE"] ++ [encode key] ++ [encode start] ++ [encode end] )
 
-persist
+sdiffstore
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> m (f Bool)
-persist key = sendRequest (["PERSIST"] ++ [encode key] )
+    => ByteString -- ^ destination
+    -> [ByteString] -- ^ key
+    -> m (f Integer)
+sdiffstore destination key = sendRequest (["SDIFFSTORE"] ++ [encode destination] ++ map encode key )
 
-zincrby
+zcount
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ increment
-    -> ByteString -- ^ member
-    -> m (f Double)
-zincrby key increment member = sendRequest (["ZINCRBY"] ++ [encode key] ++ [encode increment] ++ [encode member] )
+    -> Double -- ^ min
+    -> Double -- ^ max
+    -> m (f Integer)
+zcount key min max = sendRequest (["ZCOUNT"] ++ [encode key] ++ [encode min] ++ [encode max] )
 
-rpoplpush
+scriptLoad
     :: (RedisCtx m f)
-    => ByteString -- ^ source
-    -> ByteString -- ^ destination
+    => ByteString -- ^ script
+    -> m (f ByteString)
+scriptLoad script = sendRequest (["SCRIPT","LOAD"] ++ [encode script] )
+
+getset
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> ByteString -- ^ value
     -> m (f (Maybe ByteString))
-rpoplpush source destination = sendRequest (["RPOPLPUSH"] ++ [encode source] ++ [encode destination] )
+getset key value = sendRequest (["GETSET"] ++ [encode key] ++ [encode value] )
 
-hgetall
+dump
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f [(ByteString,ByteString)])
-hgetall key = sendRequest (["HGETALL"] ++ [encode key] )
+    -> m (f ByteString)
+dump key = sendRequest (["DUMP"] ++ [encode key] )
 
-mset
+keys
     :: (RedisCtx m f)
-    => [(ByteString,ByteString)] -- ^ keyValue
-    -> m (f Status)
-mset keyValue = sendRequest (["MSET"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )
+    => ByteString -- ^ pattern
+    -> m (f [ByteString])
+keys pattern = sendRequest (["KEYS"] ++ [encode pattern] )
 
-hmset
+configGet
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> [(ByteString,ByteString)] -- ^ fieldValue
-    -> m (f Status)
-hmset key fieldValue = sendRequest (["HMSET"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])fieldValue )
+    => ByteString -- ^ parameter
+    -> m (f [(ByteString,ByteString)])
+configGet parameter = sendRequest (["CONFIG","GET"] ++ [encode parameter] )
 
-psetex
+rpush
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ milliseconds
-    -> ByteString -- ^ value
-    -> m (f Status)
-psetex key milliseconds value = sendRequest (["PSETEX"] ++ [encode key] ++ [encode milliseconds] ++ [encode value] )
+    -> [ByteString] -- ^ value
+    -> m (f Integer)
+rpush key value = sendRequest (["RPUSH"] ++ [encode key] ++ map encode value )
 
-brpop
+randomkey
     :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> Integer -- ^ timeout
-    -> m (f (Maybe (ByteString,ByteString)))
-brpop key timeout = sendRequest (["BRPOP"] ++ map encode key ++ [encode timeout] )
+    => m (f (Maybe ByteString))
+randomkey  = sendRequest (["RANDOMKEY"] )
 
 hsetnx
     :: (RedisCtx m f)
@@ -613,169 +649,170 @@
     -> m (f Bool)
 hsetnx key field value = sendRequest (["HSETNX"] ++ [encode key] ++ [encode field] ++ [encode value] )
 
-configGet
+mset
     :: (RedisCtx m f)
-    => ByteString -- ^ parameter
-    -> m (f [(ByteString,ByteString)])
-configGet parameter = sendRequest (["CONFIG","GET"] ++ [encode parameter] )
+    => [(ByteString,ByteString)] -- ^ keyValue
+    -> m (f Status)
+mset keyValue = sendRequest (["MSET"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )
 
-zrank
+setex
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ member
-    -> m (f (Maybe Integer))
-zrank key member = sendRequest (["ZRANK"] ++ [encode key] ++ [encode member] )
+    -> Integer -- ^ seconds
+    -> ByteString -- ^ value
+    -> m (f Status)
+setex key seconds value = sendRequest (["SETEX"] ++ [encode key] ++ [encode seconds] ++ [encode value] )
 
-hkeys
+psetex
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f [ByteString])
-hkeys key = sendRequest (["HKEYS"] ++ [encode key] )
+    -> Integer -- ^ milliseconds
+    -> ByteString -- ^ value
+    -> m (f Status)
+psetex key milliseconds value = sendRequest (["PSETEX"] ++ [encode key] ++ [encode milliseconds] ++ [encode value] )
 
-ttl
+scard
     :: (RedisCtx m f)
     => ByteString -- ^ key
     -> m (f Integer)
-ttl key = sendRequest (["TTL"] ++ [encode key] )
+scard key = sendRequest (["SCARD"] ++ [encode key] )
 
-getset
+scriptExists
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> ByteString -- ^ value
-    -> m (f (Maybe ByteString))
-getset key value = sendRequest (["GETSET"] ++ [encode key] ++ [encode value] )
+    => [ByteString] -- ^ script
+    -> m (f [Bool])
+scriptExists script = sendRequest (["SCRIPT","EXISTS"] ++ map encode script )
 
-slaveof
+sunionstore
     :: (RedisCtx m f)
-    => ByteString -- ^ host
-    -> ByteString -- ^ port
-    -> m (f Status)
-slaveof host port = sendRequest (["SLAVEOF"] ++ [encode host] ++ [encode port] )
+    => ByteString -- ^ destination
+    -> [ByteString] -- ^ key
+    -> m (f Integer)
+sunionstore destination key = sendRequest (["SUNIONSTORE"] ++ [encode destination] ++ map encode key )
 
-setnx
+persist
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ value
     -> m (f Bool)
-setnx key value = sendRequest (["SETNX"] ++ [encode key] ++ [encode value] )
+persist key = sendRequest (["PERSIST"] ++ [encode key] )
 
-dump
+strlen
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f ByteString)
-dump key = sendRequest (["DUMP"] ++ [encode key] )
-
-keys
-    :: (RedisCtx m f)
-    => ByteString -- ^ pattern
-    -> m (f [ByteString])
-keys pattern = sendRequest (["KEYS"] ++ [encode pattern] )
-
-echo
-    :: (RedisCtx m f)
-    => ByteString -- ^ message
-    -> m (f ByteString)
-echo message = sendRequest (["ECHO"] ++ [encode message] )
+    -> m (f Integer)
+strlen key = sendRequest (["STRLEN"] ++ [encode key] )
 
-getbit
+lpushx
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ offset
+    -> ByteString -- ^ value
     -> m (f Integer)
-getbit key offset = sendRequest (["GETBIT"] ++ [encode key] ++ [encode offset] )
-
-quit
-    :: (RedisCtx m f)
-    => m (f Status)
-quit  = sendRequest (["QUIT"] )
+lpushx key value = sendRequest (["LPUSHX"] ++ [encode key] ++ [encode value] )
 
-srem
+srandmember
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ member
-    -> m (f Integer)
-srem key member = sendRequest (["SREM"] ++ [encode key] ++ map encode member )
+    -> m (f (Maybe ByteString))
+srandmember key = sendRequest (["SRANDMEMBER"] ++ [encode key] )
 
-move
+hset
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ db
+    -> ByteString -- ^ field
+    -> ByteString -- ^ value
     -> m (f Bool)
-move key db = sendRequest (["MOVE"] ++ [encode key] ++ [encode db] )
+hset key field value = sendRequest (["HSET"] ++ [encode key] ++ [encode field] ++ [encode value] )
 
-scriptLoad
+brpoplpush
     :: (RedisCtx m f)
-    => ByteString -- ^ script
-    -> m (f ByteString)
-scriptLoad script = sendRequest (["SCRIPT","LOAD"] ++ [encode script] )
+    => ByteString -- ^ source
+    -> ByteString -- ^ destination
+    -> Integer -- ^ timeout
+    -> m (f (Maybe ByteString))
+brpoplpush source destination timeout = sendRequest (["BRPOPLPUSH"] ++ [encode source] ++ [encode destination] ++ [encode timeout] )
 
-msetnx
+zrevrank
     :: (RedisCtx m f)
-    => [(ByteString,ByteString)] -- ^ keyValue
-    -> m (f Bool)
-msetnx keyValue = sendRequest (["MSETNX"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )
+    => ByteString -- ^ key
+    -> ByteString -- ^ member
+    -> m (f (Maybe Integer))
+zrevrank key member = sendRequest (["ZREVRANK"] ++ [encode key] ++ [encode member] )
 
-save
+scriptKill
     :: (RedisCtx m f)
     => m (f Status)
-save  = sendRequest (["SAVE"] )
+scriptKill  = sendRequest (["SCRIPT","KILL"] )
 
-ltrim
+setrange
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ start
-    -> Integer -- ^ stop
-    -> m (f Status)
-ltrim key start stop = sendRequest (["LTRIM"] ++ [encode key] ++ [encode start] ++ [encode stop] )
+    -> Integer -- ^ offset
+    -> ByteString -- ^ value
+    -> m (f Integer)
+setrange key offset value = sendRequest (["SETRANGE"] ++ [encode key] ++ [encode offset] ++ [encode value] )
 
-lrem
+del
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ count
-    -> ByteString -- ^ value
+    => [ByteString] -- ^ key
     -> m (f Integer)
-lrem key count value = sendRequest (["LREM"] ++ [encode key] ++ [encode count] ++ [encode value] )
+del key = sendRequest (["DEL"] ++ map encode key )
 
-pexpireat
+hincrbyfloat
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ millisecondsTimestamp
-    -> m (f Bool)
-pexpireat key millisecondsTimestamp = sendRequest (["PEXPIREAT"] ++ [encode key] ++ [encode millisecondsTimestamp] )
+    -> ByteString -- ^ field
+    -> Double -- ^ increment
+    -> m (f Double)
+hincrbyfloat key field increment = sendRequest (["HINCRBYFLOAT"] ++ [encode key] ++ [encode field] ++ [encode increment] )
 
-zcard
+hincrby
     :: (RedisCtx m f)
     => ByteString -- ^ key
+    -> ByteString -- ^ field
+    -> Integer -- ^ increment
     -> m (f Integer)
-zcard key = sendRequest (["ZCARD"] ++ [encode key] )
+hincrby key field increment = sendRequest (["HINCRBY"] ++ [encode key] ++ [encode field] ++ [encode increment] )
 
-renamenx
+rpop
     :: (RedisCtx m f)
     => ByteString -- ^ key
+    -> m (f (Maybe ByteString))
+rpop key = sendRequest (["RPOP"] ++ [encode key] )
+
+rename
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
     -> ByteString -- ^ newkey
-    -> m (f Bool)
-renamenx key newkey = sendRequest (["RENAMENX"] ++ [encode key] ++ [encode newkey] )
+    -> m (f Status)
+rename key newkey = sendRequest (["RENAME"] ++ [encode key] ++ [encode newkey] )
 
-llen
+zrem
     :: (RedisCtx m f)
     => ByteString -- ^ key
+    -> [ByteString] -- ^ member
     -> m (f Integer)
-llen key = sendRequest (["LLEN"] ++ [encode key] )
+zrem key member = sendRequest (["ZREM"] ++ [encode key] ++ map encode member )
 
-pexpire
+hexists
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ milliseconds
+    -> ByteString -- ^ field
     -> m (f Bool)
-pexpire key milliseconds = sendRequest (["PEXPIRE"] ++ [encode key] ++ [encode milliseconds] )
+hexists key field = sendRequest (["HEXISTS"] ++ [encode key] ++ [encode field] )
 
-decrby
+decr
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ decrement
     -> m (f Integer)
-decrby key decrement = sendRequest (["DECRBY"] ++ [encode key] ++ [encode decrement] )
+decr key = sendRequest (["DECR"] ++ [encode key] )
 
+hmget
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> [ByteString] -- ^ field
+    -> m (f [Maybe ByteString])
+hmget key field = sendRequest (["HMGET"] ++ [encode key] ++ map encode field )
+
 lrange
     :: (RedisCtx m f)
     => ByteString -- ^ key
@@ -784,158 +821,146 @@
     -> m (f [ByteString])
 lrange key start stop = sendRequest (["LRANGE"] ++ [encode key] ++ [encode start] ++ [encode stop] )
 
-sinterstore
+decrby
     :: (RedisCtx m f)
-    => ByteString -- ^ destination
-    -> [ByteString] -- ^ key
+    => ByteString -- ^ key
+    -> Integer -- ^ decrement
     -> m (f Integer)
-sinterstore destination key = sendRequest (["SINTERSTORE"] ++ [encode destination] ++ map encode key )
+decrby key decrement = sendRequest (["DECRBY"] ++ [encode key] ++ [encode decrement] )
 
-rename
+llen
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ newkey
-    -> m (f Status)
-rename key newkey = sendRequest (["RENAME"] ++ [encode key] ++ [encode newkey] )
+    -> m (f Integer)
+llen key = sendRequest (["LLEN"] ++ [encode key] )
 
-restore
+append
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ timeToLive
-    -> ByteString -- ^ serializedValue
-    -> m (f Status)
-restore key timeToLive serializedValue = sendRequest (["RESTORE"] ++ [encode key] ++ [encode timeToLive] ++ [encode serializedValue] )
+    -> ByteString -- ^ value
+    -> m (f Integer)
+append key value = sendRequest (["APPEND"] ++ [encode key] ++ [encode value] )
 
-hvals
+incr
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f [ByteString])
-hvals key = sendRequest (["HVALS"] ++ [encode key] )
+    -> m (f Integer)
+incr key = sendRequest (["INCR"] ++ [encode key] )
 
-zrem
+hget
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ member
-    -> m (f Integer)
-zrem key member = sendRequest (["ZREM"] ++ [encode key] ++ map encode member )
+    -> ByteString -- ^ field
+    -> m (f (Maybe ByteString))
+hget key field = sendRequest (["HGET"] ++ [encode key] ++ [encode field] )
 
-decr
+pexpireat
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f Integer)
-decr key = sendRequest (["DECR"] ++ [encode key] )
+    -> Integer -- ^ millisecondsTimestamp
+    -> m (f Bool)
+pexpireat key millisecondsTimestamp = sendRequest (["PEXPIREAT"] ++ [encode key] ++ [encode millisecondsTimestamp] )
 
-configResetstat
+ltrim
     :: (RedisCtx m f)
-    => m (f Status)
-configResetstat  = sendRequest (["CONFIG","RESETSTAT"] )
+    => ByteString -- ^ key
+    -> Integer -- ^ start
+    -> Integer -- ^ stop
+    -> m (f Status)
+ltrim key start stop = sendRequest (["LTRIM"] ++ [encode key] ++ [encode start] ++ [encode stop] )
 
-flushall
+info
     :: (RedisCtx m f)
-    => m (f Status)
-flushall  = sendRequest (["FLUSHALL"] )
+    => m (f ByteString)
+info  = sendRequest (["INFO"] )
 
-hdel
+zcard
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ field
     -> m (f Integer)
-hdel key field = sendRequest (["HDEL"] ++ [encode key] ++ map encode field )
+zcard key = sendRequest (["ZCARD"] ++ [encode key] )
 
-setbit
+lset
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ offset
+    -> Integer -- ^ index
     -> ByteString -- ^ value
-    -> m (f Integer)
-setbit key offset value = sendRequest (["SETBIT"] ++ [encode key] ++ [encode offset] ++ [encode value] )
+    -> m (f Status)
+lset key index value = sendRequest (["LSET"] ++ [encode key] ++ [encode index] ++ [encode value] )
 
-del
+expireat
     :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> m (f Integer)
-del key = sendRequest (["DEL"] ++ map encode key )
+    => ByteString -- ^ key
+    -> Integer -- ^ timestamp
+    -> m (f Bool)
+expireat key timestamp = sendRequest (["EXPIREAT"] ++ [encode key] ++ [encode timestamp] )
 
-scriptKill
+save
     :: (RedisCtx m f)
     => m (f Status)
-scriptKill  = sendRequest (["SCRIPT","KILL"] )
+save  = sendRequest (["SAVE"] )
 
-incrby
+move
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ increment
-    -> m (f Integer)
-incrby key increment = sendRequest (["INCRBY"] ++ [encode key] ++ [encode increment] )
+    -> Integer -- ^ db
+    -> m (f Bool)
+move key db = sendRequest (["MOVE"] ++ [encode key] ++ [encode db] )
 
-hincrby
+getbit
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> Integer -- ^ increment
+    -> Integer -- ^ offset
     -> m (f Integer)
-hincrby key field increment = sendRequest (["HINCRBY"] ++ [encode key] ++ [encode field] ++ [encode increment] )
-
-time
-    :: (RedisCtx m f)
-    => m (f (Integer,Integer))
-time  = sendRequest (["TIME"] )
+getbit key offset = sendRequest (["GETBIT"] ++ [encode key] ++ [encode offset] )
 
-hset
+msetnx
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> ByteString -- ^ value
+    => [(ByteString,ByteString)] -- ^ keyValue
     -> m (f Bool)
-hset key field value = sendRequest (["HSET"] ++ [encode key] ++ [encode field] ++ [encode value] )
+msetnx keyValue = sendRequest (["MSETNX"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )
 
-strlen
+quit
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> m (f Integer)
-strlen key = sendRequest (["STRLEN"] ++ [encode key] )
+    => m (f Status)
+quit  = sendRequest (["QUIT"] )
 
-flushdb
+blpop
     :: (RedisCtx m f)
-    => m (f Status)
-flushdb  = sendRequest (["FLUSHDB"] )
+    => [ByteString] -- ^ key
+    -> Integer -- ^ timeout
+    -> m (f (Maybe (ByteString,ByteString)))
+blpop key timeout = sendRequest (["BLPOP"] ++ map encode key ++ [encode timeout] )
 
-lpushx
+srem
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ value
+    -> [ByteString] -- ^ member
     -> m (f Integer)
-lpushx key value = sendRequest (["LPUSHX"] ++ [encode key] ++ [encode value] )
+srem key member = sendRequest (["SREM"] ++ [encode key] ++ map encode member )
 
-smove
+echo
     :: (RedisCtx m f)
-    => ByteString -- ^ source
-    -> ByteString -- ^ destination
-    -> ByteString -- ^ member
-    -> m (f Bool)
-smove source destination member = sendRequest (["SMOVE"] ++ [encode source] ++ [encode destination] ++ [encode member] )
+    => ByteString -- ^ message
+    -> m (f ByteString)
+echo message = sendRequest (["ECHO"] ++ [encode message] )
 
-zremrangebyrank
+sismember
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ start
-    -> Integer -- ^ stop
-    -> m (f Integer)
-zremrangebyrank key start stop = sendRequest (["ZREMRANGEBYRANK"] ++ [encode key] ++ [encode start] ++ [encode stop] )
+    -> ByteString -- ^ member
+    -> m (f Bool)
+sismember key member = sendRequest (["SISMEMBER"] ++ [encode key] ++ [encode member] )
 
-set
+migrate
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> ByteString -- ^ value
+    => ByteString -- ^ host
+    -> ByteString -- ^ port
+    -> ByteString -- ^ key
+    -> Integer -- ^ destinationDb
+    -> Integer -- ^ timeout
     -> m (f Status)
-set key value = sendRequest (["SET"] ++ [encode key] ++ [encode value] )
-
-lpush
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> [ByteString] -- ^ value
-    -> m (f Integer)
-lpush key value = sendRequest (["LPUSH"] ++ [encode key] ++ map encode value )
+migrate host port key destinationDb timeout = sendRequest (["MIGRATE"] ++ [encode host] ++ [encode port] ++ [encode key] ++ [encode destinationDb] ++ [encode timeout] )
 
 
 
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -36,7 +36,7 @@
         deltaT <-fmap (`diffUTCTime` start) getCurrentTime
         when (deltaT > limit) $
             putStrLn $ name ++ ": " ++ show deltaT
-    
+
 (>>=?) :: (Eq a, Show a) => Redis (Either Reply a) -> a -> Redis ()
 redis >>=? expected = do
     a <- redis
@@ -52,7 +52,7 @@
 --
 tests :: Connection -> [Test.Test]
 tests conn = map ($conn) $ concat
-    [ testsMisc, testsKeys, testsStrings, [testHashes], testsLists, testsSets
+    [ testsMisc, testsKeys, testsStrings, [testHashes], testsLists, testsSets, [testHyperLogLog]
     , testsZSets, [testPubSub], [testTransaction], [testScripting]
     , testsConnection, testsServer, [testQuit]
     ]
@@ -89,9 +89,9 @@
     tPipe <- deltaT $ do
         pongs <- replicateM n ping
         assert $ pongs == replicate n (Right Pong)
-    
+
     tNoPipe <- deltaT $ replicateM_ n (ping >>=? Pong)
-    -- pipelining should at least be twice as fast.    
+    -- pipelining should at least be twice as fast.
     assert $ tNoPipe / tPipe > 2
   where
     deltaT redis = do
@@ -139,7 +139,7 @@
     renamenx "key'" "key" >>=? True
     del ["key"]           >>=? 1
     select 0              >>=? Ok
-    
+
 testExpireAt :: Test
 testExpireAt = testCase "expireat" $ do
     set "key" "value"             >>=? Ok
@@ -165,8 +165,8 @@
                                , sortBy    = Just "weight_*"
                                , sortGet   = ["#", "object_*"] }
     sort "ids" opts >>=? ["2", "bar", "1", "foo"]
-    
 
+
 testGetType :: Test
 testGetType = testCase "getType" $ do
     getType "key"     >>=? None
@@ -218,7 +218,7 @@
     getbit "key" 42                   >>=? 1
     bitcount "key"                    >>=? 1
     bitcountRange "key" 0 (-1)        >>=? 1
-    
+
 testBitops :: Test
 testBitops = testCase "bitops" $ do
     set "k1" "a"               >>=? Ok
@@ -264,7 +264,7 @@
     rpop "key"                    >>=? Just "value"
     rpush "key" ["v2"]            >>=? 1
     linsertBefore "key" "v2" "v1" >>=? 2
-    linsertAfter "key" "v2" "v3"  >>=? 3    
+    linsertAfter "key" "v2" "v3"  >>=? 3
     lindex "key" 0                >>=? Just "v1"
     lrange "key" 0 (-1)           >>=? ["v1", "v2", "v3"]
     lset "key" 1 "v2"             >>=? Ok
@@ -280,7 +280,7 @@
     rpush "k1" ["v1","v2"]       >>=? 2
     brpoplpush "k1" "k2" 1       >>=? Just "v2"
     rpoplpush "k1" "k2"          >>=? Just "v1"
-    
+
 ------------------------------------------------------------------------------
 -- Sets
 --
@@ -320,7 +320,7 @@
     zcard "key"                                       >>=? 3
     zscore "key" "v3"                                 >>=? Just 40
     zincrby "key" 2 "v3"                              >>=? 42
-                                                     
+
     zrank "key" "v1"                                  >>=? Just 0
     zrevrank "key" "v1"                               >>=? Just 2
     zcount "key" 10 100                               >>=? 1
@@ -337,7 +337,7 @@
     zrevrangebyscoreWithscores "key" 1.5 0.5          >>=? [("v1",1)]
     zrevrangebyscoreLimit "key" 2.5 0.5 0 1           >>=? ["v2"]
     zrevrangebyscoreWithscoresLimit "key" 2.5 0.5 0 1 >>=? [("v2",2)]
-    
+
     zrem "key" ["v2"]                                 >>=? 1
     zremrangebyscore "key" 10 100                     >>=? 1
     zremrangebyrank "key" 0 0                         >>=? 1
@@ -351,7 +351,28 @@
     zunionstore "newkey" ["k1","k2"] Sum                >>=? 3
     zunionstoreWeights "newkey" [("k1",1),("k2",2)] Min >>=? 3
 
+------------------------------------------------------------------------------
+-- HyperLogLog
+--
 
+testHyperLogLog :: Test
+testHyperLogLog = testCase "hyperloglog" $ do
+  -- test creation
+  pfadd "hll1" ["a"]
+  pfcount ["hll1"] >>=? 1
+  -- test cardinality
+  pfadd "hll1" ["a"]
+  pfcount ["hll1"] >>=? 1
+  pfadd "hll1" ["b", "c", "foo", "bar"]
+  pfcount ["hll1"] >>=? 5
+  -- test merge
+  pfadd "hll2" ["1", "2", "3"]
+  pfadd "hll3" ["4", "5", "6"]
+  pfmerge "hll4" ["hll2", "hll3"]
+  pfcount ["hll4"] >>=? 6
+  -- test union cardinality
+  pfcount ["hll2", "hll3"] >>=? 6
+
 ------------------------------------------------------------------------------
 -- Pub/Sub
 --
@@ -473,7 +494,7 @@
     configSet "requirepass" "pass" >>=? Ok
     auth "pass"                    >>=? Ok
     configSet "requirepass" ""     >>=? Ok
-    
+
 testFlushall :: Test
 testFlushall = testCase "flushall/flushdb" $ do
     flushall >>=? Ok
