diff --git a/CHANGES.md b/CHANGES.md
index d84cf79..9e3c8c9 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,6 @@
## CHANGES to the 'XMod' package
-## 2.96 -> 2.97-dev (04/12/2025)
+## 2.96 -> 2.97 (10/12/2025)
* (04/12/25) remove various unused categories etc in dom2dnd.gd
* (03/12/25) comment out use of Ancestor - it is no longer defined in groupoids
diff --git a/doc/gpd2obj.xml b/doc/gpd2obj.xml
index a235bb3..86f845a 100644
--- a/doc/gpd2obj.xml
+++ b/doc/gpd2obj.xml
@@ -57,15 +57,16 @@ In the example the crossed module DX4 has discrete source,
while the crossed module CX4 has connected source.
These are groupoid generalisations of
and the example X4 in .
-
-These calculations are WRONG!
-Need more investigation of XModAction.
+
+
+
+
+
X4 := XModByNormalSubgroup( s4, a4 );;
gap> CX4 := SinglePiecePreXModWithObjects( X4, [-6,-5,-4], false );
single piece precrossed module with objects
source groupoid:
@@ -102,7 +103,7 @@ The precrossed module CX4 belongs to the category
Set( KnownPropertiesOfObject( CX4 ) );
+gap> Set( KnownPropertiesOfObject( CX4 ) );
[ "CanEasilyCompareElements", "CanEasilySortElements", "IsAssociative",
"IsDuplicateFree", "IsGeneratorsOfSemigroup", "IsPreXModWithObjects",
"IsSinglePieceDomain", "IsXModWithObjects" ]
@@ -127,7 +128,7 @@ they were constructed.
IsPermPreXModWithObjects( CX4 );
true
-gap> IsPcPreXModWithObjects( CX4 );
+gap> IsPcPreXModWithObjects( CX4 );
false
gap> IsFpPreXModWithObjects( CX4 );
false
@@ -142,8 +143,8 @@ false
ObjectList
The attributes of a precrossed module with objects include the standard
-Source; Range;
-;
+Source; Range;
+;
and
as with precrossed modules of groups.
There is also ObjectList,
@@ -160,13 +161,13 @@ where the group is the automorphism group of the range groupoid.
Root2dGroup( CX4 );
+gap> Root2dGroup( CX4 );
[a4->s4]
-gap> actC := XModAction( CX4 );;
-gap> Size( Range( actC ) );
+gap> actC := XModAction( CX4 );;
+gap> Size( Range( actC ) );
20736
-gap> r1 := Arrow( Cs4, (1,2,3,4), -4, -5 );;
-gap> ImageElm( actC, r1 );
+gap> r1 := Arrow( Cs4, (1,2,3,4), -4, -5 );;
+gap> ir1 := ImageElm( actC, r1 );
[groupoid homomorphism : Ca4 -> Ca4
[ [ [(1,2,3) : -6 -> -6], [(2,3,4) : -6 -> -6], [() : -6 -> -5],
[() : -6 -> -4] ],
@@ -177,12 +178,12 @@ gap> ## calculate s1^r1
gap> ims1 := ImageElmXModAction( CX4, s1, r1 );
[(1,2,3) : -6 -> -6]
gap> ## repeat using DX4
-gap> actD := XModAction( DX4 );;
+gap> actD := XModAction( DX4 );;
gap> SetName( Range( actD ), "autD" );
gap> Size( Range( actD ) );
82944
-gap> r2 := Arrow( Ds4, (1,2,3,4), -7, -8 );;
-gap> ImageElm( actD, r2 );
+gap> r2 := Arrow( Ds4, (1,2,3,4), -7, -8 );;
+gap> ImageElm( actD, r2 );
[groupoid homomorphism : Da4 -> Da4
: 0 -> 0]
gap> s2 := Arrow( Da4, (1,2,4), -8, -8 );;
diff --git a/tst/manual/gpd2obj.tst b/tst/manual/gpd2obj.tst
index e7f93ae..2e00fbe 100644
--- a/tst/manual/gpd2obj.tst
+++ b/tst/manual/gpd2obj.tst
@@ -5,20 +5,20 @@
#Y Copyright (C) 2001-2025, Chris Wensley et al,
##
gap> START_TEST( "XMod package: gpd2obj.tst" );
-gap> saved_infolevel_xmod := InfoLevel( InfoXMod );;
+gap> saved_infolevel_xmod := InfoLevel( InfoXMod );;
gap> SetInfoLevel( InfoXMod, 0 );;
## make this test independent of gp2obj.tst
-gap> s4 := Group( (1,2), (2,3), (3,4) );;
-gap> a4 := Subgroup( s4, [ (1,2,3), (2,3,4) ] );;
-gap> SetName( s4, "s4" ); SetName( a4, "a4" );
+gap> s4 := Group( (1,2), (2,3), (3,4) );;
+gap> a4 := Subgroup( s4, [ (1,2,3), (2,3,4) ] );;
+gap> SetName( s4, "s4" ); SetName( a4, "a4" );
gap> X4 := XModByNormalSubgroup( s4, a4 );;
## Chapter 10
-## Subsection 10.1.1
+## Subsection 10.1.2
gap> CX4 := SinglePiecePreXModWithObjects( X4, [-6,-5,-4], false );
single piece precrossed module with objects
source groupoid:
@@ -38,28 +38,28 @@ gap> SetName( DX4, "DX4" );
gap> Da4 := Source( DX4 );; SetName( Da4, "Da4" );
gap> Ds4 := Range( DX4 );; SetName( Ds4, "Ds4" );
-## Subsection 10.1.2
-gap> Set( KnownPropertiesOfObject( CX4 ) );
+## Subsection 10.1.3
+gap> Set( KnownPropertiesOfObject( CX4 ) );
[ "CanEasilyCompareElements", "CanEasilySortElements", "IsAssociative",
"IsDuplicateFree", "IsGeneratorsOfSemigroup", "IsPreXModWithObjects",
"IsSinglePieceDomain", "IsXModWithObjects" ]
-## Subsection 10.1.3
+## Subsection 10.1.4
gap> IsPermPreXModWithObjects( CX4 );
true
-gap> IsPcPreXModWithObjects( CX4 );
+gap> IsPcPreXModWithObjects( CX4 );
false
gap> IsFpPreXModWithObjects( CX4 );
false
-## Subsection 10.1.4
-gap> Root2dGroup( CX4 );
+## Subsection 10.1.5
+gap> Root2dGroup( CX4 );
[a4->s4]
-gap> actC := XModAction( CX4 );;
-gap> Size( Range( actC ) );
+gap> actC := XModAction( CX4 );;
+gap> Size( Range( actC ) );
20736
-gap> r1 := Arrow( Cs4, (1,2,3,4), -4, -5 );;
-gap> ImageElm( actC, r1 );
+gap> r1 := Arrow( Cs4, (1,2,3,4), -4, -5 );;
+gap> ir1 := ImageElm( actC, r1 );
[groupoid homomorphism : Ca4 -> Ca4
[ [ [(1,2,3) : -6 -> -6], [(2,3,4) : -6 -> -6], [() : -6 -> -5],
[() : -6 -> -4] ],
@@ -70,12 +70,12 @@ gap> ## calculate s1^r1
gap> ims1 := ImageElmXModAction( CX4, s1, r1 );
[(1,2,3) : -6 -> -6]
gap> ## repeat using DX4
-gap> actD := XModAction( DX4 );;
+gap> actD := XModAction( DX4 );;
gap> SetName( Range( actD ), "autD" );
gap> Size( Range( actD ) );
82944
-gap> r2 := Arrow( Ds4, (1,2,3,4), -7, -8 );;
-gap> ImageElm( actD, r2 );
+gap> r2 := Arrow( Ds4, (1,2,3,4), -7, -8 );;
+gap> ImageElm( actD, r2 );
[groupoid homomorphism : Da4 -> Da4
: 0 -> 0]
gap> s2 := Arrow( Da4, (1,2,4), -8, -8 );;
@@ -83,5 +83,5 @@ gap> ## calculate s2^r2
gap> ims2 := ImageElmXModAction( DX4, s2, r2 );
[(1,2,3) : -9 -> -9]
-gap> SetInfoLevel( InfoXMod, saved_infolevel_xmod );;
+gap> SetInfoLevel( InfoXMod, saved_infolevel_xmod );;
gap> STOP_TEST( "gpd2obj.tst", 10000 );