diff --git a/ghc/compiler/main/CmdLineOpts.lhs b/ghc/compiler/main/CmdLineOpts.lhs
index 348831a1553dc02ada03a6b3f2eb4aef5e25e6d9..f9a7373e1558adcd355e9a35c084992d61fe7ad0 100644
--- a/ghc/compiler/main/CmdLineOpts.lhs
+++ b/ghc/compiler/main/CmdLineOpts.lhs
@@ -300,7 +300,8 @@ data HscLang
   = HscC
   | HscAsm
   | HscJava
-  | HscInterpreter
+  | HscInterpreted
+    deriving Eq
 
 dopt_HscLang :: DynFlags -> HscLang
 dopt_HscLang = hscLang
diff --git a/ghc/compiler/main/HscMain.lhs b/ghc/compiler/main/HscMain.lhs
index 1f5931530d2207da6945ed4a8d47155a4fa8f52e..0be91c56070aacc96ed5df8b4db6a8889e8df37e 100644
--- a/ghc/compiler/main/HscMain.lhs
+++ b/ghc/compiler/main/HscMain.lhs
@@ -61,11 +61,10 @@ data HscResult
 	     (Maybe String)  	     -- generated stub_c filename (in /tmp)
 	     (Maybe [UnlinkedIBind]) -- interpreted code, if any
              PersistentCompilerState -- updated PCS
-             (Bag WarnMsg) 		-- warnings
 
-   | HscErrs PersistentCompilerState -- updated PCS
-             (Bag ErrMsg)		-- errors
-             (Bag WarnMsg)             -- warnings
+   | HscFail PersistentCompilerState -- updated PCS
+	-- no errors or warnings; the individual passes
+	-- (parse/rename/typecheck) print messages themselves
 
 hscMain
   :: DynFlags	
@@ -95,35 +94,42 @@ hscMain dflags core_cmds stg_cmds summary maybe_old_iface
 hscNoRecomp = panic "hscNoRecomp"
 
 hscRecomp dflags core_cmds stg_cmds summary hit hst pcs maybe_old_iface
