diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 Usage
 -----
 
-Cgrep 6.5.10 Usage: cgrep [OPTION] [PATTERN] files...
+Cgrep 6.5.11 Usage: cgrep [OPTION] [PATTERN] files...
 
 cgrep [OPTIONS] [ITEM]
 
@@ -45,13 +45,14 @@
        --oper                 operators
  
 Output control:
-
-    -h --no-filename          suppress the file name prefix on output
-    -N --no-line-umber        suppress the line number on output lines
-       --lang=ITEM            specify languages. ie: Cpp, +Haskell, -Makefile
-       --lang-maps            lists the language mappings
-       --force-language=ITEM  force the language
-       --multiline=INT        enable multi-line matching
+ 
+    -h --no-filename          Suppress the file name prefix on output
+    -N --no-line-umber        Suppress the line number on output lines
+       --language-filter=ITEM Specify languages. ie: Cpp, +Haskell, -Makefile
+       --language-force=ITEM  Force the language
+       --language-map         Lists the language mappings
+       --magic-filter=ITEM    Use unix magic as file-filter
+       --multiline=INT        Enable multi-line matching
     -r --recursive            Enable recursive search (don't follow symlinks)
        --prune-dir=ITEM       Do not descend into dir
     -R --deference-recursive  Recursive, follow symlinks
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.10
+Version:             6.5.11
 Synopsis:            Command line tool
 Homepage:            http://awgn.github.io/cgrep/
 License:             GPL-2
@@ -48,6 +48,7 @@
                        mtl >= 2.0,
                        unix-compat >= 0.4,
                        async >= 2.0,
-                       transformers
+                       transformers,
+                       process
   Ghc-options:         -O2 -Wall -threaded -rtsopts -with-rtsopts=-N
   Default-language:    Haskell2010
diff --git a/src/CGrep/CGrep.hs b/src/CGrep/CGrep.hs
--- a/src/CGrep/CGrep.hs
+++ b/src/CGrep/CGrep.hs
@@ -16,7 +16,7 @@
 -- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 --
 
-module CGrep.CGrep (sanitizeOptions, runCgrep) where
+module CGrep.CGrep (sanitizeOptions, runCgrep, isRegexp) where
 
 import qualified CGrep.Strategy.BoyerMoore       as BoyerMoore
 import qualified CGrep.Strategy.Levenshtein      as Levenshtein
diff --git a/src/CGrep/Lang.hs b/src/CGrep/Lang.hs
--- a/src/CGrep/Lang.hs
+++ b/src/CGrep/Lang.hs
@@ -100,7 +100,7 @@
 
 
 forcedLang :: Options -> Maybe Lang
-forcedLang Options{ force_language = l }
+forcedLang Options{ language_force = l }
     | Nothing <- l = Nothing
     | otherwise    = Map.lookup (Ext $ fromJust l) langRevMap <|> Map.lookup (Name $ fromJust l) langRevMap
 
diff --git a/src/CGrep/Output.hs b/src/CGrep/Output.hs
--- a/src/CGrep/Output.hs
+++ b/src/CGrep/Output.hs
@@ -243,5 +243,5 @@
                   (next, rest) = splitAt nn s
 
 hilightIndicies :: [Token] -> [(Int, Int)]
-hilightIndicies = foldr (\t a -> let b = fst t in (b, b + length (snd t) - 1) : a) [] . filter ((>0) . length . snd)
+hilightIndicies = foldr (\t a -> let b = fst t in (b, b + length (snd t) - 1) : a) [] . filter (not . null . snd)
 
diff --git a/src/CGrep/Parser/WildCard.hs b/src/CGrep/Parser/WildCard.hs
--- a/src/CGrep/Parser/WildCard.hs
+++ b/src/CGrep/Parser/WildCard.hs
@@ -20,6 +20,7 @@
                                 mkWildCardFromToken,
                                 combineMultiCard,
                                 filterTokensWithMultiCards,
+                                wildCardMap,
                                 wildCardMatch,
                                 multiCardMatch) where
 
diff --git a/src/CmdOptions.hs b/src/CmdOptions.hs
--- a/src/CmdOptions.hs
+++ b/src/CmdOptions.hs
@@ -47,9 +47,10 @@
           ,     semantic = False            &= groupname "\nSemantic (generic)" &= help "\"code\" pattern: _, _1, _2... (identifiers), $, $1, $2... (optionals), ANY, KEY, STR, CHR, LIT, NUM, HEX, OCT, OR. -> e.g. \"_1(_1 && \\$)\" search for move constructors, \"struct OR class _ { OR : OR <\" search for a class declaration" &= explicit &= name "S" &= name "semantic"
           ,     no_filename = False         &= groupname "\nOutput control"&= help "Suppress the file name prefix on output"  &= explicit &= name "h" &= name "no-filename"
           ,     no_linenumber= False        &= help "Suppress the line number on output lines" &= explicit &= name "N" &= name "no-line-umber"
-          ,     lang = []                   &= help "Specify languages. ie: Cpp, +Haskell, -Makefile"
-          ,     lang_maps = False           &= help "Lists the language mappings"
-          ,     force_language = Nothing    &= help "Force the language" &= explicit &= name "force-language"
+          ,     language_filter = []        &= help "Specify languages. ie: Cpp, +Haskell, -Makefile"
+          ,     language_force = Nothing    &= help "Force the language" &= explicit &= name "language-force"
+          ,     language_map = False        &= help "Lists the language mappings"
+          ,     magic_filter = []           &= help "Use unix magic as file-filter"
           ,     max_count = maxBound        &= help "Stop search in files after INT matches" &= explicit &= name "max-count"
           ,     count = False               &= help "Print only a count of matching lines per file" &= explicit &= name "count"
           ,     multiline = 1               &= help "Enable multi-line matching"
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.10"
+version = "6.5.11"
 
 
 data Config = Config
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -20,6 +20,7 @@
 
 import Data.List
 import Data.List.Split
