diff --git a/src/Network/URI/Template/Internal.hs b/src/Network/URI/Template/Internal.hs
--- a/src/Network/URI/Template/Internal.hs
+++ b/src/Network/URI/Template/Internal.hs
@@ -69,8 +69,7 @@
     Explode -> exploded
     (MaxLength l) -> do
       when (modifierSupportsNamed settings) (namePrefix settings varName val)
-      -- TODO: this is wrong. we need to truncate prior to encoding.
-      censor (fromList . take l . Data.DList.toList) unexploded
+      unexploded
   where
     settings = options m
 
@@ -79,27 +78,32 @@
 
     sepByCommas = sequence_ . intersperse (addChar ',')
 
-    associativeCommas :: (TemplateValue Single, TemplateValue Single) -> StringBuilder ()
-    associativeCommas (Single n, Single v) = addEncodeString n >> addChar ',' >> addEncodeString v
+    associativeCommas :: (String -> String) -> (TemplateValue Single, TemplateValue Single) -> StringBuilder ()
+    associativeCommas f (Single n, Single v) = addEncodeString n >> addChar ',' >> addEncodeString (f v)
 
+    preprocess :: String -> String
+    preprocess = case varMod of
+      MaxLength l -> take l
+      _ -> id
+
     unexploded = case val of
-      (Associative l) -> sepByCommas $ map associativeCommas l
-      (List l) -> sepByCommas $ map (\(Single s) -> addEncodeString s) l
-      (Single s) -> addEncodeString s
+      (Associative l) -> sepByCommas $ map (associativeCommas preprocess) l
+      (List l) -> sepByCommas $ map (\(Single s) -> addEncodeString $ preprocess s) l
+      (Single s) -> addEncodeString $ preprocess s
 
     explodedAssociative :: (TemplateValue Single, TemplateValue Single) -> StringBuilder ()
     explodedAssociative (Single k, Single v) = do
       addEncodeString k
       addChar '='
-      addEncodeString v
-      
+      addEncodeString $ preprocess v
+
     exploded :: StringBuilder ()
     exploded = case val of
       (Single s) -> do
         when (modifierSupportsNamed settings) (namePrefix settings varName val)
-        addEncodeString s
+        addEncodeString $ preprocess s
       (Associative l) -> sequence_ $ intersperse (addChar $ modifierSeparator settings) $ map explodedAssociative l
-      (List l) -> sequence_ $ intersperse (addChar $ modifierSeparator settings) $ map (\(Single s) -> addEncodeString s) l
+      (List l) -> sequence_ $ intersperse (addChar $ modifierSeparator settings) $ map (\(Single s) -> addEncodeString $ preprocess s) l
 
 processVariables :: [(String, WrappedValue)] -> Modifier -> [Variable] -> StringBuilder ()
 processVariables env m vs = sequence_ $ processedVariables
diff --git a/src/Network/URI/Template/Parser.hs b/src/Network/URI/Template/Parser.hs
--- a/src/Network/URI/Template/Parser.hs
+++ b/src/Network/URI/Template/Parser.hs
@@ -50,10 +50,12 @@
   return [h, d1, d2]
 
 literalChar :: Parser Char
-literalChar = (choice $ map char ['\x21', '\x23', '\x24', '\x26', '\x3D', '\x5D', '\x5F', '\x7E'])
-  <|> ranges [('\x28', '\x3B'), ('\x3F', '\x5B'), ('\x61', '\x7A')]
-  <|> ucschar
-  <|> iprivate
+literalChar =
+  (choice $ map char
+    ['\x21', '\x23', '\x24', '\x26', '\x3D', '\x5D', '\x5F', '\x7E']) <|>
+  ranges [('\x28', '\x3B'), ('\x3F', '\x5B'), ('\x61', '\x7A')] <|>
+  ucschar <|>
+  iprivate
 
 literal :: Parser TemplateSegment
 literal = (Literal . concat) <$> some ((pure <$> literalChar) <|> pctEncoded)