- = do 
-      -- parsed :: RdrNameHsModule
-      parsed <- parseModule summary
-      -- check for parse errors
+ = do {
+      -- what target are we shooting for?
+      let toInterp = dopt_HscLang dflags == HscInterpreted;
 
-      (pcs_rn, maybe_rn_result) 
-         <- renameModule dflags finder hit hst pcs mod parsed
-
-      -- check maybe_rn_result for failure
+      -- PARSE
+      maybe_parsed <- myParseModule dflags summary;
+      case maybe_parsed of {
+         Nothing -> return (HscFail pcs);
+         Just rdr_module -> do {
 
-      (new_iface, rn_hs_decls) = unJust maybe_rn_result
+      -- RENAME
+      (pcs_rn, maybe_rn_result) 
+         <- renameModule dflags finder hit hst pcs mod rdr_module;
+      case maybe_rn_result of {
+         Nothing -> return (HscFail pcs_rn);
+         Just (new_iface, rn_hs_decls) -> do {
 
+      -- TYPECHECK
       maybe_tc_result
-         <- typecheckModule dflags mod pcs hst hit pit rn_hs_decls
-
-      -- check maybe_tc_result for failure
-      let tc_result = unJust maybe_tc_result
-      let tc_pcs = tc_pcs tc_result
-      let tc_env = tc_env tc_result
-      let tc_binds = tc_binds tc_result
-      let local_tycons = tc_tycons tc_result
+         <- typecheckModule dflags mod pcs_rn hst hit pit rn_hs_decls;
+      case maybe_tc_result of {
+         Nothing -> return (HscFail pcs_rn);
+         Just tc_result -> do {
+
+      let pcs_tc        = tc_pcs tc_result
+      let env_tc        = tc_env tc_result
+      let binds_tc      = tc_binds tc_result
+      let local_tycons  = tc_tycons tc_result
       let local_classes = tc_classes tc_result
 
-      -- desugar, simplify and tidy, to create the unfoldings
-      -- why is this IO-typed?
+      -- DESUGAR, SIMPLIFY, TIDY-CORE
+      -- We grab the the unfoldings at this point.
       (tidy_binds, orphan_rules, fe_binders, h_code, c_code)   -- return modDetails?
          <- dsThenSimplThenTidy dflags mod tc_result rule_base ds_uniqs
 
-      -- convert to Stg; needed for binders
+      -- CONVERT TO STG
       (stg_binds, cost_centre_info, top_level_ids) 
          <- myCoreToStg c2s_uniqs st_uniqs this_mod tidy_binds
 
@@ -134,18 +140,54 @@ hscRecomp dflags core_cmds stg_cmds summary hit hst pcs maybe_old_iface
       let maybe_final_iface = completeIface maybe_old_iface new_iface new_details 
 
       -- do the rest of code generation/emission
-      -- this is obviously nonsensical: FIX
-      (unlinkeds, stub_h_filename, stub_c_filename) 
-         <- restOfCodeGeneration this_mod imported_modules cost_centre_info 
+      (maybe_ibinds, maybe_stub_h_filename, maybe_stub_c_filename) 
+         <- restOfCodeGeneration toInterp
+                                 this_mod imported_modules cost_centre_info 
                                  fe_binders local_tycons local_classes stg_binds
 
       -- and the answer is ...
-      return (HscOK new_details maybe_final_iface stub_h_filename stub_c_filename
-                    unlinkeds tc_pcs (unionBags rn_warns tc_warns))
+      return (HscOK new_details maybe_final_iface 
+		    maybe_stub_h_filename maybe_stub_c_filename
+                    maybe_ibinds pcs_tc)
+      }}}}}}}
+
+myParseModule dflags summary
+ = do --------------------------  Reader  ----------------
+      show_pass "Parser"
+      -- _scc_     "Parser"
+
+      let src_filename -- name of the preprocessed source file
+         = case ms_ppsource summary of
+              Just (filename, fingerprint) -> filename
+              Nothing -> pprPanic "myParseModule:summary is not of a source module"
+                                  (ppr summary)
+
+      buf <- hGetStringBuffer True{-expand tabs-} src_filename
+
+      let glaexts | dopt Opt_GlasgowExts dflags = 1#
+	          | otherwise 		      = 0#
 
