diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index 7a9b286..0b3a87c 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -8509,6 +8509,232 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{AffineSpaceCategory}{AFSPCAT}
+\pagepic{ps/v102affinespacecategory.ps}{AFSPCAT}{0.75}
+
+<<AffineSpaceCategory.input>>=
+)set break resume
+)sys rm -f AffineSpaceCategory.output
+)spool AffineSpaceCategory.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show AffineSpaceCategory
+--R AffineSpaceCategory K: Field  is a category constructor
+--R Abbreviation for AffineSpaceCategory is AFSPCAT 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.2.pamphlet to see algebra source code for AFSPCAT 
+--R
+--R------------------------------- Operations --------------------------------
+--R ?=? : (%,%) -> Boolean                affinePoint : List K -> %
+--R coerce : List K -> %                  coerce : % -> List K
+--R coerce : % -> OutputForm              conjugate : % -> %
+--R conjugate : (%,NNI) -> %              definingField : % -> K
+--R degree : % -> PositiveInteger         ?.? : (%,Integer) -> K
+--R hash : % -> SingleInteger             latex : % -> String
+--R list : % -> List K                    orbit : (%,NNI) -> List %
+--R orbit : % -> List %                   origin : () -> %
+--R pointValue : % -> List K              rational? : % -> Boolean
+--R rational? : (%,NNI) -> Boolean        setelt : (%,Integer,K) -> K
+--R ?~=? : (%,%) -> Boolean              
+--R removeConjugate : List % -> List %
+--R removeConjugate : (List %,NNI) -> List %
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<AffineSpaceCategory.help>>=
+====================================================================
+AffineSpaceCategory examples
+====================================================================
+
+See Also:
+o )show AffineSpaceCategory
+
+@
+
+{\bf See:}
+
+\pagefrom{SetCategoryWithDegree}{SETCATD}
+
+{\bf Exports:}\\
+
+\begin{tabular}{llll}
+\cross{AFSPCAT}{?.?} &
+\cross{AFSPCAT}{?=?} &
+\cross{AFSPCAT}{?\~{}=?} &
+\cross{AFSPCAT}{affinePoint} &
+\cross{AFSPCAT}{coerce} \\
+\cross{AFSPCAT}{conjugate} &
+\cross{AFSPCAT}{definingField} &
+\cross{AFSPCAT}{degree} &
+\cross{AFSPCAT}{hash} &
+\cross{AFSPCAT}{latex} \\
+\cross{AFSPCAT}{list} &
+\cross{AFSPCAT}{orbit} &
+\cross{AFSPCAT}{origin} &
+\cross{AFSPCAT}{pointValue} &
+\cross{AFSPCAT}{rational?} \\
+\cross{AFSPCAT}{removeConjugate} &
+\cross{AFSPCAT}{setelt} &&&
+\end{tabular}
+
+These are directly exported but not implemented
+\begin{verbatim}
+ ?.? : (%,Integer) -> K
+ affinePoint : List K -> %
+ coerce : % -> List K
+ coerce : List K -> %                 
+ conjugate : % -> %
+ conjugate : (%,NNI) -> %             
+ definingField : % -> K
+ list : % -> List K                   
+ orbit : % -> List %                  
+ orbit : (%,NNI) -> List %
+ origin : () -> %
+ pointValue : % -> List K             
+ rational? : % -> Boolean
+ rational? : (%,NNI) -> Boolean       
+ removeConjugate : (List %,NNI) -> List %
+ removeConjugate : List % -> List %
+ setelt : (%,Integer,K) -> K
+\end{verbatim}
+
+These exports come from \refto{SetCategoryWithDegree}
+\begin{verbatim}
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean
+ coerce : % -> OutputForm
+ degree : % -> PositiveInteger        
+ hash : % -> SingleInteger
+ latex : % -> String                  
+\end{verbatim}
+
+<<category AFSPCAT AffineSpaceCategory>>=
+)abbrev category AFSPCAT AffineSpaceCategory
+++ Author: Gaetan Hache
+++ Date Created: 17 nov 1992
+++ Date Last Updated: May 2010 by Tim Daly
+++ Description:  
+++ The following is all the categories and domains related to projective
+++ space and part of the PAFF package
+AffineSpaceCategory(K:Field):Category == Implementation where
+
+  LIST ==> List
+  INT  ==> Integer
+
+  Implementation ==>
+   SetCategoryWithDegree with
+
+    origin: () -> %
+    
+    affinePoint: LIST(K) -> %
+      ++ affinePoint creates a affine point from a list
+   
+    definingField: % -> K
+    
+    coerce: % -> List(K)
+
+    coerce: LIST(K) -> %
+      ++ coerce a list of K to a affine point.
+      
+    orbit: % -> LIST %
+      ++ orbit(p) returns the orbit of the point p according to the 
+      ++ characteristic of K, that is, for q= char K, 
+      ++ orbit(p) = \{ p, p**q, p**(q**2), p**(q**3), ..... \}
+
+    orbit: (%,NNI) -> LIST %
+      ++ orbit(p,n) returns the orbit of the point p according to n, that is
+      ++ orbit(p,n) = \{ p, p**n, p**(n**2), p**(n**3), ..... \}
+
+    conjugate: (%,NNI) -> %
+      ++ conjugate(p,n) returns p**n, that is all the coordinates of p 
+      ++ to the power of n
+
+    conjugate: % -> %
+      ++ conjugate(p) returns conjugate(p,n) where n is the characteristic 
+      ++ of the ground field.
+
+    removeConjugate: (LIST(%),NNI) -> LIST(%)
+      ++ removeConjugate(lp,n) returns a list of points such that no points
+      ++ in the list is the conjugate (according to n) of another point.
+
+    removeConjugate: LIST(%)  -> LIST(%)
+      ++ removeConjugate(lp) returns removeConjugate(lp,n)
+      ++ where n is the characteristic of the ground field.
+
+    rational?: (%,NNI) -> Boolean
+      ++ rational?(p,n) test if the point is rational according to n.
+
+    rational?: % -> Boolean
+      ++ rational?(p) test if the point is rational according to the
+      ++ characteristic of the ground field.
+
+    list  : % -> LIST(K)
+      ++ list returns the list of the coordinates
+
+    elt: (%,INT) -> K
+      ++ elt returns the value of a specified coordinates
+
+    setelt: (%,INT,K) -> K
+      ++ setelt sets the value of a specified coordinates
+
+    pointValue: % -> LIST(K)
+     ++ pointValue returns the coordinates of the point or of the point 
+     ++ of origin that represent an infinitly close point
+
+@
+<<AFSPCAT.dotabb>>=
+"AFSPCAT"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=AFSPCAT"];
+"AFSPCAT" -> "SETCATD"
+
+@
+<<AFSPCAT.dotfull>>=
+"AffineSpaceCategory()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=AFSPCAT"];
+"AffineSpaceCategory()" -> "SetCategoryWithDegree()"
+
+@
+<<AFSPCAT.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"AffineSpaceCategory()" [color=lightblue];
+"AffineSpaceCategory()" -> "SetCategoryWithDegree()"
+
+"SetCategoryWithDegree()" [color=lightblue];
+"SetCategoryWithDegree()" -> "BasicType()"
+"SetCategoryWithDegree()" -> "CoercibleTo(OutputForm)"
+"SetCategoryWithDegree()" -> "SetCategory()"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" -> "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"Package" [color="#00EE00"];
+
+"Category" [color=lightblue];
+
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{BagAggregate}{BGAGG}
 \pagepic{ps/v102bagaggregate.ps}{BGAGG}{1.00}
 
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 68ea53e..ebd30f9 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24342,6 +24342,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|AbelianMonoid| . ABELMON)
    (|AbelianMonoidRing| . AMR)
    (|AbelianSemiGroup| . ABELSG)
