diff --git a/hedis.cabal b/hedis.cabal
--- a/hedis.cabal
+++ b/hedis.cabal
@@ -1,5 +1,5 @@
 name:               hedis
-version:            0.6.3
+version:            0.6.4
 synopsis:
     Client library for the Redis datastore: supports full command set,  
     pipelining.
@@ -34,38 +34,6 @@
     .
     For detailed documentation, see the "Database.Redis" module.
     .
-    [Changes since version 0.5.1]
-    .
-    * Changed return type of HDEL from Bool to Integer.
-    .
-    * Some documentation updates.
-    .
-    [Changes since version 0.5]
-    .
-    * New commands: DUMP, RESTORE, BITOP, BITCOUNT.
-    .
-    * Removed the dependency on stm.
-    .
-    * Improved performance of Queued in long transactions.
-    .
-    * Minor documentation updates.
-    .
-    [Changes since version 0.4.1]
-    .
-    * Added new Redis 2.6 commands, including Lua scripting support.
-    .
-    * A transaction context is now created by using the 'multiExec' function.
-      The functions 'multi', 'exec' and 'discard' are no longer available
-      individually.
-    .
-    * Inside of a transaction, commands return their results wrapped in a
-      composable /future/, called 'Queued'.
-    .
-    * The 'getType' command (the Redis TYPE command) now has a custom return
-      type 'RedisType'.
-    .
-    * Minor improvements and fixes to the documentation.
-    .
 license:            BSD3
 license-file:       LICENSE
 author:             Falko Peters
@@ -83,7 +51,7 @@
 
 library
   hs-source-dirs:   src
-  ghc-options:      -Wall
+  ghc-options:      -Wall -fwarn-tabs
   ghc-prof-options: -auto-all
   exposed-modules:  Database.Redis
   build-depends:    attoparsec >= 0.10,
diff --git a/src/Database/Redis.hs b/src/Database/Redis.hs
--- a/src/Database/Redis.hs
+++ b/src/Database/Redis.hs
@@ -137,7 +137,7 @@
     HostName,PortID(..),
     
     -- * Commands
-	module Database.Redis.Commands,
+    module Database.Redis.Commands,
     
     -- * Transactions
     module Database.Redis.Transactions,
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
@@ -201,109 +201,43 @@
 import Database.Redis.Types
 import Database.Redis.Core
 
-flushall
+bgrewriteaof
     :: (RedisCtx m f)
     => m (f Status)
-flushall  = sendRequest (["FLUSHALL"] )
-
-time
-    :: (RedisCtx m f)
-    => m (f (Integer,Integer))
-time  = sendRequest (["TIME"] )
-
-hdel
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> [ByteString] -- ^ field
-    -> m (f Integer)
-hdel key field = sendRequest (["HDEL"] ++ [encode key] ++ map encode field )
-
-hincrby
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> Integer -- ^ increment
-    -> m (f Integer)
-hincrby key field increment = sendRequest (["HINCRBY"] ++ [encode key] ++ [encode field] ++ [encode increment] )
+bgrewriteaof  = sendRequest (["BGREWRITEAOF"] )
 
-hincrbyfloat
+sinter
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> Double -- ^ increment
-    -> m (f Double)
-hincrbyfloat key field increment = sendRequest (["HINCRBYFLOAT"] ++ [encode key] ++ [encode field] ++ [encode increment] )
+    => [ByteString] -- ^ key
+    -> m (f [ByteString])
+sinter key = sendRequest (["SINTER"] ++ map 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 )
 
-rpushx
+sunionstore
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> ByteString -- ^ value
+    => ByteString -- ^ destination
+    -> [ByteString] -- ^ key
     -> m (f Integer)
-rpushx key value = sendRequest (["RPUSHX"] ++ [encode key] ++ [encode value] )
+sunionstore destination key = sendRequest (["SUNIONSTORE"] ++ [encode destination] ++ map encode key )
 
-setnx
+setex
     :: (RedisCtx m f)
     => ByteString -- ^ key
+    -> Integer -- ^ seconds
     -> ByteString -- ^ value
-    -> m (f Bool)
-setnx key value = sendRequest (["SETNX"] ++ [encode key] ++ [encode value] )
-
-keys
-    :: (RedisCtx m f)
-    => ByteString -- ^ pattern
-    -> m (f [ByteString])
-keys pattern = sendRequest (["KEYS"] ++ [encode pattern] )
-
-bgsave
-    :: (RedisCtx m f)
-    => m (f Status)
-bgsave  = sendRequest (["BGSAVE"] )
-
-slaveof
-    :: (RedisCtx m f)
-    => ByteString -- ^ host
-    -> ByteString -- ^ port
     -> m (f Status)
