diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 74166cc..4ebd8b4 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -35070,6 +35070,782 @@ GeneralizedMultivariateFactorize(OV,E,S,R,P) : C == T
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package GPAFF GeneralPackageForAlgebraicFunctionField}
+<<GeneralPackageForAlgebraicFunctionField.input>>=
+)set break resume
+)sys rm -f GeneralPackageForAlgebraicFunctionField.output
+)spool GeneralPackageForAlgebraicFunctionField.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show GeneralPackageForAlgebraicFunctionField
+--R GeneralPackageForAlgebraicFunctionField(K: Field,symb: List Symbol,PolyRing: PolynomialCategory(K,E,OrderedVariableList symb),E: DirectProductCategory(# symb,NonNegativeInteger),ProjPt: ProjectiveSpaceCategory K,PCS: LocalPowerSeriesCategory K,Plc: PlacesCategory(K,PCS),DIVISOR: DivisorCategory Plc,InfClsPoint: InfinitlyClosePointCategory(K,symb,PolyRing,E,ProjPt,PCS,Plc,DIVISOR,BLMET),DesTree: DesingTreeCategory InfClsPoint,BLMET: BlowUpMethodCategory)  is a package constructor
+--R Abbreviation for GeneralPackageForAlgebraicFunctionField is GPAFF 
+--R This constructor is exposed in this frame.
+--R Issue )edit /tmp/PAFF/spad/generalPaffPack.spad to see algebra source code for GPAFF 
+--R
+--R------------------------------- Operations --------------------------------
+--R adjunctionDivisor : () -> DIVISOR     desingTree : () -> List DesTree
+--R eval : (PolyRing,Plc) -> K            genus : () -> NonNegativeInteger
+--R genusNeg : () -> Integer              placesAbove : ProjPt -> List Plc
+--R pointDominateBy : Plc -> ProjPt       printInfo : List Boolean -> Void
+--R reset : () -> Void                    setCurve : PolyRing -> PolyRing
+--R singularPoints : () -> List ProjPt    theCurve : () -> PolyRing
+--R LPolynomial : () -> SparseUnivariatePolynomial Integer if K has FINITE
+--R LPolynomial : PositiveInteger -> SparseUnivariatePolynomial Integer if K has FINITE
+--R ZetaFunction : () -> UnivariateTaylorSeriesCZero(Integer,t) if K has FINITE
+--R ZetaFunction : PositiveInteger -> UnivariateTaylorSeriesCZero(Integer,t) if K has FINITE
+--R classNumber : () -> Integer if K has FINITE
+--R desingTreeWoFullParam : () -> List DesTree
+--R eval : (PolyRing,PolyRing,Plc) -> K
+--R eval : (Fraction PolyRing,Plc) -> K
+--R evalIfCan : (PolyRing,Plc) -> Union(K,"failed")
+--R evalIfCan : (PolyRing,PolyRing,Plc) -> Union(K,"failed")
+--R evalIfCan : (Fraction PolyRing,Plc) -> Union(K,"failed")
+--R findOrderOfDivisor : (DIVISOR,Integer,Integer) -> Record(ord: Integer,num: PolyRing,den: PolyRing,upTo: Integer)
+--R homogenize : (PolyRing,Integer) -> PolyRing
+--R interpolateForms : (DIVISOR,NonNegativeInteger) -> List PolyRing
+--R interpolateFormsForFact : (DIVISOR,List PolyRing) -> List PolyRing
+--R intersectionDivisor : PolyRing -> DIVISOR
+--R lBasis : DIVISOR -> Record(num: List PolyRing,den: PolyRing)
+--R numberOfPlacesOfDegree : PositiveInteger -> Integer if K has FINITE
+--R numberPlacesDegExtDeg : (PositiveInteger,PositiveInteger) -> Integer if K has FINITE
+--R numberRatPlacesExtDeg : PositiveInteger -> Integer if K has FINITE
+--R parametrize : (PolyRing,Plc) -> PCS
+--R placesOfDegree : PositiveInteger -> List Plc if K has FINITE
+--R rationalPlaces : () -> List Plc if K has FINITE
+--R rationalPoints : () -> List ProjPt if K has FINITE
+--R setSingularPoints : List ProjPt -> List ProjPt
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<GeneralPackageForAlgebraicFunctionField.help>>=
+====================================================================
+GeneralPackageForAlgebraicFunctionField examples
+====================================================================
+
+See Also:
+o )show GeneralPackageForAlgebraicFunctionField
+
+@
+\pagehead{GeneralPackageForAlgebraicFunctionField}{GPAFF}
+\pagepic{ps/v104generalpackageforalgebraicfunctionfield.eps}{GPAFF}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{GPAFF}{adjunctionDivisor} &
+\cross{GPAFF}{classNumber} &
+\cross{GPAFF}{desingTree} \\
+\cross{GPAFF}{desingTreeWoFullParam} &
+\cross{GPAFF}{eval} &
+\cross{GPAFF}{evalIfCan} \\
+\cross{GPAFF}{findOrderOfDivisor} &
+\cross{GPAFF}{genus} &
+\cross{GPAFF}{genusNeg} \\
+\cross{GPAFF}{homogenize} &
+\cross{GPAFF}{interpolateForms} &
+\cross{GPAFF}{interpolateFormsForFact} \\
+\cross{GPAFF}{intersectionDivisor} &
+\cross{GPAFF}{lBasis} &
+\cross{GPAFF}{LPolynomial} \\
+\cross{GPAFF}{numberOfPlacesOfDegree} &
+\cross{GPAFF}{numberPlacesDegExtDeg} &
+\cross{GPAFF}{numberRatPlacesExtDeg} \\
+\cross{GPAFF}{parametrize} &
+\cross{GPAFF}{placesAbove} &
+\cross{GPAFF}{placesOfDegree} \\
+\cross{GPAFF}{pointDominateBy} &
+\cross{GPAFF}{printInfo} &
+\cross{GPAFF}{rationalPlaces} \\
+\cross{GPAFF}{rationalPoints} &
+\cross{GPAFF}{reset} &
+\cross{GPAFF}{setCurve} \\
+\cross{GPAFF}{setSingularPoints} &
+\cross{GPAFF}{singularPoints} &
+\cross{GPAFF}{theCurve} \\
+\cross{GPAFF}{ZetaFunction} &&
+\end{tabular}
+
+<<package GPAFF GeneralPackageForAlgebraicFunctionField>>=
+)abbrev package GPAFF GeneralPackageForAlgebraicFunctionField
+++ Author: Gaetan Hache
+++ Date created: June 1995
+++ Date Last Updated: May 2010 by Tim Daly
+++ Description: 
+++ A package that implements the Brill-Noether algorithm. Part of the
+++ PAFF package.
+GeneralPackageForAlgebraicFunctionField( K, 
+                                         symb,
+                                         PolyRing,
+                                         E, 
+                                         ProjPt, 
+                                         PCS,
+                                         Plc,
+                                         DIVISOR,
+                                         InfClsPoint,
+                                         DesTree,
+                                         BLMET
+                                        ) :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)
+  Plc         : PlacesCategory(K,PCS)
+  DIVISOR     : DivisorCategory(Plc)
+  InfClsPoint : InfinitlyClosePointCategory(K,symb,PolyRing,E,ProjPt,_
+                                            PCS,Plc,DIVISOR,BLMET)
+  DesTree     : DesingTreeCategory(InfClsPoint)
+  BLMET       : BlowUpMethodCategory
+
+  FRACPOLY ==> Fraction PolyRing
+  OF       ==> OutputForm
+  INT      ==> Integer
+  NNI      ==> NonNegativeInteger
+  PI       ==> PositiveInteger
+  UP       ==> UnivariatePolynomial
+  UPZ      ==> UP(t, Integer) 
+  UTSZ     ==> UnivariateTaylorSeriesCZero(Integer,t)
+  SUP      ==> SparseUnivariatePolynomial
+  PPFC1    ==> PolynomialPackageForCurve(K,PolyRing,E,#symb,ProjPt)
+
+
+  ParamPackFC   ==> LocalParametrizationOfSimplePointPackage(K,symb,PolyRing,_
+                                                             E,ProjPt,PCS,Plc)
+  ParamPack   ==> ParametrizationPackage(K,symb,PolyRing,E,ProjPt,PCS,Plc)
+  RatSingPack ==> ProjectiveAlgebraicSetPackage(K,symb,PolyRing,E,ProjPt)
+  IntDivPack  ==> IntersectionDivisorPackage(K,symb,PolyRing,E,ProjPt,PCS,_
+                                        Plc,DIVISOR,InfClsPoint,DesTree,BLMET)
+  IntFrmPack  ==> InterpolateFormsPackage(K,symb,PolyRing,E,ProjPt,PCS,_
+                                          Plc,DIVISOR)
+  DesTrPack   ==> DesingTreePackage(K,symb,PolyRing,E,ProjPt,PCS,_
+                                        Plc,DIVISOR,InfClsPoint,DesTree,BLMET)
+  PackPoly    ==> PackageForPoly(K,PolyRing,E,#symb)
+
+  Exports ==>  with
+
+    reset: () -> Void
+
+    setCurve: PolyRing -> PolyRing
+
+    homogenize: (PolyRing,Integer) -> PolyRing
+
+    printInfo: List Boolean -> Void
+      ++ printInfo(lbool) prints some information comming from various 
+      ++ package and domain used by this package.
+
+    theCurve: () -> PolyRing
+      ++ theCurve returns the specified polynomial for the package.
+
+    genus: () -> NNI
+      ++ genus returns the genus of the curve defined by the polynomial 
+      ++ given to the package.
+
+    genusNeg: () -> INT
+
+    desingTree: () -> List DesTree
+      ++ desingTree returns the desingularisation trees at all singular 
+      ++ points of the curve defined by the polynomial given to the package.
+
+    desingTreeWoFullParam  : () -> List DesTree
+      ++ desingTreeWoFullParam returns the desingularisation trees at all 
+      ++ singular points of the curve defined by the polynomial given to 
+      ++ the package. The local parametrizations are not computed.
+
+    setSingularPoints: List ProjPt -> List ProjPt
+      ++ setSingularPoints(lpt) sets the singular points to be used. 
+      ++ Beware: no attempt is made to check if the points are singular 
+      ++ or not, nor if all of the singular points are presents. Hence, 
+      ++ results of some computation maybe false. It is intend to be use
+      ++ when one want to compute the singular points are computed by other 
+      ++ means than to use the function singularPoints.
+
+    singularPoints: () -> List(ProjPt)
+      ++ rationalPoints() returns the singular points of the
+      ++ curve defined by the polynomial given to the package.
+      ++ If the singular points lie in an extension of the specified ground 
+      ++ field an error message is issued specifying the extension degree 
+      ++ needed to find all singular points.
+
+    parametrize: (PolyRing,Plc) -> PCS
+      ++ parametrize(f,pl) returns a local parametrization of f at the place 
+      ++ pl.
+
+    lBasis: DIVISOR -> Record(num:List PolyRing, den: PolyRing)
+      ++ lBasis computes a basis associated to the specified divisor
+
+    findOrderOfDivisor: (DIVISOR,Integer,Integer) -> _
+                    Record(ord:Integer,num:PolyRing,den:PolyRing,upTo:Integer)
+
+    interpolateForms: (DIVISOR,NNI) -> List(PolyRing)
+      ++ interpolateForms(d,n) returns a basis of the interpolate forms of 
+      ++ degree n of the divisor d.
+
+    interpolateFormsForFact: (DIVISOR,List PolyRing) -> List(PolyRing)
+
+    eval: (PolyRing,Plc) -> K
+      ++ eval(f,pl) evaluate f at the place pl.
+
+    eval: (PolyRing,PolyRing,Plc) -> K
+      ++ eval(f,g,pl) evaluate the function f/g at the place pl.
+
+    eval: (FRACPOLY,Plc) -> K
+      ++ eval(u,pl) evaluate the function u at the place pl.
+
+    evalIfCan: (PolyRing,Plc) -> Union(K,"failed")
+      ++ evalIfCan(f,pl) evaluate f at the place pl 
+      ++ (returns "failed" if it is a pole).
+
+    evalIfCan: (PolyRing,PolyRing,Plc) -> Union(K,"failed")
+      ++ evalIfCan(f,g,pl) evaluate the function f/g at the place pl 
+      ++ (returns "failed" if it is a pole).
+
+    evalIfCan: (FRACPOLY,Plc) -> Union(K,"failed")
+      ++ evalIfCan(u,pl) evaluate the function u at the place pl 
+      ++ (returns "failed" if it is a pole).
+
+    intersectionDivisor: PolyRing -> DIVISOR
+      ++ intersectionDivisor(pol) compute the intersection divisor 
+      ++ (the Cartier divisor) of the form pol with the curve. If some 
+      ++ intersection points lie in an extension of the ground field,
+      ++ an error message is issued specifying the extension degree 
+      ++ needed to find all the intersection  points.
+      ++ (If pol is not homogeneous an error message is issued).
+
+    adjunctionDivisor: () -> DIVISOR
+      ++ adjunctionDivisor computes the adjunction divisor of the plane 
+      ++ curve given by the polynomial crv.
+
+    placesAbove: ProjPt -> List Plc
+
+    pointDominateBy : Plc -> ProjPt
+      ++ pointDominateBy(pl) returns the projective point dominated 
+      ++ by the place pl.
+
+    if K has Finite then --should we say LocallyAlgebraicallyClosedField??
+
+      rationalPlaces: () -> List Plc
+        ++ rationalPlaces returns all the rational places of  the
+        ++ curve defined by the polynomial given to the package.
+
+      rationalPoints: () -> List(ProjPt)
+
+      LPolynomial: () -> SparseUnivariatePolynomial Integer
+        ++ Returns the L-Polynomial of the curve.
+
+      LPolynomial: PI -> SparseUnivariatePolynomial Integer
+        ++ LPolynomial(d) returns the L-Polynomial of the curve in
+        ++ constant field extension of degree d. 
+
+      classNumber: () -> Integer
+        ++ Returns the class number of the curve.
+
+      placesOfDegree: PI -> List Plc
+        ++ placesOfDegree(d) returns all places of degree d of the
+        ++ curve.
+
+      numberOfPlacesOfDegree: PI -> Integer
+        ++ returns the number of places of the given degree
+
+      numberRatPlacesExtDeg: PI -> Integer
+        ++ numberRatPlacesExtDeg(n) returns the number of rational
+        ++ places in the constant field extenstion of degree n
+
+      numberPlacesDegExtDeg: (PI, PI) -> Integer
+        ++ numberRatPlacesExtDegExtDeg(d, n) returns the number of 
+        ++ places of degree d in the constant field extension of
+        ++ degree n
+
+      ZetaFunction: () -> UTSZ
+        ++ Returns the Zeta function of the curve. Calculated by
+        ++ using the L-Polynomial
+
+      ZetaFunction: PI -> UTSZ
+        ++ Returns the Zeta function of the curve in constant field
+        ++ extension. Calculated by using the L-Polynomial
+        
+  Implementation ==>  add
+    import PPFC1
+    import PPFC2
+    import DesTrPack
+    import IntFrmPack
+    import IntDivPack
+    import RatSingPack
+    import ParamPack
+    import ParamPackFC
+    import PackPoly
+
+    crvLocal:PolyRing:=1$PolyRing
+
+    -- flags telling such and such is already computed.
+
+    genusCalc?:Boolean:= false()$Boolean
+    theGenus:INT:=0
+
+    desingTreeCalc?:Boolean:=false()$Boolean
+    theTree:List DesTree := empty()
+
+    desingTreeWoFullParamCalc?:Boolean:=false()$Boolean
+
+    adjDivCalc?:Boolean:=false()$Boolean
+    theAdjDiv:DIVISOR:=0
+
+    singularPointsCalc?:Boolean:=false()$Boolean
+    lesPtsSing:List(ProjPt):=empty()
+
+    rationalPointsCalc?:Boolean:=false()$Boolean
+    lesRatPts:List(ProjPt):=empty()
+
+    rationalPlacesCalc?:Boolean:=false()$Boolean
+    lesRatPlcs:List(Plc):=empty()
+
+    zf:UTSZ:=1$UTSZ
+    zfCalc : Boolean := false()$Boolean
+
+    DegOfPlacesFound: List Integer := empty()
+
+    -- see package IntersectionDivisorPackage
+    intersectionDivisor(pol)==
+      if ^(pol =$PolyRing homogenize(pol,1)) then _
+        error _
+         "From intersectionDivisor: the input is NOT a homogeneous polynomial"
+      intersectionDivisor(pol,theCurve(),desingTree(),singularPoints())
+
+    lBasis(divis)==
+      d:=degree divis
+      d < 0 => [[0$PolyRing],1$PolyRing]
+      A:=adjunctionDivisor()
+      -- modifie le 08/05/97: avant c'etait formToInterp:=divOfZero(divis) + A
+      formToInterp:=  divOfZero(divis + A)
+      degDpA:=degree  formToInterp
+      degCrb:=totalDegree(theCurve())$PackPoly
+      dd:=divide(degDpA,degCrb pretend Integer)
+      dmin:NNI:=
+        if ^zero?(dd.remainder) then (dd.quotient+1) pretend NNI
+        else dd.quotient pretend NNI
+      print("Trying to interpolate with forms of degree:"::OF)
+      print(dmin::OF)
+      lg0:List PolyRing:=interpolateForms(formToInterp,dmin)
+      while zero?(first lg0) repeat
+        dmin:=dmin+1
+        print("Trying to interpolate with forms of degree:"::OF)
+        print(dmin::OF)
+        lg0:=interpolateForms(formToInterp,dmin)
+      print("Denominator found"::OF)
+      g0:PolyRing:=first lg0
+      dg0:=intersectionDivisor(g0)
+      print("Intersection Divisor of Denominator found"::OF)
+      lnumer:List PolyRing:=interpolateForms(dg0-divis,dmin)
+      [lnumer,g0]
+
+    genus==
+      if ^(genusCalc?) then
+        degCrb:=totalDegree(theCurve())$PackPoly
+        theGenus:=genusTreeNeg(degCrb,desingTreeWoFullParam())
+        genusCalc?:=true()$Boolean
+      theGenus < 0 => 
+        print(("Too many infinitly near points")::OF)
+        print(("The curve may not be absolutely irreducible")::OF)
+        error "Have a nice day"
+      theGenus pretend NNI
+
+    genusNeg==
+      if ^(genusCalc?) then
+        degCrb:=totalDegree(theCurve())$PackPoly
+        theGenus:=genusTreeNeg(degCrb,desingTreeWoFullParam())
+        genusCalc?:=true()$Boolean
+      theGenus 
+
+    homogenize(pol,n)== homogenize(pol,n)$PackPoly
+
+    fPl(pt:ProjPt,desTr:DesTree):Boolean ==
+      nd:=value desTr
+      lpt:=pointV nd
+      pt = lpt
+
+
+    placesAbove(pt)==
+      -- verifie si le point est simple, si c'est le cas, 
+      -- on retourne la place correpondante
+      -- avec pointToPlace qui cre' la place si necessaire.
+      ^member?(pt,singularPoints()) => _
+        [pointToPlace(pt,theCurve())$ParamPackFC]
+      -- les quatres lignes suivantes trouvent les feuilles qui 
+      -- sont au-dessus du point.
+      theTree:= desingTree()
+      cTree:= find(fPl(pt,#1),theTree)
+      cTree case "failed" => error "Big error in placesAbove"
+        -- G. Hache, gaetan.hache@inria.fr"
+      lvs:=leaves cTree
+      -- retourne les places correspondant aux feuilles en "consultant" 
+      -- les diviseurs exceptionnels.
+      concat [supp excpDivV(l) for l in lvs]
+
+    pointDominateBy(pl)== pointDominateBy(pl)$ParamPackFC
+
+    reduceForm(p1:PolyRing,p2:PolyRing):PolyRing==
+      normalForm(p1,[p2])$GroebnerPackage(K,E,OV,PolyRing)
+
+    evalIfCan(f:PolyRing,pl:Plc)==
+      u:=reduceForm(f, theCurve() ) 
+      zero?(u) => 0
+      pf:= parametrize(f,pl)
+      ord:INT:=order pf 
+      ord < 0 => "failed"
+      ord > 0 => 0
+      coefOfFirstNonZeroTerm pf
+
+    eval(f:PolyRing,pl:Plc)==
+      eic:=evalIfCan(f,pl)
+      eic case "failed" => _
+        error "From eval (function at place): its a pole !!!"
+      eic    
+
+    setCurve(pol)==
+      crvLocal:=pol
+      ^(crvLocal =$PolyRing homogenize(crvLocal,1)) =>
+        print(("the defining polynomial is not homogeneous")::OF)
+        error "Have a nice day"
+      reset()
+      theCurve()
+      
+    reset == 
+      setFoundPlacesToEmpty()$Plc
+      genusCalc?:Boolean:= false()$Boolean
+      theGenus:INT:=0
+      desingTreeCalc?:Boolean:=false()$Boolean
+      desingTreeWoFullParamCalc?:Boolean:=false()$Boolean
+      theTree:List DesTree := empty()
+      adjDivCalc?:Boolean:=false()$Boolean
+      theAdjDiv:DIVISOR:=0
+      singularPointsCalc?:Boolean:=false()$Boolean
+      lesPtsSing:List(ProjPt):=empty()
+      rationalPointsCalc?:Boolean:=false()$Boolean
+      lesRatPts:List(ProjPt):=empty()
+      rationalPlacesCalc?:Boolean:=false()$Boolean
+      lesRatPlcs:List(Plc):=empty()
+      DegOfPlacesFound: List Integer := empty()
+      zf:UTSZ:=1$UTSZ
+      zfCalc:Boolean := false$Boolean
+
+    foundPlacesOfDeg?(i:PositiveInteger):Boolean ==
+      ld: List Boolean := [zero?(a rem i) for a in DegOfPlacesFound]
+      entry?(true$Boolean,ld)
+
+    findOrderOfDivisor(divis,lb,hb) ==
+      ^zero?(degree divis) => error("The divisor is NOT of degre zero !!!!")
+      A:=adjunctionDivisor()
+      formToInterp:=divOfZero ( hb*divis + A )
+      degDpA:=degree formToInterp
+      degCrb:=totalDegree( theCurve())$PackPoly
+      dd:=divide(degDpA,degCrb pretend Integer)
+      dmin:NNI:=
+        if ^zero?(dd.remainder) then (dd.quotient+1) pretend NNI
+        else dd.quotient pretend NNI
+      lg0:List PolyRing:=interpolateForms(formToInterp,dmin)
+      while zero?(first lg0) repeat
+        dmin:=dmin+1
+        lg0:=interpolateForms(formToInterp,dmin)
+      g0:PolyRing:=first lg0
+      dg0:=intersectionDivisor(g0)
+      nhb:=hb
+      while effective?(dg0 - nhb*divis - A) repeat
+        nhb:=nhb+1
+      nhb:=nhb-1
+      ftry:=lb
+      lnumer:List PolyRing:=interpolateForms(dg0-ftry*divis,dmin)
+      while zero?(first lnumer) and ftry < nhb repeat
+        ftry:=ftry + 1
+        lnumer:List PolyRing:=interpolateForms(dg0-ftry*divis,dmin)
+      [ftry,first lnumer,g0,nhb]
+
+    theCurve==
+      one?(crvLocal) => error "The defining polynomial has not been set yet!"
+      crvLocal
+
+    printInfo(lbool)==
+      printInfo(lbool.2)$ParamPackFC
+      printInfo(lbool.3)$PCS
+      void()
+
+    desingTree==
+      theTree:= desingTreeWoFullParam()
+      if ^(desingTreeCalc?) then
+        for arb in theTree repeat
+          fullParamInit(arb)
+        desingTreeCalc?:=true()$Boolean
+      theTree
+
+    desingTreeWoFullParam==
+      if ^(desingTreeWoFullParamCalc?) then
+        theTree:=[desingTreeAtPoint(pt,theCurve())  for pt in singularPoints()]
+        desingTreeWoFullParamCalc?:=true()$Boolean
+      theTree
+
+    -- compute the adjunction divisor of the curve using adjunctionDivisor 
+    -- from DesingTreePackage
+    adjunctionDivisor()==
+      if ^(adjDivCalc?) then
+        theAdjDiv:=_
+          reduce("+",[adjunctionDivisor(tr) for tr in desingTree()],0$DIVISOR)
+        adjDivCalc?:=true()$Boolean
+      theAdjDiv
+
+    -- returns the singular points using the function singularPoints 
+    -- from ProjectiveAlgebraicSetPackage
+    singularPoints==
+      if ^(singularPointsCalc?) then
+        lesPtsSing:=singularPoints(theCurve())
+        singularPointsCalc?:=true()$Boolean
+      lesPtsSing
+
+    setSingularPoints(lspt)==
+      singularPointsCalc?:=true()$Boolean
+      lesPtsSing:= lspt
+ 
+    -- returns the rational points using the function rationalPoints 
+    -- from ProjectiveAlgebraicSetPackage
+
+    -- compute the local parametrization of f at the place pl 
+    -- (from package ParametrizationPackage)
+    parametrize(f,pl)==parametrize(f,pl)$ParamPack
+
+    -- compute the interpolating forms (see package InterpolateFormsPackage)
+    interpolateForms(d,n)==
+      lm:List PolyRing:=listAllMono(n)$PackPoly
+      interpolateForms(d,n,theCurve(),lm)
+
+    interpolateFormsForFact(d,lm)==
+      interpolateFormsForFact(d,lm)$IntFrmPack
+
+    evalIfCan(f:PolyRing,g:PolyRing,pl:Plc)==
+      fu:=reduceForm(f,theCurve())
+      gu:=reduceForm(g,theCurve())
+      zero?(fu) and ^zero?(gu) => 0
+      ^zero?(fu) and zero?(gu) => "failed"
+      pf:= parametrize(fu,pl)
+      pg:= parametrize(gu,pl)
+      ordf:INT:=order pf
+      ordg:INT:=order pg
+      cf:=coefOfFirstNonZeroTerm pf
+      cg:=coefOfFirstNonZeroTerm pg
+      (ordf - ordg) < 0 => "failed"
+      (ordf - ordg) > 0 => 0
+      cf * inv cg
+
+    eval(f:PolyRing,g:PolyRing,pl:Plc)==
+      eic:=evalIfCan(f,g,pl)
+      eic case "failed" => error "From eval (function at place): its a pole"
+      eic
+
+    evalIfCan(u:FRACPOLY,pl:Plc)==
+      f:PolyRing := numer u
+      g:PolyRing := denom u
+      evalIfCan(f,g,pl)
+      
+    eval(u:FRACPOLY,pl:Plc)==
+      f:PolyRing := numer u
+      g:PolyRing := denom u
+      eval(f,g,pl)
+    
+    thedeg:PI := 1
+    
+    crap(p:Plc):Boolean ==
+      degree(p)$Plc = thedeg
+    
+    if K has Finite then 
+      rationalPlaces == 
+        K has PseudoAlgebraicClosureOfFiniteFieldCategory => _
+           placesOfDegree(1$PI)
+        --non good pour LACF !!!!
+        rationalPlacesCalc? => lesRatPlcs
+        ltr:List(DesTree):=desingTree()
+        ratP:List(ProjPt):=rationalPoints()
+        singP:List(ProjPt):=singularPoints()
+        simRatP:List(ProjPt):=setDifference(ratP,singP)
+        for pt in simRatP repeat
+          pointToPlace(pt,theCurve())$ParamPackFC
+        rationalPlacesCalc? := true()$Boolean
+        lesRatPlcs:=foundPlaces()$Plc
+        lesRatPlcs
+
+      rationalPoints==
+        if ^(rationalPointsCalc?) then
+          if K has Finite then
+            lesRatPts:= rationalPoints(theCurve(),1)$RatSingPack
+            rationalPointsCalc?:=true()$Boolean
+          else
+            error "Can't find rationalPoints when the field is not finite"
+        lesRatPts
+    
+      ZetaFunction() ==
+        if not zfCalc then
+	  zf:= ZetaFunction(1)
+          zfCalc:= true$Boolean
+	zf
+                  
+      ZetaFunction(d) ==
+	  lp:= LPolynomial(d)
+	  if K has PseudoAlgebraicClosureOfFiniteFieldCategory then
+	    setTower!(1$K)
+	  q:INT := size()$K ** d
+	  lpt:UPZ := unmakeSUP(lp)$UPZ
+	  lps:UTSZ := coerce(lpt)$UTSZ
+	  x:= monomial(1,1)$UTSZ
+	  mul: UTSZ := (1-x)*(1 - q * x)
+	  invmul:Union(UTSZ,"failed") := recip(mul)$UTSZ
+	  ivm: UTSZ
+	  if not (invmul case "failed") then 
+	    ivm := invmul pretend UTSZ
+	  else
+	    ivm := 1
+          lps * ivm
+      
+      calculatedSer: List UTSZ:= [1]
+        --in index i is the "almost ZetaFunction" summed to i-1. 
+	--Except calculatedSer.1 which is 1
+      
+      numberOfPlacesOfDegreeUsingZeta(degree:PI): Integer  == 
+        --is at most called once for each degree. Will calculate the
+	--entries in calculatdSer. 
+        ser:UTSZ := 1
+	x:= monomial(1,1)$UTSZ
+	pol:UTSZ
+	polser:Union(UTSZ,"failed")
+	serdel:UTSZ
+	i:PI := maxIndex(calculatedSer) pretend PI
+	while i < degree repeat
+	  serdel:= 1
+	  if (n:= numberOfPlacesOfDegree(i)) > 0 then 
+	    pol:= (1-x**i) ** (n pretend PI)
+	    polser:= recip(pol)$UTSZ -- coerce(pol)$UTSZ)$UTSZ
+	    if not (polser case "failed") then
+	      serdel:= (polser pretend UTSZ)
+	    else
+	      error "In numberOfPlacesOfDegreeUsingZeta. This shouldn't happen"
+	  ser:= serdel * calculatedSer.i
+	  calculatedSer:= concat(calculatedSer, ser)
+	  i:= i + 1
+	if degree = 1 then 
+	  coefficient(ZetaFunction(),degree)
+        else
+	  coefficient(ZetaFunction(),degree) - _
+           coefficient(calculatedSer.degree, degree)
+
+      calculatedNP: List Integer := empty()
+        --local variable, in index i is number of places of degree i.
+      
+      numberOfPlacesOfDegree(i:PI): Integer ==
+         if zfCalc then
+	   if (m := maxIndex(calculatedNP)) < i then
+	     calculatedNP:= _
+               concat(calculatedNP, _
+                 [numberOfPlacesOfDegreeUsingZeta(j pretend PI) _
+                   for j in ((m+1) pretend PI)..i])
+	   calculatedNP.i
+	 else
+	   # placesOfDegree(i) --maybe we should make an improvement in this
+	         	         
+      placesOfDegree(i) ==
+        if (not foundPlacesOfDeg?(i)) then
+	   if characteristic()$K**i > (2**16 - 1) then
+	     print("If you are using a prime field and"::OF)
+             print("GB this will not work."::OF)
+	   desingTree()
+	   placesOfDegree(i,theCurve(),singularPoints())
+	   DegOfPlacesFound:= concat(DegOfPlacesFound, i)
+	thedeg:= i
+	select(crap(#1), foundPlaces()$Plc)
+	
+      numberRatPlacesExtDeg(extDegree:PI): Integer ==
+        numberPlacesDegExtDeg(1,extDegree)
+	
+      numberPlacesDegExtDeg(degree:PI, extDegree:PI): Integer ==
+        res:Integer:=0
+	m:PI := degree * extDegree
+	d: PI
+	while m > 0 repeat
+	  d:= gcd(m, extDegree)
+	  if (m quo d) = degree then
+	    res:= res + (numberOfPlacesOfDegree(m) * d)
+	  m:= (m - 1) pretend PI
+	res
+	
+      calculateS(extDeg:PI): List Integer ==
+        g := genus()
+	sizeK:NNI := size()$K ** extDeg
+	i:PositiveInteger := g pretend PI
+	S: List Integer := [0 for j in 1..g]
+	good:Boolean := true()$Boolean
+	while good repeat
+	  S.i := numberRatPlacesExtDeg(i*extDeg) - ((sizeK **$NNI i) + 1)
+	  j:Integer := i - 1
+	  if (not (j = 0))  then
+	    i:= (j pretend PI)
+	  else good:= false()$Boolean
+	S
+      
+      LPolynomial(): SparseUnivariatePolynomial Integer ==
+        LPolynomial(1)
+      
+      LPolynomial(extDeg:PI): SparseUnivariatePolynomial Integer ==
+        --when translating to AxiomXL rewrite this function!
+	g := genus()
+	zero?(g) => 1
+	coef: List Integer := [1]
+	if K has PseudoAlgebraicClosureOfFiniteFieldCategory then
+	  setTower!(1$K)
+        sizeK:Integer := size()$K ** extDeg  --need to do a setExtension before
+        coef:= concat(coef,[0 for j in 1..(2*g)])
+	S: List Integer := calculateS(extDeg)
+	i:PI := 1
+	tmp:Integer
+        while i < g + 1 repeat
+          j:PI := 1
+	  tmp:= 0
+	  while j < i + 1 repeat
+	    tmp:= tmp + S.j * coef((i + 1 - j) pretend PI)
+	    j:= j + 1
+	  coef.(i+1) := tmp quo i
+	  i:= i + 1
+	i:= 1
+	while i < g + 1 repeat
+          ss: Integer := sizeK **$Integer ((g + 1 - i) pretend PI)
+          val:Integer := ss * coef.i
+          coef.((2*g+2 - i) pretend PI) := val
+	  i:= i + 1
+	x:= monomial(1,1)$SUP(INT)
+        result: SparseUnivariatePolynomial(Integer):= _
+          1$SparseUnivariatePolynomial(Integer)
+	coef:= rest(coef)	
+	i:= 1
+	while i < 2 * g + 1 repeat
+	  pol: SUP(INT) := (first(coef) :: Integer) * (x ** i)
+          result:= result + pol --(first(coef) :: Integer) * (x ** i)
+          coef:= rest(coef)
+          i:= i + 1
+        result
+        	
+      classNumber():Integer ==
+        LPolynomial()(1)      
+
+@
+<<GPAFF.dotabb>>=
+"GPAFF" [color="#FF4488",href="bookvol10.4.pdf#nameddest=GPAFF"]
+"DTP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=DTP"]
+"INTDIVP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=INTDIVP"]
+"GPAFF" -> "INTDIVP"
+"GPAFF" -> "DTP"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package GENPGCD GeneralPolynomialGcdPackage}
 \pagehead{GeneralPolynomialGcdPackage}{GENPGCD}
 \pagepic{ps/v104generalpolynomialgcdpackage.ps}{GENPGCD}{1.00}
@@ -158429,6 +159205,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package GAUSSFAC GaussianFactorizationPackage>>
 <<package GHENSEL GeneralHenselPackage>>
 <<package GENMFACT GeneralizedMultivariateFactorize>>
+<<package GPAFF GeneralPackageForAlgebraicFunctionField>>
 <<package GENPGCD GeneralPolynomialGcdPackage>>
 <<package GENUPS GenerateUnivariatePowerSeries>>
 <<package GENEEZ GenExEuclid>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index ce11c9d..5bfcd47 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -23956,6 +23956,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|FunctionSpacePrimitiveElement| . FSPRMELT)
    (|FunctionSpaceSum| . SUMFS)
    (|GaussianFactorizationPackage| . GAUSSFAC)
+   (|GeneralPackageForAlgebraicFunctionField| . GPAFF)
    (|GeneralUnivariatePowerSeries| . GSERIES)
    (|GenerateUnivariatePowerSeries| . GENUPS)
    (|GraphicsDefaults| . GRDEF)
diff --git a/books/ps/v104generalpackageforalgebraicfunctionfield.eps b/books/ps/v104generalpackageforalgebraicfunctionfield.eps
new file mode 100644
index 0000000..3b02b19
--- /dev/null
+++ b/books/ps/v104generalpackageforalgebraicfunctionfield.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 190 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 190 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 154 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% GPAFF
+gsave
+[ /Rect [ 37 72 99 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=GPAFF) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 99 108 moveto
+37 108 lineto
+37 72 lineto
+99 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 99 108 moveto
+37 108 lineto
+37 72 lineto
+99 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+45 85.9 moveto 46 (GPAFF) alignedtext
+grestore
+% DTP
+gsave
+[ /Rect [ 0 0 54 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=DTP) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 54 36 moveto
+0 36 lineto
+0 0 lineto
+54 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 54 36 moveto
+0 36 lineto
+0 0 lineto
+54 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+12.5 13.9 moveto 29 (DTP) alignedtext
+grestore
+% GPAFF->DTP
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 58 72 moveto
+53 64 48 54 42 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 44.92 43.04 moveto
+37 36 lineto
+38.8 46.44 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 44.92 43.04 moveto
+37 36 lineto
+38.8 46.44 lineto
+closepath stroke
+grestore
+% INTDIVP
+gsave
+[ /Rect [ 72 0 146 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=INTDIVP) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 146 36 moveto
+72 36 lineto
+72 0 lineto
+146 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 146 36 moveto
+72 36 lineto
+72 0 lineto
+146 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+79.5 13.9 moveto 59 (INTDIVP) alignedtext
+grestore
+% GPAFF->INTDIVP
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 78 72 moveto
+83 64 88 54 94 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 97.2 46.44 moveto
+99 36 lineto
+91.08 43.04 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 97.2 46.44 moveto
+99 36 lineto
+91.08 43.04 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 1a0d09e..c31b5c5 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100524 tpd src/axiom-website/patches.html 20100524.02.tpd.patch
+20100524 tpd src/algebra/Makefile help and test for GPAFF
+20100524 tpd books/bookvol5 expose
+20100524 tpd books/bookvol10.4 add GPAFF
+20100524 tpd books/ps/v104generalpackageforalgebraicfunctionfield.eps added
 20100524 tpd src/axiom-website/patches.html 20100524.01.tpd.patch
 20100524 tpd src/algebra/Makefile help and test for IntersectionDivisorPackage
 20100524 tpd books/bookvol5 expose IntersectionDivisorPackage
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 5ada953..74e60f9 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -15846,11 +15846,12 @@ LAYER18=\
 
 @
 \subsection{Layer19}
-Depends on: EXPRSOL SFRTCAT FACTEXT\\
+Depends on: EXPRSOL SFRTCAT FACTEXT INTDIVP DTP\\
 Next layer depends on: RECOP
 <<layer19>>=
 
 LAYER19=\
+  ${OUT}/GPAFF.o    \
   ${OUT}/IRURPK.o   ${OUT}/LAZM3PK.o  ${OUT}/LEXTRIPK.o ${OUT}/NORMPK.o  \
   ${OUT}/PACEXT.o   \
   ${OUT}/RECOP.o    ${OUT}/RURPK.o    ${OUT}/SFRGCD.o   ${OUT}/SFQCMPK.o \
@@ -15862,6 +15863,31 @@ LAYER19=\
 /* layer 19 */
 /* EXPRSOL SFRTCAT */
 
+"GPAFF" [color="#FF4488",href="bookvol10.4.pdf#nameddest=GPAFF"]
+"GPAFF" -> "INTDIVP"
+"GPAFF" -> "DTP"
+/*"GPAFF" -> {"PRSPCAT"; "SETCATD"; "LOCPOWC"; "PLACESC"; "DIVCAT"}*/
+/*"GPAFF" -> {"INFCLCT"; "DSTRCAT"; "BLMETCT"; "PACFFC"; "PACPERC"}*/
+/*"GPAFF" -> {"PFORP"; "PLPKCRV"; "INTFRSP"; "PRJALGPK"; "PARAMP"; "LPARSPT"}*/
+/*"GPAFF" -> {"UTSZ"; "FIELD"; "EUCDOM"; "PID"; "GCDDOM"; "INTDOM"}*/
+/*"GPAFF" -> {"COMRING"; "RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"}*/
+/*"GPAFF" -> {"ABELSG"; "SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"}*/
+/*"GPAFF" -> {"LMODULE"; "BMODULE"; "RMODULE"; "ALGEBRA"; "MODULE"}*/
+/*"GPAFF" -> {"ENTIRER"; "UFD"; "DIVRING"; "POLYCAT"; "PDRING"; "FAMR"}*/
+/*"GPAFF" -> {"AMR"; "CHARZ"; "CHARNZ"; "FRETRCT"; "RETRACT"; "EVALAB"}*/
+/*"GPAFF" -> {"IEVALAB"; "FLINEXP"; "LINEXP"; "ORDSET"; "KONVERT"; "PATMAB"}*/
+/*"GPAFF" -> {"PFECAT"; "DIRPCAT"; "IXAGG"; "HOAGG"; "AGG"; "TYPE"}*/
+/*"GPAFF" -> {"ELTAGG"; "ELTAB"; "DIFEXT"; "DIFRING"; "FINITE"; "ORDRING"}*/
+/*"GPAFF" -> {"OAGROUP"; "OCAMON"; "OAMON"; "OASGP"; "OAMONS"; "VSPACE"}*/
+/*"GPAFF" -> {"UPSCAT"; "PSCAT"; "FAMONC"; "RCAGG"; "BOOLEAN"; "INT"}*/
+/*"GPAFF" -> {"LIST"; "ILIST"; "INS"; "OINTDOM"; "CFCAT"; "REAL"; "STEP"}*/
+/*"GPAFF" -> {"LSAGG"; "STAGG"; "URAGG"; "LNAGG"; "CLAGG"; "FLAGG"; "ELAGG"}*/
+/*"GPAFF" -> {"OM"; "NNI"; "LSAGG-"; "STAGG-"; "ORDFIN"; "LOGIC"; "ELAGG-"}*/
+/*"GPAFF" -> {"FLAGG-"; "URAGG-"; "LNAGG-"; "RCAGG-"; "IXAGG-"; "CLAGG-"}*/
+/*"GPAFF" -> {"HOAGG-"; "ORDSET-"; "AGG-"; "ELTAGG-"; "SETCAT-"; "BASTYPE-"}*/
+/*"GPAFF" -> {"PI"; "FFIELDC"; "FPC"; "MONOID-"; "ABELMON-"; "SGROUP-"}*/
+/*"GPAFF" -> {"ABELSG-"; "SINT"; "OUTFORM"}*/
+
 "IRURPK" [color="#FF4488",href="bookvol10.4.pdf#nameddest=IRURPK"]
 /*"IRURPK" -> {"EUCDOM"; "PID"; "GCDDOM"; "INTDOM"; "COMRING"; "RING"}*/
 /*"IRURPK" -> {"RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"; "SETCAT"}*/
@@ -17121,7 +17147,7 @@ ${MID}/AFALGGRO.nrlib/code.o: ${MID}/AFALGGRO.spad
 	    echo -e ")lib ${AFALGGRODEPS} \n )co AFALGGRO.spad" \
               | ${INTERPSYS} ; \
            else \
-	    echo -e ")lib ${AFALGGRODEPS} \n )co AFALGRES.spad" \
+	    echo -e ")lib ${AFALGGRODEPS} \n )co AFALGGRO.spad" \
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
@@ -17137,7 +17163,7 @@ ${MID}/PRJALGPK.nrlib/code.o: ${MID}/PRJALGPK.spad
 	    echo -e ")lib ${PRJALGPKDEPS} \n )co PRJALGPK.spad" \
               | ${INTERPSYS} ; \
            else \
-	    echo -e ")lib ${PRJALGPKDEPS} \n )co AFALGRES.spad" \
+	    echo -e ")lib ${PRJALGPKDEPS} \n )co PRJALGPK.spad" \
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
@@ -17152,7 +17178,7 @@ ${MID}/LPARSPT.nrlib/code.o: ${MID}/LPARSPT.spad
 	    echo -e ")lib ${LPARSPTDEPS} \n )co LPARSPT.spad" \
               | ${INTERPSYS} ; \
            else \
-	    echo -e ")lib ${LPARSPTDEPS} \n )co AFALGRES.spad" \
+	    echo -e ")lib ${LPARSPTDEPS} \n )co LPARSPT.spad" \
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
@@ -17167,7 +17193,7 @@ ${MID}/PARAMP.nrlib/code.o: ${MID}/PARAMP.spad
 	    echo -e ")lib ${PARAMPDEPS} \n )co PARAMP.spad" \
               | ${INTERPSYS} ; \
            else \
-	    echo -e ")lib ${PARAMPDEPS} \n )co AFALGRES.spad" \
+	    echo -e ")lib ${PARAMPDEPS} \n )co PARAMP.spad" \
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
@@ -17183,7 +17209,7 @@ ${MID}/DTP.nrlib/code.o: ${MID}/DTP.spad
 	    echo -e ")lib ${DTPDEPS} \n )co DTP.spad" \
               | ${INTERPSYS} ; \
            else \
-	    echo -e ")lib ${DTPDEPS} \n )co AFALGRES.spad" \
+	    echo -e ")lib ${DTPDEPS} \n )co DTP.spad" \
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
@@ -17199,7 +17225,7 @@ ${MID}/INTFRSP.nrlib/code.o: ${MID}/INTFRSP.spad
 	    echo -e ")lib ${INTFRSPDEPS} \n )co INTFRSP.spad" \
               | ${INTERPSYS} ; \
            else \
-	    echo -e ")lib ${INTFRSPDEPS} \n )co AFALGRES.spad" \
+	    echo -e ")lib ${INTFRSPDEPS} \n )co INTFRSP.spad" \
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
@@ -17215,7 +17241,24 @@ ${MID}/INTDIVP.nrlib/code.o: ${MID}/INTDIVP.spad
 	    echo -e ")lib ${INTDIVPDEPS} \n )co INTDIVP.spad" \
               | ${INTERPSYS} ; \
            else \
-	    echo -e ")lib ${INTDIVPDEPS} \n )co AFALGRES.spad" \
+	    echo -e ")lib ${INTDIVPDEPS} \n )co INTDIVP.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+@
+<<newcode>>=
+
+GPAFFDEPS = PRSPCAT SETCATD LOCPOWC PLACESC DIVCAT INFCLCT DSTRCAT BLMETCT \
+            INTDIVP PACFFC PACPERC PFORP PLPKCRV DTP INTFRSP PRJALGPK \
+            PARAMP LPARSPT UTSZ
+
+${MID}/GPAFF.nrlib/code.o: ${MID}/GPAFF.spad
+	@echo P3 making ${MID}/GPAFF.nrlib/code.o from ${MID}/GPAFF.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${GPAFFDEPS} \n )co GPAFF.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${GPAFFDEPS} \n )co GPAFF.spad" \
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
@@ -17981,6 +18024,7 @@ SPADHELP=\
  ${HELP}/Fraction.help \
  ${HELP}/FullPartialFractionExpansion.help \
  ${HELP}/GeneralDistributedMultivariatePolynomial.help \
+ ${HELP}/GeneralPackageForAlgebraicFunctionField.help \
  ${HELP}/GeneralSparseTable.help \
  ${HELP}/GroebnerFactorizationPackage.help \
  ${HELP}/GroebnerPackage.help \
@@ -18191,6 +18235,7 @@ REGRESS= \
  Fraction.regress \
  FullPartialFractionExpansion.regress \
  GeneralDistributedMultivariatePolynomial.regress \
+ GeneralPackageForAlgebraicFunctionField.regress \
  GeneralSparseTable.regress \
  GroebnerFactorizationPackage.regress \
  GroebnerPackage.regress \
@@ -18996,6 +19041,20 @@ ${HELP}/GeneralDistributedMultivariatePolynomial.help: \
             >${INPUT}/GeneralDistributedMultivariatePolynomial.input
 	@echo "GeneralDistributedMultivariatePolynomial (GDMP)" >>${HELPFILE}
 
+${HELP}/GeneralPackageForAlgebraicFunctionField.help: \
+            ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7355 create GeneralPackageForAlgebraicFunctionField.help \
+            from ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"GeneralPackageForAlgebraicFunctionField.help" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+            >${HELP}/GeneralPackageForAlgebraicFunctionField.help
+	@cp ${HELP}/GeneralPackageForAlgebraicFunctionField.help \
+             ${HELP}/GPAFF.help
+	@${TANGLE} -R"GeneralPackageForAlgebraicFunctionField.input" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+            >${INPUT}/GeneralPackageForAlgebraicFunctionField.input
+	@echo "GeneralPackageForAlgebraicFunctionField (GPAFF)" >>${HELPFILE}
+
 ${HELP}/GeneralSparseTable.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7360 create GeneralSparseTable.help from \
             ${BOOKS}/bookvol10.3.pamphlet
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 7afd192..7db29e0 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2795,5 +2795,7 @@ books/bookvol10.4 add DesingTreePackage, ParametrizationPackage<br/>
 books/bookvol10.4 add InterpolateFormsPackage<br/>
 <a href="patches/20100524.01.tpd.patch">20100524.01.tpd.patch</a>
 books/bookvol10.4 add IntersectionDivisorPackage<br/>
+<a href="patches/20100524.02.tpd.patch">20100524.02.tpd.patch</a>
+books/bookvol10.4 add GeneralPackageForAlgebraicFunctionField<br/>
  </body>
 </html>
