diff --git a/.travis.meta.yml b/.travis.meta.yml
--- a/.travis.meta.yml
+++ b/.travis.meta.yml
@@ -1,35 +1,5 @@
-# NB: don't set `language: haskell` here
-
-sudo: false
+language: haskell-stack
 
 env:
-  - CABALVER=1.18 GHCVER=7.8.4
-  - CABALVER=1.22 GHCVER=7.10.1
-  - CABALVER=1.22 GHCVER=head
-
-addons:
-  apt:
-    sources:
-      - hvr-ghc
-    packages:
-      - cabal-install-$CABALVER
-      - ghc-$GHCVER
-
-matrix:
-  allow_failures:
-    - env: CABALVER=1.22 GHCVER=head
-
-before_install:
-  # ghc
-  - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
-  # versions
-  - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
-  - cabal --version
-
-install:
-  - cabal update
-  - cabal install -j2 --only-dependencies --enable-tests
-
-script:
-  - cabal configure --enable-tests
-  - cabal test -j2
+  - GHCVER=7.8.4 STACKYAML=stack-7.8.yaml
+  - GHCVER=7.10.1 STACKYAML=stack-7.10.yaml
diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,40 +1,39 @@
 script:
-- cabal configure --enable-tests
-- cabal test -j2
+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test
 matrix:
   include:
-  - env: CABALVER=1.18 GHCVER=7.8.4
+  - env: GHCVER=7.8.4 STACKYAML=stack-7.8.yaml
     addons:
       apt:
         sources:
         - hvr-ghc
         packages:
-        - cabal-install-1.18
         - ghc-7.8.4
-  - env: CABALVER=1.22 GHCVER=7.10.1
+        - libgmp-dev
+  - env: GHCVER=7.10.1 STACKYAML=stack-7.10.yaml
     addons:
       apt:
         sources:
         - hvr-ghc
         packages:
-        - cabal-install-1.22
         - ghc-7.10.1
-  - env: CABALVER=1.22 GHCVER=head
-    addons:
-      apt:
-        sources:
-        - hvr-ghc
-        packages:
-        - cabal-install-1.22
-        - ghc-head
-  allow_failures:
-  - env: CABALVER=1.22 GHCVER=head
+        - libgmp-dev
 install:
-- cabal update
-- cabal install -j2 --only-dependencies --enable-tests
+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML setup
+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test
+  --only-snapshot
+cache:
+  directories:
+  - ~/.stack
+  apt: true
 before_install:
-- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+- export PATH=/opt/ghc/$GHCVER/bin:$PATH
+- export PATH=~/.local/bin:$PATH
+- if [ ! -e ~/.local/bin/stack ]; then mkdir -p ~/.local/bin; travis_retry curl -L
+  https://github.com/commercialhaskell/stack/releases/download/v0.1.2.0/stack-0.1.2.0-x86_64-linux.gz
+  | gunzip > ~/.local/bin/stack; chmod a+x ~/.local/bin/stack; fi
 - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo
   '?')]"
-- cabal --version
+- stack +RTS -N2 -RTS --version
+language: c
 sudo: false
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -5,8 +5,62 @@
 
 ## Motivation
 
-Turn
+```
+language: haskell-stack
 
+env:
+  - GHCVER=7.8.4 STACKYAML=stack-7.8.4.yaml
+  - GHCVER=7.10.1 STACKYAML=stack-7.10.yaml
+```
+
+into
+
+```
+script:
+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test
+matrix:
+  include:
+  - env: GHCVER=7.8.4 STACKYAML=stack-7.8.4.yaml
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - ghc-7.8.4
+        - libgmp-dev
+  - env: GHCVER=7.10.1 STACKYAML=stack-7.10.yaml
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - ghc-7.10.1
+        - libgmp-dev
+install:
+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML setup
+- stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test
+  --only-snapshot
+cache:
+  directories:
+  - ~/.stack
+  apt: true
+before_install:
+- export PATH=/opt/ghc/$GHCVER/bin:$PATH
+- export PATH=~/.local/bin:$PATH
+- if [ ! -e ~/.local/bin/stack ]; then mkdir -p ~/.local/bin; travis_retry curl -L
+  https://github.com/commercialhaskell/stack/releases/download/v0.1.2.0/stack-0.1.2.0-x86_64-linux.gz
+  | gunzip > ~/.local/bin/stack; chmod a+x ~/.local/bin/stack; fi
+- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo
+  '?')]"
+- stack +RTS -N2 -RTS --version
+language: c
+sudo: false
+```
+
+## Features
+
+Interpolate environment variables into `addons` in `matrix.include`:
+
 ```yaml
 env:
   - CABALVER=1.18 GHCVER=7.8.4
@@ -59,6 +113,6 @@
   - env: CABALVER=1.22 GHCVER=head
 ```
 
