diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright David Bouchare (c) 2018
+Copyright David Bouchare, Kristian Sällberg (c) 2018
 
 All rights reserved.
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,34 +1,43 @@
-# stocks  
+# stocks
 
 Haskell library for the IEX trading API.  
 
-Example:  
+Example:
 
 ```haskell
-{-# LANGUAGE RecordWildCards #-}
+stack build && stack ghci
 
-import Net.Stocks
+> getCompany "aapl"
 
-comp :: String
-comp = "AAPL"
+Just (Company {symbol = "AAPL",
+               companyName = "Apple Inc.",
+               exchange = "Nasdaq Global Select",
+               industry = "Computer Hardware",
+               website = "http://www.apple.com",
+               description = "Apple Inc is designs ...",
+               ceo = "Timothy D. Cook",
+               issueType = "cs",
+               sector = "Technology"})
 
-main :: IO ()
-main = do
-    resp <- getData comp QueryStocks
-    case resp of
-        Nothing -> putStrLn "No data for that company"
-        Just (Stock{..}) -> do
-            putStrLn $ "Stock value: " ++ show latestPrice
+> getPrice "dps"
+
+Just 120.36
 ```
 
-Which should show:  
+Please see the HUnit test for a complete example
+of all API calls.
 
+## How to run test suite
 ```
-Stock value: <the_actual_stock_value>
+stack test
 ```
 
-### Attribution  
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/dabcoder/stocks/issues).
+
+### Attribution
 If you redistribute our API data:
 
