diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index ff7071b..2b910c8 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -30641,6 +30641,282 @@ FiniteDivisorFunctions2(R1, UP1, UPUP1, F1, R2, UP2, UPUP2, F2):
 \end{chunk}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package FFFACTOR FiniteFieldFactorization}
+\begin{chunk}{FiniteFieldFactorization.input}
+)set break resume
+)sys rm -f FiniteFieldFactorization.output
+)spool FiniteFieldFactorization.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show FiniteFieldFactorization
+--R FiniteFieldFactorization(K: FiniteFieldCategory,PolK: UnivariatePolynomialCategory(K))  is a package constructor
+--R Abbreviation for FiniteFieldFactorization is FFFACTOR 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for FFFACTOR 
+--R
+--R------------------------------- Operations --------------------------------
+--R factor : PolK -> Factored(PolK)       irreducible? : PolK -> Boolean
+--R factorCantorZassenhaus : (PolK,NonNegativeInteger) -> List(PolK)
+--R factorSquareFree : PolK -> List(PolK)
+--R factorUsingMusser : PolK -> Factored(PolK)
+--R factorUsingYun : PolK -> Factored(PolK)
+--R
+--E 1
+
+)spool
+)lisp (bye)
+\end{chunk}
+
+\begin{chunk}{FiniteFieldFactorization.help}
+====================================================================
+FiniteFieldFactorization examples
+====================================================================
+
+Part of the package for Algebraic Function Fields in one variable (PAFF)
+
+See Also:
+o )show FiniteFieldFactorization
+
+\end{chunk}
+\pagehead{FiniteFieldFactorization}{FFFACTOR}
+\pagepic{ps/v104finitefieldfactorization.eps}{FFFACTOR}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{FFFACTOR}{factor} &
+\cross{FFFACTOR}{factorCantorZassenhaus} &
+\cross{FFFACTOR}{factorSquareFree} \\
+\cross{FFFACTOR}{factorUsingMusser} &
+\cross{FFFACTOR}{factorUsingYun} &
+\cross{FFFACTOR}{irreducible?}
+\end{tabular}
+
+
+\begin{chunk}{package FFFACTOR FiniteFieldFactorization}
+)abbreviation package FFFACTOR FiniteFieldFactorization
+++ Author: Gaetan Hache
+++ Date Created: 17 nov 1992
+++ Date Last Updated: March 2013 by Tim Daly
+++ Description:
+++ Part of the PAFF package
+FiniteFieldFactorization(K : FiniteFieldCategory,
+                         PolK : UnivariatePolynomialCategory(K)) : with
+
+     factorSquareFree : PolK -> List(PolK)
+
+     factorCantorZassenhaus : (PolK, NonNegativeInteger) -> List(PolK)
+
+     factor : PolK -> Factored(PolK)
+
+     factorUsingYun : PolK -> Factored(PolK)
+
+     factorUsingMusser : PolK -> Factored(PolK)
+
+     irreducible? : PolK -> Boolean
+
+  == add
+
+     import FiniteFieldSquareFreeDecomposition(K, PolK)
+
+     p : NonNegativeInteger := characteristic()$K
+
+     p' : NonNegativeInteger := p quo 2      -- used for odd p : (p-1)/2
+
+     q : NonNegativeInteger := size()$K
+
+     q' : NonNegativeInteger := q quo 2	-- used for odd q : (q-1)/2
+
+     X : PolK := monomial(1, 1)
+
+     primeKdim : NonNegativeInteger :=
+         q_quo_p : NonNegativeInteger := q quo p ;  e : NonNegativeInteger := 1
+         while q_quo_p > 1 repeat (e := e + 1 ; q_quo_p := q_quo_p quo p)
+         e
+     
+     exp(P : PolK, n : NonNegativeInteger, R : PolK) : PolK ==
+        PP : PolK := P rem R ;  Q : PolK := 1
+        repeat
+           if odd?(n) then Q := Q * PP rem R
+           (n := n quo 2) = 0 => leave
+           PP := PP * PP rem  R
+        return Q
+     
+     pPowers(P : PolK) : PrimitiveArray(PolK) ==  -- P is monic
+        n := degree(P)
+        result : PrimitiveArray(PolK) := new(n, 1)
+        result(1) := Qi := Q := exp(X, p, P)
+        for i in 2 .. n-1 repeat (Qi := Qi*Q rem P ; result(i) := Qi)
+        return result
+     
+     pExp(Q : PolK, Xpowers : PrimitiveArray(PolK)) : PolK ==
+         Q' : PolK := 0
+         while Q ^= 0 repeat
+             Q' := Q' +primeFrobenius(leadingCoefficient(Q))*Xpowers(degree(Q))
+             Q := reductum(Q)
+         return Q'
+     
+     pTrace(Q : PolK, d : NonNegativeInteger, P : PolK,
+            Xpowers : PrimitiveArray(PolK)) : PolK ==
+         Q : PolK := Q rem P
+         result : PolK := Q
+         for i in 1 .. d-1 repeat result := Q + pExp(result, Xpowers)
+         return result rem P
+     
+     random(n : NonNegativeInteger) : PolK ==
+        repeat
+           if (deg := (random(n)$Integer)::NonNegativeInteger) > 0 then leave
+        repeat
+           if (x : K := random()$K) ^= 0 then leave
+        result : PolK :=
+           monomial(x, deg) + +/[monomial(random()$K, i) for i in 0 .. deg-1]
+        return result
+     
+     internalFactorCZ(P : PolK,          -- P monic-squarefree
+           d:NonNegativeInteger, Xpowers:PrimitiveArray(PolK)) : List(PolK) ==
+     
+         listOfFactors : List(PolK) := [P]
+         degree(P) = d => return listOfFactors
+         result : List(PolK) := []
+         pDim : NonNegativeInteger := d * primeKdim
+         Q : PolK := P
+     
+         repeat
+             G := pTrace(random(degree(Q)), pDim, Q, Xpowers)
+             if p > 2 then G := exp(G, p', Q) - 1
+             Q1 := gcd(G, Q) ;  d1 := degree(Q1)
+             if d1 > 0 and d1 < degree(Q) then
+                 listOfFactors := rest(listOfFactors)
+                 if d1 = d then result := cons(Q1, result)
+                          else listOfFactors := cons(Q1, listOfFactors)
+                 Q1 := Q quo Q1 ;  d1 := degree(Q1)
+                 if d1 = d then result := cons(Q1, result)
+                          else listOfFactors := cons(Q1, listOfFactors)
+                 if empty?(listOfFactors) then leave
+                 Q := first(listOfFactors)
+         return result
+
+     internalFactorSquareFree(P : PolK):List(PolK) == -- P is monic-squareFree
+         degree(P) = 1 => [P]
+         result : List(PolK) := []
+         Xpowers : PrimitiveArray(PolK) := pPowers(P)
+         S : PolK := Xpowers(1)
+         for j in 1..primeKdim-1 repeat S := pExp(S, Xpowers)
+         for i in 1 .. repeat  -- S = X**(q**i) mod P
+             if degree(R := gcd(S - X, P)) > 0 then
+                 result := concat(internalFactorCZ(R, i, Xpowers), result)
+                 if degree (P) = degree (R) then return result
+                 P := P quo R
+                 if i >= degree(P) quo 2 then return cons(P, result)
+                 for j in 0 .. degree(P)-1 repeat Xpowers(j):=Xpowers(j) rem P
+                 S := S rem P
+             else if i >= degree(P) quo 2 then return cons(P, result)
+             for j in 1 .. primeKdim repeat S := pExp(S, Xpowers)
+     
+     internalFactor(P:PolK, sqrfree:PolK -> Factored(PolK)) : Factored(PolK) ==
+         result : Factored(PolK)
+         if (d := minimumDegree(P)) > 0 then
+             P := P quo monomial(1, d)
+             result := primeFactor(X, d)
+         else
+             result := 1
+         degree(P) = 0 => P * result
+         if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+         degree(P) = 1 => lcP::PolK * primeFactor(P, 1) * result
+         sqfP : Factored(PolK) := sqrfree(P)
+         for x in factors(sqfP) repeat
+             xFactors : List(PolK) := internalFactorSquareFree(x.factor)
+             result:= result * */[primeFactor(Q, x.exponent) for Q in xFactors]
+         return lcP::PolK * result
+     
+     factorUsingYun(P : PolK) : Factored(PolK) == internalFactor(P, Yun)
+
+     factorUsingMusser(P : PolK) : Factored(PolK) == internalFactor(P, Musser)
+
+     factor(P : PolK) : Factored(PolK) == factorUsingYun(P)
+     
+     factorSquareFree(P : PolK) : List(PolK) ==
+        degree(P) = 0 => []
+        discriminant(P) = 0 => error("factorSquareFree : non quadratfrei")
+        if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+        return internalFactorSquareFree(P)
+     
+     factorCantorZassenhaus(P : PolK, d : NonNegativeInteger) : List(PolK) ==
+        if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+        degree(P) = 1 => [P]
+        return internalFactorCZ(P, d, pPowers(P))
+     
+     qExp(Q : PolK, XqPowers : PrimitiveArray(PolK)) : PolK ==
+        Q' : PolK := 0
+        while Q ^= 0 repeat
+           Q' := Q' + leadingCoefficient(Q) * XqPowers(degree(Q))
+           Q := reductum(Q)
+        return Q'
+
+     qPowers (Xq : PolK, P : PolK) : PrimitiveArray(PolK) == -- Xq = X**q mod P
+        n := degree(P)
+        result : PrimitiveArray(PolK) := new(n, 1)
+        result(1) := Q := Xq
+        for i in 2 .. n-1 repeat (Q := Q*Xq rem P ; result(i) := Q)
+        return result
+
+     discriminantTest?(P : PolK) : Boolean ==
+         (delta : K := discriminant(P)) = 0 => true
+         StickelbergerTest : Boolean := (delta ** q' = 1) = even?(degree(P))
+         return StickelbergerTest
+
+     evenCharacteristicIrreducible?(P : PolK) : Boolean ==
+         (n := degree(P)) = 0 => false
+         n = 1 => true
+         degree(gcd(P, D(P))) > 0 => false
+         if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+         S : PolK := exp(X, q, P)
+         if degree(gcd(S - X, P)) > 0 then
+            return false
+         if n < 4 then return true
+         maxDegreeToTest : NonNegativeInteger := n quo 2
+         XqPowers : PrimitiveArray(PolK) := qPowers(S, P)
+         for i in 2 .. maxDegreeToTest repeat
+            S := qExp(S, XqPowers)
+            if degree(gcd(S - X, P)) > 0 then
+               return false
+         return true
+
+     oddCharacteristicIrreducible?(P : PolK) : Boolean ==
+         (n := degree(P)) = 0 => false
+         n = 1 => true
+         discriminantTest?(P) => false
+         if (lcP := leadingCoefficient(P)) ^= 1 then P := inv(lcP) * P
+         S : PolK := exp(X, q, P)
+         if degree(gcd(S - X, P)) > 0 then
+            return false
+         if n < 6  then return true
+         maxDegreeToTest : NonNegativeInteger := n quo 3
+         XqPowers : PrimitiveArray(PolK) := qPowers(S, P)
+         for i in 2 .. maxDegreeToTest repeat
+            S := qExp(S, XqPowers)
+            if degree(gcd(S - X, P)) > 0 then
+               return false
+         return true
+
+     if p = 2 then
+
+         irreducible?(P : PolK) : Boolean == evenCharacteristicIrreducible?(P)
+
+     else
+
+         irreducible?(P : PolK) : Boolean == oddCharacteristicIrreducible?(P)
+
+\end{chunk}
+\begin{chunk}{FFFACTOR.dotabb}
+"FFFACTOR" [color="#FF4488",href="bookvol10.4.pdf#nameddest=FFFACTOR"]
+"PFECAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=PFECAT"]
+"FFFACTOR" -> "PFECAT"
+
+\end{chunk}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package FFFACTSE FiniteFieldFactorizationWithSizeParseBySideEffect}
 \begin{chunk}{FiniteFieldFactorizationWithSizeParseBySideEffect.input}
 )set break resume
