diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index c974de0..ac95d36 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -4425,22 +4425,23 @@ credits()
 --RAn alphabetical listing of contributors to AXIOM:
 --RMichael Albaugh        Cyril Alberga          Roy Adler
 --RChristian Aistleitner  Richard Anderson       George Andrews
---RS.J. Atkins
+--RS.J. Atkins            
 --RHenry Baker            Martin Baker           Stephen Balzac
 --RYurij Baransky         David R. Barton        Gerald Baumgartner
 --RGilbert Baumslag       Michael Becker         Nelson H. F. Beebe
 --RJay Belanger           David Bindel           Fred Blair
---RVladimir Bondarenko    Mark Botch             Alexandre Bouyer
---RKaren Braman           Peter A. Broadbery     Martin Brock
---RManuel Bronstein       Stephen Buchwald       Florian Bundschuh
---RLuanne Burns           William Burge          Ralph Byers
+--RVladimir Bondarenko    Mark Botch             Raoul Bourquin
+--RAlexandre Bouyer       Karen Braman           Peter A. Broadbery
+--RMartin Brock           Manuel Bronstein       Stephen Buchwald
+--RFlorian Bundschuh      Luanne Burns           William Burge
+--RRalph Byers            
 --RQuentin Carpent        Robert Caviness        Bruce Char
 --ROndrej Certik          Tzu-Yi Chen            Cheekai Chin
 --RDavid V. Chudnovsky    Gregory V. Chudnovsky  Mark Clements
---RJames Cloos            Josh Cohen             Christophe Conil
---RDon Coppersmith        George Corliss         Robert Corless
---RGary Cornell           Meino Cramer           Claire Di Crescenzo
---RJeremy Du Croz         David Cyganski
+--RJames Cloos            Jia Zhao Cong          Josh Cohen
+--RChristophe Conil       Don Coppersmith        George Corliss
+--RRobert Corless         Gary Cornell           Meino Cramer
+--RClaire Di Crescenzo    Jeremy Du Croz         David Cyganski
 --RNathaniel Daly         Timothy Daly Sr.       Timothy Daly Jr.
 --RJames H. Davenport     David Day              James Demmel
 --RDidier Deshommes       Michael Dewar          Jack Dongarra
@@ -4455,7 +4456,7 @@ credits()
 --RKorrinn Fu
 --RMarc Gaetano           Rudiger Gebauer        Van de Geijn
 --RKathy Gerber           Patricia Gianni        Samantha Goldrich
---RHolger Gollan          Teresa Gomez-Diaz      Laureano Gonzalez-Vega
+--RHolger Gollan          Teresa Gomez-Diaz      Laureano Gonzalez-Vega 
 --RStephen Gortler        Johannes Grabmeier     Matt Grayson
 --RKlaus Ebbe Grue        James Griesmer         Vladimir Grinberg
 --ROswald Gschnitzer      Ming Gu                Jocelyn Guidry
@@ -68709,6 +68710,1086 @@ MatrixLinearAlgebraFunctions(R,Row,Col,M):Exports == Implementation where
 
 \end{chunk}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package MAMA MatrixManipulation}
