diff --git a/Gitit.hs b/Gitit.hs
--- a/Gitit.hs
+++ b/Gitit.hs
@@ -45,7 +45,7 @@
 import Text.Pandoc
 import Text.Pandoc.ODT (saveOpenDocumentAsODT)
 import Text.Pandoc.Definition (processPandoc)
-import Text.Pandoc.Shared (HTMLMathMethod(..))
+import Text.Pandoc.Shared (HTMLMathMethod(..), substitute)
 import Data.ByteString.Internal (c2w)
 import Data.Char (isAlphaNum, isAlpha)
 import Codec.Binary.UTF8.String (decodeString)
@@ -57,7 +57,7 @@
 import Text.Highlighting.Kate
 
 gititVersion :: String
-gititVersion = "0.2.2"
+gititVersion = "0.2.2.1"
 
 main :: IO ()
 main = do
@@ -333,15 +333,20 @@
                           Just u   -> responder page (params { pUser = u })
 
 handle :: (String -> Bool) -> Method -> (String -> Params -> Web Response) -> Handler
-handle uritest meth responder =
-  uriRest $ \uri -> let uriPath = drop 1 $ takeWhile (/='?') uri
-                    in  if uritest uriPath
+handle pathtest meth responder =
+  uriRest $ \uri -> let path' = uriPath uri
+                    in  if pathtest path'
                            then withData $ \params ->
                                     [ withRequest $ \req -> if rqMethod req == meth
-                                                               then responder uriPath params
+                                                               then responder path' params
                                                                else noHandle ]
                            else anyRequest noHandle
 
+-- | Returns path portion of URI, without initial /.
+-- Consecutive spaces are collapsed.  We don't want to distinguish 'Hi There' and 'Hi  There'.
+uriPath :: String -> String
+uriPath = unwords . words . drop 1 . takeWhile (/='?')
+
 handlePage :: Method -> (String -> Params -> Web Response) -> Handler
 handlePage = handle isPage
 
@@ -365,12 +370,12 @@
 
 handleAny :: Handler
 handleAny = 
-  uriRest $ \uri -> let uriPath = drop 1 $ takeWhile (/='?') uri
+  uriRest $ \uri -> let path' = uriPath uri
                     in  do cfg <- query GetConfig
-                           let file = repositoryPath cfg </> uriPath
+                           let file = repositoryPath cfg </> path'
                            exists <- liftIO $ doesFileExist file
                            if exists
-                              then fileServe [uriPath] (repositoryPath cfg)
+                              then fileServe [path'] (repositoryPath cfg)
                               else anyRequest noHandle
 
 orIfNull :: String -> String -> String
@@ -384,7 +389,8 @@
 isSourceCode = not . null . languagesByExtension . takeExtension
 
 urlForPage :: String -> String
-urlForPage page = "/" ++ urlEncode page
+urlForPage page = "/" ++ (substitute "%2f" "/" $ urlEncode page)
+-- this is needed so that browsers recognize relative URLs correctly
 
 pathForPage :: String -> FilePath
 pathForPage page = page <.> "page"
@@ -408,7 +414,7 @@
 setFilename fname res =
   let respHeaders = rsHeaders res
       newContentType = HeaderPair { hName = fromString "Content-Disposition",
-                                    hValue = [ fromString $ "attachment; " ++ urlEncodeVars [("filename", fname)] ] }
+                                    hValue = [ fromString $ "attachment; filename=\"" ++ fname ++ "\"" ] }
   in  res { rsHeaders = M.insert (fromString "content-disposition") newContentType respHeaders }  
 
 showRawPage :: String -> Params -> Web Response
@@ -439,7 +445,7 @@
                                              else "&" ++ urlEncodeVars [("logMsg", "Revert to " ++ revision)]) ++ "';")] << cont
                  formattedPage [] ["jsMath/easy/load.js"] page params cont'
        _      -> if revision == "HEAD"
-                    then editPage page params
+                    then (unlessNoEdit $ ifLoggedIn "" $ editPage) page params
                     else error $ "Invalid revision: " ++ revision
 
 validate :: [(Bool, String)]   -- ^ list of conditions and error messages
@@ -809,7 +815,7 @@
                                          anchor ! [href ("/_register?" ++ urlEncodeVars [("destination", page)]), theclass "nav_link"] <<
                                           "register"
   let sitenavVis = if HideNavbar `elem` opts then "hidden" else "visible"
-  let sidebarVis = if HidePageControls `elem` opts then "hidden" else "visible"
+  let pageinfoVis = if HidePageControls `elem` opts then "none" else "show"
   let messages = pMessages params
   let htmlMessages = if null messages
                         then noHtml
@@ -821,8 +827,8 @@
                                '_':_   -> noHtml
                                _       -> thediv ! [identifier "pageTitle"] << [ anchor ! [href $ urlForPage page] << (h1 << page) ]
                         , thediv ! [identifier "content"] << [htmlMessages, htmlContents]
-                        , thediv ! [identifier "pageinfo"] << [ thediv ! [theclass "pageControls",
-                                                                          thestyle $ "visibility: " ++ sidebarVis] <<
+                        , thediv ! [identifier "pageinfo", thestyle $ "display: " ++ pageinfoVis] <<
+                                        [ thediv ! [theclass "pageControls"] <<
                                                                             ((thespan ! [theclass "details"] << revision) : buttons)
                                                               , if isPage page then exportBox page params else noHtml]
                         , thediv ! [identifier "footer"] << primHtml (wikiFooter cfg)
@@ -856,7 +862,7 @@
     then do
       key <- update $ NewSession (SessionData uname)
       addCookie (3600) (mkCookie "sid" (show key))
-      seeOther ("/" ++ intercalate "%20" (words destination)) $ toResponse $ p << ("Welcome, " ++ uname)
+      seeOther ("/" ++ substitute " " "%20" destination) $ toResponse $ p << ("Welcome, " ++ uname)
     else
       loginUserForm "_login" (params { pMessages = "Authentication failed." : pMessages params })
 
@@ -867,7 +873,7 @@
   case key of
        Just k  -> update $ DelSession k
        Nothing -> return ()
-  seeOther ("/" ++ intercalate "%20" (words destination)) $ toResponse $ p << "You have been logged out."
+  seeOther ("/" ++ substitute " " "%20" destination) $ toResponse $ p << "You have been logged out."
 
 registerForm :: Web Html
 registerForm = do
diff --git a/gitit.cabal b/gitit.cabal
--- a/gitit.cabal
+++ b/gitit.cabal
@@ -1,5 +1,5 @@
 name:                gitit
-version:             0.2.2
+version:             0.2.2.1
 Cabal-version:       >= 1.2
 build-type:          Simple
 synopsis:            Wiki using HAppS, git, and pandoc.
diff --git a/stylesheets/gitit.css b/stylesheets/gitit.css
--- a/stylesheets/gitit.css
+++ b/stylesheets/gitit.css
@@ -102,11 +102,12 @@
 #pageinfo {
   padding: 4px;
   border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
 }
 
 #footer {
   clear: both;
+  border-top: 1px solid #ccc;
+  margin-top: 2px;
   text-align: center;
   font-size: 80%;
   padding: 4px;
