diff --git a/Makefile b/Makefile
new file mode 100644
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,28 @@
+#
+# install, uninstall and friends ghc-tags-plugin in cabal store
+#
+
+CABAL_STORE = ${HOME}/.cabal/store/ghc-$(shell ghc --numeric-version)/package.db
+
+uninstall:
+	ghc-pkg unregister \
+	  --package-db=${CABAL_STORE} \
+	  --force \
+	  z-ghc-tags-plugin-z-ghc-tags-library \
+	  ghc-tags-plugin
+
+install:
+	cabal install --package-db=${CABAL_STORE} --lib ghc-tags-plugin
+
+reinstall: uninstall install
+
+list:
+	ghc-pkg list --package-db=${CABAL_STORE} | grep ghc-tags
+
+latest:
+	ghc-pkg latest --package-db=${CABAL_STORE} ghc-tags-plugin
+
+recache:
+	ghc-pkg recache --package-db=${CABAL_STORE}
+
+.PHONY: install, uninstall, reinstall, show, latest
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
 ghc >= 8.6
 ```
 
-# vim configuration
+# Vim configuration
 
 Each generated tags file is put next to the corresponding `*.cabal` file.  If
 you just have a repo with a cabal file in the main directory `vim` default
@@ -21,7 +21,7 @@
 :set tags+=*/tags
 ```
 
-# Plugin usage
+# Plugin configuration
 
 Configuration of this plugin requires some familiarity with `ghc` packages.
 Check out
diff --git a/ghc-tags-plugin.cabal b/ghc-tags-plugin.cabal
--- a/ghc-tags-plugin.cabal
+++ b/ghc-tags-plugin.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                ghc-tags-plugin
-version:             0.1.2.0
+version:             0.1.2.1
 synopsis:            A compiler plugin which generates tags file from GHC syntax tree.
 description:
   A compiler source plugin which takes parsed Haskell syntax tree and saves
@@ -13,6 +13,7 @@
 category:            Development
 extra-source-files:  CHANGELOG.md
                      README.md
+                     Makefile
 homepage:            https://github.com/coot/ghc-tags-plugin#readme
 bug-reports:         https://github.com/coot/ghc-tags-plugin/issues
 tested-with:         GHC==8.6.3, GHC==8.8.3
diff --git a/test/Test/Vim.hs b/test/Test/Vim.hs
--- a/test/Test/Vim.hs
+++ b/test/Test/Vim.hs
@@ -6,6 +6,7 @@
 import qualified Data.Attoparsec.Text as AT
 import qualified Data.ByteString.Builder as BB
 import qualified Data.ByteString.Lazy as BL
+import qualified Data.Char as Char
 import           Data.Maybe (isNothing)
 import           Data.Text   (Text)
 import qualified Data.Text as Text
@@ -33,8 +34,10 @@
       (fixText <$> arbitrary)
       (not . Text.null)
 
+-- filter only printable characters, removing tabs and newlines which have
+-- special role in vim tag syntax
 fixText :: Text -> Text
-fixText = Text.filter (\x -> x /= '\t' && x /= '\n' && x /= '\NUL')
+fixText = Text.filter (\x -> x /= '\t' && x /= '\n' && Char.isPrint x)
 
 
 genField :: Gen TagField
@@ -42,16 +45,23 @@
         TagField
     <$> suchThat g (not . Text.null)
     <*> g
-  where 
+  where
     g :: Gen Text
     g = fixFieldText <$> arbitrary
 
+-- filter only printable characters, removing tabs, newlines and colons which
+-- have special role in vim field syntax
 fixFieldText :: Text -> Text
-fixFieldText = Text.filter (\x -> x /= '\t' && x /= ':' && x /= '\n' && x /= '\NUL')
+fixFieldText = Text.filter (\x -> x /= '\t' && x /= ':' && x /= '\n' && Char.isPrint x)
 
+
+-- address cannot contain ";\"" sequence
 fixAddr :: Text -> Text
 fixAddr = fixText . Text.replace ";\"" ""
 
+wrap :: Char -> Text -> Text
+wrap c = Text.cons c . flip Text.snoc c
+
 genGhcKind :: Gen GhcKind
 genGhcKind = elements
   [ TkTerm
@@ -99,9 +109,10 @@
       <$> (TagName <$> genTextNonEmpty)
       <*> genTagKind
       <*> (TagFile <$> genTextNonEmpty)
-      <*> oneof
-            [ Left . getPositive <$> arbitrary
-            , Right . (Text.cons '/' . flip Text.snoc '/' . fixAddr) <$> genTextNonEmpty
+      <*> frequency
+            [ (2, Left . getPositive <$> arbitrary)
+            , (1, Right . (wrap '/' . fixAddr) <$> genTextNonEmpty)
+            , (1, Right . (wrap '?' . fixAddr) <$> genTextNonEmpty)
             ]
       <*> listOf genField
     shrink (ArbTag tag@Tag {tagName, tagFile, tagAddr, tagFields}) =
@@ -117,7 +128,7 @@
           | addr <- case tagAddr of
               Left  addr -> Left `map` shrink addr
               Right addr -> Left 0
-                          : (Right . Text.cons '/' . flip Text.snoc '/' . fixAddr)
+                          : (Right . wrap '/' . fixAddr)
                             `map` (shrink . stripEnds) addr
           ]
        ++ [ ArbTag $ tag { tagFields = fields }
@@ -130,15 +141,15 @@
             Just (_, addr') -> case Text.unsnoc addr' of
               Nothing -> error "impossible happend"
               Just (addr'', _) -> addr''
-            
 
+
 roundTrip :: Tag -> Property
 roundTrip tag =
   let bs   = BL.toStrict
            . BB.toLazyByteString
            . Vim.formatTag
            $ tag
-      mtag = AT.parseOnly Vim.parseTag 
+      mtag = AT.parseOnly Vim.parseTag
            . Text.decodeUtf8
            $ bs
   in case mtag of
