diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,7 @@
 Changelog for Hexml
 
+0.3.3
+    #13, allow the . character in tags and attributes
 0.3.2
     #10, mark the small fast FFI calls as "unsafe" (up to 10x faster)
 0.3.1
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -11,3 +11,5 @@
 Hexml may be suitable if you want to quickly parse XML, from known sources, and a full XML parser has been shown to be a bottleneck. As an alternative to hexml, which supports things like entities but is still pretty fast, see [Pugixml](http://pugixml.org/) (with a [Haskell binding](https://hackage.haskell.org/package/pugixml)).
 
 Hexml is tested with [AFL](http://lcamtuf.coredump.cx/afl/).
+
+If you want lenses for Hexml, see [hexml-lens](http://hackage.haskell.org/package/hexml-lens).
diff --git a/cbits/hexml.c b/cbits/hexml.c
--- a/cbits/hexml.c
+++ b/cbits/hexml.c
@@ -233,7 +233,7 @@
     for (int i = 0; i < 256; i++)
     {
         bool name1 = i == ':' || i == '_' || (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z');
-        bool name = name1 || i == '-' || (i >= '0' && i <= '9');
+        bool name = name1 || i == '-' || i == '.' || (i >= '0' && i <= '9');
         bool space = i == ' ' || i == '\t' || i == '\r' || i == '\n';
         parse_table[i] = (name1 ? tag_name1 : 0) | (name ? tag_name : 0) | (space ? tag_space : 0);
     }
diff --git a/hexml.cabal b/hexml.cabal
--- a/hexml.cabal
+++ b/hexml.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.18
 build-type:         Simple
 name:               hexml
-version:            0.3.2
+version:            0.3.3
 license:            BSD3
 license-file:       LICENSE
 category:           XML
@@ -13,7 +13,7 @@
     An XML DOM-style parser, that only parses a subset of XML, but is designed to be fast.
 homepage:           https://github.com/ndmitchell/hexml#readme
 bug-reports:        https://github.com/ndmitchell/hexml/issues
-tested-with:        GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3
+tested-with:        GHC==8.2.1, GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3
 extra-doc-files:
     README.md
     CHANGES.txt
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -18,6 +18,7 @@
     ,(False, "<test></more>")
     ,(False, "<test")
     ,(True, "<?xml version=\"1.1\"?>\n<greeting>Hello, world!</greeting>")
+    ,(True, "<foo bar.baz=\"qux\"></foo>")
     ]
 
 main :: IO ()
@@ -74,7 +75,7 @@
                  "</" <> name x <> ">"
         attr (Attribute a b) = validName a <> "=\"" <> validAttr b <> "\""
 
-        validName x | BS.all (\x -> isAlphaNum x || x `elem` ("-:_" :: String)) x = x
+        validName x | BS.all (\x -> isAlphaNum x || x `elem` ("-.:_" :: String)) x = x
                     | otherwise = error "Invalid name"
         validAttr x | BS.notElem '\"' x = x
                     | otherwise = error "Invalid attribute"
