diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index e7e586e..1b01267 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -5205,6 +5205,101 @@ The tokConstruct function is a constructer and selectors for leaf tokens
 
 @
 
+\chapter{Attributed Structures}
+For objects which are pairs where the CAR field is either just a tag
+(an identifier) or a pair which is the tag and an association list.
+
+\defun{ncTag}{ncTag}
+Pick off the tag
+<<defun ncTag>>=
+(defun |ncTag| (x)
+ (cond
+  ((null (consp x)) (|ncBug| 's2cb0031 nil))
+  (t
+   (setq x (qcar x))
+   (cond
+    ((identp x) x)
+    ((null (consp x)) (|ncBug| 's2cb0031 nil))
+    (t (qcar x))))))
+
+@
+
+\defun{ncAlist}{ncAlist}
+Pick off the property list
+<<defun ncAlist>>=
+(defun |ncAlist| (x)
+ (cond
+  ((null (consp x)) (|ncBug| 's2cb0031 nil))
+  (t
+   (setq x (qcar x))
+   (cond
+    ((identp x) nil)
+    ((null (consp x)) (|ncBug| 's2cb0031 nil))
+    (t (qcdr x))))))
+
+@
+
+\defun{ncEltQ}{ncEltQ}
+Get the entry for key k on x's association list
+<<defun ncEltQ>>=
+(defun |ncEltQ| (x k)
+ (let (r)
+  (setq r (qassq k (|ncAlist| x)))
+  (cond
+   ((null r) (|ncBug| 's2cb0007 (list k)))
+   (t (cdr r)))))
+
+@
+
+\defun{ncPutQ}{ncPutQ}
+\begin{verbatim}
+;-- Put (k . v) on the association list of x and return v
+;-- case1: ncPutQ(x,k,v) where k is a key (an identifier), v a value
+;--        put the pair (k . v) on the association list of x and return v
+;-- case2: ncPutQ(x,k,v) where k is a list of keys, v a list of values
+;--        equivalent to [ncPutQ(x,key,val) for key in k for val in v]
+;ncPutQ(x,k,v) ==
+;   LISTP k =>
+;      for key in k for val in v repeat ncPutQ(x,key,val)
+;      v
+;   r := QASSQ(k,ncAlist x)
+;   if NULL r then
+;      r := CONS( CONS(k,v), ncAlist x)
+;      RPLACA(x,CONS(ncTag x,r))
+;   else
+;      RPLACD(r,v)
+;   v\end{verbatim}
+<<defun ncPutQ>>=
+(defun |ncPutQ| (x k v)
+ (let (r)
+  (cond
+   ((listp k)
+    ((lambda (Var1 key Var2 val)
+     (loop
+      (cond
+       ((or (atom Var1) 
+            (progn (setq key (car Var1)) nil)
+            (atom Var2)
+            (progn (setq val (car Var2)) nil))
+          (return nil))
+        (t
+          (|ncPutQ| x key val)))
+      (setq Var1 (cdr Var1))
+      (setq Var2 (cdr Var2))))
+     k nil v nil)
+    v)
+   (t
+    (setq r (qassq k (|ncAlist| x)))
+    (cond
+     ((null r)
+      (setq r (cons (cons k v) (|ncAlist| x)))
+      (rplaca x (cons (|ncTag| x) r)))
+     (t
+      (rplacd r v)))
+    v))))
+
+@
+
 \chapter{System Command Handling}
 \defdollar{systemCommands}
 The system commands are the top-level commands available in Axiom
@@ -20081,8 +20176,10 @@ maxindex
 <<defun mkLineList>>
 <<defun mkprompt>>
 
+<<defun ncAlist>>
 <<defun ncConversationPhase>>
 <<defun ncConversationPhase,wrapup>>
+<<defun ncEltQ>>
 <<defun ncError>>
 <<defun ncIntLoop>>
 <<defun ncloopCommand>>
@@ -20095,6 +20192,8 @@ maxindex
 <<defun ncloopParse>>
 <<defun ncloopPrefix?>>
 <<defun ncloopPrintLines>>
+<<defun ncPutQ>>
+<<defun ncTag>>
 <<defun ncTopLevel>>
 <<defun newHelpSpad2Cmd>>
 <<defun next>>
diff --git a/changelog b/changelog
index 317b322..da9e9c6 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,6 @@
+20091105 tpd src/axiom-website/patches.html 20091105.02.tpd.patch
+20091105 tpd src/interp/astr.lisp removed
+20091105 tpd books/bookvol5 merge astr.lisp
 20091105 tpd src/axiom-website/patches.html 20091105.01.tpd.patch
 20091105 tpd src/interp/ptrees.lisp partial merge
 20091105 tpd books/bookvol5 partial merge of ptrees
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 907f984..ae4d6d8 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2231,5 +2231,7 @@ books/bookvol5 merge, remove cstream.lisp<br/>
 src/interp/int-top.lisp removed<br/>
 <a href="patches/20091105.01.tpd.patch">20091105.01.tpd.patch</a>
 books/bookvol5 partial merge of ptrees<br/>
+<a href="patches/20091105.02.tpd.patch">20091105.02.tpd.patch</a>
+books/bookvol5 merge, remove of astr<br/>
  </body>
 </html>
diff --git a/src/interp/Makefile.pamphlet b/src/interp/Makefile.pamphlet
index 5b3972a..35740e1 100644
--- a/src/interp/Makefile.pamphlet
+++ b/src/interp/Makefile.pamphlet
@@ -140,7 +140,6 @@ The file http.lisp contains code to enable browser-based hyperdoc
 and graphics.
 <<environment>>=
 OBJS= ${OUT}/vmlisp.${O}      \
-      ${OUT}/astr.${O}        \
       ${OUT}/alql.${O}        ${OUT}/buildom.${O} \
       ${OUT}/cattable.${O}    \
       ${OUT}/cformat.${O}     ${OUT}/cfuns.${O} \
@@ -3447,29 +3446,6 @@ ${MID}/ptrop.lisp: ${IN}/ptrop.lisp.pamphlet
 
 @
 
-\subsection{astr.lisp}
-<<astr.o (OUT from MID)>>=
-${OUT}/astr.${O}: ${MID}/astr.lisp
-	@ echo 531 making ${OUT}/astr.${O} from ${MID}/astr.lisp
-	@ ( cd ${MID} ; \
-	  if [ -z "${NOISE}" ] ; then \
-	   echo '(progn  (compile-file "${MID}/astr.lisp"' \
-             ':output-file "${OUT}/astr.${O}") (${BYE}))' | ${DEPSYS} ; \
-	  else \
-	   echo '(progn  (compile-file "${MID}/astr.lisp"' \
-             ':output-file "${OUT}/astr.${O}") (${BYE}))' | ${DEPSYS} \
-             >${TMP}/trace ; \
-	  fi )
-
-@
-<<astr.lisp (MID from IN)>>=
-${MID}/astr.lisp: ${IN}/astr.lisp.pamphlet
-	@ echo 532 making ${MID}/astr.lisp from ${IN}/astr.lisp.pamphlet
-	@ (cd ${MID} ; \
-	   ${TANGLE} ${IN}/astr.lisp.pamphlet >astr.lisp )
-
-@
-
 \subsection{msg.lisp}
 <<msg.o (OUT from MID)>>=
 ${OUT}/msg.${O}: ${MID}/msg.lisp
@@ -4051,9 +4027,6 @@ clean:
 <<as.o (OUT from MID)>>
 <<as.lisp (MID from IN)>>
 
-<<astr.o (OUT from MID)>>
-<<astr.lisp (MID from IN)>>
-
 <<ax.o (AUTO from OUT)>>
 <<ax.o (OUT from MID)>>
 <<ax.lisp (MID from IN)>>
diff --git a/src/interp/astr.lisp.pamphlet b/src/interp/astr.lisp.pamphlet
deleted file mode 100644
index 2f97fc3..0000000
--- a/src/interp/astr.lisp.pamphlet
+++ /dev/null
@@ -1,132 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/interp astr.lisp}
-\author{The Axiom Team}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-<<*>>=
-
-(IN-PACKAGE "BOOT")
-
-;--% Attributed Structures (astr)
-;-- For objects which are pairs where the CAR field is either just a tag
-;-- (an identifier) or a pair which is the tag and an association list.
-; 
-;-- Pick off the tag
-;ncTag x ==
-;   not PAIRP x => ncBug('S2CB0031,[])
-;   x := QCAR x
-;   IDENTP x => x
-;   not PAIRP x => ncBug('S2CB0031,[])
-;   QCAR x
- 
-
-(DEFUN |ncTag| (|x|)
- (PROG NIL
-  (RETURN
-   (COND
-    ((NULL (CONSP |x|))
-     (|ncBug| (QUOTE S2CB0031) NIL))
-    (#0=(QUOTE T)
-     (PROGN
-      (SETQ |x| (QCAR |x|))
-      (COND
-       ((IDENTP |x|) |x|)
-       ((NULL (CONSP |x|)) (|ncBug| (QUOTE S2CB0031) NIL))
-       (#0# (QCAR |x|)))))))))
-
-
-;-- Pick off the property list
-;ncAlist x ==
-;   not PAIRP x => ncBug('S2CB0031,[])
-;   x := QCAR x
-;   IDENTP x => NIL
-;   not PAIRP x => ncBug('S2CB0031,[])
-;   QCDR x
-
-(DEFUN |ncAlist| (|x|)
- (PROG NIL
-  (RETURN
-   (COND
-    ((NULL (CONSP |x|)) (|ncBug| (QUOTE S2CB0031) NIL))
-    (#0=(QUOTE T)
-     (PROGN
-      (SETQ |x| (QCAR |x|))
-      (COND
-       ((IDENTP |x|) NIL)
-       ((NULL (CONSP |x|)) (|ncBug| (QUOTE S2CB0031) NIL))
-       (#0# (QCDR |x|)))))))))
-
-;--- Get the entry for key k on x's association list
-;ncEltQ(x,k) ==
-;   r := QASSQ(k,ncAlist x)
-;   NULL r => ncBug ('S2CB0007,[k])
-;   CDR r
-
-(DEFUN |ncEltQ| (|x| |k|)
- (PROG (|r|)
-  (RETURN
-   (PROGN
-    (SETQ |r| (QASSQ |k| (|ncAlist| |x|)))
-    (COND
-     ((NULL |r|) (|ncBug| (QUOTE S2CB0007) (LIST |k|)))
-     ((QUOTE T) (CDR |r|)))))))
- 
-;-- Put (k . v) on the association list of x and return v
-;-- case1: ncPutQ(x,k,v) where k is a key (an identifier), v a value
-;--        put the pair (k . v) on the association list of x and return v
-;-- case2: ncPutQ(x,k,v) where k is a list of keys, v a list of values
-;--        equivalent to [ncPutQ(x,key,val) for key in k for val in v]
-;ncPutQ(x,k,v) ==
-;   LISTP k =>
-;      for key in k for val in v repeat ncPutQ(x,key,val)
-;      v
-;   r := QASSQ(k,ncAlist x)
-;   if NULL r then
-;      r := CONS( CONS(k,v), ncAlist x)
-;      RPLACA(x,CONS(ncTag x,r))
-;   else
-;      RPLACD(r,v)
-;   v
- 
-(DEFUN |ncPutQ| (|x| |k| |v|)
- (PROG (|r|)
-  (RETURN
-   (COND
-    ((LISTP |k|)
-     (PROGN
-      ((LAMBDA (|bfVar#1| |key| |bfVar#2| |val|)
-        (LOOP
-         (COND
-           ((OR (ATOM |bfVar#1|)
-                (PROGN (SETQ |key| (CAR |bfVar#1|)) NIL)
-                (ATOM |bfVar#2|)
-                (PROGN (SETQ |val| (CAR |bfVar#2|)) NIL))
-             (RETURN NIL))
-           ((QUOTE T) 
-             (|ncPutQ| |x| |key| |val|)))
-         (SETQ |bfVar#1| (CDR |bfVar#1|))
-         (SETQ |bfVar#2| (CDR |bfVar#2|))))
-       |k| NIL |v| NIL)
-      |v|))
-    ((QUOTE T)
-     (PROGN
-      (SETQ |r| (QASSQ |k| (|ncAlist| |x|)))
-      (COND
-       ((NULL |r|)
-         (SETQ |r| (CONS (CONS |k| |v|) (|ncAlist| |x|)))
-         (RPLACA |x| (CONS (|ncTag| |x|) |r|)))
-       ((QUOTE T) (RPLACD |r| |v|)))
-      |v|))))))
-
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