-## Features
+### Other
 
-Currently only expanding of `addons.apt`. Any feature requests are welcome.
+Any feature requests are welcome.
diff --git a/cli/Main.hs b/cli/Main.hs
--- a/cli/Main.hs
+++ b/cli/Main.hs
@@ -11,13 +11,17 @@
 
 sample :: Parser Opts
 sample = Opts
-  <$> strArgument
-      ( metavar "SOURCE"
+  <$> strOption
+      ( short 'i'
+     <> long "input"
+     <> metavar "SOURCE"
      <> value ".travis.meta.yml"
      <> showDefault
      <> help "Source, travis meta file" )
-  <*> strArgument
-      ( metavar "TARGET"
+  <*> strOption
+      ( short 'o'
+     <> long "output"
+     <> metavar "TARGET"
      <> value ".travis.yml"
      <> showDefault
      <> help "Target, travis yaml" )
diff --git a/data/language-haskell-multi-ghc.yml b/data/language-haskell-multi-ghc.yml
new file mode 100644
--- /dev/null
+++ b/data/language-haskell-multi-ghc.yml
@@ -0,0 +1,28 @@
+language: c
+sudo: false
+
+cache:
+  apt: true
+
+addons:
+  apt:
+    sources:
+      - hvr-ghc
+    packages:
+      - cabal-install-$CABALVER
+      - ghc-$GHCVER
+
+before_install:
+  # ghc
+  - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+  # versions
+  - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
+  - cabal --version
+
+install:
+  - cabal update
+  - cabal install -j2 --only-dependencies --enable-tests
+
+script:
+  - cabal configure --enable-tests
+  - cabal test -j2
diff --git a/data/language-haskell-stack.yml b/data/language-haskell-stack.yml
new file mode 100644
--- /dev/null
+++ b/data/language-haskell-stack.yml
@@ -0,0 +1,33 @@
+# NB: don't set `language: haskell` here
+language: c
+sudo: false
+
+cache:
+  apt: true
+  directories:
+    - ~/.stack
+
+addons:
+  apt:
+    sources:
+      - hvr-ghc
+    packages:
+      - ghc-$GHCVER
+      - libgmp-dev
+
+before_install:
+  # ghc
+  - export PATH=/opt/ghc/$GHCVER/bin:$PATH
+  # stack
+  - export PATH=~/.local/bin:$PATH
+  - if [ ! -e ~/.local/bin/stack ]; then mkdir -p ~/.local/bin; travis_retry curl -L https://github.com/commercialhaskell/stack/releases/download/v0.1.2.0/stack-0.1.2.0-x86_64-linux.gz | gunzip > ~/.local/bin/stack; chmod a+x ~/.local/bin/stack; fi
+  # version
+  - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
+  - stack +RTS -N2 -RTS --version
+
+install:
+  - stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML setup
+  - stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test --only-snapshot
+
+script:
+  - stack +RTS -N2 -RTS --no-terminal --skip-ghc-check --stack-yaml $STACKYAML test
diff --git a/fixtures/multi-ghc-processed.yml b/fixtures/multi-ghc-processed.yml
new file mode 100644
--- /dev/null
+++ b/fixtures/multi-ghc-processed.yml
@@ -0,0 +1,49 @@
+script:
+- cabal configure --enable-tests
+- cabal test -j2
+matrix:
+  include:
+  - env: GHCVER=7.8.4 CABALVER=1.18
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - cabal-install-1.18
+        - ghc-7.8.4
+  - env: GHCVER=7.10.1 CABALVER=1.22
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - cabal-install-1.22
+        - ghc-7.10.1
+  - env: GHCVER=7.10.2 CABALVER=1.22
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - cabal-install-1.22
+        - ghc-7.10.2
+  - env: GHCVER=head CABALVER=1.23
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - cabal-install-1.23
+        - ghc-head
+install:
+- cabal update
+- cabal install -j2 --only-dependencies --enable-tests
+cache:
+  apt: true
+before_install:
+- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo
+  '?')]"
+- cabal --version
+language: c
+sudo: false
diff --git a/fixtures/multi-ghc.yml b/fixtures/multi-ghc.yml
new file mode 100644
--- /dev/null
+++ b/fixtures/multi-ghc.yml
@@ -0,0 +1,7 @@
+language: haskell-multi-ghc
+
+env:
+  - GHCVER=7.8.4 CABALVER=1.18
+  - GHCVER=7.10.1 CABALVER=1.22
+  - GHCVER=7.10.2 CABALVER=1.22
+  - GHCVER=head CABALVER=1.23
diff --git a/fixtures/multi-processed.yml b/fixtures/multi-processed.yml
new file mode 100644
--- /dev/null
+++ b/fixtures/multi-processed.yml
@@ -0,0 +1,42 @@
+script:
+- cabal configure --enable-tests
+- cabal test -j2
+matrix:
+  include:
+  - env: CABALVER=1.18 GHCVER=7.8.4
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - cabal-install-1.18
+        - ghc-7.8.4
+  - env: CABALVER=1.22 GHCVER=7.10.1
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - cabal-install-1.22
+        - ghc-7.10.1
+  - env: CABALVER=1.22 GHCVER=head
+    addons:
+      apt:
+        sources:
+        - hvr-ghc
+        packages:
+        - cabal-install-1.22
+        - ghc-head
+  allow_failures:
+  - env: CABALVER=1.22 GHCVER=head
+install:
+- cabal update
+- cabal install -j2 --only-dependencies --enable-tests
+cache:
+  apt: true
+before_install:
+- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo
+  '?')]"
+- cabal --version
+sudo: false
diff --git a/fixtures/multi.yml b/fixtures/multi.yml
new file mode 100644
--- /dev/null
+++ b/fixtures/multi.yml
@@ -0,0 +1,38 @@
+# NB: don't set `language: haskell` here
+
+sudo: false
+
+env:
+  - CABALVER=1.18 GHCVER=7.8.4
+  - CABALVER=1.22 GHCVER=7.10.1
+  - CABALVER=1.22 GHCVER=head
+
+cache:
+  apt: true
+
+addons:
+  apt:
+    sources:
+      - hvr-ghc
+    packages:
+      - cabal-install-$CABALVER
+      - ghc-$GHCVER
+
+matrix:
+  allow_failures:
+    - env: CABALVER=1.22 GHCVER=head
+
+before_install:
+  # ghc
+  - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+  # versions
+  - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
+  - cabal --version
+
+install:
+  - cabal update
+  - cabal install -j2 --only-dependencies --enable-tests
+
+script:
+  - cabal configure --enable-tests
+  - cabal test -j2
diff --git a/src/Data/Aeson/Merge.hs b/src/Data/Aeson/Merge.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aeson/Merge.hs
@@ -0,0 +1,15 @@
+-- |
+-- Module      : Data.Aeson.Merge
+-- Description : Simple 'Value' merge.
+-- Copyright   : (c) Oleg Grenrus, 2005
+-- License     : BSD3
+-- Maintainer  : Oleg Grenrus <oleg.grenrus@iki.fi>
+module Data.Aeson.Merge (merge) where
+
+import Data.Aeson.Types
+import Data.HashMap.Strict as HM
+
+-- | A bit like <http://underscorejs.org/#extend _.extend>, but pure, left-bias and recursive.
+merge :: Value -> Value -> Value
+merge (Object a) (Object b) = Object (HM.unionWith merge a b)
+merge a          _b         = a
diff --git a/src/Travis/Meta.hs b/src/Travis/Meta.hs
--- a/src/Travis/Meta.hs
+++ b/src/Travis/Meta.hs
@@ -1,5 +1,11 @@
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE TemplateHaskell #-}
+-- |
+-- Module      : Travis.Meta
+-- Description : Travis preprocessor
+-- Copyright   : (c) Oleg Grenrus, 2005
+-- License     : BSD3
+-- Maintainer  : Oleg Grenrus <oleg.grenrus@iki.fi>
 module Travis.Meta (
   -- * High level
     preprocessIO
@@ -13,10 +19,12 @@
 
 import Control.Lens
 import Control.Monad hiding (sequence)
-import Data.Aeson.Types
 import Data.Aeson.Lens
+import Data.Aeson.Merge
+import Data.Aeson.Types
 import Data.ByteString as BS
 import Data.Char
+import Data.FileEmbed
 import Data.Maybe
 import Data.Monoid
 import Data.Text as T
@@ -65,7 +73,10 @@
 hoist (Just a) = Right a
 
 preprocessYaml :: Value -> Either String Value
-preprocessYaml v = do
+preprocessYaml = preprocessYaml' . processLanguage 
+
+preprocessYaml' :: Value -> Either String Value
+preprocessYaml' v = do
   assertNoMatrixInclude v
   matrixInclude <- buildMatrixInclude v
   let v' = v & _Object . at "env" .~ Nothing
@@ -74,6 +85,13 @@
              & key "matrix" . _Object . at "include" ?~ matrixInclude
   return v'
 
+processLanguage :: Value -> Value
+processLanguage v =
+  case v ^? key "language" . _String of
+    Just t | t == "haskell-stack"      -> merge (v & _Object . at "language" .~ Nothing) stackTemplate
+           | t == "haskell-multi-ghc"  -> merge (v & _Object . at "language" .~ Nothing) multiGhcTemplate
+    _                                  -> v
+
 buildMatrixInclude :: Value -> Either String Value
 buildMatrixInclude v = toJSON <$> mk `traverse` envs
   where addons  = v ^? key "addons"
@@ -103,3 +121,9 @@
 
 -- Right v <- decodeEither <$> BS.readFile ".travis.meta.yml"  :: IO (Either String Value)
 -- BS.putStr $ encode $ preprocessYaml v
+
+stackTemplate :: Value
+stackTemplate = fromJust $ decode $(embedFile "data/language-haskell-stack.yml")
+
+multiGhcTemplate :: Value
+multiGhcTemplate = fromJust $ decode $(embedFile "data/language-haskell-multi-ghc.yml")
diff --git a/tests/Tests.hs b/tests/Tests.hs
--- a/tests/Tests.hs
+++ b/tests/Tests.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE RankNTypes #-}
 module Main (main) where
 
+import Data.ByteString
 import Data.Either.Extra
 import Data.FileEmbed
 import Data.Yaml
@@ -15,20 +16,23 @@
 
 tests :: TestTree
 tests = testGroup "Tests"
-  [ selfTest
-  , withoutMatrix
+  [ fixtures
   , errorCases
   ]
 
-selfTest :: TestTree
-selfTest = testProperty "Self test" $ once $ actual === processed
-  where actual     = decodeEither $(embedFile ".travis.yml")
-        processed  = preprocessYaml =<< decodeEither $(embedFile ".travis.meta.yml")
+fixtures :: TestTree
+fixtures = testGroup "Fixtures"
+  [ f "self" $(embedFile ".travis.yml") $(embedFile ".travis.meta.yml")
+  , f "with matrix" $(embedFile "fixtures/multi-processed.yml") $(embedFile "fixtures/multi.yml")
+  , f "without matrix" $(embedFile "fixtures/without-matrix-processed.yml") $(embedFile "fixtures/without-matrix.yml")
+  , f "multi-ghc" $(embedFile "fixtures/multi-ghc-processed.yml") $(embedFile "fixtures/multi-ghc.yml")
+  ]
+  where f = fixture
 
-withoutMatrix :: TestTree
-withoutMatrix = testProperty "Self test without matrix" $ once $ actual === processed
-  where actual     = decodeEither $(embedFile "fixtures/without-matrix-processed.yml")
-        processed  = preprocessYaml =<< decodeEither $(embedFile "fixtures/without-matrix.yml")
+fixture :: String -> ByteString -> ByteString -> TestTree
+fixture name metaBS processedBS = testProperty name $ once $ actual === processed
+  where actual     = decodeEither metaBS
+        processed  = preprocessYaml =<< decodeEither processedBS
 
 errorCases :: TestTree
 errorCases = testGroup "Error cases"
diff --git a/travis-meta-yaml.cabal b/travis-meta-yaml.cabal
--- a/travis-meta-yaml.cabal
+++ b/travis-meta-yaml.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           travis-meta-yaml
-version:        0.0.1.1
+version:        0.1.0.0
 synopsis:       .travis.yml preprocessor
 description:    .travis.yml preprocessor
 category:       Development
@@ -19,7 +19,13 @@
 extra-source-files:
     .travis.meta.yml
     .travis.yml
+    data/language-haskell-multi-ghc.yml
+    data/language-haskell-stack.yml
     fixtures/matrix-include.yml
+    fixtures/multi-ghc-processed.yml
+    fixtures/multi-ghc.yml
+    fixtures/multi-processed.yml
+    fixtures/multi.yml
     fixtures/without-matrix-processed.yml
     fixtures/without-matrix.yml
     README.md
@@ -36,12 +42,15 @@
       base >=4.7 && <4.9
     , aeson
     , bytestring
-    , lens-aeson
+    , file-embed
     , lens
-    , text
+    , lens-aeson
     , regex-applicative
+    , text
+    , unordered-containers
     , yaml
   exposed-modules:
+      Data.Aeson.Merge
       Travis.Meta
   default-language: Haskell2010
 
@@ -54,10 +63,12 @@
       base >=4.7 && <4.9
     , aeson
     , bytestring
-    , lens-aeson
+    , file-embed
     , lens
-    , text
+    , lens-aeson
     , regex-applicative
+    , text
+    , unordered-containers
     , yaml
     , travis-meta-yaml
     , optparse-applicative
@@ -73,13 +84,14 @@
       base >=4.7 && <4.9
     , aeson
     , bytestring
-    , lens-aeson
+    , file-embed
     , lens
-    , text
+    , lens-aeson
     , regex-applicative
+    , text
+    , unordered-containers
     , yaml
     , extra
-    , file-embed
     , travis-meta-yaml
     , tasty
     , tasty-quickcheck
