diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -4,6 +4,10 @@
 
 None.
 
+## [v1.0.0.1](https://github.com/freckle/yesod-page-cursor/compare/v1.0.0.0...v1.0.0.1)
+
+- Fix missing `previous` link in all but last page
+
 ## [v1.0.0.0](https://github.com/freckle/yesod-page-cursor/tree/v1.0.0.0)
 
 Initial release.
diff --git a/src/Yesod/Page.hs b/src/Yesod/Page.hs
--- a/src/Yesod/Page.hs
+++ b/src/Yesod/Page.hs
@@ -79,24 +79,40 @@
   -- We have to fetch page-size+1 items to know if there is a next page or not
   let (Limit realLimit) = cursorLimit cursor
   items <- fetchItems cursor { cursorLimit = Limit $ realLimit + 1 }
-  let page = case cursorPosition cursor of
-        First -> take realLimit items
-        Next{} -> take realLimit items
-        Previous{} -> takeEnd realLimit items
-        Last -> takeEnd realLimit items
 
+  let
+    page = case cursorPosition cursor of
+      First -> take realLimit items
+      Next{} -> take realLimit items
+      Previous{} -> takeEnd realLimit items
+      Last -> takeEnd realLimit items
+
+    hasExtraItem = length items > realLimit
+
+    hasNextLink = case cursorPosition cursor of
+      First -> hasExtraItem
+      Next{} -> hasExtraItem
+      Previous{} -> True
+      Last -> False
+
+    hasPreviousLink = case cursorPosition cursor of
+      First -> False
+      Next{} -> True
+      Previous{} -> hasExtraItem
+      Last -> hasExtraItem
+
   pure Page
     { pageData = page
     , pageFirst = cursorRouteAtPosition cursor First
     , pageNext = do
-      guard $ length items > realLimit
+      guard hasNextLink
       item <- lastMay page
       pure
         $ cursorRouteAtPosition cursor
         $ Next
         $ makePosition item
     , pagePrevious = do
-      guard $ length items > realLimit
+      guard hasPreviousLink
       item <- headMay page
       pure
         $ cursorRouteAtPosition cursor
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -59,6 +59,28 @@
       get =<< getLink "next"
       assertDataKeys [9, 10, 11, 12]
 
+    it "traverses a list to next and previous" $ do
+      runDB $ insertAssignments 12
+
+      getPaginated SomeR [("teacherId", "1"), ("limit", "4")]
+
+      assertDataKeys [1, 2, 3, 4]
+      get =<< getLink "next"
+      assertDataKeys [5, 6, 7, 8]
+      get =<< getLink "previous"
+      assertDataKeys [1, 2, 3, 4]
+
+    it "correctly handles incomplete pages" $ do
+      runDB $ insertAssignments 3
+
+      getPaginated SomeR [("teacherId", "1"), ("limit", "2")]
+
+      assertDataKeys [1, 2]
+      get =<< getLink "next"
+      assertDataKeys [3]
+      get =<< getLink "previous"
+      assertDataKeys [1, 2]
+
     it "finds a null next when no items are left" $ do
       runDB $ insertAssignments 2
 
diff --git a/yesod-page-cursor.cabal b/yesod-page-cursor.cabal
--- a/yesod-page-cursor.cabal
+++ b/yesod-page-cursor.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 234c456d9d19800a8b663bcc97e95b8194624f5d866aba41446788444604a13c
+-- hash: b4c5d8ba1fe208184ea08c81eabd470f9b93ba740986c4eb430c742098ddbde4
 
 name:           yesod-page-cursor
-version:        1.0.0.0
+version:        1.0.0.1
 description:    Cursor based pagination for Yesod
 homepage:       https://github.com/freckle/yesod-page-cursor#readme
 bug-reports:    https://github.com/freckle/yesod-page-cursor/issues
