diff --git a/rascal.cabal b/rascal.cabal
--- a/rascal.cabal
+++ b/rascal.cabal
@@ -3,7 +3,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             1.1.5
+version:             1.1.6
 synopsis:            A command-line client for Reddit
 description:         Rascal is a command-line client for Reddit with colors,
                      configurable sorting, threaded comments, and some day
@@ -22,17 +22,27 @@
 source-repository this
   type:              git
   location:          git://github.com/soli/rascal.git
-  tag:               v1.1.5
+  tag:               v1.1.6
 
 source-repository head
   type:              git
   location:          git://github.com/soli/rascal.git
 
+library
+  hs-source-dirs:    src
+  exposed-modules:   Paths_rascal, Rascal.Utils, Rascal.Conf, Rascal.Types
+                   , Rascal.Constants, Rascal.API
+  ghc-options:       -Wall
+  build-depends:     base >=4.6 && <4.7, curl-aeson, curl, aeson
+                   , process >= 1.2, ansi-terminal, vector
+                   , filepath, directory, containers, mtl
+  default-language:  Haskell2010
+
 executable rascal
   hs-source-dirs:    src
   main-is:           Main.hs
   other-modules:     Paths_rascal, Rascal.Utils, Rascal.Conf, Rascal.Types
-                   , Rascal.Constants
+                   , Rascal.Constants, Rascal.API
   ghc-options:       -Wall
   build-depends:     base >=4.6 && <4.7, curl-aeson, curl, aeson
                    , process >= 1.2, ansi-terminal, vector
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -7,19 +7,13 @@
 import Control.Monad          (when, unless)
 import Control.Monad.Reader   (ReaderT, ask, runReaderT)
 import Control.Monad.Trans    (liftIO)
-import Control.Applicative    ((<$>))
 import Text.Printf            (printf)
 import System.Environment     (getArgs)
 import Data.Char              (ord)
 import Data.List              (intercalate, elemIndices)
 import Data.Maybe             (isJust)
 import System.IO
-import Control.Exception      (handle)
 
-import Data.Aeson             (parseJSON, FromJSON)
-import Network.Curl.Aeson     (curlAeson, noData, CurlAesonException, errorMsg, curlCode)
-import Network.Curl.Opts      (CurlOption(CurlUserAgent))
-import Network.Curl.Code      (CurlCode(CurlOK))
 import System.Process         (readProcess)
 import System.Console.ANSI    (clearLine)
 import Data.Map               ((!))
@@ -28,6 +22,7 @@
 import Rascal.Utils
 import Rascal.Types
 import Rascal.Conf
+import Rascal.API
 
 -- we do not use Show because we depend on (an IO generated) width
 showLink :: Link -> Int -> String
@@ -81,35 +76,7 @@
       putStrLn $ showListing l w
       displayCommands w
 
--- |get posts according to selection in argument's subreddit as a listing
-getListing :: String -> String -> Int -> Maybe String -> IO NamedListing
-getListing select subreddit cnt aftr =
-   let apiurl = "http://www.reddit.com/r/" ++ subreddit ++ "/%s.json?count="
-                ++ show cnt ++ maybe "" ("&after=" ++) aftr
-   in NamedListing (subreddit ++ " -- " ++ select) cnt <$>
-      getThing apiurl select emptyListing
 
--- |get posts or comments from an apiurl, a sort order and a default in case
--- of error
-getThing :: FromJSON a => String -> String -> a -> IO a
-getThing apiurl sort emptyThing =
-   let sort' = if sort `notElem` map snd availableSorts
-               then snd . head $ availableSorts
-               else sort
-       apiurl' = printf apiurl sort'
-   in handle (handleCurlAesonException emptyThing) $ do
-      l <- curlAeson parseJSON "GET" apiurl' [CurlUserAgent userAgent] noData
-      return $! l
-
--- |print error message if there is a cURL exception
-handleCurlAesonException :: a -> CurlAesonException -> IO a
-handleCurlAesonException x e = do
-   putStrLn $ red ++ "Caught exception: " ++ reset ++ errorMsg e
-   putStrLn $ if curlCode e == CurlOK
-              then "(Might indicate a non-existing subreddit)"
-              else "cURL code: " ++ (drop 4 . show . curlCode) e
-   return x
-
 -- |open nth link in a listing in given width
 open :: NamedListing -> Int -> ReaderT RuntimeConf IO ()
 open nl@(NamedListing _ _ (Listing l _)) n = do
@@ -179,13 +146,6 @@
       putStrLn a
       putStrLn b
       doPageComments height (shown' + nbLines) w remaining
-
--- |request comments for a given article
-getComments :: String -> String -> String -> IO Comments
-getComments subreddit article csort =
-   let apiurl = "http://www.reddit.com/r/" ++ subreddit ++
-                "/comments/" ++ article ++ ".json?sort=%s"
-   in getThing apiurl csort emptyComments
 
 -- |open requested hrefs as urls and stop if anything else
 openRefs :: [String] -> Int -> IO ()
diff --git a/src/Rascal/API.hs b/src/Rascal/API.hs
new file mode 100644
--- /dev/null
+++ b/src/Rascal/API.hs
@@ -0,0 +1,49 @@
+module Rascal.API where
+
+import Control.Applicative    ((<$>))
+import Text.Printf            (printf)
+import Control.Exception      (handle)
+
+import Data.Aeson             (parseJSON, FromJSON)
+import Network.Curl.Aeson     (curlAeson, noData, CurlAesonException, errorMsg, curlCode)
+import Network.Curl.Opts      (CurlOption(CurlUserAgent))
+import Network.Curl.Code      (CurlCode(CurlOK))
+
+import Rascal.Constants
+import Rascal.Types
+
+-- |get posts according to selection in argument's subreddit as a listing
+getListing :: String -> String -> Int -> Maybe String -> IO NamedListing
+getListing select subreddit cnt aftr =
+   let apiurl = "http://www.reddit.com/r/" ++ subreddit ++ "/%s.json?count="
+                ++ show cnt ++ maybe "" ("&after=" ++) aftr
+   in NamedListing (subreddit ++ " -- " ++ select) cnt <$>
+      getThing apiurl select emptyListing
+
+-- |get posts or comments from an apiurl, a sort order and a default in case
+-- of error
+getThing :: FromJSON a => String -> String -> a -> IO a
+getThing apiurl sort emptyThing =
+   let sort' = if sort `notElem` map snd availableSorts
+               then snd . head $ availableSorts
+               else sort
+       apiurl' = printf apiurl sort'
+   in handle (handleCurlAesonException emptyThing) $ do
+      l <- curlAeson parseJSON "GET" apiurl' [CurlUserAgent userAgent] noData
+      return $! l
+
+-- |print error message if there is a cURL exception
+handleCurlAesonException :: a -> CurlAesonException -> IO a
+handleCurlAesonException x e = do
+   putStrLn $ red ++ "Caught exception: " ++ reset ++ errorMsg e
+   putStrLn $ if curlCode e == CurlOK
+              then "(Might indicate a non-existing subreddit)"
+              else "cURL code: " ++ (drop 4 . show . curlCode) e
+   return x
+
+-- |request comments for a given article
+getComments :: String -> String -> String -> IO Comments
+getComments subreddit article csort =
+   let apiurl = "http://www.reddit.com/r/" ++ subreddit ++
+                "/comments/" ++ article ++ ".json?sort=%s"
+   in getThing apiurl csort emptyComments
