diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 4c310a0..04b55de 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -118878,6 +118878,386 @@ OutputPackage: with
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Chapter P}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package PFORP PackageForPoly}
+<<PackageForPoly.input>>=
+)set break resume
+)sys rm -f PackageForPoly.output
+)spool PackageForPoly.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show PackageForPoly
+--R PackageForPoly(R: Ring,PolyRing: FiniteAbelianMonoidRing(R,E),E: DirectProductCategory(dim,NonNegativeInteger),dim: NonNegativeInteger)  is a package constructor
+--R Abbreviation for PackageForPoly is PFORP 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for PFORP 
+--R
+--R------------------------------- Operations --------------------------------
+--R constant : PolyRing -> R              firstExponent : PolyRing -> E
+--R listAllMonoExp : Integer -> List E    listVariable : () -> List PolyRing
+--R minimalForm : PolyRing -> PolyRing   
+--R degOneCoef : (PolyRing,PositiveInteger) -> R
+--R degree : (PolyRing,Integer) -> NonNegativeInteger
+--R degreeOfMinimalForm : PolyRing -> NonNegativeInteger
+--R homogenize : (PolyRing,Integer) -> PolyRing
+--R listAllMono : NonNegativeInteger -> List PolyRing
+--R mapExponents : ((E -> E),PolyRing) -> PolyRing
+--R monomials : PolyRing -> List PolyRing
+--R replaceVarByOne : (PolyRing,Integer) -> PolyRing
+--R replaceVarByZero : (PolyRing,Integer) -> PolyRing
+--R subs1stVar : (PolyRing,PolyRing) -> PolyRing
+--R subs2ndVar : (PolyRing,PolyRing) -> PolyRing
+--R subsInVar : (PolyRing,PolyRing,Integer) -> PolyRing
+--R totalDegree : PolyRing -> NonNegativeInteger
+--R translate : (PolyRing,List R,Integer) -> PolyRing
+--R translate : (PolyRing,List R) -> PolyRing
+--R univariate : PolyRing -> SparseUnivariatePolynomial R
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<PackageForPoly.help>>=
+====================================================================
+PackageForPoly examples
+====================================================================
+
+See Also:
+o )show PackageForPoly
+
+@
+\pagehead{PackageForPoly}{PFORP}
+\pagepic{ps/v104packageforpoly.eps}{PFORP}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{PFORP}{constant} &
+\cross{PFORP}{firstExponent} &
+\cross{PFORP}{listAllMonoExp} \\
+\cross{PFORP}{listVariable} &
+\cross{PFORP}{minimalForm} &
+\cross{PFORP}{degOneCoef} \\
+\cross{PFORP}{degree} &
+\cross{PFORP}{degreeOfMinimalForm} &
+\cross{PFORP}{homogenize} \\
+\cross{PFORP}{listAllMono} &
+\cross{PFORP}{mapExponents} &
+\cross{PFORP}{monomials} \\
+\cross{PFORP}{replaceVarByOne} &
+\cross{PFORP}{replaceVarByZero} &
+\cross{PFORP}{subs1stVar} \\
+\cross{PFORP}{subs2ndVar} &
+\cross{PFORP}{subsInVar} &
+\cross{PFORP}{totalDegree} \\
+\cross{PFORP}{translate} &
+\cross{PFORP}{univariate} &
+\end{tabular}
+
+<<package PFORP PackageForPoly>>=
+)abbrev package PFORP PackageForPoly
+++ 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
+PackageForPoly(R,PolyRing,E,dim): public == private where
+  R: Ring -- was Field but change for SolveTree package. 21/01/98 )
+  dim: NonNegativeInteger
+  E: DirectProductCategory(dim,NonNegativeInteger)
+  PolyRing : FiniteAbelianMonoidRing(R,E) 
+
+  Term ==> Record(k:E,c:R)
+  PI   ==> PositiveInteger
+  NNI  ==> NonNegativeInteger
+  INT  ==> Integer
+
+  public == with
+      mapExponents: (E->E, PolyRing) -> PolyRing
+
+      degree: (PolyRing , Integer) -> NNI
+
+      univariate: PolyRing -> SparseUnivariatePolynomial(R)
+
+      totalDegree: PolyRing -> NNI
+
+      subs1stVar: (PolyRing , PolyRing) -> PolyRing
+
+      subs2ndVar: (PolyRing , PolyRing) -> PolyRing
+
+      subsInVar: (PolyRing, PolyRing, Integer) -> PolyRing
+      
+      minimalForm: PolyRing -> PolyRing
+        ++ minimalForm(pol) returns the minimal forms of the polynomial pol.
+
+      firstExponent: PolyRing -> E
+        ++ firstExponent(pol) returns the exponent of the first term in the 
+        ++ representation of pol. Not to be confused with the leadingExponent
+        ++  which is the highest exponent according to the order
+        ++ over the monomial.
+
+      replaceVarByZero: (PolyRing,Integer) -> PolyRing
+        ++ replaceVarByZero(pol,a) evaluate to zero the variable in pol 
+        ++ specified by the integer a.
+
+      replaceVarByOne: (PolyRing,Integer) -> PolyRing
+        ++ replaceVarByOne(pol,a) evaluate to one the variable in pol 
+        ++ specified by the integer a.
+
+      translate: (PolyRing,List R,Integer) -> PolyRing
+        ++ translate(pol,[a,b,c],3) apply to pol the
+        ++ linear change of coordinates, x->x+a, y->y+b, z->1.
+
+      translate: (PolyRing,List R) -> PolyRing
+        ++ translate(pol,[a,b,c]) apply to pol the
+        ++ linear change of coordinates, x->x+a, y->y+b, z->z+c
+
+      degOneCoef: (PolyRing,PI) -> R
+        ++ degOneCoef(pol,n) returns the coefficient in front of the monomial
+        ++ specified by the positive integer.
+
+      constant: PolyRing -> R
+        ++ constant(pol) returns the constant term of the polynomial.
+
+      homogenize: (PolyRing,INT) -> PolyRing
+        ++ homogenize(pol,n) returns the homogenized polynomial of pol 
+        ++ with respect to the n-th variable.
+
+      listAllMonoExp: Integer -> List E
+        ++ listAllMonoExp(l) returns all the exponents of degree l
+
+      listAllMono: NNI -> List PolyRing
+        ++ listAllMono(l) returns all the monomials of degree l
+
+      degreeOfMinimalForm: PolyRing -> NNI
+        ++ degreeOfMinimalForm does what it says
+
+      listVariable: () -> List PolyRing
+
+      monomials: PolyRing -> List PolyRing
+
+
+  private == add
+      import PolyRing
+
+      monomials(pol)==
+        zero? pol => empty()
+        lt:=leadingMonomial pol
+        cons( lt , monomials reductum pol )
+
+      lll: Integer -> E
+      lll(i) == 
+        le:=new( dim , 0$NNI)$List(NNI)
+        le.i := 1
+        directProduct( vector(le)$Vector(NNI) )$E
+
+      listVariable== 
+        [monomial(1,ee)$PolyRing for ee in [lll(i) for i in 1..dim]]
+
+      univariate(pol)==
+        zero? pol => 0
+        d:=degree pol
+        lc:=leadingCoefficient pol
+        td := reduce("+", entries d)
+        monomial(lc,td)$SparseUnivariatePolynomial(R)+univariate(reductum pol)
+      
+      collectExpon: List Term -> PolyRing
+
+      translateLocal: (PolyRing,List R,Integer) -> PolyRing
+
+      lA: (Integer,Integer) -> List List NNI
+
+      toListRep: PolyRing -> List Term
+
+      exponentEntryToZero: (E,Integer) -> E
+
+      exponentEntryZero?: (E,Integer) -> Boolean
+
+      homogenizeExp: (E,NNI,INT) -> E
+
+      translateMonomial: (PolyRing,List R,INT,R) -> PolyRing
+
+      leadingTerm: PolyRing -> Term
+
+      mapExponents(f,pol)==
+        zero?(pol) => 0
+	lt:=leadingTerm pol
+	newExp:E:= f(lt.k)
+	newMono:PolyRing:= monomial(lt.c,newExp)$PolyRing
+	newMono + mapExponents(f,reductum pol)
+	
+      collectExpon(pol)==
+        empty? pol => 0
+	ft:=first pol
+	monomial(ft.c,ft.k) + collectExpon( rest pol )
+
+      subs1stVar(pol, spol)==
+        zero? pol => 0
+        lexpE:E:= degree pol
+	lexp:List NNI:= parts lexpE
+        coef:= leadingCoefficient pol 
+	coef * spol ** lexp.1  * second(listVariable())**lexp.2 _
+           + subs1stVar( reductum pol, spol )
+
+      subs2ndVar(pol, spol)==
+        zero? pol => 0
+        lexpE:E:= degree pol
+	lexp:List NNI:= parts lexpE
+        coef:= leadingCoefficient pol 
+	coef * first(listVariable())**lexp.1   *  spol ** lexp.2 _
+           + subs2ndVar( reductum pol, spol )
+
+      subsInVar( pol, spol, n)==
+        one?( n ) => subs1stVar( pol, spol)
+        subs2ndVar(pol,spol) 
+
+      translate(pol,lpt)==        
+        zero? pol => 0
+        lexpE:E:= degree pol
+	lexp:List NNI:= parts lexpE
+        coef:= leadingCoefficient pol 
+	trVar:=[(listVariable().i + (lpt.i)::PolyRing)**lexp.i for i in 1..dim]
+        coef * reduce("*",trVar,1) + translate(reductum pol , lpt)
+
+      translate(poll,lpt,nV)==
+        pol:=replaceVarByOne(poll,nV)
+        translateLocal(pol,lpt,nV)
+
+      translateLocal(pol,lpt,nV)==
+	zero?(pol) => 0
+        lll:List R:=[l for l in lpt | ^zero?(l)]
+        nbOfNonZero:=# lll
+	ltk:=leadingMonomial pol
+	ltc:=leadingCoefficient pol
+        if one?(nbOfNonZero) then
+	  pol
+        else
+	  translateMonomial(ltk,lpt,nV,ltc) + _
+           translateLocal(reductum(pol),lpt,nV)
+
+      exponentEntryToZero(exp,nV)==
+        pexp:= parts exp
+	pexp(nV):=0
+	directProduct(vector(pexp)$Vector(NonNegativeInteger))
+
+      exponentEntryZero?(exp,nV)==
+        pexp:= parts exp
+	zero?(pexp(nV))
+
+      replaceVarByZero(pol,nV)==
+        -- surement le collectExpon ici n'est pas necessaire  !!!!
+        zero?(pol) => 0	
+        lRep:=	toListRep pol
+        reduce("+",_
+               [monomial(p.c,p.k)$PolyRing _
+                 for p in lRep | exponentEntryZero?(p.k,nV) ],0)
+
+      replaceVarByOne(pol,nV)==
+        zero?(pol) => 0	
+        lRep:=	toListRep pol
+	reduce("+",_
+         [monomial(p.c,exponentEntryToZero(p.k,nV))$PolyRing for p in lRep],0)
+
+      homogenizeExp(exp,deg,nV)==
+        lv:List NNI:=parts(exp)
+        lv.nV:=(deg+lv.nV - reduce("+",lv)) pretend NNI
+        directProduct(vector(lv)$Vector(NNI))$E
+
+      listTerm: PolyRing -> List E
+      listTerm(pol)==
+        zero? pol => empty
+        cons( degree pol,  listTerm reductum pol )
+
+      degree( a : PolyRing , n : Integer )==
+        zero? a => error "Degree for 0 is not defined for this degree fnc"
+        "max" / [ ee.n for ee in listTerm a ]
+
+      totalDegree p ==
+         zero? p => 0
+         "max"/[reduce("+",t::(Vector NNI), 0) for t in listTerm p]
+
+      homogenize(pol,nV)==
+        degP:=totalDegree(pol)
+        mapExponents(homogenizeExp(#1,degP,nV),pol)
+
+      degOneCoef(p:PolyRing,i:PI)==
+        vv:=new(dim,0)$Vector(NNI)
+        vv.i:=1
+        pd:=directProduct(vv)$E
+	lp:=toListRep p
+        lc:=[t.c for t in lp | t.k=pd]
+        reduce("+",lc,0)
+
+      constant(p)==
+        vv:=new(dim,0)$Vector(NNI)
+        pd:=directProduct(vv)$E
+	lp:=toListRep p
+        lc:=[t.c for t in lp | t.k=pd]
+        reduce("+",lc,0)
+
+      degreeOfMinimalForm(pol)==
+        totalDegree minimalForm pol
+
+      minimalForm(pol)==
+	zero?(pol) => pol
+	lpol:=toListRep pol
+	actTerm:Term:=  first lpol
+	minDeg:NNI:=reduce("+", parts(actTerm.k))
+	actDeg:NNI
+	lminForm:List(Term):= [actTerm]
+	for p in rest(lpol) repeat
+	  actDeg:= reduce("+", parts(p.k))
+	  if actDeg = minDeg then
+	    lminForm := concat(lminForm,p)
+	  if actDeg < minDeg then
+	    minDeg:=actDeg
+	    lminForm:=[p]
+	collectExpon lminForm
+
+    -- le code de collectExponSort a ete emprunte a D. Augot.
+      
+      leadingTerm(pol)==
+        zero?(pol) => error "no leading term for 0  (message from package)"
+	lcoef:R:=leadingCoefficient(pol)$PolyRing
+	lterm:PolyRing:=leadingMonomial(pol)$PolyRing
+	tt:E:=degree(lterm)$PolyRing
+	[tt,lcoef]$Term
+	
+      toListRep(pol)==
+        zero?(pol) => empty()
+	lt:=leadingTerm pol
+	cons(lt, toListRep reductum pol)  
+
+      lA(n,l)==
+        zero?(n) => [new((l pretend NNI),0)$List(NNI)]
+	one?(l) => [[(n pretend NNI)]]
+	concat [[ concat([i],lll) for lll in lA(n-i,l-1)] for i in 0..n]
+
+      listAllMonoExp(l)==
+        lst:=lA(l,(dim pretend Integer))
+        [directProduct(vector(pexp)$Vector(NNI)) for pexp in lst]
+
+      translateMonomial(mono,pt,nV,coef)==
+        lexpE:E:= degree mono
+	lexp:List NNI:= parts lexpE
+        lexp(nV):=0 
+	trVar:=[(listVariable().i + (pt.i)::PolyRing)** lexp.i for i in 1..dim]
+        coef * reduce("*",trVar,1)
+
+      listAllMono(l)==
+        [monomial(1,e)$PolyRing for e in listAllMonoExp(l)]
+
+
+@
+<<PFORP.dotabb>>=
+"PFORP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PFORP"]
+"DIRPCAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=DIRPCAT"]
+"PFORP" -> "DIRPCAT"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package PADEPAC PadeApproximantPackage}
 \pagehead{PadeApproximantPackage}{PADEPAC}
 \pagepic{ps/v104padeapproximantpackage.ps}{PADEPAC}{1.00}
