diff --git a/src/Yi/CompletionTree.hs b/src/Yi/CompletionTree.hs
--- a/src/Yi/CompletionTree.hs
+++ b/src/Yi/CompletionTree.hs
@@ -39,6 +39,7 @@
 import           Data.ListLike       (ListLike)
 import           Lens.Micro.Platform (over, Lens', _2, (.~), (&))
 import           Data.Binary         (Binary)
+import           Data.Semigroup      (Semigroup)
 
 -- | A CompletionTree is a map of partial completions.
 --
@@ -60,7 +61,7 @@
 -- (The empty strings are needed to denote the end of a word)
 -- (A CompletionTree is not limited to a binary tree)
 newtype CompletionTree a = CompletionTree {_unCompletionTree :: (Map a (CompletionTree a))}
-  deriving (Monoid, Eq, Binary)
+  deriving (Semigroup, Monoid, Eq, Binary)
 
 unCompletionTree :: Lens' (CompletionTree a) (Map a (CompletionTree a))
 unCompletionTree f ct = (\unCompletionTree' -> ct {_unCompletionTree = unCompletionTree'}) <$>
diff --git a/src/Yi/Config/Default.hs b/src/Yi/Config/Default.hs
--- a/src/Yi/Config/Default.hs
+++ b/src/Yi/Config/Default.hs
@@ -94,6 +94,7 @@
            , configAutoHideTabBar = True
            , configWindowFill = ' '
            , configTheme = defaultTheme
+           , configLineNumbers = False
            }
          , defaultKm        = modelessKeymapSet nilKeymap
          , startActions     = mempty
diff --git a/src/Yi/Config/Simple.hs b/src/Yi/Config/Simple.hs
--- a/src/Yi/Config/Simple.hs
+++ b/src/Yi/Config/Simple.hs
@@ -77,6 +77,7 @@
   lineWrap,
   windowFill,
   theme,
+  lineNumbers,
   -- ** Layout
   layoutManagers,
   -- * Debugging
@@ -147,7 +148,7 @@
                            CursorStyle(..), configLeftSideScrollBarA,
                            configAutoHideScrollBarA, configAutoHideTabBarA,
                            configLineWrapA, configWindowFillA, configThemeA,
-                           layoutManagersA, configVarsA,
+                           layoutManagersA, configVarsA, configLineNumbersA
                            )
 
 
@@ -286,6 +287,10 @@
 -- | UI colour theme.
 theme :: Field Theme
 theme = configUIA . configThemeA
+
+-- | Line numbers.
+lineNumbers :: Field Bool
+lineNumbers = configUIA . configLineNumbersA
 
 ---------- Layout
 -- | List of registered layout managers. When cycling through layouts,
diff --git a/src/Yi/Core.hs b/src/Yi/Core.hs
--- a/src/Yi/Core.hs
+++ b/src/Yi/Core.hs
@@ -164,14 +164,13 @@
 postActions :: IsRefreshNeeded -> [Action] -> YiM ()
 postActions refreshNeeded actions = do yi <- ask; liftBase $ yiOutput yi refreshNeeded actions
 
--- | Display the errors buffer if it is not already visible.
+-- | Display the errors buffer in a new split window if it exists.
 showErrors :: YiM ()
 showErrors = withEditor $ do
-               bs <- gets $ findBufferWithName "*errors*"
-               case bs of
-                 [] -> return ()
-                 _  -> do splitE
-                          switchToBufferWithNameE "*errors*"
+               bs <- gets $ doesBufferNameExist "*errors*"
+               when bs $ do 
+                 splitE
+                 switchToBufferWithNameE "*errors*"
 
 -- | Process events by advancing the current keymap automaton and
 -- executing the generated actions.
diff --git a/src/Yi/Editor.hs b/src/Yi/Editor.hs
--- a/src/Yi/Editor.hs
+++ b/src/Yi/Editor.hs
@@ -33,6 +33,7 @@
                  , currentWindowA
                  , deleteBuffer
                  , deleteTabE
+                 , doesBufferNameExist
                  , emptyEditor
                  , findBuffer
                  , findBufferWith
@@ -128,7 +129,7 @@
 import qualified Data.Monoid                    as Mon ((<>))
 import           Data.Semigroup                 ((<>))
 import qualified Data.Sequence                  as S
