diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index 81a15f9..88c7428 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -274,6 +274,47 @@ November 10, 2003 ((iHy))
 \eject
 \pagenumbering{arabic}
 \setcounter{chapter}{0} % Chapter 1
+\chapter{Categories}
+Axiom has 3 main algebra components, Categories, Domains, and
+Packages. If we make an analogy to dressmaking, you can consider
+the Categories to be hierarchies of properties of things, like
+patterns, colors, or fabrics. Domains are instances of things
+based on category choices, such as a dress with a particular
+style, fabric, color, etc. Packages are tools that work with
+dresses such as irons, sewing machines, etc.
+
+Axiom is based on abstract algebra and uses it as a scaffolding
+for constructing well-formed algebra. For instance, in abstract
+algebra there is a strict subset hierarchy, like:\\
+\includegraphics[scale=0.50]{ps/v102algebrahierarchy.ps}
+
+<<algebrahierarchy.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Commutative Ring" 
+  [color=lightblue,href="bookvol10.2.pdf#nameddest=COMRING"];
+"Integral Domain" 
+  [color=lightblue,href="bookvol10.2.pdf#nameddest=INTDOM"];
+"Unique Factorization Domain"
+  [color=lightblue,href="bookvol10.2.pdf#nameddest=UFD"];
+"Principal Ideal Domain"
+  [color=lightblue,href="bookvol10.2.pdf#nameddest=PID"];
+"Euclidean Domain"
+  [color=lightblue,href="bookvol10.2.pdf#nameddest=EUCDOM"];
+"Field"
+  [color=lightblue,href="bookvol10.2.pdf#nameddest=FIELD"];
+
+"Commutative Ring" -> "Integral Domain"
+"Integral Domain" -> "Unique Factorization Domain"
+"Unique Factorization Domain" -> "Principal Ideal Domain"
+"Principal Ideal Domain" -> "Euclidean Domain"
+"Euclidean Domain" -> "Field"
+
+}
+@
 \chapter{Category Layer 1}
 In general, we use several colors in the graph images.
 The ``lightblue'' color indicates a category that is in the
@@ -14714,16 +14755,30 @@ StackAggregate(S:Type): Category == BagAggregate S with
      ++ push!(x,s) pushes x onto stack s, i.e. destructively changing s
      ++ so as to have a new first (top) element x.
      ++ Afterwards, pop!(s) produces x and pop!(s) produces the original s.
+     ++
+     ++X a:Stack INT:= stack [1,2,3,4,5]
+     ++X push! a
+     ++X a
    pop_!: % -> S
      ++ pop!(s) returns the top element x, destructively removing x from s.
      ++ Note: Use \axiom{top(s)} to obtain x without removing it from s.
      ++ Error: if s is empty.
+     ++
+     ++X a:Stack INT:= stack [1,2,3,4,5]
+     ++X pop! a
+     ++X a
    top: % -> S
      ++ top(s) returns the top element x from s; s remains unchanged.
      ++ Note: Use \axiom{pop!(s)} to obtain x and remove it from s.
