diff --git a/books/bookvol10.3.pamphlet b/books/bookvol10.3.pamphlet
index 41005c6..ffc18ab 100644
--- a/books/bookvol10.3.pamphlet
+++ b/books/bookvol10.3.pamphlet
@@ -25750,6 +25750,425 @@ DirectProductModule(n, R, S): DPcategory == DPcapsule where
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain DIRRING DirichletRing}
+The Dirichlet Ring is the ring of arithmetical functions
+$$ f: \mathbb N_+ \rightarrow R$$
+(see {\bf \verb|http://en.wikipedia.org/wiki/Arithmetic_function|}) together
+with the Dirichlet convolution (see
+{\bf \verb|http://en.wikipedia.org/wiki/Dirichlet_convolution|}) as
+multiplication and component-wise addition.  Since we can consider
+the values an arithmetic functions assumes as the coefficients of a
+Dirichlet generating series, we call $R$ the coefficient ring of a
+function.
+
+In general we only assume that the coefficient ring $R$ is a ring.
+If $R$ happens to be commutative, then so is the Dirichlet ring, and
+in this case it is even an algebra.
+
+Apart from the operations inherited from those categories, we only
+provide some convenient coercion functions.
+
+<<DirichletRing.input>>=
+)set break resume
+)sys rm -f DirichletRing.output
+)spool DirichletRing.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 21
+t1:DIRRING INT := (n:PI):INT +-> moebiusMu n
+--R 
+--R
+--R   (1)  [1,- 1,- 1,0,- 1,1,- 1,0,0,1,...]
+--R                                                  Type: DirichletRing Integer
+--E 1
+
+--S 2 of 21
+[t1.i for i in 1..4]
+--R 
+--R
+--R   (2)  [1,- 1,- 1,0]
+--R                                                           Type: List Integer
+--E 2
+
+--S 3 of 21
+t2:DIRRING INT := [moebiusMu n for n in 1..]
+--R 
+--R
+--R   (3)  [1,- 1,- 1,0,- 1,1,- 1,0,0,1,...]
+--R                                                  Type: DirichletRing Integer
+--E 3
+
+--S 4 of 21
+[t2.i for i in 1..4]
+--R 
+--R
+--R   (4)  [1,- 1,- 1,0]
+--R                                                           Type: List Integer
+--E 4
+
+--S 5 of 21
+DIRRING INT has CommutativeRing
+--R 
+--R
+--R   (5)  true
+--R                                                                Type: Boolean
+--E 5
+
+--S 6 of 21
+mu:DIRRING FRAC INT := (n:PI):FRAC INT +-> moebiusMu n
+--R 
+--R
+--R   (6)  [1,- 1,- 1,0,- 1,1,- 1,0,0,1,...]
+--R                                         Type: DirichletRing Fraction Integer
+--E 6
+
+--S 7 of 21
+phi:DIRRING FRAC INT := (n:PI):FRAC INT +-> eulerPhi n
+--R 
+--R
+--R   (7)  [1,1,2,2,4,2,6,4,6,4,...]
+--R                                         Type: DirichletRing Fraction Integer
+--E 7
+
+--S 8 of 21
+t3:=[(recip mu * phi).n for n in 1..10]
+--R 
+--R
+--R   (8)  [1,2,3,4,5,6,7,8,9,10]
+--R                                                  Type: List Fraction Integer
+--E 8
+
+--S 9 of 21
+t4:=[(phi * recip mu).n for n in 1..10]
+--R 
+--R
+--R   (9)  [1,2,3,4,5,6,7,8,9,10]
+--R                                                  Type: List Fraction Integer
+--E 9
+
+--S 10 of 21
+reduce(_and,[(x = y)@Boolean for x in t3 for y in t4])
+--R 
+--R
+--R   (10)  true
+--R                                                                Type: Boolean
+--E 10
+
+--S 11 of 21
+DIRRING FRAC INT has Algebra FRAC INT
+--R 
+--R
+--R   (11)  true
+--R                                                                Type: Boolean
+--E 11
+
+--S 12 of 21
+t5:=[(1/2 * phi).n for n in 1..10]
+--R 
+--R
+--R          1 1
+--R   (12)  [-,-,1,1,2,1,3,2,3,2]
+--R          2 2
+--R                                                  Type: List Fraction Integer
+--E 12
+
+--S 13 of 21
+t6:=[eulerPhi n/2 for n in 1..10]
+--R 
+--R
+--R          1 1
+--R   (13)  [-,-,1,1,2,1,3,2,3,2]
+--R          2 2
+--R                                                  Type: List Fraction Integer
+--E 13
+
+--S 14 of 21
+reduce(_and,[(x = y)@Boolean for x in t5 for y in t6])
+--R 
+--R
+--R   (14)  true
+--R                                                                Type: Boolean
+--E 14
+
+--S 15 of 21
+t7:=[(recip mu).n for n in 1..10]
+--R 
+--R
+--R   (15)  [1,1,1,1,1,1,1,1,1,1]
+--R                                                  Type: List Fraction Integer
+--E 15
+
+--S 16 of 21
+t8:=[1 for n in 1..10]
+--R 
+--R
+--R   (16)  [1,1,1,1,1,1,1,1,1,1]
+--R                                                   Type: List PositiveInteger
+--E 16
+
+--S 17 of 21
+reduce(_and,[(x = y)@Boolean for x in t7 for y in t8])
+--R 
+--R
+--R   (17)  true
+--R                                                                Type: Boolean
+--E 17
+
+--S 18 of 21
+t9:=[(recip mu * phi).n for n in 1..10]
+--R 
+--R
+--R   (18)  [1,2,3,4,5,6,7,8,9,10]
+--R                                                  Type: List Fraction Integer
+--E 18
+
+--S 19 of 21
+t10:=[n for n in 1..10]
+--R 
+--R
+--R   (19)  [1,2,3,4,5,6,7,8,9,10]
+--R                                                   Type: List PositiveInteger
+--E 19
+
+--S 20 of 21
+reduce(_and,[(x = y)@Boolean for x in t9 for y in t10])
+--R 
+--R
+--R   (20)  true
+--R                                                                Type: Boolean
+--E 20
+
+--S 21 of 21
+)show DirichletRing
+--R DirichletRing Coef: Ring  is a domain constructor
+--R Abbreviation for DirichletRing is DIRRING 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.3.pamphlet to see algebra source code for DIRRING 
+--R
+--R------------------------------- Operations --------------------------------
+--R ?*? : (%,%) -> %                      ?*? : (Integer,%) -> %
+--R ?*? : (PositiveInteger,%) -> %        ?**? : (%,PositiveInteger) -> %
+--R ?+? : (%,%) -> %                      ?-? : (%,%) -> %
+--R -? : % -> %                           ?=? : (%,%) -> Boolean
+--R 1 : () -> %                           0 : () -> %
+--R ?^? : (%,PositiveInteger) -> %        coerce : % -> Stream Coef
+--R coerce : Stream Coef -> %             coerce : Integer -> %
+--R coerce : % -> OutputForm              ?.? : (%,PositiveInteger) -> Coef
+--R hash : % -> SingleInteger             latex : % -> String
+--R one? : % -> Boolean                   recip : % -> Union(%,"failed")
+--R sample : () -> %                      zero? : % -> Boolean
+--R zeta : () -> %                        ?~=? : (%,%) -> Boolean
+--R ?*? : (%,Coef) -> % if Coef has COMRING
+--R ?*? : (Coef,%) -> % if Coef has COMRING
+--R ?*? : (NonNegativeInteger,%) -> %
+--R ?**? : (%,NonNegativeInteger) -> %
+--R ?^? : (%,NonNegativeInteger) -> %
+--R additive? : (%,PositiveInteger) -> Boolean
+--R associates? : (%,%) -> Boolean if Coef has COMRING
+--R characteristic : () -> NonNegativeInteger
+--R coerce : % -> % if Coef has COMRING
+--R coerce : Coef -> % if Coef has COMRING
+--R coerce : % -> (PositiveInteger -> Coef)
+--R coerce : (PositiveInteger -> Coef) -> %
+--R exquo : (%,%) -> Union(%,"failed") if Coef has COMRING
+--R multiplicative? : (%,PositiveInteger) -> Boolean
+--R subtractIfCan : (%,%) -> Union(%,"failed")
+--R unit? : % -> Boolean if Coef has COMRING
+--R unitCanonical : % -> % if Coef has COMRING
+--R unitNormal : % -> Record(unit: %,canonical: %,associate: %) if Coef has COMRING
+--R
+--E 21
+
+)spool
+)lisp (bye)
+@
+<<DirichletRing.help>>=
+====================================================================
+DirichletRing examples
+====================================================================
+
+See Also:
+o )show DirichletRing
+
+@
+
+\pagehead{DirichletRing}{DIRRING}
+\pagepic{ps/v103dirichletring.ps}{DIRRING}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{DIRRING}{0} &
+\cross{DIRRING}{1} &
+\cross{DIRRING}{?*?} &
+\cross{DIRRING}{?**?} &
+\cross{DIRRING}{?+?} \\
+\cross{DIRRING}{?-?} &
+\cross{DIRRING}{-?} &
+\cross{DIRRING}{?=?} &
+\cross{DIRRING}{?\^{}?} &
+\cross{DIRRING}{?.?} \\
+\cross{DIRRING}{?$~=$?} &
+\cross{DIRRING}{additive?} &
+\cross{DIRRING}{associates?} &
+\cross{DIRRING}{characteristic} &
+\cross{DIRRING}{coerce} \\
+\cross{DIRRING}{exquo} &
+\cross{DIRRING}{hash} &
+\cross{DIRRING}{latex} &
+\cross{DIRRING}{multiplicative?} &
+\cross{DIRRING}{one?} \\
+\cross{DIRRING}{recip} &
+\cross{DIRRING}{sample} &
+\cross{DIRRING}{subtractIfCan} &
+\cross{DIRRING}{unit?} &
+\cross{DIRRING}{unitCanonical} \\
+\cross{DIRRING}{unitNormal} &
+\cross{DIRRING}{zero?} &
+\cross{DIRRING}{zeta} &&
+\end{tabular}
+
+<<domain DIRRING DirichletRing>>=
+)abbrev domain DIRRING DirichletRing
+++ Author: Martin Rubey
+++ Description: DirichletRing is the ring of arithmetical functions
+++ with Dirichlet convolution as multiplication
+DirichletRing(Coef: Ring):
+            Exports == Implementation where
+
+    PI ==> PositiveInteger
+    FUN ==> PI -> Coef
+
+    Exports ==> Join(Ring, Eltable(PI, Coef)) with
+
+      if Coef has CommutativeRing then 
+          IntegralDomain
+
+      if Coef has CommutativeRing then 
+          Algebra Coef
+
+      coerce: FUN -> %
+      coerce: % -> FUN
+      coerce: Stream Coef -> %
+      coerce: % -> Stream Coef
+
+      zeta: constant -> %
+        ++ zeta() returns the function which is constantly one
+
+      multiplicative?: (%, PI) -> Boolean
+        ++ multiplicative?(a, n) returns true if the first
+        ++ n coefficients of a are multiplicative 
+
+      additive?: (%, PI) -> Boolean
+        ++ additive?(a, n) returns true if the first
+        ++ n coefficients of a are additive 
+
+    Implementation ==> add
+
+        Rep := Record(function: FUN)
+
+        per(f: Rep): % == f pretend %   
+        rep(a: %): Rep == a pretend Rep 
+
+        elt(a: %, n: PI): Coef ==
+            f: FUN := (rep a).function
+            f n
+
+        coerce(a: %): FUN == (rep a).function
+
+        coerce(f: FUN): % == per [f]
+
+        indices: Stream Integer 
+                := integers(1)$StreamTaylorSeriesOperations(Integer)
+
+        coerce(a: %): Stream Coef ==
+            f: FUN := (rep a).function
+            map((n: Integer): Coef +-> f(n::PI), indices)
+               $StreamFunctions2(Integer, Coef)
+
+        coerce(f: Stream Coef): % == 
+            ((n: PI): Coef +-> f.(n::Integer))::%
+
+        coerce(f: %): OutputForm == f::Stream Coef::OutputForm
+
+        1: % == 
+            ((n: PI): Coef +-> (if one? n then 1$Coef else 0$Coef))::%
+
+        0: % == 
+            ((n: PI): Coef +-> 0$Coef)::%
+
+        zeta: % ==
+            ((n: PI): Coef +-> 1$Coef)::%
+
+        (f: %) + (g: %) == 
+            ((n: PI): Coef +-> f(n)+g(n))::%
+
+        - (f: %) ==
+            ((n: PI): Coef +-> -f(n))::%
+
+        (a: Integer) * (f: %) ==
+            ((n: PI): Coef +-> a*f(n))::%
+
+        (a: Coef) * (f: %) ==
+            ((n: PI): Coef +-> a*f(n))::%
+
+        import IntegerNumberTheoryFunctions
+
+        (f: %) * (g: %) == 
+          conv := (n: PI): Coef +-> _
+            reduce((a: Coef, b: Coef): Coef +-> a + b, _
+              [f(d::PI) * g((n quo d)::PI) for d in divisors(n::Integer)], 0)
+                        $ListFunctions2(Coef, Coef)
+          conv::%
+
+        unit?(a: %): Boolean == not (recip(a(1$PI))$Coef case "failed")
+
+        qrecip: (%, Coef, PI) -> Coef
+        qrecip(f: %, f1inv: Coef, n: PI): Coef ==
+          if one? n then f1inv
+          else 
+              -f1inv * reduce(_+, [f(d::PI) * qrecip(f, f1inv, (n quo d)::PI) _
+                                   for d in rest divisors(n)], 0) _
+                             $ListFunctions2(Coef, Coef)
+
+        recip f ==
+            if (f1inv := recip(f(1$PI))$Coef) case "failed" then "failed"
+            else 
+                mp := (n: PI): Coef +-> qrecip(f, f1inv, n)
+
+                mp::%::Union(%, "failed")
+
+        multiplicative?(a, n) ==
+            for i in 2..n repeat 
+                fl := factors(factor i)$Factored(Integer)
+                rl := [a.(((f.factor)::PI)**((f.exponent)::PI)) for f in fl]
+                if a.(i::PI) ~= reduce((r:Coef, s:Coef):Coef +-> r*s, rl)
+                then 
+                    output(i::OutputForm)$OutputPackage
+                    output(rl::OutputForm)$OutputPackage
+                    return false
+            true
+
+        additive?(a, n) ==
+            for i in 2..n repeat
+                fl := factors(factor i)$Factored(Integer)
+                rl := [a.(((f.factor)::PI)**((f.exponent)::PI)) for f in fl]
+                if a.(i::PI) ~= reduce((r:Coef, s:Coef):Coef +-> r+s, rl)
+                then 
+                    output(i::OutputForm)$OutputPackage
+                    output(rl::OutputForm)$OutputPackage
+                    return false
+            true
+
+@
+<<DIRRING.dotabb>>=
+"DIRRING" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DIRRING"]
+"FLAGG" [color="#4488FF",href="bookvol10.2.pdf#nameddest=FLAGG"]
+"DIRRING" -> "FLAGG"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain DMP DistributedMultivariatePolynomial}
 
 <<DistributedMultivariatePolynomial.input>>=