+\begin{chunk}{MatrixManipulation.input}
+)set break resume
+)sys rm -f MatrixManipulation.output
+)spool MatrixManipulation.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 44
+M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+--R 
+--R
+--R        +a  b  c+
+--R        |       |
+--R   (1)  |d  e  f|
+--R        |       |
+--R        +g  h  i+
+--R                                            Type: Matrix(Polynomial(Integer))
+--E 1
+
+--S 2 of 44
+element(M, 2,2)
+--R 
+--R
+--R   (2)  [e]
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 2
+
+--S 3 of 44
+aRow(M, 1)
+--R 
+--R
+--R   (3)  [a  b  c]
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 3
+
+--S 4 of 44
+aRow(M, 2)
+--R 
+--R
+--R   (4)  [d  e  f]
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 4
+
+--S 5 of 44
+aColumn(M, 2)
+--R 
+--R
+--R        +b+
+--R        | |
+--R   (5)  |e|
+--R        | |
+--R        +h+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 5
+
+--S 6 of 44
+aColumn(M, 3)
+--R 
+--R
+--R        +c+
+--R        | |
+--R   (6)  |f|
+--R        | |
+--R        +i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 6
+
+--S 7 of 44
+rows(M, [1,2])
+--R 
+--R
+--R        +a  b  c+
+--R   (7)  |       |
+--R        +d  e  f+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 7
+
+--S 8 of 44
+rows(M, [1,3])
+--R 
+--R
+--R        +a  b  c+
+--R   (8)  |       |
+--R        +g  h  i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 8
+
+--S 9 of 44
+rows(M, [3,2])
+--R 
+--R
+--R        +g  h  i+
+--R   (9)  |       |
+--R        +d  e  f+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 9
+
+--S 10 of 44
+rows(M, 2..3)
+--R 
+--R
+--R         +d  e  f+
+--R   (10)  |       |
+--R         +g  h  i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 10
+
+--S 11 of 44
+columns(M, [1,2])
+--R 
+--R
+--R         +a  b+
+--R         |    |
+--R   (11)  |d  e|
+--R         |    |
+--R         +g  h+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 11
+
+--S 12 of 44
+columns(M, [1,3])
+--R 
+--R
+--R         +a  c+
+--R         |    |
+--R   (12)  |d  f|
+--R         |    |
+--R         +g  i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 12
+
+--S 13 of 44
+columns(M, [3,2])
+--R 
+--R
+--R         +c  b+
+--R         |    |
+--R   (13)  |f  e|
+--R         |    |
+--R         +i  h+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 13
+
+--S 14 of 44
+columns(M, 1..2)
+--R 
+--R
+--R         +a  b+
+--R         |    |
+--R   (14)  |d  e|
+--R         |    |
+--R         +g  h+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 14
+
+--S 15 of 44
+subMatrix(M, [1,2],[1,2])
+--R 
+--R
+--R         +a  b+
+--R   (15)  |    |
+--R         +d  e+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 15
+
+--S 16 of 44
+subMatrix(M, [1,3],[1,3])
+--R 
+--R
+--R         +a  c+
+--R   (16)  |    |
+--R         +g  i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 16
+
+--S 17 of 44
+diagonalMatrix(M)
+--R 
+--R
+--R         +a  0  0+
+--R         |       |
+--R   (17)  |0  e  0|
+--R         |       |
+--R         +0  0  i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 17
+
+--S 18 of 44
+diagonalMatrix(M, 1)
+--R 
+--R
+--R         +0  b  0+
+--R         |       |
+--R   (18)  |0  0  f|
+--R         |       |
+--R         +0  0  0+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 18
+
+--S 19 of 44
+diagonalMatrix(M, 2)
+--R 
+--R
+--R         +0  0  c+
+--R         |       |
+--R   (19)  |0  0  0|
+--R         |       |
+--R         +0  0  0+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 19
+
+--S 20 of 44
+diagonalMatrix(M, -1)
+--R 
+--R
+--R         +0  0  0+
+--R         |       |
+--R   (20)  |d  0  0|
+--R         |       |
+--R         +0  h  0+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 20
+
+--S 21 of 44
+diagonalMatrix(M, -2)
+--R 
+--R
+--R         +0  0  0+
+--R         |       |
+--R   (21)  |0  0  0|
+--R         |       |
+--R         +g  0  0+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 21
+
+--S 22 of 44
+bandMatrix(M, [-1,1])
+--R 
+--R
+--R         +0  b  0+
+--R         |       |
+--R   (22)  |d  0  f|
+--R         |       |
+--R         +0  h  0+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 22
+
+--S 23 of 44
+bandMatrix(M, [-1,0,1])
+--R 
+--R
+--R         +a  b  0+
+--R         |       |
+--R   (23)  |d  e  f|
+--R         |       |
+--R         +0  h  i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 23
+
+--S 24 of 44
+bandMatrix(M, -1..1)
+--R 
+--R
+--R         +a  b  0+
+--R         |       |
+--R   (24)  |d  e  f|
+--R         |       |
+--R         +0  h  i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 24
+
+-- Build a larger matrix
+
+--S 25 of 44
+A := matrix([[a]])
+--R 
+--R
+--R   (25)  [a]
+--R                                            Type: Matrix(Polynomial(Integer))
+--E 25
+
+--S 26 of 44
+B := matrix([[b]])
+--R 
+--R
+--R   (26)  [b]
+--R                                            Type: Matrix(Polynomial(Integer))
+--E 26
+
+--S 27 of 44
+C := matrix([[c]])
+--R 
+--R
+--R   (27)  [c]
+--R                                            Type: Matrix(Polynomial(Integer))
+--E 27
+
+--S 28 of 44
+A11 := element(M, 3,3)
+--R 
+--R
+--R   (28)  [i]
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 28
+
+--S 29 of 44
+A12 := horizConcat([A,B,C])
+--R 
+--R
+--R   (29)  [a  b  c]
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 29
+
+--S 30 of 44
+A21 := vertConcat([A,B,C])
+--R 
+--R
+--R         +a+
+--R         | |
+--R   (30)  |b|
+--R         | |
+--R         +c+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 30
+
+--S 31 of 44
+E := blockConcat([[A11,A12],[A21,M]])
+--R 
+--R
+--R         +i  a  b  c+
+--R         |          |
+--R         |a  a  b  c|
+--R   (31)  |          |
+--R         |b  d  e  f|
+--R         |          |
+--R         +c  g  h  i+
+--R                                  Type: Matrix(Fraction(Polynomial(Integer)))
+--E 31
+
+-- Split again
+
+--S 32 of 44
+vertSplit(E, 2)
+--R 
+--R
+--R          +i  a  b  c+ +b  d  e  f+
+--R   (32)  [|          |,|          |]
+--R          +a  a  b  c+ +c  g  h  i+
+--R                            Type: List(Matrix(Fraction(Polynomial(Integer))))
+--E 32
+
+--S 33 of 44
+horizSplit(E, 2)
+--R 
+--R
+--R          +i  a+ +b  c+
+--R          |    | |    |
+--R          |a  a| |b  c|
+--R   (33)  [|    |,|    |]
+--R          |b  d| |e  f|
+--R          |    | |    |
+--R          +c  g+ +h  i+
+--R                            Type: List(Matrix(Fraction(Polynomial(Integer))))
+--E 33
+
+--S 34 of 44
+vertSplit(E, [1,2,1])
+--R 
+--R
+--R                       +a  a  b  c+
+--R   (34)  [[i  a  b  c],|          |,[c  g  h  i]]
+--R                       +b  d  e  f+
+--R                            Type: List(Matrix(Fraction(Polynomial(Integer))))
+--E 34
+
+--S 35 of 44
+horizSplit(E, [2,2])
+--R 
+--R
+--R          +i  a+ +b  c+
+--R          |    | |    |
+--R          |a  a| |b  c|
+--R   (35)  [|    |,|    |]
+--R          |b  d| |e  f|
+--R          |    | |    |
+--R          +c  g+ +h  i+
+--R                            Type: List(Matrix(Fraction(Polynomial(Integer))))
+--E 35
+
+--S 36 of 44
+blockSplit(E, 2,2)
+--R 
+--R
+--R           +i  a+ +b  c+   +b  d+ +e  f+
+--R   (36)  [[|    |,|    |],[|    |,|    |]]
+--R           +a  a+ +b  c+   +c  g+ +h  i+
+--R                      Type: List(List(Matrix(Fraction(Polynomial(Integer)))))
+--E 36
+
+--S 37 of 44
+zero?(blockConcat(%) - E)
+--R 
+--R
+--R   (37)  true
+--R                                                                Type: Boolean
+--E 37
+
+--S 38 of 44
+blockSplit(E, [1,2,1], [2,2])
+--R 
+--R
+--R                           +a  a+ +b  c+
+--R   (38)  [[[i  a],[b  c]],[|    |,|    |],[[c  g],[h  i]]]
+--R                           +b  d+ +e  f+
+--R                      Type: List(List(Matrix(Fraction(Polynomial(Integer)))))
+--E 38
+
+--S 39 of 44
+zero?(blockConcat(%) - E)
+--R 
+--R
+--R   (39)  true
+--R                                                                Type: Boolean
+--E 39
+
+--S 40 of 44
+blockSplit(E, [2,1,1], 2)
+--R 
+--R
+--R           +i  a+ +b  c+
+--R   (40)  [[|    |,|    |],[[b  d],[e  f]],[[c  g],[h  i]]]
+--R           +a  a+ +b  c+
+--R                      Type: List(List(Matrix(Fraction(Polynomial(Integer)))))
+--E 40
+
+--S 41 of 44
+zero?(blockConcat(%) - E)
+--R 
+--R
+--R   (41)  true
+--R                                                                Type: Boolean
+--E 41
+
+--S 42 of 44
+blockSplit(E, 4, [2,2])
+--R 
+--R
+--R   (42)  [[[i  a],[b  c]],[[a  a],[b  c]],[[b  d],[e  f]],[[c  g],[h  i]]]
+--R                      Type: List(List(Matrix(Fraction(Polynomial(Integer)))))
+--E 42
+
+--S 43 of 44
+zero?(blockConcat(%) - E)
+--R 
+--R
+--R   (43)  true
+--R                                                                Type: Boolean
+--E 43
+
+--S 44 of 44
+)show MatrixManipulation
+--E 44
+
+
+)spool
+)lisp (bye)
+\end{chunk}
+\begin{chunk}{MatrixManipulation.help}
+====================================================================
+MatrixManipulation examples
+====================================================================
+
+Some functions for manipulating (dense) matrices.
+
+Supported are various kinds of slicing, splitting
+and stacking of matrices. The functions resemble
+operations often used in numerical linear algebra
+algorithms.
+
+M := matrix([[a,b,c],[d,e,f],[g,h,i]])
+
+        +a  b  c+
+        |       |
+        |d  e  f|
+        |       |
+        +g  h  i+
+
+element(M, 2,2)
+
+        [e]
+
+aRow(M, 1)
+
+        [a  b  c]
+
+aRow(M, 2)
+
+        [d  e  f]
+
+aColumn(M, 2)
+
+        +b+
+        | |
+        |e|
+        | |
+        +h+
+
+aColumn(M, 3)
+
+        +c+
+        | |
+        |f|
+        | |
+        +i+
+
+rows(M, [1,2])
+
+        +a  b  c+
+        |       |
+        +d  e  f+
+
+rows(M, [1,3])
+
+        +a  b  c+
+        |       |
+        +g  h  i+
+
+rows(M, [3,2])
+
+        +g  h  i+
+        |       |
+        +d  e  f+
+
+rows(M, 2..3)
+
+        +d  e  f+
+        |       |
+        +g  h  i+
+
+columns(M, [1,2])
+
+        +a  b+
+        |    |
+        |d  e|
+        |    |
+        +g  h+
+
+columns(M, [1,3])
+
+        +a  c+
+        |    |
+        |d  f|
+        |    |
+        +g  i+
+
+columns(M, [3,2])
+
+        +c  b+
+        |    |
+        |f  e|
+        |    |
+        +i  h+
+
+columns(M, 1..2)
+
+        +a  b+
+        |    |
+        |d  e|
+        |    |
+        +g  h+
+
+subMatrix(M, [1,2],[1,2])
+
+         +a  b+
+         |    |
+         +d  e+
+
+subMatrix(M, [1,3],[1,3])
+ 
+        +a  c+
+        |    |
+        +g  i+
+
+diagonalMatrix(M)
+
+        +a  0  0+
+        |       |
+        |0  e  0|
+        |       |
+        +0  0  i+
+
+diagonalMatrix(M, 1)
+
+         +0  b  0+
+         |       |
+         |0  0  f|
+         |       |
+         +0  0  0+
+
+diagonalMatrix(M, 2)
+
+         +0  0  c+
+         |       |
+         |0  0  0|
+         |       |
+         +0  0  0+
+
+diagonalMatrix(M, -1)
+
+         +0  0  0+
+         |       |
+         |d  0  0|
+         |       |
+         +0  h  0+
+
+diagonalMatrix(M, -2)
+
+         +0  0  0+
+         |       |
+         |0  0  0|
+         |       |
+         +g  0  0+
+
+bandMatrix(M, [-1,1])
+
+         +0  b  0+
+         |       |
+         |d  0  f|
+         |       |
+         +0  h  0+
+
+bandMatrix(M, [-1,0,1])
+
+         +a  b  0+
+         |       |
+         |d  e  f|
+         |       |
+         +0  h  i+
+
+bandMatrix(M, -1..1)
+
+         +a  b  0+
+         |       |
+         |d  e  f|
+         |       |
+         +0  h  i+
+
+Build a larger matrix
+
+A := matrix([[a]])
+
+         [a]
+
+B := matrix([[b]])
+
+         [b]
+
+C := matrix([[c]])
+
+         [c]
+
+A11 := element(M, 3,3)
+
+         [i]
+
+A12 := horizConcat([A,B,C])
+
+         [a  b  c]
+
+A21 := vertConcat([A,B,C])
+
+         +a+
+         | |
+         |b|
+         | |
+         +c+
+
+E := blockConcat([[A11,A12],[A21,M]])
+
+         +i  a  b  c+
+         |          |
+         |a  a  b  c|
+         |          |
+         |b  d  e  f|
+         |          |
+         +c  g  h  i+
+
+Split again
+
+vertSplit(E, 2)
+
+          +i  a  b  c+ +b  d  e  f+
+         [|          |,|          |]
+          +a  a  b  c+ +c  g  h  i+
+
+horizSplit(E, 2)
+
+          +i  a+ +b  c+
+          |    | |    |
+          |a  a| |b  c|
+         [|    |,|    |]
+          |b  d| |e  f|
+          |    | |    |
+          +c  g+ +h  i+
+
+vertSplit(E, [1,2,1])
+
+                       +a  a  b  c+
+         [[i  a  b  c],|          |,[c  g  h  i]]
+                       +b  d  e  f+
+
+horizSplit(E, [2,2])
+
+          +i  a+ +b  c+
+          |    | |    |
+          |a  a| |b  c|
+         [|    |,|    |]
+          |b  d| |e  f|
+          |    | |    |
+          +c  g+ +h  i+
+
+blockSplit(E, 2,2)
+
+           +i  a+ +b  c+   +b  d+ +e  f+
+         [[|    |,|    |],[|    |,|    |]]
+           +a  a+ +b  c+   +c  g+ +h  i+
+
+zero?(blockConcat(%) - E)
+
+         true
+
+blockSplit(E, [1,2,1], [2,2])
+
+                           +a  a+ +b  c+
+         [[[i  a],[b  c]],[|    |,|    |],[[c  g],[h  i]]]
+                           +b  d+ +e  f+
+
+zero?(blockConcat(%) - E)
+
+         true
+
+blockSplit(E, [2,1,1], 2)
+
+           +i  a+ +b  c+
+         [[|    |,|    |],[[b  d],[e  f]],[[c  g],[h  i]]]
+           +a  a+ +b  c+
+
+zero?(blockConcat(%) - E)
+
+         true
+
+blockSplit(E, 4, [2,2])
+
+         [[[i  a],[b  c]],[[a  a],[b  c]],[[b  d],[e  f]],[[c  g],[h  i]]]
+
+zero?(blockConcat(%) - E)
+
+         true
+
+See Also:
+o )show MatrixManipulation
+
+\end{chunk}
+\pagehead{MatrixManipulation}{MAMA}
+\pagepic{ps/v104matrixmanipulation.eps}{MAMA}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{MAMA}{aColumn} &
+\cross{MAMA}{aRow} &
+\cross{MAMA}{bandMatrix} &
+\cross{MAMA}{blockConcat} &
+\cross{MAMA}{blockSplit} \\
+\cross{MAMA}{columns} &
+\cross{MAMA}{diagonalMatrix} &
+\cross{MAMA}{element} &
+\cross{MAMA}{horizConcat} &
+\cross{MAMA}{horizSplit} \\
+\cross{MAMA}{rows} &
+\cross{MAMA}{subMatrix} &
+\cross{MAMA}{vertConcat} &
+\cross{MAMA}{vertSplit} &
+\end{tabular}
+
+\begin{chunk}{package MAMA MatrixManipulation}
+)abbrev package MAMA MatrixManipulation
+++ Author: Raoul Bourquin
+++ Date Created: 17 November 2012
+++ Date Last Updated: 1 December 2012
+++ Description:
+++ Some functions for manipulating (dense) matrices.
+++ Supported are various kinds of slicing, splitting and stacking of 
+++ matrices. The functions resemble operations often used in numerical 
+++ linear algebra algorithms.
+MatrixManipulation(R, Row, Col, M) : Exports == Implementation where
+  R : Field
+  Row : FiniteLinearAggregate R
+  Col : FiniteLinearAggregate R
+  M : MatrixCategory(R, Row, Col)
+
+  I ==> Integer
+  PI ==> PositiveInteger
+  LI ==> List I
+  SI ==> Segment I
+  LPI ==> List PI
+  SPI ==> Segment PI
+
+  Exports ==> with
+
+    -- Slicing matrices
+
+    -- How to call aRow, aColumn? Name clashed with usual row, column
+    -- Package call is ugly because of many parameters of MAMA
+
+    element : (M, PI, PI) -> M
+      ++ \spad{element} returns a single element out of a matrix.
+      ++ The element is put into a one by one matrix.
+
+    aRow : (M, PI) -> M
+      ++ \spad{aRow} returns a single row out of a matrix.
+      ++ The row is put into a one by N matrix.
+
+    rows : (M, LPI) -> M
+      ++ \spad{rows} returns several rows out of a matrix.
+      ++ The rows are stacked into a matrix.
+
+    rows : (M, SPI) -> M
+      ++ \spad{rows} returns several rows out of a matrix.
+      ++ The rows are stacked into a matrix.
+
+    aColumn : (M, PI) -> M
+      ++ \spad{aColumn} returns a single column out of a matrix.
+      ++ The column is put into a one by N matrix.
+
+    columns : (M, LPI) -> M
+      ++ \spad{columns} returns several columns out of a matrix.
+      ++ The columns are stacked into a matrix.
+
+    columns : (M, SPI) -> M
+      ++ \spad{columns} returns several columns out of a matrix.
+      ++ The columns are stacked into a matrix.
+
+    subMatrix : (M, LPI, LPI) -> M
+      ++ \spad{subMatrix} returns several elements out of a matrix.
+      ++ The elements are stacked into a submatrix.
+
+    subMatrix : (M, SPI, SPI) -> M
+      ++ \spad{subMatrix} returns several elements out of a matrix.
+      ++ The elements are stacked into a submatrix.
+
+    diagonalMatrix : (M, I) -> M
+      ++ \spad{diagonalMatrix} returns a diagonal out of a matrix.
+      ++ The diagonal is put into a matrix of same shape as the
+      ++ original one. Positive integer arguments select upper
+      ++ off-diagonals, negative ones lower off-diagonals.
+
+    diagonalMatrix : M -> M
+      ++ \spad{diagonalMatrix} returns the main diagonal out of
+      ++ a matrix. The diagonal is put into a matrix of same shape
+      ++ as the original one.
+
+    bandMatrix : (M, LI) -> M
+      ++ \spad{bandMatrix} returns multiple diagonals out of a matrix.
+      ++ The diagonals are put into a matrix of same shape as the
+      ++ original one. Positive integer arguments select upper
+      ++ off-diagonals, negative ones lower off-diagonals.
+
+    bandMatrix : (M, SI) -> M
+      ++ \spad{bandMatrix} returns multiple diagonals out of a matrix.
+      ++ The diagonals are put into a matrix of same shape as the
+      ++ original one. Positive integer arguments select upper
+      ++ off-diagonals, negative ones lower off-diagonals.
+
+    -- Stacking matrices
+
+    horizConcat : (List M) -> M
+      ++ \spad{horizConcat} concatenates matrices column wise.
+
+    vertConcat : (List M) -> M
+      ++ \spad{vertConcat} concatenates matrices row wise.
+
+    blockConcat : (List List M) -> M
+      ++ \spad{blockConcat} concatenates matrices row and
+      ++ column wise, building a block matrix. The order
+      ++ is row major as in \spad{matrix}.
+
+    -- Splitting matrices
+
+    vertSplit : (M, PI) -> List M
+      ++ \spad{vertSplit} splits a matrix into multiple
+      ++ submatrices row wise.
+
+    vertSplit : (M, LPI) -> List M
+      ++ \spad{vertSplit} splits a matrix into multiple
+      ++ submatrices row wise.
+
+    horizSplit : (M, PI) -> List M
+      ++ \spad{horizSplit} splits a matrix into multiple
+      ++ submatrices column wise.
+
+    horizSplit : (M, LPI) -> List M
+      ++ \spad{horizSplit} splits a matrix into multiple
+      ++ submatrices column wise.
+
+    blockSplit : (M, PI, PI) -> List List M
+      ++ \spad{blockSplit} splits a matrix into multiple
+      ++ submatrices row and column wise, dividing
+      ++ a matrix into blocks.
+
+    blockSplit : (M, LPI, PI) -> List List M
+      ++ \spad{blockSplit} splits a matrix into multiple
+      ++ submatrices row and column wise, dividing
+      ++ a matrix into blocks.
+
+    blockSplit : (M, PI, LPI) -> List List M
+      ++ \spad{blockSplit} splits a matrix into multiple
+      ++ submatrices row and column wise, dividing
+      ++ a matrix into blocks.
+
+    blockSplit : (M, LPI, LPI) -> List List M
+      ++ \spad{blockSplit} splits a matrix into multiple
+      ++ submatrices row and column wise, dividing
+      ++ a matrix into blocks.
+
+  Implementation ==> add
+
+    minr ==> minRowIndex
+    maxr ==> maxRowIndex
+    minc ==> minColIndex
+    maxc ==> maxColIndex
+
+    -- Custom function to expand Segment(PositiveInteger) into 
+    -- List(PositiveInteger). This operation is not supported by the 
+    -- overly restrictive library implementation.
+    expand(spi : SPI) : LPI ==
+        lr := empty()$LPI
+        l : PI := lo spi
+        h : PI := hi spi
+        inc : I := incr spi
+        zero? inc => error "Cannot expand a segment with an increment of zero"
+        if inc > 0 then
+          while l <= h repeat
+            lr := concat(l, lr)
+            l := (l + inc) pretend PI
+        else
+          while l >= h repeat
+            lr := concat(l, lr)
+            l := (l + inc) pretend PI
+        reverse! lr
+
+    element(A, r, c) ==
+      matrix([[A(r,c)]])
+
+    aRow(A:M, r:PI) : M ==
+      subMatrix(A, r, r, minc A, maxc A)
+
+    rows(A:M, lst:LPI) : M ==
+      ls := [aRow(A, r) for r in lst]
+      reduce(vertConcat, ls)
+
+    rows(A:M, si:SPI) : M ==
+      rows(A, expand(si))
+
+    aColumn(A:M, c:PI) : M ==
+      subMatrix(A, minr A, maxr A, c, c)
+
+    columns(A:M, lst:LPI) : M ==
+      ls := [aColumn(A,c) for c in lst]
+      reduce(horizConcat, ls)
+
+    columns(A:M, si:SPI) : M ==
+      columns(A, expand(si))
+
+    diagonalMatrix(A, n) ==
+      nr := nrows(A)
+      nc := ncols(A)
+      n > (nc-1) => error "requested diagonal out of range"
+      n < 0 and abs(n) > (nr-1) => error "requested diagonal out of range"
+      B := zero(nr,nc)
+      if n >= 0 then
+        dl := min(nc-n, nr)
+        sr := minr(A)
+        sc := minc(A) + n
+      else
+        dl := min(nc, nr-abs(n))
+        sr := minr(A) + abs(n)
+        sc := minc(A)
+      for i in 0..(dl-1) repeat
+        qsetelt!(B, sr+i, sc+i, A(sr+i, sc+i))
+      B
+
+    diagonalMatrix(A) ==
+      diagonalMatrix(A, 0)
+
+    bandMatrix(A:M, ln:LI) : M ==
+      -- Really inefficient
+      reduce("+", [diagonalMatrix(A,d) for d in ln])
+
+    bandMatrix(A:M, si:SI) : M ==
+      bandMatrix(A, expand(si))
+
+    subMatrix(A:M, lr:LPI, lc:LPI) : M ==
+      -- Really inefficient
+      lle := [[ element(A,r,c) for c in lc] for r in lr]
+      blockConcat(lle)
+
+    subMatrix(A:M, sr:SPI, sc:SPI) : M ==
+      subMatrix(A, low sr, high sr, low sc, high sc)
+
+    -- Stack matrices
+
+    horizConcat(LA) ==
+      reduce(horizConcat, LA)
+
+    vertConcat(LA) ==
+      reduce(vertConcat, LA)
+
+    blockConcat(LLA: List List M) : M ==
+      reduce(vertConcat, [reduce(horizConcat, LA) for LA in LLA])
+
+    -- Split matrices
+
+    vertSplit(A:M, r:PI) : List M ==
+      dr := nrows(A) exquo r
+      dr case "failed" => error "split does not result in an equal division"
+      mir := minr A
+      mic := minc A
+      mac := maxc A
+      [ subMatrix(A, mir+i*dr, mir+(i+1)*dr-1, mic, mac) for i in 0..(r-1) ]
+
+    vertSplit(A:M, lr:LPI) : List M ==
+      reduce("+", lr) ~= nrows(A) => _
+          error "split does not result in proper partition"
+      l : List PI := cons(1, scan(_+, lr, 1$PI)$ListFunctions2(PI,PI))
+      mir := minr(A) -1   -- additional shift because l starts at 1
+      mic := minc A
+      mac := maxc A
+      result := _
+        [ subMatrix(A, mir+l(i-1), mir+l(i)-1, mic, mac) for i in 2..#l ]
+
+    horizSplit(A:M, c:PI) : List M ==
+      dc := ncols(A) exquo c
+      dc case "failed" => error "split does not result in an equal division"
+      mir := minr A
+      mar := maxr A
+      mic := minc A
+      [ subMatrix(A, mir, mar, mic+i*dc, mic+(i+1)*dc-1) for i in 0..(c-1) ]
+
+    horizSplit(A:M, lc:LPI) : List M ==
+      reduce("+", lc) ~= ncols(A) => _
+          error "split does not result in proper partition"
+      l : List PI := cons(1, scan(_+, lc, 1$PI)$ListFunctions2(PI,PI))
+      mir := minr A
+      mar := maxr A
+      mic := minc(A) -1   -- additional shift because l starts at 1
+      result := _
+         [ subMatrix(A, mir, mar, mic+l(i-1), mic+l(i)-1) for i in 2..#l ]
+
+    blockSplit(A:M, nr:PI, nc:PI) : List List M ==
+      [ horizSplit(X, nc) for X in vertSplit(A, nr) ]
+
+    blockSplit(A:M, lr:LPI, nc:PI) : List List M ==
+      [ horizSplit(X, nc) for X in vertSplit(A, lr) ]
+
+    blockSplit(A:M, nr:PI, lc:LPI) : List List M ==
+      [ horizSplit(X, lc) for X in vertSplit(A, nr) ]
+
+    blockSplit(A:M, lr:LPI, lc:LPI) : List List M ==
+      [ horizSplit(X, lc) for X in vertSplit(A, lr) ]
+
+\end{chunk}
+\begin{chunk}{MAMA.dotabb}
+"MAMA" [color="#FF4488",href="bookvol10.4.pdf#nameddest=MAMA"]
+"MATCAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=MATCAT"]
+"MAMA" -> "MATCAT"
+
+\end{chunk}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package MTHING MergeThing}
 \begin{chunk}{MergeThing.input}
 )set break resume