@@ -155411,6 +155791,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package ORTHPOL OrthogonalPolynomialFunctions>>
 <<package OUT OutputPackage>>
 
+<<package PFORP PackageForPoly>>
 <<package PADEPAC PadeApproximantPackage>>
 <<package PADE PadeApproximants>>
 <<package PWFFINTB PAdicWildFunctionFieldIntegralBasis>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 1b69c4e..d58d21c 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24072,6 +24072,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|OrdSetInts| . OSI)
    (|OrthogonalPolynomialFunctions| . ORTHPOL)
    (|OutputPackage| . OUT)
+   (|PackageForPoly| . PFORP)
    (|PadeApproximantPackage| . PADEPAC)
    (|Palette| . PALETTE)
    (|PartialFraction| . PFR)
diff --git a/books/ps/v104packageforpoly.eps b/books/ps/v104packageforpoly.eps
new file mode 100644
index 0000000..59f1fac
--- /dev/null
+++ b/books/ps/v104packageforpoly.eps
@@ -0,0 +1,266 @@
+%!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 122 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 122 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 86 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% PFORP
+gsave
+[ /Rect [ 8 72 70 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=PFORP) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 70 108 moveto
+8 108 lineto
+8 72 lineto
+70 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 70 108 moveto
+8 108 lineto
+8 72 lineto
+70 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+15.5 85.9 moveto 47 (PFORP) 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
+% PFORP->DIRPCAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 39 72 moveto
+39 64 39 55 39 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 42.5 46 moveto
+39 36 lineto
+35.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 42.5 46 moveto
+39 36 lineto
+35.5 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index cddc555..3e47660 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100521 tpd src/axiom-website/patches.html 20100521.01.tpd.patch
+20100521 tpd src/algebra/Makefile help and test for PackageForPoly
+20100521 tpd books/bookvol5 expose PackageForPoly
+20100521 tpd books/bookvol10.4 add PackageForPoly
+20100521 tpd books/ps/v104packageforpoly.eps added
 20100520 tpd src/axiom-website/patches.html 20100520.03.tpd.patch
 20100520 tpd src/algebra/Makefile help and test for DesingTree
 20100520 tpd books/bookvol5 expose DesingTree
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 0cf80bd..08d2254 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -5351,7 +5351,8 @@ LAYER11=\
   ${OUT}/ODEPRRIC.o ${OUT}/OMPKG.o    ${OUT}/OMSERVER.o ${OUT}/PACRATC.o  \
   ${OUT}/PADEPAC.o   \
   ${OUT}/PADICRAT.o ${OUT}/PADICRC.o  ${OUT}/PCOMP.o    ${OUT}/PDECOMP.o  \
-  ${OUT}/PF.o       ${OUT}/PFBR.o     ${OUT}/PFBRU.o    ${OUT}/PFOTOOLS.o \
+  ${OUT}/PF.o       ${OUT}/PFBR.o     ${OUT}/PFBRU.o    ${OUT}/PFORP.o    \
+  ${OUT}/PFOTOOLS.o \
   ${OUT}/PFRPAC.o   ${OUT}/PGCD.o     ${OUT}/PINTERPA.o ${OUT}/PLEQN.o    \
   ${OUT}/PMPLCAT.o  ${OUT}/PMQFCAT.o  ${OUT}/PNTHEORY.o ${OUT}/POLUTIL.o  \
   ${OUT}/POLTOPOL.o ${OUT}/POLYCATQ.o ${OUT}/POLYLIFT.o ${OUT}/POLYROOT.o \
@@ -7724,6 +7725,25 @@ LAYER11=\
 /*"PFBRU" -> {"IXAGG"; "ELTAGG"; "CLAGG"; "FLAGG"; "ELAGG"; "OM"; "LSAGG-"}*/
 /*"PFBRU" -> {"STAGG-"; "ELAGG-"}*/
 
+"PFORP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PFORP"]
+/*"PFORP" -> {"RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"}*/
+/*"PFORP" -> {"ABELSG"; "SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"}*/
+/*"PFORP" -> {"MONOID"; "LMODULE"; "FAMR"; "AMR"; "BMODULE"}*/
+/*"PFORP" -> {"RMODULE"; "COMRING"; "ALGEBRA"; "MODULE"; "CHARZ"; "CHARNZ"}*/
+/*"PFORP" -> {"INTDOM"; "ENTIRER"; "FRETRCT"; "RETRACT"}*/
+"PFORP" -> "DIRPCAT"
+/*"PFORP" -> {"IXAGG"; "HOAGG"; "AGG"; "TYPE"; "EVALAB"; "IEVALAB"; "ELTAGG"}*/
+/*"PFORP" -> {"ELTAB"; "DIFEXT"; "DIFRING"; "PDRING"; "FLINEXP"; "LINEXP"}*/
+/*"PFORP" -> {"FINITE"; "ORDRING"; "OAGROUP"; "OCAMON"; "OAMON"; "OASGP"}*/
+/*"PFORP" -> {"ORDSET"; "OAMONS"; "VSPACE"; "FIELD"; "EUCDOM"; "PID"}*/
+/*"PFORP" -> {"GCDDOM"; "UFD"; "DIVRING"; "INT"; "LIST"; "ILIST"; "NNI"}*/
+/*"PFORP" -> {"LSAGG-"; "STAGG-"; "ELAGG-"; "FLAGG-"; "URAGG-"; "LNAGG-"}*/
+/*"PFORP" -> {"RCAGG-"; "IXAGG-"; "CLAGG-"; "HOAGG-"; "ORDSET-"; "AGG-"}*/
+/*"PFORP" -> {"ELTAGG-"; "SETCAT-"; "BASTYPE-"; "LSAGG"; "STAGG"; "URAGG"}*/
+/*"PFORP" -> {"RCAGG"; "LNAGG"; "CLAGG"; "KONVERT"; "FLAGG"; "ELAGG"; "OM"}*/
+/*"PFORP" -> {"VECTOR"; "SINT"; "PI"; "BOOLEAN"; "VECTCAT"; "A1AGG"}*/
+/*"PFORP" -> {"IVECTOR"; "IARRAY1"; "VECTCAT-"; "A1AGG-"}*/
+
 "PFOTOOLS" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PFOTOOLS"]
 /*"PFOTOOLS" -> {"UPOLYC"; "POLYCAT"; "PDRING"; "RING"; "RNG"; "ABELGRP"}*/
 /*"PFOTOOLS" -> {"CABMON"; "ABELMON"; "ABELSG"; "SETCAT"; "BASTYPE"}*/
