diff --git a/Language/SQL/SimpleSQL/Parse.hs b/Language/SQL/SimpleSQL/Parse.hs
index b5721d5..97e5673 100644
--- a/Language/SQL/SimpleSQL/Parse.hs
+++ b/Language/SQL/SimpleSQL/Parse.hs
@@ -222,6 +222,7 @@ import Text.Megaparsec
     ,between
     )
 import qualified Control.Monad.Combinators.Expr as E
+import qualified Control.Monad.Permutations as P
 
 import Control.Monad.Reader
     (Reader(..)
@@ -1485,8 +1486,10 @@ allows offset and fetch in either order
 -}
 
 offsetFetch :: Parser (Maybe ScalarExpr, Maybe ScalarExpr)
-offsetFetch = undefined {-permute ((,) <$?> (Nothing, Just <$> offset)
-                           <|?> (Nothing, Just <$> fetch))-}
+offsetFetch =
+    P.runPermutation $ (,) <$> maybePermutation offset <*> maybePermutation fetch
+  where
+    maybePermutation p = P.toPermutationWithDefault Nothing (Just <$> p)
 
 offset :: Parser ScalarExpr
 offset = keyword_ "offset" *> scalarExpr
@@ -1712,8 +1715,10 @@ refMatch = option DefaultReferenceMatch
                     ,MatchPartial <$ keyword_ "partial"
                     ,MatchSimple <$ keyword_ "simple"])
 refActions :: Parser (ReferentialAction,ReferentialAction)
-refActions = undefined {-permute ((,) <$?> (DefaultReferentialAction, onUpdate)
-                          <|?> (DefaultReferentialAction, onDelete))-}
+refActions =
+    P.runPermutation $ (,)
+    <$> P.toPermutationWithDefault DefaultReferentialAction onUpdate
+    <*> P.toPermutationWithDefault DefaultReferentialAction onDelete
   where
     -- todo: left factor?
     onUpdate = try (keywords_ ["on", "update"]) *> referentialAction
@@ -1763,20 +1768,20 @@ sequenceGeneratorOptions =
          -- such as cycle and nocycle
          -- sort out options which are sometimes not allowed
          -- as datatype, and restart with
-    undefined {-permute ((\a b c d e f g h j k -> catMaybes [a,b,c,d,e,f,g,h,j,k])
-                  <$?> nj startWith
-                  <|?> nj dataType
-                  <|?> nj restart
-                  <|?> nj incrementBy
-                  <|?> nj maxValue
-                  <|?> nj noMaxValue
-                  <|?> nj minValue
-                  <|?> nj noMinValue
-                  <|?> nj scycle
-                  <|?> nj noCycle
-                 )-}
+    P.runPermutation ((\a b c d e f g h j k -> catMaybes [a,b,c,d,e,f,g,h,j,k])
+                  <$> maybePermutation startWith
+                  <*> maybePermutation dataType
+                  <*> maybePermutation restart
+                  <*> maybePermutation incrementBy
+                  <*> maybePermutation maxValue
+                  <*> maybePermutation noMaxValue
+                  <*> maybePermutation minValue
+                  <*> maybePermutation noMinValue
+                  <*> maybePermutation scycle
+                  <*> maybePermutation noCycle
+                 )
   where
-    nj p = (Nothing,Just <$> p)
+    maybePermutation p = P.toPermutationWithDefault Nothing (Just <$> p)
     startWith = keywords_ ["start", "with"] >>
                 SGOStartWith <$> signedInteger
     dataType = keyword_ "as" >>