+import qualified Data.Map as M
 import Data.Maybe
 import Data.Char
 import Data.Data()
@@ -45,11 +46,13 @@
 import System.PosixCompat.Files
 import System.IO
 import System.Exit
+import System.Process (readProcess)
 
 import CGrep.CGrep
 import CGrep.Lang
 import CGrep.Output
 import CGrep.Common
+import CGrep.Parser.WildCard
 
 import CmdOptions
 import Options
@@ -60,6 +63,14 @@
 import qualified Data.ByteString.Char8 as C
 
 
+fileFilter :: Options -> [Lang] -> FilePath -> Bool
+fileFilter opts langs filename = maybe False (`elem` langs) (getFileLang opts filename)
+
+
+getFilesMagic :: [FilePath] -> IO [String]
+getFilesMagic filenames = fmap lines $ readProcess "/usr/bin/file" (["-b" ] ++ filenames) []
+
+
 -- push file names in Chan...
 
 withRecursiveContents :: Options -> FilePath -> [Lang] -> [String] -> Set.Set FilePath -> ([FilePath] -> IO ()) -> IO ()
@@ -67,14 +78,20 @@
     isDir <-  doesDirectoryExist dir
     if isDir then do
                xs <- getDirectoryContents dir
+
                (dirs,files) <- partitionM doesDirectoryExist [dir </> x | x <- xs, x `notElem` [".", ".."]]
-               -- process files
-               let files' = mapMaybe
-                                (\n -> let filename = takeFileName n
-                                       in if isNothing $ getFileLang opts filename >>= (\f -> f `elemIndex` langs <|> toMaybe 0 (null langs))
-                                            then Nothing
-                                            else Just n) files
 
+               magics <- if null (magic_filter opts) || null files
+                          then return []
+                          else getFilesMagic files
+
+               -- filter the list of files
+               --
+               let files' = if null magics
+                              then  filter (fileFilter opts langs) files
+                              else  catMaybes $ zipWith (\f m ->  if any (`isInfixOf` m) (magic_filter opts) then Just f else Nothing ) files magics
+
+
                unless (null files') $
                     let chunks = chunksOf (Options.chunk opts) files' in
                     forM_ chunks $ \b -> action b
@@ -200,7 +217,7 @@
 
     -- display lang-map and exit...
 
-    when (lang_maps opts) $ dumpLangMap langMap >> exitSuccess
+    when (language_map opts) $ dumpLangMap langMap >> exitSuccess
 
     -- check whether patterns list is empty, display help message if it's the case
 
@@ -211,7 +228,10 @@
     patterns <- if null (file opts) then return $ (if isTermIn then (:[]) . head else id) $ map C.pack (others opts)
                                     else readPatternsFromFile $ file opts
 
-    let patterns' = map (if ignore_case opts then C.map toLower else id) patterns
+    let patterns' = map (if ignore_case opts then ic else id) patterns
+            where ic | (not . isRegexp) opts && semantic opts = C.unwords . map (\p -> if C.unpack p `elem` wildCardTokens then p else C.map toLower p) . C.words
+                     | otherwise = C.map toLower
+                        where wildCardTokens = "OR" : M.keys wildCardMap   -- "OR" is not included in wildCardMap
 
     -- load files to parse:
 
@@ -219,7 +239,7 @@
 
     -- parse cmd line language list:
 
-    let (l0, l1, l2) = splitLangList (lang opts)
+    let (l0, l1, l2) = splitLangList (language_filter opts)
 
     -- language enabled:
 
@@ -228,7 +248,7 @@
     runReaderT (do putStrLevel1 $ "Cgrep " ++ version ++ "!"
                    putStrLevel1 $ "options   : " ++ show opts
                    putStrLevel1 $ "languages : " ++ show langs
-                   putStrLevel1 $ "pattern   : " ++ show patterns
+                   putStrLevel1 $ "pattern   : " ++ show patterns'
                    putStrLevel1 $ "files     : " ++ show paths
                    putStrLevel1 $ "isTermIn  : " ++ show isTermIn
                    putStrLevel1 $ "isTermOut : " ++ show isTermOut
diff --git a/src/Options.hs b/src/Options.hs
--- a/src/Options.hs
+++ b/src/Options.hs
@@ -50,9 +50,10 @@
     -- Output:
     ,   no_filename         :: Bool
     ,   no_linenumber       :: Bool
-    ,   lang                :: [String]
-    ,   lang_maps           :: Bool
-    ,   force_language      :: Maybe String
+    ,   language_filter     :: [String]
+    ,   language_force      :: Maybe String
+    ,   language_map        :: Bool
+    ,   magic_filter        :: [String]
     -- General:
     ,   multiline           :: Int
     ,   recursive           :: Bool
diff --git a/src/Util.hs b/src/Util.hs
--- a/src/Util.hs
+++ b/src/Util.hs
@@ -37,11 +37,6 @@
     return ([x | res]++as, [x | not res]++bs)
 
 
-toMaybe :: a -> Bool -> Maybe a
-toMaybe a True  = Just a
-toMaybe _ False = Nothing
-
-
 notNull :: [a] -> Bool
 notNull = not . null
 
