diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,1 +1,30 @@
 language: haskell
+
+env:
+  - GHCVER=7.4.2
+  - GHCVER=7.6.3
+  - GHCVER=7.8.2
+  - GHCVER=head
+
+matrix:
+  allow_failures:
+    - env: GHCVER=head
+
+before_install:
+  - travis_retry sudo add-apt-repository -y ppa:hvr/ghc
+  - travis_retry sudo apt-get update
+  - travis_retry sudo apt-get install cabal-install-1.18 ghc-$GHCVER
+  - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/1.18/bin:$PATH
+
+install:
+  - export PATH=$HOME/.cabal/bin:$PATH
+  - which cabal
+  - cabal update
+  - cabal install happy --constraint="transformers < 0.4"
+  - cabal install --only-dependencies --enable-tests
+  - ghc-pkg list
+
+script:
+  - cabal configure --enable-tests
+  - cabal build
+  - cabal test --show-details=always
diff --git a/Web/Twitter/Conduit/Api.hs b/Web/Twitter/Conduit/Api.hs
--- a/Web/Twitter/Conduit/Api.hs
+++ b/Web/Twitter/Conduit/Api.hs
@@ -11,7 +11,8 @@
 module Web.Twitter.Conduit.Api
        (
        -- * Search
-         Search
+         SearchTweets
+       , searchTweets
        , search
 
        -- * Direct Messages
@@ -27,17 +28,20 @@
        , directMessagesNew
 
        -- * Friends & Followers
-       -- , friendshipsNoRetweetsIds
+       , FriendshipsNoRetweetsIds
+       , friendshipsNoRetweetsIds
        , FriendsIds
        , friendsIds
        , FollowersIds
        , followersIds
-       -- , friendshipsLookup
-       -- , friendshipsIncoming
-       -- , friendshipsOutgoing
+       , FriendshipsIncoming
+       , friendshipsIncoming
+       , FriendshipsOutgoing
+       , friendshipsOutgoing
        , FriendshipsCreate
        , friendshipsCreate
-       -- , friendshipsDestroy
+       , FriendshipsDestroy
+       , friendshipsDestroy
        -- , friendshipsUpdate
        -- , friendshipsShow
        , FriendsList
@@ -110,24 +114,24 @@
 -- >>> :set -XOverloadedStrings
 -- >>> import Control.Lens
 
-data Search
+data SearchTweets
 -- | Returns search query.
 --
 -- You can perform a search query using 'call':
 --
 -- @
--- res <- 'call' ('search' \"search text\")
+-- res <- 'call' ('searchTweets' \"search text\")
 -- 'liftIO' . 'print' $ res ^. 'searchResultStatuses'
 -- @
 --
--- >>> search "search text"
+-- >>> searchTweets "search text"
 -- APIRequestGet "https://api.twitter.com/1.1/search/tweets.json" [("q","search text")]
--- >>> search "search text" & lang ?~ "ja" & count ?~ 100
+-- >>> searchTweets "search text" & lang ?~ "ja" & count ?~ 100
 -- APIRequestGet "https://api.twitter.com/1.1/search/tweets.json" [("count","100"),("lang","ja"),("q","search text")]
-search :: T.Text -- ^ search string
-       -> APIRequest Search (SearchResult [SearchStatus])
-search q = APIRequestGet (endpoint ++ "search/tweets.json") [("q", T.encodeUtf8 q)]
-deriveHasParamInstances ''Search
+searchTweets :: T.Text -- ^ search string
+             -> APIRequest SearchTweets (SearchResult [SearchStatus])
+searchTweets q = APIRequestGet (endpoint ++ "search/tweets.json") [("q", T.encodeUtf8 q)]
+deriveHasParamInstances ''SearchTweets
     [ "lang"
     , "locale"
     -- , "result_type"
@@ -139,6 +143,11 @@
     -- , "callback"  (needless)
     ]
 
+-- | Alias of 'searchTweets', for backward compatibility
+search :: T.Text -- ^ search string
+       -> APIRequest SearchTweets (SearchResult [SearchStatus])
+search = searchTweets
+
 data DirectMessages
 -- | Returns query data which asks recent direct messages sent to the authenticating user.
 --
@@ -233,6 +242,20 @@
 directMessagesNew :: UserParam -> T.Text -> APIRequest DirectMessagesNew DirectMessage
 directMessagesNew q msg = APIRequestPost (endpoint ++ "direct_messages/new.json") (("text", T.encodeUtf8 msg):mkUserParam q)
 
+data FriendshipsNoRetweetsIds
+-- | Returns a collection of user_ids that the currently authenticated user does not want to receive retweets from.
+--
+-- You can perform a request using 'call':
+--
+-- @
+-- res <- 'call' '$' 'friendshipsNoRetweetsIds'
+-- @
+--
+-- >>> friendshipsNoRetweetsIds
+-- APIRequestGet "https://api.twitter.com/1.1/friendships/no_retweets/ids.json" []
+friendshipsNoRetweetsIds :: APIRequest FriendshipsNoRetweetsIds [UserId]
+friendshipsNoRetweetsIds = APIRequestGet (endpoint ++ "friendships/no_retweets/ids.json") []
+
 data FriendsIds
 -- | Returns query data which asks a collection of user IDs for every user the specified user is following.
 --
@@ -287,6 +310,54 @@
     , "count"
     ]
 
+data FriendshipsIncoming
+-- | Returns a collection of numeric IDs for every user who has a pending request to follow the authenticating user.
+--
+-- You can perform a request by using 'call':
+--
+-- @
+-- res <- 'call' '$' 'friendshipsIncoming'
+-- @
+--
+-- Or, you can iterate with 'sourceWithCursor':
+--
+-- @
+-- 'sourceWithCursor' 'friendshipsIncoming' $$ CL.consume
+-- @
+--
+-- >>> friendshipsIncoming
+-- APIRequestGet "https://api.twitter.com/1.1/friendships/incoming.json" []
+friendshipsIncoming :: APIRequest FriendshipsIncoming (WithCursor IdsCursorKey UserId)
+friendshipsIncoming = APIRequestGet (endpoint ++ "friendships/incoming.json") def
+deriveHasParamInstances ''FriendshipsIncoming
+    [ "cursor"
+    -- , "stringify_ids" -- (needless)
+    ]
+
+data FriendshipsOutgoing
+-- | Returns a collection of numeric IDs for every protected user for whom the authenticating user has a pending follow request.
+--
+-- You can perform a request by using 'call':
+--
+-- @
+-- res <- 'call' '$' 'friendshipsOutgoing'
+-- @
+--
+-- Or, you can iterate with 'sourceWithCursor':
+--
+-- @
+-- 'sourceWithCursor' 'friendshipsOutgoing' $$ CL.consume
+-- @
+--
+-- >>> friendshipsOutgoing
+-- APIRequestGet "https://api.twitter.com/1.1/friendships/outgoing.json" []
+friendshipsOutgoing :: APIRequest FriendshipsOutgoing (WithCursor IdsCursorKey UserId)
+friendshipsOutgoing = APIRequestGet (endpoint ++ "friendships/outgoing.json") def
+deriveHasParamInstances ''FriendshipsOutgoing
+    [ "cursor"
+    -- , "stringify_ids" -- (needless)
+    ]
+
 data FriendshipsCreate
 -- | Returns post data which follows the user specified in the ID parameter.
 --
@@ -305,6 +376,22 @@
 deriveHasParamInstances ''FriendshipsCreate
     [ "follow"
     ]
+
+data FriendshipsDestroy
+-- | Returns post data which follows the user specified in the ID parameter.
+--
+-- You can perform request by using 'call':
+--
+-- @
+-- res <- 'call' '$' 'friendshipsDestroy' ('ScreenNameParam' \"thimura\")
+-- @
+--
+-- >>> friendshipsDestroy (ScreenNameParam "thimura")
+-- APIRequestPost "https://api.twitter.com/1.1/friendships/destroy.json" [("screen_name","thimura")]
+-- >>> friendshipsDestroy (UserIdParam 69179963)
+-- APIRequestPost "https://api.twitter.com/1.1/friendships/destroy.json" [("user_id","69179963")]
+friendshipsDestroy :: UserParam -> APIRequest FriendshipsDestroy User
+friendshipsDestroy user = APIRequestPost (endpoint ++ "friendships/destroy.json") (mkUserParam user)
 
 data FriendsList
 -- | Returns query data which asks a cursored collection of user objects for every user the specified users is following.
diff --git a/Web/Twitter/Conduit/Base.hs b/Web/Twitter/Conduit/Base.hs
--- a/Web/Twitter/Conduit/Base.hs
+++ b/Web/Twitter/Conduit/Base.hs
@@ -25,6 +25,7 @@
        , showBS
        ) where
 
+import Prelude as P
 import Web.Twitter.Conduit.Monad
 import Web.Twitter.Conduit.Error
 import Web.Twitter.Conduit.Parameters
@@ -120,7 +121,7 @@
     src C.$$+- sinkFromJSON
   where
     body = prt ++ partParam
-    partParam = map (uncurry partBS . over _1 T.decodeUtf8) param
+    partParam = P.map (uncurry partBS . over _1 T.decodeUtf8) param
 
 sourceWithMaxId :: ( TwitterBaseM m
                    , FromJSON responseType
diff --git a/Web/Twitter/Conduit/Cursor.hs b/Web/Twitter/Conduit/Cursor.hs
--- a/Web/Twitter/Conduit/Cursor.hs
+++ b/Web/Twitter/Conduit/Cursor.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE EmptyDataDecls #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE CPP #-}
 
 module Web.Twitter.Conduit.Cursor
        ( CursorKey (..)
@@ -31,6 +32,7 @@
 instance CursorKey UsersCursorKey where
     cursorKey = const "users"
 
+#if __GLASGOW_HASKELL__ >= 706
 -- | A wrapper for API responses which have "next_cursor" field.
 --
 -- The first type parameter of 'WithCursor' specifies the field name of contents.
@@ -46,6 +48,7 @@
 -- 0
 -- >>> contents res
 -- [1000]
+#endif
 data WithCursor cursorKey wrapped = WithCursor
     { previousCursor :: Integer
     , nextCursor :: Integer
diff --git a/Web/Twitter/Conduit/Parameters.hs b/Web/Twitter/Conduit/Parameters.hs
--- a/Web/Twitter/Conduit/Parameters.hs
+++ b/Web/Twitter/Conduit/Parameters.hs
@@ -23,6 +23,7 @@
        , HasUntilParam (..)
        , HasSkipStatusParam (..)
        , HasFollowParam (..)
+       , HasMapParam (..)
 
        , UserParam(..)
        , UserListParam(..)
@@ -32,6 +33,7 @@
        , mkListParam
        ) where
 
+import Prelude as P
 import Web.Twitter.Conduit.Parameters.Internal
 import Web.Twitter.Conduit.Parameters.TH
 import Web.Twitter.Types
@@ -70,6 +72,7 @@
 defineHasParamClass "until" ''Day 'readShow
 defineHasParamClass "skip_status" ''Bool 'booleanQuery
 defineHasParamClass "follow" ''Bool 'booleanQuery
+defineHasParamClass "map" ''Bool 'booleanQuery
 
 -- | converts 'UserParam' to 'HT.SimpleQuery'.
 --
@@ -91,7 +94,7 @@
 -- [("screen_name","thimura,NikaidouShinku")]
 mkUserListParam :: UserListParam -> HT.SimpleQuery
 mkUserListParam (UserIdListParam uids) =  [("user_id", uids ^.. traversed . re readShow & S8.intercalate ",")]
-mkUserListParam (ScreenNameListParam sns) = [("screen_name", S8.intercalate "," . map S8.pack $ sns)]
+mkUserListParam (ScreenNameListParam sns) = [("screen_name", S8.intercalate "," . P.map S8.pack $ sns)]
 
 -- | converts 'ListParam' to 'HT.SimpleQuery'.
 --
diff --git a/Web/Twitter/Conduit/Request.hs b/Web/Twitter/Conduit/Request.hs
--- a/Web/Twitter/Conduit/Request.hs
+++ b/Web/Twitter/Conduit/Request.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE Rank2Types #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
 
 module Web.Twitter.Conduit.Request
        ( APIRequest(..)
@@ -12,8 +13,13 @@
 import qualified Network.HTTP.Types as HT
 import Control.Applicative
 
+-- In GHC 7.4.2, the following test fails with Overlapping instances error.
+-- It may be caused by #5820 "defining instance in GHCi leads to duplicated instances".
+-- So, we bypass below tests when GHC version older than 7.6.
+-- see details: https://ghc.haskell.org/trac/ghc/ticket/5820
+#if __GLASGOW_HASKELL__ >= 706
 -- $setup
--- >>> :set -XOverloadedStrings -XRank2Types -XEmptyDataDecls -XFlexibleInstances
+-- >>> :set -XOverloadedStrings -XRank2Types -XEmptyDataDecls -XFlexibleInstances -XOverlappingInstances -XIncoherentInstances
 -- >>> import Control.Lens
 -- >>> import Data.Default
 -- >>> data SampleApi
@@ -47,6 +53,7 @@
 -- [("max_id","1234567890"),("count","100")]
 -- >>> (sampleApiRequest & count ?~ 100 & maxId ?~ 1234567890 & count .~ Nothing) ^. params
 -- [("max_id","1234567890")]
+#endif
 data APIRequest apiName responseType
     = APIRequestGet
       { _url :: String
diff --git a/Web/Twitter/Conduit/Status.hs b/Web/Twitter/Conduit/Status.hs
--- a/Web/Twitter/Conduit/Status.hs
+++ b/Web/Twitter/Conduit/Status.hs
@@ -36,14 +36,18 @@
        , updateWithMedia
        -- , oembed
        -- , retweetersIds
+       , StatusesLookup
+       , lookup
        ) where
 
+import Prelude hiding ( lookup )
 import Web.Twitter.Conduit.Base
 import Web.Twitter.Conduit.Request
 import Web.Twitter.Conduit.Parameters
 import Web.Twitter.Conduit.Parameters.TH
 import Web.Twitter.Types
 
+import qualified Data.ByteString as S
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
 import Network.HTTP.Client.MultipartFormData
@@ -287,4 +291,27 @@
     -- , "lat_long"
     -- , "place_id"
     , "display_coordinates"
+    ]
+
+data StatusesLookup
+-- | Returns fully-hydrated tweet objects for up to 100 tweets per request, as specified by comma-separated values passed to the id parameter.
+--
+-- You can perform a request using 'call':
+--
+-- @
+-- res <- 'call' '$' 'lookup' [20, 432656548536401920]
+-- @
+--
+-- >>> lookup [10]
+-- APIRequestGet "https://api.twitter.com/1.1/statuses/lookup.json" [("id","10")]
+-- >>> lookup [10, 432656548536401920]
+-- APIRequestGet "https://api.twitter.com/1.1/statuses/lookup.json" [("id","10,432656548536401920")]
+-- >>> lookup [10, 432656548536401920] & includeEntities ?~ True
+-- APIRequestGet "https://api.twitter.com/1.1/statuses/lookup.json" [("include_entities","true"),("id","10,432656548536401920")]
+lookup :: [ StatusId ] -> APIRequest StatusesLookup [Status]
+lookup ids = APIRequestGet (endpoint ++ "statuses/lookup.json") [("id", S.intercalate "," . Prelude.map showBS $ ids)]
+deriveHasParamInstances ''StatusesLookup
+    [ "include_entities"
+    , "trim_user"
+    , "map"
     ]
diff --git a/tests/doctests.hs b/tests/doctests.hs
--- a/tests/doctests.hs
+++ b/tests/doctests.hs
@@ -8,21 +8,12 @@
 import Control.Applicative
 
 main = do
-  sources <- findSources "Web"
-  doctest $ args ++ sources
+  -- sources <- findSources "Web"
+  doctest $ args -- ++ sources
   where
     args = [ "-i."
            , "-idist/build/autogen"
            , "-optP-include"
            , "-optPdist/build/autogen/cabal_macros.h"
+           , "Web/Twitter/Conduit.hs"
            ]
-
-findSources :: FilePath -> IO [FilePath]
-findSources dir = filter (isSuffixOf ".hs") <$> go dir
-  where
-    go dir = do
-      (dirs, files) <- listFiles dir
-      (files ++) . concat <$> mapM go dirs
-    listFiles dir = do
-      entries <- map (dir </>) . filter (`notElem` [".", ".."]) <$> getDirectoryContents dir
-      (,) <$> filterM doesDirectoryExist entries <*> filterM doesFileExist entries
diff --git a/twitter-conduit.cabal b/twitter-conduit.cabal
--- a/twitter-conduit.cabal
+++ b/twitter-conduit.cabal
@@ -1,5 +1,5 @@
 name:              twitter-conduit
-version:           0.0.2.1
+version:           0.0.3
 license:           BSD3
 license-file:      LICENSE
 author:            HATTORI Hiroki, Hideyuki Tanaka, Takahiro HIMURA
@@ -14,8 +14,8 @@
 description:
   This package provides bindings to Twitter's APIs (see <https://dev.twitter.com/>).
   .
-  This package uses http-conduit package for access Twitter API (see <http://hackage.haskell.org/package/http-conduit>).
-  This package also depends to twitter-types package (see <http://hackage.haskell.org/package/twitter-types>).
+  This package uses the http-conduit package for accessing the Twitter API (see <http://hackage.haskell.org/package/http-conduit>).
+  This package also depends on the twitter-types package (see <http://hackage.haskell.org/package/twitter-types>).
   .
   You can find basic examples in the <https://github.com/himura/twitter-conduit/tree/master/sample> directory.
   .
