diff --git a/graphmod.cabal b/graphmod.cabal
--- a/graphmod.cabal
+++ b/graphmod.cabal
@@ -1,25 +1,20 @@
 name:           graphmod
-version:        1.4.2
+version:        1.4.3
 license:        BSD3
 license-file:   LICENSE
 author:         Iavor S. Diatchki
 maintainer:     iavor.diatchki@gmail.com
 homepage:       http://github.com/yav/graphmod/wiki
 build-type:     Simple
-cabal-version:  >= 1.6
+cabal-version:  >= 1.10
 synopsis:       Present the module dependencies of a program as a "dot" graph.
 description:    This package contains a program that computes "dot" graphs
                 from the dependencies of a number of Haskell modules.
 category:       Development
 
-tested-with:    GHC==7.0.1,  GHC==7.0.2,  GHC==7.0.3, GHC==7.0.4,
-                GHC==7.2.1,  GHC==7.2.2,
-                GHC==7.4.1,  GHC==7.4.2,
-                GHC==7.6.1,  GHC==7.6.2,  GHC==7.6.3,
-                GHC==7.8.1,  GHC==7.8.2,  GHC==7.8.3, GHC==7.8.4
-                GHC==7.10.1, GHC==7.10.2, GHC==7.10.3
-                GHC==8.0.1,  GHC==8.0.2,
-                GHC==8.2.1
+tested-with:    GHC==8.0.1,  GHC==8.0.2,
+                GHC==8.2.1,
+                GHC==8.6.3, GHC==8.6.4
 
 extra-source-files: CHANGELOG.md
 
@@ -27,9 +22,10 @@
     main-is:         Main.hs
     other-modules:   Utils, Trie, Paths_graphmod, CabalSupport
     build-depends:   base < 5, directory, filepath, dotgen >= 0.2 && < 0.5,
-                     haskell-lexer >= 1.0.1, containers, Cabal, pretty
+                     haskell-lexer >= 1.0.2, containers, Cabal, pretty
     hs-source-dirs:  src
     ghc-options:     -Wall -O2
+    default-language: Haskell2010
 
 source-repository head
   type:     git
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -216,15 +216,21 @@
 
 -- NOTE: We use the Maybe type to indicate when things changed.
 collapse :: Opts -> Nodes -> (Qualifier,Bool) -> Maybe Nodes
-collapse _ _ ([],_) = return Trie.empty      -- Probably not terribly useful.
+collapse _ _ ([],_) = Nothing
 
-collapse opts (Trie.Sub ts mb) ([q],alsoMod) =
+collapse opts (Trie.Sub ts mb) ([q],alsoMod') =
   do t   <- Map.lookup q ts
-     let will_move = mod_in_cluster opts && Map.member q ts
+     let alsoMod = alsoMod' || mod_in_cluster opts
+         -- if modules are moved in their sub-directory clsuter,
+         -- then we always want to collapse them, irrspective of the flag given
+
+
+         nestedMods = [ nm | Trie.Sub _ (Just xs) <- Map.elems ts
+                           , ((_,nm),_)           <- xs ]
+         will_move = mod_in_cluster opts && (q `elem` nestedMods)
          (thisMod,otherMods)
-            | alsoMod || will_move = case findThisMod =<< mb of
-                                       Nothing         -> (Nothing, [])
-                                       Just (nid,rest) -> (Just nid, rest)
+            | alsoMod || will_move
+            , Just (nid,rest) <- findThisMod =<< mb = (Just nid, rest)
             | otherwise = (Nothing, fromMaybe [] mb)
 
      -- use this node-id to represent the collapsed cluster
@@ -246,7 +252,7 @@
     msum (fmap snd (listToMaybe =<< ms) : map getFirst (Map.elems ts1))
 
 collapse opts (Trie.Sub ts ms) (q : qs,x) =
-  do t <- Map.lookup q ts
+  do t  <- Map.lookup q ts
      t1 <- collapse opts t (qs,x)
      return (Trie.Sub (Map.insert q t1 ts) ms)
 
diff --git a/src/Utils.hs b/src/Utils.hs
--- a/src/Utils.hs
+++ b/src/Utils.hs
@@ -18,7 +18,7 @@
 import Control.Monad(mplus)
 import Control.Exception(evaluate)
 import Data.Maybe(catMaybes)
-import Data.List(intersperse,isPrefixOf)
+import Data.List(intersperse,isPrefixOf,nub)
 import System.Directory(doesFileExist)
 import System.FilePath
 
@@ -152,7 +152,7 @@
 -- | The files in which a module might reside.
 -- We report only files that exist.
 modToFile          :: [FilePath] -> ModName -> IO [FilePath]
-modToFile dirs m    = catMaybes `fmap` mapM check paths
+modToFile dirs m    = (nub . catMaybes) `fmap` mapM check paths
   where
   paths             = [ d </> r | d <- dirs, r <- relPaths m ]
   check p           = do x <- doesFileExist p
