diff --git a/ddc-tools.cabal b/ddc-tools.cabal
--- a/ddc-tools.cabal
+++ b/ddc-tools.cabal
@@ -1,5 +1,5 @@
 Name:           ddc-tools
-Version:        0.3.1.1
+Version:        0.3.1.2
 License:        MIT
 License-file:   LICENSE
 Author:         The Disciplined Disciple Compiler Strike Force
@@ -9,7 +9,6 @@
 Stability:      experimental
 Category:       Compilers/Interpreters
 Homepage:       http://disciple.ouroborus.net
-Bug-reports:    disciple@ouroborus.net
 Synopsis:       Disciplined Disciple Compiler command line tools.
 Description:    Disciplined Disciple Compiler command line tools.
 
@@ -51,8 +50,8 @@
         ddc-core-salt   == 0.3.1.*,
         ddc-core-llvm   == 0.3.1.*,
         ddc-build       == 0.3.1.*,
-        ddc-driver      == 0.3.1.*,
-        ddc-code        == 0.3.1.*
+        ddc-code        == 0.3.1.*,
+        ddc-driver      >= 0.3.1.2 && < 0.3.2
 
     Main-is:
         Main.hs
@@ -86,7 +85,7 @@
         ddc-core-salt   == 0.3.1.*,
         ddc-core-llvm   == 0.3.1.*,
         ddc-build       == 0.3.1.*,
-        ddc-driver      == 0.3.1.*
+        ddc-driver      >= 0.3.1.2 && < 0.3.2
 
     Main-is:
         Main.hs
diff --git a/src/ddc-main/DDC/Main/Help.hs b/src/ddc-main/DDC/Main/Help.hs
--- a/src/ddc-main/DDC/Main/Help.hs
+++ b/src/ddc-main/DDC/Main/Help.hs
@@ -3,7 +3,7 @@
 
 -- | The version identifier string.
 version :: String
-version = "The Disciplined Disciple Compiler, version 0.3.0"
+version = "The Disciplined Disciple Compiler, version 0.3.1"
 
 
 -- | What to print when we have no input files.
diff --git a/src/ddc-main/DDC/Main/OptLevels.hs b/src/ddc-main/DDC/Main/OptLevels.hs
--- a/src/ddc-main/DDC/Main/OptLevels.hs
+++ b/src/ddc-main/DDC/Main/OptLevels.hs
@@ -16,12 +16,15 @@
 import DDC.Core.Simplifier                      (Simplifier)
 import System.FilePath
 import Control.Monad
+import Data.List
 import Data.Monoid
 import Data.Maybe
+import qualified DDC.Core.Fragment              as C
 import qualified DDC.Core.Simplifier            as S
 import qualified DDC.Core.Simplifier.Recipe     as S
 import qualified DDC.Core.Lite                  as Lite
 import qualified DDC.Core.Salt                  as Salt
+import qualified DDC.Core.Salt.Runtime          as Salt
 import qualified DDC.Build.Language.Salt        as Salt
 import qualified DDC.Build.Language.Lite        as Lite
 import qualified Data.Map                       as Map
@@ -37,24 +40,27 @@
 --
 getSimplLiteOfConfig 
         :: Config -> Builder 
+        -> Maybe FilePath -- ^ path of current module
         -> IO (Simplifier Int () Lite.Name)
 
-getSimplLiteOfConfig config builder
+getSimplLiteOfConfig config builder filePath
  = case configOptLevelLite config of
         OptLevel0       -> opt0_lite config
-        OptLevel1       -> opt1_lite config builder
+        OptLevel1       -> opt1_lite config builder filePath
 
 
 -- | Get the simplifier for Salt code from the config.
 --
 getSimplSaltOfConfig 
         :: Config -> Builder
+        -> Salt.Config
+        -> Maybe FilePath -- ^ path of current module
         -> IO (Simplifier Int () Salt.Name)
 
-getSimplSaltOfConfig config builder
+getSimplSaltOfConfig config builder runtimeConfig filePath
  = case configOptLevelSalt config of
         OptLevel0       -> opt0_salt config
-        OptLevel1       -> opt1_salt config builder
+        OptLevel1       -> opt1_salt config builder runtimeConfig filePath
 
 
 -- Level 0 --------------------------------------------------------------------
@@ -78,9 +84,10 @@
 -- | Level 1 optimiser for Core Lite code.
 opt1_lite 
         :: Config -> Builder
