diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index a6ec05e..a8a5382 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -55579,6 +55579,159 @@ LinGroebnerPackage(lv,F) : C == T
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{package LOP LinesOpPack}
+<<LinesOpPack.input>>=
+)set break resume
+)sys rm -f LinesOpPack.output
+)spool LinesOpPack.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show LinesOpPack
+--R LinesOpPack K: Field  is a package constructor
+--R Abbreviation for LinesOpPack is LOP 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.4.pamphlet to see algebra source code for LOP 
+--R
+--R------------------------------- Operations --------------------------------
+--R quotVecSpaceBasis : (List List K,List List K) -> List List K
+--R reduceLineOverLine : (List K,List K,K) -> List K
+--R reduceRow : List List K -> List List K
+--R reduceRowOnList : (List K,List List K) -> List List K
+--R rowEchWoZeroLines : Matrix K -> Matrix K
+--R rowEchWoZeroLinesWOVectorise : Matrix K -> Matrix K
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<LinesOpPack.help>>=
+====================================================================
+LinesOpPack examples
+====================================================================
+
+See Also:
+o )show LinesOpPack
+
+@
+\pagehead{LinesOpPack}{LOP}
+\pagepic{ps/v104linesoppack.ps}{LOP}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lll}
+\cross{LOP}{quotVecSpaceBasis} &
+\cross{LOP}{reduceLineOverLine} &
+\cross{LOP}{reduceRow} \\
+\cross{LOP}{reduceRowOnList} &
+\cross{LOP}{rowEchWoZeroLines} &
+\cross{LOP}{rowEchWoZeroLinesWOVectorise}
+\end{tabular}
+
+<<package LOP LinesOpPack>>=
+)abbrev package LOP LinesOpPack
+++ Authors: G. Hache
+++ Date Created: 21 sept 1994
+++ Date Last Updated: May 2010 by Tim Daly
+++ Description: 
+++ A package that exports several linear algebra operations over lines 
+++ of matrices. Part of the PAFF package.
+LinesOpPack(K):P==T where
+
+  K:Field
+
+  P==> with
+    rowEchWoZeroLinesWOVectorise: Matrix(K) -> Matrix(K) 
+    rowEchWoZeroLines: Matrix(K) -> Matrix(K) 
+    reduceRow: List(List(K)) -> List(List(K))
+      ++ reduceRow: if the input is considered as a matrix, the output would
+      ++ be the row reduction matrix. It's almost the rowEchelon form
+      ++ except that no permution of lines is performed.
+    quotVecSpaceBasis: (List(List(K)),List(List(K))) -> List(List(K))
+      ++ quotVecSpaceBasis(b1,b2) returns a basis of V1/V2 where
+      ++ V1 and V2 are vector space with basis b1  and b2 resp. and
+      ++ V2 is suppose to be include in V1; Note that if
+      ++ it is not the case then it returs the basis of V1/W
+      ++ where W = intersection of V1 and V2
+    reduceLineOverLine: (List(K),List(K),K) -> List(K)
+      ++reduceLineOverLine(v1,v2,a) returns v1-a*v1 where
+      ++ v1 and v2 are considered as vector space.
+    reduceRowOnList: (List(K),List(List(K))) -> List(List(K))
+      ++ reduceRowOnList(v,lvec) applies a row reduction on each of the 
+      ++ element of lv using v according to a pivot in v which is set to 
+      ++ be the first non nul element in v.
+
+  T==> add
+    localRowEchelon: Matrix(K) -> Matrix(K)
+    localRowEchelon(m)==
+      ^(K has PseudoAlgebraicClosureOfPerfectFieldCategory )  => rowEchelon m
+      llm:List(List(K)):= listOfLists m
+      l:= first llm
+      maxT:= maxTower l
+      lv := [vectorise(a,maxT)$K for a in l]
+      subMatl := transpose  matrix [entries(v) for v in lv]
+      matl:= subMatl
+      for l in rest llm repeat
+        maxT:= maxTower l
+        lv := [vectorise(a,maxT)$K for a in l]
+        subMatl := transpose  matrix [entries(v) for v in lv]
+        matl:=vertConcat(matl,subMatl)
+      rowEchelon  matl
+
+    rowEchWoZeroLines(m)==
+      mm:=localRowEchelon m
+      ll:=listOfLists mm
+      n:= # first ll
+      lZero:=new(n pretend NonNegativeInteger,0)$List(K)
+      llll:= [ l for l in ll | ^(lZero = l) ]
+      empty?(llll) => matrix [lZero]
+      matrix llll
+
+    rowEchWoZeroLinesWOVectorise(m)==
+      mm:=rowEchelon  m
+      ll:=listOfLists mm
+      n:= # first ll
+      lZero:=new(n pretend NonNegativeInteger,0)$List(K)
+      llll:= [ l for l in ll | ^(lZero = l) ]
+      empty?(llll) => matrix [lZero]
+      matrix llll
+
+    quotVecSpaceBasis(l2,l1)==
+      redBasis:=reduceRow(concat(l1,l2))
+      tempRes:=rest(redBasis,#l1)
+      allZero:=new(#l1.1,0$K)
+      [l for l in tempRes | ^(l=allZero)]
+
+    reduceRowOnList(line,listOfLine)==
+      frsNonNul:Integer:=position(^zero?(#1),line)
+      ^(frsNonNul > 0) => listOfLine
+      a:= line.frsNonNul
+      inva:= inv a
+      newLine:=[inva*c for c in line]
+      [reduceLineOverLine(newLine,l,l.frsNonNul) for l in listOfLine]
+
+    reduceLineOverLine(l1,l2,b)==
+      [c2 - b*c1 for c2 in l2 for c1 in l1]
+
+    reduceRow(m:List(List(K)))==
+      n:=#m
+      mcopy:List(List(K)):=copy m
+      newBottom:List(List(K))
+      for i in 1..(n-1) repeat
+        newBottom:=reduceRowOnList(mcopy.i,[mcopy.j for j in (i+1)..n])
+        mcopy:=concat([mcopy.k for k in 1..i] :: List(List(K)),newBottom)
+      mcopy
+
+@
+<<LOP.dotabb>>=
+"LOP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=LOP"]
+"IVECTOR" [color="#88FF44",href="bookvol10.3.pdf#nameddest=IVECTOR"]
+"LOP" -> "IVECTOR"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package LF LiouvillianFunction}
 \pagehead{LiouvillianFunction}{LF}
 \pagepic{ps/v104liouvillianfunction.ps}{LF}{1.00}
@@ -154882,6 +155035,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package LSMP1 LinearSystemMatrixPackage1>>
 <<package LSPP LinearSystemPolynomialPackage>>
 <<package LGROBP LinGroebnerPackage>>
+<<package LOP LinesOpPack>>
 <<package LF LiouvillianFunction>>
 <<package LIST2 ListFunctions2>>
 <<package LIST3 ListFunctions3>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index c3e35e8..342f9f2 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -23999,6 +23999,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|LinearSystemMatrixPackage1| . LSMP1)
    (|LinearSystemPolynomialPackage| . LSPP)
    (|List| . LIST)
+   (|LinesOpPack| . LOP)
    (|ListFunctions2| . LIST2)
    (|ListFunctions3| . LIST3)
    (|ListToMap| . LIST2MAP)
diff --git a/books/ps/v104linesoppack.ps b/books/ps/v104linesoppack.ps
new file mode 100644
index 0000000..e773965
--- /dev/null
+++ b/books/ps/v104linesoppack.ps
@@ -0,0 +1,18 @@
+.if !dPS .ds PS
+.if !dPE .ds PE
+.lf 1 -
+digraph pic {
+ fontsize=10;
+ bgcolor=yellow
+ node [shape=box, color=lightblue, style=filled];
+
+"LOP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=LOP"]
+"IVECTOR" [color="#88FF44",href="bookvol10.3.pdf#nameddest=IVECTOR"]
+"LOP" -> "IVECTOR"
+
+}
+
+
+
+
+
diff --git a/changelog b/changelog
index b3714d4..7f47887 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100511 tpd src/axiom-website/patches.html 20100511.01.tpd.patch
+20100511 tpd src/algebra/Makefile help and test files for LinesOpPack
+20100511 tpd books/bookvol5 expose LinesOpPack
+20100511 tpd books/bookvol10.4 add LinesOpPack
+20100511 tpd books/ps/v104linesoppack.ps added
 20100510 tpd src/axiom-website/patches.html 20100510.02.tpd.patch
 20100510 tpd src/algebra/Makefile add FACTEXT
 20100510 tpd books/bookvol5 expose FACTEXT
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 0d641a3..ee5a247 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -4516,7 +4516,8 @@ LAYER10=\
   ${OUT}/DIRPCAT.o  ${OUT}/DIRPCAT-.o ${OUT}/D02BBFA.o  ${OUT}/D02BHFA.o \
   ${OUT}/D02CJFA.o  ${OUT}/FAXF.o     ${OUT}/FAXF-.o    ${OUT}/FFPOLY2.o \
   ${OUT}/FNLA.o     ${OUT}/GRAY.o     ${OUT}/HB.o       ${OUT}/INBFF.o   \