-slaveof host port = sendRequest (["SLAVEOF"] ++ [encode host] ++ [encode port] )
-
-debugObject
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> m (f ByteString)
-debugObject key = sendRequest (["DEBUG","OBJECT"] ++ [encode key] )
-
-bgrewriteaof
-    :: (RedisCtx m f)
-    => m (f Status)
-bgrewriteaof  = sendRequest (["BGREWRITEAOF"] )
-
-zincrby
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ increment
-    -> ByteString -- ^ member
-    -> m (f Double)
-zincrby key increment member = sendRequest (["ZINCRBY"] ++ [encode key] ++ [encode increment] ++ [encode member] )
-
-sinter
-    :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> m (f [ByteString])
-sinter key = sendRequest (["SINTER"] ++ map encode key )
+setex key seconds value = sendRequest (["SETEX"] ++ [encode key] ++ [encode seconds] ++ [encode value] )
 
-hmset
+hlen
     :: (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 )
+    -> m (f Integer)
+hlen key = sendRequest (["HLEN"] ++ [encode key] )
 
 scard
     :: (RedisCtx m f)
@@ -311,64 +245,71 @@
     -> m (f Integer)
 scard key = sendRequest (["SCARD"] ++ [encode key] )
 
-get
+zremrangebyscore
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f (Maybe ByteString))
-get key = sendRequest (["GET"] ++ [encode key] )
+    -> Double -- ^ min
+    -> Double -- ^ max
+    -> m (f Integer)
+zremrangebyscore key min max = sendRequest (["ZREMRANGEBYSCORE"] ++ [encode key] ++ [encode min] ++ [encode max] )
 
-lrem
+rpushx
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ count
     -> ByteString -- ^ value
     -> m (f Integer)
-lrem key count value = sendRequest (["LREM"] ++ [encode key] ++ [encode count] ++ [encode value] )
+rpushx key value = sendRequest (["RPUSHX"] ++ [encode key] ++ [encode value] )
 
-expireat
+spop
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ timestamp
-    -> m (f Bool)
-expireat key timestamp = sendRequest (["EXPIREAT"] ++ [encode key] ++ [encode timestamp] )
+    -> m (f (Maybe ByteString))
+spop key = sendRequest (["SPOP"] ++ [encode key] )
 
-incr
+pttl
     :: (RedisCtx m f)
     => ByteString -- ^ key
     -> m (f Integer)
-incr key = sendRequest (["INCR"] ++ [encode key] )
+pttl key = sendRequest (["PTTL"] ++ [encode key] )
 
-renamenx
+rpush
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ newkey
-    -> m (f Bool)
-renamenx key newkey = sendRequest (["RENAMENX"] ++ [encode key] ++ [encode newkey] )
+    -> [ByteString] -- ^ value
+    -> m (f Integer)
+rpush key value = sendRequest (["RPUSH"] ++ [encode key] ++ map encode value )
 
-pexpireat
+debugObject
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ millisecondsTimestamp
-    -> m (f Bool)
-pexpireat key millisecondsTimestamp = sendRequest (["PEXPIREAT"] ++ [encode key] ++ [encode millisecondsTimestamp] )
+    -> m (f ByteString)
+debugObject key = sendRequest (["DEBUG","OBJECT"] ++ [encode key] )
 
-save
+randomkey
     :: (RedisCtx m f)
+    => m (f (Maybe ByteString))
+randomkey  = sendRequest (["RANDOMKEY"] )
+
+bgsave
+    :: (RedisCtx m f)
     => m (f Status)
-save  = sendRequest (["SAVE"] )
+bgsave  = sendRequest (["BGSAVE"] )
 
-echo
+getrange
     :: (RedisCtx m f)
-    => ByteString -- ^ message
+    => ByteString -- ^ key
+    -> Integer -- ^ start
+    -> Integer -- ^ end
     -> m (f ByteString)
-echo message = sendRequest (["ECHO"] ++ [encode message] )
+getrange key start end = sendRequest (["GETRANGE"] ++ [encode key] ++ [encode start] ++ [encode end] )
 
-blpop
+zcount
     :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> Integer -- ^ timeout
-    -> m (f (Maybe (ByteString,ByteString)))
-blpop key timeout = sendRequest (["BLPOP"] ++ map encode key ++ [encode timeout] )
+    => ByteString -- ^ key
+    -> Double -- ^ min
+    -> Double -- ^ max
+    -> m (f Integer)
+zcount key min max = sendRequest (["ZCOUNT"] ++ [encode key] ++ [encode min] ++ [encode max] )
 
 sdiffstore
     :: (RedisCtx m f)
@@ -377,6 +318,13 @@
     -> m (f Integer)
 sdiffstore destination key = sendRequest (["SDIFFSTORE"] ++ [encode destination] ++ map encode key )
 
+blpop
+    :: (RedisCtx m f)
+    => [ByteString] -- ^ key
+    -> Integer -- ^ timeout
+    -> m (f (Maybe (ByteString,ByteString)))
+blpop key timeout = sendRequest (["BLPOP"] ++ map encode key ++ [encode timeout] )
+
 migrate
     :: (RedisCtx m f)
     => ByteString -- ^ host
@@ -387,94 +335,99 @@
     -> m (f Status)
 migrate host port key destinationDb timeout = sendRequest (["MIGRATE"] ++ [encode host] ++ [encode port] ++ [encode key] ++ [encode destinationDb] ++ [encode timeout] )
 
-move
+sismember
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ db
+    -> ByteString -- ^ member
     -> m (f Bool)
