diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 4ebd8b4..4d10c5c 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -35084,7 +35084,7 @@ GeneralizedMultivariateFactorize(OV,E,S,R,P) : C == T
 --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 Issue )edit bookvol10.4.pamphlet to see algebra source code for GPAFF 
 --R
 --R------------------------------- Operations --------------------------------
 --R adjunctionDivisor : () -> DIVISOR     desingTree : () -> List DesTree
@@ -121962,6 +121962,868 @@ OutputPackage: with
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Chapter P}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package PAFF PackageForAlgebraicFunctionField}
+<<PackageForAlgebraicFunctionField.input>>=
+)set break resume
+)sys rm -f PackageForAlgebraicFunctionField.output
+)spool PackageForAlgebraicFunctionField.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show PackageForAlgebraicFunctionField
+--R PackageForAlgebraicFunctionField(K: Field,symb: List Symbol,BLMET: BlowUpMethodCategory)  is a package constructor
+--R Abbreviation for PackageForAlgebraicFunctionField is PAFF 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for PAFF 
+--R
+--R------------------------------- Operations --------------------------------
+--R fullDesTree : () -> Void              fullInfClsPt : () -> Void
+--R genus : () -> NonNegativeInteger      genusNeg : () -> Integer
+--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 adjunctionDivisor : () -> Divisor Places K
+--R classNumber : () -> Integer if K has FINITE
+--R desingTree : () -> List DesingTree InfClsPt(K,symb,BLMET)
+--R desingTreeWoFullParam : () -> List DesingTree InfClsPt(K,symb,BLMET)
+--R eval : (DistributedMultivariatePolynomial(symb,K),Places K) -> K
+--R eval : (DistributedMultivariatePolynomial(symb,K),DistributedMultivariatePolynomial(symb,K),Places K) -> K
+--R eval : (Fraction DistributedMultivariatePolynomial(symb,K),Places K) -> K
+--R evalIfCan : (DistributedMultivariatePolynomial(symb,K),Places K) -> Union(K,"failed")
+--R evalIfCan : (DistributedMultivariatePolynomial(symb,K),DistributedMultivariatePolynomial(symb,K),Places K) -> Union(K,"failed")
+--R evalIfCan : (Fraction DistributedMultivariatePolynomial(symb,K),Places K) -> Union(K,"failed")
+--R findOrderOfDivisor : (Divisor Places K,Integer,Integer) -> Record(ord: Integer,num: DistributedMultivariatePolynomial(symb,K),den: DistributedMultivariatePolynomial(symb,K),upTo: Integer)
+--R goppaCode : (Divisor Places K,Divisor Places K) -> Matrix K
+--R goppaCode : (Divisor Places K,List Places K) -> Matrix K
+--R homogenize : (DistributedMultivariatePolynomial(symb,K),Integer) -> DistributedMultivariatePolynomial(symb,K)
+--R interpolateForms : (Divisor Places K,NonNegativeInteger) -> List DistributedMultivariatePolynomial(symb,K)
+--R interpolateFormsForFact : (Divisor Places K,List DistributedMultivariatePolynomial(symb,K)) -> List DistributedMultivariatePolynomial(symb,K)
+--R intersectionDivisor : DistributedMultivariatePolynomial(symb,K) -> Divisor Places K
+--R lBasis : (Divisor Places K,NonNegativeInteger) -> List Fraction DistributedMultivariatePolynomial(symb,K)
+--R lBasis : Divisor Places K -> Record(num: List DistributedMultivariatePolynomial(symb,K),den: DistributedMultivariatePolynomial(symb,K))
+--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 : (DistributedMultivariatePolynomial(symb,K),Places K) -> NeitherSparseOrDensePowerSeries K
+--R placesAbove : ProjectivePlane K -> List Places K
+--R placesOfDegree : PositiveInteger -> List Places K if K has FINITE
+--R pointDominateBy : Places K -> ProjectivePlane K
+--R projectivePoint : List K -> ProjectivePlane K
+--R rationalPlaces : () -> List Places K
+--R rationalPoints : () -> List ProjectivePlane K
+--R setCurve : DistributedMultivariatePolynomial(symb,K) -> DistributedMultivariatePolynomial(symb,K)
+--R setSingularPoints : List ProjectivePlane K -> List ProjectivePlane K
+--R singularPoints : () -> List ProjectivePlane K
+--R theCurve : () -> DistributedMultivariatePolynomial(symb,K)
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<PackageForAlgebraicFunctionField.help>>=
+====================================================================
+PackageForAlgebraicFunctionField examples
+====================================================================
+
+See Also:
+o )show PackageForAlgebraicFunctionField
+
+@
+\pagehead{PackageForAlgebraicFunctionField}{PAFF}
+\pagepic{ps/v104packageforalgebraicfunctionfield.eps}{PAFF}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{PAFF}{adjunctionDivisor} &
+\cross{PAFF}{classNumber} &
+\cross{PAFF}{desingTree} \\
+\cross{PAFF}{desingTreeWoFullParam} &
+\cross{PAFF}{eval} &
+\cross{PAFF}{evalIfCan} \\
+\cross{PAFF}{findOrderOfDivisor} &
+\cross{PAFF}{fullDesTree} &
+\cross{PAFF}{fullInfClsPt} \\
+\cross{PAFF}{genus} &
+\cross{PAFF}{genusNeg} &
+\cross{PAFF}{goppaCode} \\
+\cross{PAFF}{homogenize} &
+\cross{PAFF}{interpolateForms} &
+\cross{PAFF}{interpolateFormsForFact} \\
+\cross{PAFF}{intersectionDivisor} &
+\cross{PAFF}{lBasis} &
+\cross{PAFF}{LPolynomial} \\
+\cross{PAFF}{numberOfPlacesOfDegree} &
+\cross{PAFF}{numberPlacesDegExtDeg} &
+\cross{PAFF}{numberRatPlacesExtDeg} \\
+\cross{PAFF}{parametrize} &
+\cross{PAFF}{placesAbove} &
+\cross{PAFF}{placesOfDegree} \\
+\cross{PAFF}{pointDominateBy} &
+\cross{PAFF}{projectivePoint} &
+\cross{PAFF}{rationalPlaces} \\
+\cross{PAFF}{rationalPoints} &
+\cross{PAFF}{setCurve} &
+\cross{PAFF}{setSingularPoints} \\
+\cross{PAFF}{singularPoints} &
+\cross{PAFF}{theCurve} &
+\cross{PAFF}{ZetaFunction} 
+
+\end{tabular}
+
+<<package PAFF PackageForAlgebraicFunctionField>>=
+)abbrev package PAFF PackageForAlgebraicFunctionField
+++ 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
+PackageForAlgebraicFunctionField(K,symb,BLMET):Exports == Implementation where
+  K:Field 
+  symb :  List(Symbol)
+  PolyRing ==> DistributedMultivariatePolynomial(symb,K) 
+  E  ==>  DirectProduct(#symb,NonNegativeInteger)
+  BLMET : BlowUpMethodCategory
+  
+  AFP         ==> AffinePlane(K)
+  ProjPt      ==> ProjectivePlane(K)
+  PCS         ==> NeitherSparseOrDensePowerSeries(K)
+  Plc         ==> Places(K)
+  DIVISOR     ==> Divisor(Plc)
+  InfClsPoint ==> InfClsPt(K,symb,BLMET) 
+  DesTree     ==> DesingTree(InfClsPoint)
+  FRACPOLY    ==> Fraction PolyRing
+  NNI         ==> NonNegativeInteger
+  PI          ==> PositiveInteger
+  UTSZ        ==> UnivariateTaylorSeriesCZero(Integer,t)
+  PAFFPC      ==> GeneralPackageForAlgebraicFunctionField
+  PACKPOLY    ==> PackageForPoly(K,PolyRing,E,#symb)
+  BP ==> PAFFPC(K,symb,PolyRing,E,ProjPt,PCS,Plc,DIVISOR,InfClsPoint,DesTree,BLMET)
+  
+  Exports ==>  with
+    homogenize: (PolyRing,Integer) -> PolyRing
+
+    interpolateFormsForFact: (DIVISOR,List PolyRing) -> List(PolyRing)
+  
+    fullDesTree: () -> Void
+
+    fullInfClsPt: () -> Void
+
+    setCurve: PolyRing -> PolyRing
+
+    projectivePoint: List K -> ProjPt
+
+    pointDominateBy : Plc -> ProjPt
+      ++ pointDominateBy(pl) returns the projective point dominated 
+      ++ by the place pl.
+
+    placesAbove: ProjPt -> List Plc
+
+    setSingularPoints: List ProjPt -> List ProjPt
+    
+    goppaCode: (DIVISOR,DIVISOR) -> Matrix K
+
+    goppaCode: (DIVISOR,List(Plc)) -> Matrix K
+
+    rationalPlaces: () -> List Plc
+      ++ rationalPlaces returns all the rational places of  the
+      ++ curve defined by the polynomial given to the 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: () -> Integer
+
+    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.
+
+    desingTree: () -> List DesTree
+      ++ desingTree returns the desingularisation trees at all singular 
+      ++ points of the curve defined by the polynomial given to the package.
+
+    rationalPoints: () -> List(ProjPt)
+
+    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,NNI) -> List FRACPOLY
+
+    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.
+
+    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 set with the function setCurve.
+
+    if K has Finite then --should we say LocallyAlgebraicallyClosedField??
+
+      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 BP
+
+    homogenize(pol,n) == homogenize(pol,n)$PACKPOLY
+
+    pointDominateBy(pl)== pointDominateBy(pl)$BP
+
+    placesAbove(pt)== placesAbove(pt)$BP
+
+    setSingularPoints(lspt)==    setSingularPoints(lspt)$BP
+
+    projectivePoint(lpt)==projectivePoint(lpt)$ProjPt   
+
+    interpolateFormsForFact(d,lm)==
+      interpolateFormsForFact(d,lm)$BP
+
+    if K has Finite then 
+      
+      goppaCode(d:DIVISOR,lp:List(Plc))==
+        lb:=lBasis(d)
+        dd:=lb.den
+        ll:=[[eval(f,dd,pl) for pl in lp] for f in lb.num]
+        matrix ll
+      
+      goppaCode(d:DIVISOR,p:DIVISOR)==
+        lp:=supp p
+        goppaCode(d,lp)
+    
+      ZetaFunction == ZetaFunction()$BP
+
+      ZetaFunction(d) == ZetaFunction(d)$BP
+
+      numberOfPlacesOfDegree(i)==numberOfPlacesOfDegree(i)$BP
+
+      placesOfDegree(i) ==placesOfDegree(i)$BP
+
+      numberRatPlacesExtDeg(extDegree)==numberRatPlacesExtDeg(extDegree)$BP
+
+      numberPlacesDegExtDeg(degree,extDegree)==
+        numberPlacesDegExtDeg(degree,extDegree)$BP
+
+      LPolynomial == LPolynomial()$BP
+
+      LPolynomial(extDeg)==LPolynomial(extDeg)$BP
+
+      classNumber== classNumber()$BP
+
+      rationalPlaces == rationalPlaces()$BP 
+
+      rationalPoints==rationalPoints()$BP
+      
+    crvLocal:PolyRing
+
+    eval(f:PolyRing,pl:Plc)==
+      dd:= degree pl
+      ^one?(dd) => error " cannot evaluate at place of degree greater than one"
+      eval(f,pl)$BP
+
+    evalIfCan(f:PolyRing,pl:Plc)==
+      dd:= degree pl
+      ^one?(dd) => error " cannot evaluate at place of degree greater than one"
+      evalIfCan(f,pl)$BP
+    
+    setCurve(pol)==setCurve(pol)$BP
+
+    lBasis(divis)==lBasis(divis)$BP
+
+    genus==genus()$BP
+
+    genusNeg==genusNeg()$BP
+
+    theCurve==theCurve()$BP
+
+    desingTree==desingTree()$BP
+
+    desingTreeWoFullParam== desingTreeWoFullParam()$BP
+
+    -- compute the adjunction divisor of the curve using 
+    -- adjunctionDivisor from DesingTreePackage
+    adjunctionDivisor == adjunctionDivisor()$BP
+    
+    singularPoints==singularPoints()$BP
+
+    parametrize(f,pl)==parametrize(f,pl)$BP
+
+    -- compute the interpolating forms (see package InterpolateFormsPackage)
+    interpolateForms(d,n)==interpolateForms(d,n)$BP
+
+    eval(f:PolyRing,g:PolyRing,pl:Plc)==eval(f,g,pl)$BP
+    
+    eval(u:FRACPOLY,pl:Plc)==
+      ff:=numer u
+      gg:=denom u
+      eval(ff,gg,pl)
+
+    evalIfCan(f:PolyRing,g:PolyRing,pl:Plc)==evalIfCan(f,g,pl)$BP
+    
+    evalIfCan(u:FRACPOLY,pl:Plc)==
+      ff:=numer u
+      gg:=denom u
+      evalIfCan(ff,gg,pl)
+    
+    intersectionDivisor(pol)==intersectionDivisor(pol)$BP
+
+    fullDesTree==
+      fullOutput()$DesTree => fullOutput(false())$DesTree
+      fullOutput(true())$DesTree
+
+    fullInfClsPt==
+      fullOutput()$InfClsPoint => fullOutput(false())$InfClsPoint
+      fullOutput(true())$InfClsPoint
+
+@
+<<PAFF.dotabb>>=
+"PAFF" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PAFF"]
+"PAFFFF" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PAFFFF"]
+"INFCLSPS" [color="#88FF44",href="bookvol10.3.pdf#nameddest=INFCLSPS"]
+"PAFF" -> "PAFFFF"
+"PAFF" -> "INFCLSPS"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package PAFFFF PackageForAlgebraicFunctionFieldOverFiniteField}
+<<PackageForAlgebraicFunctionFieldOverFiniteField.input>>=
+)set break resume
+)sys rm -f PackageForAlgebraicFunctionFieldOverFiniteField.output
+)spool PackageForAlgebraicFunctionFieldOverFiniteField.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show PackageForAlgebraicFunctionFieldOverFiniteField
+--R PackageForAlgebraicFunctionFieldOverFiniteField(K: FiniteFieldCategory,symb: List Symbol,BLMET: BlowUpMethodCategory)  is a package constructor
+--R Abbreviation for PackageForAlgebraicFunctionFieldOverFiniteField is PAFFFF 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for PAFFFF 
+--R
+--R------------------------------- Operations --------------------------------
+--R fullDesTree : () -> Void              fullInfClsPt : () -> Void
+--R genus : () -> NonNegativeInteger      genusNeg : () -> Integer
+--R LPolynomial : () -> SparseUnivariatePolynomial Integer if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R LPolynomial : PositiveInteger -> SparseUnivariatePolynomial Integer if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R ZetaFunction : () -> UnivariateTaylorSeriesCZero(Integer,t) if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R ZetaFunction : PositiveInteger -> UnivariateTaylorSeriesCZero(Integer,t) if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R adjunctionDivisor : () -> Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K
+--R classNumber : () -> Integer if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R desingTree : () -> List DesingTree InfinitlyClosePointOverPseudoAlgebraicClosureOfFiniteField(K,symb,BLMET)
+--R desingTreeWoFullParam : () -> List DesingTree InfinitlyClosePointOverPseudoAlgebraicClosureOfFiniteField(K,symb,BLMET)
+--R eval : (DistributedMultivariatePolynomial(symb,K),PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> K
+--R eval : (DistributedMultivariatePolynomial(symb,K),DistributedMultivariatePolynomial(symb,K),PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> K
+--R eval : (Fraction DistributedMultivariatePolynomial(symb,K),PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> K
+--R evalIfCan : (DistributedMultivariatePolynomial(symb,K),PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> Union(K,"failed")
+--R evalIfCan : (DistributedMultivariatePolynomial(symb,K),DistributedMultivariatePolynomial(symb,K),PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> Union(K,"failed")
+--R evalIfCan : (Fraction DistributedMultivariatePolynomial(symb,K),PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> Union(K,"failed")
+--R findOrderOfDivisor : (Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K,Integer,Integer) -> Record(ord: Integer,num: DistributedMultivariatePolynomial(symb,K),den: DistributedMultivariatePolynomial(symb,K),upTo: Integer)
+--R goppaCode : (Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K,Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> Matrix K
+--R goppaCode : (Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K,List PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> Matrix K
+--R homogenize : (DistributedMultivariatePolynomial(symb,K),Integer) -> DistributedMultivariatePolynomial(symb,K)
+--R interpolateForms : (Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K,NonNegativeInteger) -> List DistributedMultivariatePolynomial(symb,K)
+--R interpolateFormsForFact : (Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K,List DistributedMultivariatePolynomial(symb,K)) -> List DistributedMultivariatePolynomial(symb,PseudoAlgebraicClosureOfFiniteField K)
+--R intersectionDivisor : DistributedMultivariatePolynomial(symb,K) -> Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K
+--R lBasis : (Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K,NonNegativeInteger) -> List Fraction DistributedMultivariatePolynomial(symb,K)
+--R lBasis : Divisor PlacesOverPseudoAlgebraicClosureOfFiniteField K -> Record(num: List DistributedMultivariatePolynomial(symb,K),den: DistributedMultivariatePolynomial(symb,K))
+--R numberOfPlacesOfDegree : PositiveInteger -> Integer if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R numberPlacesDegExtDeg : (PositiveInteger,PositiveInteger) -> Integer if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R numberRatPlacesExtDeg : PositiveInteger -> Integer if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R parametrize : (DistributedMultivariatePolynomial(symb,K),PlacesOverPseudoAlgebraicClosureOfFiniteField K) -> NeitherSparseOrDensePowerSeries PseudoAlgebraicClosureOfFiniteField K
+--R placesAbove : ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField K -> List PlacesOverPseudoAlgebraicClosureOfFiniteField K
+--R placesOfDegree : PositiveInteger -> List PlacesOverPseudoAlgebraicClosureOfFiniteField K if PseudoAlgebraicClosureOfFiniteField K has FINITE
+--R pointDominateBy : PlacesOverPseudoAlgebraicClosureOfFiniteField K -> ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField K
+--R projectivePoint : List PseudoAlgebraicClosureOfFiniteField K -> ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField K
+--R rationalPlaces : () -> List PlacesOverPseudoAlgebraicClosureOfFiniteField K
+--R rationalPoints : () -> List ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField K
+--R setCurve : DistributedMultivariatePolynomial(symb,K) -> DistributedMultivariatePolynomial(symb,K)
+--R setSingularPoints : List ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField K -> List ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField K
+--R singularPoints : () -> List ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField K
+--R theCurve : () -> DistributedMultivariatePolynomial(symb,K)
+--R translateToOrigin : (DistributedMultivariatePolynomial(symb,K),ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField K) -> DistributedMultivariatePolynomial(symb,PseudoAlgebraicClosureOfFiniteField K)
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<PackageForAlgebraicFunctionFieldOverFiniteField.help>>=
+====================================================================
+PackageForAlgebraicFunctionFieldOverFiniteField examples
+====================================================================
+
+See Also:
+o )show PackageForAlgebraicFunctionFieldOverFiniteField
+
+@
+\pagehead{PackageForAlgebraicFunctionFieldOverFiniteField}{PAFFFF}
+\pagepic{ps/v104packageforalgebraicfunctionfieldoverfinitefield.eps}{PAFFFF}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{PAFFFF}{adjunctionDivisor} &
+\cross{PAFFFF}{classNumber} &
+\cross{PAFFFF}{desingTree} \\
+\cross{PAFFFF}{desingTreeWoFullParam} &
+\cross{PAFFFF}{eval} &
+\cross{PAFFFF}{evalIfCan} \\
+\cross{PAFFFF}{findOrderOfDivisor} &
+\cross{PAFFFF}{fullDesTree} &
+\cross{PAFFFF}{fullInfClsPt} \\
+\cross{PAFFFF}{genus} &
+\cross{PAFFFF}{genusNeg} &
+\cross{PAFFFF}{goppaCode} \\
+\cross{PAFFFF}{homogenize} &
+\cross{PAFFFF}{interpolateForms} &
+\cross{PAFFFF}{interpolateFormsForFact} \\
+\cross{PAFFFF}{intersectionDivisor} &
+\cross{PAFFFF}{lBasis} &
+\cross{PAFFFF}{LPolynomial} \\
+\cross{PAFFFF}{numberOfPlacesOfDegree} &
+\cross{PAFFFF}{numberPlacesDegExtDeg} &
+\cross{PAFFFF}{numberRatPlacesExtDeg} \\
+\cross{PAFFFF}{parametrize} &
+\cross{PAFFFF}{placesAbove} &
+\cross{PAFFFF}{placesOfDegree} \\
+\cross{PAFFFF}{pointDominateBy} &
+\cross{PAFFFF}{projectivePoint} &
+\cross{PAFFFF}{rationalPlaces} \\
+\cross{PAFFFF}{rationalPoints} &
+\cross{PAFFFF}{setCurve} &
+\cross{PAFFFF}{setSingularPoints} \\
+\cross{PAFFFF}{singularPoints} &
+\cross{PAFFFF}{theCurve} &
+\cross{PAFFFF}{translateToOrigin} \\
+\cross{PAFFFF}{ZetaFunction} &&
+\end{tabular}
+
+<<package PAFFFF PackageForAlgebraicFunctionFieldOverFiniteField>>=
+)abbrev package PAFFFF PackageForAlgebraicFunctionFieldOverFiniteField
+++ 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
+PackageForAlgebraicFunctionFieldOverFiniteField(K,symb,BLMET):Exp == Impl where
+
+  K:FiniteFieldCategory -- Field 
+  symb :  List(Symbol)
+  BLMET : BlowUpMethodCategory
+    
+  DK          ==> PseudoAlgebraicClosureOfFiniteField(K)
+  PolyRing    ==> DistributedMultivariatePolynomial(symb,K) 
+  PolyRing2   ==> DistributedMultivariatePolynomial(symb,DK)
+  ProjPt      ==> ProjectivePlaneOverPseudoAlgebraicClosureOfFiniteField(K) 
+  NNI         ==> NonNegativeInteger
+  PI          ==> PositiveInteger
+  UTSZ        ==> UnivariateTaylorSeriesCZero(Integer,t)
+  PAFFPC      ==> GeneralPackageForAlgebraicFunctionField
+  PCS         ==> NeitherSparseOrDensePowerSeries(DK)
+  Plc         ==> PlacesOverPseudoAlgebraicClosureOfFiniteField(K) 
+  DIVISOR     ==> Divisor(Plc)
+  InfClsPoint ==> InfinitlyClosePointOverPseudoAlgebraicClosureOfFiniteField(K,symb,BLMET)
+  DesTree     ==> DesingTree(InfClsPoint)
+  FracPoly    ==> Fraction PolyRing
+  PackPoly    ==> PackageForPoly(DK,PolyRing2,E,#symb)
+  E           ==> DirectProduct(#symb,NNI)
+  BP ==> PAFFPC(DK,symb,PolyRing2,E,ProjPt,PCS,Plc,DIVISOR,InfClsPoint,DesTree,BLMET)
+  
+  Exp ==>  with
+    homogenize: (PolyRing,Integer) -> PolyRing
+  
+    fullDesTree: () -> Void
+
+    fullInfClsPt: () -> Void
+
+    setCurve: PolyRing -> PolyRing
+
+    translateToOrigin: (PolyRing, ProjPt) -> PolyRing2
+    
+    goppaCode: (DIVISOR,DIVISOR) -> Matrix K
+
+    goppaCode: (DIVISOR,List(Plc)) -> Matrix K
+
+    pointDominateBy : Plc -> ProjPt
+      ++ pointDominateBy(pl) returns the projective point dominated 
+      ++ by the place pl.
+
+    placesAbove: ProjPt -> List Plc
+
+    projectivePoint: List DK -> ProjPt
+
+    setSingularPoints: List ProjPt -> List ProjPt
+
+    rationalPlaces: () -> List Plc
+      ++ rationalPlaces returns all the rational places of  the
+      ++ curve defined by the polynomial given to the 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: () -> Integer
+
+    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.
+
+    desingTree: () -> List DesTree
+      ++ desingTree returns the desingularisation trees at all singular points
+      ++ of the curve defined by the polynomial given to the package.
+
+    rationalPoints: () -> List(ProjPt)
+
+    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,NNI) -> List FracPoly
+
+    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)
+
+    interpolateFormsForFact: (DIVISOR,List PolyRing) -> List(PolyRing2)
+
+    interpolateForms: (DIVISOR,NNI) -> List(PolyRing)
+      ++ interpolateForms(d,n) returns a basis of the interpolate forms of 
+      ++ degree n of the divisor d.
+
+    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  of the
+      ++ form pol with the curve. 
+      ++ (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 defined by setCurve.
+
+    if DK has Finite then --should we say LocallyAlgebraicallyClosedField??
+
+      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
+	
+  Impl ==>  add
+    import BP
+
+    homogenize(pol,n) == homogenize(pol,n)$PackageForPoly(K,PolyRing,E,#symb)
+    
+    toPolyRing2: PolyRing -> PolyRing2
+
+    toPolyRing: PolyRing2 -> PolyRing
+
+    projectivePoint(lpt)==projectivePoint(lpt)$ProjPt
+
+    pointDominateBy(pl)== pointDominateBy(pl)$BP
+
+    placesAbove(pt)== placesAbove(pt)$BP
+
+    setSingularPoints(lspt)==    setSingularPoints(lspt)$BP
+    
+    findOrderOfDivisor(divis,lb,hb) ==
+      ens:=findOrderOfDivisor(divis,lb,hb)$BP
+      [ens.ord, toPolyRing ens.num, toPolyRing ens.den, ens.upTo]      
+    
+    setCurve(pol)==
+      ooo:=setCurve(toPolyRing2 pol)$BP
+      pol
+    
+    ZetaFunction == ZetaFunction()$BP
+
+    ZetaFunction(d) == ZetaFunction(d)$BP
+
+    numberOfPlacesOfDegree(i)==numberOfPlacesOfDegree(i)$BP
+
+    placesOfDegree(i) ==placesOfDegree(i)$BP
+
+    numberRatPlacesExtDeg(extDegree)==numberRatPlacesExtDeg(extDegree)$BP
+
+    numberPlacesDegExtDeg(degree,extDegree)==
+      numberPlacesDegExtDeg(degree,extDegree)$BP
+
+    LPolynomial == LPolynomial()$BP
+
+    LPolynomial(extDeg)==LPolynomial(extDeg)$BP
+
+    classNumber== classNumber()$BP
+
+    rationalPlaces == rationalPlaces()$BP 
+
+    rationalPoints==rationalPoints()$BP
+      
+    goppaCode(d:DIVISOR,lp:List(Plc))==
+      lb:=lBasis(d)
+      dd:=lb.den
+      ll:=[[eval(f,dd,pl) for pl in lp] for f in lb.num]
+      matrix ll
+      
+    goppaCode(d:DIVISOR,p:DIVISOR)==
+      lp:=supp p
+      goppaCode(d,lp)
+
+    toPolyRing(pol)==
+      zero?(pol) => 0$PolyRing
+      lc:=leadingCoefficient pol
+      lce:K:= retract lc
+      lm:=leadingMonomial pol
+      lt:=degree lm
+      monomial(lce,lt)$PolyRing + toPolyRing( reductum pol )
+
+    toPolyRing2(pol)==
+      zero?(pol) => 0$PolyRing2
+      lc:=leadingCoefficient pol
+      lce:DK:= lc :: DK 
+      lm:=leadingMonomial pol
+      lt:=degree lm
+      monomial(lce,lt)$PolyRing2 + toPolyRing2( reductum pol )
+
+    evalIfCan(f:PolyRing,pl:Plc)==
+      dd:= degree pl
+      ^one?(dd) => error " cannot evaluate at place of degree greater than one"
+      ee:=evalIfCan(toPolyRing2 f,pl)$BP
+      ee case "failed" => "failed"
+      retract ee 
+      
+    eval(f:PolyRing,pl:Plc)==
+      dd:= degree pl
+      ^one?(dd) => error " cannot evaluate at place of degree greater than one"
+      ee:=eval(toPolyRing2 f,pl)$BP
+      retract ee 
+      
+    lBasis(divis)==
+      ans:=lBasis(divis)$BP
+      nn:=ans.num
+      dd:=ans.den
+      nnd:=[toPolyRing pol for pol in nn]
+      ddd:=toPolyRing dd
+      [nnd,ddd]
+
+    genus==genus()$BP
+
+    genusNeg==genusNeg()$BP
+
+    theCurve==
+      ccc:= theCurve()$BP
+      toPolyRing ccc
+
+    desingTree==desingTree()$BP
+
+    desingTreeWoFullParam== desingTreeWoFullParam()$BP
+
+    -- compute the adjunction divisor of the curve using 
+    -- adjunctionDivisor from DesingTreePackage
+    adjunctionDivisor == adjunctionDivisor()$BP
+    
+    singularPoints==singularPoints()$BP
+
+    parametrize(f,pl)==
+      ff:= toPolyRing2 f
+      parametrize(ff,pl)$BP
+
+    -- compute the interpolating forms (see package InterpolateFormsPackage)
+    interpolateForms(d,n)==
+      ans:=interpolateForms(d,n)$BP
+      [toPolyRing pol for pol in ans]
+
+    interpolateFormsForFact(d,lm)==
+      lm2:List PolyRing2 := [ toPolyRing2 p for p in lm]
+      interpolateFormsForFact(d,lm2)$BP
+
+    evalIfCan(ff:PolyRing,gg:PolyRing,pl:Plc)==
+      dd:= degree pl
+      ^one?(dd) => error " cannot evaluate at place of degree greater than one"
+      f:=toPolyRing2 ff
+      g:=toPolyRing2 gg
+      ee:=evalIfCan(f,g,pl)$BP
+      ee case "failed" => "failed"
+      retract ee 
+
+    eval(ff:PolyRing,gg:PolyRing,pl:Plc)==
+      dd:= degree pl
+      ^one?(dd) => error " cannot evaluate at place of degree greater than one"
+      f:=toPolyRing2 ff
+      g:=toPolyRing2 gg
+      ee:=eval(f,g,pl)$BP
+      retract ee 
+    
+    evalIfCan(u:FracPoly,pl:Plc)==
+      ff:=numer u
+      gg:=denom u
+      evalIfCan(ff,gg,pl)
+
+    eval(u:FracPoly,pl:Plc)==
+      ff:=numer u
+      gg:=denom u
+      eval(ff,gg,pl)
+    
+    intersectionDivisor(pol)==
+      polu:=toPolyRing2 pol
+      intersectionDivisor(polu)$BP
+
+    fullDesTree==
+      fullOutput()$DesTree => fullOutput(false())$DesTree
+      fullOutput(true())$DesTree
+
+    fullInfClsPt==
+      fullOutput()$InfClsPoint => fullOutput(false())$InfClsPoint
+      fullOutput(true())$InfClsPoint
+
+
+@
+<<PAFFFF.dotabb>>=
+"PAFFFF" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PAFFFF"]
+"PAFF" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PAFF"]
+"INFCLSPS" [color="#88FF44",href="bookvol10.3.pdf#nameddest=INFCLSPS"]
+"PAFFFF" -> "PAFF"
+"PAFFFF" -> "INFCLSPS"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package PFORP PackageForPoly}
 <<PackageForPoly.input>>=
 )set break resume
@@ -159381,6 +160243,8 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package ORTHPOL OrthogonalPolynomialFunctions>>
 <<package OUT OutputPackage>>
 
+<<package PAFF PackageForAlgebraicFunctionField>>
+<<package PAFFFF PackageForAlgebraicFunctionFieldOverFiniteField>>
 <<package PFORP PackageForPoly>>
 <<package PADEPAC PadeApproximantPackage>>
 <<package PADE PadeApproximants>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 5bfcd47..4e3ea32 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24081,6 +24081,8 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|OrdSetInts| . OSI)
    (|OrthogonalPolynomialFunctions| . ORTHPOL)
    (|OutputPackage| . OUT)
+   (|PackageForAlgebraicFunctionField| . PAFF)
+   (|PackageForAlgebraicFunctionFieldOverFiniteField| . PAFFFF)
    (|PackageForPoly| . PFORP)
    (|PadeApproximantPackage| . PADEPAC)
    (|Palette| . PALETTE)
diff --git a/books/ps/v104packageforalgebraicfunctionfield.eps b/books/ps/v104packageforalgebraicfunctionfield.eps
new file mode 100644
index 0000000..ca525df
--- /dev/null
+++ b/books/ps/v104packageforalgebraicfunctionfield.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 212 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 212 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 176 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% PAFF
+gsave
+[ /Rect [ 52 72 106 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=PAFF) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 106 108 moveto
+52 108 lineto
+52 72 lineto
+106 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 106 108 moveto
+52 108 lineto
+52 72 lineto
+106 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+61.5 85.9 moveto 35 (PAFF) alignedtext
+grestore
+% PAFFFF
+gsave
+[ /Rect [ 0 0 66 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=PAFFFF) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 66 36 moveto
+0 36 lineto
+0 0 lineto
+66 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 66 36 moveto
+0 36 lineto
+0 0 lineto
+66 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 13.9 moveto 51 (PAFFFF) alignedtext
+grestore
+% PAFF->PAFFFF
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 67 72 moveto
+62 64 55 54 49 44 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 52.27 42.62 moveto
+44 36 lineto
+46.33 46.34 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 52.27 42.62 moveto
+44 36 lineto
+46.33 46.34 lineto
+closepath stroke
+grestore
+% INFCLSPS
+gsave
+[ /Rect [ 84 0 168 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=INFCLSPS) >>
+  /Subtype /Link
+/ANN pdfmark
+0.273 0.733 1.000 nodecolor
+newpath 168 36 moveto
+84 36 lineto
+84 0 lineto
+168 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.273 0.733 1.000 nodecolor
+newpath 168 36 moveto
+84 36 lineto
+84 0 lineto
+168 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+92 13.9 moveto 68 (INFCLSPS) alignedtext
+grestore
+% PAFF->INFCLSPS
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 91 72 moveto
+96 64 103 54 109 44 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 111.67 46.34 moveto
+114 36 lineto
+105.73 42.62 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 111.67 46.34 moveto
+114 36 lineto
+105.73 42.62 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/books/ps/v104packageforalgebraicfunctionfieldoverfinitefield.eps b/books/ps/v104packageforalgebraicfunctionfieldoverfinitefield.eps
new file mode 100644
index 0000000..8a88f1f
--- /dev/null
+++ b/books/ps/v104packageforalgebraicfunctionfieldoverfinitefield.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 200 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 200 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 164 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% PAFFFF
+gsave
+[ /Rect [ 37 72 103 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=PAFFFF) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 103 108 moveto
+37 108 lineto
+37 72 lineto
+103 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 103 108 moveto
+37 108 lineto
+37 72 lineto
+103 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+44.5 85.9 moveto 51 (PAFFFF) alignedtext
+grestore
+% PAFF
+gsave
+[ /Rect [ 0 0 54 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=PAFF) >>
+  /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
+9.5 13.9 moveto 35 (PAFF) alignedtext
+grestore
+% PAFFFF->PAFF
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 59 72 moveto
+54 64 48 54 43 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 45.92 43.04 moveto
+38 36 lineto
+39.8 46.44 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 45.92 43.04 moveto
+38 36 lineto
+39.8 46.44 lineto
+closepath stroke
+grestore
+% INFCLSPS
+gsave
+[ /Rect [ 72 0 156 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=INFCLSPS) >>
+  /Subtype /Link
+/ANN pdfmark
+0.273 0.733 1.000 nodecolor
+newpath 156 36 moveto
+72 36 lineto
+72 0 lineto
+156 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.273 0.733 1.000 nodecolor
+newpath 156 36 moveto
+72 36 lineto
+72 0 lineto
+156 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+80 13.9 moveto 68 (INFCLSPS) alignedtext
+grestore
+% PAFFFF->INFCLSPS
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 81 72 moveto
+86 64 92 54 98 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 101.2 46.44 moveto
+103 36 lineto
+95.08 43.04 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 101.2 46.44 moveto
+103 36 lineto
+95.08 43.04 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index c31b5c5..9df4b30 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+20100525 tpd src/axiom-website/patches.html 20100525.01.tpd.patch
+20100525 tpd src/algebra/Makefile help and test for PAFF, PAFFFF
+20100525 tpd books/bookvol5 expose PAFF, PAFFFF
+20100525 tpd books/bookvol10.4 add PAFF, PAFFFF
+20100525 tpd books/ps/v104packageforalgebraicfunctionfieldoverfinitefield.eps
+20100525 tpd books/ps/v104packageforalgebraicfunctionfield.eps added
 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
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 74e60f9..25137cb 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -16326,6 +16326,61 @@ LAYER22=\
 /*"INFCLSPS" -> {"FLAGG-"; "LNAGG-"; "LSAGG-"; "STAGG-"; "ELAGG-"; "URAGG-"}*/
 
 @
+\subsection{Layer23}
+Depends on: INFCLSPS
+
+Note that PAFF and PAFFFF form clique2.spad. Each one depends on the other.
+<<layer23>>=
+
+LAYER23=\
+  ${MID}/clique2.spad \
+  layer23done
+
+@
+<<layerpic>>=
+/* layer 23 */
+
+"PAFF" -> "PAFFFF"
+"PAFF" -> "INFCLSPS"
+/*"PAFF" -> {"BLMETCT"; "GPAFF"; "PFORP"; "PACOFF"; "PROJPLPS"; "PLACESPS"}*/
+/*"PAFF" -> {"NSDPS"; "LOCPOWC"; "DIV"; "SETCATD"; "PLACESC"; "DIVCAT"}*/
+/*"PAFF" -> {"INFCLCT"; "DSTREE"; "DSTRCAT"; "PRSPCAT"; "UTSZ"; "PACFFC"}*/
+/*"PAFF" -> {"PACPERC"; "PROJPL"; "PLACES"; "INFCLSPT"; "PROJPL"; "ICP"}*/
+/*"PAFF" -> {"FIELD"; "EUCDOM"; "PID"; "GCDDOM"; "INTDOM"; "COMRING"}*/
+/*"PAFF" -> {"RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"}*/
+/*"PAFF" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"; "LMODULE"}*/
+/*"PAFF" -> {"BMODULE"; "RMODULE"; "ALGEBRA"; "MODULE"; "ENTIRER"; "UFD"}*/
+/*"PAFF" -> {"DIVRING"; "POLYCAT"; "PDRING"; "FAMR"; "AMR"; "CHARZ"}*/
+/*"PAFF" -> {"CHARNZ"; "FRETRCT"; "RETRACT"; "EVALAB"; "IEVALAB"}*/
+/*"PAFF" -> {"FLINEXP"; "LINEXP"; "ORDSET"; "KONVERT"; "PATMAB"; "PFECAT"}*/
+/*"PAFF" -> {"LSAGG"; "STAGG"; "URAGG"; "RCAGG"; "HOAGG"; "AGG"; "TYPE"}*/
+/*"PAFF" -> {"LNAGG"; "IXAGG"; "ELTAGG"; "ELTAB"; "CLAGG"; "FLAGG"}*/
+/*"PAFF" -> {"ELAGG"; "OM"; "INT"; "LIST"; "ILIST"; "DIRPCAT"; "DIFEXT"}*/
+/*"PAFF" -> {"DIFRING"; "FINITE"; "ORDRING"; "OAGROUP"; "OCAMON"; "OAMON"}*/
+/*"PAFF" -> {"OASGP"; "OAMONS"; "VSPACE"; "INS"; "OINTDOM"; "CFCAT"; "REAL"}*/
+/*"PAFF" -> {"STEP"; "PI"; "NNI"; "BOOLEAN"}*/
+
+"PAFFFF" -> "PAFF"
+"PAFF" -> "INFCLSPS"
+/*"PAFF" -> {"BLMETCT"; "GPAFF"; "PFORP"; "PACOFF"; "PROJPLPS"; "PLACESPS"}*/
+/*"PAFF" -> {"NSDPS"; "LOCPOWC"; "DIV"; "SETCATD"; "PLACESC"; "DIVCAT"}*/
+/*"PAFF" -> {"INFCLCT"; "DSTREE"; "DSTRCAT"; "PRSPCAT"; "UTSZ"; "PACFFC"}*/
+/*"PAFF" -> {"PACPERC"; "PROJPL"; "PLACES"; "INFCLSPT"; "PROJPL"; "ICP"}*/
+/*"PAFF" -> {"FIELD"; "EUCDOM"; "PID"; "GCDDOM"; "INTDOM"; "COMRING"}*/
+/*"PAFF" -> {"RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"}*/
+/*"PAFF" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"; "LMODULE"}*/
+/*"PAFF" -> {"BMODULE"; "RMODULE"; "ALGEBRA"; "MODULE"; "ENTIRER"; "UFD"}*/
+/*"PAFF" -> {"DIVRING"; "POLYCAT"; "PDRING"; "FAMR"; "AMR"; "CHARZ"}*/
+/*"PAFF" -> {"CHARNZ"; "FRETRCT"; "RETRACT"; "EVALAB"; "IEVALAB"}*/
+/*"PAFF" -> {"FLINEXP"; "LINEXP"; "ORDSET"; "KONVERT"; "PATMAB"; "PFECAT"}*/
+/*"PAFF" -> {"LSAGG"; "STAGG"; "URAGG"; "RCAGG"; "HOAGG"; "AGG"; "TYPE"}*/
+/*"PAFF" -> {"LNAGG"; "IXAGG"; "ELTAGG"; "ELTAB"; "CLAGG"; "FLAGG"}*/
+/*"PAFF" -> {"ELAGG"; "OM"; "INT"; "LIST"; "ILIST"; "DIRPCAT"; "DIFEXT"}*/
+/*"PAFF" -> {"DIFRING"; "FINITE"; "ORDRING"; "OAGROUP"; "OCAMON"; "OAMON"}*/
+/*"PAFF" -> {"OASGP"; "OAMONS"; "VSPACE"; "INS"; "OINTDOM"; "CFCAT"; "REAL"}*/
+/*"PAFF" -> {"STEP"; "PI"; "NNI"; "BOOLEAN"}*/
+
+@
 \subsection{Order}
 The final order of the layers is determined here.
 <<order>>=
@@ -16335,7 +16390,7 @@ ORDER=\
   ${LAYER4}   ${LAYER5}  ${LAYER6}  ${LAYER7}  ${LAYER8}  ${LAYER9}  \
   ${LAYER10}  ${LAYER11} ${LAYER12} ${LAYER13} ${LAYER14} ${LAYER15} \
   ${LAYER16}  ${LAYER17} ${LAYER18} ${LAYER19} ${LAYER20} ${LAYER21} \
-  ${LAYER22}  ${LAYER0COPY}
+  ${LAYER22}  ${LAYER23} ${LAYER0COPY}
 
 @
 \section{Cliques}
@@ -16347,13 +16402,13 @@ So the idea to remove the BOOTSTRAP code is to cluster the spad
 sources into "cliqueN.spad" files and feed them all to the compiler
 at once.
 <<newcode>>=
-CLIQUE1DEPS = ${MID}/MYUP.spad ${MID}/MYEXPR.spad
+CLIQUE1FILES = ${MID}/MYUP.spad ${MID}/MYEXPR.spad
 
-${MID}/clique1.spad: ${CLIQUE1DEPS}
+${MID}/clique1.spad: ${CLIQUE1FILES}
 	@echo cl1 making ${OUT}/MYUP.o from ${MID}/clique1.spad
 	@echo cl1 making ${OUT}/MYEXPR.o from ${MID}/clique1.spad
 	@ (cd ${MID} ; \
-	   cat ${CLIQUE1DEPS} >clique1.spad ; \
+	   cat ${CLIQUE1FILES} >clique1.spad ; \
 	   if [ -z "${NOISE}" ] ; then \
 	    echo ")co clique1.spad" | ${INTERPSYS}  ; \
            else \
@@ -16361,6 +16416,31 @@ ${MID}/clique1.spad: ${CLIQUE1DEPS}
 	   fi )
 	
 @
+Here we have the general case where two files are co-dependent, that is,
+PAFF and PAFFFF both have to be compiled together. They also have a set
+of prerequired files that must be loaded since they are not yet in the
+new database.
+<<newcode>>=
+CLIQUE2FILES = ${MID}/PAFF.spad ${MID}/PAFFFF.spad
+CLIQUE2DEPS  = BLMETCT GPAFF PFORP PACOFF PROJPLPS PLACESPS NSDPS LOCPOWC \
+               DIV SETCATD PLACESC DIVCAT INFCLSPS INFCLCT DSTREE DSTRCAT \
+               PRSPCAT UTSZ PACFFC PACPERC PROJPL PLACES INFCLSPT PROJPL ICP
+
+${MID}/clique2.spad: ${CLIQUE2FILES}
+	@echo cl1 making ${OUT}/PAFF.o from ${MID}/clique2.spad
+	@echo cl1 making ${OUT}/PAFFFF.o from ${MID}/clique2.spad
+	@ (cd ${MID} ; \
+	   cat ${CLIQUE2FILES} >clique2.spad ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${CLIQUE2DEPS} \n )co clique2.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${CLIQUE2DEPS} \n )co clique2.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	    echo ")co clique2.spad" | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+	
+@
 \section{New Algebra dependencies}
 
 New algebra files can depend on new algebra files. Since these files
@@ -18094,6 +18174,8 @@ SPADHELP=\
  ${HELP}/OrderedFreeMonoid.help \
  ${HELP}/OrderedVariableList.help \
  ${HELP}/OrderlyDifferentialPolynomial.help \
+ ${HELP}/PackageForAlgebraicFunctionField.help \
+ ${HELP}/PackageForAlgebraicFunctionFieldOverFiniteField.help \
  ${HELP}/PackageForPoly.help \
  ${HELP}/ParametrizationPackage.help \
  ${HELP}/PartialFraction.help \
@@ -18291,6 +18373,8 @@ REGRESS= \
  OrderedFreeMonoid.regress \
  OrderedVariableList.regress \
  OrderlyDifferentialPolynomial.regress \
+ PackageForAlgebraicFunctionField.regress \
+ PackageForAlgebraicFunctionFieldOverFiniteField.regress \
  PackageForPoly.regress \
  ParametrizationPackage.regress \
  PartialFraction.regress \
@@ -19795,6 +19879,36 @@ ${HELP}/OrderlyDifferentialPolynomial.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/OrderlyDifferentialPolynomial.input
 	@echo "OrderlyDifferentialPolynomial (ODPOL)" >>${HELPFILE}
 
+${HELP}/PackageForAlgebraicFunctionField.help: \
+           ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7875 make PackageForAlgebraicFunctionField.help \
+           from ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"PackageForAlgebraicFunctionField.help" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+           >${HELP}/PackageForAlgebraicFunctionField.help
+	@cp ${HELP}/PackageForAlgebraicFunctionField.help \
+           ${HELP}/PAFF.help
+	@${TANGLE} -R"PackageForAlgebraicFunctionField.input" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+           >${INPUT}/PackageForAlgebraicFunctionField.input
+	@echo "PackageForAlgebraicFunctionField (PAFF)" \
+           >>${HELPFILE}
+
+${HELP}/PackageForAlgebraicFunctionFieldOverFiniteField.help: \
+           ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7875 make PackageForAlgebraicFunctionFieldOverFiniteField.help \
+           from ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"PackageForAlgebraicFunctionFieldOverFiniteField.help" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+           >${HELP}/PackageForAlgebraicFunctionFieldOverFiniteField.help
+	@cp ${HELP}/PackageForAlgebraicFunctionFieldOverFiniteField.help \
+           ${HELP}/PAFFFF.help
+	@${TANGLE} -R"PackageForAlgebraicFunctionFieldOverFiniteField.input" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+           >${INPUT}/PackageForAlgebraicFunctionFieldOverFiniteField.input
+	@echo "PackageForAlgebraicFunctionFieldOverFiniteField (PAFFFF)" \
+           >>${HELPFILE}
+
 ${HELP}/PackageForPoly.help: ${BOOKS}/bookvol10.4.pamphlet
 	@echo 7880 create PackageForPoly.help from \
            ${BOOKS}/bookvol10.4.pamphlet
@@ -20646,6 +20760,7 @@ ${HELP}/dcopy.help: ${BOOKS}/bookvol10.5.pamphlet
 <<layer20>>
 <<layer21>>
 <<layer22>>
+<<layer23>>
 <<order>>
 
 all: src ${OUT}/libdb.text ${SPADBIN}/index.html gloss
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 7db29e0..9d7a17b 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2797,5 +2797,8 @@ books/bookvol10.4 add InterpolateFormsPackage<br/>
 books/bookvol10.4 add IntersectionDivisorPackage<br/>
 <a href="patches/20100524.02.tpd.patch">20100524.02.tpd.patch</a>
 books/bookvol10.4 add GeneralPackageForAlgebraicFunctionField<br/>
+<a href="patches/20100525.01.tpd.patch">20100525.01.tpd.patch</a>
+books/bookvol10.4 add PackageForAlgebraicFunctionFieldOverFiniteField<br/>
+books/bookvol10.4 add PackageForAlgebraicFunctionField<br/>
  </body>
 </html>
