diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index 3f0b4fd..3db5c68 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -41947,6 +41947,7 @@ digraph pic {
 
 {\bf See:}
 
+\pageto{LocalPowerSeriesCategory}{LOCPOWC}
 \pageto{UnivariateLaurentSeriesCategory}{ULSCAT}
 \pageto{UnivariatePuiseuxSeriesCategory}{UPXSCAT}
 \pageto{UnivariateTaylorSeriesCategory}{UTSCAT}
@@ -43123,6 +43124,476 @@ digraph pic {
 }
 
 @
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{LocalPowerSeriesCategory}{LOCPOWC}
+\pagepic{ps/v102localpowerseriescategory.ps}{LOCPOWC}{0.70}
+\pagepic{ps/v102pseudoalgebraicclosureofperfectfieldcategory.ps}{PACPERC}{0.50}
+<<LocalPowerSeriesCategory.input>>=
+)set break resume
+)sys rm -f LocalPowerSeriesCategory.output
+)spool LocalPowerSeriesCategory.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show LocalPowerSeriesCategory
+--R LocalPowerSeriesCategory K: Field  is a category constructor
+--R Abbreviation for LocalPowerSeriesCategory is LOCPOWC 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.2.pamphlet to see algebra source code for LOCPOWC 
+--R
+--R------------------------------- Operations --------------------------------
+--R ?*? : (%,K) -> %                      ?*? : (K,%) -> %
+--R ?*? : (Fraction Integer,%) -> %       ?*? : (%,Fraction Integer) -> %
+--R ?*? : (%,%) -> %                      ?*? : (Integer,%) -> %
+--R ?*? : (PositiveInteger,%) -> %        ?**? : (%,Integer) -> %
+--R ?**? : (%,PositiveInteger) -> %       ?+? : (%,%) -> %
+--R ?-? : (%,%) -> %                      -? : % -> %
+--R ?/? : (%,%) -> %                      ?=? : (%,%) -> Boolean
+--R 1 : () -> %                           0 : () -> %
+--R ?^? : (%,Integer) -> %                ?^? : (%,PositiveInteger) -> %
+--R associates? : (%,%) -> Boolean        center : % -> K
+--R coefOfFirstNonZeroTerm : % -> K       coefficient : (%,Integer) -> K
+--R coerce : Fraction Integer -> %        coerce : % -> %
+--R coerce : Integer -> %                 coerce : % -> OutputForm
+--R complete : % -> %                     degree : % -> Integer
+--R delay : (() -> %) -> %                ?.? : (%,Integer) -> K
+--R extend : (%,Integer) -> %             factor : % -> Factored %
+--R filterUpTo : (%,Integer) -> %         findCoef : (%,Integer) -> K
+--R gcd : List % -> %                     gcd : (%,%) -> %
+--R hash : % -> SingleInteger             inv : % -> %
+--R latex : % -> String                   lcm : List % -> %
+--R lcm : (%,%) -> %                      leadingCoefficient : % -> K
+--R leadingMonomial : % -> %              map : ((K -> K),%) -> %
+--R monomial : (K,Integer) -> %           monomial? : % -> Boolean
+--R one? : % -> Boolean                   order : % -> Integer
+--R order : % -> Integer                  order : (%,Integer) -> Integer
+--R pole? : % -> Boolean                  posExpnPart : % -> %
+--R prime? : % -> Boolean                 printInfo : () -> Boolean
+--R printInfo : Boolean -> Boolean        ?quo? : (%,%) -> %
+--R recip : % -> Union(%,"failed")        reductum : % -> %
+--R ?rem? : (%,%) -> %                    removeFirstZeroes : % -> %
+--R removeZeroes : % -> %                 removeZeroes : (Integer,%) -> %
+--R sample : () -> %                      sbt : (%,%) -> %
+--R series : (Integer,K,%) -> %           shift : (%,Integer) -> %
+--R sizeLess? : (%,%) -> Boolean          squareFree : % -> Factored %
+--R squareFreePart : % -> %               truncate : (%,Integer) -> %
+--R unit? : % -> Boolean                  unitCanonical : % -> %
+--R variable : % -> Symbol                zero? : % -> Boolean
+--R ?~=? : (%,%) -> Boolean              
+--R ?*? : (NonNegativeInteger,%) -> %
+--R ?**? : (%,NonNegativeInteger) -> %
+--R ?/? : (%,K) -> % if K has FIELD
+--R D : (%,List Symbol,List NonNegativeInteger) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+--R D : (%,Symbol,NonNegativeInteger) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+--R D : (%,List Symbol) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+--R D : (%,Symbol) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+--R D : (%,NonNegativeInteger) -> % if K has *: (Integer,K) -> K
+--R D : % -> % if K has *: (Integer,K) -> K
+--R ?^? : (%,NonNegativeInteger) -> %
+--R approximate : (%,Integer) -> K if K has **: (K,Integer) -> K and K has coerce: Symbol -> K
+--R characteristic : () -> NonNegativeInteger
+--R charthRoot : % -> Union(%,"failed") if K has CHARNZ
+--R coerce : % -> Stream Record(k: Integer,c: K)
+--R coerce : Stream Record(k: Integer,c: K) -> %
+--R coerce : K -> % if K has COMRING
+--R differentiate : (%,List Symbol,List NonNegativeInteger) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+--R differentiate : (%,Symbol,NonNegativeInteger) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+--R differentiate : (%,List Symbol) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+--R differentiate : (%,Symbol) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+--R differentiate : (%,NonNegativeInteger) -> % if K has *: (Integer,K) -> K
+--R differentiate : % -> % if K has *: (Integer,K) -> K
+--R divide : (%,%) -> Record(quotient: %,remainder: %)
+--R ?.? : (%,%) -> % if Integer has SGROUP
+--R euclideanSize : % -> NonNegativeInteger
+--R eval : (%,K) -> Stream K if K has **: (K,Integer) -> K
+--R expressIdealMember : (List %,%) -> Union(List %,"failed")
+--R exquo : (%,%) -> Union(%,"failed")
+--R extendedEuclidean : (%,%,%) -> Union(Record(coef1: %,coef2: %),"failed")
+--R extendedEuclidean : (%,%) -> Record(coef1: %,coef2: %,generator: %)
+--R gcdPolynomial : (SparseUnivariatePolynomial %,SparseUnivariatePolynomial %) -> SparseUnivariatePolynomial %
+--R monomial : (%,SingletonAsOrderedSet,Integer) -> %
+--R monomial : (%,List SingletonAsOrderedSet,List Integer) -> %
+--R monomial2series : (List %,List NonNegativeInteger,Integer) -> %
+--R multiEuclidean : (List %,%) -> Union(List %,"failed")
+--R multiplyExponents : (%,PositiveInteger) -> %
+--R orderIfNegative : % -> Union(Integer,"failed")
+--R principalIdeal : List % -> Record(coef: List %,generator: %)
+--R subtractIfCan : (%,%) -> Union(%,"failed")
+--R terms : % -> Stream Record(k: Integer,c: K)
+--R truncate : (%,Integer,Integer) -> %
+--R unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+--R variables : % -> List SingletonAsOrderedSet
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<LocalPowerSeriesCategory.help>>=
+====================================================================
+LocalPowerSeriesCategory examples
+====================================================================
+
+See Also:
+o )show LocalPowerSeriesCategory
+
+@
+
+{\bf See:}
+
+\pagefrom{CharacteristicZero}{CHARZ}
+\pagefrom{EuclideanDomain}{EUCDOM}
+\pagefrom{UnivariatePowerSeriesCategory}{UPSCAT}
+
+{\bf Exports:}\\
+
+\begin{tabular}{lll}
+\cross{LOCPOWC}{0} &
+\cross{LOCPOWC}{1} &
+\cross{LOCPOWC}{-?} \\
+\cross{LOCPOWC}{?**?} &
+\cross{LOCPOWC}{?+?} &
+\cross{LOCPOWC}{?-?} \\
+\cross{LOCPOWC}{?.?} &
+\cross{LOCPOWC}{?/?} &
+\cross{LOCPOWC}{?=?} \\
+\cross{LOCPOWC}{?\^{}?} &
+\cross{LOCPOWC}{?\~{}=?} &
+\cross{LOCPOWC}{?quo?} \\
+\cross{LOCPOWC}{?rem?} &
+\cross{LOCPOWC}{D} &
+\cross{LOCPOWC}{approximate} \\
+\cross{LOCPOWC}{associates?} &
+\cross{LOCPOWC}{center} &
+\cross{LOCPOWC}{characteristic} \\
+\cross{LOCPOWC}{charthRoot} &
+\cross{LOCPOWC}{coefOfFirstNonZeroTerm} &
+\cross{LOCPOWC}{coefficient} \\
+\cross{LOCPOWC}{coerce} &
+\cross{LOCPOWC}{complete} &
+\cross{LOCPOWC}{degree} \\
+\cross{LOCPOWC}{delay} &
+\cross{LOCPOWC}{differentiate} &
+\cross{LOCPOWC}{divide} \\
+\cross{LOCPOWC}{euclideanSize} &
+\cross{LOCPOWC}{eval} &
+\cross{LOCPOWC}{expressIdealMember} \\
+\cross{LOCPOWC}{exquo} &
+\cross{LOCPOWC}{extend} &
+\cross{LOCPOWC}{extendedEuclidean} \\
+\cross{LOCPOWC}{factor} &
+\cross{LOCPOWC}{filterUpTo} &
+\cross{LOCPOWC}{findCoef} \\
+\cross{LOCPOWC}{gcd} &
+\cross{LOCPOWC}{gcdPolynomial} &
+\cross{LOCPOWC}{hash} \\
+\cross{LOCPOWC}{inv} &
+\cross{LOCPOWC}{latex} &
+\cross{LOCPOWC}{lcm} \\
+\cross{LOCPOWC}{leadingCoefficient} &
+\cross{LOCPOWC}{leadingMonomial} &
+\cross{LOCPOWC}{map} \\
+\cross{LOCPOWC}{monomial} &
+\cross{LOCPOWC}{monomial2series} &
+\cross{LOCPOWC}{monomial?} \\
+\cross{LOCPOWC}{multiEuclidean} &
+\cross{LOCPOWC}{multiplyExponents} &
+\cross{LOCPOWC}{one?} \\
+\cross{LOCPOWC}{order} &
+\cross{LOCPOWC}{orderIfNegative} &
+\cross{LOCPOWC}{pole?} \\
+\cross{LOCPOWC}{posExpnPart} &
+\cross{LOCPOWC}{prime?} &
+\cross{LOCPOWC}{principalIdeal} \\
+\cross{LOCPOWC}{printInfo} &
+\cross{LOCPOWC}{recip} &
+\cross{LOCPOWC}{reductum} \\
+\cross{LOCPOWC}{removeFirstZeroes} &
+\cross{LOCPOWC}{removeZeroes} &
+\cross{LOCPOWC}{sample} \\
+\cross{LOCPOWC}{sbt} &
+\cross{LOCPOWC}{series} &
+\cross{LOCPOWC}{shift} \\
+\cross{LOCPOWC}{sizeLess?} &
+\cross{LOCPOWC}{squareFree} &
+\cross{LOCPOWC}{squareFreePart} \\
+\cross{LOCPOWC}{subtractIfCan} &
+\cross{LOCPOWC}{terms} &
+\cross{LOCPOWC}{truncate} \\
+\cross{LOCPOWC}{unit?} &
+\cross{LOCPOWC}{unitCanonical} &
+\cross{LOCPOWC}{unitNormal} \\
+\cross{LOCPOWC}{variable} &
+\cross{LOCPOWC}{variables} &
+\cross{LOCPOWC}{zero?} 
+\end{tabular}
+
+{\bf Attributes Exported:}
+\begin{itemize}
+\item {\bf \cross{LOCPOWC}{noZeroDivisors}}
+is true if $x * y \ne 0$ implies both x and y are non-zero.
+\item {\bf \cross{LOCPOWC}{commutative(``*'')}}
+is true if it has an operation $"*": (D,D) -> D$
+which is commutative.
+\item {\bf \cross{LOCPOWC}{unitsKnown}}
+is true if a monoid (a multiplicative semigroup with a 1) has 
+unitsKnown means that  the operation {\tt recip} can only return 
+``failed'' if its argument is not a unit.
+\item {\bf \cross{LOCPOWC}{leftUnitary}}
+is true if $1 * x = x$ for all x.
+\item {\bf \cross{LOCPOWC}{rightUnitary}}
+is true if $x * 1 = x$ for all x.
+\item {\bf \cross{LOCPOWC}{canonicalUnitNormal}}
+is true if we can choose a canonical representative for each class 
+of associate elements, that is {\tt associates?(a,b)} returns true 
+if and only if {\tt unitCanonical(a) = unitCanonical(b)}.
+\item {\bf \cross{LOCPOWC}{canonicalsClosed}}
+is true if\hfill\\
+{\tt unitCanonical(a)*unitCanonical(b) = unitCanonical(a*b)}.
+\end{itemize}
+
+These are directly exported but not implemented
+\begin{verbatim}
+ coefOfFirstNonZeroTerm : % -> K      
+ coerce : % -> Stream Record(k: Integer,c: K)
+ coerce : Stream Record(k: Integer,c: K) -> %
+ delay : (() -> %) -> %               
+ filterUpTo : (%,Integer) -> %        
+ findCoef : (%,Integer) -> K
+ monomial2series : (List %,List NonNegativeInteger,Integer) -> %
+ order : % -> Integer
+ orderIfNegative : % -> Union(Integer,"failed")
+ posExpnPart : % -> %
+ printInfo : () -> Boolean
+ printInfo : Boolean -> Boolean       
+ removeFirstZeroes : % -> %
+ removeZeroes : % -> %                
+ removeZeroes : (Integer,%) -> %
+ sbt : (%,%) -> %
+ series : (Integer,K,%) -> %          
+ shift : (%,Integer) -> %
+\end{verbatim}
+
+These exports come from \refto{UnivariatePowerSeriesCategory}():
+\begin{verbatim}
+ -? : % -> %
+ 0 : () -> %
+ 1 : () -> %                          
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %      
+ ?*? : (%,%) -> %                     
+ ?*? : (%,Fraction Integer) -> %
+ ?*? : (Fraction Integer,%) -> %      
+ ?*? : (Integer,%) -> %
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?+? : (%,%) -> %
+ ?-? : (%,%) -> %                     
+ ?.? : (%,%) -> % if Integer has SGROUP
+ ?.? : (%,Integer) -> K
+ ?/? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %
+ ?~=? : (%,%) -> Boolean              
+ D : % -> % if K has *: (Integer,K) -> K
+ D : (%,List Symbol) -> % 
+     if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+ D : (%,List Symbol,List NonNegativeInteger) -> % 
+     if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+ D : (%,NonNegativeInteger) -> % if K has *: (Integer,K) -> K
+ D : (%,Symbol) -> % if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+ D : (%,Symbol,NonNegativeInteger) -> % 
+     if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+ approximate : (%,Integer) -> K 
+     if K has **: (K,Integer) -> K and K has coerce: Symbol -> K
+ associates? : (%,%) -> Boolean       
+ center : % -> K
+ characteristic : () -> NonNegativeInteger
+ charthRoot : % -> Union(%,"failed") if K has CHARNZ
+ coefficient : (%,Integer) -> K
+ coerce : % -> %
+ coerce : % -> OutputForm
+ coerce : Fraction Integer -> %       
+ coerce : Integer -> %                
+ coerce : K -> % if K has COMRING
+ complete : % -> %                    
+ degree : % -> Integer
+ differentiate : % -> % if K has *: (Integer,K) -> K
+ differentiate : (%,List Symbol) -> % 
+    if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+ differentiate : (%,List Symbol,List NonNegativeInteger) -> % 
+    if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+ differentiate : (%,NonNegativeInteger) -> % 
+    if K has *: (Integer,K) -> K
+ differentiate : (%,Symbol) -> % 
+    if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+ differentiate : (%,Symbol,NonNegativeInteger) -> % 
+    if K has PDRING SYMBOL and K has *: (Integer,K) -> K
+ eval : (%,K) -> Stream K if K has **: (K,Integer) -> K
+ exquo : (%,%) -> Union(%,"failed")
+ extend : (%,Integer) -> %            
+ hash : % -> SingleInteger            
+ latex : % -> String                  
+ leadingCoefficient : % -> K
+ leadingMonomial : % -> %             
+ map : ((K -> K),%) -> %
+ monomial : (%,List SingletonAsOrderedSet,List Integer) -> %
+ monomial : (%,SingletonAsOrderedSet,Integer) -> %
+ monomial : (K,Integer) -> %          
+ monomial? : % -> Boolean
+ multiplyExponents : (%,PositiveInteger) -> %
+ one? : % -> Boolean                  
+ order : % -> Integer                 
+ order : (%,Integer) -> Integer
+ pole? : % -> Boolean                 
+ recip : % -> Union(%,"failed")       
+ reductum : % -> %
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ terms : % -> Stream Record(k: Integer,c: K)
+ truncate : (%,Integer) -> %
+ truncate : (%,Integer,Integer) -> %
+ unit? : % -> Boolean                 
+ unitCanonical : % -> %
+ unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+ variable : % -> Symbol               
+ variables : % -> List SingletonAsOrderedSet
+ zero? : % -> Boolean
+\end{verbatim}
+
+These exports come from \refto{Field}():
+\begin{verbatim}
+ ?**? : (%,Integer) -> %
+ ?*? : (%,K) -> %                     
+ ?*? : (K,%) -> %
+ ?/? : (%,K) -> % if K has FIELD
+ ?^? : (%,Integer) -> %               
+ ?quo? : (%,%) -> %
+ ?rem? : (%,%) -> %                   
+ divide : (%,%) -> Record(quotient: %,remainder: %)
+ euclideanSize : % -> NonNegativeInteger
+ expressIdealMember : (List %,%) -> Union(List %,"failed")
+ extendedEuclidean : (%,%) -> Record(coef1: %,coef2: %,generator: %)
+ extendedEuclidean : (%,%,%) -> Union(Record(coef1: %,coef2: %),"failed")
+ factor : % -> Factored %
+ gcd : (%,%) -> %
+ gcd : List % -> %                    
+ gcdPolynomial :
+  (SparseUnivariatePolynomial %,SparseUnivariatePolynomial %) -> 
+    SparseUnivariatePolynomial %
+ inv : % -> %
+ lcm : (%,%) -> %                     
+ lcm : List % -> %
+ multiEuclidean : (List %,%) -> Union(List %,"failed")
+ prime? : % -> Boolean                
+ principalIdeal : List % -> Record(coef: List %,generator: %)
+ sizeLess? : (%,%) -> Boolean         
+ squareFree : % -> Factored %
+ squareFreePart : % -> %              
+\end{verbatim}
+
+<<category LOCPOWC LocalPowerSeriesCategory>>=
+)abbrev category LOCPOWC LocalPowerSeriesCategory
+LocalPowerSeriesCategory(K:Field):Category == Implementation where
+
+  INT   ==> Integer
+  TERM  ==> Record(k:INT,c:K)
+  SER   ==> Stream(TERM)
+  NNI   ==> NonNegativeInteger
+
+  Implementation ==>
+    Join(Field,UnivariatePowerSeriesCategory(K,INT))  with 
+
+      order: % -> Integer
+        ++ order(s) returns the order of s.
+
+      findCoef: (%,Integer) -> K
+
+      coerce: SER -> %
+
+      coerce: % -> SER
+
+      posExpnPart: % -> %
+        ++ posExpnPart(s) returns the series s less the terms with 
+        ++ negative exponant.
+
+      orderIfNegative: % -> Union(Integer,"failed")
+
+      removeFirstZeroes: % -> %
+    
+      sbt: (%,%) -> %
+
+      delay: ( () -> % ) -> %
+        ++ delay delayed the computation of the next term of the series given
+        ++ by the input function.
+
+      monomial2series: (List %, List NNI, INT) -> %
+        ++ monomial2series(ls,le,n) returns 
+        ++ t**n * reduce("*",[s ** e for s in ls for e in le])
+
+      removeZeroes: (INT,%) -> %
+        ++ removeZeroes(n,s) removes the zero terms in the first n terms of s.
+
+      removeZeroes: % -> %
+        ++ removeZeroes(s) removes the zero terms in  s.
+
+      series: (INT,K,%) -> %
+        ++ series(e,c,s) create the series c*t**e + s.
+
+      shift: (%,INT) -> %
+        ++ shift(s,n) returns t**n * s
+
+      filterUpTo : (%,INT)  -> %
+        ++ filterUpTo(s,n) returns the series consisting of the terms 
+        ++ of s having degree strictly less than n.
+      
+      coefOfFirstNonZeroTerm: % -> K
+        ++ coefOfFirstNonZeroTerm(s) returns the first non zero coefficient 
+        ++ of the series.
+
+      printInfo: Boolean -> Boolean
+        ++ printInfo(b) set a flag such that when true (b <- true) prints 
+        ++ some information during some critical computation.
+
+      printInfo: () -> Boolean
+        ++ returns the value of the \spad{printInfo} flag.
+
+@
+<<LOCPOWC.dotabb>>=
+"LOCPOWC"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=LOCPOWC"];
+"LOCPOWC" -> "UPSCAT"
+
+@
+<<LOCPOWC.dotfull>>=
+"LocalPowerSeriesCategory(f:Field)"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=LOCPOWC"];
+"LocalPowerSeriesCategory(f:Field)" -> 
+  "UnivariatePowerSeriesCategory(c:Ring,e:OrderedAbelianMonoid)"
+
+@
+<<LOCPOWC.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"LocalPowerSeriesCategory(f:Field)" [color=lightblue];
+"LocalPowerSeriesCategory(f:Field)" -> 
+  "UnivariatePowerSeriesCategory(c:Ring,e:OrderedAbelianMonoid)"
+
+"Ring" [color=lightblue];
+"OrderedAbelianMonoid"  [color=lightblue];
+
+}
+
+@
+
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{PAdicIntegerCategory}{PADICCT}
 \pagepic{ps/v102padicintegercategory.ps}{PADICCT}{0.70}
