diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index b21478d..be80e60 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -114680,7 +114680,270 @@ NewtonInterpolation F: Exports == Implementation where
 "NEWTON" -> "ALGEBRA"
 
 @
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package NPOLYGON NewtonPolygon}
+<<NewtonPolygon.input>>=
+)set break resume
+)sys rm -f NewtonPolygon.output
+)spool NewtonPolygon.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show NewtonPolygon
+--R NewtonPolygon(K: Ring,PolyRing: FiniteAbelianMonoidRing(K,E),E: DirectProductCategory(dim,NonNegativeInteger),dim: NonNegativeInteger)  is a package constructor
+--R Abbreviation for NewtonPolygon is NPOLYGON 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for NPOLYGON 
+--R
+--R------------------------------- Operations --------------------------------
+--R multiplicity : List List PolyRing -> NonNegativeInteger
+--R negAndPosEdge : (PolyRing,List List PolyRing) -> List List PolyRing
+--R newtonPolygon : (PolyRing,Integer,Integer,Union(left,center,right,vertical,horizontal)) -> List List PolyRing
+--R slope : (PolyRing,PolyRing) -> Record(height: Integer,base: Integer,quotient: Integer,reste: Integer,type: Union(left,center,right,vertical,horizontal))
+--R slope : List PolyRing -> Record(height: Integer,base: Integer,quotient: Integer,reste: Integer,type: Union(left,center,right,vertical,horizontal))
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<NewtonPolygon.help>>=
+====================================================================
+NewtonPolygon examples
+====================================================================
+
+See Also:
+o )show NewtonPolygon
+
+@
+\pagehead{NewtonPolygon}{NPOLYGON}
+\pagepic{ps/v104newtonpolygon.eps}{NPOLYGON}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{llll}
+\cross{NPOLYGON}{multiplicity} &
+\cross{NPOLYGON}{negAndPosEdge} &
+\cross{NPOLYGON}{newtonPolygon} &
+\cross{NPOLYGON}{slope} 
+\end{tabular}
+
+<<package NPOLYGON NewtonPolygon>>=
+)abbrev package NPOLYGON NewtonPolygon
+++ 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
+NewtonPolygon(K,PolyRing,E,dim):Exports == Implementation where
+  K:Ring
+  dim:NonNegativeInteger
+  PolyRing: FiniteAbelianMonoidRing(K,E)
+  E: DirectProductCategory(dim,NonNegativeInteger)
+
+  PackPoly ==> PackageForPoly(K,PolyRing,E,dim)
+
+  recSlope ==> Record( height:Integer, base:Integer, quotient:Integer, _
+                       reste:Integer, _
+                  type:Union("left","center","right","vertical","horizontal"))
+
+  Exports ==> with
+
+    newtonPolygon: (PolyRing,Integer,Integer,Union("left","center", "right",_
+                               "vertical","horizontal")) -> List List PolyRing
+
+    multiplicity: List List PolyRing -> NonNegativeInteger
+
+    negAndPosEdge: (PolyRing, List List PolyRing) -> List List PolyRing
 
