diff --git a/changes.txt b/changes.txt
--- a/changes.txt
+++ b/changes.txt
@@ -1,3 +1,9 @@
+0.1.1.3
+-------
+
+- Released Mon 15 Jun 2015 23:29:49 CEST
+- fixmes and xxx issues now get a free [fixme]/[xxx] tag
+
 0.1.1.2
 -------
 
diff --git a/doc/usr/page.rst b/doc/usr/page.rst
--- a/doc/usr/page.rst
+++ b/doc/usr/page.rst
@@ -128,6 +128,8 @@
 
 Tags are single words which are useful to catalogue and identify issues. Use
 them aplenty as they will make slicing and dicing your issue-base a breeze.
+Since the semantic of ``FIXME`` and ``XXX`` is specific (in respect to the
+usual ``TODO``), they are automatically added as a tag.
 
 As now lentil parses:
 
diff --git a/issues.txt b/issues.txt
--- a/issues.txt
+++ b/issues.txt
@@ -7,20 +7,32 @@
         haskell and stuff [feature:intermediate]
     16  html report, come hlint [feature:advanced]
     17  symlinks? [feature:intermediate]
-    18  le ricerche è meglio che siano case unsensitive [feature:basic]
-    19  check --output pretty, there are trailing white spaces [bug] [u:1]
-    20  test con 7.6.3 [feature:basic] [test]
-    21  todo/fixmes in different sections [request] [u:3]
- 
-src/Lentil.hs
-    13  compile with O2? [refactor]
-    36  clean these nested ifs up [lint]
+    18  check --output pretty, there are trailing white spaces [bug] [u:1]
+    19  test con 7.6.3 [feature:basic] [test]
+    20  todo/fixmes in different sections [request] [u:3]
+    21  linux kernel, lentil si inceppa su dei caratteri [bug]
+    22  da cabal a hpack [u:1] [feature:advanced]
+    23  ad oggi veramente lento [u:2] [refactor]
+    24  list 'ok' tags somehow? put them in doc? [doc] [design]
+    25  sm: issue numbers is valuable [design] [request]
+    26  sm: have a way to link to discussion/history of issue [design]
+        [request]
+    27  sm: 1. lentil autogenerates numbers where missing adding tags, 2.
+        creates an associated numbered file in .issues/, displays
+        associated notes written in those files is asked, 3. even update
+        them when there is a source change. (4) these files could be
+        webserved when they want something linkable. Vedi comments in
+        doc/dev/issues.txt [design] [request]
+    33  chickpea, lentil's brother. Two commands, add number to numberless
+        tag (#1212 or something), create a mini db with those issues, which
+        automatically updated and you can even write stuff in there. O
+        maybe you can even add lentil, chickpea and quinoa. Vedi more in
+        doc/dev/issues.txt [design]
  
 src/Lentil/Args.hs
-    23  show help option in lentil short help [feature:intermediate]
-    24  disambiguation optparse-applicative [feature:intermediate]
-    25  help as lentil PATH [ PATH... ] [ OPTIONS ] [feature:intermediate]
-    90  uncomment and implement sorting [feature:intermediate]
+    23  disambiguation optparse-applicative [feature:intermediate]
+    24  help as lentil PATH [ PATH... ] [ OPTIONS ] [feature:intermediate]
+    89  uncomment and implement sorting [feature:intermediate]
  
 src/Lentil/File.hs
     49  combine funziona su windows? [feature:intermediate]
@@ -44,14 +56,16 @@
     83  lint program parser [lint]
     87  manyTill1 broken? occhio che al primon on chiama ed! [test]
    102  ugly parens [lint] [refactor]
-   115  add more langparsers [feature:intermediate]
-   116  fallo che sia estensibile e leggibile a compilazione [design] [u:3]
+   116  add langparsers che sia estensibile e leggibile a compilazione
+        [u:3]
    155  ugly hack to allow tODOs to be parseable even in first line. This
         is coupled with another hack in parser `issue` (another module).
         [refactor] [lint] [duct]
  
-src/Lentil/Query.hs
-    21  filtering case unsensitive? [test]
+src/Lentil/Print.hs
+    43  colours are bad for unix philosophy, remove them? hlint manages to
+        get a colorised output when ran alone but not when piped to less,
+        how? [design]
  
 test/Lentil/ArgsSpec.hs
     12  can't test lOpts, need to make a runner and a validator on the
diff --git a/lentil.cabal b/lentil.cabal
--- a/lentil.cabal
+++ b/lentil.cabal
@@ -1,5 +1,5 @@
 name:                lentil
-version:             0.1.1.2
+version:             0.1.1.3
 synopsis:            frugal issue tracker
 description:         minumum effort, cohesive issue tracker based on
                      ubiquitous @TODO@s and @FIXME@s conventions.
@@ -33,7 +33,7 @@
 
 
 executable lentil
-  main-is:             Lentil.hs
+  main-is:             Main.hs
   build-depends:       base >=4.7 && <4.9, optparse-applicative >=0.11 && <0.12,
                        regex-tdfa >=1.2 && <1.3, natural-sort >=0.1 && <0.2,
                        parsec >=3.1 && <3.2, filepath >=1.3 && <1.5,
diff --git a/src/Lentil.hs b/src/Lentil.hs
deleted file mode 100644
--- a/src/Lentil.hs
+++ /dev/null
@@ -1,53 +0,0 @@
-import Lentil.Types
-import Lentil.Args
-import Lentil.File
-import Lentil.Print
-import Lentil.Query
-import Lentil.Export
-
-import Options.Applicative
-
-import qualified Data.Maybe as M
-import Data.Monoid
-
--- TODO: compile with O2? [refactor]
-
-main :: IO ()
-main = execParser opts >>= runLentil
-    where opts = info (helpOvert <*> lOpts <* version)
-            ( fullDesc <>
-              header "lentil - a frugal issue tracker" )
-
--- overt help text (even in condensed help)
-helpOvert :: Parser (a -> a)
-helpOvert = abortOption ShowHelpText $ mconcat [ long "help",
-                                                 short 'h',
-                                                 help "Show this help text" ]
-
-version = infoOption versionCopy ( long "version" <>
-                                   short 'v'      <>
-                                   help "show version and copyright info" )
-    where
-          versionCopy = "lentil - a frugal issue tracker, version 0.1.1.2\n\
-                        \(C) 2015 Francesco Ariis - http://www.ariis.it\n\
-                        \released under the GNU General Public License 3"
-
-
-runLentil :: LOptions -> IO ()
-runLentil lo = uncurry findIssues (loInExcl lo) >>= \is -> -- grab issues
-               let fil = filterAnd (loFilters lo) is       -- filtered
-                   ord = chainSorts fil (loSort lo) in     -- ordered
-
-               case loOutFile lo of
-
-                 -- std output
-                 Nothing -> case loFormat lo of
-                              Csv    -> putStrLn (issues2CSV is)
-                              Pretty -> putStrLn (ppIssues True ord)
-                              TagPop -> putStrLn (ppPopularity True is)
-
-                 Just fp -> case loFormat lo of
-                              Csv    -> writeFile fp (issues2CSV is)
-                              Pretty -> writeFile fp (ppIssues False ord)
-                              TagPop -> writeFile fp (ppPopularity False is)
-
diff --git a/src/Lentil/Args.hs b/src/Lentil/Args.hs
--- a/src/Lentil/Args.hs
+++ b/src/Lentil/Args.hs
@@ -20,7 +20,6 @@
 -- TYPES --
 -----------
 
--- TODO: show help option in lentil short help [feature:intermediate]
 -- TODO: disambiguation optparse-applicative [feature:intermediate]
 -- TODO: help as lentil PATH [ PATH... ] [ OPTIONS ] [feature:intermediate]
 
diff --git a/src/Lentil/Export.hs b/src/Lentil/Export.hs
--- a/src/Lentil/Export.hs
+++ b/src/Lentil/Export.hs
@@ -12,9 +12,7 @@
 import Text.CSV
 import Lentil.Types
 
-import qualified Data.List as L
 
-
 ---------------
 -- FUNCTIONS --
 ---------------
@@ -31,5 +29,5 @@
 -----------------
 
 tags2String :: [Tag] -> String
-tags2String ts = L.intercalate " " (map tagString ts)
+tags2String ts = unwords (map tagString ts)
 
diff --git a/src/Lentil/Parse/Issue.hs b/src/Lentil/Parse/Issue.hs
--- a/src/Lentil/Parse/Issue.hs
+++ b/src/Lentil/Parse/Issue.hs
@@ -37,8 +37,22 @@
 -- file we are parsing
 data ParState = ParState { psPath    :: FilePath }
 
+-- issue flagword
+data FlagWord = Todo | Fixme | Xxx deriving (Show, Enum, Eq)
 
+fw2s :: FlagWord -> String
+fw2s Todo  = "todo"
+fw2s Fixme = "fixme"
+fw2s Xxx   = "xxx"
 
+s2fw :: String -> FlagWord
+s2fw s = case map C.toLower s of
+           "todo"  -> Todo
+           "fixme" -> Fixme
+           "xxx"   -> Xxx
+           e       -> error ("unrecognised fw: " ++ e)
+
+
 ---------------
 -- PRIMITIVE --
 ---------------
@@ -99,17 +113,20 @@
 -------------
 
 -- optional ws + flagwords (case unsensitive) + optional ':' ++ optional1 ws
-incipit :: ParIssue ()
-incipit = () <$ ( char '\n'                       *>
-                  spaces                          *>
-                  choice (map ciString flagWords) *>
-                  optional (char ':')             *>
-                  many1 (char ' ')                   )
+incipit :: ParIssue FlagWord
+incipit = char '\n' *> spaces >>
+          fwpar               >>= \fw ->
+          optional (char ':') >>
+          many1 (char ' ')    >> -- fixme usa spaces non ' '
+          return fw
           <?> "incipit"
+    where
+          flagWords = map fw2s (enumFrom Todo)
 
+          fwpar = choice (map ciString flagWords) >>=
+                  return . s2fw
+
 -- TODO: allow tags in before description? [doc] [design]
-flagWords :: [String]
-flagWords = ["TODO", "FIXME", "XXX"]
 
 
 ------------
@@ -122,13 +139,21 @@
 -- ended optionally by some tags (No t/f? End by whiteline or eof or
 -- another TODO).
 issue :: ParIssue Issue
-issue = (Issue <$> fmap psPath getState
-               <*> (incipit *> fmap sourceLine getPosition)
-               <*> freeText
-               <*> option [] (try tags))
+issue = (mkIssue <$> incipit
+                 <*> fmap psPath getState
+                 <*> (fmap sourceLine getPosition)
+                 <*> freeText
+                 <*> option [] (try tags))
         <?> "issue"
+    where
+          mkIssue fw fp ln ds tgs = Issue fp ln ds (addTag fw tgs)
 
+          -- todo incipit should return FlagWord, not a string [refactor]
+          addTag Todo tgs = tgs
+          addTag fw   tgs = (Tag $ fw2s fw) : tgs
 
+
+
 -- any text. Since tags/fields at the end of the issue are optional, we need
 -- a way to delimit this. Delimiters are: eof, tags/fields, blank line
 freeText :: ParIssue Description
@@ -149,7 +174,7 @@
 -- parses a number of issues from a given line-of-text
 issues :: ParIssue [Issue]
 issues = getPosition >>= \p -> -- horrible hack, search for [duct] for expl-
-         setPosition (setSourceLine p (0)) >> -- anation
+         setPosition (setSourceLine p 0) >> -- anation
          many (try $ manyTill anyChar (lookAhead $ try incipit) *> issue)
          <?> "issues"
 
diff --git a/src/Lentil/Parse/Source.hs b/src/Lentil/Parse/Source.hs
--- a/src/Lentil/Parse/Source.hs
+++ b/src/Lentil/Parse/Source.hs
@@ -74,7 +74,7 @@
 
           -- every unambiguous symbol (init comments, listring char)
           posts  = psLineComms ps ++ map fst (psBlockComms ps) ++
-                   (map (:[]) $ psStringLits ps)
+                   map (:[]) (psStringLits ps)
 
           -- ambiguous symbols (pall'aaa'foo is valid haskell identifier,
           -- so it should stay here
@@ -98,9 +98,9 @@
 source ps@(ParSyntax lc bc sl cl) =
                 choice (map (try . lineComment) lc) -- line comment
             <|> choice (map (try . blockComment) bc) -- block comment
-            <|> (choice (map (onlynl . try . litString) sl))
-            <|> ("" <$ (choice (map (try . litChar) cl))) -- todo ugly parens [lint] [refactor]
-            <|> (onlynl $ program ps)
+            <|> choice (map (onlynl . try . litString) sl)
+            <|> ("" <$ choice (map (try . litChar) cl)) -- todo ugly parens [lint] [refactor]
+            <|> onlynl (program ps)
             <?> "source file"
     where onlynl a = fmap (filter (== '\n')) a
 
@@ -114,7 +114,7 @@
 --------------
 
 -- TODO: add langparsers che sia estensibile e leggibile
---       a compilazione [design] [u:3]
+--       a compilazione [u:3]
 
 langParser :: String -> Maybe (ParSource String)
 langParser fp | ext `elem` [".hs", ".lhs"]         = Just haskell
diff --git a/src/Lentil/Print.hs b/src/Lentil/Print.hs
--- a/src/Lentil/Print.hs
+++ b/src/Lentil/Print.hs
@@ -32,15 +32,17 @@
 -- Bool: wheter or not to use colours in rendering
 myRender :: Bool -> Doc -> String
 myRender col d = ($ "") . displayS . renderPretty 1 75 $ d'
-    where d' | col == True = d
-             | otherwise   = plain d
+    where d' | col       = d
+             | otherwise = plain d
 
 
 ------------------
 -- PRETTY PRINT --
 ------------------
 
--- TODO: colours are bad for unix philosophy, remove them? [design]
+-- TODO: colours are bad for unix philosophy, remove them? hlint
+--       manages to get a colorised output when ran alone but not when
+--       piped to less, how? [design]
 data TagCol = Red | Blue deriving (Eq)
 ppTag :: TagCol -> Tag -> Doc
 ppTag c t = col (char openDel) <> string (tagString t) <>
@@ -78,7 +80,7 @@
 -- tagpop pp report
 ppPopularity :: Bool -> [Issue] -> String
 ppPopularity col is = myRender col $ text "Tags popularity:" PP.<$>
-                                     vsep (ppPops) -- PP.<$> (string "")
+                                     vsep ppPops -- PP.<$> (string "")
     where
           listpop = tagPop is
 
diff --git a/src/Lentil/Query.hs b/src/Lentil/Query.hs
--- a/src/Lentil/Query.hs
+++ b/src/Lentil/Query.hs
@@ -18,7 +18,6 @@
 
 type RegExp = String
 
--- TODO: filtering case unsensitive? [test]
 
 ---------------
 -- FILTERING --
@@ -58,7 +57,7 @@
 -- sequences sorting
 chainSorts :: [Issue] -> [[Issue] -> [Issue]] -> [Issue]
 chainSorts is []     = is
-chainSorts is (s:ss) = concatMap (flip chainSorts ss) $ L.group (s is)
+chainSorts is (s:ss) = concatMap (`chainSorts` ss) $ L.group (s is)
 
 -- given a particular accessor and a sort order, sorts issues
 sortIssues :: (NS.NaturalSort a) => (Issue -> a) -> SortOrder ->
@@ -94,7 +93,7 @@
 
 -- tag popularity
 tagPop :: [Issue] -> [(Tag, Int)]
-tagPop is = reverse . L.sortBy (compare `F.on` snd) .
-            map (\l -> (head l, length l)) . L.group .
+tagPop is = reverse . L.sortBy (compare `F.on` snd) .  -- flip avoids reverse
+            map (\l -> (head l, length l)) . L.group . -- but not the same
             L.sort . concatMap iTags $ is
 
diff --git a/src/Main.hs b/src/Main.hs
new file mode 100644
--- /dev/null
+++ b/src/Main.hs
@@ -0,0 +1,52 @@
+import Lentil.Types
+import Lentil.Args
+import Lentil.File
+import Lentil.Print
+import Lentil.Query
+import Lentil.Export
+
+import Options.Applicative
+
+import qualified Data.Maybe as M
+import Data.Monoid
+
+
+main :: IO ()
+main = execParser opts >>= runLentil
+    where opts = info (helpOvert <*> lOpts <* version)
+            ( fullDesc <>
+              header "lentil - a frugal issue tracker" )
+
+-- overt help text (even in condensed help)
+helpOvert :: Parser (a -> a)
+helpOvert = abortOption ShowHelpText $ mconcat [ long "help",
+                                                 short 'h',
+                                                 help "Show this help text" ]
+
+version = infoOption versionCopy ( long "version" <>
+                                   short 'v'      <>
+                                   help "show version and copyright info" )
+    where
+          versionCopy = "\nlentil - a frugal issue tracker, version 0.1.1.3\n\
+                        \(C) 2015 Francesco Ariis - http://www.ariis.it\n\
+                        \released under the GNU General Public License 3\n"
+
+
+runLentil :: LOptions -> IO ()
+runLentil lo = uncurry findIssues (loInExcl lo) >>= \is -> -- grab issues
+               let fil = filterAnd (loFilters lo) is       -- filtered
+                   ord = chainSorts fil (loSort lo) in     -- ordered
+
+               case loOutFile lo of
+
+                 -- std output
+                 Nothing -> case loFormat lo of
+                              Csv    -> putStrLn (issues2CSV is)
+                              Pretty -> putStrLn (ppIssues True ord)
+                              TagPop -> putStrLn (ppPopularity True is)
+
+                 Just fp -> case loFormat lo of
+                              Csv    -> writeFile fp (issues2CSV is)
+                              Pretty -> writeFile fp (ppIssues False ord)
+                              TagPop -> writeFile fp (ppPopularity False is)
+
diff --git a/test/Lentil/Parse/IssueSpec.hs b/test/Lentil/Parse/IssueSpec.hs
--- a/test/Lentil/Parse/IssueSpec.hs
+++ b/test/Lentil/Parse/IssueSpec.hs
@@ -56,19 +56,19 @@
 
   describe "incipit" $ do
     it "parses the initial section of an issue, returns nothing" $
-       do sp incipit "\nTODO: "  `shouldBe` Just ()
-          sp incipit "\nFIXME: "  `shouldBe` Just ()
-          sp incipit "\nXXX: "  `shouldBe` Just ()
+       do sp incipit "\nTODO: "  `shouldBe` Just Todo
+          sp incipit "\nFIXME: "  `shouldBe` Just Fixme
+          sp incipit "\nXXX: "  `shouldBe` Just Xxx
     it "doesn't work without previous newline" $
       sp incipit "\nTODO:some"  `shouldBe` Nothing
     it "doesn't work if you don't add a space after :" $
       sp incipit "\nTODO:some"  `shouldBe` Nothing
     it "does allow you to omit the :" $
-      sp incipit "\nxxx some"  `shouldBe` Just ()
+      sp incipit "\nxxx some"  `shouldBe` Just Xxx
     it "is case unsensitive in flag-word" $
-      sp incipit "\ntOdO some"  `shouldBe` Just ()
+      sp incipit "\ntOdO some"  `shouldBe` Just Todo
     it "allows whitespace before the todo" $
-      sp incipit "\n   fixme some"  `shouldBe` Just ()
+      sp incipit "\n   fixme some"  `shouldBe` Just Fixme
     it "doesn't allow anything else before flag-words" $
       sp incipit "\nso fixme someday"  `shouldBe` Nothing
     it "fails if we are not at the beginning of line" $
@@ -103,7 +103,8 @@
   describe "issue" $ do
     it "parses an issue" $
       sp issue "\n fixMe this is it [t] [f:w]"
-         `shouldBe` (Just $ Issue "<f>" 2 "this is it" [Tag "t", Tag "f:w"])
+         `shouldBe` (Just $ Issue "<f>" 2 "this is it"
+                                  [Tag "fixme", Tag "t", Tag "f:w"])
     it "fails if were are not at beginning of a line" $
       sp issue "fixMe this is it [t] [f:w]"
          `shouldBe` Nothing
@@ -116,6 +117,9 @@
     it "doesn't accept a lone (naked) todo" $
       sp issue "\ntodo\n"
          `shouldBe` Nothing
+    it "issues declared with fixme get a free [fixme] tag" $
+      sp issue "\nfixme blah\n"
+         `shouldBe` (Just $ Issue "<f>" 2 "blah" [Tag "fixme"])
 
   describe "issues" $ do
     it "parses multiple issues" $
@@ -131,7 +135,7 @@
       let fp = "test/test-files/lang-comm/test.txt" in
       issueFinder [fp] >>= \i ->
       i `shouldBe` [Issue fp 1 "palla" [],
-                    Issue fp 3 "beta"  [],
-                    Issue fp 4 "gamma" [],
-                    Issue fp 6 "qqq"   [Tag "bug"]]
+                    Issue fp 3 "beta"  [Tag "fixme"],
+                    Issue fp 4 "gamma" [Tag "xxx"],
+                    Issue fp 6 "qqq"   [Tag "fixme", Tag "bug"]]
 
diff --git a/test/Tests.hs b/test/Tests.hs
--- a/test/Tests.hs
+++ b/test/Tests.hs
@@ -1,2 +1,8 @@
 {-# OPTIONS_GHC -F -pgmF hspec-discover #-}
 
+-- TODO: http://hackage.haskell.org/package/nanospec-0.2.1/docs/Test-Hspec.html
+--       use this? [refactor]
+
+-- TODO: http://hackage.haskell.org/package/mockery-0.3.0/docs/Test-Mockery-Directory.html
+--       instead of folder use this? [refactor]
+