-move key db = sendRequest (["MOVE"] ++ [encode key] ++ [encode db] )
+sismember key member = sendRequest (["SISMEMBER"] ++ [encode key] ++ [encode member] )
 
-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] )
 
-exists
+hget
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f Bool)
-exists key = sendRequest (["EXISTS"] ++ [encode key] )
+    -> ByteString -- ^ field
+    -> m (f (Maybe ByteString))
+hget key field = sendRequest (["HGET"] ++ [encode key] ++ [encode field] )
 
-smembers
+expireat
     :: (RedisCtx m f)
     => ByteString -- ^ key
+    -> Integer -- ^ timestamp
+    -> m (f Bool)
+expireat key timestamp = sendRequest (["EXPIREAT"] ++ [encode key] ++ [encode timestamp] )
+
+info
+    :: (RedisCtx m f)
+    => m (f ByteString)
+info  = sendRequest (["INFO"] )
+
+sdiff
+    :: (RedisCtx m f)
+    => [ByteString] -- ^ key
     -> m (f [ByteString])
-smembers key = sendRequest (["SMEMBERS"] ++ [encode key] )
+sdiff key = sendRequest (["SDIFF"] ++ map encode key )
 
-decr
+append
     :: (RedisCtx m f)
     => ByteString -- ^ key
+    -> ByteString -- ^ value
     -> m (f Integer)
-decr key = sendRequest (["DECR"] ++ [encode key] )
+append key value = sendRequest (["APPEND"] ++ [encode key] ++ [encode value] )
 
-rename
+lset
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ newkey
+    -> Integer -- ^ index
+    -> ByteString -- ^ value
     -> m (f Status)
-rename key newkey = sendRequest (["RENAME"] ++ [encode key] ++ [encode newkey] )
+lset key index value = sendRequest (["LSET"] ++ [encode key] ++ [encode index] ++ [encode value] )
 
-sunion
+get
     :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> m (f [ByteString])
-sunion key = sendRequest (["SUNION"] ++ map encode key )
+    => ByteString -- ^ key
+    -> m (f (Maybe ByteString))
+get key = sendRequest (["GET"] ++ [encode key] )
 
-ping
+scriptFlush
     :: (RedisCtx m f)
     => m (f Status)
-ping  = sendRequest (["PING"] )
-
-zrem
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> [ByteString] -- ^ member
-    -> m (f Integer)
-zrem key member = sendRequest (["ZREM"] ++ [encode key] ++ map encode member )
+scriptFlush  = sendRequest (["SCRIPT","FLUSH"] )
 
-hmget
+lpop
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ field
-    -> m (f [Maybe ByteString])
-hmget key field = sendRequest (["HMGET"] ++ [encode key] ++ map encode field )
+    -> m (f (Maybe ByteString))
+lpop key = sendRequest (["LPOP"] ++ [encode key] )
 
-pexpire
+lastsave
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ milliseconds
-    -> m (f Bool)
-pexpire key milliseconds = sendRequest (["PEXPIRE"] ++ [encode key] ++ [encode milliseconds] )
+    => m (f Integer)
+lastsave  = sendRequest (["LASTSAVE"] )
 
 dbsize
     :: (RedisCtx m f)
     => m (f Integer)
 dbsize  = sendRequest (["DBSIZE"] )
 
-lrange
+zadd
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ start
-    -> Integer -- ^ stop
-    -> m (f [ByteString])
-lrange key start stop = sendRequest (["LRANGE"] ++ [encode key] ++ [encode start] ++ [encode stop] )
+    -> [(Double,ByteString)] -- ^ scoreMember
+    -> m (f Integer)
+zadd key scoreMember = sendRequest (["ZADD"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])scoreMember )
 
-lpop
+hmget
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f (Maybe ByteString))
-lpop key = sendRequest (["LPOP"] ++ [encode key] )
+    -> [ByteString] -- ^ field
+    -> m (f [Maybe ByteString])
+hmget key field = sendRequest (["HMGET"] ++ [encode key] ++ map encode field )
 
 expire
     :: (RedisCtx m f)
@@ -483,112 +436,48 @@
     -> m (f Bool)
 expire key seconds = sendRequest (["EXPIRE"] ++ [encode key] ++ [encode seconds] )
 
-flushdb
-    :: (RedisCtx m f)
-    => m (f Status)
-flushdb  = sendRequest (["FLUSHDB"] )
-
-smove
-    :: (RedisCtx m f)
-    => ByteString -- ^ source
-    -> ByteString -- ^ destination
-    -> ByteString -- ^ member
-    -> m (f Bool)
-smove source destination member = sendRequest (["SMOVE"] ++ [encode source] ++ [encode destination] ++ [encode member] )
-
-zremrangebyrank
+mget
     :: (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] -- ^ key
+    -> m (f [Maybe ByteString])
+mget key = sendRequest (["MGET"] ++ map encode key )
 
-sadd
+hexists
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ member
-    -> m (f Integer)
-sadd key member = sendRequest (["SADD"] ++ [encode key] ++ map encode member )
+    -> ByteString -- ^ field
+    -> m (f Bool)
+hexists key field = sendRequest (["HEXISTS"] ++ [encode key] ++ [encode field] )
 