+      case parse buf PState{ bol = 0#, atbol = 1#,
+	 		     context = [], glasgow_exts = glaexts,
+			     loc = mkSrcLoc src_filename 1 } of {
 
-restOfCodeGeneration this_mod imported_modules cost_centre_info 
+	PFailed err -> do hPutStrLn stderr (showSDoc err)
+                          return Nothing
+	POk _ rdr_module@(HsModule mod_name _ _ _ _ _ _) ->
+
+      dumpIfSet_dyn dflags Opt_D_dump_parsed "Parser" (ppr rdr_module)
+      dumpIfSet_dyn dflags Opt_D_source_stats "Source Statistics"
+			   (ppSourceStats False rdr_module)
+
+      return (Just rdr_module)
+
+
+restOfCodeGeneration toInterp this_mod imported_modules cost_centre_info 
                      fe_binders local_tycons local_classes stg_binds
+ | toInterp
+ = return (Nothing, Nothing, stgToIBinds stg_binds local_tycons local_classes)
+
+ | otherwise
  = do --------------------------  Code generation -------------------------------
       show_pass "CodeGen"
       -- _scc_     "CodeGen"
@@ -161,8 +203,7 @@ restOfCodeGeneration this_mod imported_modules cost_centre_info
                        occ_anal_tidy_binds stg_binds2
                        c_code h_code abstractC ncg_uniqs
 
-      -- this is obviously nonsensical: FIX
-      return (maybe_stub_h_name, maybe_stub_c_name, [])
+      return (maybe_stub_h_name, maybe_stub_c_name, [{-UnlinkedIBind-}])
 
 
 dsThenSimplThenTidy dflags mod tc_result rule_base ds_uniqs
diff --git a/ghc/compiler/stgSyn/StgInterp.lhs b/ghc/compiler/stgSyn/StgInterp.lhs
index 7c0eb6e701865a216eeec3f22698b71ec355ac19..fecb54bc4c44b432ff5d49c9c28ccc7666ebb0d5 100644
--- a/ghc/compiler/stgSyn/StgInterp.lhs
+++ b/ghc/compiler/stgSyn/StgInterp.lhs
@@ -11,6 +11,8 @@ module StgInterp (
     linkIModules,	-- :: ItblEnv -> ClosureEnv -> [[UnlinkedIBind]] -> 
 		 	--	([LinkedIBind], ItblEnv, ClosureEnv)
 
+    stgToIBinds,	-- :: [StgBinding] -> [UnlinkedIBind]
+
     runStgI  -- tmp, for testing
  ) where
 
@@ -94,11 +96,13 @@ runStgI	      = panic "StgInterp.runStgI: not implemented"
 linkIModules  = panic "StgInterp.linkIModules: not implemented"
 #else
 
+
+
 -- the bindings need to have a binding for stgMain, and the
 -- body of it had better represent something of type Int# -> Int#
 runStgI tycons classes stgbinds
    = do 
-	let unlinked_binds = concatMap (stg2IBinds emptyUniqSet) stgbinds
+	let unlinked_binds = concatMap (translateBind emptyUniqSet) stgbinds
 	     
 {-
         let dbg_txt 
@@ -133,9 +137,13 @@ runStgI tycons classes stgbinds
 -- Convert STG to an unlinked interpretable
 -- ---------------------------------------------------------------------------
 
-stg2IBinds :: UniqSet Id -> StgBinding -> [UnlinkedIBind]
-stg2IBinds ie (StgNonRec v e)  = [IBind v (rhs2expr ie e)]
-stg2IBinds ie (StgRec vs_n_es) = [IBind v (rhs2expr ie' e) | (v,e) <- vs_n_es]
+-- visible from outside
+stgToIBinds :: [StgBinding] -> [UnlinkedIBind]
+stgToIBinds = concatMap (translateBind emptyUniqSet)
+
+translateBind :: UniqSet Id -> StgBinding -> [UnlinkedIBind]
+translateBind ie (StgNonRec v e)  = [IBind v (rhs2expr ie e)]
+translateBind ie (StgRec vs_n_es) = [IBind v (rhs2expr ie' e) | (v,e) <- vs_n_es]
   where ie' = addListToUniqSet ie (map fst vs_n_es)
 
 isRec (StgNonRec _ _) = False
@@ -336,12 +344,12 @@ stg2expr ie stgexpr
 
         StgLet binds@(StgNonRec v e) body
 	   -> mkNonRec (repOfStgExpr stgexpr) 
-		(head (stg2IBinds ie binds)) 
+		(head (translateBind ie binds)) 
 		(stg2expr (addOneToUniqSet ie v) body)
 
         StgLet binds@(StgRec bs) body
            -> mkRec (repOfStgExpr stgexpr) 
-		(stg2IBinds ie binds) 
+		(translateBind ie binds) 
 		(stg2expr (addListToUniqSet ie (map fst bs)) body)
 
         other 
@@ -416,7 +424,7 @@ linkIModules ie ce mods = do
   new_ie <- mkITbls (concat tyconss)
   let new_ce = addListToFM ce (zip top_level_binders new_rhss)
       new_rhss = map (\b -> evalP (bindee b) emptyUFM) new_binds
-    ---vvvvvvvvv--------------------------------------^^^^^^^^^-- circular
+    ---vvvvvvvvv---------------------------------------^^^^^^^^^-- circular
       (new_binds, final_ie, final_ce) = linkIBinds new_ie new_ce binds
 
   return (new_binds, final_ie, final_ce)