+        -> Maybe FilePath -- ^ path of current module
         -> IO (Simplifier Int () Lite.Name)
 
-opt1_lite config _builder
+opt1_lite config _builder filePath
  = do
         -- Auto-inline basic numeric code.
         let inlineModulePaths
@@ -110,8 +117,11 @@
         rules <- mapM (\(m,file) -> cmdTryReadRules Lite.fragment (file ++ ".rules") m)
               $  inlineModules `zip` inlineModulePaths
 
-        let rules' = concat rules
+        -- Load rules for target module as well
+        modrules <- loadLiteRules filePath
 
+        let rules' = concat rules ++ modrules
+
         -- Simplifier to convert to a-normal form.
         let normalizeLite
                 = S.anormalize
@@ -132,9 +142,11 @@
 -- | Level 1 optimiser for Core Salt code.
 opt1_salt 
         :: Config -> Builder
+        -> Salt.Config
+        -> Maybe FilePath -- ^ path of current module
         -> IO (Simplifier Int () Salt.Name)
 
-opt1_salt config builder
+opt1_salt config builder runtimeConfig filePath
  = do   
         -- Auto-inline the low-level code from the runtime system
         --   that constructs and destructs objects.
@@ -168,9 +180,13 @@
         -- Optionally load the rewrite rules for each 'with' module
         rules <- mapM (\(m,file) -> cmdTryReadRules Salt.fragment (file ++ ".rules") m)
               $  inlineModules `zip` inlineModulePaths
-        let rules' = concat rules
 
+        -- Load rules for target module as well
+        modrules <- loadSaltRules builder runtimeConfig filePath
 
+        let rules' = concat rules ++ modrules
+
+
         -- Simplifier to convert to a-normal form.
         let normalizeSalt
                 = S.anormalize