-lpush
+exists
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ value
-    -> m (f Integer)
-lpush key value = sendRequest (["LPUSH"] ++ [encode key] ++ map encode value )
+    -> m (f Bool)
+exists key = sendRequest (["EXISTS"] ++ [encode key] )
 
-strlen
+sunion
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> m (f Integer)
-strlen key = sendRequest (["STRLEN"] ++ [encode key] )
+    => [ByteString] -- ^ key
+    -> m (f [ByteString])
+sunion key = sendRequest (["SUNION"] ++ map encode key )
 
-set
+configSet
     :: (RedisCtx m f)
-    => ByteString -- ^ key
+    => ByteString -- ^ parameter
     -> ByteString -- ^ value
     -> m (f Status)
-set key value = sendRequest (["SET"] ++ [encode key] ++ [encode value] )
-
-lindex
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ index
-    -> m (f (Maybe ByteString))
-lindex key index = sendRequest (["LINDEX"] ++ [encode key] ++ [encode index] )
-
-zscore
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> ByteString -- ^ member
-    -> m (f (Maybe Double))
-zscore key member = sendRequest (["ZSCORE"] ++ [encode key] ++ [encode member] )
-
-configResetstat
-    :: (RedisCtx m f)
-    => m (f Status)
-configResetstat  = sendRequest (["CONFIG","RESETSTAT"] )
-
-del
-    :: (RedisCtx m f)
-    => [ByteString] -- ^ key
-    -> m (f Integer)
-del key = sendRequest (["DEL"] ++ map encode key )
+configSet parameter value = sendRequest (["CONFIG","SET"] ++ [encode parameter] ++ [encode value] )
 
-zrevrank
+smembers
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ member
-    -> m (f (Maybe Integer))
-zrevrank key member = sendRequest (["ZREVRANK"] ++ [encode key] ++ [encode member] )
+    -> m (f [ByteString])
+smembers key = sendRequest (["SMEMBERS"] ++ [encode key] )
 
-scriptKill
+ping
     :: (RedisCtx m f)
     => m (f Status)
-scriptKill  = sendRequest (["SCRIPT","KILL"] )
-
-incrby
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ increment
-    -> m (f Integer)
-incrby key increment = sendRequest (["INCRBY"] ++ [encode key] ++ [encode increment] )
-
-setbit
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ offset
-    -> ByteString -- ^ value
-    -> m (f Integer)
-setbit key offset value = sendRequest (["SETBIT"] ++ [encode key] ++ [encode offset] ++ [encode value] )
-
-incrbyfloat
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Double -- ^ increment
-    -> m (f Double)
-incrbyfloat key increment = sendRequest (["INCRBYFLOAT"] ++ [encode key] ++ [encode increment] )
+ping  = sendRequest (["PING"] )
 
 brpoplpush
     :: (RedisCtx m f)
@@ -604,6 +493,13 @@
     -> m (f (Maybe ByteString))
 rpop key = sendRequest (["RPOP"] ++ [encode key] )
 
+incrbyfloat
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> Double -- ^ increment
+    -> m (f Double)
+incrbyfloat key increment = sendRequest (["INCRBYFLOAT"] ++ [encode key] ++ [encode increment] )
+
 setrange
     :: (RedisCtx m f)
     => ByteString -- ^ key
@@ -612,76 +508,74 @@
     -> m (f Integer)
 setrange key offset value = sendRequest (["SETRANGE"] ++ [encode key] ++ [encode offset] ++ [encode value] )
 
-ttl
-    :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> m (f Integer)
-ttl key = sendRequest (["TTL"] ++ [encode key] )
-
-zremrangebyscore
+hincrbyfloat
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Double -- ^ min
-    -> Double -- ^ max
-    -> m (f Integer)
-zremrangebyscore key min max = sendRequest (["ZREMRANGEBYSCORE"] ++ [encode key] ++ [encode min] ++ [encode max] )
+    -> ByteString -- ^ field
+    -> Double -- ^ increment
+    -> m (f Double)
+hincrbyfloat key field increment = sendRequest (["HINCRBYFLOAT"] ++ [encode key] ++ [encode field] ++ [encode increment] )
 
-zrank
+zrevrank
     :: (RedisCtx m f)
     => ByteString -- ^ key
     -> ByteString -- ^ member
     -> m (f (Maybe Integer))
-zrank key member = sendRequest (["ZRANK"] ++ [encode key] ++ [encode member] )
+zrevrank key member = sendRequest (["ZREVRANK"] ++ [encode key] ++ [encode member] )
 
-hkeys
+lindex
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f [ByteString])
-hkeys key = sendRequest (["HKEYS"] ++ [encode key] )
+    -> Integer -- ^ index
+    -> m (f (Maybe ByteString))
+lindex key index = sendRequest (["LINDEX"] ++ [encode key] ++ [encode index] )
 
-dump
+sadd
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f ByteString)
-dump key = sendRequest (["DUMP"] ++ [encode key] )
+    -> [ByteString] -- ^ member
+    -> m (f Integer)
+sadd key member = sendRequest (["SADD"] ++ [encode key] ++ map encode member )
 
