diff --git a/hedn.cabal b/hedn.cabal
--- a/hedn.cabal
+++ b/hedn.cabal
@@ -2,7 +2,7 @@
 -- see http://haskell.org/cabal/users-guide/
 
 name:                hedn
-version:             0.1.5.1
+version:             0.1.5.2
 synopsis:            EDN parsing and encoding
 homepage:            https://bitbucket.org/dpwiz/hedn
 license:             BSD3
diff --git a/src/Data/EDN/Encode.hs b/src/Data/EDN/Encode.hs
--- a/src/Data/EDN/Encode.hs
+++ b/src/Data/EDN/Encode.hs
@@ -71,6 +71,7 @@
 quoteChar :: Char -> Builder
 quoteChar c = case c of
     '\n' -> string "newline"
+    '\r' -> string "return"
     '\t' -> string "tab"
     ' '  -> string "space"
     _    -> singleton c
diff --git a/src/Data/EDN/Parser.hs b/src/Data/EDN/Parser.hs
--- a/src/Data/EDN/Parser.hs
+++ b/src/Data/EDN/Parser.hs
@@ -73,6 +73,7 @@
     x <- string "newline" <|> string "space" <|> string "tab" <|> A.take 1
     return . Character $! case x of
                               "newline" -> '\n'
+                              "return" -> '\r'
                               "space" -> ' '
                               "tab" -> '\t'
                               _ -> BS.head x
@@ -80,26 +81,28 @@
 parseSymbol :: Parser Value
 parseSymbol = do
     skipSoC
-    c <- satisfy (inClass "a-zA-Z.*/!?+_-")
+    c <- satisfy (inClass "a-zA-Z.*/!?$%&=+_-")
     (ns, val) <- withNS c <|> withoutNS c
     return $! Symbol ns val
     where
         withNS c = do
-            ns <- takeWhile1 (inClass "a-zA-Z0-9#:.*!?+_-")
+            ns <- takeWhile1 (inClass "a-zA-Z0-9#:.*!?$%&=+_-")
             char '/'
-            val <- takeWhile1 (inClass "a-zA-Z0-9#:.*!?+_-")
-            return (c `BS.cons` ns, val)
+            vc <- satisfy (inClass "a-zA-Z.*/!?$%&=+_-")
+            val <- takeWhile1 (inClass "a-zA-Z0-9#:.*!?$%&=+_-")
+            return (c `BS.cons` ns, vc `BS.cons` val)
 
         withoutNS c = do
-            val <- takeWhile (inClass "a-zA-Z0-9#:.*!?+_-")
+            val <- takeWhile (inClass "a-zA-Z0-9#:.*!?$%&=+_-")
             return ("", c `BS.cons` val)
 
 parseKeyword :: Parser Value
 parseKeyword = do
     skipSoC
     char ':'
-    x <- takeWhile1 (inClass "a-zA-Z0-9.*/!?+_-")
-    return $! Keyword x
+    c <- satisfy (inClass "a-zA-Z.*/!?$%&=+_-")
+    x <- takeWhile (inClass "a-zA-Z0-9#:.*/!?$%&=+_-")
+    return $! Keyword (c `BS.cons` x)
 
 parseNumber :: Parser Value
 parseNumber = do
diff --git a/src/Data/EDN/Types.hs b/src/Data/EDN/Types.hs
--- a/src/Data/EDN/Types.hs
+++ b/src/Data/EDN/Types.hs
@@ -38,6 +38,10 @@
               | Tagged !a !ByteString !ByteString
               deriving (Eq, Ord, Show)
 
+instance Functor Tagged where
+    fmap f (NoTag v) = NoTag (f v)
+    fmap f (Tagged v ns t) = Tagged (f v) ns t
+
 type TaggedValue = Tagged Value
 
 type EDNList = [TaggedValue]
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -103,6 +103,7 @@
               , (E.char 'c', "\\c")
               , (E.char '\\', "\\\\")
               , (E.char '\n', "\\newline")
+              , (E.char '\r', "\\return")
               , (E.char '\t', "\\tab")
               , (E.char ' ', "\\space")
 
