diff --git a/books/bookvol10.3.pamphlet b/books/bookvol10.3.pamphlet
index 585cb6f..5497719 100644
--- a/books/bookvol10.3.pamphlet
+++ b/books/bookvol10.3.pamphlet
@@ -27955,6 +27955,329 @@ DoubleFloat(): Join(FloatingPointSystem, DifferentialRing, OpenMath,
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain DFMAT DoubleFloatMatrix}
+<<DoubleFloatMatrix.input>>=
+)set break resume
+)sys rm -f DoubleFloatMatrix.output
+)spool DoubleFloatMatrix.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 6
+)show DoubleFloatMatrix
+--R DoubleFloatMatrix  is a domain constructor
+--R Abbreviation for DoubleFloatMatrix is DFMAT 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.3.pamphlet to see algebra source code for DFMAT 
+--R
+--R------------------------------- Operations --------------------------------
+--R ?*? : (Integer,%) -> %                ?*? : (%,DoubleFloat) -> %
+--R ?*? : (DoubleFloat,%) -> %            ?*? : (%,%) -> %
+--R ?+? : (%,%) -> %                      -? : % -> %
+--R ?-? : (%,%) -> %                      antisymmetric? : % -> Boolean
+--R coerce : DoubleFloatVector -> %       copy : % -> %
+--R diagonal? : % -> Boolean              diagonalMatrix : List % -> %
+--R empty : () -> %                       empty? : % -> Boolean
+--R eq? : (%,%) -> Boolean                fill! : (%,DoubleFloat) -> %
+--R horizConcat : (%,%) -> %              maxColIndex : % -> Integer
+--R maxRowIndex : % -> Integer            minColIndex : % -> Integer
+--R minRowIndex : % -> Integer            ncols : % -> NonNegativeInteger
+--R nrows : % -> NonNegativeInteger       parts : % -> List DoubleFloat
+--R qnew : (Integer,Integer) -> %         sample : () -> %
+--R square? : % -> Boolean                squareTop : % -> %
+--R symmetric? : % -> Boolean             transpose : % -> %
+--R vertConcat : (%,%) -> %              
+--R #? : % -> NonNegativeInteger if $ has finiteAggregate
+--R ?*? : (DoubleFloatVector,%) -> DoubleFloatVector
+--R ?*? : (%,DoubleFloatVector) -> DoubleFloatVector
+--R ?**? : (%,Integer) -> % if DoubleFloat has FIELD
+--R ?**? : (%,NonNegativeInteger) -> %
+--R ?/? : (%,DoubleFloat) -> % if DoubleFloat has FIELD
+--R ?=? : (%,%) -> Boolean if DoubleFloat has SETCAT
+--R any? : ((DoubleFloat -> Boolean),%) -> Boolean if $ has finiteAggregate
+--R coerce : % -> OutputForm if DoubleFloat has SETCAT
+--R column : (%,Integer) -> DoubleFloatVector
+--R columnSpace : % -> List DoubleFloatVector if DoubleFloat has EUCDOM
+--R count : (DoubleFloat,%) -> NonNegativeInteger if $ has finiteAggregate and DoubleFloat has SETCAT
+--R count : ((DoubleFloat -> Boolean),%) -> NonNegativeInteger if $ has finiteAggregate
+--R determinant : % -> DoubleFloat if DoubleFloat has commutative *
+--R diagonalMatrix : List DoubleFloat -> %
+--R elt : (%,List Integer,List Integer) -> %
+--R elt : (%,Integer,Integer,DoubleFloat) -> DoubleFloat
+--R elt : (%,Integer,Integer) -> DoubleFloat
+--R eval : (%,List DoubleFloat,List DoubleFloat) -> % if DoubleFloat has EVALAB DFLOAT and DoubleFloat has SETCAT
+--R eval : (%,DoubleFloat,DoubleFloat) -> % if DoubleFloat has EVALAB DFLOAT and DoubleFloat has SETCAT
+--R eval : (%,Equation DoubleFloat) -> % if DoubleFloat has EVALAB DFLOAT and DoubleFloat has SETCAT
+--R eval : (%,List Equation DoubleFloat) -> % if DoubleFloat has EVALAB DFLOAT and DoubleFloat has SETCAT
+--R every? : ((DoubleFloat -> Boolean),%) -> Boolean if $ has finiteAggregate
+--R exquo : (%,DoubleFloat) -> Union(%,"failed") if DoubleFloat has INTDOM
+--R hash : % -> SingleInteger if DoubleFloat has SETCAT
+--R inverse : % -> Union(%,"failed") if DoubleFloat has FIELD
+--R latex : % -> String if DoubleFloat has SETCAT
+--R less? : (%,NonNegativeInteger) -> Boolean
+--R listOfLists : % -> List List DoubleFloat
+--R map : (((DoubleFloat,DoubleFloat) -> DoubleFloat),%,%,DoubleFloat) -> %
+--R map : (((DoubleFloat,DoubleFloat) -> DoubleFloat),%,%) -> %
+--R map : ((DoubleFloat -> DoubleFloat),%) -> %
+--R map! : ((DoubleFloat -> DoubleFloat),%) -> %
+--R matrix : List List DoubleFloat -> %
+--R member? : (DoubleFloat,%) -> Boolean if $ has finiteAggregate and DoubleFloat has SETCAT
+--R members : % -> List DoubleFloat if $ has finiteAggregate
+--R minordet : % -> DoubleFloat if DoubleFloat has commutative *
+--R more? : (%,NonNegativeInteger) -> Boolean
+--R new : (NonNegativeInteger,NonNegativeInteger,DoubleFloat) -> %
+--R nullSpace : % -> List DoubleFloatVector if DoubleFloat has INTDOM
+--R nullity : % -> NonNegativeInteger if DoubleFloat has INTDOM
+--R pfaffian : % -> DoubleFloat if DoubleFloat has COMRING
+--R qelt : (%,Integer,Integer) -> DoubleFloat
+--R qsetelt! : (%,Integer,Integer,DoubleFloat) -> DoubleFloat
+--R rank : % -> NonNegativeInteger if DoubleFloat has INTDOM
+--R row : (%,Integer) -> DoubleFloatVector
+--R rowEchelon : % -> % if DoubleFloat has EUCDOM
+--R scalarMatrix : (NonNegativeInteger,DoubleFloat) -> %
+--R setColumn! : (%,Integer,DoubleFloatVector) -> %
+--R setRow! : (%,Integer,DoubleFloatVector) -> %
+--R setelt : (%,List Integer,List Integer,%) -> %
+--R setelt : (%,Integer,Integer,DoubleFloat) -> DoubleFloat
+--R setsubMatrix! : (%,Integer,Integer,%) -> %
+--R size? : (%,NonNegativeInteger) -> Boolean
+--R subMatrix : (%,Integer,Integer,Integer,Integer) -> %
+--R swapColumns! : (%,Integer,Integer) -> %
+--R swapRows! : (%,Integer,Integer) -> %
+--R transpose : DoubleFloatVector -> %
+--R zero : (NonNegativeInteger,NonNegativeInteger) -> %
+--R ?~=? : (%,%) -> Boolean if DoubleFloat has SETCAT
+--R
+--E 1
+ 
+--S 2 of 6
+a:DFMAT:=qnew(2,3)
+--R
+--R        +0.  0.  0.+
+--R   (1)  |          |
+--R        +0.  0.  0.+
+--R                                                      Type: DoubleFloatMatrix
+--E 2
+
+--S 3 of 6
+qsetelt!(a,1,1,1.0)
+--R
+--R   (2)  1.
+--R                                                            Type: DoubleFloat
+--E 3
+
+--S 4 of 6
+a
+--R
+--R        +0.  0.  0.+
+--R   (3)  |          |
+--R        +0.  1.  0.+
+--R                                                      Type: DoubleFloatMatrix
+--E 4
+
+--S 5 of 6
+qsetelt!(a,0,0,2.0)
+--R
+--R   (4)  2.
+--R                                                            Type: DoubleFloat
+--E 5
+
+--S 6 of 6
+a
+--R
+--R        +2.  0.  0.+
+--R   (5)  |          |
+--R        +0.  1.  0.+
+--R                                                      Type: DoubleFloatMatrix
+--E 6
+
+)spool
+)lisp (bye)
+
+@
+
+<<DoubleFloatMatrix.help>>=
+====================================================================
+DoubleFloatMatrix examples
+====================================================================
+This domain creates a lisp simple array of machine doublefloats.
+It provides one new function called qnew which takes an integer
+that gives the array length.
+
+NOTE: Unlike normal Axiom arrays the DoubleFloatMatrix arrays
+are 0-based so the first element is 0. Axiom arrays normally
+start at 1.
+
+a:DFMAT:=qnew(2,3)
+        +0.  0.  0.+
+        |          |
+        +0.  0.  0.+
+
+qsetelt!(a,1,1,1.0)
+        1.
+
+a
+        +0.  0.  0.+
+        |          |
+        +0.  1.  0.+
+
+qsetelt!(a,0,0,2.0)
+        2.
+
+a
+        +2.  0.  0.+
+        |          |
+        +0.  1.  0.+
+
+
+See Also:
+o )help Float
+o )help DoubleFloat
+o )show DoubleFloatMatrix
+
+@
+\pagehead{DoubleFloatMatrix}{DFMAT}
+\pagepic{ps/v103doublefloatmatrix.eps}{DFMAT}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{llll}
+\cross{DFMAT}{\#?} &
+\cross{DFMAT}{-?} &
+\cross{DFMAT}{?**?} &
+\cross{DFMAT}{?*?} \\
+\cross{DFMAT}{?+?} &
+\cross{DFMAT}{?-?} &
+\cross{DFMAT}{?/?} &
+\cross{DFMAT}{?=?} \\
+\cross{DFMAT}{?\~{}=?} &
+\cross{DFMAT}{antisymmetric?} &
+\cross{DFMAT}{any?} &
+\cross{DFMAT}{coerce} \\
+\cross{DFMAT}{coerce} &
+\cross{DFMAT}{column} &
+\cross{DFMAT}{columnSpace} &
+\cross{DFMAT}{copy} \\
+\cross{DFMAT}{count} &
+\cross{DFMAT}{count} &
+\cross{DFMAT}{determinant} &
+\cross{DFMAT}{diagonal?} \\
+\cross{DFMAT}{diagonalMatrix} &
+\cross{DFMAT}{diagonalMatrix} &
+\cross{DFMAT}{elt} &
+\cross{DFMAT}{elt} \\
+\cross{DFMAT}{elt} &
+\cross{DFMAT}{empty} &
+\cross{DFMAT}{empty?} &
+\cross{DFMAT}{eq?} \\
+\cross{DFMAT}{eval} &
+\cross{DFMAT}{eval} &
+\cross{DFMAT}{eval} &
+\cross{DFMAT}{eval} \\
+\cross{DFMAT}{every?} &
+\cross{DFMAT}{exquo} &
+\cross{DFMAT}{fill!} &
+\cross{DFMAT}{hash} \\
+\cross{DFMAT}{horizConcat} &
+\cross{DFMAT}{inverse} &
+\cross{DFMAT}{latex} &
+\cross{DFMAT}{less?} \\
+\cross{DFMAT}{listOfLists} &
+\cross{DFMAT}{map} &
+\cross{DFMAT}{map} &
+\cross{DFMAT}{map} \\
+\cross{DFMAT}{map!} &
+\cross{DFMAT}{matrix} &
+\cross{DFMAT}{maxColIndex} &
+\cross{DFMAT}{maxRowIndex} \\
+\cross{DFMAT}{member?} &
+\cross{DFMAT}{members} &
+\cross{DFMAT}{minColIndex} &
+\cross{DFMAT}{minRowIndex} \\
+\cross{DFMAT}{minordet} &
+\cross{DFMAT}{more?} &
+\cross{DFMAT}{ncols} &
+\cross{DFMAT}{new} \\
+\cross{DFMAT}{nrows} &
+\cross{DFMAT}{nullSpace} &
+\cross{DFMAT}{nullity} &
+\cross{DFMAT}{parts} \\
+\cross{DFMAT}{pfaffian} &
+\cross{DFMAT}{qelt} &
+\cross{DFMAT}{qnew} &
+\cross{DFMAT}{qsetelt!} \\
+\cross{DFMAT}{rank} &
+\cross{DFMAT}{row} &
+\cross{DFMAT}{rowEchelon} &
+\cross{DFMAT}{sample} \\
+\cross{DFMAT}{scalarMatrix} &
+\cross{DFMAT}{setColumn!} &
+\cross{DFMAT}{setRow!} &
+\cross{DFMAT}{setelt} \\
+\cross{DFMAT}{setelt} &
+\cross{DFMAT}{setsubMatrix!} &
+\cross{DFMAT}{size?} &
+\cross{DFMAT}{square?} \\
+\cross{DFMAT}{squareTop} &
+\cross{DFMAT}{subMatrix} &
+\cross{DFMAT}{swapColumns!} &
+\cross{DFMAT}{swapRows!} \\
+\cross{DFMAT}{symmetric?} &
+\cross{DFMAT}{transpose} &
+\cross{DFMAT}{transpose} &
+\cross{DFMAT}{vertConcat} \\
+\cross{DFMAT}{zero} &&
+\end{tabular}
+
+<<domain DFMAT DoubleFloatMatrix>>=
+)abbrev domain DFMAT DoubleFloatMatrix
+++ Author: Waldek Hebisch
+++ Description: This is a low-level domain which implements matrices
+++ (two dimensional arrays) of double precision floating point
+++ numbers.  Indexing is 0 based, there is no bound checking (unless
+++ provided by lower level).
+DoubleFloatMatrix : MatrixCategory(DoubleFloat,
+                         DoubleFloatVector,
+                         DoubleFloatVector) with
+    qnew : (Integer, Integer) -> %
+      ++ qnew(n, m) creates a new uninitialized n by m matrix.
+      ++
+      ++X t1:DFMAT:=qnew(3,4)
+
+  == add
+
+    Qelt2 ==> DAREF2$Lisp
+    Qsetelt2 ==> DSETAREF2$Lisp
+    Qnrows ==> DANROWS$Lisp
+    Qncols ==> DANCOLS$Lisp
+    Qnew ==> MAKE_-DOUBLE_-MATRIX$Lisp
+    Qnew1 ==> MAKE_-DOUBLE_-MATRIX1$Lisp
+    
+    minRowIndex x == 0
+    minColIndex x == 0
+    nrows x == Qnrows(x)
+    ncols x == Qncols(x)
+    maxRowIndex x == Qnrows(x) - 1
+    maxColIndex x == Qncols(x) - 1
+
+    qelt(m, i, j) == Qelt2(m, i, j)
+    qsetelt_!(m, i, j, r) == Qsetelt2(m, i, j, r)
+
+    empty() == Qnew(0$Integer, 0$Integer)
+    qnew(rows, cols) == Qnew(rows, cols)
+    new(rows, cols, a) == Qnew1(rows, cols, a)
+
+@
+<<DFMAT.dotabb>>=
+"DFMAT" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DFMAT",
+          shape=ellipse]
+"VECTCAT" [color=lightblue,href="bookvol10.2.pdf#nameddest=VECTCAT"];
+"MATCAT" [color=lightblue,href="bookvol10.2.pdf#nameddest=MATCAT"];
+"DFMAT" -> "VECTCAT"
+"DFMAT" -> "MATCAT"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain DFVEC DoubleFloatVector}
 <<DoubleFloatVector.input>>=
 )set break resume