@@ -173909,6 +174990,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 \getchunk{package MATCAT2 MatrixCategoryFunctions2}
 \getchunk{package MCDEN MatrixCommonDenominator}
 \getchunk{package MATLIN MatrixLinearAlgebraFunctions}
+\getchunk{package MAMA MatrixManipulation}
 \getchunk{package MTHING MergeThing}
 \getchunk{package MESH MeshCreationRoutinesForThreeDimensions}
 \getchunk{package MDDFACT ModularDistinctDegreeFactorizer}
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index a9e9008..187deb4 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -97,15 +97,16 @@ of effort. We would like to acknowledge and thank the following people:
 "An alphabetical listing of contributors to AXIOM:"
 "Michael Albaugh        Cyril Alberga          Roy Adler"
 "Christian Aistleitner  Richard Anderson       George Andrews"
-"S.J. Atkins"
+"S.J. Atkins"            
 "Henry Baker            Martin Baker           Stephen Balzac"
 "Yurij Baransky         David R. Barton        Gerald Baumgartner"
 "Gilbert Baumslag       Michael Becker         Nelson H. F. Beebe"
 "Jay Belanger           David Bindel           Fred Blair"
-"Vladimir Bondarenko    Mark Botch             Alexandre Bouyer"
-"Karen Braman           Peter A. Broadbery     Martin Brock"
-"Manuel Bronstein       Stephen Buchwald       Florian Bundschuh"
-"Luanne Burns           William Burge          Ralph Byers"
+"Vladimir Bondarenko    Mark Botch             Raoul Bourquin"
+"Alexandre Bouyer       Karen Braman           Peter A. Broadbery"
+"Martin Brock           Manuel Bronstein       Stephen Buchwald"
+"Florian Bundschuh      Luanne Burns           William Burge"
+"Ralph Byers"            
 "Quentin Carpent        Robert Caviness        Bruce Char"
 "Ondrej Certik          Tzu-Yi Chen            Cheekai Chin"
 "David V. Chudnovsky    Gregory V. Chudnovsky  Mark Clements"