@@ -185,4 +201,59 @@
                                 <> S.bubble      <> S.flatten 
                                 <> normalizeSalt <> S.forward
                                 <> (S.Trans $ S.Rewrite rules'))
+
+
+-- | Load rules for main module
+loadLiteRules
+    :: Maybe FilePath
+    -> IO (S.NamedRewriteRules () Lite.Name)
+
+loadLiteRules (Just filePath)
+ | isSuffixOf ".dcl" filePath
+ = do -- Parse module to get exported fn types
+      modu     <- cmdReadModule' False Lite.fragment filePath
+      case modu of
+       Just mod' -> cmdTryReadRules Lite.fragment (filePath ++ ".rules")
+                                    (reannotate (const ()) mod')
+       Nothing   -> return []
+
+loadLiteRules _
+ = return []
+
+
+-- | Load rules for main module
+loadSaltRules
+    :: Builder
+    -> Salt.Config
+    -> Maybe FilePath
+    -> IO (S.NamedRewriteRules () Salt.Name)
+
+loadSaltRules builder runtimeConfig (Just filePath)
+ -- If the main module is a lite module, we need to load the lite then convert it to salt
+ | isSuffixOf ".dcl" filePath
+ = do modu     <- cmdReadModule' False Lite.fragment filePath
+      let path' = (reverse $ drop 3 $ reverse filePath) ++ "dcs.rules"
+      case modu of
+       Just mod' ->
+        case Lite.saltOfLiteModule (buildSpec builder) 
+                    runtimeConfig
+                    (C.profilePrimDataDefs Lite.profile) 
+                    (C.profilePrimKinds    Lite.profile)
+                    (C.profilePrimTypes    Lite.profile)
+                    mod' 
+         of  Left  _    -> return []
+             Right mm'  -> cmdTryReadRules Salt.fragment path'
+                                           (reannotate (const ()) mm')
+
+       Nothing   -> return []
+
+ | isSuffixOf ".dcs" filePath
+ = do modu      <- cmdReadModule' False Salt.fragment filePath
+      case modu of
+       Just mod' -> cmdTryReadRules Salt.fragment (filePath ++ ".rules") (reannotate (const ()) mod')
+       Nothing   -> return []
+
+loadSaltRules _ _ _
+ = return []
+
 
diff --git a/src/ddc-main/Main.hs b/src/ddc-main/Main.hs
--- a/src/ddc-main/Main.hs
+++ b/src/ddc-main/Main.hs
@@ -86,13 +86,13 @@
 
         -- Compile a module to object code.
         ModeCompile filePath
-         -> do  dconfig  <- getDriverConfig config
+         -> do  dconfig  <- getDriverConfig config (Just filePath)
                 runError $ cmdCompile dconfig filePath
 
 
         -- Compile a module into an executable.
         ModeMake filePath
-         -> do  dconfig  <- getDriverConfig config
+         -> do  dconfig  <- getDriverConfig config (Just filePath)
                 runError $ cmdMake    dconfig filePath
 
 
@@ -109,7 +109,7 @@
         -- Convert a module to Salt.
         ModeToSalt filePath
          -> do  language        <- languageFromFilePath filePath
-                dconfig         <- getDriverConfig config
+                dconfig         <- getDriverConfig config (Just filePath)
                 str             <- readFile filePath
                 runError $ cmdToSalt dconfig language (SourceFile filePath) str
 
@@ -117,7 +117,7 @@
         -- Convert a module to C
         ModeToC filePath
          -> do  language        <- languageFromFilePath filePath
-                dconfig         <- getDriverConfig config
+                dconfig         <- getDriverConfig config (Just filePath)
                 str             <- readFile filePath
                 runError $ cmdToC dconfig language (SourceFile filePath) str
 
@@ -125,18 +125,18 @@
         -- Convert a module to LLVM
         ModeToLLVM filePath
          -> do  language        <- languageFromFilePath filePath
-                dconfig         <- getDriverConfig config
+                dconfig         <- getDriverConfig config (Just filePath)
                 str             <- readFile filePath
                 runError $ cmdToLlvm dconfig language (SourceFile filePath) str
 
         -- Build the runtime and base libraries.
         ModeBaseBuild
-         -> do  dconfig         <- getDriverConfig config
+         -> do  dconfig         <- getDriverConfig config Nothing
                 runError $ cmdBaseBuild dconfig
 
         -- Print the external builder info for this platform.
         ModePrintBuilder
-         -> do  dconfig         <- getDriverConfig config
+         -> do  dconfig         <- getDriverConfig config Nothing
                 putStrLn $ renderIndent $ ppr (Driver.configBuilder dconfig)
 
         -- Print where the runtime and base libraries are installed.
@@ -145,22 +145,23 @@
 
 
 -- | Get the compile driver from the config.
-getDriverConfig :: Config -> IO Driver.Config
-getDriverConfig config
+getDriverConfig :: Config -> Maybe FilePath -> IO Driver.Config
+getDriverConfig config filePath
  = do   Just builder    <- determineDefaultBuilder (defaultBuilderConfig config)
-        simplLite       <- getSimplLiteOfConfig config builder
-        simplSalt       <- getSimplSaltOfConfig config builder
+        let runtimeConfig
+             = Runtime.Config
+             { Runtime.configHeapSize = configRuntimeHeapSize config }
 
+        simplLite       <- getSimplLiteOfConfig config builder               filePath
+        simplSalt       <- getSimplSaltOfConfig config builder runtimeConfig filePath
+
         return  $ Driver.Config
                 { Driver.configDump                     = configDump config
                 , Driver.configSimplLite                = simplLite
                 , Driver.configSimplSalt                = simplSalt
                 , Driver.configViaBackend               = configViaBackend config
 
-                , Driver.configRuntime               
-                        = Runtime.Config
-                        { Runtime.configHeapSize        = configRuntimeHeapSize config }
-
+                , Driver.configRuntime                  = runtimeConfig
                 , Driver.configBuilder                  = builder
                 , Driver.configSuppressCoreImports      = False
                 , Driver.configSuppressHashImports      = False
diff --git a/src/ddci-core/DDCI/Core/Interface/Interactive.hs b/src/ddci-core/DDCI/Core/Interface/Interactive.hs
--- a/src/ddci-core/DDCI/Core/Interface/Interactive.hs
+++ b/src/ddci-core/DDCI/Core/Interface/Interactive.hs
@@ -14,7 +14,7 @@
 -- | Run an interactive session, reading commands from the console.
 runInteractive :: IO ()
 runInteractive
- = do   putStrLn "DDCi-core, version 0.3.0: http://disciple.ouroborus.net."
+ = do   putStrLn "DDCi-core, version 0.3.1: http://disciple.ouroborus.net."
         putStrLn "Type :help for help."
 
         -- Setup terminal mode.
