diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index e7d7e77..8b76c11 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -41730,6 +41730,257 @@ digraph pic {
 @
 \chapter{Category Layer 14}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{DivisorCategory}{DIVCAT}
+\pagepic{ps/v102divisorcategory.ps}{DIVCAT}{0.75}
+
+<<DivisorCategory.input>>=
+)set break resume
+)sys rm -f DivisorCategory.output
+)spool DivisorCategory.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show DivisorCategory
+--R DivisorCategory S: SetCategory  is a category constructor
+--R Abbreviation for DivisorCategory is DIVCAT 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.2.pamphlet to see algebra source code for DIVCAT 
+--R
+--R------------------------------- Operations --------------------------------
+--R ?*? : (Integer,S) -> %                ?*? : (Integer,%) -> %
+--R ?*? : (%,Integer) -> %                ?*? : (Integer,%) -> %
+--R ?*? : (PositiveInteger,%) -> %        ?+? : (S,%) -> %
+--R ?+? : (%,%) -> %                      ?-? : (%,%) -> %
+--R -? : % -> %                           ?<=? : (%,%) -> Boolean
+--R ?=? : (%,%) -> Boolean                0 : () -> %
+--R coefficient : (S,%) -> Integer        coerce : S -> %
+--R coerce : % -> OutputForm              collect : % -> %
+--R concat : (%,%) -> %                   degree : % -> Integer
+--R divOfPole : % -> %                    divOfZero : % -> %
+--R effective? : % -> Boolean             hash : % -> SingleInteger
+--R incr : % -> %                         latex : % -> String
+--R mapGen : ((S -> S),%) -> %            nthCoef : (%,Integer) -> Integer
+--R nthFactor : (%,Integer) -> S          retract : % -> S
+--R sample : () -> %                      size : % -> NonNegativeInteger
+--R split : % -> List %                   supp : % -> List S
+--R suppOfPole : % -> List S              suppOfZero : % -> List S
+--R zero? : % -> Boolean                  ?~=? : (%,%) -> Boolean
+--R ?*? : (NonNegativeInteger,%) -> %
+--R highCommonTerms : (%,%) -> % if Integer has OAMON
+--R mapCoef : ((Integer -> Integer),%) -> %
+--R retractIfCan : % -> Union(S,"failed")
+--R subtractIfCan : (%,%) -> Union(%,"failed")
+--R terms : % -> List Record(gen: S,exp: Integer)
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<DivisorCategory.help>>=
+====================================================================
+DivisorCategory examples
+====================================================================
+
+See Also:
+o )show DivisorCategory
+
+@
+
+{\bf See:}
+
+\pagefrom{OrderedAbelianGroup}{OAGROUP}
+\pagefrom{PrincipalIdealDomain}{PID}
+
+{\bf Exports:}\\
+
+\begin{tabular}{llll}
+\cross{DIVCAT}{0} &
+\cross{DIVCAT}{-?} &
+\cross{DIVCAT}{?*?} &
+\cross{DIVCAT}{?+?} \\
+\cross{DIVCAT}{?-?} &
+\cross{DIVCAT}{?$<=$?} &
+\cross{DIVCAT}{?=?} &
+\cross{DIVCAT}{?\~{}=?} \\
+\cross{DIVCAT}{coefficient} &
+\cross{DIVCAT}{coerce} &
+\cross{DIVCAT}{collect} &
+\cross{DIVCAT}{concat} \\
+\cross{DIVCAT}{degree} &
+\cross{DIVCAT}{divOfPole} &
+\cross{DIVCAT}{divOfZero} &
+\cross{DIVCAT}{effective?} \\
+\cross{DIVCAT}{hash} &
+\cross{DIVCAT}{highCommonTerms} &
+\cross{DIVCAT}{incr} &
+\cross{DIVCAT}{latex} \\
+\cross{DIVCAT}{mapCoef} &
+\cross{DIVCAT}{mapGen} &
+\cross{DIVCAT}{nthCoef} &
+\cross{DIVCAT}{nthFactor} \\
+\cross{DIVCAT}{retract} &
+\cross{DIVCAT}{retractIfCan} &
+\cross{DIVCAT}{sample} &
+\cross{DIVCAT}{size} \\
+\cross{DIVCAT}{split} &
+\cross{DIVCAT}{subtractIfCan} &
+\cross{DIVCAT}{supp} &
+\cross{DIVCAT}{suppOfPole} \\
+\cross{DIVCAT}{suppOfZero} &
+\cross{DIVCAT}{terms} &
+\cross{DIVCAT}{zero?} &
+\end{tabular}
+
+These operations are exported but not implemented:
+\begin{verbatim}
+ ?<=? : (%,%) -> Boolean
+ collect : % -> %
+ concat : (%,%) -> %                  
+ degree : % -> Integer
+ divOfPole : % -> %                   
+ divOfZero : % -> %
+ effective? : % -> Boolean            
+ incr : % -> %                        
+ split : % -> List %                  
+ supp : % -> List S
+ suppOfPole : % -> List S             
+ suppOfZero : % -> List S
+\end{verbatim}
+
+These operations come from \refto{AbelianGroup}:
+\begin{verbatim}
+ 0 : () -> %                          
+ -? : % -> %                          
+ ?*? : (Integer,%) -> %               
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %
+ ?+? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean
+\end{verbatim}
+
+These operations come from \refto{Module}(Integer):
+\begin{verbatim}
+ ?*? : (Integer,%) -> %               
+ ?*? : (%,Integer) -> %               
+\end{verbatim}
+
+These operations come from 
+\refto{FreeAbelianMonoidCategory}(S: SetCategory,E: CancellationAbelianMonoid)
+\begin{verbatim}
+ ?*? : (E,S) -> %                     
+ ?+? : (S,%) -> %                     
+ coefficient : (S,%) -> E             
+ coerce : S -> %
+ highCommonTerms : (%,%) -> % if E has OAMON
+ mapCoef : ((E -> E),%) -> %
+ mapGen : ((S -> S),%) -> %           
+ nthCoef : (%,Integer) -> E
+ nthFactor : (%,Integer) -> S         
+ retract : % -> S
+ retractIfCan : % -> Union(S,"failed")
+ size : % -> NonNegativeInteger
+ terms : % -> List Record(gen: S,exp: E)
+\end{verbatim}
+
+<<category DIVCAT DivisorCategory>>=
+)abbrev category DIVCAT DivisorCategory
+DivisorCategory(S:SetCategory):Category == Exports where
+
+ INT     ==> Integer
+ BOOLEAN ==> Boolean
+ LIST    ==> List
+
+ Exports ==> _
+  Join(AbelianGroup,Module Integer,FreeAbelianMonoidCategory(S,Integer)) with
+
+    degree: % -> INT
+      ++ degree(d) returns the degree of the divisor d
+
+    split: % -> List %
+      ++ split(d) splits the divisor d. For example, 
+      ++ split( 2 p1 + 3p2 ) returns the list [ 2 p1, 3 p2 ].
+
+    "<=" : (%,%) -> BOOLEAN
+
+    collect: % -> %
+      ++ collect collects the duplicative points in the divisor.
+
+    concat: (%,%) -> %
+      ++ concat(a,b) concats the divisor a and b 
+      ++ without collecting the duplicative points.
+
+    effective?: % -> BOOLEAN
+      ++ effective?(d) returns true if d >= 0.
+
+    supp: % -> LIST(S)
+      ++ supp(d) returns the support of the divisor d.
+
+    suppOfZero: % -> LIST(S)
+      ++ suppOfZero(d) returns the elements of the support of d that 
+      ++ have a positive coefficient.
+
+    suppOfPole: % -> LIST(S)
+      ++ suppOfZero(d) returns the elements of the support of d that 
+      ++ have a negative coefficient.
+
+    divOfZero: % -> %
+      ++ divOfZero(d) returns the positive part of d.
+
+    divOfPole: % -> %
+      ++ divOfPole(d) returns the negative part of d.
+
+    incr: % -> %
+
+@
+<<DIVCAT.dotabb>>=
+"DIVCAT" [color=lightblue,href="bookvol10.2.pdf#nameddest=DIVCAT"];
+"OAGROUP" [color=lightblue,href="bookvol10.2.pdf#nameddest=OAGROUP"];
+"PID" [color=lightblue,href="bookvol10.2.pdf#nameddest=PID"];
+"DIVCAT" -> "OAGROUP"
+"DIVCAT" -> "PID"
+
+@
+<<DIVCAT.dotfull>>=
+"DivisorCategory()" [color=lightblue,href="bookvol10.2.pdf#nameddest=DIVCAT"];
+"DivisorCategory()" -> "PrincipalIdealDomain()"
+
+@
+<<DIVCAT.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"DivisorCategory()" [color=lightblue];
+"DivisorCategory()" -> "PrincipalIdealDomain()"
+"DivisorCategory()" -> "OrderedAbelianGroup()"
+
+"PrincipalIdealDomain()" [color=lightblue];
+"PrincipalIdealDomain()" -> "GCDDOM..."
+
+"OrderedAbelianGroup()" [color=lightblue];
+"OrderedAbelianGroup()" -> "OCAMON..."
+"OrderedAbelianGroup()" -> "ABELGRP..."
+
+"GCDDOM..." [color=lightblue];
+"OCAMON..." [color=lightblue];
+"ABELGRP..." [color=lightblue];
+
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{EuclideanDomain}{EUCDOM}
 \pagepic{ps/v102euclideandomain.ps}{EUCDOM}{0.65}
 