@@ -174874,6 +175150,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 \getchunk{package FORDER FindOrderFinite}
 \getchunk{package FAMR2 FiniteAbelianMonoidRingFunctions2}
 \getchunk{package FDIV2 FiniteDivisorFunctions2}
+\getchunk{package FFFACTOR FiniteFieldFactorization}
 \getchunk{package FFFACTSE FiniteFieldFactorizationWithSizeParseBySideEffect}
 \getchunk{package FFF FiniteFieldFunctions}
 \getchunk{package FFHOM FiniteFieldHomomorphisms}
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 187deb4..eca5c02 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24330,8 +24330,9 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|FileName| . FNAME)
    (|FiniteAbelianMonoidRingFunctions2| . FAMR2)
    (|FiniteDivisorFunctions2| . FDIV2)
-   (|FiniteFieldFactorizationWithSizeParseBySideEffect| . FFFACTSE)
    (|FiniteField| . FF)
+   (|FiniteFieldFactorization| . FFFACTOR)
+   (|FiniteFieldFactorizationWithSizeParseBySideEffect| . FFFACTSE)
    (|FiniteFieldCyclicGroup| . FFCG)
    (|FiniteFieldPolynomialPackage2| . FFPOLY2)
    (|FiniteFieldNormalBasis| . FFNB)
