diff --git a/books/bookvol10.3.pamphlet b/books/bookvol10.3.pamphlet
index 7e46fd7..21b8a2b 100644
--- a/books/bookvol10.3.pamphlet
+++ b/books/bookvol10.3.pamphlet
@@ -80728,6 +80728,414 @@ Product (A:SetCategory,B:SetCategory) : C == T
 "PRODUCT" -> "OAMONS"
 
 @
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain PACRAT PseudoAlgebraicClosureOfRationalNumber}
+<<PseudoAlgebraicClosureOfRationalNumber.input>>=
+)set break resume
+)sys rm -f PseudoAlgebraicClosureOfRationalNumber.output
+)spool PseudoAlgebraicClosureOfRationalNumber.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show PseudoAlgebraicClosureOfRationalNumber
+--R PseudoAlgebraicClosureOfRationalNumber  is a domain constructor
+--R Abbreviation for PseudoAlgebraicClosureOfRationalNumber is PACRAT 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.3.pamphlet to see algebra source code for PACRAT 
+--R
+--R------------------------------- Operations --------------------------------
+--R ?*? : (%,Fraction Integer) -> %       ?*? : (Fraction Integer,%) -> %
+--R ?*? : (Fraction Integer,%) -> %       ?*? : (%,Fraction Integer) -> %
+--R ?*? : (%,%) -> %                      ?*? : (Integer,%) -> %
+--R ?*? : (PositiveInteger,%) -> %        ?**? : (%,Integer) -> %
+--R ?**? : (%,PositiveInteger) -> %       ?+? : (%,%) -> %
+--R ?-? : (%,%) -> %                      -? : % -> %
+--R ?/? : (%,Fraction Integer) -> %       ?/? : (%,%) -> %
+--R ?=? : (%,%) -> Boolean                1 : () -> %
+--R 0 : () -> %                           ?^? : (%,Integer) -> %
+--R ?^? : (%,PositiveInteger) -> %        algebraic? : % -> Boolean
+--R associates? : (%,%) -> Boolean        coerce : Fraction Integer -> %
+--R coerce : Fraction Integer -> %        coerce : Integer -> %
+--R coerce : Fraction Integer -> %        coerce : % -> %
+--R coerce : Integer -> %                 coerce : % -> OutputForm
+--R conjugate : % -> %                    dimension : () -> CardinalNumber
+--R extDegree : % -> PositiveInteger      factor : % -> Factored %
+--R fullOutput : % -> OutputForm          gcd : List % -> %
+--R gcd : (%,%) -> %                      ground? : % -> Boolean
+--R hash : % -> SingleInteger             inGroundField? : % -> Boolean
+--R inv : % -> %                          latex : % -> String
+--R lcm : List % -> %                     lcm : (%,%) -> %
+--R maxTower : List % -> %                one? : % -> Boolean
+--R previousTower : % -> %                prime? : % -> Boolean
+--R ?quo? : (%,%) -> %                    recip : % -> Union(%,"failed")
+--R ?rem? : (%,%) -> %                    retract : % -> Fraction Integer
+--R retract : % -> Fraction Integer       retract : % -> Integer
+--R sample : () -> %                      setTower! : % -> Void
+--R sizeLess? : (%,%) -> Boolean          squareFree : % -> Factored %
+--R squareFreePart : % -> %               transcendent? : % -> Boolean
+--R unit? : % -> Boolean                  unitCanonical : % -> %
+--R vectorise : (%,%) -> Vector %         zero? : % -> Boolean
+--R ?~=? : (%,%) -> Boolean              
+--R ?*? : (NonNegativeInteger,%) -> %
+--R ?**? : (%,NonNegativeInteger) -> %
+--R Frobenius : % -> % if Fraction Integer has FINITE
+--R Frobenius : (%,NonNegativeInteger) -> % if Fraction Integer has FINITE
+--R ?^? : (%,NonNegativeInteger) -> %
+--R characteristic : () -> NonNegativeInteger
+--R charthRoot : % -> Union(%,"failed") if Fraction Integer has CHARNZ or Fraction Integer has FINITE
+--R definingPolynomial : % -> SparseUnivariatePolynomial %
+--R definingPolynomial : () -> SparseUnivariatePolynomial %
+--R degree : % -> OnePointCompletion PositiveInteger
+--R discreteLog : (%,%) -> Union(NonNegativeInteger,"failed") if Fraction Integer has CHARNZ or Fraction Integer has FINITE
+--R distinguishedRootsOf : (SparseUnivariatePolynomial %,%) -> List %
+--R divide : (%,%) -> Record(quotient: %,remainder: %)
+--R euclideanSize : % -> NonNegativeInteger
+--R expressIdealMember : (List %,%) -> Union(List %,"failed")
+--R exquo : (%,%) -> Union(%,"failed")
+--R extendedEuclidean : (%,%,%) -> Union(Record(coef1: %,coef2: %),"failed")
+--R extendedEuclidean : (%,%) -> Record(coef1: %,coef2: %,generator: %)
+--R extensionDegree : () -> OnePointCompletion PositiveInteger
+--R gcdPolynomial : (SparseUnivariatePolynomial %,SparseUnivariatePolynomial %) -> SparseUnivariatePolynomial %
+--R lift : (%,%) -> SparseUnivariatePolynomial %
+--R lift : % -> SparseUnivariatePolynomial %
+--R multiEuclidean : (List %,%) -> Union(List %,"failed")
+--R newElement : (SparseUnivariatePolynomial %,SparseUnivariatePolynomial %,PositiveInteger,%,Symbol) -> %
+--R newElement : (SparseUnivariatePolynomial %,Symbol) -> %
+--R newElement : (SparseUnivariatePolynomial %,%,Symbol) -> %
+--R order : % -> OnePointCompletion PositiveInteger if Fraction Integer has CHARNZ or Fraction Integer has FINITE
+--R primeFrobenius : % -> % if Fraction Integer has CHARNZ or Fraction Integer has FINITE
+--R primeFrobenius : (%,NonNegativeInteger) -> % if Fraction Integer has CHARNZ or Fraction Integer has FINITE
+--R principalIdeal : List % -> Record(coef: List %,generator: %)
+--R reduce : SparseUnivariatePolynomial % -> %
+--R retractIfCan : % -> Union(Fraction Integer,"failed")
+--R retractIfCan : % -> Union(Fraction Integer,"failed")
+--R retractIfCan : % -> Union(Integer,"failed")
+--R subtractIfCan : (%,%) -> Union(%,"failed")
+--R transcendenceDegree : () -> NonNegativeInteger
+--R unitNormal : % -> Record(unit: %,canonical: %,associate: %)
+--R
+--E 1
+
+)spool
+)lisp (bye)
+
+@
+<<PseudoAlgebraicClosureOfRationalNumber.help>>=
+====================================================================
+PseudoAlgebraicClosureOfRationalNumber examples
+====================================================================
+
+See Also:
+o )show PseudoAlgebraicClosureOfRationalNumber
+
+@
+\pagehead{PseudoAlgebraicClosureOfRationalNumber}{PACRAT}
+\pagepic{ps/v103pseudoalgebraicclosureofrationalnumber.ps}{PACRAT}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{PACRAT}{0} &
+\end{tabular}
+
+<<domain PACRAT PseudoAlgebraicClosureOfRationalNumber>>=
+)abbrev domain PACRAT PseudoAlgebraicClosureOfRationalNumber
+++ Authors: Gaetan Hache
+++ Date Created: feb 1997
+++ Date Last Updated: May 2010 by Tim Daly
+++ Description: 
+++ This domain implements dynamic extension using the simple notion of 
+++ tower extensions. A tower extension T of the ground field K is any 
+++ sequence of field extension (T : K_0, K_1, ..., K_i...,K_n) where K_0 = K 
+++ and for i =1,2,...,n, K_i is an extension of K_{i-1} of degree > 1 and 
+++ defined by an irreducible polynomial p(Z) in K_{i-1}.
+++ Two towers (T_1: K_01, K_11,...,K_i1,...,K_n1) and 
+++ (T_2: K_02, K_12,...,K_i2,...,K_n2) are said to be related if T_1 <= T_2 
+++ (or T_1 >= T_2), that is if K_i1 = K_i2 for i=1,2,...,n1 
+++ (or i=1,2,...,n2). Any algebraic operations defined for several elements 
+++ are only defined if all of the concerned elements are comming from 
+++ a set of related tour extensions. 
+PseudoAlgebraicClosureOfRationalNumber:Exports == Implementation where
+  
+  INT     ==> Integer
+  K       ==> Fraction Integer
+  NNI     ==> NonNegativeInteger
+  SUP     ==> SparseUnivariatePolynomial
+  BOOLEAN ==> Boolean
+  PI      ==> PositiveInteger
+  FACTRN  ==> FactorisationOverPseudoAlgebraicClosureOfRationalNumber
+
+  recRep  ==> Record(recEl:SUP(%),_
+                    recTower:SUP(%),_
+		    recDeg:PI,_
+		    recPrevTower:%,_
+		    recName:Symbol) 
+    
+  Exports == PseudoAlgebraicClosureOfRationalNumberCategory with 
+  
+    fullOutput: % -> OutputForm
+
+    newElement: (SUP(%), SUP(%), PI,  %, Symbol) -> %
+  
+  Implementation == add
+    Rep := Union(recRep,K)
+    
+    -- signature of local function  
+    replaceRecEl: (%,SUP(%)) -> %
+    down: % -> %
+    
+    down(a:%) == 
+      a case K => a
+      aa:=(a pretend recRep)
+      elel := aa.recEl
+      ^ground?(elel)$SUP(%) => a
+      gel:%:=ground(elel)
+      down(gel)
+      
+    coerce(a:Integer):%== (a :: K)
+
+    n:INT * a:% ==
+      one?(n) => a
+      zero?(a) or zero?(n) => 0
+      (n < 0) => - ((-n)*a)
+      mm:PositiveInteger:=(n pretend PositiveInteger)
+      double(mm,a)$RepeatedDoubling(%)
+
+    replaceRecEl(a,el)==
+      a case K => a
+      aa:=copy a
+      aa.recEl := el
+      aa
+
+    -- local variable    
+    localTower :% := 1$K
+        
+    -- implemetation of exported function
+
+    lift(a) == 
+      a case K => monomial(a,0)
+      (a pretend recRep).recEl
+
+    lift(a,b)==
+      extDegree a > extDegree b => _
+          error "Cannot lift something at lower level !!!!!"
+      extDegree a < extDegree b => monomial(a,0)$SUP(%)
+      lift a
+
+    reduce(a)==
+      localTower case K => 
+        coefficient(a,0)
+      ar:= a rem (localTower pretend recRep).recTower
+      replaceRecEl(localTower,ar)
+       
+    maxTower(la)==
+        --return an element from the list la which is in the largest
+        --extension of the ground field
+        --PRECONDITION: all elements in same tower, else no meaning?
+      m:="max"/[extDegree(a)$% for a in la]
+      first [b for b in la | extDegree(b)=m]
+
+    ground?(a)== a case K
+
+    vectorise(a,lev)==
+      da:=extDegree a
+      dlev:=extDegree lev
+      dlev < da => _
+        error "Cannot vectorise at a lower level than the element to vectorise"
+      lev case K => [a]
+      pa:SUP(%)
+      na:%
+      ^(da = dlev) =>
+        pa:=  monomial(a,0)$SUP(%)
+        na:=  replaceRecEl(lev,pa)
+        vectorise(na,lev)$%
+      prevLev:=previousTower(lev)
+      a case K => error "At this point a is not suppose to be in K"
+      aEl:=(a pretend recRep).recEl
+      daEl:=degree definingPolynomial(a)$%
+      lv:=[vectorise(c,prevLev)$% for c in entries(vectorise(aEl,daEl)$SUP(%))]
+      concat lv        
+
+    setTower!(a) ==
+      localTower:=a
+      void()
+      
+    definingPolynomial == definingPolynomial(localTower)
+         
+    a:% + b:% ==
+      (a case K) and (b case K) => a +$K b
+      extDegree(a) > extDegree(b) => b + a
+      res1:SUP(%)
+      res2:%
+      if extDegree(a) = extDegree(b) then
+        res1:=   b.recEl +$SUP(%) a.recEl
+	res2:=   replaceRecEl(b,res1)
+      else
+        res1:=   b.recEl +$SUP(%) monomial(a,0)$SUP(%)
+	res2:= replaceRecEl(b,res1)
+      down(res2)
+         
+    a:% * b:% ==
+      (a case K) and (b case K) => a *$K b
+      extDegree(a) > extDegree(b) => b * a
+      res1:SUP(%)
+      res2:%
+      if extDegree(a) = extDegree(b) then
+        res1:=   b.recEl *$SUP(%) a.recEl rem b.recTower
+	res2:=   replaceRecEl(b,res1)
+      else
+        res1:=   b.recEl *$SUP(%) monomial(a,0)$SUP(%)
+	res2:=  replaceRecEl(b,res1)
+      down(res2)
+      
+    distinguishedRootsOf(polyZero,ee) ==
+        setTower!(ee)
+        zero?(polyZero) => error "to lazy to give you all the roots of 0 !!!"
+	factorf: Factored SUP % :=  factor(polyZero,ee)$FACTRN(%)
+	listFact:List SUP %  := [pol.fctr for pol in factorList(factorf)]
+        listOfZeros:List(%):=empty()
+	for p in listFact repeat
+	  root:=newElement(p, new(D::Symbol)$Symbol)
+	  listOfZeros:List(%):=concat([ root ], listOfZeros)
+        listOfZeros
+
+    1 == 1$K
+
+    0 == 0$K
+
+    newElement(pol:SUP(%),subF:%,inName:Symbol): % ==
+        -- pol is an irreducible polynomial over the field extension
+        -- given by subF. 
+        -- The output of this function is a root of pol.
+      dp:=degree pol
+      one?(dp) =>
+        listCoef:=coefficients(pol)
+        one?(#listCoef) => 0
+        - last(listCoef) / first(listCoef)
+      ground?(pol) => error "Cannot create a new element with a constant"
+      d:PI := (dp pretend PI) * extDegree(subF)
+      [monomial(1$%,1),pol,d,subF,inName] :: Rep
+      
+    newElement(poll:SUP(%),inName:Symbol)==
+      newElement(poll,localTower,inName)
+
+    newElement(elPol:SUP(%),pol:SUP(%),d:PI,subF:%,inName:Symbol): % ==
+      [elPol, pol,d,subF,inName] :: Rep
+
+    --Field operations 
+    inv(a)==
+      a case K => inv(a)$K
+      aRecEl:= (a pretend recRep).recEl
+      aDefPoly:= (a pretend recRep).recTower
+      aInv := extendedEuclidean( aRecEl , aDefPoly, 1 )
+      aInv  case "failed" => error "PACOFF : division by zero"
+      -- On doit retourner un Record représentant l'inverse de a.
+      -- Ce Record est exactement le même que celui de a sauf
+      -- qu'il faut remplacer le polynôme du selecteur recEl
+      -- par le polynôme représentant l'inverse de a :
+      -- C'est ce que fait la fonction replaceRecEl.
+      replaceRecEl( a , aInv.coef1 )     
+
+    a:% / b:% == a * inv(b)
+    
+    a:K * b:%==
+      (a :: %) * b
+      
+    b:% * a:K == a*b
+
+    a:% - b:% ==
+      a + (-b)
+    
+    a:% * b:Fraction(Integer) ==
+      bn:=numer b
+      bd:=denom b
+      ebn:%:= bn * 1$%
+      ebd:%:= bd * 1$%
+      a * ebn * inv(ebd)
+
+    -a:% ==
+       a case K => -$K a 
+       [-$SUP(%) (a pretend recRep).recEl,_
+        (a pretend recRep).recTower,_
+        (a pretend recRep).recDeg,_
+        (a pretend recRep).recPrevTower,_
+        (a pretend recRep).recName ]
+        
+    bb:% = aa:% ==
+      b:=down bb
+      a:=down aa
+      ^( extDegree(b) =$NNI extDegree(a) ) => false
+      (b case K)  =>  ( (retract a)@K  =$K (retract b)@K )
+      rda := a :: recRep
+      rdb := b :: recRep
+      not (rda.recTower =$SUP(%) rdb.recTower) => false
+      rdb.recEl =$SUP(%) rda.recEl
+        
+    zero?(a:%) == 
+      da:=down a  -- just to be sure !!!
+      ^(da case K) => false
+      zero?(da)$K
+    
+    one?(a:%) ==
+      da:= down a  -- just to be sure !!!
+      ^(da case K) => false
+      one?(da)$K
+    
+    --Coerce Functions
+      
+    coerce(a:K):% == a       
+
+    retractIfCan(a:%):Union(Integer,"failed")==
+      a case K => retractIfCan(a)$K
+      "failed"
+         
+    retractIfCan(a:%):Union(K,"failed")==
+      a case K => a
+      "failed"
+               
+    coerce(a:%):OutputForm ==
+      a case K => ((retract a)@K) ::OutputForm
+      outputForm((a pretend recRep).recEl,_
+                ((a pretend recRep).recName)::OutputForm) $SUP(%)
+
+    fullOutput(a:%):OutputForm==
+      a case K => ((retract a)@K) ::OutputForm
+      (a pretend recRep)::OutputForm
+      
+    definingPolynomial(a:%): SUP % ==
+      a case K => monomial(1,1)$SUP(%)
+      (a pretend recRep).recTower
+
+    extDegree(a:%): PI ==
+      a case K => 1
+      (a pretend recRep).recDeg
+      
+    previousTower(a:%):% ==
+      a case K => error "No previous extension for ground field element"
+      (a pretend recRep).recPrevTower
+ 
+    name(a:%):Symbol ==
+      a case K => error "No name for ground field element"
+      (a pretend recRep).recName
+
+    -- function related to the ground field 
+    
+    characteristic == characteristic()$K
+
+@
+
+<<PACRAT.dotabb>>=
+"PACRAT" [color="#88FF44",href="bookvol10.3.pdf#nameddest=PRODUCT"]
+"ALIST" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ALIST"]
+"PACRAT" -> "ALIST"
+
+@
+
+
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Chapter Q}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -122865,6 +123273,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<domain PF PrimeField>>
 <<domain PRIMARR PrimitiveArray>>
 <<domain PRODUCT Product>>