+   (|AffineSpaceCategory| . AFSPCAT)
    (|Aggregate| . AGG)
    (|Algebra| . ALGEBRA)
    (|AlgebraicallyClosedField| . ACF)
diff --git a/books/ps/v102affinespacecategory.ps b/books/ps/v102affinespacecategory.ps
new file mode 100644
index 0000000..100611e
--- /dev/null
+++ b/books/ps/v102affinespacecategory.ps
@@ -0,0 +1,540 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Graphviz version 2.20.2 (Mon Mar 30 10:09:11 UTC 2009)
+%%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 344 440
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 308 404 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% AffineSpaceCategory()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 210 396 moveto
+40 396 lineto
+40 360 lineto
+210 360 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 210 396 moveto
+40 396 lineto
+40 360 lineto
+210 360 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+47.5 373.9 moveto 155 (AffineSpaceCategory\(\)) alignedtext
+grestore
+% SetCategoryWithDegree()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 223 324 moveto
+27 324 lineto
+27 288 lineto
+223 288 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 223 324 moveto
+27 324 lineto
+27 288 lineto
+223 288 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+34.5 301.9 moveto 181 (SetCategoryWithDegree\(\)) alignedtext
+grestore
+% AffineSpaceCategory()->SetCategoryWithDegree()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 125 360 moveto
+125 352 125 343 125 334 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 128.5 334 moveto
+125 324 lineto
+121.5 334 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 128.5 334 moveto
+125 324 lineto
+121.5 334 lineto
+closepath stroke
+grestore
+% BasicType()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 92 180 moveto
+0 180 lineto
+0 144 lineto
+92 144 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 92 180 moveto
+0 180 lineto
+0 144 lineto
+92 144 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 157.9 moveto 77 (BasicType\(\)) alignedtext
+grestore
+% SetCategoryWithDegree()->BasicType()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 95 288 moveto
+82 279 68 266 60 252 curveto
+50 233 47 209 46 190 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 49.48 189.6 moveto
+45 180 lineto
+42.51 190.3 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 49.48 189.6 moveto
+45 180 lineto
+42.51 190.3 lineto
+closepath stroke
+grestore
+% CoercibleTo(OutputForm)
+gsave
+0.404 0.667 0.545 nodecolor
+newpath 298 180 moveto
+110 180 lineto
+110 144 lineto
+298 144 lineto
+closepath fill
+1 setlinewidth
+filled
+0.404 0.667 0.545 nodecolor
+newpath 298 180 moveto
+110 180 lineto
+110 144 lineto
+298 144 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+117.5 157.9 moveto 173 (CoercibleTo\(OutputForm\)) alignedtext
+grestore
+% SetCategoryWithDegree()->CoercibleTo(OutputForm)
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 155 288 moveto
+167 279 181 266 190 252 curveto
+200 233 203 209 204 190 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 207.49 190.3 moveto
+205 180 lineto
+200.52 189.6 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 207.49 190.3 moveto
+205 180 lineto
+200.52 189.6 lineto
+closepath stroke
+grestore
+% SetCategory()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 181 252 moveto
+69 252 lineto
+69 216 lineto
+181 216 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 181 252 moveto
+69 252 lineto
+69 216 lineto
+181 216 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+76.5 229.9 moveto 97 (SetCategory\(\)) alignedtext
+grestore
+% SetCategoryWithDegree()->SetCategory()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 125 288 moveto
+125 280 125 271 125 262 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 128.5 262 moveto
+125 252 lineto
+121.5 262 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 128.5 262 moveto
+125 252 lineto
+121.5 262 lineto
+closepath stroke
+grestore
+% Category
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 171 36 moveto
+93 36 lineto
+93 0 lineto
+171 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 171 36 moveto
+93 36 lineto
+93 0 lineto
+171 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+100.5 13.9 moveto 63 (Category) alignedtext
+grestore
+% BasicType()->Category
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 57 144 moveto
+71 119 99 74 116 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 119.2 46.44 moveto
+121 36 lineto
+113.08 43.04 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 119.2 46.44 moveto
+121 36 lineto
+113.08 43.04 lineto
+closepath stroke
+grestore
+% CoercibleTo(a:Type)
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 264 108 moveto
+116 108 lineto
+116 72 lineto
+264 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 264 108 moveto
+116 108 lineto
+116 72 lineto
+264 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+123.5 85.9 moveto 133 (CoercibleTo\(a:Type\)) alignedtext
+grestore
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 200 144 moveto
+199 136 197 127 195 118 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 198.39 117.12 moveto
+193 108 lineto
+191.53 118.49 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 198.39 117.12 moveto
+193 108 lineto
+191.53 118.49 lineto
+closepath stroke
+grestore
+% SetCategory()->BasicType()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 216 moveto
+95 207 84 197 74 187 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 75.83 183.95 moveto
+66 180 lineto
+71.22 189.22 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 75.83 183.95 moveto
+66 180 lineto
+71.22 189.22 lineto
+closepath stroke
+grestore
+% SetCategory()->CoercibleTo(OutputForm)
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 145 216 moveto
+155 207 166 197 176 187 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 178.78 189.22 moveto
+184 180 lineto
+174.17 183.95 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 178.78 189.22 moveto
+184 180 lineto
+174.17 183.95 lineto
+closepath stroke
+grestore
+% CoercibleTo(a:Type)->Category
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 175 72 moveto
+168 63 160 53 152 44 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 154.8 41.9 moveto
+146 36 lineto
+149.2 46.1 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 154.8 41.9 moveto
+146 36 lineto
+149.2 46.1 lineto
+closepath stroke
+grestore
+% Package
+gsave
+0.333 1.000 0.933 nodecolor
+newpath 300 396 moveto
+228 396 lineto
+228 360 lineto
+300 360 lineto
+closepath fill
+1 setlinewidth
+filled
+0.333 1.000 0.933 nodecolor
+newpath 300 396 moveto
+228 396 lineto
+228 360 lineto
+300 360 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+236 373.9 moveto 56 (Package) alignedtext
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+%%BoundingBox: 36 36 344 440
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 8108d3f..0a3a3bc 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100516 tpd src/axiom-website/patches.html 20100516.01.tpd.patch
+20100516 tpd src/algebra/Makefile help and test files for AFSPCAT
+20100516 tpd books/bookvol5 expose AffineSpaceCategory
+20100516 tpd books/bookvol10.2 add AffineSpaceCategory
+20100516 tpd books/ps/v102affinespacecategory.ps added
 20100515 tpd src/axiom-website/patches.html 20100515.05.tpd.patch
 20100515 tpd src/algebra/Makefile help and test files for PROJPLPS
 20100515 tpd books/bookvol5 expose PROJPLPS
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 8dfc699..a0a69b6 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -334,7 +334,6 @@ LAYER1=\
   ${OUT}/TEX1.o     ${OUT}/UDVO.o     ${OUT}/YSTREAM.o \
   layer1done
 
