diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,11 @@
+#!/usr/bin/env runhaskell
+
+> module Main where
+> import Distribution.Simple
+> import System.Cmd (system)
+
+> main :: IO ()
+> main = defaultMainWithHooks (simpleUserHooks { runTests = runTests' })
+
+> runTests' :: a -> b -> c -> d -> IO ()
+> runTests' _ _ _ _ = system "runhaskell -DTEST runtests.hs" >> return ()
diff --git a/Web/Routes/Quasi.hs b/Web/Routes/Quasi.hs
--- a/Web/Routes/Quasi.hs
+++ b/Web/Routes/Quasi.hs
@@ -270,7 +270,7 @@
     go' (IntPiece _) = Just (NotStrict, ConT ''Integer)
     go' (SlurpPiece _) = Just (NotStrict, AppT ListT $ ConT ''String)
     go' _ = Nothing
-    go'' (SubSite t _ _) = [(NotStrict, ConT $ mkName t)]
+    go'' (SubSite t _ _) = [(NotStrict, ConT ''Routes `AppT` ConT (mkName t))]
     go'' _ = []
     claz = [''Show, ''Read, ''Eq]
 
@@ -322,8 +322,8 @@
         | otherwise = False
 
 -- | Generates the set of clauses necesary to parse the given 'Resource's. See 'quasiParse'.
-createParse :: [Resource] -> Q [Clause]
-createParse res = do
+createParse :: QuasiSiteSettings -> [Resource] -> Q [Clause]
+createParse set res = do
     final' <- final
     clauses <- mapM go res
     return $ if areResourcesComplete res
@@ -338,9 +338,14 @@
         let pat = mkPat ps' h
         bod <- foldM go' (ConE $ mkName n) ps'
         bod' <- case h of
-                    SubSite _ f _ -> do
+                    SubSite argType f _ -> do
                         parse <- [|quasiParse|]
-                        let parse' = parse `AppE` VarE (mkName f)
+                        let siteType = ConT ''QuasiSite
+                                        `AppT` crApplication set
+                                        `AppT` ConT (mkName argType)
+                                        `AppT` crArgument set
+                            siteVar = VarE (mkName f) `SigE` siteType
+                        let parse' = parse `AppE` siteVar
                         let rhs = parse' `AppE` VarE (mkName "var0")
                         fm <- [|fmap|]
                         return $ fm `AppE` bod `AppE` rhs
@@ -385,8 +390,8 @@
 
 -- | Generates the set of clauses necesary to render the given 'Resource's. See
 -- 'quasiRender'.
-createRender :: [Resource] -> Q [Clause]
-createRender res = mapM go res
+createRender :: QuasiSiteSettings -> [Resource] -> Q [Clause]
+createRender set res = mapM go res
   where
     go (Resource n ps h) = do
         let ps' = zip [1..] ps
@@ -397,9 +402,14 @@
     lastPat _ = []
     go' (_, StaticPiece _) = Nothing
     go' (i, _) = Just $ VarP $ mkName $ "var" ++ show (i :: Int)
-    mkBod [] (SubSite _ f _) = do
+    mkBod [] (SubSite argType f _) = do
         format <- [|quasiRender|]
-        let format' = format `AppE` VarE (mkName f)
+        let siteType = ConT ''QuasiSite
+                        `AppT` crApplication set
+                        `AppT` ConT (mkName argType)
+                        `AppT` crArgument set
+            siteVar = VarE (mkName f) `SigE` siteType
+        let format' = format `AppE` siteVar
         return $ format' `AppE` VarE (mkName "var0")
     mkBod [] _ = lift ([] :: [String])
     mkBod ((_, StaticPiece x):xs) h = do
@@ -472,9 +482,14 @@
                                 then []
                                 else [Match WildP (NormalB $ VarE badMethod) []]
                     return $ CaseE (VarE method) $ matches ++ final
-                SubSite _ f getArg -> do
+                SubSite argType f getArg -> do
                     qd <- [|quasiDispatch|]
-                    let disp = qd `AppE` VarE (mkName f)
+                    let siteType = ConT ''QuasiSite
+                                    `AppT` crApplication set
+                                    `AppT` ConT (mkName argType)
+                                    `AppT` crArgument set
+                        siteVar = VarE (mkName f) `SigE` siteType
+                    let disp = qd `AppE` siteVar
                     o <- [|(.)|]
                     let tomurl' = InfixE (Just $ VarE tomurl) o
                                 $ Just $ ConE $ mkName constr
@@ -541,8 +556,8 @@
 createQuasiSite set = do
     dt <- dataTypeDec set
     let tySyn = TySynInstD ''Routes [crArgument set] $ ConT $ crRoutes set
-    parseClauses <- createParse $ crResources set
-    renderClauses <- createRender $ crResources set
+    parseClauses <- createParse set $ crResources set
+    renderClauses <- createRender set $ crResources set
     dispatchClauses <- createQuasiDispatch set
     st <- siteDecType set
     s <- siteDec (crSite set) parseClauses renderClauses dispatchClauses
diff --git a/runtests.hs b/runtests.hs
--- a/runtests.hs
+++ b/runtests.hs
@@ -57,11 +57,12 @@
     , crResources = [$parseRoutes|
 /                    Home       GET
 /user/#userid        User       GET PUT DELETE
-/static              Static     StaticRoutes siteStatic getStaticArgs
+/static              Static     StaticArgs siteStatic getStaticArgs
 /foo/*slurp          Foo
 /bar/$barparam       Bar
 |]
     , crSite = mkName "theSite"
+    , crMaster = Left $ ConT ''Int
     }
 
 handleFoo :: [String] -> Explode MyRoutes murl marg
diff --git a/web-routes-quasi.cabal b/web-routes-quasi.cabal
--- a/web-routes-quasi.cabal
+++ b/web-routes-quasi.cabal
@@ -1,5 +1,5 @@
 name:            web-routes-quasi
-version:         0.0.0
+version:         0.1.0
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