@@ -76534,6 +76785,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<category DIFEXT DifferentialExtension>>
 <<category DPOLCAT DifferentialPolynomialCategory>>
 <<category DIFRING DifferentialRing>>
+<<category DIVCAT DivisorCategory>>
 <<category DVARCAT DifferentialVariableCategory>>
 <<category DIRPCAT DirectProductCategory>>
 <<category DIVRING DivisionRing>>
@@ -76771,6 +77023,7 @@ digraph dotabb {
 <<DIFRING.dotabb>>
 <<DIOPS.dotabb>>
 <<DIRPCAT.dotabb>>
+<<DIVCAT.dotabb>>
 <<DIVRING.dotabb>>
 <<DLAGG.dotabb>>
 <<DPOLCAT.dotabb>>
@@ -76992,6 +77245,7 @@ digraph dotfull {
 <<DIFRING.dotfull>>
 <<DIOPS.dotfull>>
 <<DIRPCAT.dotfull>>
+<<DIVCAT.dotfull>>
 <<DIVRING.dotfull>>
 <<DLAGG.dotfull>>
 <<DPOLCAT.dotfull>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 3d3405d..6ea1f0c 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24381,6 +24381,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|DifferentialVariableCategory| . DVARCAT)
    (|DirectProductCategory| . DIRPCAT)
    (|DivisionRing| . DIVRING)
+   (|DivisorCategory| . DIVCAT)
    (|DoublyLinkedAggregate| . DLAGG)
    (|ElementaryFunctionCategory| . ELEMFUN)
    (|Eltable| . ELTAB)
diff --git a/books/ps/v102divisorcategory.ps b/books/ps/v102divisorcategory.ps
new file mode 100644
index 0000000..e89c451
--- /dev/null
+++ b/books/ps/v102divisorcategory.ps
@@ -0,0 +1,418 @@
+%!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 440 224
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 404 188 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% DivisorCategory()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 249 180 moveto
+111 180 lineto
+111 144 lineto
+249 144 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 249 180 moveto
+111 180 lineto
+111 144 lineto
+249 144 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+119 157.9 moveto 122 (DivisorCategory\(\)) alignedtext
+grestore
+% PrincipalIdealDomain()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 170 108 moveto
+0 108 lineto
+0 72 lineto
+170 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 170 108 moveto
+0 108 lineto
+0 72 lineto
+170 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 85.9 moveto 155 (PrincipalIdealDomain\(\)) alignedtext
+grestore
+% DivisorCategory()->PrincipalIdealDomain()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 156 144 moveto
+145 135 130 124 117 114 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 119.1 111.2 moveto
+109 108 lineto
+114.9 116.8 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 119.1 111.2 moveto
+109 108 lineto
+114.9 116.8 lineto
+closepath stroke
+grestore
+% OrderedAbelianGroup()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 364 108 moveto
+188 108 lineto
+188 72 lineto
+364 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 364 108 moveto
+188 108 lineto
+188 72 lineto
+364 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+195.5 85.9 moveto 161 (OrderedAbelianGroup\(\)) alignedtext
+grestore
+% DivisorCategory()->OrderedAbelianGroup()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 204 144 moveto
+216 135 231 124 244 114 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 246.1 116.8 moveto
+252 108 lineto
+241.9 111.2 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 246.1 116.8 moveto
+252 108 lineto
+241.9 111.2 lineto
+closepath stroke
+grestore
+% GCDDOM...
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 133 36 moveto
+37 36 lineto
+37 0 lineto
+133 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 133 36 moveto
+37 36 lineto
+37 0 lineto
+133 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+45 13.9 moveto 80 (GCDDOM...) alignedtext
+grestore
+% PrincipalIdealDomain()->GCDDOM...
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 85 72 moveto
+85 64 85 55 85 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 88.5 46 moveto
+85 36 lineto
+81.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 88.5 46 moveto
+85 36 lineto
+81.5 46 lineto
+closepath stroke
+grestore
+% OCAMON...
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 284 36 moveto
+190 36 lineto
+190 0 lineto
+284 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 284 36 moveto
+190 36 lineto
+190 0 lineto
+284 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+198 13.9 moveto 78 (OCAMON...) alignedtext
+grestore
+% OrderedAbelianGroup()->OCAMON...
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 266 72 moveto
+262 64 257 54 252 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 254.92 43.04 moveto
+247 36 lineto
+248.8 46.44 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 254.92 43.04 moveto
+247 36 lineto
+248.8 46.44 lineto
+closepath stroke
+grestore
+% ABELGRP...
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 396 36 moveto
+302 36 lineto
+302 0 lineto
+396 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 396 36 moveto
+302 36 lineto
+302 0 lineto
+396 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+310 13.9 moveto 78 (ABELGRP...) alignedtext
+grestore
+% OrderedAbelianGroup()->ABELGRP...
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 294 72 moveto
+303 63 314 53 324 43 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 326.4 45.55 moveto
+331 36 lineto
+321.45 40.6 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 326.4 45.55 moveto
+331 36 lineto
+321.45 40.6 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+%%BoundingBox: 36 36 440 224
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 1950416..493fff6 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100517 tpd src/axiom-website/patches.html 20100517.01.tpd.patch
+20100517 tpd src/algebra/Makefile help and test for DivisorCategory
+20100517 tpd books/bookvol5 expose DivisorCategory
+20100517 tpd books/bookvol10.2 add DivisorCategory
+20100517 tpd books/ps/v102divisorcategory.ps added
 20100516 tpd src/axiom-website/patches.html 20100516.06.tpd.patch
 20100516 tpd src/algebra/Makefile help and test AFFPLPS
 20100516 tpd books/bookvol5 expose AFFPLPS
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index df99a85..e99659c 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -1749,7 +1749,8 @@ XFALG
 <<layer6>>=
 
 LAYER6=\
-  ${OUT}/AMR.o      ${OUT}/AMR-.o     ${OUT}/DEGRED.o  ${OUT}/DLP.o      \
+  ${OUT}/AMR.o      ${OUT}/AMR-.o     ${OUT}/DEGRED.o  ${OUT}/DIVCAT.o   \
+  ${OUT}/DLP.o      \
   ${OUT}/EAB.o      ${OUT}/ESTOOLS1.o ${OUT}/FAGROUP.o ${OUT}/FAMONOID.o \
   ${OUT}/FIELD.o    ${OUT}/FIELD-.o   ${OUT}/FLAGG.o   ${OUT}/FLAGG-.o   \
   ${OUT}/FLINEXP.o  ${OUT}/FLINEXP-.o ${OUT}/FRETRCT.o ${OUT}/FRETRCT-.o \
@@ -1801,6 +1802,18 @@ LAYER6=\
 /*"DEGRED" -> {"DIFRING"; "KONVERT"; "RETRACT"; "LINEXP"; "PATMAB"; "CFCAT"}*/
 /*"DEGRED" -> {"REAL"; "CHARZ"; "STEP"; "SINT"}*/
 
+"DIVCAT" [color="#FF4488",href="bookvol10.4.pdf#nameddest=DIVCAT"]
+/*"DIVCAT" -> {"INS"; "UFD"; "GCDDOM"; "INTDOM"; "COMRING"; "RING"; "RNG"}*/
+/*"DIVCAT" -> {"ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"; "SETCAT"; "BASTYPE"}*/
+/*"DIVCAT" -> {"KOERCE"; "SGROUP"; "MONOID"; "LMODULE"; "BMODULE"; "RMODULE"}*/
+/*"DIVCAT" -> {"ALGEBRA"; "MODULE"; "ENTIRER"; "EUCDOM"; "OINTDOM"}*/
+/*"DIVCAT" -> {"ORDRING"}*/
+"DIVCAT" -> "PID"
+"DIVCAT" -> "OAGROUP"
+/*"DIVCAT" -> {"OCAMON"; "OAMON"; "OASGP"; "ORDSET"; "DIFRING"; "KONVERT"}*/
+/*"DIVCAT" -> {"RETRACT"; "LINEXP"; "PATMAB"; "CFCAT"; "REAL"; "CHARZ"}*/
+/*"DIVCAT" -> {"STEP"; "FAMONC"}*/
+
 "DLP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=DLP"]
 /*"DLP" -> {"MONOID"; "SGROUP"; "SETCAT"; "BASTYPE"; "KOERCE"; "FINITE"}*/
 /*"DLP" -> {"INT"; "NNI"; "BOOLEAN"; "SINT"; "PI"; "ABELSG"}*/
