diff --git a/Data/Time/Calendar/BankHoliday/UnitedStates.hs b/Data/Time/Calendar/BankHoliday/UnitedStates.hs
--- a/Data/Time/Calendar/BankHoliday/UnitedStates.hs
+++ b/Data/Time/Calendar/BankHoliday/UnitedStates.hs
@@ -12,9 +12,9 @@
   ) where
 
 import Data.Maybe
-import Data.Time (Day, fromGregorian, toGregorian)
-import Data.Time.Calendar (addDays, toModifiedJulianDay)
-import Data.Time.Calendar.BankHoliday (isWeekday, isWeekend, yearFromDay)
+import Data.Time (Day, fromGregorian)
+import Data.Time.Calendar (DayOfWeek (..), addDays, toModifiedJulianDay, dayOfWeek)
+import Data.Time.Calendar.BankHoliday (yearFromDay)
 
 {- | bank holidays for a given year -}
 bankHolidays :: Integer -> [Day]
@@ -28,7 +28,7 @@
       , weekBefore (firstMondayIn jun)     -- memorial day
       , firstMondayIn sep                  -- labor day
       , weekAfter (firstMondayIn oct)      -- columbusDay
-      , 2 `weeksAfter` firstThursdayIn nov -- thanksgiving
+      , 3 `weeksAfter` firstThursdayIn nov -- thanksgiving
       ] ++ catMaybes [
         weekendHolidayFrom (jan 1)  -- newYearsDay
       , weekendHolidayFrom (jul 4)  -- independenceDay
@@ -43,13 +43,13 @@
 -- | day federal bank holidays were announced in the United States
 -- | March 9th 1933
 filterHistoric :: [Day] -> [Day]
-filterHistoric = filter (\d -> d > marchNinth1933)
+filterHistoric = filter (> marchNinth1933)
   where marchNinth1933 = fromGregorian 1933 3 9
 
 -- | find holidays falling between 2 years of time
 holidaysBetweenYears :: Integer -> Integer -> [Day]
 holidaysBetweenYears startYear endYear =
-  foldl (++) [] (map bankHolidays [startYear..endYear])
+  concatMap bankHolidays [startYear..endYear]
 
 -- | find holidays falling between 2 specific days
 holidaysBetween :: Day -> Day -> [Day]
@@ -66,9 +66,14 @@
 
 -- | relative day helper functions
 weekIndex day = toModifiedJulianDay day `mod` 7
-firstMondayIn month = addDays (negate $ weekIndex (month 02)) (month 07)
-firstThursdayIn month = addDays 3 (firstMondayIn month)
+firstMondayIn month = firstDayOfWeekOnAfter Monday (month 01)
+firstThursdayIn month = firstDayOfWeekOnAfter Thursday (month 01)
 weeksBefore n = addDays (n * (-7))
 weekBefore = weeksBefore 1
 weeksAfter n = addDays (n * 7)
 weekAfter = weeksAfter 1
+
+firstDayOfWeekOnAfter :: DayOfWeek -> Day -> Day
+firstDayOfWeekOnAfter dw d = if dayOfWeek d == dw 
+    then d 
+    else firstDayOfWeekOnAfter dw  (addDays 1 d)
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,8 @@
-Holiday
+Bank Holiday USA
 ---
 
 [![Build Status](https://secure.travis-ci.org/tippenein/BankHoliday.png)](http://travis-ci.org/tippenein/BankHoliday)
+[![Hackage](https://img.shields.io/hackage/v/bank-holiday-usa.svg)](http://hackage.haskell.org/package/bank-holiday-usa)
 
 A haskell library for holidays
 
@@ -9,10 +10,41 @@
 
 ----
 
+## usage
+
+```haskell
+-- list the 2016 bank holidays
+bankHolidays 2016
+[2016-01-18,2016-02-15,2016-05-30,2016-09-05,2016-10-10,2016-11-24,2016-01-01,2016-07-04,2016-11-11,2016-12-26]
+
+-- isBankHoliday :: Day -> Bool
+filter isBankHoliday [fromGregorian 2012 2 2, fromGregorian 2016 1 1]
+[2016-01-01]
+
+-- United States bank holidays started in 1933 on march 9th
+holidaysBetweenYears 1900 1933
+[1933-05-29,1933-09-04,1933-10-09,1933-11-23,1933-07-04,1933-12-25]
+
+holidaysBetweenYears :: Day -> Day -> [Day]
+```
+
+``` sh
+
+# Configure & build the package.
+stack build
+
+# Test package.
+stack test
+
+```
+
+## Holidays
+
+The holiday's covered:
+
 - New Year's Day - January 1
-- Inauguration Day - January 20
 - Martin Luther King, Jr. Day - Third Monday in January
-- George Washington's Birthday - Third Monday in February
+- George Washington's Birthday (President's day) - Third Monday in February
 - Memorial Day - Last Monday in May
 - Independence Day - July 4
 - Labor Day - First Monday in September
@@ -25,15 +57,5 @@
   open the preceding Friday. For holidays falling on Sunday, all Federal
   Reserve Banks and Branches will be closed the following Monday.
 
-``` sh
-
-# Configure & build the package.
-stack build
-
-# Test package.
-stack test
-
-```
-
-Inspired by [this](https://hackage.haskell.org/package/bank-holidays-england)
+Inspired by [this](https://hackage.haskell.org/package/bank-holidays-england) library
 
diff --git a/bank-holiday-usa.cabal b/bank-holiday-usa.cabal
--- a/bank-holiday-usa.cabal
+++ b/bank-holiday-usa.cabal
@@ -1,5 +1,5 @@
 name: bank-holiday-usa
-version: 0.1.1
+version: 0.2.0
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -8,7 +8,7 @@
 bug-reports: https://github.com/tippenein/BankHoliday/issues
 copyright: 2015 brady.ouren <brady.ouren@gmail.com>
 maintainer: brady.ouren <brady.ouren@gmail.com>
-synopsis: A library for determining US bank holidays
+synopsis: US bank holidays
 description:
     A library for determining US bank holidays
 category: Time
@@ -24,12 +24,16 @@
   build-depends:
       base ==4.*
     , time
+  other-modules: 
   default-language: Haskell2010
   ghc-options: -Wall -fno-warn-missing-signatures
 
 test-suite tests
   type: exitcode-stdio-1.0
   main-is: Spec.hs
+  other-modules: 
+     Data.Time.Calendar.BankHoliday.UnitedStatesSpec
+     Data.Time.Calendar.BankHolidaySpec
   build-depends:
       base -any
     , bank-holiday-usa -any
@@ -39,8 +43,6 @@
     , QuickCheck -any
   default-language: Haskell2010
   hs-source-dirs: test
-  other-modules: Spec
-    , Data.Time.Calendar.BankHoliday.UnitedStatesSpec
   ghc-options: -Wall -threaded -rtsopts
 
 source-repository head
diff --git a/test/Data/Time/Calendar/BankHoliday/UnitedStatesSpec.hs b/test/Data/Time/Calendar/BankHoliday/UnitedStatesSpec.hs
--- a/test/Data/Time/Calendar/BankHoliday/UnitedStatesSpec.hs
+++ b/test/Data/Time/Calendar/BankHoliday/UnitedStatesSpec.hs
@@ -75,3 +75,14 @@
       theRange `shouldContain` [e]
       theRange `shouldContain` [fromGregorian 2014 1 20]
 
+  describe "holidays depended on weekdays" $ do
+    it "2021" $ do
+      bankHolidays 2021 `shouldContain` [fromGregorian 2021 2 15] -- president day
+      bankHolidays 2021 `shouldContain` [fromGregorian 2021 11 25] -- thanksgiving day
+    it "2022" $ do
+      bankHolidays 2022 `shouldContain` [fromGregorian 2022 2 21] -- president day
+      bankHolidays 2022 `shouldContain` [fromGregorian 2022 11 24] -- thanksgiving day
+    it "2023" $ do
+      bankHolidays 2023 `shouldContain` [fromGregorian 2023 2 20] -- president day
+      bankHolidays 2023 `shouldContain` [fromGregorian 2023 11 23] -- thanksgiving day
+      
diff --git a/test/Data/Time/Calendar/BankHolidaySpec.hs b/test/Data/Time/Calendar/BankHolidaySpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Time/Calendar/BankHolidaySpec.hs
@@ -0,0 +1,33 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Data.Time.Calendar.BankHolidaySpec (spec) where
+
+import Data.Time
+import Data.Time.Calendar.BankHoliday (isWeekday, isWeekend)
+import Test.Hspec
+
+spec :: Spec
+spec = do
+  describe "isWeekday" $ do
+    it "is accurate" $ do
+      all (\d -> isWeekday d) [
+          (fromGregorian 1987 1 1)
+        , (fromGregorian 1999 5 3)
+        , (fromGregorian 1999 11 19)
+        , (fromGregorian 2014 7 4)
+        , (fromGregorian 2015 11 4)
+        , (fromGregorian 2015 12 16)
+        , (fromGregorian 2016 1 1)
+        ]
+
+  describe "isWeekend" $ do
+    it "is accurate" $ do
+      all (\d -> isWeekend d) [
+          (fromGregorian 1987 1 10)
+        , (fromGregorian 1999 11 20)
+        , (fromGregorian 2015 11 15)
+        , (fromGregorian 2015 12 12)
+        , (fromGregorian 2015 7 4)
+        , (fromGregorian 2015 12 13)
+        , (fromGregorian 2015 11 14)
+        ]
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,1 +1,12 @@
-{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
+import Test.Hspec
+import qualified Data.Time.Calendar.BankHoliday.UnitedStatesSpec as UnitedStates
+import qualified Data.Time.Calendar.BankHolidaySpec as BankHoliday
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  UnitedStates.spec
+  BankHoliday.spec
+
