diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 0da85da..e02bc24 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -268,6 +268,231 @@ in the bootstrap set. Thus,
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Chapter A}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package AFALGGRO AffineAlgebraicSetComputeWithGroebnerBasis}
+<<AffineAlgebraicSetComputeWithGroebnerBasis.input>>=
+)set break resume
+)sys rm -f AffineAlgebraicSetComputeWithGroebnerBasis.output
+)spool AffineAlgebraicSetComputeWithGroebnerBasis.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show AffineAlgebraicSetComputeWithGroebnerBasis
+--R AffineAlgebraicSetComputeWithGroebnerBasis(K: Field,symb: List Symbol,PolyRing: PolynomialCategory(K,E,OrderedVariableList symb),E: DirectProductCategory(# symb,NonNegativeInteger),ProjPt: ProjectiveSpaceCategory K)  is a package constructor
+--R Abbreviation for AffineAlgebraicSetComputeWithGroebnerBasis is AFALGGRO 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for AFALGGRO 
+--R
+--R------------------------------- Operations --------------------------------
+--R affineAlgSet : List PolyRing -> Union(List ProjPt,"failed",Infinite,Integer)
+--R affineRationalPoints : (PolyRing,PositiveInteger) -> List ProjPt
+--R affineSingularPoints : PolyRing -> Union(List ProjPt,"failed",Infinite,Integer)
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<AffineAlgebraicSetComputeWithGroebnerBasis.help>>=
+====================================================================
+AffineAlgebraicSetComputeWithGroebnerBasis examples
+====================================================================
+
+See Also:
+o )show AffineAlgebraicSetComputeWithGroebnerBasis
+
+@
+\pagehead{AffineAlgebraicSetComputeWithGroebnerBasis}{AFALGGRO}
+\pagepic{ps/v104affinealgebraicsetcomputewithgroebnerbasis.eps}{AFALGGRO}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{AFALGGRO}{affineAlgSet} &
+\cross{AFALGGRO}{affineRationalPoints} &
+\cross{AFALGGRO}{affineSingularPoints}
+\end{tabular}
+
+<<package AFALGGRO AffineAlgebraicSetComputeWithGroebnerBasis>>=
+)abbreviation package AFALGGRO AffineAlgebraicSetComputeWithGroebnerBasis
+++ Author: Gaetan Hache
+++ Date Created: 17 nov 1992
+++ Date Last Updated: May 2010 by Tim Daly
+++ Description:  
+++ The following is part of the PAFF package
+AffineAlgebraicSetComputeWithGroebnerBasis(K,symb,PolyRing,E,ProjPt):Exports_
+ == Implementation where
+  K   : Field
+  symb: List(Symbol)
+  OV  ==> OrderedVariableList(symb)
+  E : DirectProductCategory(#symb,NonNegativeInteger)
+  PolyRing : PolynomialCategory(K,E,OV)
+  ProjPt   : ProjectiveSpaceCategory(K)
+  PCS      : LocalPowerSeriesCategory(K)
+  
+  OF    ==> OutputForm
+  PI    ==> PositiveInteger
+  NNI   ==> NonNegativeInteger
+  RFP   ==> RootsFindingPackage
+  SUP   ==> SparseUnivariatePolynomial
+  PPFC1 ==> PolynomialPackageForCurve(K,PolyRing,E,#symb,ProjPt)
+
+  Exports ==>  with
+
+    affineAlgSet: List PolyRing -> _
+                   Union(List(ProjPt),"failed","Infinite",Integer)
+
+    affineSingularPoints :  PolyRing -> _
+                   Union(List(ProjPt),"failed","Infinite",Integer)
+
+    affineRationalPoints: (PolyRing,PI) -> List ProjPt 
+        ++ \axiom{rationalPoints(f,d)} returns all points on the curve 
+	++ \axiom{f} in the extension of the ground field of degree \axiom{d}.
+	++ For \axiom{d > 1} this only works if \axiom{K} is a 
+	++ \axiomType{LocallyAlgebraicallyClosedField}
+
+  Implementation ==>  add
+
+    ss2:List Symbol:= [X1,X2]
+    
+    DD   ==> DistributedMultivariatePolynomial(ss2,K)
+    LexE ==> DirectProduct(#ss2,NonNegativeInteger)
+    OV2  ==> OrderedVariableList(ss2)
+    InGB ==> InterfaceGroebnerPackage(K,ss2,LexE,OV2,DD)
+
+    affineAlgSetLocal : List DD  -> _
+                        Union(List(ProjPt),"failed","Infinite",Integer)
+
+    import PPFC1
+    import PolyRing
+    import ProjPt
+    
+    listVar:List(OV):= [index(i::PI)$OV for i in 1..#symb]
+
+    polyToYX1 : PolyRing ->  DD
+    -- NOTE : polyToYX1 set the last variable to 1 and swap the 1st and 2nd var
+    -- so that a call to grobner will eliminate the second var before the 
+    -- first one 
+    -- 23/10/98 : Ce n'est plus vrai. La fonction a ete "repare'".
+    -- A priori ce la ne creait pas de bug, car on tenait compte de 
+    -- cette particulariite dans la fonction affineAlgSetLocal.
+    -- cette derniere fct a aussi ete "ajuste'"
+    -- 27/10/98 
+    -- Ce n'est pas vraie !!! Il fauit trouve X d'abord et ensuite Y !!
+    -- sinon tout sr la notion de places distinguee fout le camp !!!
+
+    polyToX10 : PolyRing -> SUP(K)
+      
+--fonctions de resolution de sys. alg. de dim 0
+
+    if K has FiniteFieldCategory then
+      
+      affineRationalPoints(crv:PolyRing,extdegree:PI):List(ProjPt) ==
+	--The code of this is almost the same as for algebraicSet
+	--We could just construct the ideal and call algebraicSet
+	--Should we do that? This might be a bit faster.
+        
+	listPtsIdl:List(ProjPt):= empty()
+
+        x:= monomial(1,directProduct(vector([1,0])$Vector(NNI)))$DD
+        y:= monomial(1,directProduct(vector([0,1])$Vector(NNI)))$DD
+	
+	if K has PseudoAlgebraicClosureOfFiniteFieldCategory then 
+	  setTower!(1$K)$K
+        q:= size()$K 
+        px:= x**(q**extdegree) - x
+	py:= y**(q**extdegree) - y
+
+	crvXY1 := polyToYX1 crv
+        rpts:= affineAlgSetLocal([crvXY1,px,py])
+
+        -- si les  3  tests qui suivent ne sont pas la, 
+        -- alors ca ne compile pas !!! ??? 
+        rpts case "failed" =>_
+          error "failed: From affineRationalPoints in AFALGGRO,"
+        rpts case "Infinite" =>_
+          error "Infinite: From affineRationalPoints in AFALGGRO,"
+        rpts case Integer =>_
+          error "Integer: From affineRationalPoints in AFALGGRO,"
+        rpts case List(ProjPt) => rpts 
+        error "Unknown: From affineRationalPoints in AFALGGRO,"
+
+    affineSingularPoints(crb)==
+      F:= polyToYX1 crb
+      Fx:=differentiate(F,index(1)$OV2)
+      Fy:=differentiate(F,index(2)$OV2)
+      affineAlgSetLocal([F,Fx,Fy]) 
+
+    affineAlgSet(ideal : List PolyRing )==
+      idealXY1 := [polyToYX1 pol for pol in ideal]
+      affineAlgSetLocal idealXY1
+      
+    --fonctions de resolution de sys. alg. de dim 0
+    affineAlgSetLocal(idealToXY1:List DD ) ==
+      listPtsIdl:List(ProjPt)
+      idealGroXY1:=groebner(idealToXY1)$InGB
+      listZeroY:List(K):=empty()
+      listZeroX:List(K):=empty()
+      listOfExtDeg:List(Integer):=empty()
+      polyZeroX:DD:=last(idealGroXY1)
+      member?(index(1)$OV2, variables(polyZeroX)$DD) =>
+        print(("The number of point in the algebraic set is not finite")::OF)
+        print(("or the curve is not absolubtly irreducible.")::OF)
+        error "Have a nice day"
+        --now we find all of the projective points where z ^= 0
+      recOfZerosX:=distinguishedRootsOf(univariate(polyZeroX),1$K)$RFP(K)
+      -- HERE CHANGE
+      degExtX:=recOfZerosX.extDegree
+      listZeroX:List K := recOfZerosX.zeros
+      listOfExtDeg:=cons(degExtX,listOfExtDeg)
+      for a in listZeroX repeat
+        tjeker := [(eval(f,index(2)$OV2,a)$DD) for f in idealGroXY1]
+        idealGroaXb1 := [univariate(f)$DD for f in tjeker]
+	recOfZerosOfIdeal:=distinguishedCommonRootsOf(idealGroaXb1,a)$RFP(K)
+        listZeroY:= recOfZerosOfIdeal.zeros
+        listOfExtDeg:=cons(recOfZerosOfIdeal.extDegree,listOfExtDeg)
+        listPtsIdl:=
+          concat( [projectivePoint([a,b,1]) for b in listZeroY] ,listPtsIdl)
+      degExt:=lcm listOfExtDeg
+      zero?(degExt) =>
+        print(("------- Infinite number of points ------")::OF)
+        "Infinite"
+      ^one?(degExt) =>
+        print(("You need an extension of degree")::OF)
+        print(degExt::OF)
+        degExt
+      listPtsIdl
+          
+    polyToYX1(pol)==
+      zero?(pol) => 0
+      dd:= degree pol
+      lc:= leadingCoefficient pol
+      pp:= parts dd
+      ppr:=  rest reverse pp
+      ppv:Vector(NNI):= vector ppr
+      eppr:=directProduct(ppv)$LexE
+      monomial(lc,eppr)$DD + polyToYX1 reductum pol
+
+    polyToX10(pol)==
+      zero?(pol) => 0
+      dd:= degree pol
+      lc:= leadingCoefficient pol
+      pp:= parts dd
+      lp:= last pp
+      ^zero?(lp) => polyToX10 reductum pol
+      e1:= pp.1
+      monomial(lc,e1)$SUP(K) + polyToX10 reductum pol
+      
+@
+<<AFALGGRO.dotabb>>=
+"AFALGGRO" [color="#FF4488",href="bookvol10.4.pdf#nameddest=AFALGGRO"]
+"DIRPCAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=DIRPCAT"]
+"PFECAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=PFECAT"]
+"AFALGGRO" -> "DIRPCAT"
+"AFALGGRO" -> "PFECAT"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package AFALGRES AffineAlgebraicSetComputeWithResultant}
 <<AffineAlgebraicSetComputeWithResultant.input>>=
 )set break resume
