diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,11 @@
+language-puppet (1.4.6) artful; urgency=medium
+
+  * Support GHC 8.8
+  * Add mock for docker_secrets_flags
+  * Enable else after unless keyword
+
+ -- Pierre Radermecker <pierrer@pi3r.be>  Thu, 24 October 2019 21:12:48 +0100
+
 language-puppet (1.4.5) artful; urgency=medium
 
   * Add the `reduce` function.
diff --git a/language-puppet.cabal b/language-puppet.cabal
--- a/language-puppet.cabal
+++ b/language-puppet.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                language-puppet
-version:             1.4.5
+version:             1.4.6
 synopsis:            Tools to parse and evaluate the Puppet DSL.
 description:         This is a set of tools that is supposed to fill all your Puppet needs : syntax checks, catalog compilation, PuppetDB queries, simulation of complex interactions between nodes, Puppet master replacement, and more !
 homepage:            http://lpuppet.banquise.net/
@@ -16,7 +16,7 @@
 cabal-version:       >=1.8
 bug-reports:         https://github.com/bartavelle/language-puppet/issues
 
-Tested-With:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.4
+Tested-With:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.1
 
 extra-source-files:
     CHANGELOG
@@ -111,15 +111,15 @@
                      , filecache            >= 0.2.9   && < 0.5
                      , filepath             >= 1.4
                      , formatting                         < 7
-                     , hashable             == 1.2.*
+                     , hashable             >= 1.2     && < 1.4
                      , http-api-data        >= 0.2     && < 0.5
                      , http-client          >= 0.4.30  && < 0.7
-                     , hruby                >= 0.3.2   && < 0.4
-                     , hslogger             == 1.2.*
+                     , hruby                >= 0.3.5   && < 0.4
+                     , hslogger             >= 1.2     && < 1.4
                      , lens                 >= 4.12    && < 5
                      , lens-aeson           >= 1.0
                      , megaparsec           >= 7       && < 8
-                     , memory               >= 0.14    && < 0.15
+                     , memory               >= 0.14    && < 0.16
                      , mtl                  >= 2.2.1   && < 2.3
                      , operational          >= 0.2.3   && < 0.3
                      , parsec               == 3.1.*
diff --git a/src/Puppet/Parser/Internal.hs b/src/Puppet/Parser/Internal.hs
--- a/src/Puppet/Parser/Internal.hs
+++ b/src/Puppet/Parser/Internal.hs
@@ -403,8 +403,12 @@
   p <- getSourcePos
   reserved "unless"
   (cond :!: stmts) <- puppetIfStyleCondition
+  elsecond <- option V.empty (reserved "else" *> braces statementList)
+  let ec = if V.null elsecond
+               then []
+               else [Terminal (UBoolean True) :!: elsecond]
   pe <- getSourcePos
-  pure (ConditionalDecl (V.singleton (Not cond :!: stmts)) (p :!: pe))
+  pure (ConditionalDecl (V.fromList ((Not cond :!: stmts) : ec )) (p :!: pe))
 
 ifCondition :: Parser ConditionalDecl
 ifCondition = do
diff --git a/src/Puppet/Runner/Puppetlabs.hs b/src/Puppet/Runner/Puppetlabs.hs
--- a/src/Puppet/Runner/Puppetlabs.hs
+++ b/src/Puppet/Runner/Puppetlabs.hs
@@ -30,6 +30,7 @@
           , ("docker", "docker_swarm_init_flags", mockDockerSwarmInitFlags)
           , ("docker", "docker_run_flags", mockDockerRunFlags)
           , ("docker", "docker_stack_flags", mockDockerStackFlags)
+          , ("docker", "docker_secrets_flags", mockDockerSecretsFlags)
           , ("docker", "sanitised_name", dockerSanitisedName)
           , ("jenkins", "jenkins_port", mockJenkinsPort)
           , ("jenkins", "jenkins_prefix", mockJenkinsPrefix)
@@ -153,6 +154,11 @@
 mockDockerStackFlags :: MonadThrowPos m => [PValue] -> m PValue
 mockDockerStackFlags arg@[PHash _]= (pure . PString . show . head) arg
 mockDockerStackFlags  arg@_ = throwPosError $ "Expect an hash as argument but was" <+> pretty arg
+
+-- faked implementation, replace by the correct one if you need so.
+mockDockerSecretsFlags :: MonadThrowPos m => [PValue] -> m PValue
+mockDockerSecretsFlags arg@[PHash _]= (pure . PString . show . head) arg
+mockDockerSecretsFlags  arg@_ = throwPosError $ "Expect an hash as argument but was" <+> pretty arg
 
 -- faked implementation, replace by the correct one if you need so.
 mockDockerSwarmJoinFlags :: MonadThrowPos m => [PValue] -> m PValue
diff --git a/tests/Helpers.hs b/tests/Helpers.hs
--- a/tests/Helpers.hs
+++ b/tests/Helpers.hs
@@ -13,7 +13,7 @@
 
 import           XPrelude            as Exports
 
-import           Control.Monad       as Exports (fail)
+import           Control.Monad.Fail  as Exports (MonadFail)
 import qualified Data.HashMap.Strict as HM
 import qualified Data.Maybe.Strict   as S
 import qualified Data.Vector         as Vector
@@ -37,10 +37,10 @@
     (catalog, em, exported, defResources) <- either (throwError . show) pure res
     pure (catalog, em, exported, defResources, finalState, logs)
 
-getResource :: (Monad m) => RIdentifier -> FinalCatalog -> m Resource
+getResource :: (MonadFail m) => RIdentifier -> FinalCatalog -> m Resource
 getResource resid catalog = maybe (fail ("Unknown resource " <> renderToString resid)) pure (HM.lookup resid catalog)
 
-getAttribute :: Monad m => Text -> Resource -> m PValue
+getAttribute :: MonadFail m => Text -> Resource -> m PValue
 getAttribute att res =
   case res ^? rattributes . ix att of
     Nothing -> fail ("Unknown attribute: " <> toS att)