-rpush
+srandmember
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [ByteString] -- ^ value
-    -> m (f Integer)
-rpush key value = sendRequest (["RPUSH"] ++ [encode key] ++ map encode value )
+    -> m (f (Maybe ByteString))
+srandmember key = sendRequest (["SRANDMEMBER"] ++ [encode key] )
 
-pttl
+zscore
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f Integer)
-pttl key = sendRequest (["PTTL"] ++ [encode key] )
+    -> ByteString -- ^ member
+    -> m (f (Maybe Double))
+zscore key member = sendRequest (["ZSCORE"] ++ [encode key] ++ [encode member] )
 
-spop
+persist
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f (Maybe ByteString))
-spop key = sendRequest (["SPOP"] ++ [encode key] )
+    -> m (f Bool)
+persist key = sendRequest (["PERSIST"] ++ [encode key] )
 
-randomkey
+zincrby
     :: (RedisCtx m f)
-    => m (f (Maybe ByteString))
-randomkey  = sendRequest (["RANDOMKEY"] )
+    => ByteString -- ^ key
+    -> Integer -- ^ increment
+    -> ByteString -- ^ member
+    -> m (f Double)
+zincrby key increment member = sendRequest (["ZINCRBY"] ++ [encode key] ++ [encode increment] ++ [encode member] )
 
-hsetnx
+rpoplpush
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> ByteString -- ^ value
-    -> m (f Bool)
-hsetnx key field value = sendRequest (["HSETNX"] ++ [encode key] ++ [encode field] ++ [encode value] )
+    => ByteString -- ^ source
+    -> ByteString -- ^ destination
+    -> m (f (Maybe ByteString))
+rpoplpush source destination = sendRequest (["RPOPLPUSH"] ++ [encode source] ++ [encode destination] )
 
-configGet
+hgetall
     :: (RedisCtx m f)
-    => ByteString -- ^ parameter
+    => ByteString -- ^ key
     -> m (f [(ByteString,ByteString)])
-configGet parameter = sendRequest (["CONFIG","GET"] ++ [encode parameter] )
+hgetall key = sendRequest (["HGETALL"] ++ [encode key] )
 
 mset
     :: (RedisCtx m f)
@@ -689,26 +583,20 @@
     -> m (f Status)
 mset keyValue = sendRequest (["MSET"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )
 
-setex
+hmset
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ seconds
-    -> ByteString -- ^ value
+    -> [(ByteString,ByteString)] -- ^ fieldValue
     -> m (f Status)
-setex key seconds value = sendRequest (["SETEX"] ++ [encode key] ++ [encode seconds] ++ [encode value] )
-
-sunionstore
-    :: (RedisCtx m f)
-    => ByteString -- ^ destination
-    -> [ByteString] -- ^ key
-    -> m (f Integer)
-sunionstore destination key = sendRequest (["SUNIONSTORE"] ++ [encode destination] ++ map encode key )
+hmset key fieldValue = sendRequest (["HMSET"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])fieldValue )
 
-scriptExists
+psetex
     :: (RedisCtx m f)
-    => [ByteString] -- ^ script
-    -> m (f [Bool])
-scriptExists script = sendRequest (["SCRIPT","EXISTS"] ++ map encode script )
+    => ByteString -- ^ key
+    -> Integer -- ^ milliseconds
+    -> ByteString -- ^ value
+    -> m (f Status)
+psetex key milliseconds value = sendRequest (["PSETEX"] ++ [encode key] ++ [encode milliseconds] ++ [encode value] )
 
 brpop
     :: (RedisCtx m f)
@@ -717,96 +605,90 @@
     -> m (f (Maybe (ByteString,ByteString)))
 brpop key timeout = sendRequest (["BRPOP"] ++ map encode key ++ [encode timeout] )
 
-psetex
+hsetnx
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ milliseconds
+    -> ByteString -- ^ field
     -> ByteString -- ^ value
-    -> m (f Status)
-psetex key milliseconds value = sendRequest (["PSETEX"] ++ [encode key] ++ [encode milliseconds] ++ [encode value] )
+    -> m (f Bool)
+hsetnx key field value = sendRequest (["HSETNX"] ++ [encode key] ++ [encode field] ++ [encode value] )
 
-rpoplpush
+configGet
     :: (RedisCtx m f)
-    => ByteString -- ^ source
-    -> ByteString -- ^ destination
-    -> m (f (Maybe ByteString))
-rpoplpush source destination = sendRequest (["RPOPLPUSH"] ++ [encode source] ++ [encode destination] )
+    => ByteString -- ^ parameter
+    -> m (f [(ByteString,ByteString)])
+configGet parameter = sendRequest (["CONFIG","GET"] ++ [encode parameter] )
 
-hlen
+zrank
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f Integer)
-hlen key = sendRequest (["HLEN"] ++ [encode key] )
+    -> ByteString -- ^ member
+    -> m (f (Maybe Integer))
+zrank key member = sendRequest (["ZRANK"] ++ [encode key] ++ [encode member] )
 