-  
 @
 <<layerpic>>=
 /* layer 1 */
@@ -787,12 +786,13 @@ LAYER1=\
 @
 \subsection{Layer 2}
 Depends on: AGG ELTAGG FINITE FORTCAT IDPC IEVALAB LMODULE MONAD ORDSET 
-PATMAB RETRACT RMODULE SGROUP \\
+PATMAB RETRACT RMODULE SGROUP SETCATD \\
 Used by next layer: BMODULE CACHSET ELEMFUN EVALAB GROUP IXAGG MONADWU NARNG 
 OASGP PDRING 
 <<layer2>>=
 
 LAYER2=\
+  ${OUT}/AFSPCAT.o  \
   ${OUT}/API.o      ${OUT}/ASP29.o    ${OUT}/ATRIG.o    ${OUT}/ATRIG-.o   \
   ${OUT}/BEZIER.o   ${OUT}/BLHN.o     \
   ${OUT}/BLQT.o     ${OUT}/BMODULE.o  ${OUT}/CACHSET.o  \
@@ -819,6 +819,11 @@ LAYER2=\
 /* AGG ELTAGG FINITE FORTCAT IDPC IEVALAB LMODULE MONAD ORDSET */
 /* PATMAB RETRACT RMODULE SEGCAT SGROUP */
 
