diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 6618f7f..94faef7 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -44578,6 +44578,7 @@ InnerModularGcd(R,BP,pMod,nextMod):C == T
       hg:=height g
       2*min(hf,hg)
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package FOMOGCD ForModularGcd}
 -- ForModularGcd(R,BP) : C == T
 --  where
@@ -49963,6 +49964,361 @@ InternalRationalUnivariateRepresentationPackage(R,E,V,P,TS): Exports == Implemen
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package INTFRSP InterpolateFormsPackage}
+<<InterpolateFormsPackage.input>>=
+)set break resume
+)sys rm -f InterpolateFormsPackage.output
+)spool InterpolateFormsPackage.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show InterpolateFormsPackage
+--R InterpolateFormsPackage(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)  is a package constructor
+--R Abbreviation for InterpolateFormsPackage is INTFRSP 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for INTFRSP 
+--R
+--R------------------------------- Operations --------------------------------
+--R basisOfInterpolateForms : (DIVISOR,List PolyRing) -> List Vector K
+--R basisOfInterpolateFormsForFact : (DIVISOR,List PolyRing) -> List Vector K
+--R interpolateForms : (DIVISOR,NonNegativeInteger,PolyRing,List PolyRing) -> List PolyRing
+--R interpolateFormsForFact : (DIVISOR,List PolyRing) -> List PolyRing
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<InterpolateFormsPackage.help>>=
+====================================================================
+InterpolateFormsPackage examples
+====================================================================
+
+See Also:
+o )show InterpolateFormsPackage
+
+@
+\pagehead{InterpolateFormsPackage}{INTFRSP}
+\pagepic{ps/v104interpolateformspackage.eps}{INTFRSP}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{ll}
+\cross{INTFRSP}{basisOfInterpolateForms} &
+\cross{INTFRSP}{basisOfInterpolateFormsForFact} \\
+\cross{INTFRSP}{interpolateForms} &
+\cross{INTFRSP}{interpolateFormsForFact} 
+\end{tabular}
+
+<<package INTFRSP InterpolateFormsPackage>>=
+)abbrev package INTFRSP InterpolateFormsPackage
+++ Author: Gaetan Hache
+++ Date Created: 17 nov 1992
+++ Date Last Updated: May 2010 by Tim Daly
+++ Description:  
+++ The following is part of the PAFF package
+InterpolateFormsPackage(K,symb,PolyRing,E,ProjPt,PCS,Plc,DIVISOR):_
+ 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)
+
+  INT       ==> Integer
+  NNI       ==> NonNegativeInteger
+  ParamPack ==>  ParametrizationPackage(K,symb,PolyRing,E,ProjPt,PCS,Plc)
+  PackPoly  ==>    PackageForPoly(K,PolyRing,E,#symb)
+  LINPACK   ==> LinearSystemFromPowerSeriesPackage(K,PCS)
+
+  Exports ==>  with
+
+    basisOfInterpolateForms: (DIVISOR,List PolyRing)  -> List(Vector(K))
+
+    basisOfInterpolateFormsForFact: (DIVISOR,List PolyRing)  -> List(Vector(K))
+
+    interpolateFormsForFact: (DIVISOR,List PolyRing) -> List(PolyRing)
+
+    interpolateForms: (DIVISOR,NNI,PolyRing,List PolyRing) -> List(PolyRing)
+      ++ interpolateForms(D,n,pol,base) compute the basis of the sub-vector 
+      ++ space W of V = <base>, such that for all G in W, the 
+      ++ divisor (G) >= D. All the elements in base must be homogeneous 
+      ++ polynomial of degree n. Typicaly, base is the set of all monomial 
+      ++ of degree n: in that case, interpolateForms(D,n,pol,base)
+      ++ returns the basis of the vector space of all forms of degree d that 
+      ++ interpolated D. The argument pol must be the same polynomial that 
+      ++ defined the curve form which the divisor D is defined.
+
+  Implementation ==>  add
+
+    import PolyRing
+    import PCS
+
+    sbSpcOfCurve: (NNI,PolyRing) -> List(List(K))
+    
+    exponant2monomial: List(NNI) -> PolyRing
+
+    crtV: (List(K),List(INT),NNI) -> List(K)
+
+    createLinSys: (List Plc, List INT,List PolyRing) -> Matrix(K)
+
+    createLinSysWOVectorise: (List Plc, List INT,List PolyRing) -> Matrix(K)
+
+    basisOfInterpolateFormsForFact(divis,lm)==
+      -- permet d'intepoler un diviseur qui n'est pas rationnel. 
+      -- La partie non rationel
+      -- est dans sptdiv (note: une place de sptdiv est une place qui identidie
+      -- l'ensemble des places qui lui sont conjuguees.
+      -- Note: On utilise ici la fonction createLinSysWOVectorise
+      -- qui ne vectorise pas les elements du corps de base.
+      lstOfPlc:= supp divis
+      lstOfv:= [coefficient(pl,divis)  for pl in lstOfPlc]
+      -- ppsol contiendra la base des formes interpolant ke diviseur divis
+      linSys:Matrix(K)
+      linSysT:Matrix(K)
+      ll:List Matrix K
+      ^empty?(lstOfPlc) => 
+        linSys:=createLinSysWOVectorise(lstOfPlc,lstOfv,lm)
+        nullSpace linSys
+      zeroMat:Matrix(K):=zero(1,#lm)$Matrix(K)
+      nullSpace zeroMat
+      
+    interpolateForms(divis,d,laCrb,lm)==
+      -- ppsol contiendra la base des formes interpolant le diviseur divis
+      -- mieux vaut prendre  divOfZero de divis ?
+      ppsol:= basisOfInterpolateForms(divis,lm)
+      
+      psol:List(List(K)):=[entries(vec) for vec in ppsol]
+      mpsol:=psol
+      sbspc:List(List(K))
+      if ^(totalDegree(laCrb)$PackPoly > d) then
+        -- retourne une base des formes de degres d 
+	-- qui sont un multiple de la courbe
+        sbspc:=sbSpcOfCurve(d,laCrb)
+        mpsol:=quotVecSpaceBasis(psol,sbspc)$LinesOpPack(K)
+	
+      empty?(mpsol) => [0]
+      
+      rowEchmpsol:=rowEchelon(matrix(mpsol)$Matrix(K))
+      npsol:=listOfLists(rowEchmpsol) 
+      [reduce("+",[a*f  for a in ll for f in lm]) for ll in npsol]
+
+    interpolateFormsForFact(divis,lm)==
+      -- ppsol contiendra la base des formes interpolant le diviseur divis
+      ppsol:= basisOfInterpolateFormsForFact(divis,lm)
+      psol:List(List(K)):=[entries(vec) for vec in ppsol]
+      mpsol:=psol
+      empty?(mpsol) => [0]
+      rowEchmpsol:=rowEchelon matrix(mpsol)$Matrix(K) 
+      npsol:=listOfLists(rowEchmpsol) 
+      [reduce("+",[a*f  for a in ll for f in lm]) for ll in npsol]
+
+    createLinSys(lstOfPlc,lstOfv,lm)==
+        lplsT:=[ [parametrize(f,pl)$ParamPack  for f in lm]_
+	           for pl in lstOfPlc]
+        lpls:=[[filterUpTo(s,v) for s in souslplsT] _
+	          for souslplsT in lplsT_
+		  for v in lstOfv]
+        linSys:=reduce("vertConcat",_
+	           [finiteSeries2LinSys(souslplsT,v)$LINPACK_
+		          for souslplsT in lpls_
+			  for v in lstOfv])
+        linSys
+
+    createLinSysWOVectorise(lstOfPlc,lstOfv,lm)==
+        lplsT:=[ [parametrize(f,pl)$ParamPack  for f in lm]_
+	           for pl in lstOfPlc]
+        lpls:=[[filterUpTo(s,v) for s in souslplsT] _
+	          for souslplsT in lplsT_
+		  for v in lstOfv]
+        linSys:=reduce("vertConcat",_
+	           [finiteSeries2LinSysWOVectorise(souslplsT,v)$LINPACK_
+		          for souslplsT in lpls_
+			  for v in lstOfv])
+        linSys
+      
+    basisOfInterpolateForms(divis,lm)==
+      lstOfPlc:= supp divis
+      lstOfv:= [coefficient(pl,divis)  for pl in lstOfPlc]
+      -- ppsol contiendra la base des formes interpolant ke diviseur divis
+      linSys:Matrix(K)
+      ^empty?(lstOfPlc) => 
+        linSys:=createLinSys(lstOfPlc,lstOfv,lm)
+        -- ppsol contient la base des formes passant par le diviseur divv
+        nullSpace(linSys)
+      zeroMat:Matrix(K):=zero(1,#lm)$Matrix(K)
+      nullSpace zeroMat
+
+     
+--    interpolateForms(divis,d,laCrb,lm)==
+--      lstOfPlc:= supp divis
+--      lstOfv:= [coefficient(pl,divis)  for pl in lstOfPlc]
+--      
+--      lpls : List(List(PCS))
+--      lplsT: List(List(PCS))
+--      
+--      -- ppsol contiendra la base des formes interpolant ke diviseur divis
+--      ppsol:List(Vector(K))
+--      linSys:Matrix(K)
+--      if ^empty?(lstOfPlc) then
+--        linSys:=createLinSys(lstOfPlc,lstOfv,lm)
+--			  
+--        -- ppsol contient la base des formes passant par le diviseur divv
+--        ppsol:=nullSpace(linSys)
+--      else
+--        zeroMat:Matrix(K):=zero(1,#lm)$Matrix(K)
+--        ppsol:=nullSpace zeroMat
+--      mpsol:=psol:List(List(K)):=[entries(vec) for vec in ppsol]
+--      
+--      if ^(totalDegree(laCrb) > d) then
+--        -- retourne une base des formes de degres d 
+--	-- qui sont un multiple de la courbe
+--        sbspc:=sbSpcOfCurve(d,laCrb)
+--        mpsol:=quotVecSpaceBasis(psol,sbspc)$LinesOpPack(K)
+--	
+--      empty?(mpsol) => [0]
+--      
+--      rowEchmpsol:=rowEchelon(matrix(mpsol))
+--      npsol:=listOfLists(rowEchmpsol) 
+--      [reduce("+",[a*f  for a in ll for f in lm]) for ll in npsol]
+--
+
+--    interpolateForms(divis,d,laCrb,lm)==
+--      lstOfPlc:= supp divis
+--      lstOfv:= [coefficient(pl,divis)  for pl in lstOfPlc]
+--      
+--      lpls : List(List(PCS))
+--      lplsT: List(List(PCS))
+--      
+--      -- ppsol contiendra la base des formes interpolant ke diviseur divis
+--      ppsol:List(Vector(K))
+--      linSys:Matrix(K)
+--      if ^empty?(lstOfPlc) then
+--      
+--        lplsT:=[ [parametrize(f,pl)$ParamPack  for f in lm]_
+--	           for pl in lstOfPlc]
+--		   
+--        lpls:=[[filterUpTo(s,v) for s in souslplsT] _
+--	          for souslplsT in lplsT_
+--		  for v in lstOfv]
+--		  
+--        linSys:=reduce("vertConcat",_
+--	           [finiteSeries2LinSys(souslplsT,v)$LINPACK_
+--		          for souslplsT in lpls_
+--			  for v in lstOfv])
+--			  
+--        -- ppsol contient la base des formes passant par le diviseur divv
+--        ppsol:=nullSpace(linSys)
+--      else
+--        zeroMat:Matrix(K):=zero(1,#lm)$Matrix(K)
+--        ppsol:=nullSpace zeroMat
+--      mpsol:=psol:List(List(K)):=[entries(vec) for vec in ppsol]
+--      
+--      if ^(totalDegree(laCrb) > d) then
+--        -- retourne une base des formes de degres d 
+--	-- qui sont un multiple de la courbe
+--        sbspc:=sbSpcOfCurve(d,laCrb)
+--        mpsol:=quotVecSpaceBasis(psol,sbspc)$LinesOpPack(K)
+--	
+--      empty?(mpsol) => [0]
+--      
+--      rowEchmpsol:=rowEchelon(matrix(mpsol))
+--      npsol:=listOfLists(rowEchmpsol) 
+--      [reduce("+",[a*f  for a in ll for f in lm]) for ll in npsol]
+
+    listVar:List(OV):= [index(i::PositiveInteger)$OV for i in 1..#symb]
+
+    listMonoPols:List(PolyRing):=[monomial(1,vv,1) for vv in listVar]
+
+    crtV(lcoef,lpos,l)==
+      vvv:List(K):=[0 for i in 1..l]
+      for c in lcoef for p in lpos repeat
+        setelt(vvv,p,c)
+      vvv
+
+    sbSpcOfCurve(m,laCrb)==
+      d:=totalDegree(laCrb)$PackPoly
+      lm:List(PolyRing):=listAllMono(m)$PackPoly
+      m<d => [[0$K for i in 1..#lm]]
+      sd:NNI:=((m pretend INT)-(d pretend INT)) pretend NNI
+      slm:List(PolyRing):=listAllMono(sd)$PackPoly
+      allPol:=[laCrb*f for f in slm]
+      lpos:=[[position(m,lm) for m in primitiveMonomials(f)] for f in allPol]
+      lcoef:=[coefficients(f) for f in allPol]
+      clm:=#lm
+      [crtV(lc,lp,clm) for lc in lcoef for lp in lpos]
+
+    inVecSpace?: (List(K),List(List(K))) -> Boolean
+    inVecSpace?(line,basis)==
+      mat:Matrix(K):=matrix(basis)
+      rmat:=rank(mat)
+      augmat:Matrix(K):=matrix(concat(line,basis))
+      raugmat:=rank(augmat)
+      rmat=raugmat
+
+
+    exponant2monomial(lexp)==
+      reduce("*",[m**e for m in listMonoPols for e in lexp])
+
+--    interpolateFunctions(lstOfPlc,lstOfv,lmnumer)==
+----      lstOfPlc:= supp divis
+----      lstOfv:= [coef(divis,pl) for pl in lstOfPlc]
+--      
+--      lpls:List(List(PCS))
+--      lplsT:List(List(PCS))
+--      llll:List(List(Integer))
+--      lOrd:List(Integer)
+--      ordMin:Integer
+--      ppsol:List(Vector(K))
+--      linSys:Matrix(K)
+--      if ^empty?(lstOfPlc) then
+--        lplsT:=[[parametrize(f,pl)$ParamPack  for f in lmnumer ] _
+--          for pl in lstOfPlc]
+--	lplsT:=[[removeFirstZeroes(s) for s in l] for l in lplsT]
+--	
+--	-- series must be shift if somme of them has negetive order
+--	llll:= [[order(s)$PCS for s in l] for l in lplsT]
+--	lOrd:=  concat llll
+--	lOrd:=cons(0,lOrd)
+--	ordMin:Integer:= "min"/lOrd
+--	lplsT:=[[shift(s,-ordMin) for s in l] for l in lplsT]
+--	
+--        lpls:=[[filterUpTo(s,v-ordMin) for s in souslplsT] _
+--          for souslplsT in lplsT  for v in lstOfv]
+--        linSys:=reduce("vertConcat",_
+--          [finiteSeries2LinSys(souslplsT,v-ordMin)$LINPACK _
+--            for souslplsT in lpls for v in lstOfv])
+--        -- ppsol contient la base des formes passant par le diviseur divv
+--        ppsol:=nullSpace(linSys)
+--      else
+--        zeroMat:Matrix(K):=zero(1,#lmnumer)$Matrix(K)
+--        ppsol:=nullSpace zeroMat
+--      mpsol:=psol:List(List(K)):=[entries(vec) for vec in ppsol]
+--      -- inserer ici le code pour calculer la base modulo l'ideal ...
+--      empty?(mpsol) => [0]
+--      rowEchmpsol:=rowEchelon(matrix(mpsol))
+--      npsol:=listOfLists(rowEchmpsol) 
+--      [reduce("+",[a*f  for a in ll for f in lmnumer]) for ll in npsol]
+
+@
+<<INTFRSP.dotabb>>=
+"INTFRSP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=INTFRSP"]
+"LISYSER" [color="#FF4488",href="bookvol10.4.pdf#nameddest=LISYSER"]
+"PFORP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PFORP"]
+"PARAMP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=PARAMP"]
+"INTFRSP" -> "LISYSER"
+"INTFRSP" -> "PFORP"
+"INTFRSP" -> "PARAMP"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package IRREDFFX IrredPolyOverFiniteField}
 \pagehead{IrredPolyOverFiniteField}{IRREDFFX}
 \pagepic{ps/v104irredpolyoverfinitefield.ps}{IRREDFFX}{1.00}
@@ -157983,6 +158339,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package INTTOOLS IntegrationTools>>
 <<package IPRNTPK InternalPrintPackage>>
 <<package IRURPK InternalRationalUnivariateRepresentationPackage>>
+<<package INTFRSP InterpolateFormsPackage>>
 <<package IRREDFFX IrredPolyOverFiniteField>>
 <<package IRSN IrrRepSymNatPackage>>
 <<package INVLAPLA InverseLaplaceTransform>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 9cb3e28..bdfee06 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -23996,6 +23996,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|IntegrationResultRFToFunction| . IRRF2F)
    (|IntegrationResultToFunction| . IR2F)
    (|InterfaceGroebnerPackage| . INTERGB)
+   (|InterpolateFormsPackage| . INTFRSP)
    (|Interval| . INTRVL)
    (|InventorDataSink| . IVDATA)
    (|InventorViewPort| . IVVIEW)
diff --git a/books/ps/v104interpolateformspackage.eps b/books/ps/v104interpolateformspackage.eps
new file mode 100644
index 0000000..71dc5ee
--- /dev/null
+++ b/books/ps/v104interpolateformspackage.eps
@@ -0,0 +1,356 @@
+%!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 290 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 290 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 254 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% INTFRSP
+gsave
+[ /Rect [ 85 72 161 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=INTFRSP) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 161 108 moveto
+85 108 lineto
+85 72 lineto
+161 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 161 108 moveto
+85 108 lineto
+85 72 lineto
+161 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+93 85.9 moveto 60 (INTFRSP) alignedtext
+grestore
+% LISYSER
+gsave
+[ /Rect [ 0 0 74 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=LISYSER) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 74 36 moveto
+0 36 lineto
+0 0 lineto
+74 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 74 36 moveto
+0 36 lineto
+0 0 lineto
+74 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 13.9 moveto 59 (LISYSER) alignedtext
+grestore
+% INTFRSP->LISYSER
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 101 72 moveto
+90 63 77 52 66 42 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 68.1 39.2 moveto
+58 36 lineto
+63.9 44.8 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 68.1 39.2 moveto
+58 36 lineto
+63.9 44.8 lineto
+closepath stroke
+grestore
+% PFORP
+gsave
+[ /Rect [ 92 0 154 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=PFORP) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 154 36 moveto
+92 36 lineto
+92 0 lineto
+154 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 154 36 moveto
+92 36 lineto
+92 0 lineto
+154 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+99.5 13.9 moveto 47 (PFORP) alignedtext
+grestore
+% INTFRSP->PFORP
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 123 72 moveto
+123 64 123 55 123 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 126.5 46 moveto
+123 36 lineto
+119.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 126.5 46 moveto
+123 36 lineto
+119.5 46 lineto
+closepath stroke
+grestore
+% PARAMP
+gsave
+[ /Rect [ 172 0 246 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=PARAMP) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 246 36 moveto
+172 36 lineto
+172 0 lineto
+246 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 246 36 moveto
+172 36 lineto
+172 0 lineto
+246 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+180 13.9 moveto 58 (PARAMP) alignedtext
+grestore
+% INTFRSP->PARAMP
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 145 72 moveto
+156 63 169 52 180 42 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 182.1 44.8 moveto
+188 36 lineto
+177.9 39.2 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 182.1 44.8 moveto
+188 36 lineto
+177.9 39.2 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 429cb9e..504b417 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100523 tpd src/axiom-website/patches.html 20100523.04.tpd.patch
+20100523 tpd src/algebra/Makefile help and test for InterpolateFormsPackage
+20100523 tpd books/bookvol5 expose InterpolateFormsPackage
+20100523 tpd books/bookvol10.4 add InterpolateFormsPackage
+20100523 tpd ps/v104interpolateformspackage.eps added
 20100523 tpd src/axiom-website/patches.html 20100523.03.tpd.patch
 20100523 tpd src/algebra/Makefile help and test for PARAMP, DTP
 20100523 tpd books/bookvol5 expose DesingTreePackage, ParametrizationPackage
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index a6ad9d4..cc43afe 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -8973,7 +8973,7 @@ Used by next layer: DIAGG FRAMALG MDAGG SMATCAT UPXSCCA
 LAYER12=\
   ${OUT}/DIAGG.o   ${OUT}/DIAGG-.o   ${OUT}/DSMP.o     ${OUT}/EXPUPXS.o \
   ${OUT}/FACTRN.o  ${OUT}/FFFACTSE.o \
-  ${OUT}/FRAMALG.o ${OUT}/FRAMALG-.o ${OUT}/LPARSPT.o  \
+  ${OUT}/FRAMALG.o ${OUT}/FRAMALG-.o ${OUT}/INTFRSP.o  ${OUT}/LPARSPT.o  \
   ${OUT}/MDAGG.o   ${OUT}/NPOLYGON.o \
   ${OUT}/ODPOL.o   ${OUT}/PLOT.o     ${OUT}/RFP.o     \
   ${OUT}/RMCAT2.o  ${OUT}/ROIRC.o    ${OUT}/SDPOL.o   \
@@ -9119,6 +9119,29 @@ LAYER12=\
 /*"FRAMALG-" -> {"OAGROUP";  "OCAMON";  "OAMON";  "OASGP";  "CFCAT";  "REAL"}*/
 /*"FRAMALG-" -> {"OM";  "NNI";  "PI";  "SINT";  "LIST";  "ILIST"}*/
 
+"INTFRSP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=INTFRSP"]
+"INTFRSP" -> "PFORP"
+"INTFRSP" -> "PARAMP"
+"INTFRSP" -> "LISYSER"
+/*"INTFRSP" -> {"PRSPCAT"; "SETCATD"; "LOCPOWC"; "PLACESC"}*/
+/*"INTFRSP" -> {"DIVCAT"; "LOP"; "FIELD"; "EUCDOM"; "PID"}*/
+/*"INTFRSP" -> {"GCDDOM"; "INTDOM"; "COMRING"; "RING"; "RNG"; "ABELGRP"}*/
+/*"INTFRSP" -> {"CABMON"; "ABELMON"; "ABELSG"; "SETCAT"; "BASTYPE"}*/
+/*"INTFRSP" -> {"KOERCE"; "SGROUP"; "MONOID"; "LMODULE"; "BMODULE"}*/
+/*"INTFRSP" -> {"RMODULE"; "ALGEBRA"; "MODULE"; "ENTIRER"; "UFD"; "DIVRING"}*/
+/*"INTFRSP" -> {"POLYCAT"; "PDRING"; "FAMR"; "AMR"; "CHARZ"; "CHARNZ"}*/
+/*"INTFRSP" -> {"FRETRCT"; "RETRACT"; "EVALAB"; "IEVALAB"; "FLINEXP"}*/
+/*"INTFRSP" -> {"LINEXP"; "ORDSET"; "KONVERT"; "PATMAB"; "PFECAT"}*/
+/*"INTFRSP" -> {"DIRPCAT"; "IXAGG"; "HOAGG"; "AGG"; "TYPE"; "ELTAGG"}*/
+/*"INTFRSP" -> {"ELTAB"; "DIFEXT"; "DIFRING"; "FINITE"; "ORDRING"}*/
+/*"INTFRSP" -> {"OAGROUP"; "OCAMON"; "OAMON"; "OASGP"; "OAMONS"}*/
+/*"INTFRSP" -> {"VSPACE"; "UPSCAT"; "PSCAT"; "FAMONC"; "INT"; "LIST"}*/
+/*"INTFRSP" -> {"ILIST"; "NNI"; "LSAGG"; "STAGG"; "URAGG"; "RCAGG"}*/
+/*"INTFRSP" -> {"LNAGG"; "CLAGG"; "FLAGG"; "ELAGG"; "OM"; "VECTOR"}*/
+/*"INTFRSP" -> {"IVECTOR"; "IARRAY1"; "VECTCAT-"; "A1AGG-"; "FLAGG-"}*/
+/*"INTFRSP" -> {"LNAGG-"; "IXAGG-"; "LSAGG-"; "SINT"; "PI"; "STAGG-"}*/
+/*"INTFRSP" -> {"ELAGG-"; "OUTFORM"}*/
+
 "LPARSPT" [color="#FF4488",href="bookvol10.4.pdf#nameddest=LPARSPT"]
 "LPARSPT" -> "PLPKCRV"
 /*"LPARSPT" -> {"PFECAT"; "DIRPCAT"}*/
@@ -17145,6 +17168,22 @@ ${MID}/DTP.nrlib/code.o: ${MID}/DTP.spad
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
+<<newcode>>=
+
+INTFRSPDEPS = PRSPCAT SETCATD LOCPOWC PLACESC DIVCAT PFORP LOP PARAMP \
+              LISYSER
+
+${MID}/INTFRSP.nrlib/code.o: ${MID}/INTFRSP.spad
+	@echo P3 making ${MID}/INTFRSP.nrlib/code.o from ${MID}/INTFRSP.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${INTFRSPDEPS} \n )co INTFRSP.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${INTFRSPDEPS} \n )co AFALGRES.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+@
 
 \section{Broken Files}
 These files are Aldor files
@@ -17923,6 +17962,7 @@ SPADHELP=\
  ${HELP}/IntegerLinearDependence.help \
  ${HELP}/IntegerNumberTheoryFunctions.help \
  ${HELP}/InterfaceGroebnerPackage.help \
+ ${HELP}/InterpolateFormsPackage.help \
  ${HELP}/Interval.help \
  ${HELP}/Kernel.help \
  ${HELP}/KeyedAccessFile.help \
@@ -18131,6 +18171,7 @@ REGRESS= \
  IntegerLinearDependence.regress \
  IntegerNumberTheoryFunctions.regress \
  InterfaceGroebnerPackage.regress \
+ InterpolateFormsPackage.regress \
  Interval.regress \
  Kernel.regress \
  KeyedAccessFile.regress \
@@ -19108,6 +19149,18 @@ ${HELP}/InterfaceGroebnerPackage.help: ${BOOKS}/bookvol10.4.pamphlet
             >${INPUT}/InterfaceGroebnerPackage.input
 	@echo "InterfaceGroebnerPackage (INTERGB)" >>${HELPFILE}
 
+${HELP}/InterpolateFormsPackage.help: ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7455 create InterpolateFormsPackage.help from \
+           ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"InterpolateFormsPackage.help" \
+           ${BOOKS}/bookvol10.4.pamphlet \
+           >${HELP}/InterpolateFormsPackage.help
+	@cp ${HELP}/InterpolateFormsPackage.help ${HELP}/INTFRSP.help
+	@${TANGLE} -R"InterpolateFormsPackage.input" \
+            ${BOOKS}/bookvol10.4.pamphlet \
+            >${INPUT}/InterpolateFormsPackage.input
+	@echo "InterpolateFormsPackage (INTFRSP)" >>${HELPFILE}
+
 ${HELP}/Interval.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7457 create Interval.help from ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"Interval.help" ${BOOKS}/bookvol10.3.pamphlet \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 4548578..0f5f261 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2791,5 +2791,7 @@ books/bookvol10.4 add ProjectiveAlgebraicSetPackage<br/>
 books/bookvol10.4 add LocalParametrizationOfSimplePointPackage<br/>
 <a href="patches/20100523.03.tpd.patch">20100523.03.tpd.patch</a>
 books/bookvol10.4 add DesingTreePackage, ParametrizationPackage<br/>
+<a href="patches/20100523.04.tpd.patch">20100523.04.tpd.patch</a>
+books/bookvol10.4 add InterpolateFormsPackage<br/>
  </body>
 </html>
