diff --git a/ghc/compiler/rename/RnEnv.lhs b/ghc/compiler/rename/RnEnv.lhs
index f975e910a57b90e21e70ddd2df3555dc7aa66565..551c6c48f5a89c7854b33ac05a445c1959ec26e5 100644
--- a/ghc/compiler/rename/RnEnv.lhs
+++ b/ghc/compiler/rename/RnEnv.lhs
@@ -484,16 +484,29 @@ pprFixityProvenance (fixity, how_in_scope) = ppr how_in_scope
 
 
 
-===============  Avails  ================
+===============  ExportAvails  ================
 \begin{code}
-mkExportAvails :: Bool -> Module -> [AvailInfo] -> ExportAvails
-mkExportAvails unqualified_import mod_name avails
+mkExportAvails :: Module -> Bool -> GlobalNameEnv -> [AvailInfo] -> ExportAvails
+mkExportAvails mod_name unqual_imp name_env avails
   = (mod_avail_env, entity_avail_env)
   where
-	-- The "module M" syntax only applies to *unqualified* imports (1.4 Report, Section 5.1.1)
-    mod_avail_env | unqualified_import = unitFM mod_name avails 
-		  | otherwise	       = emptyFM
-   
+    mod_avail_env = unitFM mod_name unqual_avails 
+
+	-- unqual_avails is the Avails that are visible in *unqualfied* form
+	-- (1.4 Report, Section 5.1.1)
+	-- For example, in 
+	--	import T hiding( f )
+	-- we delete f from avails
+
+    unqual_avails | not unqual_imp = []	-- Short cut when no unqualified imports
+		  | otherwise      = [prune avail | avail <- avails]
+
+    prune (Avail n) | unqual_in_scope n = Avail n
+    prune (Avail n) | otherwise		= NotAvailable
+    prune (AvailTC n ns) 		= AvailTC n (filter unqual_in_scope ns)
+
+    unqual_in_scope n = Unqual (nameOccName n) `elemFM` name_env
+
     entity_avail_env = listToUFM [ (name,avail) | avail <- avails, 
 			  	   		  name  <- availEntityNames avail]
 
@@ -556,8 +569,8 @@ filterAvail ie@(IEThingWith want wants) avail@(AvailTC n ns)
     avail_occs	   = map nameOccName ns
     wanted_occs    = map rdrNameOcc (want:wants)
 
-filterAvail (IEThingAbs _) (AvailTC n ns)      
-  | n `elem` ns = AvailTC n [n]
+filterAvail (IEThingAbs _) (AvailTC n ns)       = ASSERT( n `elem` ns ) 
+						  AvailTC n [n]
 
 filterAvail (IEThingAbs _) avail@(Avail n)      = avail		-- Type synonyms
 
diff --git a/ghc/compiler/rename/RnNames.lhs b/ghc/compiler/rename/RnNames.lhs
index a3ff9944313eba27d95399dbda64dfb91b0a41a6..f8cf4b11f828441ee4218e3c468a4aadaa74f8c8 100644
--- a/ghc/compiler/rename/RnNames.lhs
+++ b/ghc/compiler/rename/RnNames.lhs
@@ -313,7 +313,7 @@ qualifyImports this_mod qual_imp unqual_imp as_mod hides
 	fixity_env = foldl (add_fixity name_env2) emptyFixityEnv fixities
 
 	-- Create the export-availability info
-	export_avails = mkExportAvails unqual_imp qual_mod avails
+	export_avails = mkExportAvails qual_mod unqual_imp name_env2 avails
     in
     returnRn (RnEnv name_env2 fixity_env, export_avails)
   where