+"AFSPCAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=AFSPCAT",
+          shape=ellipse]
+"AFSPCAT" -> "SETCATD"
+/*"AFSPCAT" -> {"SETCAT"; "BASTYPE"; "KOERCE"}*/
+
 "ABELGRP" [color="#4488FF",href="bookvol10.2.pdf#nameddest=ABELGRP",
            shape=ellipse]
 /*"ABELGRP" -> {"CABMON"; "ABELMON"; "ABELSG"; "SETCAT"; "BASTYPE"}*/
@@ -16353,6 +16358,21 @@ ${MID}/PROJPLPS.nrlib/code.o: ${MID}/PROJPLPS.spad
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
+<<newcode>>=
+
+AFSPCATDEPS = SETCATD
+
+${MID}/AFSPCAT.nrlib/code.o: ${MID}/AFSPCAT.spad
+	@echo P3 making ${MID}/AFSPCAT.nrlib/code.o from ${MID}/AFSPCAT.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${AFSPCATDEPS} \n )co AFSPCAT.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${AFSPCATDEPS} \n )co AFSPCAT.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+@
 
 \section{Broken Files}
 These files are Aldor files
@@ -17057,6 +17077,7 @@ This keeps the regression test list in the algebra Makefile.
 HELPFILE=${HELP}/help.help
 
 SPADHELP=\