+<<domain PACRAT PseudoAlgebraicClosureOfRationalNumber>>
 
 <<domain QFORM QuadraticForm>> 
 <<domain QALGSET QuasiAlgebraicSet>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 94b8a73..76dd014 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24472,6 +24472,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|PriorityQueueAggregate| . PRQAGG)
    (|PseudoAlgebraicClosureOfFiniteFieldCategory| . PACFFC)
    (|PseudoAlgebraicClosureOfPerfectFieldCategory| . PACPERC)
+   (|PseudoAlgebraicClosureOfRationalNumber| . PACRAT)
    (|PseudoAlgebraicClosureOfRationalNumberCategory| . PACRATC)
    (|QuaternionCategory| . QUATCAT)
    (|QueueAggregate| . QUAGG)
diff --git a/books/ps/v103pseudoalgebraicclosureofrationalnumber.ps b/books/ps/v103pseudoalgebraicclosureofrationalnumber.ps
new file mode 100644
index 0000000..9d2c4a5
--- /dev/null
+++ b/books/ps/v103pseudoalgebraicclosureofrationalnumber.ps
@@ -0,0 +1,268 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Graphviz version 2.20.2 (Mon Mar 30 10:09:11 UTC 2009)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: (atend)
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+       dup 1 exch div /InvScaleFactor exch def
+       scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw text fitted to its expected width
+/alignedtext {			% width text
+	/text exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			[] 0 setdash
+			text stringwidth pop width exch sub text length div 0 text ashow
+		} if
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+setupLatin1
+%%Page: 1 1
+%%PageBoundingBox: 36 36 114 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 78 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% PACRAT
+gsave
+[ /Rect [ 0 72 70 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=PRODUCT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.273 0.733 1.000 nodecolor
+newpath 70 108 moveto
+0 108 lineto
+0 72 lineto
+70 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.273 0.733 1.000 nodecolor
+newpath 70 108 moveto
+0 108 lineto
+0 72 lineto
+70 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 85.9 moveto 55 (PACRAT) alignedtext
+grestore
+% ALIST
+gsave
+[ /Rect [ 7 0 63 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=ALIST) >>
+  /Subtype /Link
+/ANN pdfmark
+0.273 0.733 1.000 nodecolor
+newpath 63 36 moveto
+7 36 lineto
+7 0 lineto
+63 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.273 0.733 1.000 nodecolor
+newpath 63 36 moveto
+7 36 lineto
+7 0 lineto
+63 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+14.5 13.9 moveto 41 (ALIST) alignedtext
+grestore
+% PACRAT->ALIST
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 35 72 moveto
+35 64 35 55 35 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 38.5 46 moveto
+35 36 lineto
+31.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 38.5 46 moveto
+35 36 lineto
+31.5 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+%%BoundingBox: 36 36 114 152
+end
+restore
+%%EOF
diff --git a/books/ps/v104interfacegroebnerpackage.ps b/books/ps/v104interfacegroebnerpackage.ps
new file mode 100644
index 0000000..af3591e
--- /dev/null
+++ b/books/ps/v104interfacegroebnerpackage.ps
@@ -0,0 +1,268 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Graphviz version 2.20.2 (Mon Mar 30 10:09:11 UTC 2009)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: (atend)
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+       dup 1 exch div /InvScaleFactor exch def
+       scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw text fitted to its expected width
+/alignedtext {			% width text
+	/text exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			[] 0 setdash
+			text stringwidth pop width exch sub text length div 0 text ashow
+		} if
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+setupLatin1
+%%Page: 1 1
+%%PageBoundingBox: 36 36 124 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 88 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% INTERGB
+gsave
+[ /Rect [ 0 72 80 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.4.pdf#nameddest=INTERGB) >>
+  /Subtype /Link
+/ANN pdfmark
+0.939 0.733 1.000 nodecolor
+newpath 80 108 moveto
+0 108 lineto
+0 72 lineto
+80 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.939 0.733 1.000 nodecolor
+newpath 80 108 moveto
+0 108 lineto
+0 72 lineto
+80 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+8 85.9 moveto 64 (INTERGB) alignedtext
+grestore
+% PFECAT
+gsave
+[ /Rect [ 5 0 75 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=PFECAT) >>
+  /Subtype /Link
+/ANN pdfmark
+0.606 0.733 1.000 nodecolor
+newpath 75 36 moveto
+5 36 lineto
+5 0 lineto
+75 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.606 0.733 1.000 nodecolor
+newpath 75 36 moveto
+5 36 lineto
+5 0 lineto
+75 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+13 13.9 moveto 54 (PFECAT) alignedtext
+grestore
+% INTERGB->PFECAT
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 40 72 moveto
+40 64 40 55 40 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 43.5 46 moveto
+40 36 lineto
+36.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 43.5 46 moveto
+40 36 lineto
+36.5 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+%%BoundingBox: 36 36 124 152
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index c0c102e..5b51908 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+20100509 tpd src/axiom-website/patches.html 20100509.01.tpd.patch
+20100509 tpd src/algebra/Makefile document and test PACRAT
+20100509 tpd books/bookvol5 expose PseudoAlgebraicClosureOfRationalNumber
+20100509 tpd books/bookvol10.3 add PseudoAlgebraicClosureOfRationalNumber
+20100509 tpd books/ps/v104interfacegroebnerpackage.ps added
+20100509 tpd books/ps/v103pseudoalgebraicclosureofrationalnumber.ps added
 20100508 tpd src/axiom-website/patches.html 20100508.01.tpd.patch
 20100508 tpd v104factorisationoverpseudoalgebraicclosureofrationalnumber.ps add
 20100508 tpd src/algebra/Makefile add FACTRN test and help
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 3207f8e..08e33de 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -9946,7 +9946,8 @@ LAYER16=\
   ${OUT}/NAGS.o     ${OUT}/NAGSP.o    ${OUT}/NREP.o     ${OUT}/NUMFMT.o   \
   ${OUT}/OC.o       ${OUT}/OC-.o      ${OUT}/ODEPACK.o  ${OUT}/ODERAT.o   \
   ${OUT}/OMERR.o    ${OUT}/OMERRK.o   ${OUT}/OPTPACK.o  ${OUT}/OSI.o      \
-  ${OUT}/OVAR.o     ${OUT}/PATTERN.o  ${OUT}/PMKERNEL.o ${OUT}/PMSYM.o    \
+  ${OUT}/OVAR.o     ${OUT}/PACRAT.o  \
+  ${OUT}/PATTERN.o  ${OUT}/PMKERNEL.o ${OUT}/PMSYM.o    \
   ${OUT}/POLY.o     ${OUT}/PRIMELT.o  ${OUT}/QALGSET2.o ${OUT}/QEQUAT.o   \
   ${OUT}/QUATCAT.o  ${OUT}/QUATCAT-.o ${OUT}/RECLOS.o   ${OUT}/REP1.o     \
   ${OUT}/RESULT.o   ${OUT}/RFFACT.o   ${OUT}/RMATRIX.o  ${OUT}/ROMAN.o    \
@@ -11376,6 +11377,29 @@ LAYER16=\
 /*"OVAR" -> {"STRING"; "CHAR"; "SINT"; "OUTFORM"; "PRIMARR"; "A1AGG-"}*/
 /*"OVAR" -> {"ISTRING"; "SRAGG-"; "FLAGG-"; "LNAGG-"; "NNI"; "PI"}*/
 
+"PACRAT" [color="#88FF44",href="bookvol10.3.pdf#nameddest=PACRAT"]
+/*"PACRAT" -> {
+/*"PACRAT" -> {"PACRATC"; "PACPERC"; "FIELD"; "EUCDOM"; "PID"; "GCDDOM"}*/
+/*"PACRAT" -> {"INTDOM"; "COMRING"; "RING"; "RNG"; "ABELGRP"; "CABMON"}*/
+/*"PACRAT" -> {"ABELMON"; "ABELSG"; "SETCAT"; "BASTYPE"; "KOERCE" "SGROUP"}*/
+/*"PACRAT" -> {"MONOID"; "LMODULE"; "BMODULE"; "RMODULE"; "ALGEBRA"}*/
+/*"PACRAT" -> {"MODULE"; "ENTIRER"; "UFD"; "DIVRING"; "CHARZ"; "RETRACT"}*/
+/*"PACRAT" -> {"XF"; "VSPACE"; "FPC"; "CHARNZ"; "FINITE"; "INS"; "OINTDOM"}*/
+/*"PACRAT" -> {"ORDRING"; "OAGROUP"; "OCAMON"; "OAMON"; "OASGP"; "ORDSET"}*/
+/*"PACRAT" -> {"DIFRING"; "KONVERT"; "LINEXP"; "PATMAB"; "CFCAT"; "REAL"}*/
+/*"PACRAT" -> {"STEP"; "INT"; "NNI"; "PI"; "LIST"; "ILIST"; "LSAGG-"}*/
+/*"PACRAT" -> {"STAGG-"; "ELAGG-"; "FLAGG-"; "URAGG-"; "LNAGG-"; "RCAGG-"}*/
+/*"PACRAT" -> {"IXAGG-"; "CLAGG-"; "HOAGG-"; "ORDSET-"; "AGG-"; "ELTAGG-"}*/
+/*"PACRAT" -> {"SETCAT-"; "BASTYPE-"; "VECTOR"; "IVECTOR"; "IARRAY1"}*/
+/*"PACRAT" -> {"VECTCAT-"; "A1AGG-"; "UPOLYC"; "POLYCAT"; "PDRING"; "FAMR"}*/
+/*"PACRAT" -> {"AMR"; "FRETRCT"; "EVALAB"; "IEVALAB"; "FLINEXP"; "PFECAT"}*/
+/*"PACRAT" -> {"ELTAB"; "DIFEXT"; "SYMBOL"; "REF"}*/
+"PACRAT" -> "ALIST"
+/*"PACRAT" -> {"STRING"; "CHAR"; "SINT"; "OUTFORM"; "PRIMARR"; "ISTRING"}*/
+/*"PACRAT" -> {"SRAGG-"; "LSAGG"; "STAGG"; "URAGG"; "RCAGG"; "HOAGG"; "AGG"}*/
+/*"PACRAT" -> {"TYPE"; "LNAGG"; "IXAGG"; "ELTAGG"; "CLAGG"; "FLAGG"; "ELAGG"}*/
+/*"PACRAT" -> {"OM"; "BOOLEAN"; "QFCAT"; "FEVALAB"; "PATAB"; "FPATMAB"}*/
+
 "PATTERN" [color="#88FF44",href="bookvol10.3.pdf#nameddest=PATTERN"]
 /*"PATTERN" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "RETRACT"; "SYMBOL"; "INT"}*/
 /*"PATTERN" -> "REF"*/
@@ -15924,6 +15948,21 @@ ${MID}/FACTRN.nrlib/code.o: ${MID}/FACTRN.spad
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
+<<newcode>>=
+
+PACRATDEPS = PACPERC PACRATC FACTRN
+
+${MID}/PACRAT.nrlib/code.o: ${MID}/PACRAT.spad
+	@echo P3 making ${MID}/PACRAT.nrlib/code.o from ${MID}/PACRAT.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${PACRATDEPS} \n )co PACRAT.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${PACRATDEPS} \n )co PACRAT.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+@
 
 \section{Broken Files}
 These files are Aldor files
@@ -16737,6 +16776,7 @@ SPADHELP=\
  ${HELP}/Product.help \
  ${HELP}/PseudoAlgebraicClosureOfFiniteFieldCategory.help \
  ${HELP}/PseudoAlgebraicClosureOfPerfectFieldCategory.help \
+ ${HELP}/PseudoAlgebraicClosureOfRationalNumber.help \
  ${HELP}/PseudoAlgebraicClosureOfRationalNumberCategory.help \
  ${HELP}/Quaternion.help \
  ${HELP}/QuaternionCategoryFunctions2.help \
@@ -16886,6 +16926,7 @@ REGRESS= \
  Product.regress \
  PseudoAlgebraicClosureOfFiniteFieldCategory.regress \
  PseudoAlgebraicClosureOfPerfectFieldCategory.regress \
+ PseudoAlgebraicClosureOfRationalNumber.regress \
  PseudoAlgebraicClosureOfRationalNumberCategory.regress \
  Quaternion.regress \
  QuaternionCategoryFunctions2.regress \
@@ -18087,9 +18128,24 @@ ${HELP}/PseudoAlgebraicClosureOfPerfectFieldCategory.help: \
 	@echo "PseudoAlgebraicClosureOfPerfectFieldCategory (PACPERC)" \
            >>${HELPFILE}
 
+${HELP}/PseudoAlgebraicClosureOfRationalNumber.help: \
+           ${BOOKS}/bookvol10.3.pamphlet
+	@echo 7938 create PseudoAlgebraicClosureOfRationalNumber.help \
+           from ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"PseudoAlgebraicClosureOfRationalNumber.help" \
+           ${BOOKS}/bookvol10.3.pamphlet \
+           >${HELP}/PseudoAlgebraicClosureOfRationalNumber.help
+	@cp ${HELP}/PseudoAlgebraicClosureOfRationalNumber.help \
+           ${HELP}/PACRAT.help
+	@${TANGLE} -R"PseudoAlgebraicClosureOfRationalNumber.input" \
+            ${BOOKS}/bookvol10.3.pamphlet \
+            >${INPUT}/PseudoAlgebraicClosureOfRationalNumber.input
+	@echo "PseudoAlgebraicClosureOfRationalNumber (PACRAT)" \
+           >>${HELPFILE}
+
 ${HELP}/PseudoAlgebraicClosureOfRationalNumberCategory.help: \
            ${BOOKS}/bookvol10.2.pamphlet
-	@echo 7938 create PseudoAlgebraicClosureOfRationalNumberCategory.help \
+	@echo 7939 create PseudoAlgebraicClosureOfRationalNumberCategory.help \
            from ${BOOKS}/bookvol10.2.pamphlet
 	@${TANGLE} -R"PseudoAlgebraicClosureOfRationalNumberCategory.help" \
            ${BOOKS}/bookvol10.2.pamphlet \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 6e39d03..197cd9e 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2675,5 +2675,7 @@ src/axiom-website/documentation.html quote Bill Hart on LP<br/>
 books/bookvol10.3 document and test Interval<br/>
 <a href="patches/20100508.01.tpd.patch">20100508.01.tpd.patch</a>
 books/bookvol10.2 fix PseudoAlgebraicClosureOfPerfectFieldCategory<br/>
+<a href="patches/20100509.01.tpd.patch">20100509.01.tpd.patch</a>
+books/bookvol10.3 add PseudoAlgebraicClosureOfRationalNumber<br/>
  </body>
 </html>