+    slope: (PolyRing,PolyRing) -> recSlope
+    slope: List PolyRing -> recSlope
+
+  Implementation ==> add
+
+    slope(p1,p2)==
+      -- calcule la pente de p1 a p2 et change le signe. 
+      e1:=degree p1
+      e2:=degree p2
+      hgt:= ( e1.2 pretend Integer) - ( e2.2 pretend Integer) 
+      bs:= ( e2.1 pretend Integer) - ( e1.1 pretend Integer )
+      zero? bs =>  [hgt, bs, 0$Integer, 0$Integer, "vertical" ]$recSlope
+      zero? hgt => [hgt, bs, 0$Integer, 0$Integer, "horizontal" ]$recSlope
+      hgt = bs  => [hgt, bs, 1$Integer, 0$Integer, "center" ]$recSlope
+      hgt > bs =>
+         eucl:=divide(hgt,bs)
+         [hgt, bs,  eucl.quotient, eucl.remainder , "left" ]$recSlope
+      eucl:=divide(bs, hgt)
+      [hgt, bs,  eucl.quotient, eucl.remainder , "right" ]$recSlope
+      
+    oneToPos:  List List PolyRing -> List List PolyRing
+
+    oneToPos(lpol)==
+      fedge:= first lpol
+      sl:= slope fedge
+      one? ( #(lpol) ) =>
+        if sl.height > sl.base then [ fedge, empty() ]
+        else [ empty() , fedge ] 
+      ^( sl.base < sl.height ) => [ empty() , fedge ]
+      restPANE:= oneToPos  rest lpol
+      fedge2 := first restPANE
+      sl2:= slope fedge2
+      ^( sl2.base < sl2.height ) => [ fedge , fedge2 ]
+      restPANE 
+
+    oneToNeg:  List List PolyRing -> List List PolyRing
+
+    oneToNeg(lpol)==
+      fedge:= first lpol
+      sl:= slope fedge
+      one? ( #(lpol) ) =>
+        if sl.height < sl.base then [ empty(), fedge ]
+        else [ fedge , empty()  ] 
+      ( sl.height < sl.base ) => [ empty() , fedge ]
+      restPANE:= oneToNeg  rest lpol
+      fedge2 := first restPANE
+      sl2:= slope fedge2
+      ( sl2.height < sl2.base ) => [ fedge , fedge2 ]
+      restPANE 
+
+    negAndPosEdge(pol, lpol)==
+      -- cette fonction retourne deux liste de polynomes: 
+      -- la premiere est liee a
+      -- la transformation x = x y^l (i.e v(x) >= v(y) ). 
+      -- la deuxieme est liee a la transformation
+      -- y = x^l y (i.e. v(x) <= v(y) ). 
+      -- si le degree en Y est inferieur a celui en X on 
+      -- previligie la transformation
+      -- y = x^l y.
+      degree( pol , 2 )$PackPoly < degree( pol, 1 )$PackPoly => oneToPos lpol
+      oneToNeg lpol
+
+    localNewtonPolygon: List PolyRing -> List PolyRing
+
+    slEq: (recSlope, recSlope) -> Boolean
+
+    regroup: List PolyRing -> List List PolyRing
+
+    multiplicity( lpol )==
+      nl:=#(lpol)
+      flpol:= first lpol
+      one? nl=> totalDegree( last flpol)$PackPoly
+      s:=slope flpol
+      s.height < s.base => totalDegree( first flpol )$PackPoly
+      multiplicity( rest lpol )
+
+    slEq(s1,s2)==
+      s1.height * s2.base = s2.height * s1.base
+
+    regroup(lpol)==
+      -- Note : les elements de lpol sont sur la frontiere d'un poly. 
+      -- de Newton et il sont deja trie's. 
+      nl:=#(lpol)
+      one? nl => [lpol]
+      2 = nl => [lpol]
+      f:=first lpol
+      r:= regroup rest lpol
+      -- Note : les listes de "r" contiennent au moins 2 elements !!
+      fg:=first r
+      s1:=slope(f, first fg)
+      s2:=slope(fg.1,fg.2)
+      slEq(s1,s2) => cons( cons(f, fg) , rest r)
+      cons( [f, first fg], r)
+
+-- ================================================
+-- sortMono :  trie les monomes par ordre croissant 
+-- ================================================
+
+    sortMono: (PolyRing, PolyRing) -> Boolean
+    sortMono(p1,p2)==
+      a:= degree p1
+      b:= degree p2
+      a.1 < b.1 => true                  -- p1 est a gauche de p2
+      a.1 = b.1 and  a.2 > b.2 => true   -- p1 est au dessus de p2 
+      false
+    
+-- ===================================================
+-- newtonPolygon :  retourne tous les monomes sur la 
+-- frontiere de du polygone de Newton,
+-- regroupes selon leur pente.
+-- ===================================================
+  
+    properSlope: ( List PolyRing, Integer, Integer, _
+            Union("left","center","right","vertical","horizontal")) -> Boolean
+
+    properSlope(lpol,hgt,bs, tp)==
+      s:=slope lpol
+      tp case "left" and s.height = hgt and s.base = bs => true
+      tp case "right" and s.height = bs and s.base = hgt => true
+      false
+
+
+    newtonPolygon(pol,hgt,bs,tp)==
+      ans:=regroup localNewtonPolygon _
+                              sort( sortMono(#1,#2) , monomials(pol)$PackPoly)
+      zero?(bs) => ans
+      [ l for l in ans | properSlope(l,hgt,bs,tp)] 
+
+    comp2pol: (PolyRing,PolyRing) -> List PolyRing
+    comp2pol(p1,p2)==
+      rs:= slope(p1,p2)
+      zero? rs.base =>               -- p1 et p2 sont alignes verticalement !!
+        zero? rs.height => [p1 + p2] -- les monomes sont identiques !
+        rs.height < 0 => [p1]        -- p2 est au dessus de p1, 
+                                     -- il faut retourner p1 !! 
+        [p2]                         -- sinon p1 est au dessus de p2 .
+      rs.base > 0 =>                 -- p1 est a gauche de p2
+        rs.height > 0 => [p1,p2]     -- p1 est plus haut que p2
+        [p1]                         -- p1 est a la meme hauteur que p2
+                                     -- ici p2 est a gauche de p1
+      rs.height < 0 => [p2,p1]       -- p2 est plus haut que p1 
+      [p2]                           -- p2 est a la meme hauteur que p1.
+
+    slope(lpol) == 
+      ^one?(#lpol) => slope( first lpol, second lpol)
+      f:= first lpol
+      ( degree(f,2)$PackPoly < degree(f,1)$PackPoly ) => _
+                               [ 0$Integer, 1$Integer,0,0, "right" ]$recSlope
+      [1$Integer, 0$Integer,0,0 , "left"  ]$recSlope
+
+    convex_?: (PolyRing,PolyRing,PolyRing) -> Boolean
+    convex_?(p1,p2,p3)==
+      s1:=slope(p1,p2)
+      s2:=slope(p2,p3)
+      s1.type case "horizontal" => true
+      s2.type case "vertical" => true
+      s1.type case "vertical" => false  -- car ici il faut c2 vertical
+      s2.type case "horizontal" => false      
+      (s1.height * s2.base) < (s2.height  * s1.base)
+
+    consBondary: (PolyRing , List PolyRing) -> List PolyRing
+    consBondary(lt, lpol)==
+      -- "lt" est un monome a ajouter ou non a "lpol" qui est une 
+      empty? lpol => [lt]
+      st:=first lpol
+      nl:NonNegativeInteger:= # lpol      
+      one? nl => comp2pol(lt,st)
+      degree(lt).1 = degree(st).1 and degree(lt).2 > degree(st).2 => lpol
+      ^convex?(lt , st , lpol.2) => cons(lt, lpol)
+      consBondary( lt, rest lpol )
+
+    localNewtonPolygon(lpol)==
+      -- lpol doit etre trie' par sortMono 
+      empty? lpol =>  empty() 
+      nl:= #(lpol)
+      one?  nl => lpol
+      lt:=first lpol 
+      polgRest:= localNewtonPolygon rest lpol 
+      consBondary( lt , polgRest )              
+
+@
+<<NPOLYGON.dotabb>>=
+"NPOLYGON" [color="#FF4488",href="bookvol10.4.pdf#nameddest=NPOLYGON"]
+"DIRPCAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=DIRPCAT"]
+"NPOLYGON" -> "DIRPCAT"
+
+@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package NCODIV NonCommutativeOperatorDivision}
 \pagehead{NonCommutativeOperatorDivision}{NCODIV}
@@ -123854,7 +124117,6 @@ PointsOfFiniteOrderTools(UP, UPUP): Exports == Implementation where
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-PLPKCRV PolynomialPackageForCurve
 \section{package PLPKCRV PolynomialPackageForCurve}
 <<PolynomialPackageForCurve.input>>=
 )set break resume
@@ -155910,6 +156172,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package NAGS NagSpecialFunctionsPackage>>
 <<package NSUP2 NewSparseUnivariatePolynomialFunctions2>>
 <<package NEWTON NewtonInterpolation>>
+<<package NPOLYGON NewtonPolygon>>
 <<package NCODIV NonCommutativeOperatorDivision>>
 <<package NONE1 NoneFunctions1>>
 <<package NODE1 NonLinearFirstOrderODESolver>>
@@ -155992,6 +156255,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package PINTERP PolynomialInterpolation>>
 <<package PINTERPA PolynomialInterpolationAlgorithms>>
 <<package PNTHEORY PolynomialNumberTheoryFunctions>>
+<<package PLPKCRV PolynomialPackageForCurve>>
 <<package POLYROOT PolynomialRoots>>
 <<package PSETPK PolynomialSetUtilitiesPackage>>
 <<package SOLVEFOR PolynomialSolveByFormulas>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 857aba3..68f9504 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24040,6 +24040,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|MyUnivariatePolynomial| . MYUP)
    (|MyExpression| . MYEXPR)
    (|NeitherSparseOrDensePowerSeries| . NSDPS)
+   (|NewtonPolygon| . NPOLYGON)
    (|NoneFunctions1| . NONE1)
    (|NonNegativeInteger| . NNI)
    (|NottinghamGroup| . NOTTING)
diff --git a/books/ps/v104newtonpolygon.eps b/books/ps/v104newtonpolygon.eps
new file mode 100644
index 0000000..c5283b0
--- /dev/null
+++ b/books/ps/v104newtonpolygon.eps
@@ -0,0 +1,266 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Graphviz version 2.20.2 (Mon Mar 30 10:09:11 UTC 2009)
+%%For: (root) root
+%%Title: pic
+%%Pages: 1
+%%BoundingBox: 36 36 140 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 140 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 104 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% NPOLYGON
+gsave
+[ /Rect [ 0 72 96 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=NPOLYGON) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 96 108 moveto
+0 108 lineto
+0 72 lineto
+96 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 96 108 moveto
+0 108 lineto
+0 72 lineto
+96 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+8 85.9 moveto 80 (NPOLYGON) alignedtext
+grestore
+% DIRPCAT
+gsave
+[ /Rect [ 9 0 87 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=DIRPCAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.606 0.733 1.000 nodecolor
+newpath 87 36 moveto
+9 36 lineto
+9 0 lineto
+87 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.606 0.733 1.000 nodecolor
+newpath 87 36 moveto
+9 36 lineto
+9 0 lineto
+87 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+17 13.9 moveto 62 (DIRPCAT) alignedtext
+grestore
+% NPOLYGON->DIRPCAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 48 72 moveto
+48 64 48 55 48 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 51.5 46 moveto
+48 36 lineto
+44.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 51.5 46 moveto
+48 36 lineto
+44.5 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 94cefd7..42d3be7 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100522 tpd src/axiom-website/patches.html 20100522.01.tpd.patch
+20100522 tpd src/algebra/Makefile help and test for NewtonPolygon
+20100522 tpd books/bookvol5 expose NewtonPolygon
+20100522 tpd books/bookvol10.4 add NewtonPolygon
+20100522 tpd books/ps/v104newtonpolygon.eps added
 20100521 tpd src/axiom-website/patches.html 20100521.05.tpd.patch
 20100521 tpd src/algebra/Makefile help and test for PolynomialPackageForCurve
 20100521 tpd books/bookvol5 expose PolynomialPackageForCurve
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 658c107..4db73c5 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -8954,8 +8954,8 @@ 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}/MDAGG.o    ${OUT}/ODPOL.o   \
-  ${OUT}/PLOT.o    ${OUT}/RFP.o      \
+  ${OUT}/FRAMALG.o ${OUT}/FRAMALG-.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   \
   ${OUT}/SMATCAT.o ${OUT}/SMATCAT-.o ${OUT}/TUBETOOL.o ${OUT}/UPXSCCA.o \
   ${OUT}/UPXSCCA-.o \
@@ -9103,6 +9103,23 @@ LAYER12=\
 /*"MDAGG" -> {"BGAGG"; "HOAGG"; "AGG"; "TYPE"; "SETCAT"; "BASTYPE"}*/
 /*"MDAGG" -> {"KOERCE"; "EVALAB"; "IEVALAB"; "CLAGG"; "KONVERT"}*/
 
+"NPOLYGON" [color="#FF4488",href="bookvol10.4.pdf#nameddest=NPOLYGON"]
+/*"NPOLYGON" -> {"RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"}*/
+/*"NPOLYGON" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"}*/
+/*"NPOLYGON" -> {"LMODULE"; "FAMR"; "AMR"; "BMODULE"; "RMODULE"; "COMRING"}*/
+/*"NPOLYGON" -> {"ALGEBRA"; "MODULE"; "CHARZ"; "CHARNZ"; "INTDOM"}*/
+/*"NPOLYGON" -> {"ENTIRER"; "FRETRCT"; "RETRACT"}*/
+"NPOLYGON" -> "DIRPCAT"
+/*"NPOLYGON" -> {"IXAGG"; "HOAGG"; "AGG"; "TYPE"; "EVALAB"; "IEVALAB"}*/
+/*"NPOLYGON" -> {"ELTAGG"; "ELTAB"; "DIFEXT"; "DIFRING"; "PDRING"}*/
+/*"NPOLYGON" -> {"FLINEXP"; "LINEXP"; "FINITE"; "ORDRING"; "OAGROUP"}*/
+/*"NPOLYGON" -> {"OCAMON"; "OAMON"; "OASGP"; "ORDSET"; "OAMONS"; "VSPACE"}*/
+/*"NPOLYGON" -> {"FIELD"; "EUCDOM"; "PID"; "GCDDOM"; "UFD"; "DIVRING"; "INT"}*/
+/*"NPOLYGON" -> {"PI"; "NNI"; "LIST"; "ILIST"; "LSAGG"; "STAGG"; "URAGG"}*/
+/*"NPOLYGON" -> {"RCAGG"; "LNAGG"; "CLAGG"; "KONVERT"; "FLAGG"; "ELAGG"}*/
+/*"NPOLYGON" -> {"OM"; "LSAGG-"; "STAGG-"; "ELAGG-"; "FLAGG-"; "URAGG-"}*/
+/*"NPOLYGON" -> {"BOOLEAN"}*/
+
 "ODPOL" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ODPOL"]
 "ODPOL" -> "DPOLCAT"
 /*"ODPOL" -> {"POLYCAT"; "PDRING"; "RING"; "RNG"; "ABELGRP"; "CABMON"}*/
@@ -16860,6 +16877,21 @@ ${MID}/PLPKCRV.nrlib/code.o: ${MID}/PLPKCRV.spad
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
+<<newcode>>=
+ 
+NPOLYGONDEPS = PFORP
+
+${MID}/NPOLYGON.nrlib/code.o: ${MID}/NPOLYGON.spad
+	@echo P3 making ${MID}/NPOLYGON.nrlib/code.o from ${MID}/NPOLYGON.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${NPOLYGONDEPS} \n )co NPOLYGON.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${NPOLYGONDEPS} \n )co NPOLYGON.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+@
 
 \section{Broken Files}
 These files are Aldor files
@@ -17675,6 +17707,7 @@ SPADHELP=\
  ${HELP}/NagSeriesSummationPackage.help \
  ${HELP}/NagSpecialFunctionsPackage.help \
  ${HELP}/NeitherSparseOrDensePowerSeries.help \
+ ${HELP}/NewtonPolygon.help \
  ${HELP}/None.help \
  ${HELP}/NottinghamGroup.help \
  ${HELP}/Octonion.help \
@@ -17861,6 +17894,7 @@ REGRESS= \
  Multiset.regress \
  MultivariatePolynomial.regress \
  NeitherSparseOrDensePowerSeries.regress \
+ NewtonPolygon.regress \
  None.regress \
  NottinghamGroup.regress \
  Octonion.regress \
@@ -19163,6 +19197,18 @@ ${HELP}/NeitherSparseOrDensePowerSeries.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/NeitherSparseOrDensePowerSeries.input
 	@echo "NeitherSparseOrDensePowerSeries (NSDPS)" >>${HELPFILE}
 
+${HELP}/NewtonPolygon.help: ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7807 create NewtonPolygon.help from \
+            ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"NewtonPolygon.help" \
+            ${BOOKS}/bookvol10.4.pamphlet \
+            >${HELP}/NewtonPolygon.help
+	@cp ${HELP}/NewtonPolygon.help ${HELP}/NPOLYGON.help
+	@${TANGLE} -R"NewtonPolygon.input" \
+            ${BOOKS}/bookvol10.4.pamphlet \
+            >${INPUT}/NewtonPolygon.input
+	@echo "NewtonPolygon (NPOLYGON)" >>${HELPFILE}
+
 ${HELP}/None.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7810 create None.help from ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"None.help" ${BOOKS}/bookvol10.3.pamphlet \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 7626c54..3469ee1 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2779,5 +2779,7 @@ books/ps/v104linesoppack.eps added new bounding box info<br/>
 books/ps/v104rootsfindingpackage.eps add bounding box info<br/>
 <a href="patches/20100521.05.tpd.patch">20100521.05.tpd.patch</a>
 books/bookvol10.4 add PolynomialPackageForCurve<br/>
+<a href="patches/20100522.01.tpd.patch">20100522.01.tpd.patch</a>
+books/bookvol10.4 add NewtonPolygon<br/>
  </body>
 </html>