@@ -77,7 +79,10 @@
       , (';', PathParameter)
       , ('?', Query)
       , ('&', QueryContinuation)
-      , ('@', Alias)
+      , ('=', Reserved)
+      , ('@', Reserved)
+      , ('!', Reserved)
+      , ('|', Reserved)
       ]
 
 variable :: Parser Variable
@@ -94,7 +99,8 @@
 uriTemplate = spaces *> many (literal <|> embed)
 
 parseTemplate :: String -> Either Doc UriTemplate
-parseTemplate t = case parseString uriTemplate mempty t of
-                        Failure err -> Left (_errDoc err)
-                        Success r -> Right r
+parseTemplate t =
+  case parseString uriTemplate mempty t of
+    Failure err -> Left (_errDoc err)
+    Success r -> Right r
 
diff --git a/src/Network/URI/Template/Types.hs b/src/Network/URI/Template/Types.hs
--- a/src/Network/URI/Template/Types.hs
+++ b/src/Network/URI/Template/Types.hs
@@ -32,7 +32,9 @@
 newtype TemplateString = String { fromString :: String }
   deriving (Read, Show, Eq, S.IsString)
 
-newtype AList k v = AList { fromAList :: [(k, v)] }
+newtype AList k v = AList
+  { fromAList :: [(k, v)]
+  }
 
 class ToTemplateValue a where
   type TemplateRep a
@@ -80,8 +82,10 @@
   | MaxLength Int
   deriving (Read, Show, Eq)
 
-data Variable = Variable { variableName :: String, variableValueModifier :: ValueModifier }
-  deriving (Read, Show, Eq)
+data Variable = Variable
+  { variableName :: String
+  , variableValueModifier :: ValueModifier
+  } deriving (Read, Show, Eq)
 
 data TemplateSegment
   = Literal String
@@ -99,7 +103,6 @@
   | PathParameter
   | Query
   | QueryContinuation
-  | Alias
   deriving (Read, Show, Eq)
 
 
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -79,6 +79,9 @@
 var :: TemplateString
 var = "value"
 
+semi :: TemplateString
+semi = ";"
+
 hello :: TemplateString
 hello = "Hello World!"
 
@@ -93,6 +96,10 @@
 
 quasiQuoterTests = label "QuasiQuoter Tests" $ suite $ do
   label "Simple" $ test ([uri|{var}|] @?= "value")
+  label "Simple with sufficient length" $ test ([uri|{var:20}|] @?= "value")
+  label "Simple with insufficient length" $ test ([uri|{var:3}|] @?= "val")
+  label "Escape" $ test ([uri|{semi}|] @?= "%3B")
+  label "Escape" $ test ([uri|{semi:2}|] @?= "%3B")
   label "Multiple" $ test ([uri|{var,hello}|] @?= "value,Hello%20World%21")
   label "Length Constraint" $ test ([uri|{var:3}|] @?= "val")
   label "Sufficiently large length constraint" $ test ([uri|{var:10}|] @?= "value")
diff --git a/uri-templater.cabal b/uri-templater.cabal
--- a/uri-templater.cabal
+++ b/uri-templater.cabal
@@ -2,10 +2,10 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                uri-templater
-version:             0.2.1.0
+version:             0.2.2.0
 synopsis:            Parsing & Quasiquoting for RFC 6570 URI Templates
 description:         Parsing & Quasiquoting for RFC 6570 URI Templates
-homepage:            http://github.com/iand675/uri-templater
+homepage:            https://github.com/iand675/uri-templater
 license:             MIT
 license-file:        LICENSE
 author:              Ian Duncan
@@ -16,7 +16,7 @@
 cabal-version:       >=1.8
 source-repository    head
   type:                git
-  location:            http://github.com/iand675/uri-templater
+  location:            https://github.com/iand675/uri-templater
 
 library
   exposed-modules:   Network.URI.Template,
