diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 65dd896..feaedb0 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -760,6 +760,28 @@ will end up as a recursive call to ourselves.
  )
 @
 
+\defun{InterpExecuteSpadSystemCommand}{InterpExecuteSpadSystemCommand}
+<<defun InterpExecuteSpadSystemCommand>>=
+(defun |InterpExecuteSpadSystemCommand| (string)
+ (declare (special |$intSpadReader| |$intCoerceFailure|))
+  (catch |$intCoerceFailure|
+   (catch |$intSpadReader|
+    (|ExecuteInterpSystemCommand| string))))
+
+@
+
+\defun{ExecuteInterpSystemCommand}{ExecuteInterpSystemCommand}
+<<defun ExecuteInterpSystemCommand>>=
+(defun |ExecuteInterpSystemCommand| (string)
+ (let (|$currentLine|)
+ (declare (special |$currentLine|))
+  (setq string (|intProcessSynonyms| string))
+  (setq |$currentLine| string)
+  (setq string (substring string 1 nil))
+  (unless (equal string "") (|doSystemCommand| string))))
+
+@
+
 \defun{init-memory-config}{init-memory-config}
 Austin-Kyoto Common Lisp (AKCL), now known as Gnu Common Lisp (GCL)
 requires some changes to the default memory setup to run Axiom efficently.
@@ -7355,6 +7377,14 @@ TPDHERE: Note that this function also seems to parse out )except
 
 @
 
+\defun{clearMacroTable}{clearMacroTable}
+<<defun clearMacroTable>>=
+(defun |clearMacroTable| ()
+  (declare (special |$pfMacros|))
+  (setq |$pfMacros| nil))
+
+@
+
 \defun{clearCmdExcept}{clearCmdExcept}
 Clear all the options except the argument.
 <<defun clearCmdExcept>>=
@@ -20942,6 +20972,7 @@ maxindex
 <<defun clearCmdParts>>
 <<defun clearCmdSortedCaches>>
 <<defun clearFrame>>
+<<defun clearMacroTable>>
 <<defun clearSpad2Cmd>>
 <<defun close>>
 <<defun closeInterpreterFrame>>
@@ -21015,6 +21046,7 @@ maxindex
 <<defun erMsgCompare>>
 <<defun erMsgSep>>
 <<defun erMsgSort>>
+<<defun ExecuteInterpSystemCommand>>
 
 <<defun fetchOutput>>
 <<defun filterAndFormatConstructors>>
@@ -21144,6 +21176,7 @@ maxindex
 <<defun initToWhere>>
 <<defun insertpile>>
 <<defun insertPos>>
+<<defun InterpExecuteSpadSystemCommand>>
 <<defun intloop>>
 <<defun intloopEchoParse>>
 <<defun intloopInclude>>
diff --git a/changelog b/changelog
index 594ca27..b5b72a3 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+20091112 tpd src/axiom-website/patches.html 20091112.03.tpd.patch
+20091112 tpd src/interp/osyscmd.lisp move functions to bookvol5
+20091112 tpd src/interp/nci.lisp move clearMacroTable
+20091112 tpd books/bookvol5 tree-shake functions from nci and osyscmd
 20091112 tpd src/axiom-website/patches.html 20091112.02.tpd.patch
 20091112 tpd src/interp/i-syscmd remove unused parseFromString
 20091112 tpd src/axiom-website/patches.html 20091112.01.tpd.patch
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 16a7777..123d9b4 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2251,5 +2251,7 @@ bookvol5 merge msg.lisp<br/>
 src/interp/Makefile remove obey.lisp<br/>
 <a href="patches/20091112.02.tpd.patch">20091112.02.tpd.patch</a>
 src/interp/i-syscmd remove unused parseFromString<br/>
+<a href="patches/20091112.03.tpd.patch">20091112.03.tpd.patch</a>
+bookvol5 tree shake nci and osyscmd functions<br/>
  </body>
 </html>
diff --git a/src/interp/nci.lisp.pamphlet b/src/interp/nci.lisp.pamphlet
index e1bf845..d5e0e35 100644
--- a/src/interp/nci.lisp.pamphlet
+++ b/src/interp/nci.lisp.pamphlet
@@ -44,10 +44,6 @@
     (declare (special *package*))
     (apply fun args)))
 
-(defun |clearMacroTable| ()
-  (declare (special |$pfMacros|))
-  (setq |$pfMacros| NIL))
-
 (defun |getParserMacros| ()
   (declare (special |$pfMacros|))
     |$pfMacros|)
diff --git a/src/interp/osyscmd.lisp.pamphlet b/src/interp/osyscmd.lisp.pamphlet
index ed46c5f..865dbfd 100644
--- a/src/interp/osyscmd.lisp.pamphlet
+++ b/src/interp/osyscmd.lisp.pamphlet
@@ -13,37 +13,6 @@
 
 (IN-PACKAGE "BOOT")
 
-;InterpExecuteSpadSystemCommand string ==
-;  CATCH($intCoerceFailure,
-;    CATCH($intSpadReader, ExecuteInterpSystemCommand string) )
- 
-(DEFUN |InterpExecuteSpadSystemCommand| (|string|)
-  (PROG ()
-    (DECLARE (SPECIAL |$intSpadReader| |$intCoerceFailure|))
-    (RETURN
-      (CATCH |$intCoerceFailure|
-        (CATCH |$intSpadReader|
-          (|ExecuteInterpSystemCommand| |string|))))))
-
-;ExecuteInterpSystemCommand string ==
-;   string := intProcessSynonyms(string)
-;   $currentLine:local:=string
-;   string:=SUBSTRING(string,1,nil)
-;   string = '"" => nil
-;   doSystemCommand string
-
-(DEFUN |ExecuteInterpSystemCommand| (|string|)
-  (PROG (|$currentLine|)
-    (DECLARE (SPECIAL |$currentLine|))
-    (RETURN
-      (PROGN
-        (SETQ |string| (|intProcessSynonyms| |string|))
-        (SETQ |$currentLine| |string|)
-        (SETQ |string| (SUBSTRING |string| 1 NIL))
-        (COND
-          ((EQUAL |string| "") NIL)
-          ('T (|doSystemCommand| |string|)))))))
-
 ;--------------------> NEW DEFINITION (see i-syscmd.boot.pamphlet)
 ;parseFromString(s) ==
 ;   s := next(function ncloopParse,
