diff --git a/lib/Proteome/BufEnter.hs b/lib/Proteome/BufEnter.hs
new file mode 100644
--- /dev/null
+++ b/lib/Proteome/BufEnter.hs
@@ -0,0 +1,30 @@
+module Proteome.BufEnter(
+  bufEnter,
+) where
+
+import Data.List (intercalate)
+import Data.Maybe (maybeToList)
+import System.FilePath ((</>))
+import Neovim (buffer_set_option', Neovim, vim_get_current_buffer', toObject)
+import Ribosome.Config.Setting (setting)
+import Proteome.Data.Proteome (Proteome)
+import Proteome.Data.Project (Project(Project), ProjectMetadata(DirProject), ProjectRoot(ProjectRoot))
+import Proteome.Project (allProjects)
+import Proteome.Settings (tagsFileName)
+
+setBufferTags :: [String] -> Neovim e ()
+setBufferTags tags = do
+  buf <- vim_get_current_buffer'
+  buffer_set_option' buf "tags" (toObject $ intercalate "," tags)
+
+projectRoot :: Project -> Maybe FilePath
+projectRoot (Project (DirProject _ (ProjectRoot root) _) _ _ _) = Just root
+projectRoot _ = Nothing
+
+bufEnter :: Proteome ()
+bufEnter = do
+  pros <- allProjects
+  name <- setting tagsFileName
+  let roots = pros >>= maybeToList . projectRoot
+  let tags = fmap (</> name) roots
+  setBufferTags tags
diff --git a/lib/Proteome/PersistBuffers.hs b/lib/Proteome/PersistBuffers.hs
--- a/lib/Proteome/PersistBuffers.hs
+++ b/lib/Proteome/PersistBuffers.hs
@@ -15,7 +15,7 @@
 import System.Directory (doesFileExist)
 import System.FilePath ((</>))
 import Neovim (vim_get_current_buffer', vim_get_buffers', buffer_get_name', vim_command')
-import Ribosome.Api.Buffer (edit)
+import Ribosome.Api.Buffer (edit, buflisted)
 import Ribosome.Persist (persistStore, persistLoad)
 import Ribosome.Data.Ribo (lockOrSkip)
 import Proteome.Data.Proteome (Proteome)
@@ -52,7 +52,7 @@
   activeName <- buffer_get_name' active
   activeIsFile <- liftIO $ doesFileExist activeName
   let current' = if activeIsFile then Just activeName else Nothing