@@ -148745,6 +149068,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<domain DMP DistributedMultivariatePolynomial>>
 <<domain DIV Divisor>>
 <<domain DFLOAT DoubleFloat>>
+<<domain DFMAT DoubleFloatMatrix>>
 <<domain DFVEC DoubleFloatVector>>
 <<domain DROPT DrawOption>>
 <<domain D01AJFA d01ajfAnnaType>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index db0feee..06adeb0 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -23912,6 +23912,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|DistinctDegreeFactorize| . DDFACT)
    (|Divisor| . DIV)
    (|DoubleFloat| . DFLOAT)
+   (|DoubleFloatMatrix| . DFMAT)
    (|DoubleFloatVector| . DFVEC)
    (|DoubleFloatSpecialFunctions| . DFSFUN)
    (|DrawComplex| . DRAWCX)
@@ -38038,6 +38039,50 @@ occupies two positions in the real array.
 
 @
 
+\section{DoubleFloatMatrix}
+\defmacro{make-double-matrix}{DoubleFloatMatrix qnew function support}
+<<defmacro make-double-matrix>>=
+(defmacro make-double-matrix (n m)
+   `(make-array (list ,n ,m) :element-type 'double-float))
+
+@
+
+\defmacro{make-double-matrix1}{DoubleFloatMatrix new function support}
+<<defmacro make-double-matrix1>>=
+(defmacro make-double-matrix1 (n m s)
+   `(make-array (list ,n ,m) :element-type 'double-float
+           :initial-element ,s))
+
+@
+
+\defmacro{daref2}{DoubleFloatMatrix qelt function support}
+<<defmacro daref2>>=
+(defmacro daref2 (v i j)
+   `(aref (the (simple-array double-float (* *)) ,v) ,i ,j))
+
+@
+
+\defmacro{dsetaref2}{DoubleFloatMatrix qsetelt! function support}
+<<defmacro dsetaref2>>=
+(defmacro dsetaref2 (v i j s)
+   `(setf (aref (the (simple-array double-float (* *)) ,v) ,i ,j)
+          ,s))
+
+@
+
+\defmacro{danrows}{DoubleFloatMatrix nrows function support}
+<<defmacro danrows>>=
+(defmacro danrows (v)
+    `(array-dimension (the (simple-array double-float (* *)) ,v) 0))
+
+@
+
+\defmacro{dancols}{DoubleFloatMatrix ncols function support}
+<<defmacro dancols>>=
+(defmacro dancols (v)
+    `(array-dimension (the (simple-array double-float (* *)) ,v) 1))
+
+@
 
 \section{Integer}
 \defun{divide2}{Integer divide function support}