-  ${OUT}/IRSN.o     ${OUT}/MCALCFN.o  ${OUT}/MHROWRED.o ${OUT}/NUMODE.o  \
+  ${OUT}/IRSN.o     ${OUT}/LOP.o      \
+  ${OUT}/MCALCFN.o  ${OUT}/MHROWRED.o ${OUT}/NUMODE.o  \
   ${OUT}/NUMQUAD.o  ${OUT}/ODESYS.o   ${OUT}/ODETOOLS.o ${OUT}/ORDFUNS.o \
   ${OUT}/PERMAN.o   ${OUT}/PFECAT.o   ${OUT}/PFECAT-.o  ${OUT}/POINT.o   \
   ${OUT}/PSEUDLIN.o ${OUT}/PTPACK.o   ${OUT}/REP2.o     ${OUT}/SETMN.o   \
@@ -4851,6 +4852,19 @@ LAYER10=\
 /*"IRSN" -> {"A1AGG-"; "FLAGG-"; "LNAGG-"; "IXAGG-"; "CLAGG-"; "HOAGG-"}*/
 /*"IRSN" -> {"ORDSET-"; "AGG-"; "ELTAGG-"; "SETCAT-"; "BASTYPE-"}*/
 
+"LOP" [color="#FF4488",href="bookvol10.4.pdf#nameddest=LOP"]
+/*"LOP" -> {"FIELD"; "EUCDOM"; "PID"; "GCDDOM"; "INTDOM"; "COMRING"; "RING"}*/
+/*"LOP" -> {"RNG"; "ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"; "SETCAT"}*/
+/*"LOP" -> {"BASTYPE"; "KOERCE"; "SGROUP"; "MONOID"; "LMODULE"; "BMODULE"}*/
+/*"LOP" -> {"RMODULE"; "ALGEBRA"; "MODULE"; "ENTIRER"; "UFD"; "DIVRING"}*/
+/*"LOP" -> {"PACPERC"; "INT"; "LIST"; "ILIST"; "VECTOR"}*/
+"LOP" -> "IVECTOR"
+/*"LOP" -> {"IARRAY1"; "VECTCAT-"; "A1AGG-"; "FLAGG-"; "LNAGG-"; "IXAGG-"}*/
+/*"LOP" -> {"LSAGG"; "STAGG"; "URAGG"; "RCAGG"; "HOAGG"; "AGG"; "TYPE"}*/
+/*"LOP" -> {"EVALAB"; "IEVALAB"; "LNAGG"; "IXAGG"; "ELTAGG"; "ELTAB"}*/
+/*"LOP" -> {"CLAGG"; "KONVERT"; "FLAGG"; "ORDSET"; "ELAGG"; "OM"; "LSAGG-"}*/
+/*"LOP" -> {"BOOLEAN"; "STAGG-"; "NNI"; "SINT"}*/
+
 "MCALCFN" [color="#FF4488",href="bookvol10.4.pdf#nameddest=MCALCFN"]
 /*"MCALCFN" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "PDRING"; "RING"; "RNG"}*/
 /*"MCALCFN" -> {"ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"; "SGROUP"; "MONOID"}*/