-  all' <- vim_get_buffers' >>= traverse buffer_get_name'
+  all' <- vim_get_buffers' >>= filterM buflisted >>= traverse buffer_get_name'
   files <- liftIO $ filterM doesFileExist all'
   persistStore (path </> "buffers") (PersistBuffers current' files)
 
diff --git a/lib/Proteome/Plugin.hs b/lib/Proteome/Plugin.hs
--- a/lib/Proteome/Plugin.hs
+++ b/lib/Proteome/Plugin.hs
@@ -1,12 +1,25 @@
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 module Proteome.Plugin(
   plugin,
 )
 where
 
+import Data.Default.Class (Default(def))
 import UnliftIO.STM (TVar)
-import Neovim (Plugin(..), function', Neovim, StartupConfig, NeovimConfig, NeovimPlugin, Synchronous(..), wrapPlugin)
+import Neovim (
+  Plugin(..),
+  function',
+  autocmd,
+  Neovim,
+  StartupConfig,
+  NeovimConfig,
+  NeovimPlugin,
+  Synchronous(..),
+  wrapPlugin,
+  acmdGroup
+  )
 import Ribosome.Data.Ribosome (Ribosome, newRibosome)
 import Proteome.Init (proteomePoll, proteomeStage1, proteomeStage2, proteomeStage4, initialize)
 import Proteome.Data.Env (Env)
@@ -14,6 +27,7 @@
 import Proteome.Config (proReadConfig)
 import Proteome.Tags (proTags)
 import Proteome.Save (proSave)
+import Proteome.BufEnter (bufEnter)
 
 plugin' :: Ribosome (TVar Env) -> Plugin (Ribosome (TVar Env))
 plugin' env =
@@ -27,7 +41,8 @@
       $(function' 'proAdd) Async,
       $(function' 'proSave) Async,
       $(function' 'proTags) Async,
-      $(function' 'proReadConfig) Sync
+      $(function' 'proReadConfig) Sync,
+      $(autocmd 'bufEnter) "BufEnter" def { acmdGroup = Just "proteome" }
     ]
   }
 
diff --git a/lib/Proteome/Project.hs b/lib/Proteome/Project.hs
new file mode 100644
--- /dev/null
+++ b/lib/Proteome/Project.hs
@@ -0,0 +1,14 @@
+module Proteome.Project(
+  allProjects,
+) where
+
+import qualified Ribosome.Data.Ribo as Ribo (inspect)
+import Proteome.Data.Proteome (Proteome)
+import Proteome.Data.Project (Project)
+import Proteome.Data.Env (Env(mainProject, projects))
+
+allProjects :: Proteome [Project]
+allProjects = do
+  main <- Ribo.inspect mainProject
+  extra <- Ribo.inspect projects
+  return $ main : extra
diff --git a/lib/Ribosome/Api/Buffer.hs b/lib/Ribosome/Api/Buffer.hs
--- a/lib/Ribosome/Api/Buffer.hs
+++ b/lib/Ribosome/Api/Buffer.hs
@@ -1,9 +1,19 @@
 module Ribosome.Api.Buffer(
   edit,
+  buflisted,
 ) where
 
-import Neovim (vim_command')
+import Neovim (Neovim, vim_command', Buffer, NvimObject(..), vim_call_function', Object, buffer_get_number')
 import Ribosome.Data.Ribo (Ribo)
 
 edit :: FilePath -> Ribo e ()
 edit path = vim_command' $ "silent! edit " ++ path
+
+nvimCallBool :: String -> [Object] -> Neovim e Bool
+nvimCallBool fun args =
+  vim_call_function' fun args >>= fromObject'
+
+buflisted :: Buffer -> Neovim e Bool
+buflisted buf = do
+  num <- buffer_get_number' buf
+  nvimCallBool "buflisted" [toObject num]
diff --git a/proteome.cabal b/proteome.cabal
--- a/proteome.cabal
+++ b/proteome.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 5fba2c152bddc90f0d4e9642ee33b0cd2b1591db5f4aec89a3d3558ef9c00e17
+-- hash: d351a462fd991c12f14990526d369c7f0c7e0497ef67def82fa7175b6b2a1f82
 
 name:           proteome
-version:        0.3.10.0
+version:        0.3.11.0
 synopsis:       neovim project manager
 description:    Please see the README on GitHub at <https://github.com/tek/proteome-hs>
 category:       Neovim
@@ -29,6 +29,7 @@
 library
   exposed-modules:
       Proteome.Add
+      Proteome.BufEnter
       Proteome.Config
       Proteome.Data.AddOptions
       Proteome.Data.Env
@@ -40,6 +41,7 @@
       Proteome.Log
       Proteome.PersistBuffers
       Proteome.Plugin
+      Proteome.Project
       Proteome.Project.Resolve
       Proteome.Save
       Proteome.Settings
@@ -190,8 +192,10 @@
   other-modules:
       AddSpec
       Config
+      MultiSpec
       PersistLoadSpec
       PersistStoreSpec
+      Project
       ResolveSpec
       TagsSpec
       Paths_proteome
diff --git a/test/u/AddSpec.hs b/test/u/AddSpec.hs
--- a/test/u/AddSpec.hs
+++ b/test/u/AddSpec.hs
@@ -15,9 +15,6 @@
 import Proteome.Data.Env (projects)
 import Proteome.Data.AddOptions (AddOptions(AddOptions))
 import Proteome.Data.Project (
-  ProjectName(ProjectName),
-  ProjectType(ProjectType),
-  ProjectLang(ProjectLang),
   ProjectRoot(ProjectRoot),
   ProjectMetadata(DirProject),
   Project(Project),
@@ -25,30 +22,16 @@
 import qualified Proteome.Settings as S (projectBaseDirs)
 import Proteome.Test.Unit (specWithDef)
 import Config (vars)
-
-flag :: String
-flag = "flagellum"
-
-hask :: String
-hask = "haskell"
-
-n :: ProjectName
-n = ProjectName flag
-
-tp :: ProjectType
-tp = ProjectType hask
-
-l :: ProjectLang
-l = ProjectLang hask
+import Project (flag, hask, fn, tp, l)
 
 addSpec :: Proteome ()
 addSpec = do
   projectsDir <- fixture "projects"
   updateSetting S.projectBaseDirs [projectsDir]
-  proAdd $ AddOptions n tp
+  proAdd $ AddOptions fn tp
   ps <- Ribo.inspect projects
   let root = projectsDir </> hask </> flag
-  liftIO $ assertEqual [Project (DirProject n (ProjectRoot root) (Just tp)) [] (Just l) []] ps
+  liftIO $ assertEqual [Project (DirProject fn (ProjectRoot root) (Just tp)) [] (Just l) []] ps
 
 test_add :: IO ()
 test_add = vars >>= specWithDef addSpec
diff --git a/test/u/MultiSpec.hs b/test/u/MultiSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/u/MultiSpec.hs
@@ -0,0 +1,49 @@
+{-# OPTIONS_GHC -F -pgmF htfpp #-}
+
+module MultiSpec(
+  htf_thisModulesTests
+) where
+
+import Control.Monad.IO.Class (liftIO)
+import System.FilePath ((</>))
+import System.Directory (doesFileExist)
+import Test.Framework
+import Neovim (fromObject', vim_get_current_buffer', buffer_get_option')
+import Ribosome.Config.Setting (updateSetting)
+import Ribosome.Test.Unit (tempDir)
+import Proteome.Data.Proteome (Proteome)
+import Proteome.Add (proAdd)
+import Proteome.Data.AddOptions (AddOptions(AddOptions))
+import qualified Proteome.Settings as S (projectBaseDirs)
+import Proteome.Tags (proTags)
+import Proteome.Test.Unit (specWithDef)
+import Proteome.BufEnter (bufEnter)
+import qualified Proteome.Settings as PS (tagsCommand, tagsArgs, tagsFork)
+import Config (vars)
+import Project (flag, cil, hask, cn, fn, tp, createTestProject)
+
+multiSpec :: Proteome ()
+multiSpec = do
+  projectsDir <- tempDir "multi/projects"
+  updateSetting S.projectBaseDirs [projectsDir]
+  createTestProject tp fn
+  createTestProject tp cn
+  updateSetting PS.tagsCommand "touch"
+  updateSetting PS.tagsArgs ".tags"
+  updateSetting PS.tagsFork False
+  proAdd $ AddOptions fn tp
+  proAdd $ AddOptions cn tp
+  proTags
+  bufEnter
+  let ftags = projectsDir </> hask </> flag </> ".tags"
+  let ctags = projectsDir </> hask </> cil </> ".tags"
+  ftagsExists <- liftIO $ doesFileExist ftags
+  ctagsExists <- liftIO $ doesFileExist ctags
+  buf <- vim_get_current_buffer'
+  tags <- buffer_get_option' buf "tags" >>= fromObject'
+  liftIO $ assertEqual ftagsExists True
+  liftIO $ assertEqual ctagsExists True
+  liftIO $ assertEqual (ftags ++ "," ++ ctags) tags
+
+test_multi :: IO ()
+test_multi = vars >>= specWithDef multiSpec
diff --git a/test/u/Project.hs b/test/u/Project.hs
new file mode 100644
--- /dev/null
+++ b/test/u/Project.hs
@@ -0,0 +1,48 @@
+module Project(
+  flag,
+  hask,
+  cn,
+  tp,
+  l,
+  fn,
+  cil,
+  createTestProject,
+) where
+
+import Control.Monad.IO.Class (liftIO)
+import System.FilePath ((</>))
+import System.Directory (createDirectoryIfMissing)
+import Ribosome.Config.Setting (setting)
+import Ribosome.Data.Ribo (Ribo)
+import qualified Proteome.Settings as S (projectBaseDirs)
+import Proteome.Data.Project (
+  ProjectName(ProjectName),
+  ProjectType(ProjectType),
+  ProjectLang(ProjectLang),
+  )
+
+flag :: String
+flag = "flagellum"
+
+hask :: String
+hask = "haskell"
+
+cil :: String
+cil = "cilia"
+
+fn :: ProjectName
+fn = ProjectName flag
+
+cn :: ProjectName
+cn = ProjectName cil
+
+tp :: ProjectType
+tp = ProjectType hask
+
+l :: ProjectLang
+l = ProjectLang hask
+
+createTestProject :: ProjectType -> ProjectName -> Ribo e ()
+createTestProject (ProjectType tpe) (ProjectName name) = do
+  bases <- setting S.projectBaseDirs
+  liftIO $ createDirectoryIfMissing True (head bases </> tpe </> name)
diff --git a/test/u/SpecMain.hs b/test/u/SpecMain.hs
--- a/test/u/SpecMain.hs
+++ b/test/u/SpecMain.hs
@@ -7,6 +7,7 @@
 import {-@ HTF_TESTS @-} PersistLoadSpec
 import {-@ HTF_TESTS @-} PersistStoreSpec
 import {-@ HTF_TESTS @-} AddSpec
+import {-@ HTF_TESTS @-} MultiSpec
 import Test.Framework
 import Test.Framework.BlackBoxTest ()
 