@@ -127,7 +128,7 @@ of effort. We would like to acknowledge and thank the following people:
 "Korrinn Fu"
 "Marc Gaetano           Rudiger Gebauer        Van de Geijn"
 "Kathy Gerber           Patricia Gianni        Samantha Goldrich"
-"Holger Gollan          Teresa Gomez-Diaz      Laureano Gonzalez-Vega"
+"Holger Gollan          Teresa Gomez-Diaz      Laureano Gonzalez-Vega" 
 "Stephen Gortler        Johannes Grabmeier     Matt Grayson"
 "Klaus Ebbe Grue        James Griesmer         Vladimir Grinberg"
 "Oswald Gschnitzer      Ming Gu                Jocelyn Guidry"
@@ -24439,6 +24440,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|MatrixCategoryFunctions2| . MATCAT2)
    (|MatrixCommonDenominator| . MCDEN)
    (|MatrixLinearAlgebraFunctions| . MATLIN)
+   (|MatrixManipulation| . MAMA)
    (|MergeThing| . MTHING)
    (|ModularDistinctDegreeFactorizer| . MDDFACT)
    (|ModuleOperator| . MODOP)
diff --git a/changelog b/changelog
index e4171b0..646158d 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+20130318 rxb src/axiom-website/patches.html 20130318.01.rxb.patch
+20130318 rxb src/algebra/Makefile add MatrixManipulation
+20130318 rxb books/bookvol5 expose MatrixManipulation, add Raoul Bourquin
+20130318 rxb books/bookvol10.4 add MatrixManipulation, add Raoul Bourquin
+20130318 rxb readme add Raoul Bourquin
+20130318 rxb Raoul Bourquin
 20130317 tpd src/axiom-website/patches.html 20130317.07.tpd.patch
 20130317 tpd buglist fix multiple typos
 20130317 tpd books/bookvol10.2 fix multiple typos
