diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,10 @@
-# 0.4.0.1
+# 0.5.0
+
+* Obey XdgData for storing the files.
+* Also search pages from sunos directory now.
+* Support subcommansds ie. tldr git submodule will now work.
+
+# 0.4.0.2
 
 * Fix double initialization bug. Credits to @Kove-W-O-Salter
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # tldr
 
-[![Linux build](https://travis-ci.org/psibi/tldr-hs.svg?branch=master)](https://travis-ci.org/psibi/tldr-hs)
-[![Window build](https://ci.appveyor.com/api/projects/status/wlqa2ndsquk1psqs/branch/master?svg=true)](https://ci.appveyor.com/project/psibi/tldr-hs/branch/master)
+[![Build Status](https://dev.azure.com/psibi2000/tldr-hs/_apis/build/status/psibi.tldr-hs?branchName=master)](https://dev.azure.com/psibi2000/tldr-hs/_build/latest?definitionId=5?branchName=master)
+
 [![Hackage](https://img.shields.io/hackage/v/tldr.svg)](https://hackage.haskell.org/package/tldr)
 [![Stackage Nightly](http://stackage.org/package/tldr/badge/nightly)](http://stackage.org/nightly/package/tldr)
 [![Stackage LTS](http://stackage.org/package/tldr/badge/lts)](http://stackage.org/lts/package/tldr)
@@ -32,5 +32,3 @@
 ## Snapshot
 
 ![tldr](https://cloud.githubusercontent.com/assets/737477/24076451/2a5a604c-0c57-11e7-9bf7-13d76e8e7f12.png)
-
-
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -1,60 +1,59 @@
-{-#LANGUAGE CPP#-}
-{-#LANGUAGE ScopedTypeVariables#-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 module Main where
 
-import Tldr
-import Options.Applicative hiding ((<>))
-import Data.Semigroup ((<>))
 import Control.Monad
+import Data.List (intercalate, isPrefixOf)
+import Data.Semigroup ((<>))
+import Data.Version (showVersion)
+import GHC.IO.Handle.FD (stdout)
+import Options.Applicative hiding ((<>))
+import Paths_tldr (version)
 import System.Directory
+import System.Environment (getArgs, withArgs)
 import System.FilePath
 import System.Process.Typed
-import System.Environment (getArgs, withArgs)
-import GHC.IO.Handle.FD (stdout)
-import Paths_tldr (version)
-import Data.Version (showVersion)
+import Tldr
 
 data TldrOpts = TldrOpts
   { pageName :: String
   } deriving (Show)
 
 tldrDirName :: String
-tldrDirName = ".tldr"
+tldrDirName = "tldr"
 
 repoHttpsUrl :: String
 repoHttpsUrl = "https://github.com/tldr-pages/tldr.git"
 
 checkDirs :: [String]
-checkDirs = ["common", "linux", "osx"]
+checkDirs = ["common", "linux", "osx", "windows", "sunos"]
 
 tldrInitialized :: IO Bool
 tldrInitialized = do
-  homeDir <- getHomeDirectory
-  let dir1 = homeDir </> tldrDirName
-      dir2 = homeDir </> tldrDirName </> "tldr"
-      pages = homeDir </> tldrDirName </> "tldr" </> "pages"
-  exists <- mapM doesDirectoryExist [dir1, dir2, pages]
+  dataDir <- getXdgDirectory XdgData tldrDirName
+  let dir2 = dataDir </> "tldr"
+      pages = dataDir </> "tldr" </> "pages"
+  exists <- mapM doesDirectoryExist [dataDir, dir2, pages]
   return $ all (== True) exists
 
 initializeTldrPages :: IO ()
 initializeTldrPages = do
   initialized <- tldrInitialized
-  initialized <- tldrInitialized
   unless initialized $ do
-    homeDir <- getHomeDirectory
-    let cloneDir = homeDir </> tldrDirName
-    runProcess_ $ proc "mkdir" [cloneDir]
-    runProcess_ $ setWorkingDir cloneDir $ proc "git" ["clone", repoHttpsUrl]
-
+    dataDir <- getXdgDirectory XdgData tldrDirName
+    createDirectoryIfMissing False dataDir
+    runProcess_ $ setWorkingDir dataDir $ proc "git" ["clone", repoHttpsUrl]
 
 updateTldrPages :: IO ()
 updateTldrPages = do
-  homeDir <- getHomeDirectory
-  let repoDir = homeDir </> tldrDirName </> "tldr"
+  dataDir <- getXdgDirectory XdgData tldrDirName
+  let repoDir = dataDir </> "tldr"
   repoExists <- doesDirectoryExist repoDir
-  when repoExists $ do
-    runProcess_ $ setWorkingDir repoDir $ proc "git" ["pull", "origin", "master"] 
+  case repoExists of
+    True ->
+      runProcess_ $
+      setWorkingDir (repoDir) $ proc "git" ["pull", "origin", "master"]
+    False -> initializeTldrPages
 
 updateOption :: Parser (a -> a)
 updateOption = infoOption "update" (long "update" <> help "Update tldr pages")
@@ -68,7 +67,9 @@
   where
     versionOption :: Parser (a -> a)
     versionOption =
-      infoOption (showVersion version) (long "version" <> short 'v' <> help "Show version")
+      infoOption
+        (showVersion version)
+        (long "version" <> short 'v' <> help "Show version")
 
 programOptions :: Parser TldrOpts
 programOptions =
@@ -83,29 +84,39 @@
 
 getPagePath :: String -> IO (Maybe FilePath)
 getPagePath page = do
-  homeDir <- getHomeDirectory
-  let pageDir = homeDir </> tldrDirName </> "tldr" </> "pages"
-      x@(f1:f2:f3:[]) = map (\x -> pageDir </> x </> page <.> "md") checkDirs
-#if MIN_VERSION_base(4,7,0)
-  f1' <- pageExists f1
-  f2' <- pageExists f2
-  f3' <- pageExists f3
-  return $ f1' <|> f2' <|> f3'
-#else
-  pageExists f1 <|> pageExists f2 <|> pageExists f3
-#endif
+  dataDir <- getXdgDirectory XdgData tldrDirName
+  let pageDir = dataDir </> "tldr" </> "pages"
+      paths = map (\x -> pageDir </> x </> page <.> "md") checkDirs
+  foldr1 (<|>) <$> mapM pageExists paths
 
+isOption :: String -> Bool
+isOption string = string `isPrefixOf` "--"
 
+hasOption :: [String] -> Bool
+hasOption xs = any isOption xs
+
 main :: IO ()
 main = do
   args <- getArgs
-  case execParserPure (prefs noBacktrack) tldrParserInfo args of
+  case execParserPure (prefs showHelpOnEmpty) tldrParserInfo args of
     failOpts@(Failure _)
       | args == ["--update"] -> updateTldrPages
-      | otherwise -> handleParseResult failOpts >> return ()
+      | otherwise ->
+        if hasOption args
+          then handleParseResult failOpts >> return ()
+          else do
+            let npage = intercalate "-" args
+            fname <- getPagePath npage
+            case fname of
+              Just path -> renderPage path stdout
+              Nothing ->
+                putStrLn ("No tldr entry for " <> (intercalate " " args))
     Success opts -> do
-         initializeTldrPages
-         let page = pageName opts
-         fname <- getPagePath page
-         maybe (putStrLn ("No tldr entry for " <> page)) (flip renderPage stdout) fname 
+      initializeTldrPages
+      let page = pageName opts
+      fname <- getPagePath page
+      maybe
+        (putStrLn ("No tldr entry for " <> page))
+        (flip renderPage stdout)
+        fname
     compOpts@(CompletionInvoked _) -> handleParseResult compOpts >> return ()
diff --git a/src/Tldr.hs b/src/Tldr.hs
--- a/src/Tldr.hs
+++ b/src/Tldr.hs
@@ -93,7 +93,7 @@
 
 
 handleSubsetNode :: Node -> Text
-handleSubsetNode (Node _ ntype xs) = handleSubsetNodeType ntype <> (T.concat $ Prelude.map handleSubsetNode xs)
+handleSubsetNode (Node _ ntype xs) = handleSubsetNodeType ntype <> T.concat (Prelude.map handleSubsetNode xs)
 
 handleParagraph :: [Node] -> Handle -> IO ()
 handleParagraph xs handle = TIO.hPutStrLn handle $ T.concat $ Prelude.map handleSubsetNode xs
@@ -105,7 +105,7 @@
 handleNode (Node _ ntype xs) handle = do
   changeConsoleSetting ntype
   renderNode ntype handle
-  mapM_ (\(Node _ ntype' ns) -> renderNode ntype' handle >> mapM_ (flip handleNode $ handle) ns) xs
+  mapM_ (\(Node _ ntype' ns) -> renderNode ntype' handle >> mapM_ (`handleNode` handle) ns) xs
   setSGR [Reset]
 
 parsePage :: FilePath -> IO Node
diff --git a/tldr.cabal b/tldr.cabal
--- a/tldr.cabal
+++ b/tldr.cabal
@@ -1,5 +1,5 @@
 name:                tldr
-version:             0.4.0.1
+version:             0.4.0.2
 synopsis:            Haskell tldr client
 description:         Haskell tldr client with support for updating and viewing tldr pages.
 homepage:            https://github.com/psibi/tldr-hs#readme