+ ${HELP}/AffineSpaceCategory.help \
  ${HELP}/AlgebraicallyClosedField.help \
  ${HELP}/Any.help \
  ${HELP}/ApplicationProgramInterface.help \
@@ -17238,6 +17259,7 @@ is put into a int/Makefile.algebra and then executed by make.
 TESTSYS=  ${OBJ}/${SYS}/bin/interpsys
 
 REGRESS= \
+ AffineSpaceCategory.regress \
  AlgebraicallyClosedField.regress \
  Any.regress \
  ApplicationProgramInterface.regress \
@@ -17418,8 +17440,20 @@ all: ${REGRESS}
 	@echo algebra test cases complete.
 @
 <<spadhelp>>=
+${HELP}/AffineSpaceCategory.help: ${BOOKS}/bookvol10.2.pamphlet
+	@echo 7000 create AffineSpaceCategory.help from \
+            ${BOOKS}/bookvol10.2.pamphlet
+	@${TANGLE} -R"AffineSpaceCategory.help" \
+            ${BOOKS}/bookvol10.2.pamphlet \
+            >${HELP}/AffineSpaceCategory.help
+	@cp ${HELP}/AffineSpaceCategory.help ${HELP}/AFSPCAT.help
+	@${TANGLE} -R"AffineSpaceCategory.input" \
+            ${BOOKS}/bookvol10.2.pamphlet \
+            >${INPUT}/AffineSpaceCategory.input
+	@echo "AffineSpaceCategory (AFSPCAT)" >>${HELPFILE}
+
 ${HELP}/AlgebraicallyClosedField.help: ${BOOKS}/bookvol10.2.pamphlet
-	@echo 7000 create AlgebraicallyClosedField.help from \
+	@echo 7001 create AlgebraicallyClosedField.help from \
             ${BOOKS}/bookvol10.2.pamphlet
 	@${TANGLE} -R"AlgebraicallyClosedField.help" \
             ${BOOKS}/bookvol10.2.pamphlet \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index e32492c..976ccad 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2725,5 +2725,7 @@ books/bookvol10.3 add ProjectivePlane<br/>
 books/ps/v103pseudoalgebraicclosureoffinitefield.ps corrected<br/>
 <a href="patches/20100515.05.tpd.patch">20100515.05.tpd.patch</a>
 books/bookvol10.3 ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField<br/>
+<a href="patches/20100516.01.tpd.patch">20100516.01.tpd.patch</a>
+books/bookvol10.2 add AffineSpaceCategory<br/>
  </body>
 </html>