+     ++
+     ++X a:Stack INT:= stack [1,2,3,4,5]
+     ++X top a
    depth: % -> NonNegativeInteger
      ++ depth(s) returns the number of elements of stack s.
      ++ Note: \axiom{depth(s) = #s}.
+     ++
+     ++X a:Stack INT:= stack [1,2,3,4,5]
+     ++X depth a
 
 
 @
@@ -26808,6 +26863,9 @@ digraph pic {
 \pagehead{CommutativeRing}{COMRING}
 \pagepic{ps/v102commutativering.ps}{COMRING}{0.65}
 
+Commutative Rings are a subset of IntegralDomains.
+\pageto{IntegralDomain}{INTDOM}. 
+
 {\bf See:}\\
 \pageto{ComplexCategory}{COMPCAT}
 \pageto{IntegralDomain}{INTDOM}
@@ -33893,6 +33951,12 @@ digraph pic {
 \pagehead{IntegralDomain}{INTDOM}
 \pagepic{ps/v102integraldomain.ps}{INTDOM}{0.65}
 
+All Commutative Rings are Integral Domains.
+\pagefrom{CommutativeRing}{COMRING}
+Integral Domains are a subset of Unique Factorization domains.
+\pageto{UniqueFactorizationDomain}{UFD}.
+
+
 {\bf See:}\\
 \pageto{FortranMachineTypeCategory}{FMTC}
 \pageto{FunctionSpace}{FS}
@@ -38579,6 +38643,11 @@ digraph pic {
 \pagehead{PrincipalIdealDomain}{PID}
 \pagepic{ps/v102principalidealdomain.ps}{PID}{0.65}
 
+Unique Factorization Domains are a subset of Principal Ideal Domains. 
+\pagefrom{UniqueFactorizationDomain}{UFD}
+Principal Ideal Domains are a subset of Euclidean Domains.
+\pageto{EuclideanDomain}{EUCDOM}
+
 {\bf See:}\\
 \pageto{EuclideanDomain}{EUCDOM}
 \pagefrom{GcdDomain}{GCDDOM}
@@ -38769,6 +38838,11 @@ digraph pic {
 \pagehead{UniqueFactorizationDomain}{UFD}
 \pagepic{ps/v102uniquefactorizationdomain.ps}{UFD}{0.65}
 
+All Integral Domains are UniqueFactorizationDomains.
+\pagefrom{IntegralDomain}{INTDOM}.
+Unique Factorization Domains are a subset of Principal Ideal Domains.
+\pageto{PrincipalIdealDomain}{PID}
+
 {\bf See:}\\
 \pageto{Field}{FIELD}
 \pageto{IntegerNumberSystem}{INS}
@@ -38976,6 +39050,11 @@ digraph pic {
 \pagehead{EuclideanDomain}{EUCDOM}
 \pagepic{ps/v102euclideandomain.ps}{EUCDOM}{0.65}
 
+Principal Ideal Domains are a subset of Euclidean Domains.
+\pagefrom{PrincipalIdealDomain}{PID}.
+Euclidean Domains are a subset of Fields.
+\pageto{Field}{FIELD}
+
 {\bf See:}\\
 \pageto{Field}{FIELD}
 \pageto{IntegerNumberSystem}{INS}
@@ -40335,6 +40414,9 @@ digraph pic {
 \pagehead{Field}{FIELD}
 \pagepic{ps/v102field.ps}{FIELD}{1.00}
 
+Euclidean Domains are a subset of Fields.
+\pagefrom{EuclideanDomain}{EUCDOM}
+
 {\bf See:}\\
 \pageto{AlgebraicallyClosedField}{ACF}
 \pageto{ExtensionField}{XF}
diff --git a/books/ps/v102algebrahierarchy.ps b/books/ps/v102algebrahierarchy.ps
new file mode 100644
index 0000000..1995ec9
--- /dev/null
+++ b/books/ps/v102algebrahierarchy.ps
@@ -0,0 +1,461 @@
+%!PS-Adobe-2.0
+%%Creator: Graphviz version 2.16.1 (Mon Jul  7 18:20:33 UTC 2008)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: (atend)
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+       dup 1 exch div /InvScaleFactor exch def
+       scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw text fitted to its expected width
+/alignedtext {			% width text
+	/text exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			[] 0 setdash
+			text stringwidth pop width exch sub text length div 0 text ashow
+		} if
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+setupLatin1
+%%Page: 1 1
+%%PageBoundingBox: 36 36 230 440
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 194 404 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+0.167 0.600 1.000 graphcolor
+newpath -4 -4 moveto
+-4 716 lineto
+536 716 lineto
+536 -4 lineto
+closepath fill
+1 setlinewidth
+0.167 0.600 1.000 graphcolor
+newpath -4 -4 moveto
+-4 716 lineto
+536 716 lineto
+536 -4 lineto
+closepath stroke
+% Commutative Ring
+gsave
+[ /Rect [ 32 360 154 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=COMRING) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 154 396 moveto
+32 396 lineto
+32 360 lineto
+154 360 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 154 396 moveto
+32 396 lineto
+32 360 lineto
+154 360 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14.00 /Times-Roman set_font
+39.5 373.9 moveto 107 (Commutative Ring) alignedtext
+grestore
+% Integral Domain
+gsave
+[ /Rect [ 39 288 147 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=INTDOM) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 147 324 moveto
+39 324 lineto
+39 288 lineto
+147 288 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 147 324 moveto
+39 324 lineto
+39 288 lineto
+147 288 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14.00 /Times-Roman set_font
+46.5 301.9 moveto 93 (Integral Domain) alignedtext
+grestore
+% Commutative Ring->Integral Domain
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 93 360 moveto
+93 352 93 343 93 334 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 334 moveto
+93 324 lineto
+89.5001 334 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 334 moveto
+93 324 lineto
+89.5001 334 lineto
+closepath stroke
+grestore
+% Unique Factorization Domain
+gsave
+[ /Rect [ 0 216 186 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=UFD) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 186 252 moveto
+5.68434e-14 252 lineto
+1.42109e-14 216 lineto
+186 216 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 186 252 moveto
+5.68434e-14 252 lineto
+1.42109e-14 216 lineto
+186 216 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14.00 /Times-Roman set_font
+8 229.9 moveto 170 (Unique Factorization Domain) alignedtext
+grestore
+% Integral Domain->Unique Factorization Domain
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 93 288 moveto
+93 280 93 271 93 262 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 262 moveto
+93 252 lineto
+89.5001 262 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 262 moveto
+93 252 lineto
+89.5001 262 lineto
+closepath stroke
+grestore
+% Principal Ideal Domain
+gsave
+[ /Rect [ 19 144 167 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=PID) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 167 180 moveto
+19 180 lineto
+19 144 lineto
+167 144 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 167 180 moveto
+19 180 lineto
+19 144 lineto
+167 144 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14.00 /Times-Roman set_font
+27 157.9 moveto 132 (Principal Ideal Domain) alignedtext
+grestore
+% Unique Factorization Domain->Principal Ideal Domain
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 93 216 moveto
+93 208 93 199 93 190 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 190 moveto
+93 180 lineto
+89.5001 190 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 190 moveto
+93 180 lineto
+89.5001 190 lineto
+closepath stroke
+grestore
+% Euclidean Domain
+gsave
+[ /Rect [ 32 72 154 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=EUCDOM) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 154 108 moveto
+32 108 lineto
+32 72 lineto
+154 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 154 108 moveto
+32 108 lineto
+32 72 lineto
+154 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14.00 /Times-Roman set_font
+39.5 85.9 moveto 107 (Euclidean Domain) alignedtext
+grestore
+% Principal Ideal Domain->Euclidean Domain
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 93 144 moveto
+93 136 93 127 93 118 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 118 moveto
+93 108 lineto
+89.5001 118 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 118 moveto
+93 108 lineto
+89.5001 118 lineto
+closepath stroke
+grestore
+% Field
+gsave
+[ /Rect [ 66 0 120 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=FIELD) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 120 36 moveto
+66 36 lineto
+66 1.06581e-14 lineto
+120 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 120 36 moveto
+66 36 lineto
+66 1.06581e-14 lineto
+120 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14.00 /Times-Roman set_font
+78.5 13.9 moveto 29 (Field) alignedtext
+grestore
+% Euclidean Domain->Field
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 93 72 moveto
+93 64 93 55 93 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 46 moveto
+93 36 lineto
+89.5001 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 96.5001 46 moveto
+93 36 lineto
+89.5001 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+%%BoundingBox: 36 36 230 440
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 0cf904a..53741f2 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,6 @@
+20090222 tpd src/axiom-website/patches.html 20090222.03.tpd.patch
+20090222 tpd books/bookvol10.2 add documentation
+20090222 tpd books/ps/v102algebrahierarchy.ps added
 20090222 tpd src/axiom-website/patches.html 20090222.02.tpd.patch
 20090222 tpd src/interp/Makefile add regression, help for Stack
 20090222 tpd books/bookvol10.3 add regression, help, examples for Stack
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index a8c96df..eaaedd1 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -957,5 +957,7 @@ add Scott Morrison's original hypertex plan<br/>
 add Stephen Buchwald to credits<br/>
 <a href="patches/20090222.02.tpd.patch">20090222.02.tpd.patch</a>
 bookvol10.3 add regression, help, examples for Stack<br/>
+<a href="patches/20090222.03.tpd.patch">20090222.03.tpd.patch</a>
+bookvol10.2 add documentation<br/>
  </body>
 </html>
