diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,31 +1,86 @@
-language: haskell
-before_install:
-env:
- - GHCVER=7.4.2 CABALVER=1.18 HAPPYVER=1.19.4 ALEXVER=3.1.3
- - GHCVER=7.6.3 CABALVER=1.18 HAPPYVER=1.19.4 ALEXVER=3.1.3
- - GHCVER=7.8.4 CABALVER=1.22 HAPPYVER=1.19.4 ALEXVER=3.1.3
- - GHCVER=7.10.1 CABALVER=1.22 HAPPYVER=1.19.4 ALEXVER=3.1.3
- - GHCVER=head  CABALVER=head HAPPYVER=1.19.4 ALEXVER=3.1.3
+language: c
+sudo: false
 
+cache:
+  directories:
+    - $HOME/.cabsnap
+    - $HOME/.cabal/packages
+
+before_cache:
+  - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
+  - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.tar
+
 matrix:
+  include:
+    - env: CABALVER=1.16 GHCVER=7.6.3 HAPPYVER=1.19.5
+      compiler: ": #GHC 7.6.3"
+      addons: {apt: {packages: [cabal-install-1.16,ghc-7.6.3,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.18 GHCVER=7.8.4 HAPPYVER=1.19.5
+      compiler: ": #GHC 7.8.4"
+      addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.22 GHCVER=7.10.3 HAPPYVER=1.19.5
+      compiler: ": #GHC 7.10.3"
+      addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.22 GHCVER=head HAPPYVER=1.19.5
+      compiler: ": #GHC HEAD"
+      addons: {apt: {packages: [cabal-install-1.22,ghc-head,happy-1.19.5], sources: [hvr-ghc]}}
   allow_failures:
-   - env: GHCVER=7.10.1 CABALVER=1.22 HAPPYVER=1.19.4 ALEXVER=3.1.3
-   - env: GHCVER=head  CABALVER=head HAPPYVER=1.19.4 ALEXVER=3.1.3
+    - env: CABALVER=1.22 GHCVER=head HAPPYVER=1.19.5
 
 before_install:
- - travis_retry sudo add-apt-repository -y ppa:hvr/ghc
- - travis_retry sudo apt-get update
- - travis_retry sudo apt-get install cabal-install-$CABALVER ghc-$GHCVER happy-$HAPPYVER alex-$ALEXVER
- - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:/opt/happy/$HAPPYVER/bin:/opt/alex/$ALEXVER/bin:$HOME/.cabal/bin:$PATH
- - cabal --version
+ - unset CC
+ - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:/opt/happy/$HAPPYVER/bin:$PATH
 
 install:
- - travis_retry cabal update
- - travis_retry git clone https://github.com/seereason/haskell-src-meta
- - cabal install -j2 ./haskell-src-meta
- - cabal install --only-dependencies --enable-tests --constraint="Cabal==$CABALVER.*"
+ - cabal --version
+ - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
+ - if [ -f $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz ];
+   then
+     zcat $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz >
+          $HOME/.cabal/packages/hackage.haskell.org/00-index.tar;
+   fi
+ - travis_retry cabal update -v
+ - sed -i 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
+ - cabal install --only-dependencies --enable-tests --enable-benchmarks --dry -v > installplan.txt
+ - sed -i -e '1,/^Resolving /d' installplan.txt; cat installplan.txt
 
+# check whether current requested install-plan matches cached package-db snapshot
+ - if diff -u installplan.txt $HOME/.cabsnap/installplan.txt;
+   then
+     echo "cabal build-cache HIT";
+     rm -rfv .ghc;
+     cp -a $HOME/.cabsnap/ghc $HOME/.ghc;
+     cp -a $HOME/.cabsnap/lib $HOME/.cabsnap/share $HOME/.cabsnap/bin $HOME/.cabal/;
+   else
+     echo "cabal build-cache MISS";
+     rm -rf $HOME/.cabsnap;
+     mkdir -p $HOME/.ghc $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin;
+     cabal install --only-dependencies --enable-tests --enable-benchmarks;
+   fi
+
+# snapshot package-db on cache miss
+ - if [ ! -d $HOME/.cabsnap ];
+   then
+      echo "snapshotting package-db to build-cache";
+      mkdir $HOME/.cabsnap;
+      cp -a $HOME/.ghc $HOME/.cabsnap/ghc;
+      cp -a $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin installplan.txt $HOME/.cabsnap/;
+   fi
+
+# Here starts the actual work to be performed for the package under test;
+# any command which exits with a non-zero exit code causes the build to fail.
 script:
- - cabal configure --enable-tests
- - cabal build
+ - if [ -f configure.ac ]; then autoreconf -i; fi
+ - cabal configure --enable-tests --enable-benchmarks -v2  # -v2 provides useful information for debugging
+ - cabal build   # this builds all libraries and executables (including tests/benchmarks)
  - cabal test
+ - cabal check
+ - cabal sdist   # tests that a source-distribution can be generated
+
+# Check that the resulting source distribution can be built & installed.
+# If there are no other `.tar.gz` files in `dist`, this can be even simpler:
+# `cabal install --force-reinstalls dist/*-*.tar.gz`
+ - SRC_TGZ=$(cabal info . | awk '{print $2;exit}').tar.gz &&
+   (cd dist && cabal install --force-reinstalls "$SRC_TGZ")
+
+# EOF
diff --git a/hsx2hs.cabal b/hsx2hs.cabal
--- a/hsx2hs.cabal
+++ b/hsx2hs.cabal
@@ -1,5 +1,5 @@
 Name:                   hsx2hs
-Version:                0.13.3.2
+Version:                0.13.4
 License:                BSD3
 License-File:           LICENSE
 Author:                 Niklas Broberg, Joel Bjornson
@@ -29,7 +29,7 @@
 
 Homepage:               https://github.com/seereason/hsx2hs
 
-Tested-With:            GHC==7.6.3, GHC==7.8.2
+Tested-With:            GHC==7.6.3, GHC==7.8.4, GHC==7.10.3
 Cabal-Version: 		>= 1.6
 Build-Type:             Simple
 Extra-source-files:     .travis.yml
@@ -43,7 +43,7 @@
 
 Library
   Build-depends:	mtl              >= 2.0  && < 2.3,
-                        haskell-src-exts >= 1.16 && < 1.17,
+                        haskell-src-exts >= 1.16 && < 1.18,
                         haskell-src-meta >= 0.6  && < 0.7,
                         template-haskell >= 2.7  && < 2.11,
                         bytestring,
diff --git a/src/Language/Haskell/HSX/QQ.hs b/src/Language/Haskell/HSX/QQ.hs
--- a/src/Language/Haskell/HSX/QQ.hs
+++ b/src/Language/Haskell/HSX/QQ.hs
@@ -67,6 +67,9 @@
 
 parseMode :: ParseMode
 parseMode = ParseMode "" Haskell2010 allExtensions False True (Just baseFixities)
+#if MIN_VERSION_haskell_src_exts(1,17,0)
+                      False
+#endif
 
 allExtensions :: [Extension]
 allExtensions = map EnableExtension
diff --git a/src/Language/Haskell/HSX/Transform.hs b/src/Language/Haskell/HSX/Transform.hs
--- a/src/Language/Haskell/HSX/Transform.hs
+++ b/src/Language/Haskell/HSX/Transform.hs
@@ -13,6 +13,8 @@
 -- other words, we transform away regular patterns.
 -----------------------------------------------------------------------------
 
+{-# LANGUAGE CPP #-}
+
 module Language.Haskell.HSX.Transform (
       transform       -- :: HsModule -> HsModule
     , transformExp
@@ -116,8 +118,15 @@
         -- Transform declarations in the where clause, adding any generated
         -- declarations to it
         decls' <- case decls of
+#if MIN_VERSION_haskell_src_exts(1,17,0)
+               Nothing -> return Nothing
+               Just (BDecls ds)
+                         -> do ds' <- transformLetDecls ds
+                               return $ Just $ BDecls $ decls'' ++ ds'
+#else
                BDecls ds -> do ds' <- transformLetDecls ds
                                return $ BDecls $ decls'' ++ ds'
+#endif
                _           -> error "Cannot bind implicit parameters in the \
                         \ \'where\' clause of a function using regular patterns."
         return $ PatBind srcloc pat'' rhs' decls'
@@ -170,8 +179,15 @@
     -- Transform declarations in the where clause, adding any generated
     -- declarations to it
     decls' <- case decls of
+#if MIN_VERSION_haskell_src_exts(1,17,0)
+           Nothing -> return Nothing
+           Just (BDecls ds)
+                     -> do ds' <- transformLetDecls ds
+                           return $ Just $ BDecls $ decls'' ++ ds'
+#else
            BDecls ds -> do ds' <- transformLetDecls ds
                            return $ BDecls $ decls'' ++ ds'
+#endif
            _           -> error "Cannot bind implicit parameters in the \
                      \ \'where\' clause of a function using regular patterns."
 
@@ -451,10 +467,19 @@
                         -- Any declarations already in place should be left where they
                         -- are since they probably refer to the generating right-hand
                         -- side of the pattern bind. If they don't, we're in trouble...
+#if MIN_VERSION_haskell_src_exts(1,17,0)
+                        Nothing -> return Nothing
+                        Just (BDecls decls) -> fmap (Just . BDecls) $ transformLetDecls decls
+#else
                         BDecls decls -> fmap BDecls $ transformLetDecls decls
+#endif
                         -- If they are implicit parameter bindings we simply transform
                         -- them as such.
+#if MIN_VERSION_haskell_src_exts(1,17,0)
+                        Just (IPBinds decls) -> fmap (Just . IPBinds) $ mapM transformIPBind decls
+#else
                         IPBinds decls -> fmap IPBinds $ mapM transformIPBind decls
+#endif
                     -- The generated guard, if any, should be a declaration, and the
                     -- generated declarations should be associated with it.
                     let gs' = case gs of
@@ -574,8 +599,14 @@
     -- Transform declarations in the where clause, adding any generated
     -- declarations to it.
     decls' <- case decls of
+#if MIN_VERSION_haskell_src_exts(1,17,0)
+           Nothing -> return Nothing
+           Just (BDecls ds) -> do ds' <- mapM transformDecl ds
+                                  return $ Just $ BDecls $ decls'' ++ ds
+#else
            BDecls ds -> do ds' <- mapM transformDecl ds
                            return $ BDecls $ decls'' ++ ds
+#endif
            _           -> error "Cannot bind implicit parameters in the \
                      \ \'where\' clause of a function using regular patterns."
 
@@ -1191,7 +1222,11 @@
                         -- match the given pattern
                         let alt1 = altGW s p gs                 -- foo -> Just (mf foo)
                                     (app (con just_name) $
+#if MIN_VERSION_haskell_src_exts(1,17,0)
+                                     tuple (map (retVar b) vs)) (binds [])
+#else
                                      tuple (map (retVar b) vs)) noBinds
+#endif
                             -- .. and finally an alternative for not matching the pattern.
                             alt2 = alt s wildcard (con nothing_name)        -- _ -> Nothing
                             -- ... and that pattern could itself contain regular patterns
diff --git a/src/hsx2hs.hs b/src/hsx2hs.hs
--- a/src/hsx2hs.hs
+++ b/src/hsx2hs.hs
@@ -82,7 +82,11 @@
                  transform $ checkParse $ parse fp fc
 
 parse :: String -> String -> ParseResult Module
-parse fn fc = parseModuleWithMode (ParseMode fn Haskell2010 allExtensions False True (Just baseFixities)) fcuc
+parse fn fc = parseModuleWithMode (ParseMode fn Haskell2010 allExtensions False True (Just baseFixities)
+#if MIN_VERSION_haskell_src_exts(1,17,0)
+                                             False
+#endif
+                                             ) fcuc
   where fcuc= unlines $ filter (not . isPrefixOf "#") $ lines fc
 
 usageString :: String
