diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index d72b9c0..a9e9008 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -15690,6 +15690,17 @@ The function containsVars tests whether term t contains a * variable.
 
 \end{chunk}
 
+\defun{isPatternVar}{isPatternVar}
+\begin{chunk}{defun isPatternVar}
+(defun |isPatternVar| (v)
+  (and (identp v)
+       (member v
+             '(** *1 *2 *3 *4 *5 *6 *7 *8 *9 *10 *11 *12 *13 *14 *15
+                  *16 *17 *18 *19 *20))
+       t))
+
+\end{chunk}
+
 \defun{containsVars1}{containsVars1}
 The function containsVars1 tests whether term t contains a * variable.
 This is a recursive version, which works on a list.
@@ -44727,6 +44738,7 @@ This needs to work off the internal exposure list, not the file.
 \getchunk{defun isListOfIdentifiers}
 \getchunk{defun isListOfIdentifiersOrStrings}
 \getchunk{defun isPartialMode}
+\getchunk{defun isPatternVar}
 \getchunk{defun isSharpVar}
 \getchunk{defun isSharpVarWithNum}
 \getchunk{defun isSubForRedundantMapName}
diff --git a/changelog b/changelog
index d1c602f..6456484 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+20130314 tpd src/axiom-website/patches.html 20130314.05.tpd.patch
+20130314 tpd src/interp/i-funsel.lisp remove functions
+20130314 tpd src/interp/g-util.lisp remove functions
+20130314 tpd books/bookvol5 treeshake interpreter code
 20130314 tpd src/axiom-website/patches.html 20130314.04.jzc.patch
 20130314 jzc books/bookvol1 fix typo
 20130314 jzc books/bookvol0 fix typo
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 84d0e8b..2eee39e 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -4037,5 +4037,7 @@ readme add Jia Zhao Cong
 changlog. fix jzc email address
 <a href="patches/20130314.04.jzc.patch">20130314.04.jzc.patch</a>
 books/bookvol0, books/bookvol1 fix typo
+<a href="patches/20130314.05.tpd.patch">20130314.05.tpd.patch</a>
+books/bookvol5 treeshake interpreter code
  </body>
 </html>
diff --git a/src/interp/g-util.lisp.pamphlet b/src/interp/g-util.lisp.pamphlet
index 71c4655..e542b8f 100644
--- a/src/interp/g-util.lisp.pamphlet
+++ b/src/interp/g-util.lisp.pamphlet
@@ -452,18 +452,6 @@
      (UNIONQ (|listOfPatternIds| (CAR |x|))
              (|listOfPatternIds| (CDR |x|))))))
 
-;isPatternVar v ==
-;  -- a pattern variable consists of a star followed by a star or digit(s)
-;  IDENTP(v) and MEMQ(v,'(_*_* _*1 _*2 _*3 _*4 _*5 _*6 _*7 _*8 _*9 _*10
-;    _*11 _*12 _*13 _*14 _*15 _*16 _*17 _*18 _*19 _*20)) and true
-
-(DEFUN |isPatternVar| (|v|)
-  (AND (IDENTP |v|)
-       (member |v|
-             '(** *1 *2 *3 *4 *5 *6 *7 *8 *9 *10 *11 *12 *13 *14 *15
-                  *16 *17 *18 *19 *20))
-       'T))
-
 ;removeZeroOne x ==
 ;  -- replace all occurrences of (Zero) and (One) with
 ;  -- 0 and 1
diff --git a/src/interp/i-funsel.lisp.pamphlet b/src/interp/i-funsel.lisp.pamphlet
index b5cd117..05ddba6 100644
--- a/src/interp/i-funsel.lisp.pamphlet
+++ b/src/interp/i-funsel.lisp.pamphlet
@@ -5131,35 +5131,6 @@ the types A and B themselves are not sorted by preference.
                                     (|prefix2String| (CAR |sig|))))))))))
              (|sayMSG|  " "))))))
 
-;containsVars(t) ==
-;  -- tests whether term t contains a * variable
-;  atom t => isPatternVar t
-;  containsVars1(t)
-
-(defun |containsVars| (arg)
- (if (atom arg)
-  (|isPatternVar| arg)
-  (|containsVars1| arg)))
-
-;containsVars1(t) ==
-;  -- recursive version, which works on a list
-;  [t1,:t2]:= t
-;  atom t1 =>
-;    isPatternVar t1 or
-;      atom t2 => isPatternVar t2
-;      containsVars1(t2)
-;  containsVars1(t1) or
-;    atom t2 => isPatternVar t2
-;    containsVars1(t2)
-
-(defun |containsVars1| (arg)
- (let ((t1 (car arg)) (t2 (cdr arg)))
-  (if (atom t1)
-     (or (|isPatternVar| t1)
-         (if (atom t2) (|isPatternVar| t2) (|containsVars1| t2)))
-     (or (|containsVars1| t1)
-         (if (atom t2)  (|isPatternVar| t2) (|containsVars1| t2))))))
-
 ;getSymbolType var ==
 ;-- var is a pattern variable
 ;  p:= ASSQ(var,$SymbolType) => CDR p
@@ -5177,35 +5148,6 @@ the types A and B themselves are not sorted by preference.
     (setq |$SymbolType| (cons (cons var tmp) |$SymbolType|))
     tmp))))
 
-;isEqualOrSubDomain(d1,d2) ==
-;  -- last 2 parts are for tagged unions (hack for now, RSS)
-;  (d1=d2) or isSubDomain(d1,d2) or
-;    (atom(d1) and ((d2 is ['Variable,=d1]) or (d2 is [=d1])))
-;     or (atom(d2) and ((d1 is ['Variable,=d2]) or (d1 is [=d2])))
-
-(DEFUN |isEqualOrSubDomain| (|d1| |d2|)
-  (PROG (|ISTMP#1|)
-    (RETURN
-      (OR (BOOT-EQUAL |d1| |d2|) (|isSubDomain| |d1| |d2|)
-          (AND (ATOM |d1|)
-               (OR (AND (CONSP |d2|) (EQ (QCAR |d2|) '|Variable|)
-                        (PROGN
-                          (setq |ISTMP#1| (QCDR |d2|))
-                          (AND (CONSP |ISTMP#1|)
-                               (EQ (QCDR |ISTMP#1|) NIL)
-                               (EQUAL (QCAR |ISTMP#1|) |d1|))))
-                   (AND (CONSP |d2|) (EQ (QCDR |d2|) NIL)
-                        (EQUAL (QCAR |d2|) |d1|))))
-          (AND (ATOM |d2|)
-               (OR (AND (CONSP |d1|) (EQ (QCAR |d1|) '|Variable|)
-                        (PROGN
-                          (setq |ISTMP#1| (QCDR |d1|))
-                          (AND (CONSP |ISTMP#1|)
-                               (EQ (QCDR |ISTMP#1|) NIL)
-                               (EQUAL (QCAR |ISTMP#1|) |d2|))))
-                   (AND (CONSP |d1|) (EQ (QCDR |d1|) NIL)
-                        (EQUAL (QCAR |d1|) |d2|))))))))
-
 ;defaultTypeForCategory(cat, SL) ==
 ;  -- this function returns a domain belonging to cat
 ;  -- note that it is important to note that in some contexts one