-import qualified Data.Text                      as T (Text, null, pack, unlines, unpack, unwords)
+import qualified Data.Text                      as T (Text, null, pack, unlines, unpack, unwords, isInfixOf)
 import           System.FilePath                (splitPath)
 import           Yi.Buffer
 import           Yi.Config
@@ -335,16 +336,21 @@
 findBufferWithName :: T.Text -> Editor -> [BufferRef]
 findBufferWithName n e =
   let bufs = M.elems $ buffers e
-      sameIdent b = shortIdentString (length $ commonNamePrefix e) b == n
-  in map bkey $ filter sameIdent bufs
+      hasInfix b = n `T.isInfixOf` identString b
+  in map bkey $ filter hasInfix bufs
 
+doesBufferNameExist :: T.Text -> Editor -> Bool
+doesBufferNameExist n e =
+  not $ null $ filter ((== n) . identString) $ M.elems $ buffers e
+
 -- | Find buffer with given name. Fail if not found.
 getBufferWithName :: MonadEditor m => T.Text -> m BufferRef
 getBufferWithName bufName = withEditor $ do
   bs <- gets $ findBufferWithName bufName
   case bs of
     [] -> fail ("Buffer not found: " ++ T.unpack bufName)
-    b:_ -> return b
+    [b] -> return b
+    _ -> fail ("Ambiguous buffer name: " ++ T.unpack bufName)
 
 ------------------------------------------------------------------------
 -- | Perform action with any given buffer, using the last window that
@@ -804,9 +810,9 @@
   e <- gets id
   -- increment the index of the hint until no buffer is found with that name
   let find_next currentName (nextName:otherNames) =
-          case findBufferWithName currentName e of
-            (_b : _) -> find_next nextName otherNames
-            []      -> currentName
+          if doesBufferNameExist currentName e
+            then find_next nextName otherNames
+            else currentName
       find_next _ [] = error "Looks like nearly infinite list has just ended."
       next_tmp_name = find_next name names
       (name : names) = (fmap (("tmp-" Mon.<>) . T.pack . show) [0 :: Int ..])
diff --git a/src/Yi/Eval.hs b/src/Yi/Eval.hs
--- a/src/Yi/Eval.hs
+++ b/src/Yi/Eval.hs
@@ -49,7 +49,8 @@
 import Data.Foldable ( mapM_ )
 import qualified Data.HashMap.Strict as M
     ( HashMap, insert, lookup, empty, keys )
-import Data.Monoid ( (<>) )
+import Data.Monoid ((<>))
+import Data.Semigroup ( Semigroup )
 import Data.Typeable ( Typeable )
 #ifdef HINT
 import Control.Concurrent
@@ -307,7 +308,7 @@
 
 newtype PublishedActions = PublishedActions {
     _publishedActions :: M.HashMap String Action
-  } deriving(Typeable, Monoid)
+  } deriving(Typeable, Semigroup, Monoid)
 
 instance Default PublishedActions where def = mempty
 