diff --git a/readme b/readme
index 9baeb5f..0b14d3a 100644
--- a/readme
+++ b/readme
@@ -190,15 +190,16 @@ at the axiom command prompt will prettyprint the list.
 "An alphabetical listing of contributors to AXIOM:"
 "Michael Albaugh        Cyril Alberga          Roy Adler"
 "Christian Aistleitner  Richard Anderson       George Andrews"
-"S.J. Atkins"
+"S.J. Atkins"            
 "Henry Baker            Martin Baker           Stephen Balzac"
 "Yurij Baransky         David R. Barton        Gerald Baumgartner"
 "Gilbert Baumslag       Michael Becker         Nelson H. F. Beebe"
 "Jay Belanger           David Bindel           Fred Blair"
-"Vladimir Bondarenko    Mark Botch             Alexandre Bouyer"
-"Karen Braman           Peter A. Broadbery     Martin Brock"
-"Manuel Bronstein       Stephen Buchwald       Florian Bundschuh"
-"Luanne Burns           William Burge          Ralph Byers"
+"Vladimir Bondarenko    Mark Botch             Raoul Bourquin"
+"Alexandre Bouyer       Karen Braman           Peter A. Broadbery"
+"Martin Brock           Manuel Bronstein       Stephen Buchwald"
+"Florian Bundschuh      Luanne Burns           William Burge"
+"Ralph Byers"            
 "Quentin Carpent        Robert Caviness        Bruce Char"
 "Ondrej Certik          Tzu-Yi Chen            Cheekai Chin"
 "David V. Chudnovsky    Gregory V. Chudnovsky  Mark Clements"
