diff --git a/CHANGES b/CHANGES
new file mode 100644
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,6 @@
+3.7.7.0
+
+  - Restrict clients so they see much less, including hiding
+    the value constructors for Body.
+
+
diff --git a/Compiler/Hoopl.hs b/Compiler/Hoopl.hs
--- a/Compiler/Hoopl.hs
+++ b/Compiler/Hoopl.hs
@@ -9,6 +9,6 @@
 
 import Compiler.Hoopl.Dataflow
 import Compiler.Hoopl.Fuel hiding (withFuel, getFuel, setFuel)
-import Compiler.Hoopl.Graph
+import Compiler.Hoopl.Graph hiding (BodyEmpty, BodyUnit, BodyCat)
 import Compiler.Hoopl.Label hiding (allLabels)
 import Compiler.Hoopl.MkGraph
diff --git a/Compiler/Hoopl/Dataflow.hs b/Compiler/Hoopl/Dataflow.hs
--- a/Compiler/Hoopl/Dataflow.hs
+++ b/Compiler/Hoopl/Dataflow.hs
@@ -59,9 +59,9 @@
   ( DataflowLattice(..), JoinFun, OldFact(..), NewFact(..)
   , ChangeFlag(..), changeIf
   , FwdPass(..),  FwdTransfer, FwdRewrite, SimpleFwdRewrite
-  , noFwdRewrite, thenFwdRw, shallowFwdRw, deepFwdRw
+  , noFwdRewrite, thenFwdRw, shallowFwdRw, deepFwdRw, iterFwdRw
   , BwdPass(..), BwdTransfer, BwdRewrite, SimpleBwdRewrite
-  , noBwdRewrite, thenBwdRw, shallowBwdRw, deepBwdRw
+  , noBwdRewrite, thenBwdRw, shallowBwdRw, deepBwdRw, iterBwdRw
   , Fact
   , analyzeAndRewriteFwd, analyzeAndRewriteBwd
   )
@@ -127,16 +127,19 @@
                          Nothing -> Nothing
                          Just ag -> Just (FwdRes ag noFwdRewrite)
 
+deepFwdRw :: SimpleFwdRewrite n f -> FwdRewrite n f
+deepFwdRw r = iterFwdRw (shallowFwdRw r)
+
 thenFwdRw :: FwdRewrite n f -> FwdRewrite n f -> FwdRewrite n f
 thenFwdRw rw1 rw2 n f
   = case rw1 n f of
       Nothing               -> rw2 n f
       Just (FwdRes ag rw1a) -> Just (FwdRes ag (rw1a `thenFwdRw` rw2))
 
-deepFwdRw :: FwdRewrite n f -> FwdRewrite n f
-deepFwdRw rw =
+iterFwdRw :: FwdRewrite n f -> FwdRewrite n f
+iterFwdRw rw =
   \ n f -> case rw n f of
-             Just (FwdRes g rw2) -> Just $ FwdRes g (rw2 `thenFwdRw` deepFwdRw rw)
+             Just (FwdRes g rw2) -> Just $ FwdRes g (rw2 `thenFwdRw` iterFwdRw rw)
              Nothing             -> Nothing
 
 analyzeAndRewriteFwd
@@ -241,15 +244,21 @@
                          Nothing -> Nothing
                          Just ag -> Just (BwdRes ag noBwdRewrite)
 
+deepBwdRw :: SimpleBwdRewrite n f -> BwdRewrite n f
+deepBwdRw r = iterBwdRw (shallowBwdRw r)
+
+
 thenBwdRw :: BwdRewrite n f -> BwdRewrite n f -> BwdRewrite n f
 thenBwdRw rw1 rw2 n f
   = case rw1 n f of
       Nothing               -> rw2 n f
       Just (BwdRes ag rw1a) -> Just (BwdRes ag (rw1a `thenBwdRw` rw2))
 
-deepBwdRw :: BwdRewrite n f -> BwdRewrite n f
-deepBwdRw rw = rw `thenBwdRw` deepBwdRw rw
-
+iterBwdRw :: BwdRewrite n f -> BwdRewrite n f
+iterBwdRw rw =
+  \ n f -> case rw n f of
+             Just (BwdRes g rw2) -> Just $ BwdRes g (rw2 `thenBwdRw` iterBwdRw rw)
+             Nothing             -> Nothing
 
 -----------------------------------------------------------------------------
 --		Backward implementation
@@ -439,6 +448,9 @@
 --	RG: an internal data type for graphs under construction
 --          TOTALLY internal to Hoopl
 -----------------------------------------------------------------------------
+
+-- this type exists because we have not yet found a way to write arfNode
+-- to return a Graph; the invariants of Graph seem too strong
 
 data RG n f e x where
   RGNil   :: RG n f a a
