diff --git a/rasa-ext-files.cabal b/rasa-ext-files.cabal
--- a/rasa-ext-files.cabal
+++ b/rasa-ext-files.cabal
@@ -1,5 +1,5 @@
 name: rasa-ext-files
-version: 0.1.3
+version: 0.1.4
 cabal-version: >=1.10
 build-type: Simple
 license: GPL-3
@@ -22,13 +22,13 @@
         Rasa.Ext.Files
     build-depends:
         base >=4.8 && <5,
-        rasa >=0.1.9 && <0.2,
-        rasa-ext-views >=0.1.3 && <0.2,
-        rasa-ext-status-bar >=0.1.3 && <0.2,
+        rasa >=0.1.10 && <0.2,
+        rasa-ext-views >=0.1.4 && <0.2,
         rasa-ext-cmd >=0.1.2 && <0.2,
         data-default >=0.7.1.1 && <0.8,
         lens ==4.14.*,
         text >=1.2.2.1 && <1.3,
+        mtl >=2.2.1 && <2.3,
         yi-rope >=0.7.0.2 && <0.8
     default-language: Haskell2010
     hs-source-dirs: src
diff --git a/src/Rasa/Ext/Files.hs b/src/Rasa/Ext/Files.hs
--- a/src/Rasa/Ext/Files.hs
+++ b/src/Rasa/Ext/Files.hs
@@ -1,4 +1,6 @@
-{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}
+{-# language
+   OverloadedStrings
+#-}
 
 module Rasa.Ext.Files
   ( files
@@ -6,66 +8,106 @@
   ) where
 
 import qualified Data.Text.IO as TIO
-import Control.Lens
 import System.Environment
 
-import Data.Foldable
 import Data.Typeable
 import Data.Default
-import Data.Monoid
+import Data.Maybe
 
-import Control.Monad.IO.Class
+import Control.Monad
+import Control.Monad.Trans
 import qualified Yi.Rope as Y
 
 import Rasa.Ext
 import Rasa.Ext.Views
 import Rasa.Ext.Cmd
-import Rasa.Ext.StatusBar
 
-data FileInfo = FileInfo
-  { _filename :: Maybe Y.YiString
-  } deriving (Typeable, Show, Eq)
-
-makeLenses ''FileInfo
+-- | Stores filename
+data FileInfo =
+  FileInfo (Maybe String)
+  deriving (Typeable, Show, Eq)
 
 instance Default FileInfo where
-  def = FileInfo {
-  _filename=Nothing
-}
+  def = FileInfo Nothing
 
+type Filename = String
+
+-- | Stores File status; Clean means all changes are saved
+data FileStatus =
+  Dirty
+  | Clean
+  deriving Show
+
+instance Default FileStatus where
+  def = Clean
+
+-- | Returns 'FileStatus' of current buffer
+getFileStatus :: BufAction FileStatus
+getFileStatus = getBufExt
+
+-- | Sets 'FileStatus' of current buffer
+setFileStatus :: FileStatus -> BufAction ()
+setFileStatus = setBufExt
+
+-- | Gets filename of current buffer
+getFilename :: BufAction (Maybe Filename)
+getFilename = do
+  FileInfo filename <- getBufExt
+  return filename
+
+-- | Main export, use this in your Rasa config
 files :: Action ()
-files = do 
-  beforeEveryRender_ showFilename
-  onInit $ do
+files = do
+  onEveryNewBuffer_ $ do
+    void . onBufTextChanged $ bufferChanged
+    void . addTopStatus $ fileStatus
+    void . addTopStatus $ (fmap Y.fromString <$> getFilename)
+
+  afterInit $ do
     loadFiles
-    addCmd "save" $ focusDo_ . saveAs . Y.fromString
+    addCmd "save" $ focusDo_ . saveAs
 
-showFilename :: Action ()
-showFilename = focusDo_ $ do
-  mName <- use $ bufExt.filename
-  traverse_ (leftStatus . disp) mName
-      where disp name = "<" <> name <> ">"
+-- | Renders the current file status
+fileStatus :: BufAction (Maybe RenderInfo)
+fileStatus = do
+  hasFilename <- isJust <$> getFilename
+  status <- getFileStatus
+  if hasFilename
+    then return . Just $
+       case status of
+         Dirty -> styleText "✘" $ fg Red
+         Clean -> styleText "✓" $ fg Green
+    else return Nothing
 
-saveAs :: Y.YiString -> BufAction ()
-saveAs fName = getText >>= liftIO . TIO.writeFile (Y.toString fName) . Y.toText
+-- | Keeps track of buffer status
+bufferChanged :: BufTextChanged -> BufAction ()
+bufferChanged _ = setFileStatus Dirty
 
+saveAs :: String -> BufAction ()
+saveAs fName = getText >>= liftIO . TIO.writeFile fName . Y.toText
+
+-- | Save the buffer if we have a filename
 save :: BufAction ()
 save = do
-  mName <- use $ bufExt.filename
+  FileInfo mName <- getBufExt
   case mName of
     Just fName -> saveAs fName
     Nothing -> return ()
+  setFileStatus Clean
 
-setFilename :: Y.YiString -> BufAction ()
-setFilename fname = bufExt.filename ?= fname
+-- | Set the filename
+setFilename :: String -> BufAction ()
+setFilename fname = setBufExt $ FileInfo (Just fname)
 
-addFile :: Y.YiString -> Y.YiString -> Action ()
+-- | Add a buffer for a file
+addFile :: String -> Y.YiString -> Action ()
 addFile fname txt = do
-  newBuf <- newBuffer txt
+  newBuf <- addBuffer txt
   bufDo_ newBuf (setFilename fname)
 
+-- | Load files from command line
 loadFiles :: Action ()
 loadFiles = do
   fileNames <- liftIO getArgs
   fileTexts <- liftIO $ traverse TIO.readFile fileNames
-  mapM_ (uncurry addFile) $ zip (Y.fromString <$> fileNames) (Y.fromText <$> fileTexts)
+  mapM_ (uncurry addFile) $ zip fileNames (Y.fromText <$> fileTexts)