diff --git a/books/ps/v104finitefieldfactorization.eps b/books/ps/v104finitefieldfactorization.eps
new file mode 100644
index 0000000..f1763ca
--- /dev/null
+++ b/books/ps/v104finitefieldfactorization.eps
@@ -0,0 +1,278 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: graphviz version 2.26.3 (20100126.1600)
+%%Title: pic
+%%Pages: 1
+%%BoundingBox: 36 36 132 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 132 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 96 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 41 translate
+0.16355 0.45339 0.92549 graphcolor
+newpath -4 -5 moveto
+-4 112 lineto
+93 112 lineto
+93 -5 lineto
+closepath fill
+1 setlinewidth
+0.16355 0.45339 0.92549 graphcolor
+newpath -4 -5 moveto
+-4 112 lineto
+93 112 lineto
+93 -5 lineto
+closepath stroke
+% FFFACTOR
+gsave
+[ /Rect [ 0 72 88 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=FFFACTOR) >>
+  /Subtype /Link
+/ANN pdfmark
+0.93939 0.73333 1 nodecolor
+newpath 88 108 moveto
+0 108 lineto
+0 72 lineto
+88 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.93939 0.73333 1 nodecolor
+newpath 88 108 moveto
+0 108 lineto
+0 72 lineto
+88 72 lineto
+closepath stroke
+0 0 0 nodecolor
+14 /Times-Roman set_font
+7.5 86.4 moveto 73 (FFFACTOR) alignedtext
+grestore
+% PFECAT
+gsave
+[ /Rect [ 9 0 79 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=PFECAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.60606 0.73333 1 nodecolor
+newpath 79 36 moveto
+9 36 lineto
+9 0 lineto
+79 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.60606 0.73333 1 nodecolor
+newpath 79 36 moveto
+9 36 lineto
+9 0 lineto
+79 0 lineto
+closepath stroke
+0 0 0 nodecolor
+14 /Times-Roman set_font
+16.5 14.4 moveto 55 (PFECAT) alignedtext
+grestore
+% FFFACTOR->PFECAT
+gsave
+1 setlinewidth
+0 0 0 edgecolor
+newpath 44 71.83 moveto
+44 64.13 44 54.97 44 46.42 curveto
+stroke
+0 0 0 edgecolor
+newpath 47.5 46.41 moveto
+44 36.41 lineto
+40.5 46.41 lineto
+closepath fill
+1 setlinewidth
+solid
+0 0 0 edgecolor
+newpath 47.5 46.41 moveto
+44 36.41 lineto
+40.5 46.41 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index e8de559..e2f9290 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20130321 tpd src/axiom-website/patches.html 20130321.01.tpd.patch
+20130321 tpd books/ps/v104finitefieldfactorization.eps add FFFACTOR
+20130321 tpd src/algebra/Makefile compile FiniteFieldFactorization
+20130321 tpd books/bookvol5 expose FiniteFieldFactorization
+20130321 tpd books/bookvol10.4 add FiniteFieldFactorization
 20130320 tpd src/axiom-website/patches.html 20130320.01.tpd.patch
 20130320 tpd src/input/richhyper200-299.input cleanup
 20130320 tpd src/input/richhyper000-099.input cleanup
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 6811bd9..1f75a01 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -5868,7 +5868,8 @@ LAYER11=\
   ${OUT}/ERROR.o    ${OUT}/EVALCYC.o  ${OUT}/EXP3D.o    \
   ${OUT}/E04DGFA.o  ${OUT}/E04FDFA.o  \
   ${OUT}/E04GCFA.o  ${OUT}/E04JAFA.o  ${OUT}/E04UCFA.o  ${OUT}/FACUTIL.o  \
-  ${OUT}/FF.o       ${OUT}/FFCG.o     ${OUT}/FFCGX.o    ${OUT}/FFFG.o     \
+  ${OUT}/FF.o       ${OUT}/FFFACTOR.o  \
+  ${OUT}/FFCG.o     ${OUT}/FFCGX.o    ${OUT}/FFFG.o     \
   ${OUT}/FFFGF.o    ${OUT}/FFHOM.o    ${OUT}/FFNB.o     ${OUT}/FFNBX.o    \
   ${OUT}/FFPOLY.o   ${OUT}/FFSQFR.o  \
   ${OUT}/FFX.o      ${OUT}/FFSLPE.o   ${OUT}/FGLMICPK.o \
@@ -6714,6 +6715,22 @@ LAYER11=\
 /*"FF" -> {"OCAMON"; "OAMON"; "OASGP"; "ORDSET"; "INS"; "OINTDOM"}*/
 /*"FF" -> {"ORDRING"; "OAGROUP"; "LINEXP"; "PATMAB"; "CFCAT"; "REAL"}*/
 
+"FFFFACTOR"  [color="#FF4488",href="bookvol10.4.pdf#nameddest=FFFFACTOR"]
+/*"FFFACTOR" -> {"FFIELDC", "FPC", "FIELD", "EUCDOM", "PID", "GCDDOM"}*/
+/*"FFFACTOR" -> {"INTDOM", "COMRING", "RING", "RNG", "ABELGRP", "CABMON"}*/
+/*"FFFACTOR" -> {"ABELMON", "ABELSG", "SETCAT", "BASTYPE", "KOERCE","SGROUP"}*/
+/*"FFFACTOR" -> {"MONOID", "LMODULE", "BMODULE", "RMODULE", "ALGEBRA"}*/
+/*"FFFACTOR" -> {"MODULE", "ENTIRER", "UFD", "DIVRING", "CHARNZ", "FINITE"}*/
+/*"FFFACTOR" -> {"STEP", "DIFRING", "UPOLYC", "POLYCAT", "PDRING", "FAMR"}*/
+/*"FFFACTOR" -> {"AMR", "CHARZ", "FRETRCT", "RETRACT", "EVALAB", "IEVALAB"}*/
+/*"FFFACTOR" -> {"FLINEXP", "LINEXP", "ORDSET", "KONVERT", "PATMAB"}*/
+"FFFACTOR" -> "PFECAT"
+/*"FFFACTOR" -> {"ELTAB", "DIFEXT", "NNI", "INT", "PI", "PRIMARR", "A1AGG"}*/
+/*"FFFACTOR" -> {"FLAGG", "LNAGG", "IXAGG", "HOAGG", "AGG", "TYPE", "ELTAGG"}*/
+/*"FFFACTOR" -> {"CLAGG", "BOOLEAN", "SINT", "LIST", "ILIST", "LSAGG-"}*/
+/*"FFFACTOR" -> {"STAGG-", "INS-", "INS", "OINTDOM", "ORDRING", "OAGROUP"}*/
+/*"FFFACTOR" -> {"OCAMON", "OAMON", "OASGP", "CFCAT", "REAL"}*/
+
 "FFCG" [color="#88FF44",href="bookvol10.3.pdf#nameddest=FFCG"]
 "FFCG" -> "FAXF"
 /*"FFCG" -> {"XF"; "FIELD"; "EUCDOM"; "PID"; "GCDDOM"; "INTDOM"}*/
@@ -18083,6 +18100,7 @@ REGRESS= \
  FiniteFieldCyclicGroupExtensionByPolynomial.regress \
  FiniteFieldExtension.regress \
  FiniteFieldExtensionByPolynomial.regress \
+ FiniteFieldFactorization.regress \
  FiniteFieldFactorizationWithSizeParseBySideEffect.regress \
  FiniteFieldFunctions.regress \
  FiniteFieldHomomorphisms.regress \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index a2d0f79..088f509 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -4109,5 +4109,7 @@ fix broken tests
 regression test cleaup
 <a href="patches/20130320.01.tpd.patch">20130320.01.tpd.patch</a>
 regression test cleaup
+<a href="patches/20130321.01.tpd.patch">20130321.01.tpd.patch</a>
+books/bookvol10.4 add FiniteFieldFactorization
  </body>
 </html>
