diff --git a/clash-shake.cabal b/clash-shake.cabal
--- a/clash-shake.cabal
+++ b/clash-shake.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           clash-shake
-version:        0.2.2
+version:        0.3.0
 synopsis:       Shake rules for building Clash programs
 description:    Shake rules for building Clash programs and synthesizing FPGA
                 configuration. Contains build rules for Xilinx ISE, Xilinx Vivado,
diff --git a/src/Clash/Shake.hs b/src/Clash/Shake.hs
--- a/src/Clash/Shake.hs
+++ b/src/Clash/Shake.hs
@@ -5,7 +5,7 @@
     , (|>)
 
     , useConfig
-    , ClashKit(..)
+    , RunClash(..), ClashKit(..)
     , clashRules
     , SynthKit(..)
 
@@ -60,17 +60,28 @@
 hdlClashFlag Verilog = "--verilog"
 hdlClashFlag SystemVerilog = "--systemverilog"
 
+type RunClash = [String] -> Action ()
+
 data ClashKit = ClashKit
-    { clash :: [String] -> Action ()
-    , manifestSrcs :: Action [FilePath]
+    { manifestSrcs :: Action [FilePath]
     }
 
+instance Semigroup ClashKit where
+    kit <> kit' = ClashKit
+        { manifestSrcs = (<>) <$> manifestSrcs kit <*> manifestSrcs kit'
+        }
+
+instance Monoid ClashKit where
+    mempty = ClashKit
+        { manifestSrcs = pure mempty
+        }
+
 withWorkingDirectory :: FilePath -> IO a -> IO a
 withWorkingDirectory dir act =
     bracket Dir.getCurrentDirectory Dir.setCurrentDirectory $ \_ ->
         Dir.setCurrentDirectory dir >> act
 
-clashRules :: FilePath -> HDL -> [FilePath] -> FilePath -> [String] -> Action () -> Rules ClashKit
+clashRules :: FilePath -> HDL -> [FilePath] -> FilePath -> [String] -> Action () -> Rules (RunClash, ClashKit)
 clashRules outDir hdl srcDirs src clashFlags extraGenerated = do
     let clash args = liftIO $ do
             let srcFlags = ["-i" <> srcDir | srcDir <- srcDirs]
@@ -122,7 +133,7 @@
         extraGenerated
         clash [hdlClashFlag hdl, src]
 
-    return ClashKit{..}
+    return (clash, ClashKit{..})
 
 data SynthKit = SynthKit
     { bitfile :: FilePath
diff --git a/src/Clash/Shake/Intel.hs b/src/Clash/Shake/Intel.hs
--- a/src/Clash/Shake/Intel.hs
+++ b/src/Clash/Shake/Intel.hs
@@ -1,6 +1,8 @@
 {-# LANGUAGE OverloadedStrings, RecordWildCards, TemplateHaskell #-}
 module Clash.Shake.Intel
-    ( Target(..), de0Nano
+    ( Target(..)
+    , de0Nano, arrowDeca
+
     , quartus
     ) where
 
@@ -32,6 +34,9 @@
 de0Nano :: Target
 de0Nano = Target "Cyclone IV E" "EP4CE22F17C6"
 
+arrowDeca :: Target
+arrowDeca = Target "MAX 10" "10M50DAF484C6GES"
+
 quartus :: Target -> ClashKit -> FilePath -> FilePath -> String -> Rules SynthKit
 quartus fpga kit@ClashKit{..} outDir srcDir topName = do
     let projectName = topName
@@ -72,7 +77,9 @@
             let src = srcDir </> makeRelative outDir out
             copyFileChanged src out
 
-    outDir </> topName <.> "sof" %> \_out -> do
+    let bitfile = outDir </> topName <.> "sof"
+
+    bitfile %> \_out -> do
         srcs1 <- manifestSrcs
         srcs2 <- hdlSrcs
         cores <- ipCores
@@ -84,11 +91,23 @@
             ]
         quartus "quartus_sh" ["-t", projectName <.> "tcl"]
 
+    outDir </> topName <.> "rbf" %> \out -> do
+        let sof = out -<.> "sof"
+        need [sof]
+        quartus "quartus_cpf"
+          [ "--option=bitstream_compression=off"
+          , "-c", makeRelative outDir sof
+          , makeRelative outDir out
+          ]
+
     return $ SynthKit
-        { bitfile = outDir </> topName <.> "sof"
+        { bitfile = bitfile
           , phonies =
               [ "quartus" |> do
-                  need [outDir </> projectName <.> "tcl"]
-                  quartus "quartus_sh" ["-t", outDir </> projectName <.> "tcl"]
+                    need [outDir </> projectName <.> "tcl"]
+                    quartus "quartus_sh" ["-t", projectName <.> "tcl"]
+              , "upload" |> do
+                    need [bitfile]
+                    quartus "quartus_pgm" ["-m", "jtag", "-o", "p;" <> makeRelative outDir bitfile]
               ]
         }