-* Cite IEX using the following text and link: “Data provided for free by [IEX](https://iextrading.com/developer).”  
+* Cite IEX using the following text and link: “Data provided for free by [IEX](https://iextrading.com/developer).”
 * Provide a link to https://iextrading.com/api-exhibit-a in your terms of service.
diff --git a/Tests/Main.hs b/Tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/Tests/Main.hs
@@ -0,0 +1,124 @@
+module Main where
+
+import Net.IEX.Previous
+import Test.HUnit
+import Net.Stocks
+
+import qualified Data.ByteString.Lazy.Char8 as L8
+import qualified Net.IEX.Stats              as XS
+
+main :: IO Counts
+main = runTestTT tests
+
+tests = TestList [TestLabel "" testChart,
+                  TestLabel "" testCompany,
+                  TestLabel "" testDelayedQuote,
+                  TestLabel "" testDelayedDividend,
+                  TestLabel "" testEarnings,
+                  TestLabel "" testEffectiveSpread,
+                  TestLabel "" testFinancials,
+                  TestLabel "" testStats,
+                  TestLabel "" testNewsItem,
+                  TestLabel "" testOHLC,
+                  TestLabel "" testPeers,
+                  TestLabel "" testPrevious,
+                  TestLabel "" testPrice,
+                  TestLabel "" testQuote,
+                  TestLabel "" testRelevant,
+                  TestLabel "" testSplit,
+                  TestLabel "" testVolumeByVenue,
+                  TestLabel "" testTypeQuery1,
+                  TestLabel "" testBatch,
+                  TestLabel "" testMultiBatch1,
+                  TestLabel "" testMultiBatch2,
+                  TestLabel "" testCorrectCompanyName,
+                  TestLabel "" testMarket,
+                  TestLabel "" testIntraDayStats,
+                  TestLabel "" testRecentStats,
+                  TestLabel "" testRecordStats,
+                  -- TestLabel "" testHistDailyStats
+                  TestLabel "" testBook,
+                  TestLabel "" testTS
+                 ]
+
+testChart = TestCase (do result <- getChart "aapl"
+                         assertBool "desc" (result /= Nothing))
+testCompany = TestCase (do result <- getCompany "aapl"
+                           assertBool "desc" (result /= Nothing))
+testDelayedQuote = TestCase (do result <- getDelayedQuote "aapl"
+                                assertBool "desc" (result /= Nothing))
+testDelayedDividend = TestCase (do result <- getDelayedDividend "aapl"
+                                   assertBool "desc" (result /= Nothing))
+testEarnings = TestCase (do result <- getEarnings "aapl"
+                            assertBool "desc" (result /= Nothing))
+testEffectiveSpread = TestCase (do result <- getEffectiveSpread "aapl"
+                                   assertBool "desc" (result /= Nothing))
+testFinancials = TestCase (do result <- getFinancials "aapl"
+                              assertBool "desc" (result /= Nothing))
+testStats = TestCase (do result <- getStats "aapl"
+                         assertBool "desc" (result /= Nothing))
+testNewsItem = TestCase (do result <- getNewsItem "aapl"
+                            assertBool "desc" (result /= Nothing))
+testOHLC = TestCase (do result <- getOHLC "aapl"
+                        assertBool "desc" (result /= Nothing))
+testPeers = TestCase
+  (do result <- getPeers "aapl"
+      assertEqual "get the correct peers for AAPL" result
+        (L8.pack "[\"MSFT\",\"NOK\",\"IBM\",\"HPQ\",\"GOOGL\",\"BB\",\"XLK\"]"))
+testPrevious = TestCase (do result <- getPrevious "aapl"
+                            assertBool "desc" (result /= Nothing))
+testPrice = TestCase (do result <- getPrice "aapl"
+                         assertBool "" (result /= Nothing))
+testQuote = TestCase (do result <- getQuote "aapl"
+                         assertBool "desc" (result /= Nothing))
+testRelevant = TestCase (do result <- getRelevant "aapl"
+                            assertBool "desc" (result /= Nothing))
+testSplit = TestCase (do result <- getSplit "aapl"
+                         assertBool "desc" (result /= Nothing))
+testVolumeByVenue = TestCase (do result <- getVolumeByVenue "aapl"
+                                 assertBool "desc" (result /= Nothing))
+testTypeQuery1 = TestCase (assertEqual "" "types=news,ohlc"
+                           (typeQuery [NewsQuery, OHLCQuery]))
+testBatch = TestCase
+  (do result <- getBatchCompany "aapl" [StatsQuery, NewsQuery, CompanyQuery]
+      assertBool "" (result /= Nothing))
+
+testMultiBatch1 = TestCase
+  (do result <- getBatch ["fb"] [OHLCQuery]
+      assertBool "" (result /= Nothing))
+
+testMultiBatch2 = TestCase
+  (do result <- getBatch ["dps", "fb"] [OHLCQuery, CompanyQuery]
+      assertBool "" (result /= Nothing))
+
+-- fail
+testCorrectCompanyName = TestCase
+   (do result <- getBatchCompany "aapl" [StatsQuery, NewsQuery, CompanyQuery]
+       assertEqual "" (pickCompanyName result) "Apple Inc.")
+
+pickCompanyName :: Maybe Batch -> String
+pickCompanyName (Just (Batch {stats = st})) = pickCompanyName' st
+
+pickCompanyName' :: Maybe XS.Stats -> String
+pickCompanyName' (Just (XS.Stats {XS.companyName = cname})) = cname
+
+testMarket = TestCase (do result <- getMarket
+                          assertBool "" (result /= Nothing))
+
+testIntraDayStats = TestCase (do result <- getIntraDayStats
+                                 assertBool "" (result /= Nothing))
+
+testRecentStats = TestCase (do result <- getRecentStats
+                               assertBool "" (result /= Nothing))
+
+testRecordStats = TestCase (do result <- getRecordStats
+                               assertBool "" (result /= Nothing))
+
+testBook = TestCase (do result <- getBook "aapl"
+                        assertBool "" (result /= Nothing))
+
+testTS = TestCase (do result <- getTS "aapl"
+                      assertBool "" (result /= Nothing))
+
+-- testHistDailyStats = TestCase (do result <- getHistoricalDailyStats
+--                                   assertBool "" (result /= Nothing))
diff --git a/src/Net/IEX/Book.hs b/src/Net/IEX/Book.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Book.hs
@@ -0,0 +1,32 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Book (Book(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+import Net.IEX.Quote (Quote)
+
+data Book = Book {
+  quote :: Quote,
+  bids :: Maybe [Trade], -- FIXME: not sure of this type
+  asks :: Maybe [Trade], -- FIXME: not sure of this type
+  trades :: [Trade]
+} deriving (Generic, Show, Eq)
+
+data Trade = Trade {
+  price :: Double,
+  size :: Integer,
+  tradeId :: Integer,
+  isISO :: Bool,
+  isOddLot :: Bool,
+  isOutsideRegularHours :: Bool,
+  isSinglePriceCross :: Bool,
+  isTradeThroughExempt :: Bool,
+  timestamp :: Integer
+} deriving (Generic, Show, Eq)
+
+instance ToJSON Book
+instance ToJSON Trade
+instance FromJSON Book
+instance FromJSON Trade
diff --git a/src/Net/IEX/Chart.hs b/src/Net/IEX/Chart.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Chart.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Chart (Chart(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Chart = Chart {
+  -- is only available on 1d chart.
+  minute :: Maybe String,
+  -- is only available on 1d chart. 15 minute delayed
+  marketAverage :: Maybe Double,
+  -- is only available on 1d chart. 15 minute delayed
+  marketNotional :: Maybe Double,
+  -- is only available on 1d chart. 15 minute delayed
+  marketNumberOfTrades :: Maybe Double,
+  -- is only available on 1d chart. 15 minute delayed
+  marketHigh :: Maybe Double,
+  -- is only available on 1d chart. 15 minute delayed
+  marketLow :: Maybe Double,
+  -- is only available on 1d chart. 15 minute delayed
+  marketVolume :: Maybe Double,
+  -- is only available on 1d chart. Percent change
+  -- of each interval relative to first value. 15 minute delayed
+  marketChangeOverTime :: Maybe Double,
+  -- is only available on 1d chart.
+  average :: Maybe Double,
+  -- is only available on 1d chart.
+  notional :: Maybe Double,
+  -- is only available on 1d chart.
+  numberOfTrades :: Maybe Double,
+  -- is only available on 1d chart, and only when chartSimplify is true.
+  -- The first element is the original number of points.
+  -- Second element is how many remain after simplification.
+  simplifyFactor :: Maybe [Integer],
+  -- is available on all charts.
+  high :: Double,
+  -- is available on all charts.
+  low :: Double,
+  -- is available on all charts.
+  volume :: Integer,
+  -- is available on all charts. A variable formatted version of
+  -- the date depending on the range. Optional convienience field.
+  label :: String,
+  -- is available on all charts. Percent change of each interval
+  -- relative to first value. Useful for comparing multiple stocks.
+  changeOverTime :: Double,
+  -- is not available on 1d chart.
+  date :: Maybe String,
+  -- is not available on 1d chart.
+  open :: Maybe Double,
+  -- is not available on 1d chart.
+  close :: Maybe Double,
+  -- is not available on 1d chart.
+  unadjustedVolume :: Maybe Integer,
+  -- is not available on 1d chart.
+  change :: Maybe Double,
+  -- is not available on 1d chart.
+  changePercent :: Maybe Double,
+  -- is not available on 1d chart.
+  vwap :: Maybe Double
+} deriving (Generic, Show, Eq)
+
+instance ToJSON Chart
+instance FromJSON Chart
diff --git a/src/Net/IEX/Company.hs b/src/Net/IEX/Company.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Company.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Company (Company(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Company = Company {
+  symbol :: String,
+  companyName :: String,
+  exchange :: String,
+  industry :: String,
+  website :: String,
+  description :: String,
+  ceo :: String,
+  issueType :: String,
+  sector :: String
+} deriving (Generic, Show, Eq)
+
+customOptionsCompany =
+  defaultOptions {
+    fieldLabelModifier = let f "ceo" = "CEO"
+                             f other = other
+                         in f
+    }
+
+instance ToJSON Company
+instance FromJSON Company where
+  parseJSON = genericParseJSON customOptionsCompany
diff --git a/src/Net/IEX/DelayedQuote.hs b/src/Net/IEX/DelayedQuote.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/DelayedQuote.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.DelayedQuote (DelayedQuote(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data DelayedQuote = DelayedQuote {
+  symbol :: String,
+  delayedPrice :: Double,
+  high :: Double,
+  low :: Double,
+  delayedSize :: Double,
+  delayedPriceTime :: Integer,
+  processedTime :: Integer
+} deriving (Generic, Show, Eq)
+
+instance ToJSON DelayedQuote
+instance FromJSON DelayedQuote
diff --git a/src/Net/IEX/Dividend.hs b/src/Net/IEX/Dividend.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Dividend.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Dividend (Dividend(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Dividend = Dividend {
+  exDate :: String,
+  paymentDate :: String,
+  recordDate :: String,
+  declaredDate :: String,
+  amount :: Double,
+  flag :: String,
+  dtype :: String,
+  qualified :: String,
+  indicated :: String
+} deriving (Generic, Show, Eq)
+
+customOptionsDividend =
+  defaultOptions {
+    fieldLabelModifier = let f "dtype" = "type"
+                             f other = other
+                         in f
+    }
+
+instance ToJSON Dividend
+instance FromJSON Dividend where
+  parseJSON = genericParseJSON customOptionsDividend
diff --git a/src/Net/IEX/Earnings.hs b/src/Net/IEX/Earnings.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Earnings.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Earnings (Earning(..),
+                         Earnings(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Earning = Earning {
+  actualEPS :: Double,
+  consensusEPS :: Double,
+  estimatedEPS :: Double,
+  announceTime :: String,
+  numberOfEstimates :: Integer,
+  epsSurpriseDollar :: Double,
+  epsReportDate :: String,
+  fiscalPeriod :: String,
+  fiscalEndDate :: String
+} deriving (Generic, Show, Eq)
+
+data Earnings = Earnings {
+  symbol :: String,
+  earnings :: [Earning]
+} deriving (Generic, Show, Eq)
+
+customOptionsEarning =
+  defaultOptions {
+    fieldLabelModifier = let f "epsSurpriseDollar" = "EPSSurpriseDollar"
+                             f "epsReportDate"     = "EPSReportDate"
+                             f other = other
+                         in f
+    }
+
+instance ToJSON Earnings
+instance ToJSON Earning
+instance FromJSON Earnings
+instance FromJSON Earning where
+  parseJSON = genericParseJSON customOptionsEarning
diff --git a/src/Net/IEX/EffectiveSpread.hs b/src/Net/IEX/EffectiveSpread.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/EffectiveSpread.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.EffectiveSpread (EffectiveSpread(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data EffectiveSpread = EffectiveSpread {
+  volume :: Integer,
+  venue :: String,
+  venueName :: String,
+  effectiveSpread :: Double,
+  effectiveQuoted :: Double,
+  priceImprovement :: Double
+} deriving (Generic, Show, Eq)
+
+instance ToJSON EffectiveSpread
+instance FromJSON EffectiveSpread
diff --git a/src/Net/IEX/Financials.hs b/src/Net/IEX/Financials.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Financials.hs
@@ -0,0 +1,41 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Financials (Financials(..),
+                           Financial(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Financial = Financial {
+  reportDate :: String,
+  grossProfit :: Integer,
+  costOfRevenue :: Integer,
+  operatingRevenue :: Integer,
+  totalRevenue :: Integer,
+  operatingIncome :: Integer,
+  netIncome :: Integer,
+  researchAndDevelopment :: Integer,
+  operatingExpense :: Integer,
+  currentAssets :: Integer,
+  totalAssets :: Integer,
+  totalLiabilities :: Maybe Integer,
+  currentCash :: Integer,
+  currentDebt :: Integer,
+  totalCash :: Integer,
+  totalDebt :: Integer,
+  shareholderEquity :: Integer,
+  cashChange :: Integer,
+  cashFlow :: Integer,
+  operatingGainsLosses :: Maybe String
+} deriving (Generic, Show, Eq)
+
+data Financials = Financials {
+  symbol :: String,
+  financials :: [Financial]
+} deriving (Generic, Show, Eq)
+
+instance ToJSON Financial
+instance ToJSON Financials
+instance FromJSON Financial
+instance FromJSON Financials
diff --git a/src/Net/IEX/IntraDayStats.hs b/src/Net/IEX/IntraDayStats.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/IntraDayStats.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.IntraDayStats (IntraDayStats(..),
+                              IntraDaySub(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data IntraDayStats = IntraDayStats {
+  volume :: IntraDaySub,
+  symbolsTraded :: IntraDaySub,
+  routedVolume :: IntraDaySub,
+  notional :: IntraDaySub,
+  marketShare :: IntraDaySub
+} deriving (Generic, Show, Eq)
+
+data IntraDaySub = IntraDaySub {
+  value :: Maybe Double,
+  lastUpdated :: Integer
+} deriving (Generic, Show, Eq)
+
+instance ToJSON IntraDayStats
+instance ToJSON IntraDaySub
+instance FromJSON IntraDayStats
+instance FromJSON IntraDaySub
diff --git a/src/Net/IEX/Market.hs b/src/Net/IEX/Market.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Market.hs
@@ -0,0 +1,22 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Market (Market(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Market = Market {
+  mic :: String,
+  tapeId :: String,
+  venueName :: String,
+  volume :: Integer,
+  tapeA :: Integer,
+  tapeB :: Integer,
+  tapeC :: Integer,
+  marketPercent :: Double,
+  lastUpdated :: Integer
+} deriving (Generic, Show, Eq)
+
+instance ToJSON Market
+instance FromJSON Market
diff --git a/src/Net/IEX/NewsItem.hs b/src/Net/IEX/NewsItem.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/NewsItem.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.NewsItem (NewsItem(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data NewsItem = NewsItem {
+  datetime :: String,
+  headline :: String,
+  source :: String,
+  url :: String,
+  summary :: String,
+  related :: String
+} deriving (Generic, Show, Eq)
+
+instance ToJSON NewsItem
+instance FromJSON NewsItem
diff --git a/src/Net/IEX/OHLC.hs b/src/Net/IEX/OHLC.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/OHLC.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.OHLC (OHLC(..)) where
+
+import Net.IEX.PriceTime
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data OHLC = OHLC {
+  open :: PriceTime,
+  close :: PriceTime,
+  high :: Double,
+  low :: Double
+} deriving (Generic, Show, Eq)
+
+instance ToJSON OHLC
+instance FromJSON OHLC
diff --git a/src/Net/IEX/Previous.hs b/src/Net/IEX/Previous.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Previous.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Previous (Previous(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Previous = Previous {
+  symbol :: String,
+  date :: String,
+  open :: Double,
+  high :: Double,
+  low :: Double,
+  close :: Double,
+  volume :: Integer,
+  unadjustedVolume :: Integer,
+  change :: Double,
+  changePercent :: Double,
+  vwap :: Double
+} deriving (Generic, Show, Eq)
+
+instance ToJSON Previous
+instance FromJSON Previous
diff --git a/src/Net/IEX/PriceTime.hs b/src/Net/IEX/PriceTime.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/PriceTime.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.PriceTime (PriceTime(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data PriceTime = PriceTime {
+  price :: Double,
+  time :: Integer
+} deriving (Generic, Show, Eq)
+
+instance ToJSON PriceTime
+instance FromJSON PriceTime
diff --git a/src/Net/IEX/Quote.hs b/src/Net/IEX/Quote.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Quote.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Quote (Quote(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Quote = Quote {
+  symbol :: String,
+  companyName :: String,
+  primaryExchange :: String,
+  sector :: String,
+  calculationPrice :: String,
+  open :: Double,
+  openTime :: Integer,
+  close :: Double,
+  closeTime :: Integer,
+  high :: Double,
+  low :: Double,
+  latestPrice :: Double,
+  latestSource :: String,
+  latestTime :: String,
+  latestUpdate :: Integer,
+  latestVolume :: Integer,
+  iexRealtimePrice :: Maybe Double,
+  iexRealtimeSize :: Maybe Integer,
+  iexLastUpdated :: Maybe Integer,
+  delayedPrice :: Double,
+  delayedPriceTime :: Integer,
+  previousClose :: Double,
+  change :: Double,
+  changePercent :: Double,
+  iexMarketPercent :: Maybe Double,
+  iexVolume :: Maybe Integer,
+  avgTotalVolume :: Integer,
+  iexBidPrice :: Maybe Double,
+  iexBidSize :: Maybe Integer,
+  iexAskPrice :: Maybe Double,
+  iexAskSize :: Maybe Integer,
+  marketCap :: Integer,
+  peRatio :: Double,
+  week52High :: Double,
+  week52Low :: Double,
+  ytdChange :: Double
+} deriving (Generic, Show, Eq)
+
+instance ToJSON Quote
+instance FromJSON Quote
diff --git a/src/Net/IEX/RecentStats.hs b/src/Net/IEX/RecentStats.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/RecentStats.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.RecentStats (RecentStats(..)) where
+
+import Data.Either
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data RecentStats = RecentStats {
+  date :: String,
+  volume :: Integer,
+  routedVolume :: Integer,
+  marketShare :: Double,
+  isHalfday :: Bool,
+  litVolume :: Integer
+} deriving (Generic, Show, Eq)
+
+instance ToJSON RecentStats
+instance FromJSON RecentStats
diff --git a/src/Net/IEX/RecordStats.hs b/src/Net/IEX/RecordStats.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/RecordStats.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.RecordStats (RecordStats(..),
+                            RecordStatsSub(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data RecordStats = RecordStats {
+  volume :: RecordStatsSub,
+  symbolsTraded :: RecordStatsSub,
+  routedVolume :: RecordStatsSub,
+  notional :: RecordStatsSub
+} deriving (Generic, Show, Eq)
+
+data RecordStatsSub = RecordStatsSub {
+  recordValue :: Double,
+  recordDate :: String,
+  previousDayValue :: Double,
+  avg30Value :: Double
+} deriving (Generic, Show, Eq)
+
+instance ToJSON RecordStats
+instance ToJSON RecordStatsSub
+instance FromJSON RecordStats
+instance FromJSON RecordStatsSub
diff --git a/src/Net/IEX/Relevant.hs b/src/Net/IEX/Relevant.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Relevant.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Relevant (Relevant(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Relevant = Relevant {
+  peers :: Bool,
+  symbols :: [String]
+} deriving (Generic, Show, Eq)
+
+instance ToJSON Relevant
+instance FromJSON Relevant
diff --git a/src/Net/IEX/Split.hs b/src/Net/IEX/Split.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Split.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Split (Split(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Split = Split {
+  exDate :: String,
+  declaredDate :: String,
+  recordDate :: String,
+  paymentDate :: String,
+  ratio :: Double,
+  toFactor :: Integer,
+  forFactor :: Integer
+} deriving (Generic, Show, Eq)
+
+instance ToJSON Split
+instance FromJSON Split
diff --git a/src/Net/IEX/Stats.hs b/src/Net/IEX/Stats.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/Stats.hs
@@ -0,0 +1,73 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.Stats (Stats (..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data Stats = Stats {
+  companyName :: String,
+  marketcap :: Integer,
+  beta :: Double,
+  week52high :: Double,
+  week52low :: Double,
+  week52change :: Double,
+  shortInterest :: Integer,
+  shortDate :: String,
+  dividendRate :: Double,
+  dividendYield :: Double,
+  exDividendDate :: String,
+  latestEPS :: Double,
+  latestEPSDate :: String,
+  sharesOutstanding :: Integer,
+  float :: Integer,
+  returnOnEquity :: Double,
+  consensusEPS :: Double,
+  numberOfEstimates :: Integer,
+  epsSurpriseDollar :: Maybe Double,
+  epsSurprisePercent :: Maybe Double,
+  symbol :: String,
+  ebitda :: Integer,
+  revenue :: Integer,
+  grossProfit :: Integer,
+  cash :: Integer,
+  debt :: Integer,
+  ttmEPS :: Double,
+  revenuePerShare :: Integer,
+  revenuePerEmployee :: Integer,
+  peRatioHigh :: Double,
+  peRatioLow :: Double,
+  returnOnAssets :: Double,
+  returnOnCapital :: Maybe Double,
+  profitMargin :: Double,
+  priceToSales :: Double,
+  priceToBook :: Double,
+  day200MovingAvg :: Double,
+  day50MovingAvg :: Double,
+  institutionPercent :: Double,
+  insiderPercent :: Maybe Double,
+  shortRatio :: Maybe Double,
+  year5ChangePercent :: Double,
+  year2ChangePercent :: Double,
+  year1ChangePercent :: Double,
+  ytdChangePercent :: Double,
+  month6ChangePercent :: Double,
+  month3ChangePercent :: Double,
+  month1ChangePercent :: Double,
+  day5ChangePercent :: Double,
+  day30ChangePercent :: Double
+} deriving (Generic, Show, Eq)
+
+customOptionsStats =
+  defaultOptions {
+    fieldLabelModifier = let f "epsSurpriseDollar"  = "EPSSurpriseDollar"
+                             f "epsSurprisePercent" = "EPSSurprisePercent"
+                             f "ebitda"             = "EBITDA"
+                             f other = other
+                         in f
+    }
+
+instance ToJSON Stats
+instance FromJSON Stats where
+  parseJSON = genericParseJSON customOptionsStats
diff --git a/src/Net/IEX/TimeSeries.hs b/src/Net/IEX/TimeSeries.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/TimeSeries.hs
@@ -0,0 +1,25 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.TimeSeries (TimeSeries(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data TimeSeries = TimeSeries {
+  date :: String,
+  open :: Double,
+  high :: Double,
+  low :: Double,
+  close :: Double,
+  volume :: Integer,
+  unadjustedVolume :: Integer,
+  change :: Double,
+  changePercent :: Double,
+  vwap :: Double,
+  label :: String,
+  changeOverTime :: Double
+} deriving (Generic, Show, Eq)
+
+instance ToJSON TimeSeries
+instance FromJSON TimeSeries
diff --git a/src/Net/IEX/VolumeByVenue.hs b/src/Net/IEX/VolumeByVenue.hs
new file mode 100644
--- /dev/null
+++ b/src/Net/IEX/VolumeByVenue.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE DeriveGeneric #-}
+
+module Net.IEX.VolumeByVenue (VolumeByVenue(..)) where
+
+import Data.Maybe
+import Data.Aeson
+import GHC.Generics
+
+data VolumeByVenue = VolumeByVenue {
+  volume :: Integer,
+  venue :: String,
+  venueName :: String,
+  date :: Maybe String,
+  marketPercent :: Double,
+  avgMarketPercent :: Double
+} deriving (Generic, Show, Eq)
+
+instance ToJSON VolumeByVenue
+instance FromJSON VolumeByVenue
diff --git a/src/Net/Stocks.hs b/src/Net/Stocks.hs
--- a/src/Net/Stocks.hs
+++ b/src/Net/Stocks.hs
@@ -1,106 +1,309 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE TemplateHaskell #-}
 
 module Net.Stocks
-        ( Stock(..)
-        , Financials(..)
-        , FinancialsList(..)
-        , QueryType(..)
-        , Company
-        , stocksQuery
-        , financialsQuery
-        , peersQuery
-        , priceQuery
-        , getData
-        , getNonJSONData
-        ) where
-  
-import Control.Monad
-import Control.Applicative
-import Data.Char
+       (
+         getChart,
+         getCompany,
+         getBook,
+         getDelayedQuote,
+         getDelayedDividend,
+         getEarnings,
+         getEffectiveSpread,
+         getFinancials,
+         getStats,
+         getNewsItem,
+         getOHLC,
+         getPrevious,
+         getPeers,
+         getPrice,
+         getQuote,
+         getRelevant,
+         getSplit,
+         getVolumeByVenue,
+         getTS,
+         getBatch,
+         getBatchCompany,
+         getMarket,
+         getIntraDayStats,
+         getRecentStats,
+         getRecordStats,
+         getHistoricalStats,
+         -- getHistoricalDailyStats,
+         typeQuery,
+         Batch (..),
+         BatchQuery (..)
+       ) where
+
+import System.IO
+import GHC.Generics
 import Data.Aeson
-import Data.List.NonEmpty
-import Data.ByteString.Lazy.Char8
+import Data.Char
+import Data.HashMap.Strict
+import Data.Maybe
 import Network.HTTP.Conduit
 
--- | Stock data
-data Stock =
-    Stock { company          :: String  -- ^ The company's name
-          , latestPrice      :: Float   -- ^ Latest stock price
-          , latestTime       :: String  -- ^ Timeframe
-          , changePercent    :: Float   -- ^ Percentage change
-          } deriving (Show)
+import qualified Data.ByteString.Lazy.Char8 as L8
+import qualified Data.List                  as DL
+import qualified Data.Map                   as DM
 
-instance FromJSON Stock where
-    parseJSON = withObject "Stock" $ \v -> Stock
-        <$> v .: "companyName"
-        <*> v .: "latestPrice"
-        <*> v .: "latestTime"
-        <*> v .: "changePercent"
+import qualified Net.IEX.Chart              as IEXChart
+import qualified Net.IEX.Company            as IEXCompany
+import qualified Net.IEX.Stats              as IEXStats
+import qualified Net.IEX.Earnings           as IEXEarnings
+import qualified Net.IEX.NewsItem           as IEXNewsItem
+import qualified Net.IEX.DelayedQuote       as IEXDelayedQuote
+import qualified Net.IEX.Dividend           as IEXDividend
+import qualified Net.IEX.EffectiveSpread    as IEXEffectiveSpread
+import qualified Net.IEX.Financials         as IEXFinancials
+import qualified Net.IEX.OHLC               as IEXOHLC
+import qualified Net.IEX.PriceTime          as IEXPriceTime
+import qualified Net.IEX.Previous           as IEXPrevious
+import qualified Net.IEX.Quote              as IEXQuote
+import qualified Net.IEX.Split              as IEXSplit
+import qualified Net.IEX.VolumeByVenue      as IEXVolumeByVenue
+import qualified Net.IEX.Relevant           as IEXRelevant
+import qualified Net.IEX.Market             as IEXMarket
+import qualified Net.IEX.IntraDayStats      as IEXIntraDayStats
+import qualified Net.IEX.RecentStats        as IEXRecentStats
+import qualified Net.IEX.RecordStats        as IEXRecordStats
+import qualified Net.IEX.Book               as IEXBook
+import qualified Net.IEX.TimeSeries         as IEXTimeSeries
 
-newtype FinancialsList = FinancialsList { financialsList :: NonEmpty Financials}
+type Symbol = String
 
-instance FromJSON FinancialsList where
-    parseJSON = withObject "FinancialsList" $ \v -> FinancialsList 
-        <$> v .: "financials"
+data BatchQuery =  NewsQuery            |
+                   ChartQuery           |
+                   CompanyQuery         |
+                   DelayedQuoteQuery    |
+                   DividendQuery        |
+                   EarningsQuery        |
+                   EffectiveSpreadQuery |
+                   FinancialsQuery      |
+                   StatsQuery           |
+                   OHLCQuery            |
+                   PriceTimeQuery       |
+                   PreviousQuery        |
+                   QuoteQuery           |
+                   SplitQuery           |
+                   VolumeByVenueQuery
 
--- | Financials data
-data Financials = 
-    Financials { reportDate       :: String  -- ^ The report's date
-               , grossProfit      :: Int     -- ^ Gross Profit
-               , costOfRevenue    :: Int     -- ^ Cost of revenue
-               , cashFlow         :: Int     -- ^ Cash flow
-               } deriving (Show)
+batchQueryToStr :: BatchQuery -> String
+batchQueryToStr NewsQuery = "news"
+batchQueryToStr ChartQuery = "chart"
+batchQueryToStr CompanyQuery = "company"
+batchQueryToStr DelayedQuoteQuery = "delayedquote"
+batchQueryToStr DividendQuery = "dividends"
+batchQueryToStr EarningsQuery = "earnings"
+batchQueryToStr EffectiveSpreadQuery = "effectivespread"
+batchQueryToStr FinancialsQuery = "financials"
+batchQueryToStr StatsQuery = "stats"
+batchQueryToStr OHLCQuery = "ohlc"
+batchQueryToStr PriceTimeQuery = "price"
+batchQueryToStr QuoteQuery = "quote"
+batchQueryToStr SplitQuery = "split"
+batchQueryToStr VolumeByVenueQuery = "volumebyvenue"
 
-instance FromJSON Financials where
-    parseJSON = withObject "Financials" $ \v -> Financials
-        <$> v .: "reportDate"
-        <*> v .: "grossProfit"
-        <*> v .: "costOfRevenue"
-        <*> v .: "cashFlow"
+data Batch = Batch {
+  news :: Maybe [IEXNewsItem.NewsItem],
+  chart :: Maybe [IEXChart.Chart],
+  company :: Maybe IEXCompany.Company,
+  delayedQuote :: Maybe IEXDelayedQuote.DelayedQuote,
+  dividend :: Maybe [IEXDividend.Dividend],
+  earnings :: Maybe IEXEarnings.Earnings,
+  effectiveSpread :: Maybe [IEXEffectiveSpread.EffectiveSpread],
+  financials :: Maybe IEXFinancials.Financials,
+  stats :: Maybe IEXStats.Stats,
+  ohlc :: Maybe IEXOHLC.OHLC,
+  priceTime :: Maybe Integer,
+  previous :: Maybe IEXPrevious.Previous,
+  quote :: Maybe IEXQuote.Quote,
+  split :: Maybe [IEXSplit.Split],
+  volumeByVenue :: Maybe [IEXVolumeByVenue.VolumeByVenue]
+} deriving (Generic, Show, Eq)
 
-type Company = String
+-- ToJSON means taking a haskell data structure and making a JSON string
+instance ToJSON Batch
 
-lowerString :: Company -> String
-lowerString str = Prelude.map toLower str
+-- FromJSON means parsing the text into a haskell data structure
+instance FromJSON Batch
 
 baseURL :: String
 baseURL = "https://api.iextrading.com/1.0/stock/"
 
-data QueryType = QueryStocks
-               | QueryFinancials
-               | QueryPeers
-               | QueryPrice
+marketURL :: String
+marketURL = "https://api.iextrading.com/1.0/market"
 
--- builds the URL: /stock/{symbol}/quote
-stocksQuery :: Company -> String
-stocksQuery company = baseURL ++ lowerString company ++ "/quote"
+intraDayURL :: String
+intraDayURL = "https://api.iextrading.com/1.0/stats/intraday"
 
--- builds the URL: /stock/{symbol}/financials
-financialsQuery :: Company -> String
-financialsQuery company = baseURL ++ lowerString company ++ "/financials"
+statsURL :: String
+statsURL = "https://api.iextrading.com/1.0/stats/"
 
--- builds the URL: /stock/{symbol}/peers
-peersQuery :: Company -> String
-peersQuery company = baseURL ++ lowerString company ++ "/peers"
+lowerString :: Symbol -> String
+lowerString = DL.map toLower
 
--- builds the URL: /stock/{symbol}/price
-priceQuery :: Company -> String
-priceQuery company = baseURL ++ lowerString company ++ "/price"
+getChart :: Symbol -> IO (Maybe [IEXChart.Chart])
+getChart symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/chart")
+  return $ decode obj
 
--- get JSON data 
-getData :: (FromJSON a) => String -> QueryType -> IO (Maybe a)
-getData company qt = do
-    obj <- simpleHttp (query qt company)
+getCompany :: Symbol -> IO (Maybe IEXCompany.Company)
+getCompany symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/company")
+  return $ decode obj
+
+getBook :: Symbol -> IO (Maybe IEXBook.Book)
+getBook symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/book")
+  return $ decode obj
+
+getDelayedQuote :: Symbol -> IO (Maybe IEXDelayedQuote.DelayedQuote)
+getDelayedQuote symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/delayed-quote")
+  return $ decode obj
+
+getDelayedDividend :: Symbol -> IO (Maybe [IEXDividend.Dividend])
+getDelayedDividend symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/dividends/5y")
+  return $ decode obj
+
+getEarnings :: Symbol -> IO (Maybe IEXEarnings.Earnings)
+getEarnings symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/earnings")
+  return $ decode obj
+
+getEffectiveSpread :: Symbol -> IO (Maybe [IEXEffectiveSpread.EffectiveSpread])
+getEffectiveSpread symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/effective-spread")
+  return $ decode obj
+
+getFinancials :: Symbol -> IO (Maybe IEXFinancials.Financials)
+getFinancials symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/financials")
+  return $ decode obj
+
+getStats :: Symbol -> IO (Maybe IEXStats.Stats)
+getStats symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/stats")
+  return $ decode obj
+
+getNewsItem :: Symbol -> IO (Maybe [IEXNewsItem.NewsItem])
+getNewsItem symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/news/last/1")
+  return $ decode obj
+
+getOHLC :: Symbol -> IO (Maybe IEXOHLC.OHLC)
+getOHLC symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/ohlc")
+  return $ decode obj
+
+getPeers :: Symbol -> IO L8.ByteString
+getPeers symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/peers")
+  return $ obj
+
+getPrevious :: Symbol -> IO (Maybe IEXPrevious.Previous)
+getPrevious symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/previous")
+  return $ decode obj
+
+-- FIXME: do not json parse an int
+getPrice :: Symbol -> IO (Maybe Double)
+getPrice symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/price")
+  return $ decode obj
+
+getQuote :: Symbol -> IO (Maybe IEXQuote.Quote)
+getQuote symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/quote")
+  return $ decode obj
+
+getRelevant :: Symbol -> IO (Maybe IEXRelevant.Relevant)
+getRelevant symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/relevant")
+  return $ decode obj
+
+getSplit :: Symbol -> IO (Maybe [IEXSplit.Split])
+getSplit symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/splits/5y")
+  return $ decode obj
+
+getVolumeByVenue :: Symbol -> IO (Maybe [IEXVolumeByVenue.VolumeByVenue])
+getVolumeByVenue symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/volume-by-venue")
+  return $ decode obj
+
+getTS :: Symbol -> IO (Maybe [IEXTimeSeries.TimeSeries])
+getTS symb = do
+  obj <- getNonJSONData (baseURL ++ lowerString symb ++ "/time-series")
+  return $ decode obj
+
+-- get a list of parts we want in a batch request, and translate that
+-- to HTTP parameters to provide to the API call
+typeQuery :: [BatchQuery] -> String
+typeQuery [] = ""
+typeQuery inp =
+  "types=" ++ (concat $ DL.intersperse "," (fmap batchQueryToStr inp))
+
+symbolQuery :: [Symbol] -> String
+symbolQuery [] = ""
+symbolQuery inp = "symbols=" ++ (concat $ DL.intersperse "," inp)
+
+questionMark :: [BatchQuery] -> String
+questionMark [] = ""
+questionMark _  = "?"
+
+getBatch :: [Symbol] -> [BatchQuery] -> IO (Maybe (DM.Map String Batch))
+getBatch symbs queryParams =
+  let urlPt = baseURL ++ "market/batch?"
+      fullQuery = urlPt ++ symbolQuery symbs ++ "&" ++ typeQuery queryParams
+  in do
+    obj <- getNonJSONData fullQuery
     return $ decode obj
-  where
-    query QueryStocks     = stocksQuery
-    query QueryFinancials = financialsQuery
 
--- Get non JSON data
-getNonJSONData :: String -> QueryType -> IO ByteString
-getNonJSONData company qt = do
-    obj <- simpleHttp (query qt company)
+-- batch query of a *single* company
+getBatchCompany :: Symbol -> [BatchQuery] -> IO (Maybe Batch)
+getBatchCompany symb queryParams =
+  let urlPt = (baseURL ++ lowerString symb ++ "/batch/")
+      fullQuery = urlPt ++ (questionMark queryParams) ++ (typeQuery queryParams)
+  in do
+    obj <- getNonJSONData fullQuery
+    return $ decode obj
+
+getMarket :: IO (Maybe [IEXMarket.Market])
+getMarket = do
+    obj <- getNonJSONData marketURL
+    return $ decode obj
+
+getIntraDayStats :: IO (Maybe IEXIntraDayStats.IntraDayStats)
+getIntraDayStats = do
+    obj <- getNonJSONData intraDayURL
+    return $ decode obj
+
+getRecentStats :: IO (Maybe [IEXRecentStats.RecentStats])
+getRecentStats = do
+    obj <- getNonJSONData (statsURL ++ "recent")
+    return $ decode obj
+
+getRecordStats :: IO (Maybe IEXRecordStats.RecordStats)
+getRecordStats = do
+    obj <- getNonJSONData (statsURL ++ "records")
+    return $ decode obj
+
+getHistoricalStats :: IO (Maybe [IEXRecentStats.RecentStats])
+getHistoricalStats = undefined
+
+-- currently does not work due to inconsitency in
+-- IEX API. isHalfDay is Bool in one API call and Int in another
+
+-- getHistoricalDailyStats :: IO (Maybe [IEXRecentStats.RecentStats])
+-- getHistoricalDailyStats = do
+--     obj <- getNonJSONData (statsURL ++ "historical/daily")
+--     return $ decode obj
+
+getNonJSONData :: String -> IO L8.ByteString
+getNonJSONData query = do
+    obj <- simpleHttp query
     return obj
-  where
-    query QueryPeers = peersQuery
-    query QueryPrice = priceQuery
diff --git a/stocks.cabal b/stocks.cabal
--- a/stocks.cabal
+++ b/stocks.cabal
@@ -1,30 +1,49 @@
 name:                stocks
-version:             0.1.0.0
+version:             0.2.0.0
 synopsis:            Library for the IEX Trading API
 description:         Simple library for interacting with the IEX Trading API
-homepage:            https://github.com/dabcoder/stocks#readme
+homepage:            https://github.com/dabcoder/stocks
 license:             BSD3
 license-file:        LICENSE
-author:              David Bouchare
-maintainer:          David Bouchare
-copyright:           2018 David Bouchare
+author:              David Bouchare, Kristian Sällberg
+maintainer:          David Bouchare, Kristian Sällberg
+copyright:           2018 David Bouchare, Kristian Sällberg
 category:            Net
 build-type:          Simple
 cabal-version:       >=1.10
 extra-source-files:  README.md
-  
+
 library
-  exposed-modules:     Net.Stocks
-  -- other-modules:
-  -- other-extensions:
+  exposed-modules: Net.Stocks, Net.IEX.Stats,
+                   Net.IEX.Chart, Net.IEX.Company,
+                   Net.IEX.Earnings, Net.IEX.DelayedQuote,
+                   Net.IEX.Dividend, Net.IEX.EffectiveSpread,
+                   Net.IEX.Financials, Net.IEX.NewsItem,
+                   Net.IEX.OHLC, Net.IEX.Previous,
+                   Net.IEX.PriceTime, Net.IEX.Quote,
+                   Net.IEX.Relevant, Net.IEX.Split,
+                   Net.IEX.VolumeByVenue, Net.IEX.Market,
+                   Net.IEX.IntraDayStats, Net.IEX.RecentStats,
+                   Net.IEX.RecordStats, Net.IEX.Book, Net.IEX.TimeSeries
   build-depends: base == 4.*
                , http-conduit
                , aeson >= 0.8.0
                , bytestring
+               , containers
+               , unordered-containers
                , semigroups >= 0.18
-  hs-source-dirs:      src
-  default-language:    Haskell2010
+  hs-source-dirs: src
+  default-language: Haskell2010
 
 source-repository head
   type:     git
   location: https://github.com/dabcoder/stocks.git
+
+Test-Suite test-hspec
+  type:              exitcode-stdio-1.0
+  main-is:           Tests/Main.hs
+  build-depends:     base,
+                     stocks,
+                     bytestring,
+                     HUnit
+  default-language:  Haskell2010
