diff --git a/Text/URI.hs b/Text/URI.hs
--- a/Text/URI.hs
+++ b/Text/URI.hs
@@ -35,7 +35,6 @@
 import Safe
 import Text.Parsec
 import Text.Printf
-
 ------------------------------------------------------------
 --  The URI datatype
 ------------------------------------------------------------
@@ -77,9 +76,9 @@
 		maybe "" (++ ":") $ uriScheme u
 		, if (isJust $ uriRegName u) then "//" else ""
 		, maybe "" (++ "@") $ uriUserInfo u
-		, maybe "" (++ "/") $ uriRegName u
+		, fromMaybe "" $ uriRegName u
 		, maybe "" (\s -> ":" ++ show s) $ uriPort u
-		, if (isJust $ uriRegName u) && "/" `isPrefixOf` uriPath u then tailSafe $ uriPath u else uriPath u
+		, if (isJust $ uriRegName u) && (not ("/" `isPrefixOf` uriPath u || uriPath u == "")) then ("/" ++ uriPath u) else uriPath u
 		, maybe "" ("?" ++) $ uriQuery u
 		, maybe "" ("#" ++) $ uriFragment u
 		]
@@ -155,6 +154,7 @@
 
 -- | Joins path segments, with escaping
 segmentsToPath :: [String] -> String
+segmentsToPath [""] = "/"
 segmentsToPath ss = intercalate "/" $ map (escapeString (okInPathSegment)) ss
 
 -- | Merges two URIs
@@ -203,11 +203,11 @@
 mergePaths :: [String] -> [String] -> [String]
 mergePaths p1 p2@("":_) = dereferencePath p2
 mergePaths p1 [] = dereferencePath p1
-mergePaths p1 p2 = dereferencePath (initSafe p1 ++ p2)
+mergePaths p1 p2 = dereferencePath ((initSafe p1 ++ ["."]) ++ p2)
 
 -- | Removes ".." and "." from path
 dereferencePath :: [String] -> [String]
-dereferencePath = dereferencePath' []
+dereferencePath = reverse . dereferencePath' [] . map (\s -> if s == "" then "." else s)
 
 -- | dereferencePath for strings
 dereferencePathString :: String -> String
@@ -215,12 +215,13 @@
 
 -- Private functions
 
-
 dereferencePath' :: [String] -> [String] -> [String]
 dereferencePath' processed [] = processed
-dereferencePath' processed ("..":ps) = dereferencePath' (initSafe processed) (ps)
+dereferencePath' processed ["."] = "":processed
+dereferencePath' (".":processed) ps@("..":_) = dereferencePath' processed ps
+dereferencePath' processed ("..":ps) = dereferencePath' (tailSafe processed) (".":ps)
 dereferencePath' processed (".":ps) = dereferencePath' processed ps
-dereferencePath' processed (p:ps) = dereferencePath' (processed ++ [p]) ps
+dereferencePath' processed (p:ps) = dereferencePath' (p:processed) ps
 
 -- Parser
 
@@ -494,7 +495,9 @@
 	return ()
 
 explode :: (Eq a) => a -> [a] -> [[a]]
+explode _ [] = []
 explode delim xs = let (first, rest) = span (/= delim) xs
 	in first : case rest of
 		[] -> []
+		x:[] -> [[]]
 		x:xs -> explode delim xs
diff --git a/uri.cabal b/uri.cabal
--- a/uri.cabal
+++ b/uri.cabal
@@ -1,5 +1,5 @@
 Name: uri
-Version: 0.1.6.1
+Version: 0.1.6.2
 Synopsis: Library for working with URIs
 Category: Text
 Description: Library for working with URIs, including parsing, rendering, merging, escaping