@@ -17631,6 +17651,7 @@ SPADHELP=\
  ${HELP}/OrderedFreeMonoid.help \
  ${HELP}/OrderedVariableList.help \
  ${HELP}/OrderlyDifferentialPolynomial.help \
+ ${HELP}/PackageForPoly.help \
  ${HELP}/PartialFraction.help \
  ${HELP}/PartialFractionPackage.help \
  ${HELP}/Permanent.help \
@@ -17815,6 +17836,7 @@ REGRESS= \
  OrderedFreeMonoid.regress \
  OrderedVariableList.regress \
  OrderlyDifferentialPolynomial.regress \
+ PackageForPoly.regress \
  PartialFraction.regress \
  PartialFractionPackage.regress \
  Permanent.regress \
@@ -19189,6 +19211,16 @@ ${HELP}/OrderlyDifferentialPolynomial.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/OrderlyDifferentialPolynomial.input
 	@echo "OrderlyDifferentialPolynomial (ODPOL)" >>${HELPFILE}
 
+${HELP}/PackageForPoly.help: ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7880 create PackageForPoly.help from \
+           ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"PackageForPoly.help" ${BOOKS}/bookvol10.4.pamphlet \
+           >${HELP}/PackageForPoly.help
+	@cp ${HELP}/PackageForPoly.help ${HELP}/PFORP.help
+	@${TANGLE} -R"PackageForPoly.input" ${BOOKS}/bookvol10.4.pamphlet \
+            >${INPUT}/PackageForPoly.input
+	@echo "PackageForPoly (PFORP)" >>${HELPFILE}
+
 ${HELP}/PartialFraction.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7880 create PartialFraction.help from \
            ${BOOKS}/bookvol10.3.pamphlet
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 46ecba8..1257338 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2769,5 +2769,7 @@ books/bookvol10.3 add PACEXT, INFCLSPS<br/>
 books/bookvol10.2 add DesingTreeCategory<br/>
 <a href="patches/20100520.03.tpd.patch">20100520.03.tpd.patch</a>
 books/bookvol10.3 add DesingTree<br/>
+<a href="patches/20100521.01.tpd.patch">20100521.01.tpd.patch</a>
+books/bookvol10.4 add PackageForPoly<br/>
  </body>
 </html>