@@ -16057,6 +16071,21 @@ ${MID}/FACTEXT.nrlib/code.o: ${MID}/FACTEXT.spad
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
+<<newcode>>=
+
+LOPDEPS = PACPERC
+
+${MID}/LOP.nrlib/code.o: ${MID}/LOP.spad
+	@echo P3 making ${MID}/LOP.nrlib/code.o from ${MID}/LOP.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${LOPDEPS} \n )co LOP.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${LOPDEPS} \n )co LOP.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+@
 
 \section{Broken Files}
 These files are Aldor files
@@ -16828,6 +16857,7 @@ SPADHELP=\
  ${HELP}/LinearOrdinaryDifferentialOperator1.help \
  ${HELP}/LinearOrdinaryDifferentialOperator2.help \
  ${HELP}/List.help \
+ ${HELP}/LinesOpPack.help \
  ${HELP}/LyndonWord.help \
  ${HELP}/Magma.help \
  ${HELP}/MakeFunction.help \
@@ -16996,6 +17026,7 @@ REGRESS= \
  LinearOrdinaryDifferentialOperator1.regress \
  LinearOrdinaryDifferentialOperator2.regress \
  List.regress \
+ LinesOpPack.regress \
  LyndonWord.regress \
  Magma.regress \
  MathMLFormat.regress \
@@ -17818,6 +17849,15 @@ ${HELP}/List.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/List.input
 	@echo "List (LIST)" >>${HELPFILE}
 
+${HELP}/LinesOpPack.help: ${BOOKS}/bookvol10.4.pamphlet
+	@echo 7565 create LinesOpPack.help from ${BOOKS}/bookvol10.4.pamphlet
+	@${TANGLE} -R"LinesOpPack.help" ${BOOKS}/bookvol10.4.pamphlet \
+           >${HELP}/LinesOpPack.help
+	@cp ${HELP}/LinesOpPack.help ${HELP}/LOP.help
+	@${TANGLE} -R"LinesOpPack.input" ${BOOKS}/bookvol10.4.pamphlet \
+            >${INPUT}/LinesOpPack.input
+	@echo "LinesOpPack (LOP)" >>${HELPFILE}
+
 ${HELP}/LyndonWord.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 7570 create LyndonWord.help from \
             ${BOOKS}/bookvol10.3.pamphlet
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index d06ccf4..2a6b2a7 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2683,5 +2683,7 @@ books/bookvol10.3 add PseudoAlgebraicClosureOfFiniteField<br/>
 books/bookvol10.2 PseudoAlgebraicClosureOfAlgExtOfRationalNumberCategory<br/>
 <a href="patches/20100510.02.tpd.patch">20100510.02.tpd.patch</a>
 books/bookvol10.4 add FactorisationOverPseudoAlgebraicClosureOfAlgExtOfRationalNumber<br/>
+<a href="patches/20100511.01.tpd.patch">20100511.01.tpd.patch</a>
+books/bookvol10.4 add LinesOpPack<br/>
  </body>
 </html>