@@ -17193,6 +17206,7 @@ SPADHELP=\
  ${HELP}/DecimalExpansion.help \
  ${HELP}/Dequeue.help \
  ${HELP}/DistributedMultivariatePolynomial.help \
+ ${HELP}/DivisorCategory.help \
  ${HELP}/DoubleFloat.help \
  ${HELP}/ElementaryFunction.help \
  ${HELP}/EqTable.help \
@@ -17377,6 +17391,7 @@ REGRESS= \
  DeRhamComplex.regress \
  DecimalExpansion.regress \
  Dequeue.regress \
+ DivisorCategory.regress \
  DoubleFloat.regress \
  ElementaryFunction.regress \
  DistributedMultivariatePolynomial.regress \
@@ -17861,6 +17876,16 @@ ${HELP}/DistributedMultivariatePolynomial.help: \
             >${INPUT}/DistributedMultivariatePolynomial.input
 	@echo "DistributedMultivariatePolynomial (DMP)" >>${HELPFILE}
 
+${HELP}/DivisorCategory.help: ${BOOKS}/bookvol10.2.pamphlet
+	@echo 7205 create DivisorCategory.help from \
+            ${BOOKS}/bookvol10.2.pamphlet
+	@${TANGLE} -R"DivisorCategory.help" ${BOOKS}/bookvol10.2.pamphlet \
+            >${HELP}/DivisorCategory.help
+	@cp ${HELP}/DivisorCategory.help ${HELP}/DIVCAT.help
+	@${TANGLE} -R"DivisorCategory.input" ${BOOKS}/bookvol10.2.pamphlet \
+            >${INPUT}/DivisorCategory.input
+	@echo "DivisorCategory (DIVCAT)" >>${HELPFILE}
+
 ${HELP}/DoubleFloat.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7210 create DoubleFloat.help from ${BOOKS}/bookvol10.3.pamphlet
 	@${TANGLE} -R"DoubleFloat.help" ${BOOKS}/bookvol10.3.pamphlet \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 08a4247..8c8bbdf 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2737,5 +2737,7 @@ books/bookvol10.2 fix AffineSpaceCategory.input NNI bug<br/>
 books/bookvol10.3 add AffinePlane<br/>
 <a href="patches/20100516.06.tpd.patch">20100516.06.tpd.patch</a>
 books/bookvol10.3.AffinePlaneOverPseudoAlgebraicClosureOfFiniteField<br/>
+<a href="patches/20100517.01.tpd.patch">20100517.01.tpd.patch</a>
+books/bookvol10.2 add DivisorCategory<br/>
  </body>
 </html>
