diff --git a/src/Yesod/Paginator/Widgets.hs b/src/Yesod/Paginator/Widgets.hs
--- a/src/Yesod/Paginator/Widgets.hs
+++ b/src/Yesod/Paginator/Widgets.hs
@@ -7,6 +7,9 @@
     , simpleWith
     , ellipsed
     , ellipsedWith
+
+    -- * Exported for testing
+    , setPageParameters
     ) where
 
 import Yesod.Paginator.Prelude
@@ -177,13 +180,15 @@
     :: PageParamName -> WidgetFor site (PageNumber -> [(Text, Text)])
 getUpdateGetParams pageParamName = do
     params <- handlerToWidget $ reqGetParams <$> getRequest
-    pure
-        $ \number ->
-              nubOn fst
-                  $ [(unPageParamName pageParamName, tshow number)]
-                  <> params
+    pure $ \number -> setPageParameters pageParamName number params
 
 renderGetParams :: [(Text, Text)] -> Text
 renderGetParams [] = ""
 renderGetParams ps = "?" <> T.intercalate "&" (map renderGetParam ps)
     where renderGetParam (k, v) = encodeText k <> "=" <> encodeText v
+
+setPageParameters
+    :: Show a => PageParamName -> a -> [(Text, Text)] -> [(Text, Text)]
+setPageParameters pageParamName number params =
+    let name = unPageParamName pageParamName
+    in [(name, tshow number)] <> filter ((/=) name . fst) params
diff --git a/test/SpecHelper.hs b/test/SpecHelper.hs
--- a/test/SpecHelper.hs
+++ b/test/SpecHelper.hs
@@ -14,6 +14,7 @@
 import Yesod.Core
 import Yesod.Paginator as X
 import Yesod.Paginator.Prelude as X
+import Yesod.Paginator.Widgets as X
 import Yesod.Test as X
 
 data App = App
diff --git a/test/Yesod/Paginator/WidgetsSpec.hs b/test/Yesod/Paginator/WidgetsSpec.hs
--- a/test/Yesod/Paginator/WidgetsSpec.hs
+++ b/test/Yesod/Paginator/WidgetsSpec.hs
@@ -1,13 +1,16 @@
 {-# LANGUAGE OverloadedStrings #-}
+
 module Yesod.Paginator.WidgetsSpec
     ( spec
-    )
-where
+    ) where
 
+import Data.Functor ((<&>))
 import SpecHelper
+import Test.QuickCheck
 
 spec :: Spec
-spec = withApp $ do
+spec = do
+  withApp $ do
     describe "simple" $ it "works" $ do
         get $ SimpleR 10 3 3
 
@@ -189,3 +192,42 @@
             , "<li class=\"next disabled\"><a>»</a></li>"
             , "</ul>"
             ]
+
+  it "inserts" $ do
+      let paramName = PageParamName "p"
+          pageNumber = 1 :: Int
+      setPageParameters paramName pageNumber [] `shouldBe` [("p", "1")]
+
+  it "updates" $ do
+      let paramName = PageParamName "p"
+          pageNumber = 1 :: Int
+      setPageParameters paramName pageNumber [("p", "foo")]
+          `shouldBe` [("p", "1")]
+
+  it "doesn't remove not-ours elements" $ property $ \(Params paramName pageNumber params) -> do
+    let outputKeys =
+            fst <$> setPageParameters paramName pageNumber params
+        inputKeys = fst <$> params
+     in all (`elem` outputKeys) inputKeys
+
+  it "doesn't add not-ours elements" $ property $ \(Params paramName pageNumber params) -> do
+      let outputKeys = fst <$> setPageParameters paramName pageNumber params
+          inputKeys = fst <$> params
+       in all (`elem` (unPageParamName paramName : inputKeys)) outputKeys
+
+data Params = Params
+    { paramsPageParamName :: PageParamName
+    , paramsPageNumber :: Int
+    , paramsParams :: [(Text, Text)]
+    }
+    deriving Show
+
+instance Arbitrary Params where
+    arbitrary = do
+        params <- listOf $ liftArbitrary2 genText genText
+        pageNumber <- getPositive <$> arbitrary
+        pageParamName <- PageParamName <$> genText
+        pure $ Params pageParamName pageNumber params
+      where
+        genText :: Gen Text
+        genText = listOf (choose ('a', 'z')) <&> pack
diff --git a/yesod-paginator.cabal b/yesod-paginator.cabal
--- a/yesod-paginator.cabal
+++ b/yesod-paginator.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.12
 name:          yesod-paginator
-version:       1.1.2.1
+version:       1.1.2.2
 license:       MIT
 license-file:  LICENSE
 maintainer:    Patrick Brisbin <pbrisbin@gmail.com>
