diff --git a/changelog b/changelog
index b2cfcab..eb3bf8b 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+20090711 tpd src/axiom-website/patches.html 20090711.04.tpd.patch
+20090711 tpd src/interp/Makefile remove bc-util
+20090711 tpd src/interp/bc-matrix.boot merge bc-util
+20090711 tpd src/interp/bc-util.boot removed, merge with bc-matrix
 20090711 tpd src/axiom-website/patches.html 20090711.03.tpd.patch
 20090711 tpd books/bookvol7 htsearch moved to $AXIOM/bin
 20090711 tpd src/axiom-website/patches.html 20090711.02.tpd.patch
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 4bcffba..2ae6c2e 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -1701,5 +1701,7 @@ merge bc-matrix and bc-solve<br/>
 bookvol10.4 fix )show QUATCT2 path to file<br/>
 <a href="patches/20090711.03.tpd.patch">20090711.03.tpd.patch</a>
 books/bookvol7 htsearch moved to $AXIOM/bin<br/>
+<a href="patches/20090711.04.tpd.patch">20090711.04.tpd.patch</a>
+merge bc-matrix and bc-util<br/>
  </body>
 </html>
diff --git a/src/interp/Makefile.pamphlet b/src/interp/Makefile.pamphlet
index 26d5758..2eba5bd 100644
--- a/src/interp/Makefile.pamphlet
+++ b/src/interp/Makefile.pamphlet
@@ -284,7 +284,6 @@ The {\bf BROBJS} list contains files only used by the hypertex
 browser. These files should probably be autoloaded.
 <<environment>>=
 BROBJS=	${AUTO}/bc-matrix.${O}				\
-	${AUTO}/bc-util.${O}				\
 	${AUTO}/ht-util.${O}	${AUTO}/htsetvar.${O}	\
 	${AUTO}/ht-root.${O}	\
 	${AUTO}/br-con.${O}	\
@@ -431,7 +430,6 @@ DOCFILES=${DOC}/alql.boot.dvi \
 	 ${DOC}/astr.boot.dvi ${DOC}/ax.boot.dvi \
 	 ${DOC}/axext_l.lisp.dvi \
 	 ${DOC}/bc-matrix.boot.dvi \
-	 ${DOC}/bc-util.boot.dvi \
 	 ${DOC}/bits.lisp.dvi ${DOC}/bootfuns.lisp.dvi \
 	 ${DOC}/br-con.boot.dvi \
 	 ${DOC}/br-data.boot.dvi ${DOC}/br-op1.boot.dvi \
@@ -5606,55 +5604,6 @@ ${DOC}/bc-matrix.boot.dvi: ${IN}/bc-matrix.boot.pamphlet
 
 @
 
-\subsection{bc-util.boot}
-<<bc-util.o (AUTO from OUT)>>=
-${AUTO}/bc-util.${O}: ${OUT}/bc-util.${O}
-	@ echo 434 making ${AUTO}/bc-util.${O} from ${OUT}/bc-util.${O}
-	@ cp ${OUT}/bc-util.${O} ${AUTO}
-
-@
-<<bc-util.o (OUT from MID)>>=
-${OUT}/bc-util.${O}: ${MID}/bc-util.clisp 
-	@ echo 435 making ${OUT}/bc-util.${O} from ${MID}/bc-util.clisp
-	@ (cd ${MID} ; \
-	  if [ -z "${NOISE}" ] ; then \
-	   echo '(progn  (compile-file "${MID}/bc-util.clisp"' \
-             ':output-file "${OUT}/bc-util.${O}") (${BYE}))' | ${DEPSYS} ; \
-	  else \
-	   echo '(progn  (compile-file "${MID}/bc-util.clisp"' \
-             ':output-file "${OUT}/bc-util.${O}") (${BYE}))' | ${DEPSYS} \
-             >${TMP}/trace ; \
-	  fi )
-
-@
-<<bc-util.clisp (MID from IN)>>=
-${MID}/bc-util.clisp: ${IN}/bc-util.boot.pamphlet
-	@ echo 436 making ${MID}/bc-util.clisp from ${IN}/bc-util.boot.pamphlet
-	@ (cd ${MID} ; \
-	  ${TANGLE} ${IN}/bc-util.boot.pamphlet >bc-util.boot ; \
-	  if [ -z "${NOISE}" ] ; then \
-	   echo '(progn (boottran::boottocl "bc-util.boot") (${BYE}))' \
-                | ${DEPSYS} ; \
-	  else \
-	   echo '(progn (boottran::boottocl "bc-util.boot") (${BYE}))' \
-                | ${DEPSYS} >${TMP}/trace ; \
-	  fi ; \
-	  rm bc-util.boot )
-
-@
-<<bc-util.boot.dvi (DOC from IN)>>=
-${DOC}/bc-util.boot.dvi: ${IN}/bc-util.boot.pamphlet 
-	@echo 437 making ${DOC}/bc-util.boot.dvi \
-                  from ${IN}/bc-util.boot.pamphlet
-	@(cd ${DOC} ; \
-	cp ${IN}/bc-util.boot.pamphlet ${DOC} ; \
-	${DOCUMENT} ${NOISE} bc-util.boot ; \
-	rm -f ${DOC}/bc-util.boot.pamphlet ; \
-	rm -f ${DOC}/bc-util.boot.tex ; \
-	rm -f ${DOC}/bc-util.boot )
-
-@
-
 \subsection{ht-util.boot}
 <<ht-util.o (AUTO from OUT)>>=
 ${AUTO}/ht-util.${O}: ${OUT}/ht-util.${O}