@@ -75383,6 +75854,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<category LODOCAT LinearOrdinaryDifferentialOperatorCategory>>
 <<category LFCAT LiouvillianFunctionCategory>>
 <<category LSAGG ListAggregate>>
+<<category LOCPOWC LocalPowerSeriesCategory>>
 <<category LOGIC Logic>>
 
 <<category MATCAT MatrixCategory>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index d8f951b..c79ee67 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24427,6 +24427,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|LinearOrdinaryDifferentialOperatorCategory| . LODOCAT)
    (|LiouvillianFunctionCategory| . LFCAT)
    (|ListAggregate| . LSAGG)
+   (|LocalPowerSeriesCategory| . LOCPOWC)
    (|Logic| . LOGIC)
    (|MatrixCategory| . MATCAT)
    (|Module| . MODULE)
diff --git a/books/ps/v102localpowerseriescategory.ps b/books/ps/v102localpowerseriescategory.ps
new file mode 100644
index 0000000..bfe6592
--- /dev/null
+++ b/books/ps/v102localpowerseriescategory.ps
@@ -0,0 +1,263 @@
+%!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: (atend)
+%%BoundingBox: (atend)
+%%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 134 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 98 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% LOCPOWC
+gsave
+[ /Rect [ 0 72 90 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=LOCPOWC) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 90 108 moveto
+0 108 lineto
+0 72 lineto
+90 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 90 108 moveto
+0 108 lineto
+0 72 lineto
+90 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+8 85.9 moveto 74 (LOCPOWC) alignedtext
+grestore
+% UPSCAT
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 81 36 moveto
+9 36 lineto
+9 0 lineto
+81 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 81 36 moveto
+9 36 lineto
+9 0 lineto
+81 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+17 13.9 moveto 56 (UPSCAT) alignedtext
+grestore
+% LOCPOWC->UPSCAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 45 72 moveto
+45 64 45 55 45 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 48.5 46 moveto
+45 36 lineto
+41.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 48.5 46 moveto
+45 36 lineto
+41.5 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+%%BoundingBox: 36 36 134 152
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 1d80e34..46f3ba8 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100511 tpd src/axiom-website/patches.html 20100511.07.tpd.patch
+20100511 tpd src/algebra/Makefile help and test files for LOCPOWC
+20100511 tpd books/bookvol5 expose LocalPowerSeriesCategory	
+20100511 tpd books/bookvol10.2 add LocalPowerSeriesCategory
+20100511 tpd books/ps/v102localpowerseriescategory.ps added
 20100511 tpd src/axiom-website/patches.html 20100511.06.tpd.patch
 20100511 tpd src/input/Makefile remove duplicate curl.input invocation
 20100511 tpd src/axiom-website/patches.html 20100511.05.tpd.patch
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 80f7d2f..12e67c6 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -4326,7 +4326,8 @@ Used by next layer: IVECTOR PTCAT STRICAT
 
 LAYER9=\
   ${OUT}/BITS.o    ${OUT}/DIRPROD2.o ${OUT}/IMATRIX.o  ${OUT}/INTRVL.o  \
-  ${OUT}/IVECTOR.o ${OUT}/LODO1.o    ${OUT}/LODO2.o    ${OUT}/LPOLY.o   \
+  ${OUT}/IVECTOR.o ${OUT}/LOCPOWC.o  \
+  ${OUT}/LODO1.o   ${OUT}/LODO2.o    ${OUT}/LPOLY.o   \
   ${OUT}/LSMP.o    ${OUT}/LSMP1.o    ${OUT}/MATCAT2.o  \
   ${OUT}/PTCAT.o   ${OUT}/STRICAT.o  ${OUT}/TRIMAT.o  \
   layer9done
@@ -4396,6 +4397,19 @@ LAYER9=\
 /*"IVECTOR" -> {"OAGROUP"; "OCAMON"; "OAMON"; "OASGP"; "DIFRING"; "RETRACT"}*/
 /*"IVECTOR" -> {"LINEXP"; "PATMAB"; "CFCAT"; "REAL"; "CHARZ"; "STEP"; "OM"}*/
 
+"LOCPOWC" [color="#4488FF",href="bookvol10.2.pdf#nameddest=LOCPOWC"]
+/*"LOCPOWC" -> {"FIELD"; "EUCDOM"; "PID"; "GCDDOM"; "INTDOM"}*/
+/*"LOCPOWC" -> {"COMRING"; "RING"; "RNG"; "ABELGRP"; "CABMON"*/
+/*"LOCPOWC" -> {"ABELMON"; "ABELSG"; "SETCAT"; "BASTYPE"; "KOERCE"}*/
+/*"LOCPOWC" -> {"SGROUP"; "MONOID"; "LMODULE"; "BMODULE"; "RMODULE"}*/
+/*"LOCPOWC" -> {"ALGEBRA"; "MODULE"; "ENTIRER"; "UFD"; "DIVRING"}*/
+/*"LOCPOWC" -> {"INS"; "OINTDOM"; "ORDRING"; "OAGROUP"; "OCAMON"}*/
+/*"LOCPOWC" -> {"OAMON"; "OASGP"; "ORDSET"; "DIFRING"; "KONVERT"}*/
+/*"LOCPOWC" -> {"RETRACT"; "LINEXP"; "PATMAB"; "CFCAT"; "REAL"}*/
+/*"LOCPOWC" -> {"CHARZ"; "STEP"}*/
+"LOCPOWC" -> "UPSCAT"
+/*"LOCPOWC" -> {"PSCAT"; "AMR"; "CHARNZ"; "ELTAB"; "PDRING"}*/
+
 "LODO1" [color="#88FF44",href="bookvol10.3.pdf#nameddest=LODO1"]
 /*"LODO1" -> {"DIFRING"; "RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"}*/
 /*"LODO1" -> {"ABELSG"; "SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"}*/
@@ -16892,6 +16906,7 @@ SPADHELP=\
  ${HELP}/LinearOrdinaryDifferentialOperator2.help \
  ${HELP}/List.help \
  ${HELP}/LinesOpPack.help \
+ ${HELP}/LocalPowerSeriesCategory.help \
  ${HELP}/LyndonWord.help \
  ${HELP}/Magma.help \
  ${HELP}/MakeFunction.help \
@@ -17062,6 +17077,7 @@ REGRESS= \
  LinearOrdinaryDifferentialOperator2.regress \
  List.regress \
  LinesOpPack.regress \
+ LocalPowerSeriesCategory.regress \
  LyndonWord.regress \
  Magma.regress \
  MathMLFormat.regress \
@@ -17894,6 +17910,18 @@ ${HELP}/LinesOpPack.help: ${BOOKS}/bookvol10.4.pamphlet
             >${INPUT}/LinesOpPack.input
 	@echo "LinesOpPack (LOP)" >>${HELPFILE}
 
+${HELP}/LocalPowerSeriesCategory.help: ${BOOKS}/bookvol10.2.pamphlet
+	@echo 7577 create LocalPowerSeriesCategory.help from \
+            ${BOOKS}/bookvol10.2.pamphlet
+	@${TANGLE} -R"LocalPowerSeriesCategory.help" \
+            ${BOOKS}/bookvol10.2.pamphlet \
+            >${HELP}/LocalPowerSeriesCategory.help
+	@cp ${HELP}/LocalPowerSeriesCategory.help ${HELP}/LOCPOWC.help
+	@${TANGLE} -R"LocalPowerSeriesCategory.input" \
+            ${BOOKS}/bookvol10.2.pamphlet \
+            >${INPUT}/LocalPowerSeriesCategory.input
+	@echo "LocalPowerSeriesCategory (LOCPOWC)" >>${HELPFILE}
+
 ${HELP}/LyndonWord.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7570 create LyndonWord.help from \
             ${BOOKS}/bookvol10.3.pamphlet
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 8fee62d..c0f6928 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2695,5 +2695,7 @@ books/bookvolbib add Soren L. Buhl [Buh05]<br/>
 src/input/curry.input add regression test<br/>
 <a href="patches/20100511.06.tpd.patch">20100511.06.tpd.patch</a>
 src/input/Makefile remove duplicate curl.input invocation<br/>
+<a href="patches/20100511.07.tpd.patch">20100511.07.tpd.patch</a>
+books/bookvol10.2 add LocalPowerSeriesCategory<br/>
  </body>
 </html>
