diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,29 @@
 
 
 
+settings 0.2.2.0 -- 2015-12-17
+==============================
+
+General, build and documentation changes:
+
+* (None)
+
+New APIs, features and enhancements:
+
+* Support arbitrary esc/sep chars in option paths, and allow escaping them.
+
+Bug fixes:
+
+* (None)
+
+Dependency changes:
+
+* (None)
+
+
+
+
+
 settings 0.2.1.0 -- 2015-10-17
 ==============================
 
diff --git a/settings.cabal b/settings.cabal
--- a/settings.cabal
+++ b/settings.cabal
@@ -1,5 +1,5 @@
 name:                settings
-version:             0.2.1.0
+version:             0.2.2.0
 synopsis:            Runtime-editable program settings.
 description:
   This library aims to be a tool for constructing a settings management UI on
@@ -27,7 +27,7 @@
 
 source-repository head
   type:                darcs
-  location:            http://dev.rel4tion.org/fr33domlover/settings
+  location:            http://hub.darcs.net/fr33domlover/settings
 
 library
   exposed-modules:     Data.Settings
diff --git a/src/Data/Settings.hs b/src/Data/Settings.hs
--- a/src/Data/Settings.hs
+++ b/src/Data/Settings.hs
@@ -105,6 +105,11 @@
 -- and to the option under it as @\"s.a\"@. And so on, we can have arbitrarily
 -- deep nesting of sections and options, e.g. @\"s.t.u.v.w.x.a\"@.
 --
+-- It is possible for a section or option name to contain a period. In that
+-- case, the period must be escaped using a backslash before it. To specify a
+-- literal backslash, escape it too, i.e. use two backslashes. It is also
+-- possible different separator characters instead of a period.
+--
 -- The low-level flexible way to define a settings tree is by using 'Option'
 -- value contructors directly. Let's define a simple flat tree with 4 options
 -- and no subsections.
diff --git a/src/Data/Settings/Route.hs b/src/Data/Settings/Route.hs
--- a/src/Data/Settings/Route.hs
+++ b/src/Data/Settings/Route.hs
@@ -15,7 +15,9 @@
 
 module Data.Settings.Route
     ( parseRoute
+    , parseRoute'
     , showRoute
+    , showRoute'
     )
 where
 
@@ -25,7 +27,8 @@
 -- | Split a path string into its components, if it's a valid path
 -- syntactically.
 parseRoute :: OptPath -> Maybe OptRoute
-parseRoute "" = Just []
+parseRoute = parseRoute' '\\' '.'
+{-parseRoute "" = Just []
 parseRoute s  =
     case break (== '.') s of
         ("", _)     -> Nothing
@@ -33,9 +36,39 @@
         (p, (c:cs)) ->
             case parseRoute cs of
                 Nothing -> Nothing
-                Just ps -> Just $ p : ps
+                Just ps -> Just $ p : ps-}
 
+-- | Like 'parseRoute', but allows to choose the escape character (e.g. @'\'@)
+-- and the path separator character (e.g. @'.'@).
+parseRoute' :: Char -> Char -> OptPath -> Maybe OptRoute
+parseRoute' esc sep = f [] ""
+    where
+    f []    ""   "" = Just []
+    f route ""   "" = Nothing
+    f route part "" = Just $ reverse $ reverse part : route
+    f route part [c]
+        | c == esc             = Nothing
+        | c == sep             = Nothing
+        | otherwise            = f route (c : part) ""
+    f route part (a:r@(b:s))
+        | a == esc && b == esc = f route (esc : part) s
+        | a == esc && b == sep = f route (sep : part) s
+        | a == esc             = Nothing
+        | a == sep             = f (reverse part : route) "" r
+        | otherwise            = f route (a : part) r
+
 -- | Create a string representation of a path, with the parts separated by
--- periods.
+-- periods, and literal periods escaped using backslashes.
 showRoute :: OptRoute -> OptPath
-showRoute = intercalate "."
+showRoute = showRoute' '\\' '.'
+
+-- | Like 'showRoute', but allows to choose the escape character (e.g. @'\\'@)
+-- and the path separator character (e.g. @'.'@).
+showRoute' :: Char -> Char -> OptRoute -> OptPath
+showRoute' esc sep = intercalate [sep] . map escape
+    where
+    escape = foldr f ""
+    f c s
+        | c == esc  = esc : esc : s
+        | c == sep  = esc : sep : s
+        | otherwise = c : s