@@ -39693,6 +39738,10 @@ This needs to work off the internal exposure list, not the file.
 <<defmacro cdelt>>
 <<defmacro cdlen>>
 <<defmacro cdsetelt>>
+<<defmacro danrows>>
+<<defmacro dancols>>
+<<defmacro daref2>>
+<<defmacro delt>>
 <<defmacro DFAdd>>
 <<defmacro DFAcos>>
 <<defmacro DFAcosh>>
@@ -39725,14 +39774,16 @@ This needs to work off the internal exposure list, not the file.
 <<defmacro DFTanh>>
 <<defmacro DFUnaryMinus>>
 <<defmacro DFZerop>>
-<<defmacro delt>>
 <<defmacro dlen>>
+<<defmacro dsetaref2>>
 <<defmacro dsetelt>>
 <<defmacro funfind>>
 <<defmacro hget>>
 <<defmacro idChar?>>
 <<defmacro identp>>
 <<defmacro make-cdouble-vector>>
+<<defmacro make-double-matrix>>
+<<defmacro make-double-matrix1>>
 <<defmacro make-double-vector>>
 <<defmacro make-double-vector1>>
 <<defmacro memq>>
diff --git a/books/ps/v103doublefloatmatrix.eps b/books/ps/v103doublefloatmatrix.eps
new file mode 100644
index 0000000..7f5019c
--- /dev/null
+++ b/books/ps/v103doublefloatmatrix.eps
@@ -0,0 +1,303 @@
+%!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 214 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 214 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 178 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% DFMAT
+gsave
+[ /Rect [ 41 72 133 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=DFMAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.273 0.733 1.000 nodecolor
+87 90 45.86 18 ellipse_path fill
+1 setlinewidth
+filled
+0.273 0.733 1.000 nodecolor
+87 90 45.86 18 ellipse_path stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+62 85.9 moveto 50 (DFMAT) alignedtext
+grestore
+% VECTCAT
+gsave
+[ /Rect [ 0 0 80 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=VECTCAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 80 36 moveto
+0 36 lineto
+0 0 lineto
+80 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 80 36 moveto
+0 36 lineto
+0 0 lineto
+80 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 13.9 moveto 65 (VECTCAT) alignedtext
+grestore
+% DFMAT->VECTCAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 75 72 moveto
+70 64 63 54 57 44 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 60.27 42.62 moveto
+52 36 lineto
+54.33 46.34 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 60.27 42.62 moveto
+52 36 lineto
+54.33 46.34 lineto
+closepath stroke
+grestore
+% MATCAT
+gsave
+[ /Rect [ 98 0 170 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=MATCAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.537 0.247 0.902 nodecolor
+newpath 170 36 moveto
+98 36 lineto
+98 0 lineto
+170 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 170 36 moveto
+98 36 lineto
+98 0 lineto
+170 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+105.5 13.9 moveto 57 (MATCAT) alignedtext
+grestore
+% DFMAT->MATCAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 99 72 moveto
+104 64 111 54 117 44 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 119.67 46.34 moveto
+122 36 lineto
+113.73 42.62 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 119.67 46.34 moveto
+122 36 lineto
+113.73 42.62 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 83c88ed..48c5f2e 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100704 wxh src/axiom-website/patches.html 20100704.01.wxh.patch
+20100704 wxh src/algebra/Makefile test and help files for DFMAT
+20100704 wxh books/bookvol5 expose DoubleFloatMatrix and add macros
+20100704 wxh books/bookvol10.3 add DoubleFloatMatrix
+20100704 wxh books/ps/v103doublefloatmatrix.eps added
 20100703 tpd src/axiom-website/patches.html 20100703.06.tpd.patch
 20100703 tpd src/input/Makefile add TESTSET=notests
 20100703 tpd src/axiom-website/patches.html 20100703.05.tpd.patch
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 2a34097..5a16d5c 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -4447,7 +4447,7 @@ Used by next layer: IVECTOR PTCAT STRICAT
 <<layer9>>=
 
 LAYER9=\
-  ${OUT}/AFFPL.o    ${OUT}/BITS.o     ${OUT}/DFVEC.o   \
+  ${OUT}/AFFPL.o    ${OUT}/BITS.o     ${OUT}/DFMAT.o    ${OUT}/DFVEC.o   \
   ${OUT}/DIRPROD2.o ${OUT}/IMATRIX.o  ${OUT}/INTRVL.o  \
   ${OUT}/IVECTOR.o  ${OUT}/LOCPOWC.o  \
   ${OUT}/LODO1.o    ${OUT}/LODO2.o    ${OUT}/LPOLY.o   \
@@ -4482,6 +4482,21 @@ LAYER9=\
 /*"BITS" -> {"RETRACT"; "LINEXP"; "PATMAB"; "CFCAT"; "REAL"; "CHARZ"}*/
 /*"BITS" -> {"STEP"; "OM"}*/
 
+"DFMAT" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DFMAT"]
+"DFMAT" -> "MATCAT"
+"DFMAT" -> "VECTCAT"
+/*"DFMAT" -> {"ARR2CAT"; "HOAGG"; "AGG"; "TYPE"; "SETCAT"; "BASTYPE"}*/
+/*"DFMAT" -> {"KOERCE"; "EVALAB"; "IEVALAB"; "FPS"; "RNS"; "FIELD"}*/
+/*"DFMAT" -> {"EUCDOM"; "PID"; "GCDDOM"; "INTDOM"; "COMRING"; "RING"; "RNG"}*/
+/*"DFMAT" -> {"ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"; "SGROUP"; "MONOID"}*/
+/*"DFMAT" -> {"LMODULE"; "BMODULE"; "RMODULE"; "ALGEBRA"; "MODULE"}*/
+/*"DFMAT" -> {"ENTIRER"; "UFD"; "DIVRING"; "ORDRING"; "OAGROUP"; "OCAMON"}*/
+/*"DFMAT" -> {"OAMON"; "OASGP"; "ORDSET"; "REAL"; "KONVERT"; "RETRACT"}*/
+/*"DFMAT" -> {"RADCAT"; "PATMAB"; "CHARZ"; "A1AGG"; "FLAGG"; "LNAGG"}*/
+/*"DFMAT" -> {"IXAGG"; "ELTAGG"; "ELTAB"; "CLAGG"; "INT"; "DIFRING"; "OM"}*/
+/*"DFMAT" -> {"TRANFUN"; "TRIGCAT"; "ATRIG"; "HYPCAT"; "AHYP"; "ELEMFUN"}*/
+/*"DFMAT" -> {"SPFCAT"}*/
+
 "DFVEC" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DFVEC"]
 "DFVEC" -> "VECTCAT"
 /*"DFVEC" -> {"A1AGG"; "FLAGG"; "LNAGG"; "IXAGG"; "HOAGG"; "AGG"; "TYPE"}*/
@@ -17358,6 +17373,7 @@ SPADHELP=\
  ${HELP}/Divisor.help \
  ${HELP}/DivisorCategory.help \
  ${HELP}/DoubleFloat.help \
+ ${HELP}/DoubleFloatMatrix.help \
  ${HELP}/DoubleFloatVector.help \
  ${HELP}/DoublyLinkedAggregate.help \
  ${HELP}/DrawOption.help \
@@ -18047,6 +18063,7 @@ REGRESS= \
  Divisor.regress \
  DivisorCategory.regress \
  DoubleFloat.regress \
+ DoubleFloatMatrix.regress \
  DoubleFloatVector.regress \
  DoublyLinkedAggregate.regress \
  DrawOption.regress \
@@ -20156,6 +20173,16 @@ ${HELP}/DoubleFloat.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/DoubleFloat.input
 	@echo "DoubleFloat (DFLOAT)" >>${HELPFILE}
 
+${HELP}/DoubleFloatMatrix.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7210 create DoubleFloatMatrix.help from \
+            ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"DoubleFloatMatrix.help" ${BOOKS}/bookvol10.3.pamphlet \
+            >${HELP}/DoubleFloatMatrix.help
+	@cp ${HELP}/DoubleFloatMatrix.help ${HELP}/DFMAT.help
+	@${TANGLE} -R"DoubleFloatMatrix.input" ${BOOKS}/bookvol10.3.pamphlet \
+            >${INPUT}/DoubleFloatMatrix.input
+	@echo "DoubleFloatMatrix (DFMAT)" >>${HELPFILE}
+
 ${HELP}/DoubleFloatVector.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7210 create DoubleFloatVector.help from \
             ${BOOKS}/bookvol10.3.pamphlet
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index b8a78d8..03ed1be 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2978,5 +2978,7 @@ books/bookvol10.4 fix Export3D unit test<br/>
 books/bookvol10.3 fix DoubleFloatVector unit test, help file<br/>
 <a href="patches/20100703.06.tpd.patch">20100703.06.tpd.patch</a>
 src/input/Makefile add TESTSET=notests<br/>
+<a href="patches/20100704.01.wxh.patch">20100704.01.wxh.patch</a>
+books/bookvol10.3 add DoubleFloatMatrix<br/>
  </body>
 </html>