diff --git a/src/Yi/Interact.hs b/src/Yi/Interact.hs
--- a/src/Yi/Interact.hs
+++ b/src/Yi/Interact.hs
@@ -1,9 +1,11 @@
-{-# LANGUAGE FlexibleInstances      #-}
-{-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE GADTs                  #-}
-{-# LANGUAGE OverloadedStrings      #-}
-{-# LANGUAGE ScopedTypeVariables    #-}
-{-# LANGUAGE UndecidableInstances   #-}
+{-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE FunctionalDependencies     #-}
+{-# LANGUAGE GADTs                      #-}
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE ScopedTypeVariables        #-}
+{-# LANGUAGE UndecidableInstances       #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE CPP                        #-}
 {-# OPTIONS_HADDOCK show-extensions #-}
 
 {-|
@@ -221,6 +223,11 @@
 
 -- | Abstraction of the automaton state.
 data InteractState event w =  Ambiguous [(Int,w,P event w)] | Waiting | Dead | Running w (P event w)
+
+#if __GLASGOW_HASKELL__ >= 804 
+instance Semigroup (InteractState event w) where
+  (<>) = mappend
+#endif
 
 instance Monoid (InteractState event w) where
     -- not used at the moment:
diff --git a/src/Yi/Paths.hs b/src/Yi/Paths.hs
--- a/src/Yi/Paths.hs
+++ b/src/Yi/Paths.hs
@@ -4,7 +4,6 @@
 module Yi.Paths ( getEvaluatorContextFilename
                 , getConfigFilename
                 , getConfigModules
-                , getArticleDbFilename
                 , getPersistentStateFilename
                 , getConfigDir
                 , getConfigPath
@@ -58,15 +57,12 @@
 
 -- Below are all points that are used in Yi code (to keep it clean.)
 getEvaluatorContextFilename, getConfigFilename, getConfigModules,
-    getArticleDbFilename, getPersistentStateFilename :: (MonadBase IO m) => m FilePath
+    getPersistentStateFilename :: (MonadBase IO m) => m FilePath
 
 -- | Get Yi master configuration script.
 getConfigFilename = getConfigPath "yi.hs"
 
 getConfigModules = getConfigPath "modules"
-
--- | Get articles.db database of locations to visit (for Yi.IReader.)
-getArticleDbFilename = getConfigPath "articles.db"
 
 -- | Get path to Yi history that stores state between runs.
 getPersistentStateFilename = getDataPath "history"
diff --git a/src/Yi/Types.hs b/src/Yi/Types.hs
--- a/src/Yi/Types.hs
+++ b/src/Yi/Types.hs
@@ -394,7 +394,8 @@
    configWindowFill :: Char,
    -- ^ The char with which to fill empty window space.  Usually '~' for vi-like
    -- editors, ' ' for everything else.
-   configTheme :: Theme             -- ^ UI colours
+   configTheme :: Theme,            -- ^ UI colours
+   configLineNumbers :: Bool        -- ^ Should we show line numbers by default?
   }
 
 
diff --git a/src/Yi/UI/LineNumbers.hs b/src/Yi/UI/LineNumbers.hs
new file mode 100644
--- /dev/null
+++ b/src/Yi/UI/LineNumbers.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# OPTIONS_HADDOCK show-extensions #-}
+
+-- |
+-- Module      :  Yi.UI.LineNumbers
+-- License     :  GPL-2
+-- Maintainer  :  yi-devel@googlegroups.com
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- Line numbers.
+
+module Yi.UI.LineNumbers
+  ( getDisplayLineNumbersLocal
+  , setDisplayLineNumbersLocal
+  ) where
+
+import           Data.Binary    (Binary (..))
+import           Data.Default   (Default (..))
+import           Data.Typeable  (Typeable)
+import           GHC.Generics   (Generic)
+import           Yi.Buffer      (getBufferDyn, putBufferDyn)
+import           Yi.Types       (BufferM, YiVariable)
+
+newtype DisplayLineNumbersLocal = DisplayLineNumbersLocal { unDisplayLineNumbersLocal :: Maybe Bool }
+  deriving (Generic, Typeable)
+
+instance Default DisplayLineNumbersLocal where
+  def = DisplayLineNumbersLocal Nothing
+
+instance Binary DisplayLineNumbersLocal
+
+instance YiVariable DisplayLineNumbersLocal
+
+-- | Get the buffer-local line number setting.
+getDisplayLineNumbersLocal :: BufferM (Maybe Bool)
+getDisplayLineNumbersLocal = unDisplayLineNumbersLocal <$> getBufferDyn
+
+-- | Set the buffer-local line number setting.
+-- Nothing: use global setting
+-- Just True: display line numbers only in this buffer
+-- Just False: hide line numbers only in this buffer
+setDisplayLineNumbersLocal :: Maybe Bool -> BufferM ()
+setDisplayLineNumbersLocal = putBufferDyn . DisplayLineNumbersLocal
diff --git a/yi-core.cabal b/yi-core.cabal
--- a/yi-core.cabal
+++ b/yi-core.cabal
@@ -1,5 +1,5 @@
 name:           yi-core
-version:        0.17.1
+version:        0.18.0
 synopsis:       Yi editor core library
 category:       Yi
 homepage:       https://github.com/yi-editor/yi#readme
@@ -51,7 +51,7 @@
     , unix-compat >= 0.1
     , unordered-containers >= 0.1.3
     , xdg-basedir >= 0.2.1
-    , yi-language >= 0.17
+    , yi-language >= 0.18
     , yi-rope >= 0.10
     , exceptions
   if flag(hint)
@@ -123,6 +123,7 @@
       Yi.TextCompletion
       Yi.Types
       Yi.UI.Common
+      Yi.UI.LineNumbers
       Yi.UI.SimpleLayout
       Yi.UI.TabBar
       Yi.UI.Utils