@@ -147694,6 +148113,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<domain DIRPROD DirectProduct>>
 <<domain DPMM DirectProductMatrixModule>>
 <<domain DPMO DirectProductModule>>
+<<domain DIRRING DirichletRing>>
 <<domain DMP DistributedMultivariatePolynomial>>
 <<domain DIV Divisor>>
 <<domain DFLOAT DoubleFloat>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index fb71ff0..21b4e7a 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -23905,6 +23905,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|DesingTree| . DSTREE)
    (|DesingTreePackage| . DTP)
    (|DiophantineSolutionPackage| . DIOSP)
+   (|DirichletRing| . DIRRING)
    (|DirectProductFunctions2| . DIRPROD2)
    (|DisplayPackage| . DISPLAY)
    (|DistinctDegreeFactorize| . DDFACT)
diff --git a/books/ps/v103dirichletring.ps b/books/ps/v103dirichletring.ps
new file mode 100644
index 0000000..ef04ac9
--- /dev/null
+++ b/books/ps/v103dirichletring.ps
@@ -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 122 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 122 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 86 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% DIRRING
+gsave
+[ /Rect [ 0 72 78 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=DIRRING) >>
+  /Subtype /Link
+/ANN pdfmark
+0.273 0.733 1.000 nodecolor
+newpath 78 108 moveto
+0 108 lineto
+0 72 lineto
+78 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.273 0.733 1.000 nodecolor
+newpath 78 108 moveto
+0 108 lineto
+0 72 lineto
+78 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+8 85.9 moveto 62 (DIRRING) alignedtext
+grestore
+% FLAGG
+gsave
+[ /Rect [ 7 0 71 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=FLAGG) >>
+  /Subtype /Link
+/ANN pdfmark
+0.606 0.733 1.000 nodecolor
+newpath 71 36 moveto
+7 36 lineto
+7 0 lineto
+71 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.606 0.733 1.000 nodecolor
+newpath 71 36 moveto
+7 36 lineto
+7 0 lineto
+71 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+14.5 13.9 moveto 49 (FLAGG) alignedtext
+grestore
+% DIRRING->FLAGG
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 39 72 moveto
+39 64 39 55 39 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 42.5 46 moveto
+39 36 lineto
+35.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 42.5 46 moveto
+39 36 lineto
+35.5 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 49b7b79..f674b9f 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100702 mxr src/axiom-website/patches.html 20100702.01.mxr.patch
+20100702 mxr src/algebra/Makefile test and help for Dirichlet ring
+20100702 mxr books/bookvol5 expose Dirichlet ring
+20100702 mxr books/bookvol10.3 add Dirichlet ring
+20100702 mxr books/ps/v103dirichletring.ps add Dirichlet ring
 20100701 myb src/axiom-website/patches.html 20100701.02.myb.patch
 20100701 myb src/algebra/Makefile test and help files for Export3D
 20100701 myb books/bookvol5 expose Export3D
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index bd287c5..b5eba6c 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -2276,8 +2276,8 @@ LAYER7=\
   ${OUT}/A1AGG.o    ${OUT}/A1AGG-.o   ${OUT}/ARR2CAT.o  ${OUT}/ARR2CAT-.o \
   ${OUT}/ASP34.o    ${OUT}/BBTREE.o   ${OUT}/BFUNCT.o   ${OUT}/BLAS1.o    \
   ${OUT}/BPADIC.o   \
-  ${OUT}/BTREE.o    ${OUT}/CRAPACK.o  ${OUT}/DEQUEUE.o  ${OUT}/DIV.o      \
-  ${OUT}/DLIST.o    \
+  ${OUT}/BTREE.o    ${OUT}/CRAPACK.o  ${OUT}/DEQUEUE.o  ${OUT}/DIRRING.o  \
+  ${OUT}/DIV.o      ${OUT}/DLIST.o    \
   ${OUT}/DRAWCX.o   ${OUT}/DRAWPT.o   ${OUT}/D01GBFA.o  ${OUT}/D02EJFA.o  \
   ${OUT}/D03FAFA.o  ${OUT}/FAMR.o     ${OUT}/FAMR-.o    ${OUT}/FIELD.o    \
   ${OUT}/FLASORT.o  \
@@ -2471,6 +2471,20 @@ LAYER7=\
 "DEQUEUE" -> "FLAGG"
 /*"DEQUEUE" -> "ELAGG"*/
 
+"DIRRING" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DIRRING"]
+"DIRRING" -> "FLAGG"
+/*"DIRRING" -> {"RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"}*/
+/*"DIRRING" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"; "LMODULE"}*/
+/*"DIRRING" -> {"ELTAB"; "INTDOM"; "COMRING"; "BMODULE"; "RMODULE"}*/
+/*"DIRRING" -> {"ALGEBRA"; "MODULE"; "ENTIRER"; "INT"; "INS"; "UFD"}*/
+/*"DIRRING" -> {"GCDDOM"; "EUCDOM"; "PID"; "OINTDOM"; "ORDRING"; "OAGROUP"}*/
+/*"DIRRING" -> {"OCAMON"; "OAMON"; "OASGP"; "ORDSET"; "DIFRING"; "KONVERT"}*/
+/*"DIRRING" -> {"RETRACT"; "LINEXP"; "PATMAB"; "CFCAT"; "REAL"; "CHARZ"}*/
+/*"DIRRING" -> {"STEP"; "PI"; "NNI"; "BOOLEAN"; "LIST"; "ILIST"; "INS-"}*/
+/*"DIRRING" -> {"MONOID-"; "ABELSG-"; "SGROUP-"; "LSAGG"; "STAGG"; "URAGG"}*/
+/*"DIRRING" -> {"RCAGG"; "HOAGG"; "AGG"; "TYPE"; "EVALAB"; IEVALAB"}*/
+/*"DIRRING" -> {"LNAGG"; "IXAGG"; "ELTAGG"; "CLAGG"; "ELAGG"; "OM"; "LSAGG-"}*/
+
 "DIV" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DIV"]
 "DIV" -> "DIVCAT"
 "DIV" -> "FLAGG"
@@ -16473,6 +16487,8 @@ ${MID}/clique2.spad: ${CLIQUE2FILES}
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	    echo ")co clique2.spad" | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
+	@ cp ${MID}/PAFF.nrlib/code.o ${OUT}/PAFF.o
+	@ cp ${MID}/PAFFFF.nrlib/code.o ${OUT}/PAFFFF.o
 	
 @
 \section{Broken Files}
@@ -17303,6 +17319,7 @@ SPADHELP=\
  ${HELP}/DirectProductCategory.help \
  ${HELP}/DirectProductMatrixModule.help \
  ${HELP}/DirectProductModule.help \
+ ${HELP}/DirichletRing.help \
  ${HELP}/DistributedMultivariatePolynomial.help \
  ${HELP}/DivisionRing.help \
  ${HELP}/Divisor.help \
@@ -17989,6 +18006,7 @@ REGRESS= \
  DirectProductCategory.regress \
  DirectProductMatrixModule.regress \
  DirectProductModule.regress \
+ DirichletRing.regress \
  DistributedMultivariatePolynomial.regress \
  DivisionRing.regress \
  Divisor.regress \
@@ -20023,6 +20041,19 @@ ${HELP}/DirectProductModule.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/DirectProductModule.input
 	@echo "DirectProductModule (DPMO)" >>${HELPFILE}
 
+${HELP}/DirichletRing.help: \
+            ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7299 create DirichletRing.help \
+            from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"DirichletRing.help" \
+           ${BOOKS}/bookvol10.3.pamphlet \
+            >${HELP}/DirichletRing.help
+	@cp ${HELP}/DirichletRing.help ${HELP}/DIRRING.help
+	@${TANGLE} -R"DirichletRing.input" \
+           ${BOOKS}/bookvol10.3.pamphlet \
+            >${INPUT}/DirichletRing.input
+	@echo "DirichletRing (DIRRING)" >>${HELPFILE}
+
 ${HELP}/DistributedMultivariatePolynomial.help: \
             ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7299 create DistributedMultivariatePolynomial.help \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index f0f9e15..21506c5 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2960,5 +2960,7 @@ src/input/exampleagcode.input additional PAFF testing<br/>
 src/input/paffexample.input additional PAFF testing<br/>
 <a href="patches/20100701.02.myb.patch">20100701.02.myb.patch</a>
 books/bookvol10.4 add Export3D<br/>
+<a href="patches/20100702.01.mxr.patch">20100702.01.mxr.patch</a>
+books/bookvol10.3 add Dirichlet ring<br/>
  </body>
 </html>