-hgetall
+hkeys
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f [(ByteString,ByteString)])
-hgetall key = sendRequest (["HGETALL"] ++ [encode key] )
+    -> m (f [ByteString])
+hkeys key = sendRequest (["HKEYS"] ++ [encode key] )
 
-zcard
+ttl
     :: (RedisCtx m f)
     => ByteString -- ^ key
     -> m (f Integer)
-zcard key = sendRequest (["ZCARD"] ++ [encode key] )
+ttl key = sendRequest (["TTL"] ++ [encode key] )
 
-ltrim
+getset
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ start
-    -> Integer -- ^ stop
-    -> m (f Status)
-ltrim key start stop = sendRequest (["LTRIM"] ++ [encode key] ++ [encode start] ++ [encode stop] )
+    -> ByteString -- ^ value
+    -> m (f (Maybe ByteString))
+getset key value = sendRequest (["GETSET"] ++ [encode key] ++ [encode value] )
 
-lset
+slaveof
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ index
-    -> ByteString -- ^ value
+    => ByteString -- ^ host
+    -> ByteString -- ^ port
     -> m (f Status)
-lset key index value = sendRequest (["LSET"] ++ [encode key] ++ [encode index] ++ [encode value] )
+slaveof host port = sendRequest (["SLAVEOF"] ++ [encode host] ++ [encode port] )
 
-append
+setnx
     :: (RedisCtx m f)
     => ByteString -- ^ key
     -> ByteString -- ^ value
-    -> m (f Integer)
-append key value = sendRequest (["APPEND"] ++ [encode key] ++ [encode value] )
-
-info
-    :: (RedisCtx m f)
-    => m (f ByteString)
-info  = sendRequest (["INFO"] )
+    -> m (f Bool)
+setnx key value = sendRequest (["SETNX"] ++ [encode key] ++ [encode value] )
 
-hget
+dump
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> m (f (Maybe ByteString))
-hget key field = sendRequest (["HGET"] ++ [encode key] ++ [encode field] )
+    -> m (f ByteString)
+dump key = sendRequest (["DUMP"] ++ [encode key] )
 
-sdiff
+keys
     :: (RedisCtx m f)
-    => [ByteString] -- ^ key
+    => ByteString -- ^ pattern
     -> m (f [ByteString])
-sdiff key = sendRequest (["SDIFF"] ++ map encode key )
+keys pattern = sendRequest (["KEYS"] ++ [encode pattern] )
 
-getrange
+echo
     :: (RedisCtx m f)
-    => ByteString -- ^ key
-    -> Integer -- ^ start
-    -> Integer -- ^ end
+    => ByteString -- ^ message
     -> m (f ByteString)
-getrange key start end = sendRequest (["GETRANGE"] ++ [encode key] ++ [encode start] ++ [encode end] )
+echo message = sendRequest (["ECHO"] ++ [encode message] )
 
-zcount
+getbit
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Double -- ^ min
-    -> Double -- ^ max
+    -> Integer -- ^ offset
     -> m (f Integer)
-zcount key min max = sendRequest (["ZCOUNT"] ++ [encode key] ++ [encode min] ++ [encode max] )
+getbit key offset = sendRequest (["GETBIT"] ++ [encode key] ++ [encode offset] )
 
+quit
+    :: (RedisCtx m f)
+    => m (f Status)
+quit  = sendRequest (["QUIT"] )
+
 srem
     :: (RedisCtx m f)
     => ByteString -- ^ key
@@ -814,10 +696,12 @@
     -> m (f Integer)
 srem key member = sendRequest (["SREM"] ++ [encode key] ++ map encode member )
 
-quit
+move
     :: (RedisCtx m f)
-    => m (f Status)
-quit  = sendRequest (["QUIT"] )
+    => ByteString -- ^ key
+    -> Integer -- ^ db
+    -> m (f Bool)
+move key db = sendRequest (["MOVE"] ++ [encode key] ++ [encode db] )
 
 scriptLoad
     :: (RedisCtx m f)
@@ -825,32 +709,81 @@
     -> m (f ByteString)
 scriptLoad script = sendRequest (["SCRIPT","LOAD"] ++ [encode script] )
 
-getbit
+msetnx
     :: (RedisCtx m f)