@@ -220,7 +221,7 @@ at the axiom command prompt will prettyprint the list.
 "Korrinn Fu"
 "Marc Gaetano           Rudiger Gebauer        Van de Geijn"
 "Kathy Gerber           Patricia Gianni        Samantha Goldrich"
-"Holger Gollan          Teresa Gomez-Diaz      Laureano Gonzalez-Vega"
+"Holger Gollan          Teresa Gomez-Diaz      Laureano Gonzalez-Vega" 
 "Stephen Gortler        Johannes Grabmeier     Matt Grayson"
 "Klaus Ebbe Grue        James Griesmer         Vladimir Grinberg"
 "Oswald Gschnitzer      Ming Gu                Jocelyn Guidry"
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 31d3b40..6811bd9 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -1222,7 +1222,7 @@ LAYER2=\
 "ABELGRP" -> "LMODULE/SGROUP"
 /*"ABELGRP" -> "INT"*/
 
-"ABELGRP-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ABELGRP-",
+"ABELGRP-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ABELGRP",
            shape=ellipse]
 /*"ABELGRP-" -> {"CABMON"; "ABELMON"; "ABELSG"; "SETCAT"; "BASTYPE"}*/
 /*"ABELGRP-" -> {"KOERCE"; "RING"; "RNG"; "SGROUP"; "MONOID"}*/