@@ -156368,7 +156593,8 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
                   output(us::OutputForm)$OutputPackage
                   error "univariateSolve$ZDSOLVE: bad RUR"
             g: U  := univariate(select(us,newv)::Q2)$Q2
-            lc: LP := [convert(q2)@P for q2 in parts(collectUpper(us,newv)$ST)$ST]
+            lc: LP := _
+              [convert(q2)@P for q2 in parts(collectUpper(us,newv)$ST)$ST]
             toSave := cons([g,lc]$RUR, toSave)
        toSave
 
@@ -156392,6 +156618,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 \chapter{Chunk collections}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 <<algebra>>=
+<<package AFALGGRO AffineAlgebraicSetComputeWithGroebnerBasis>>
 <<package AFALGRES AffineAlgebraicSetComputeWithResultant>>
 <<package AF AlgebraicFunction>>
 <<package INTHERAL AlgebraicHermiteIntegration>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 749047a..be063b1 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -23829,6 +23829,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
  '(
  ;;define the groups |basic| |naglink| |anna| |categories| |Hidden| |defaults|
   (|basic| 
+   (|AffineAlgebraicSetComputeWithGroebnerBasis| . AFALGGRO)
    (|AffineAlgebraicSetComputeWithResultant| . AFALGRES)
    (|AffinePlane| . AFFPL)
    (|AffinePlaneOverPseudoAlgebraicClosureOfFiniteField| . AFFPLPS)
diff --git a/books/ps/v104affinealgebraicsetcomputewithgroebnerbasis.eps b/books/ps/v104affinealgebraicsetcomputewithgroebnerbasis.eps
new file mode 100644
index 0000000..567854e
--- /dev/null
+++ b/books/ps/v104affinealgebraicsetcomputewithgroebnerbasis.eps
@@ -0,0 +1,311 @@
+%!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: 1
+%%BoundingBox: 36 36 210 152
+%%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 210 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 174 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% AFALGGRO
+gsave
+[ /Rect [ 38 72 132 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=AFALGGRO) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 132 108 moveto
+38 108 lineto
+38 72 lineto
+132 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 132 108 moveto
+38 108 lineto
+38 72 lineto
+132 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+46 85.9 moveto 78 (AFALGGRO) alignedtext
+grestore
+% DIRPCAT
+gsave
+[ /Rect [ 0 0 78 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=DIRPCAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.606 0.733 1.000 nodecolor
+newpath 78 36 moveto
+0 36 lineto
+0 0 lineto
+78 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.606 0.733 1.000 nodecolor
+newpath 78 36 moveto
+0 36 lineto
+0 0 lineto
+78 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+8 13.9 moveto 62 (DIRPCAT) alignedtext
+grestore
+% AFALGGRO->DIRPCAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 73 72 moveto
+68 64 61 54 55 44 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 58.27 42.62 moveto
+50 36 lineto
+52.33 46.34 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 58.27 42.62 moveto
+50 36 lineto
+52.33 46.34 lineto
+closepath stroke
+grestore
+% PFECAT
+gsave
+[ /Rect [ 96 0 166 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=PFECAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.606 0.733 1.000 nodecolor
+newpath 166 36 moveto
+96 36 lineto
+96 0 lineto
+166 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.606 0.733 1.000 nodecolor
+newpath 166 36 moveto
+96 36 lineto
+96 0 lineto
+166 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+104 13.9 moveto 54 (PFECAT) alignedtext
+grestore
+% AFALGGRO->PFECAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 97 72 moveto
+102 64 109 54 115 44 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 117.67 46.34 moveto
+120 36 lineto
+111.73 42.62 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 117.67 46.34 moveto
+120 36 lineto
+111.73 42.62 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 7e3c5b8..6f8f40e 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100522 tpd src/axiom-website/patches.html 20100522.03.tpd.patch
+20100522 tpd src/algebra/Makefile help and test for AFALGGRO
+20100522 tpd books/bookvol5 expose AFALGGRO
+20100522 tpd books/bookvol10.4 add AFALGGRO
+20100522 tpd books/ps/v104affinealgebraicsetcomputewithgroebnerbasis.eps add
 20100522 tpd src/axiom-website/patches.html 20100522.02.tpd.patch
 20100522 tpd src/algebra/Makefile help and test for AFALGRES
 20100522 tpd books/bookvol5 expose AffineAlgebraicSetComputeWithResultant
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 59a0a16..2efbcbc 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -9300,7 +9300,7 @@ Used by next layer: FSAGG KDAGG MSETAGG MONOGEN
 <<layer13>>=
 
 LAYER13=\
-  ${OUT}/AFALGRES.o \
+  ${OUT}/AFALGGRO.o ${OUT}/AFALGRES.o \
   ${OUT}/DPMM.o     ${OUT}/EFUPXS.o  ${OUT}/FFINTBAS.o ${OUT}/FRIDEAL.o  \
   ${OUT}/FRIDEAL2.o ${OUT}/FRMOD.o   ${OUT}/FSAGG.o    ${OUT}/FSAGG-.o   \
   ${OUT}/IBATOOL.o  ${OUT}/INTFACT.o ${OUT}/KDAGG.o    ${OUT}/KDAGG-.o   \
@@ -9312,6 +9312,27 @@ LAYER13=\
 /* layer 13 */
 /* depends on: DIAGG FRAMALG MDAGG SMATCAT UPXSCCA RFP*/
 
+"AFALGGRO" [color="#FF4488",href="bookvol10.4.pdf#nameddest=AFALGGRO"]
+"AFALGGRO" -> "DIRPCAT"
+"AFALGGRO" -> "PFECAT"
+/*"AFALGGRO" -> {"PRSPCAT"; "SETCATD"; "PACFFC"; "PACPERC"; "FIELD"}*/
+/*"AFALGGRO" -> {"EUCDOM"; "PID"; "GCDDOM"; "INTDOM"; "COMRING"; "RING"}*/
+/*"AFALGGRO" -> {"RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"; "SETCAT"}*/
+/*"AFALGGRO" -> {"BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"; "LMODULE"}*/
+/*"AFALGGRO" -> {"BMODULE"; "RMODULE"; "ALGEBRA"; "MODULE"; "ENTIRER"}*/
+/*"AFALGGRO" -> {"UFD"; "DIVRING"; "POLYCAT"; "PDRING"; "FAMR"; "AMR"}*/
+/*"AFALGGRO" -> {"CHARZ"; "CHARNZ"; "FRETRCT"; "RETRACT"; "EVALAB"}*/
+/*"AFALGGRO" -> {"IEVALAB"; "FLINEXP"; "LINEXP"; "ORDSET"; "KONVERT"}*/
+/*"AFALGGRO" -> {"PATMAB"; "IXAGG"; "HOAGG"; "AGG"; "TYPE"; "ELTAGG"}*/
+/*"AFALGGRO" -> {"ELTAB"; "DIFEXT"; "DIFRING"; "FINITE"; "ORDRING"}*/
+/*"AFALGGRO" -> {"OAGROUP"; "OCAMON"; "OAMON"; "OASGP"; "OAMONS"; "VSPACE"}*/
+/*"AFALGGRO" -> {"SINT"; "OUTFORM"; "INT"; "LSAGG"; "STAGG"; "URAGG"}*/
+/*"AFALGGRO" -> {"RCAGG"; "LNAGG"; "CLAGG"; "FLAGG"; "ELAGG"; "OM"; "LIST"}*/
+/*"AFALGGRO" -> {"ILIST"; "NNI"; "FFIELDC"; "FPC"; "STEP"; "PI"; "VECTOR"}*/
+/*"AFALGGRO" -> {"MONOID-"; "ABELMON-"; "ORDSET-"; "SGROUP-"; "ORDFIN"}*/
+/*"AFALGGRO" -> {"LSAGG-"; "STAGG-"; "ELAGG-"; "FLAGG-"; "URAGG-"; "INS-"}*/
+/*"AFALGGRO" -> {"EUCDOM-"; "UFD-"; "GCDDOM-"}*/
+
 "AFALGRES" [color="#FF4488",href="bookvol10.4.pdf#nameddest=AFALGRES"]
 "AFALGRES" -> "RFP" 
 /*"AFALGRES" -> {"PRSPCAT"; "LOCPOWC"; "SETCATD"; "PACFFC"; "CHARZ"}*/
@@ -16964,6 +16985,21 @@ ${MID}/AFALGRES.nrlib/code.o: ${MID}/AFALGRES.spad
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
+<<newcode>>=
+ 
+AFALGGRODEPS = PRSPCAT LOCPOWC SETCATD PACFFC PACPERC RFP PLPKCRV INTERGB
+
+${MID}/AFALGGRO.nrlib/code.o: ${MID}/AFALGGRO.spad
+	@echo P3 making ${MID}/AFALGGRO.nrlib/code.o from ${MID}/AFALGGRO.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${AFALGGRODEPS} \n )co AFALGGRO.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${AFALGGRODEPS} \n )co AFALGRES.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+@
 
 \section{Broken Files}
 These files are Aldor files
@@ -17668,6 +17704,7 @@ This keeps the regression test list in the algebra Makefile.
 HELPFILE=${HELP}/help.help
 
 SPADHELP=\
+ ${HELP}/AffineAlgebraicSetComputeWithGroebnerBasis.help \
  ${HELP}/AffineAlgebraicSetComputeWithResultant.help \
  ${HELP}/AffinePlane.help \
  ${HELP}/AffinePlaneOverPseudoAlgebraicClosureOfFiniteField.help \
@@ -17871,6 +17908,7 @@ is put into a int/Makefile.algebra and then executed by make.
 TESTSYS=  ${OBJ}/${SYS}/bin/interpsys
 
 REGRESS= \
+ AffineAlgebraicSetComputeWithGroebnerBasis.regress \
  AffineAlgebraicSetComputeWithResultant.regress \
  AffinePlane.regress \
  AffinePlaneOverPseudoAlgebraicClosureOfFiniteField.regress \
@@ -18073,9 +18111,27 @@ all: ${REGRESS}
 	@echo algebra test cases complete.
 @
 <<spadhelp>>=
-${HELP}/AffineAlgebraicSetComputeWithResultant.help: \
+${HELP}/AffineAlgebraicSetComputeWithGroebnerBasis.help: \
             ${BOOKS}/bookvol10.4.pamphlet
 	@echo 7000 create \
+            AffineAlgebraicSetComputeWithGroebnerBasis.help from \
+            ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} \
+            -R"AffineAlgebraicSetComputeWithGroebnerBasis.help" \
+            ${BOOKS}/bookvol10.4.pamphlet \
+            >${HELP}/AffineAlgebraicSetComputeWithGroebnerBasis.help
+	@cp ${HELP}/AffineAlgebraicSetComputeWithGroebnerBasis.help \
+            ${HELP}/AFALGGRO.help
+	@${TANGLE} \
+            -R"AffineAlgebraicSetComputeWithGroebnerBasis.input" \
+            ${BOOKS}/bookvol10.4.pamphlet \
+            >${INPUT}/AffineAlgebraicSetComputeWithGroebnerBasis.input
+	@echo "AffineAlgebraicSetComputeWithGroebnerBasis (AFALGGRO)" \
+            >>${HELPFILE}
+
+${HELP}/AffineAlgebraicSetComputeWithResultant.help: \
+            ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7001 create \
             AffineAlgebraicSetComputeWithResultant.help from \
             ${BOOKS}/bookvol10.4.pamphlet
 	@${TANGLE} \
@@ -18092,7 +18148,7 @@ ${HELP}/AffineAlgebraicSetComputeWithResultant.help: \
             >>${HELPFILE}
 
 ${HELP}/AffinePlane.help: ${BOOKS}/bookvol10.3.pamphlet
-	@echo 7001 create AffinePlane.help from \
+	@echo 7002 create AffinePlane.help from \
             ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"AffinePlane.help" \
             ${BOOKS}/bookvol10.3.pamphlet \
@@ -18105,7 +18161,7 @@ ${HELP}/AffinePlane.help: ${BOOKS}/bookvol10.3.pamphlet
 
 ${HELP}/AffinePlaneOverPseudoAlgebraicClosureOfFiniteField.help: \
             ${BOOKS}/bookvol10.3.pamphlet
-	@echo 7002 create \
+	@echo 7003 create \
             AffinePlaneOverPseudoAlgebraicClosureOfFiniteField.help from \
             ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} \
@@ -18122,7 +18178,7 @@ ${HELP}/AffinePlaneOverPseudoAlgebraicClosureOfFiniteField.help: \
             >>${HELPFILE}
 
 ${HELP}/AffineSpace.help: ${BOOKS}/bookvol10.3.pamphlet
-	@echo 7003 create AffineSpace.help from \
+	@echo 7004 create AffineSpace.help from \
             ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"AffineSpace.help" \
             ${BOOKS}/bookvol10.3.pamphlet \
@@ -18134,7 +18190,7 @@ ${HELP}/AffineSpace.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo "AffineSpace (AFFSP)" >>${HELPFILE}
 
 ${HELP}/AffineSpaceCategory.help: ${BOOKS}/bookvol10.2.pamphlet
-	@echo 7004 create AffineSpaceCategory.help from \
+	@echo 7005 create AffineSpaceCategory.help from \
             ${BOOKS}/bookvol10.2.pamphlet
 	@${TANGLE} -R"AffineSpaceCategory.help" \
             ${BOOKS}/bookvol10.2.pamphlet \
@@ -18146,7 +18202,7 @@ ${HELP}/AffineSpaceCategory.help: ${BOOKS}/bookvol10.2.pamphlet
 	@echo "AffineSpaceCategory (AFSPCAT)" >>${HELPFILE}
 
 ${HELP}/AlgebraicallyClosedField.help: ${BOOKS}/bookvol10.2.pamphlet
-	@echo 7005 create AlgebraicallyClosedField.help from \
+	@echo 7006 create AlgebraicallyClosedField.help from \
             ${BOOKS}/bookvol10.2.pamphlet
 	@${TANGLE} -R"AlgebraicallyClosedField.help" \
             ${BOOKS}/bookvol10.2.pamphlet \
@@ -18158,7 +18214,7 @@ ${HELP}/AlgebraicallyClosedField.help: ${BOOKS}/bookvol10.2.pamphlet
 	@echo "AlgebraicallyClosedField (ACF)" >>${HELPFILE}
 
 ${HELP}/Any.help: ${BOOKS}/bookvol10.3.pamphlet
-	@echo 7006 create Any.help from ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7007 create Any.help from ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"Any.help" ${BOOKS}/bookvol10.3.pamphlet >${HELP}/Any.help
 	@cp ${HELP}/Any.help ${HELP}/ANY.help
 	@${TANGLE} -R"Any.input" ${BOOKS}/bookvol10.3.pamphlet \
@@ -18166,7 +18222,7 @@ ${HELP}/Any.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo "Any (ANY)" >>${HELPFILE}
 
 ${HELP}/ApplicationProgramInterface.help: ${BOOKS}/bookvol10.4.pamphlet
-	@echo 7007 create ApplicationProgramInterface.help from \
+	@echo 7008 create ApplicationProgramInterface.help from \
            ${BOOKS}/bookvol10.4.pamphlet
 	@${TANGLE} -R"ApplicationProgramInterface.help" \
            ${BOOKS}/bookvol10.4.pamphlet \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 7ffa422..d78ffe7 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2783,5 +2783,7 @@ books/bookvol10.4 add PolynomialPackageForCurve<br/>
 books/bookvol10.4 add NewtonPolygon<br/>
 <a href="patches/20100522.02.tpd.patch">20100522.02.tpd.patch</a>
 books/bookvol10.4 add AffineAlgebraicSetComputeWithResultant<br/>
+<a href="patches/20100522.03.tpd.patch">20100522.03.tpd.patch</a>
+books/bookvol10.4 AffineAlgebraicSetComputeWithGroebnerBasis.eps<br/>
  </body>
 </html>