+    => [(ByteString,ByteString)] -- ^ keyValue
+    -> m (f Bool)
+msetnx keyValue = sendRequest (["MSETNX"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )
+
+save
+    :: (RedisCtx m f)
+    => m (f Status)
+save  = sendRequest (["SAVE"] )
+
+ltrim
+    :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ offset
+    -> Integer -- ^ start
+    -> Integer -- ^ stop
+    -> m (f Status)
+ltrim key start stop = sendRequest (["LTRIM"] ++ [encode key] ++ [encode start] ++ [encode stop] )
+
+lrem
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> Integer -- ^ count
+    -> ByteString -- ^ value
     -> m (f Integer)
-getbit key offset = sendRequest (["GETBIT"] ++ [encode key] ++ [encode offset] )
+lrem key count value = sendRequest (["LREM"] ++ [encode key] ++ [encode count] ++ [encode value] )
 
-msetnx
+pexpireat
     :: (RedisCtx m f)
-    => [(ByteString,ByteString)] -- ^ keyValue
+    => ByteString -- ^ key
+    -> Integer -- ^ millisecondsTimestamp
     -> m (f Bool)
-msetnx keyValue = sendRequest (["MSETNX"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )
+pexpireat key millisecondsTimestamp = sendRequest (["PEXPIREAT"] ++ [encode key] ++ [encode millisecondsTimestamp] )
 
-sismember
+zcard
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ member
+    -> m (f Integer)
+zcard key = sendRequest (["ZCARD"] ++ [encode key] )
+
+renamenx
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> ByteString -- ^ newkey
     -> m (f Bool)
-sismember key member = sendRequest (["SISMEMBER"] ++ [encode key] ++ [encode member] )
+renamenx key newkey = sendRequest (["RENAMENX"] ++ [encode key] ++ [encode newkey] )
 
-select
+llen
     :: (RedisCtx m f)
-    => Integer -- ^ index
-    -> m (f Status)
-select index = sendRequest (["SELECT"] ++ [encode index] )
+    => ByteString -- ^ key
+    -> m (f Integer)
+llen key = sendRequest (["LLEN"] ++ [encode key] )
 
+pexpire
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> Integer -- ^ milliseconds
+    -> m (f Bool)
+pexpire key milliseconds = sendRequest (["PEXPIRE"] ++ [encode key] ++ [encode milliseconds] )
+
+decrby
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> Integer -- ^ decrement
+    -> m (f Integer)
+decrby key decrement = sendRequest (["DECRBY"] ++ [encode key] ++ [encode decrement] )
+
+lrange
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> Integer -- ^ start
+    -> Integer -- ^ stop
+    -> m (f [ByteString])
+lrange key start stop = sendRequest (["LRANGE"] ++ [encode key] ++ [encode start] ++ [encode stop] )
+
 sinterstore
     :: (RedisCtx m f)
     => ByteString -- ^ destination
@@ -858,6 +791,13 @@
     -> m (f Integer)
 sinterstore destination key = sendRequest (["SINTERSTORE"] ++ [encode destination] ++ map encode key )
 
+rename
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> ByteString -- ^ newkey
+    -> m (f Status)
+rename key newkey = sendRequest (["RENAME"] ++ [encode key] ++ [encode newkey] )
+
 restore
     :: (RedisCtx m f)
     => ByteString -- ^ key
@@ -866,56 +806,81 @@
     -> m (f Status)
 restore key timeToLive serializedValue = sendRequest (["RESTORE"] ++ [encode key] ++ [encode timeToLive] ++ [encode serializedValue] )
 
-configSet
+hvals
     :: (RedisCtx m f)
-    => ByteString -- ^ parameter
-    -> ByteString -- ^ value
-    -> m (f Status)
-configSet parameter value = sendRequest (["CONFIG","SET"] ++ [encode parameter] ++ [encode value] )
+    => ByteString -- ^ key
+    -> m (f [ByteString])
+hvals key = sendRequest (["HVALS"] ++ [encode key] )
 
-hexists
+zrem
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> ByteString -- ^ field
-    -> m (f Bool)
-hexists key field = sendRequest (["HEXISTS"] ++ [encode key] ++ [encode field] )
+    -> [ByteString] -- ^ member
+    -> m (f Integer)
+zrem key member = sendRequest (["ZREM"] ++ [encode key] ++ map encode member )
 
-scriptFlush
+decr
     :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> m (f Integer)
+decr key = sendRequest (["DECR"] ++ [encode key] )
+
+configResetstat
+    :: (RedisCtx m f)
     => m (f Status)
-scriptFlush  = sendRequest (["SCRIPT","FLUSH"] )
+configResetstat  = sendRequest (["CONFIG","RESETSTAT"] )
 
-llen
+flushall
     :: (RedisCtx m f)
+    => m (f Status)
+flushall  = sendRequest (["FLUSHALL"] )
+
+hdel
+    :: (RedisCtx m f)
     => ByteString -- ^ key
+    -> [ByteString] -- ^ field
     -> m (f Integer)
-llen key = sendRequest (["LLEN"] ++ [encode key] )
+hdel key field = sendRequest (["HDEL"] ++ [encode key] ++ map encode field )
 
-lastsave
+setbit
     :: (RedisCtx m f)
-    => m (f Integer)
-lastsave  = sendRequest (["LASTSAVE"] )
+    => ByteString -- ^ key
+    -> Integer -- ^ offset
+    -> ByteString -- ^ value
+    -> m (f Integer)
+setbit key offset value = sendRequest (["SETBIT"] ++ [encode key] ++ [encode offset] ++ [encode value] )
 
-mget
+del
     :: (RedisCtx m f)
     => [ByteString] -- ^ key
-    -> m (f [Maybe ByteString])
-mget key = sendRequest (["MGET"] ++ map encode key )
+    -> m (f Integer)
+del key = sendRequest (["DEL"] ++ map encode key )
 
-zadd
+scriptKill
     :: (RedisCtx m f)
+    => m (f Status)
+scriptKill  = sendRequest (["SCRIPT","KILL"] )
+
+incrby
+    :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> [(Double,ByteString)] -- ^ scoreMember
+    -> Integer -- ^ increment
     -> m (f Integer)
-zadd key scoreMember = sendRequest (["ZADD"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])scoreMember )
+incrby key increment = sendRequest (["INCRBY"] ++ [encode key] ++ [encode increment] )
 
-decrby
+hincrby
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> Integer -- ^ decrement
+    -> ByteString -- ^ field
+    -> Integer -- ^ increment
     -> m (f Integer)
-decrby key decrement = sendRequest (["DECRBY"] ++ [encode key] ++ [encode decrement] )
+hincrby key field increment = sendRequest (["HINCRBY"] ++ [encode key] ++ [encode field] ++ [encode increment] )
 
+time
+    :: (RedisCtx m f)
+    => m (f (Integer,Integer))
+time  = sendRequest (["TIME"] )
+
 hset
     :: (RedisCtx m f)
     => ByteString -- ^ key
@@ -924,12 +889,17 @@
     -> m (f Bool)
 hset key field value = sendRequest (["HSET"] ++ [encode key] ++ [encode field] ++ [encode value] )
 
-srandmember
+strlen
     :: (RedisCtx m f)
     => ByteString -- ^ key
-    -> m (f (Maybe ByteString))
-srandmember key = sendRequest (["SRANDMEMBER"] ++ [encode key] )
+    -> m (f Integer)
+strlen key = sendRequest (["STRLEN"] ++ [encode key] )
 
+flushdb
+    :: (RedisCtx m f)
+    => m (f Status)
+flushdb  = sendRequest (["FLUSHDB"] )
+
 lpushx
     :: (RedisCtx m f)
     => ByteString -- ^ key
@@ -937,11 +907,35 @@
     -> m (f Integer)
 lpushx key value = sendRequest (["LPUSHX"] ++ [encode key] ++ [encode value] )
 
-persist
+smove
     :: (RedisCtx m f)
-    => ByteString -- ^ key
+    => ByteString -- ^ source
+    -> ByteString -- ^ destination
+    -> ByteString -- ^ member
     -> m (f Bool)
-persist key = sendRequest (["PERSIST"] ++ [encode key] )
+smove source destination member = sendRequest (["SMOVE"] ++ [encode source] ++ [encode destination] ++ [encode member] )
+
+zremrangebyrank
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> Integer -- ^ start
+    -> Integer -- ^ stop
+    -> m (f Integer)
+zremrangebyrank key start stop = sendRequest (["ZREMRANGEBYRANK"] ++ [encode key] ++ [encode start] ++ [encode stop] )
+
+set
+    :: (RedisCtx m f)
+    => ByteString -- ^ key
+    -> ByteString -- ^ value
+    -> 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 )
 
 
 