@@ -1236,7 +1236,7 @@ LAYER2=\
 "ABELMON" -> "LMODULE/SGROUP"
 /*"ABELMON" -> {"NNI"; "INT"}*/
 
-"ABELMON-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ABELMON-",
+"ABELMON-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ABELMON",
            shape=ellipse]
 /*"ABELMON-" -> {"ABELSG"; "SETCAT"; "BASTYPE"; "KOERCE"; "RING"; "RNG"}*/
 /*"ABELMON-" -> {"ABELGRP"; "CABMON"; "SGROUP"; "MONOID"}*/
@@ -1311,7 +1311,7 @@ LAYER2=\
 "DIFRING" -> "LMODULE/SGROUP"
 /*"DIFRING" -> {"SINT"; "NNI"; "INT"}*/
 
-"DIFRING-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DIFRING-",
+"DIFRING-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DIFRING",
            shape=ellipse]
 /*"DIFRING-" -> {"RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"}*/
 /*"DIFRING-" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"}*/
@@ -2825,7 +2825,7 @@ LAYER7=\
 /*"CLAGG" -> {"ORDSET"; "ELAGG"; "OM"; "INT"; "LIST"; "ILIST"; "NNI"}*/
 /*"CLAGG" -> {"BOOLEAN"; "LSAGG-"; "STAGG-"; "ELAGG-"}*/
 