@@ -7954,11 +7903,6 @@ clean:
 <<bc-matrix.clisp (MID from IN)>>
 <<bc-matrix.boot.dvi (DOC from IN)>>
 
-<<bc-util.o (AUTO from OUT)>>
-<<bc-util.o (OUT from MID)>>
-<<bc-util.clisp (MID from IN)>>
-<<bc-util.boot.dvi (DOC from IN)>>
-
 <<bits.o (OUT from MID)>>
 <<bits.lisp (MID from IN)>>
 <<bits.lisp.dvi (DOC from IN)>>
diff --git a/src/interp/bc-matrix.boot.pamphlet b/src/interp/bc-matrix.boot.pamphlet
index 4cfc8a8..099549b 100644
--- a/src/interp/bc-matrix.boot.pamphlet
+++ b/src/interp/bc-matrix.boot.pamphlet
@@ -1379,9 +1379,104 @@ bcGenEquations alist ==
   rest eqnlist => bcwords2liststring eqnlist
   first eqnlist
   
+
+bcFinish(name,arg,:args) == bcGen bcMkFunction(name,arg,args)
+
+bcMkFunction(name,arg,args) ==
+  args := [x for x in args | x]
+  STRCONC(name,'"(",arg,"STRCONC"/[STRCONC('",", x) for x in args],'")")
+
+bcString2HyString2 s ==
+  (STRINGP s) and (s.0 = char '_")  =>
+    len := #s
+    STRCONC('"\_"", SUBSTRING(s, 1, len-2), '"\_"")
+  s
+
+bcString2HyString s == s
+
+bcFindString(s,i,n,char) ==  or/[j for j in i..n | s.j = char]
+
+bcGen command ==
+  htInitPage('"Basic Command",nil)
+  string :=
+    #command < 50 => STRCONC('"{\centerline{\tt ",command,'" }}")
+    STRCONC('"{\tt ",command,'" }")
+  htMakePage [
+     '(text
+        "{Here is the AXIOM command you could have issued to compute this result:}"
+            "\vspace{2}\newline "),
+      ['text,:string]]
+  htMakeDoitButton('"Do It", command)
+  htShowPage()
+
+-- bcGen for axiom - nag link
+linkGen command ==
+  htInitPage('"AXIOM-Nag Link Command",nil)
+  string := 
+    #command < 50 => STRCONC('"{\centerline{ ",command,'" }}")
+    command
+  htMakePage [
+     '(text 
+        "\centerline{{\em Here is the AXIOM command}}"
+          "\centerline{{\em you could have issued to compute this result:}}"
+            "\vspace{2}\newline "),
+      ['text,:string]]
+  htMakeDoitButton('"Do It", command)
+  htShowPage()
+
+bcOptional s ==
+  s = '"" => '"2"
+  s
+
+bcvspace() == bcHt '"\vspace{1}\newline "
+
+bcString2WordList s == fn(s,0,MAXINDEX s) where
+  fn(s,i,n) ==
+    i > n => nil
+    k := or/[j for j in i..n | s.j ^= char '_  ]
+    null INTEGERP k => nil
+    l := bcFindString(s,k + 1,n,char '_  )
+    null INTEGERP l => [SUBSTRING(s,k,nil)]
+    [SUBSTRING(s,k,l-k),:fn(s,l + 1,n)]
+
+
+bcwords2liststring u ==
+  null u => nil
+  STRCONC('"[",first u,fn rest u) where
+    fn(u) ==
+      null u => '"]"
+      STRCONC('", ",first u,fn rest u)
+
+bcVectorGen vec == bcwords2liststring vec
+
+bcError string ==
+  sayBrightlyNT '"NOTE: "
+  sayBrightly string
+
+bcDrawIt(ind,a,b) == STRCONC(ind,'"=",a,'"..",b)
+
+bcNotReady htPage ==
+  htInitPage('"Basic Command",nil)
+  htMakePage '(
+     (text .
+        "{\centerline{\em This facility will soon be available}}"))
+  htShowPage()
+
+htStringPad(n,w) ==
+  s := STRINGIMAGE n
+  ws := #s
+  STRCONC('"\space{",STRINGIMAGE (w - ws + 1),'"}",s)
+
+stringList2String x ==
+  null x => '"()"
+  STRCONC('"(",first x,"STRCONC"/[STRCONC('",",y) for y in rest x],'")")
+
+htMkName(s,n) == STRCONC(s,STRINGIMAGE n)
+
 @
 \eject
 \begin{thebibliography}{99}
 \bibitem{1} nothing
 \end{thebibliography}
 \end{document}
+
diff --git a/src/interp/bc-util.boot.pamphlet b/src/interp/bc-util.boot.pamphlet
deleted file mode 100644
index 5628714..0000000
--- a/src/interp/bc-util.boot.pamphlet
+++ /dev/null
@@ -1,147 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/interp bc-util.boot}
-\author{The Axiom Team}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\section{License}
-<<license>>=
--- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
--- All rights reserved.
---
--- Redistribution and use in source and binary forms, with or without
--- modification, are permitted provided that the following conditions are
--- met:
---
---     - Redistributions of source code must retain the above copyright
---       notice, this list of conditions and the following disclaimer.
---
---     - Redistributions in binary form must reproduce the above copyright
---       notice, this list of conditions and the following disclaimer in
---       the documentation and/or other materials provided with the
---       distribution.
---
---     - Neither the name of The Numerical ALgorithms Group Ltd. nor the
---       names of its contributors may be used to endorse or promote products
---       derived from this software without specific prior written permission.
---
--- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
--- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
--- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
--- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
--- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
--- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
--- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
--- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
--- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
--- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
--- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-@
-<<*>>=
-<<license>>
-
-bcFinish(name,arg,:args) == bcGen bcMkFunction(name,arg,args)
-
-bcMkFunction(name,arg,args) ==
-  args := [x for x in args | x]
-  STRCONC(name,'"(",arg,"STRCONC"/[STRCONC('",", x) for x in args],'")")
-
-bcString2HyString2 s ==
-  (STRINGP s) and (s.0 = char '_")  =>
-    len := #s
-    STRCONC('"\_"", SUBSTRING(s, 1, len-2), '"\_"")
-  s
-
-bcString2HyString s == s
-
-bcFindString(s,i,n,char) ==  or/[j for j in i..n | s.j = char]
-
-bcGen command ==
-  htInitPage('"Basic Command",nil)
-  string :=
-    #command < 50 => STRCONC('"{\centerline{\tt ",command,'" }}")
-    STRCONC('"{\tt ",command,'" }")
-  htMakePage [
-     '(text
-        "{Here is the AXIOM command you could have issued to compute this result:}"
-            "\vspace{2}\newline "),
-      ['text,:string]]
-  htMakeDoitButton('"Do It", command)
-  htShowPage()
-
--- bcGen for axiom - nag link
-linkGen command ==
-  htInitPage('"AXIOM-Nag Link Command",nil)
-  string := 
-    #command < 50 => STRCONC('"{\centerline{ ",command,'" }}")
-    command
-  htMakePage [
-     '(text 
-        "\centerline{{\em Here is the AXIOM command}}"
-          "\centerline{{\em you could have issued to compute this result:}}"
-            "\vspace{2}\newline "),
-      ['text,:string]]
-  htMakeDoitButton('"Do It", command)
-  htShowPage()
-
-bcOptional s ==
-  s = '"" => '"2"
-  s
-
-bcvspace() == bcHt '"\vspace{1}\newline "
-
-bcString2WordList s == fn(s,0,MAXINDEX s) where
-  fn(s,i,n) ==
-    i > n => nil
-    k := or/[j for j in i..n | s.j ^= char '_  ]
-    null INTEGERP k => nil
-    l := bcFindString(s,k + 1,n,char '_  )
-    null INTEGERP l => [SUBSTRING(s,k,nil)]
-    [SUBSTRING(s,k,l-k),:fn(s,l + 1,n)]
-
-
-bcwords2liststring u ==
-  null u => nil
-  STRCONC('"[",first u,fn rest u) where
-    fn(u) ==
-      null u => '"]"
-      STRCONC('", ",first u,fn rest u)
-
-bcVectorGen vec == bcwords2liststring vec
-
-bcError string ==
-  sayBrightlyNT '"NOTE: "
-  sayBrightly string
-
-bcDrawIt(ind,a,b) == STRCONC(ind,'"=",a,'"..",b)
-
-bcNotReady htPage ==
-  htInitPage('"Basic Command",nil)
-  htMakePage '(
-     (text .
-        "{\centerline{\em This facility will soon be available}}"))
-  htShowPage()
-
-htStringPad(n,w) ==
-  s := STRINGIMAGE n
-  ws := #s
-  STRCONC('"\space{",STRINGIMAGE (w - ws + 1),'"}",s)
-
-stringList2String x ==
-  null x => '"()"
-  STRCONC('"(",first x,"STRCONC"/[STRCONC('",",y) for y in rest x],'")")
-
-htMkName(s,n) == STRCONC(s,STRINGIMAGE n)
-
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
