diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 Usage
 -----
 
-Cgrep 6.5.5 Usage: cgrep [OPTION] [PATTERN] files...
+Cgrep 6.5.6 Usage: cgrep [OPTION] [PATTERN] files...
 
 cgrep [OPTIONS] [ITEM]
 
diff --git a/cgrep.cabal b/cgrep.cabal
--- a/cgrep.cabal
+++ b/cgrep.cabal
@@ -1,6 +1,6 @@
 Name:                cgrep
 Description:         Cgrep: a context-aware grep for source codes
-Version:             6.5.5
+Version:             6.5.6
 Synopsis:            Command line tool
 Homepage:            http://awgn.github.io/cgrep/
 License:             GPL-2
diff --git a/src/CGrep/Context.hs b/src/CGrep/Context.hs
--- a/src/CGrep/Context.hs
+++ b/src/CGrep/Context.hs
@@ -24,8 +24,8 @@
 
 
 data ContextFilter = ContextFilter
-    {   getCode    :: Bool
-    ,   getComment :: Bool
-    ,   getLiteral :: Bool
+    {   getFilterCode    :: !Bool
+    ,   getFilterComment :: !Bool
+    ,   getFilterLiteral :: !Bool
     } deriving (Eq, Show)
 
diff --git a/src/CGrep/Filter.hs b/src/CGrep/Filter.hs
--- a/src/CGrep/Filter.hs
+++ b/src/CGrep/Filter.hs
@@ -60,11 +60,11 @@
 data ParState =  ParState
     {   cxtState  :: !ContextState
     ,   display   :: !Bool
-    ,   skip      :: !Int
+    ,   skip      :: {-# UNPACK #-} !Int
     } deriving (Show)
 
 
-data ContextState = CodeState | CommState Int | LitrState Int
+data ContextState = CodeState | CommState {-# UNPACK #-} !Int | LitrState {-# UNPACK #-} !Int
     deriving (Show, Eq, Ord)
 
 
@@ -74,8 +74,8 @@
 mkContextFilter :: Options -> ContextFilter
 mkContextFilter opt =
     if not (code opt || comment opt || literal opt)
-        then ContextFilter { getCode = True, getComment = True,  getLiteral = True }
-        else ContextFilter { getCode = code opt, getComment = comment opt, getLiteral = literal opt }
+        then ContextFilter { getFilterCode = True, getFilterComment = True,  getFilterLiteral = True }
+        else ContextFilter { getFilterCode = code opt, getFilterComment = comment opt, getFilterLiteral = literal opt }
 
 
 contextFilter :: Maybe Lang -> ContextFilter -> Text8 -> Text8
diff --git a/src/CGrep/Semantic/Cpp/Token.hs b/src/CGrep/Semantic/Cpp/Token.hs
--- a/src/CGrep/Semantic/Cpp/Token.hs
+++ b/src/CGrep/Semantic/Cpp/Token.hs
@@ -35,33 +35,33 @@
 
 import CGrep.Semantic.Token
 
-type TokenizerState = (Source, Offset, CppState)
+data TokenizerState = TokenizerState Source {-# UNPACK #-} !Offset !CppState
 type Source         = C.ByteString
 type Offset         = Int
 
 
 data Token =
-    TokenIdentifier  { toString :: String, toOffset :: Int  } |
-    TokenDirective   { toString :: String, toOffset :: Int  } |
-    TokenKeyword     { toString :: String, toOffset :: Int  } |
-    TokenNumber      { toString :: String, toOffset :: Int  } |
-    TokenHeaderName  { toString :: String, toOffset :: Int  } |
-    TokenString      { toString :: String, toOffset :: Int  } |
-    TokenChar        { toString :: String, toOffset :: Int  } |
-    TokenOperOrPunct { toString :: String, toOffset :: Int  }
+    TokenIdentifier  { toString :: !String, toOffset :: {-# UNPACK #-} !Int  } |
+    TokenDirective   { toString :: !String, toOffset :: {-# UNPACK #-} !Int  } |
+    TokenKeyword     { toString :: !String, toOffset :: {-# UNPACK #-} !Int  } |
+    TokenNumber      { toString :: !String, toOffset :: {-# UNPACK #-} !Int  } |
+    TokenHeaderName  { toString :: !String, toOffset :: {-# UNPACK #-} !Int  } |
+    TokenString      { toString :: !String, toOffset :: {-# UNPACK #-} !Int  } |
+    TokenChar        { toString :: !String, toOffset :: {-# UNPACK #-} !Int  } |
+    TokenOperOrPunct { toString :: !String, toOffset :: {-# UNPACK #-} !Int  }
        deriving (Show, Eq, Ord)
 
 
 data TokenFilter = TokenFilter
-    {   filtIdentifier :: Bool
-    ,   filtDirective  :: Bool
-    ,   filtKeyword    :: Bool
-    ,   filtHeader     :: Bool
-    ,   filtString     :: Bool
-    ,   filtNumber     :: Bool
-    ,   filtChar       :: Bool
-    ,   filtOper       :: Bool
-    } deriving (Show,Read,Eq)
+    {   filtIdentifier :: !Bool
+    ,   filtDirective  :: !Bool
+    ,   filtKeyword    :: !Bool
+    ,   filtHeader     :: !Bool
+    ,   filtString     :: !Bool
+    ,   filtNumber     :: !Bool
+    ,   filtChar       :: !Bool
+    ,   filtOper       :: !Bool
+    } deriving (Eq)
 
 
 instance SemanticToken Token where
@@ -81,7 +81,7 @@
 --
 
 tokenizer :: Source -> [Token]
-tokenizer xs = runGetToken (ys, n, Null)
+tokenizer xs = runGetToken (TokenizerState ys n Null)
             where (ys, n) = dropWhite xs
 
 
@@ -196,15 +196,15 @@
 
 runGetToken :: TokenizerState -> [Token]
 
-runGetToken (C.uncons  -> Nothing, _, _) = []
+runGetToken (TokenizerState (C.uncons  -> Nothing) _ _) = []
 runGetToken tstate = token : runGetToken ns
     where (token, ns) = getToken tstate
 
 
 getToken :: TokenizerState -> (Token, TokenizerState)
 
-getToken (C.uncons -> Nothing, _, _) = error "getToken: internal error"
-getToken (xs, off, state) =
+getToken (TokenizerState (C.uncons -> Nothing) _ _) = error "getToken: internal error"
+getToken (TokenizerState xs off state) =
     let token = fromJust $
                     getTokenDirective xs state       `mplus`
                     getTokenHeaderName xs state      `mplus`
@@ -217,7 +217,7 @@
         len      = fromIntegral $ length tstring
         (xs', w) = dropWhite $ C.drop (fromIntegral len) xs
     in
-        (token { toOffset = off }, (xs', off + len + w, nextCppState tstring state))
+        (token { toOffset = off }, (TokenizerState xs' (off + len + w) (nextCppState tstring state)))
 
 
 getTokenIdOrKeyword, getTokenNumber,
diff --git a/src/CGrep/Semantic/Generic/Token.hs b/src/CGrep/Semantic/Generic/Token.hs
--- a/src/CGrep/Semantic/Generic/Token.hs
+++ b/src/CGrep/Semantic/Generic/Token.hs
@@ -92,7 +92,7 @@
 tokenCompare _ _ = False
 
 
-data TokenAccum = TokenAccum !TokenState !Offset !Int DString (DL.DList Token)
+data TokenAccum = TokenAccum !TokenState {-# UNPACK #-} !Offset {-# UNPACK #-} !Int DString (DL.DList Token)
 
 
 isCharNumberLT :: UArray Char Bool
diff --git a/src/CGrep/Strategy/Cpp/Semantic.hs b/src/CGrep/Strategy/Cpp/Semantic.hs
--- a/src/CGrep/Strategy/Cpp/Semantic.hs
+++ b/src/CGrep/Strategy/Cpp/Semantic.hs
@@ -52,7 +52,7 @@
 
     let text' = ignoreCase opt text
 
-        filt  = (mkContextFilter opt) { getComment = False }
+        filt  = (mkContextFilter opt) { getFilterComment = False }
 
     -- pre-process patterns
 
diff --git a/src/CGrep/Strategy/Cpp/Tokenizer.hs b/src/CGrep/Strategy/Cpp/Tokenizer.hs
--- a/src/CGrep/Strategy/Cpp/Tokenizer.hs
+++ b/src/CGrep/Strategy/Cpp/Tokenizer.hs
@@ -48,7 +48,7 @@
     -- transform text
 
     let text' = ignoreCase opt text
-        filt  = (mkContextFilter opt) { getComment = False }
+        filt  = (mkContextFilter opt) { getFilterComment = False }
 
     putStrLevel1 $ "strategy  : running C/C++ token search on " ++ filename ++ "..."
 
diff --git a/src/CGrep/Strategy/Generic/Semantic.hs b/src/CGrep/Strategy/Generic/Semantic.hs
--- a/src/CGrep/Strategy/Generic/Semantic.hs
+++ b/src/CGrep/Strategy/Generic/Semantic.hs
@@ -54,7 +54,7 @@
 
     let text' = ignoreCase opt text
 
-        filt  = (mkContextFilter opt) { getComment = False }
+        filt  = (mkContextFilter opt) { getFilterComment = False }
 
     -- pre-process patterns
 
diff --git a/src/Config.hs b/src/Config.hs
--- a/src/Config.hs
+++ b/src/Config.hs
@@ -33,7 +33,7 @@
 cgreprc = "cgreprc"
 
 version :: String
-version = "6.5.5"
+version = "6.5.6"
 
 
 data Config = Config