-"CLAGG-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=CLAGG-",
+"CLAGG-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=CLAGG",
           shape=ellipse]
 /*"CLAGG-" -> {"HOAGG"; "AGG"; "TYPE"; "SETCAT"; "BASTYPE"; "KOERCE"}*/
 /*"CLAGG-" -> {"EVALAB"; "IEVALAB"; "KONVERT"; "LSAGG"; "STAGG"; "URAGG"}*/
@@ -4896,7 +4896,7 @@ LAYER9=\
   ${OUT}/DIRPROD2.o ${OUT}/IMATRIX.o  ${OUT}/INTRVL.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}/LSMP.o     ${OUT}/LSMP1.o    ${OUT}/MAMA.o     ${OUT}/MATCAT2.o  \
   ${OUT}/PROJPL.o   ${OUT}/PTCAT.o    ${OUT}/STRICAT.o  ${OUT}/TRIMAT.o  \
   ${OUT}/U8MAT.o    ${OUT}/U16MAT.o   ${OUT}/U32MAT.o \
   layer9done
@@ -5080,6 +5080,23 @@ LAYER9=\
 /*"LSMP1" -> {"TYPE"; "EVALAB"; "IEVALAB"; "ELTAGG"; "ELTAB"; "CLAGG"}*/
 /*"LSMP1" -> {"KONVERT"; "ORDSET"}*/
 
+"MAMA" [color="#FF4488",href="bookvol10.4.pdf#nameddest=MAMA"]
+/*"MAMA" -> {"FIELD", "EUCDOM", "PID", "GCDDOM", "INTDOM", "COMRING"}*/
+/*"MAMA" -> {"RING", "RNG", "ABELGRP", "CABMON", "ABELMON", "ABELSG"}*/
+/*"MAMA" -> {"SETCAT", "BASTYPE", "KOERCE", "SGROUP", "MONOID"}*/
+/*"MAMA" -> {"LMODULE", "BMODULE", "RMODULE", "ALGEBRA", "MODULE"}*/
+/*"MAMA" -> {"ENTIRER", "UFD", "DIVRING", "FLAGG", "LNAGG", "IXAGG"}*/
+/*"MAMA" -> {"HOAGG", "AGG", "TYPE", "EVALAB", "IEVALAB", "ELTAGG"}*/
+/*"MAMA" -> {"ELTAB", "CLAGG", "KONVERT", "ORDSET"}*/
+"MAMA" -> "MATCAT"
+/*"MAMA" -> {"ARR2CAT", "INT", "LIST", "ILIST", "NNI", "PI", "BOOLEAN"}*/
+/*"MAMA" -> {"LSAGG", "STAGG", "URAGG", "RCAGG", "ELAGG", "OM", "LSAGG-"}*/
+/*"MAMA" -> {"SINT", "INS", "OINTDOM", "ORDRING", "OAGROUP", "OCAMON"}*/
+/*"MAMA" -> {"OAMON", "OASGP", "DIFRING", "RETRACT", "LINEXP", "PATMAB"}*/
+/*"MAMA" -> {"CFCAT", "REAL", "CHARZ", "STEP", "MONOID-", "ABELMON-"}*/
+/*"MAMA" -> {"ORDSET-", "SGROUP-", "ABELSG-", "SETCAT-", "BASTYPE-"}*/
+/*"MAMA" -> {"STAGG-"}*/
+
 "MATCAT2" [color="#FF4488",href="bookvol10.4.pdf#nameddest=MATCAT2"]
 /*"MATCAT2" -> {"RING"; "RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"}*/
 /*"MATCAT2" -> {"ABELSG"; "SETCAT"; "BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"}*/
@@ -6312,7 +6329,7 @@ LAYER11=\
 "DIVRING" -> "PFECAT"
 /*"DIVRING" -> "INT"*/
 
-"DIVRING-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DIVRING-",
+"DIVRING-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=DIVRING",
            shape=ellipse]
 /*"DIVRING-" -> {"INS"; "UFD"; "GCDDOM"; "INTDOM"; "COMRING"}*/
 /*"DIVRING-" -> {"RING"; "RNG"; "ABELGRP"; "CABMON"; "ABELMON"}*/
@@ -11413,7 +11430,7 @@ LAYER16=\
 /*"ES" -> {"OM"; "PATAB"; "ILIST"; "LSAGG-"; "STAGG-"; "ELAGG-"; "NNI"}*/
 /*"ES" -> {"PATMAB"; "URAGG-"}*/
 
-"ES-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ES-",
+"ES-" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ES",
        shape=ellipse]
 /*"ES-" -> {"ES";  "ORDSET";  "SETCAT";  "BASTYPE";  "KOERCE";  "RETRACT"}*/
 /*"ES-" -> {"IEVALAB";  "EVALAB";  "CACHSET";  "SYMBOL";  "INT";  "REF"}*/
@@ -18358,6 +18375,7 @@ REGRESS= \
  MatrixCategoryFunctions2.regress \
  MatrixCommonDenominator.regress \
  MatrixLinearAlgebraFunctions.regress \
+ MatrixManipulation.regress \
  MergeThing.regress \
  MeshCreationRoutinesForThreeDimensions.regress \
  ModMonic.regress \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 4c4d83c..f2149be 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -4099,5 +4099,7 @@ books/bookvol10.2 ORDSET fix 40346
 books/bookvol10.2 REAL fix 40345
 <a href="patches/20130317.07.tpd.patch">20130317.07.tpd.patch</a>
 books/bookvol10.2 fix multiple typos
+<a href="patches/20130318.01.rxb.patch">20130318.01.rxb.patch</a>
+books/bookvol10.4 add MatrixManipulation
  </body>
 </html>