diff --git a/Compiler/Hoopl/Graph.hs b/Compiler/Hoopl/Graph.hs
--- a/Compiler/Hoopl/Graph.hs
+++ b/Compiler/Hoopl/Graph.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE GADTs, EmptyDataDecls #-}
 
 module Compiler.Hoopl.Graph 
-  ( O, C, Block(..), Body(..), Graph(..), MaybeO(..)
+  ( O, C, Block(..), Body(..), bodyMap, Graph(..), MaybeO(..)
   , Edges(entryLabel, successors)
   , addBlock, bodyList
   )
@@ -59,4 +59,7 @@
     go BodyEmpty       bs = bs
     go (BodyUnit b)    bs = (entryLabel b, b) : bs
     go (BodyCat b1 b2) bs = go b1 (go b2 bs)
+
+bodyMap :: Edges n => Body n -> LabelMap (Block n C C)
+bodyMap = mkFactBase . bodyList
 
diff --git a/Compiler/Hoopl/MkGraph.hs b/Compiler/Hoopl/MkGraph.hs
--- a/Compiler/Hoopl/MkGraph.hs
+++ b/Compiler/Hoopl/MkGraph.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 module Compiler.Hoopl.MkGraph
-    ( AGraph, (<*>)
-    , emptyAGraph, withFreshLabels
+    ( AGraph, (<*>), gCatClosed
+    , emptyAGraph, emptyClosedAGraph, withFreshLabels
     , mkFirst, mkMiddle, mkMiddles, mkLast, mkEntry, mkBranch, mkLabel, mkWhileDo
     , addEntrySeq, addExitSeq, catAGraphs
     , IfThenElseable(mkIfThenElse)
@@ -26,6 +26,9 @@
 
 emptyAGraph :: AGraph n O O
 emptyAGraph = return GNil
+
+emptyClosedAGraph :: AGraph n C C
+emptyClosedAGraph = return $ GMany NothingO BodyEmpty NothingO
 
 addEntrySeq    :: AGraph n O C -> AGraph n C x -> AGraph n O x
 addExitSeq     :: AGraph n e C -> AGraph n C O -> AGraph n e O
diff --git a/Compiler/Hoopl/Util.hs b/Compiler/Hoopl/Util.hs
new file mode 100644
--- /dev/null
+++ b/Compiler/Hoopl/Util.hs
@@ -0,0 +1,14 @@
+module Compiler.Hoopl.Util
+  ( gUnitOO, gUnitOC, gUnitCO, gUnitCC
+  )
+where
+
+import Compiler.Hoopl.Graph
+gUnitOO :: Block n O O -> Graph n O O
+gUnitOC :: Block n O C -> Graph n O C
+gUnitCO :: Block n C O -> Graph n C O
+gUnitCC :: Block n C C -> Graph n C C
+gUnitOO b = GUnit b
+gUnitOC b = GMany (JustO b) BodyEmpty   NothingO
+gUnitCO b = GMany NothingO  BodyEmpty   (JustO b)
+gUnitCC b = GMany NothingO  (BodyUnit b) NothingO
diff --git a/hoopl.cabal b/hoopl.cabal
--- a/hoopl.cabal
+++ b/hoopl.cabal
@@ -1,5 +1,5 @@
 Name:                hoopl
-Version:             3.7.4.0
+Version:             3.7.7.0
 Description:         Higher-order optimization library
 License:             BSD3
 License-file:        LICENSE
@@ -7,15 +7,19 @@
 Maintainer:          nr@cs.tufts.edu
 Build-Type:          Simple
 Cabal-Version:       >=1.2
+Stability:           alpha
 Synopsis:            A library to support dataflow analysis and optimization
 Category:            Compilers/Interpreters
-Extra-source-files:  README, hoopl.pdf
+Extra-source-files:  README, hoopl.pdf, CHANGES
 
 Library
   Build-Depends:     base >= 3 && < 5, containers
-  Exposed-modules:   Compiler.Hoopl,
-                     Compiler.Hoopl.Dataflow, Compiler.Hoopl.Graph, 
-                     Compiler.Hoopl.MkGraph,
-                     Compiler.Hoopl.Fuel, Compiler.Hoopl.Label
-  Other-modules:     Compiler.Hoopl.GraphUtil
+  Exposed-modules:   Compiler.Hoopl
+  Other-modules:     Compiler.Hoopl.GraphUtil,
+                     -- GraphUtil should *never* be seen by clients.
+                     -- The remaining modules are hidden *provisionally*
+                       Compiler.Hoopl.Dataflow, Compiler.Hoopl.Graph, 
+                       Compiler.Hoopl.MkGraph,
+                       Compiler.Hoopl.Fuel, Compiler.Hoopl.Label,
+                       Compiler.Hoopl.Util
   ghc-options:       -Wall -fno-warn-name-shadowing
diff --git a/hoopl.pdf b/hoopl.pdf
Binary files a/hoopl.pdf and b/hoopl.pdf differ