diff --git a/src/Database/Redis/Core.hs b/src/Database/Redis/Core.hs
--- a/src/Database/Redis/Core.hs
+++ b/src/Database/Redis/Core.hs
@@ -7,7 +7,7 @@
     Redis(),runRedis,
     RedisCtx(..), MonadRedis(..),
     send, recv, sendRequest,
-    auth
+    auth, select
 ) where
 
 import Prelude hiding (catch)
@@ -121,6 +121,8 @@
     -- ^ When the server is protected by a password, set 'connectAuth' to 'Just'
     --   the password. Each connection will then authenticate by the 'auth'
     --   command.
+    , connectDatabase       :: Integer
+    -- ^ Each connection will 'select' the database with the given index.
     , connectMaxConnections :: Int
     -- ^ Maximum number of connections to keep open. The smallest acceptable
     --   value is 1.
@@ -137,6 +139,7 @@
 --  connectHost           = \"localhost\"
 --  connectPort           = PortNumber 6379 -- Redis default port
 --  connectAuth           = Nothing         -- No password
+--  connectDatabase       = 0               -- SELECT database 0
 --  connectMaxConnections = 50              -- Up to 50 connections
 --  connectMaxIdleTime    = 30              -- Keep open for 30 seconds
 -- @
@@ -146,6 +149,7 @@
     { connectHost           = "localhost"
     , connectPort           = PortNumber 6379
     , connectAuth           = Nothing
+    , connectDatabase       = 0
     , connectMaxConnections = 50
     , connectMaxIdleTime    = 30
     }
@@ -158,9 +162,13 @@
   where
     create = do
         conn <- PP.connect connectHost connectPort reply
-        maybe (return ())
-            (void . runRedisInternal conn . auth)
-            connectAuth
+        runRedisInternal conn $ do
+            -- AUTH
+            case connectAuth of
+                Nothing   -> return ()
+                Just pass -> void $ auth pass
+            -- SELECT
+            when (connectDatabase /= 0) (void $ select connectDatabase)
         return conn
 
     destroy = PP.disconnect
@@ -170,3 +178,10 @@
     :: B.ByteString -- ^ password
     -> Redis (Either Reply Status)
 auth password = sendRequest ["AUTH", password]
+
+-- The SELECT command. Used in 'connect'.
+select
+    :: RedisCtx m f
+    => Integer -- ^ index
+    -> m (f Status)
+select ix = sendRequest ["SELECT", encode ix]
