diff --git a/doc/semitrans.xml b/doc/semitrans.xml
index f3153b9a2..e3709b839 100644
--- a/doc/semitrans.xml
+++ b/doc/semitrans.xml
@@ -384,3 +384,30 @@ gap> FixedPointsOfTransformationSemigroup(S);
<#/GAPDoc>
+
+<#GAPDoc Label="WreathProduct">
+
+
+ A transformation semigroup.
+
+ If M is a transformation monoid (or a permutation group) of degree
+ m, and S is a transformation semigroup (or permutation
+ group) of degree s, the operation
+ WreathProduct(M, S) returns the wreath product of
+ M and S, in terms of an embedding in the full
+ transformation monoid of degree m * s.
+
+ T := FullTransformationMonoid(3);;
+gap> C := Group((1, 3));;
+gap> W := WreathProduct(T, C);;
+gap> Size(W);
+39366
+gap> WW := WreathProduct(C, T);;
+gap> Size(WW);
+216
+]]>
+
+
+
+<#/GAPDoc>
diff --git a/doc/z-chap06.xml b/doc/z-chap06.xml
index 1306ace2e..504ef540c 100644
--- a/doc/z-chap06.xml
+++ b/doc/z-chap06.xml
@@ -359,6 +359,7 @@ true]]>
<#Include Label = "SubsemigroupByProperty">
<#Include Label = "InverseSubsemigroupByProperty">
<#Include Label = "DirectProduct">
+ <#Include Label = "WreathProduct">
diff --git a/doc/z-chap13.xml b/doc/z-chap13.xml
index c49038202..845f0ddfa 100644
--- a/doc/z-chap13.xml
+++ b/doc/z-chap13.xml
@@ -201,7 +201,7 @@
<#Include Label = "Normalizer">
-
+
diff --git a/doc/z-chap15.xml b/doc/z-chap15.xml
index 09347b028..941147f46 100644
--- a/doc/z-chap15.xml
+++ b/doc/z-chap15.xml
@@ -51,7 +51,6 @@
-
Properties of inverse semigroups
diff --git a/gap/semigroups/semitrans.gd b/gap/semigroups/semitrans.gd
index 7c23f790c..87f4c3223 100644
--- a/gap/semigroups/semitrans.gd
+++ b/gap/semigroups/semitrans.gd
@@ -39,3 +39,7 @@ DeclareAttribute("EndomorphismMonoid", IsDigraph);
DeclareOperation("EndomorphismMonoid", [IsDigraph, IsHomogeneousList]);
DeclareOperation("DirectProductOp", [IsList, IsSemigroup]);
+
+DeclareOperation("WreathProduct",
+ [IsMultiplicativeElementCollection,
+ IsMultiplicativeElementCollection]);
diff --git a/gap/semigroups/semitrans.gi b/gap/semigroups/semitrans.gi
index 4a14878ee..540bfebc0 100644
--- a/gap/semigroups/semitrans.gi
+++ b/gap/semigroups/semitrans.gi
@@ -753,6 +753,77 @@ function(S)
return t;
end);
+InstallMethod(WreathProduct,
+"for a transformation monoid and a permutation group",
+[IsTransformationMonoid, IsPermGroup],
+function(M, G)
+ return WreathProduct(M, AsMonoid(IsTransformationMonoid, G));
+end);
+
+InstallMethod(WreathProduct,
+"for a permutation group and a transformation semigroup",
+[IsPermGroup, IsTransformationSemigroup],
+function(G, S)
+ return WreathProduct(AsMonoid(IsTransformationMonoid, G), S);
+end);
+
+InstallMethod(WreathProduct,
+"for a transformation monoid and a transformation semigroup",
+[IsTransformationMonoid, IsTransformationSemigroup],
+function(M, S)
+ local maps, newmap, gensM, gensS, next, reps, orbs, gen1, n, i, s, x, m, y,
+ rimage;
+ if not IsMonoidAsSemigroup(S) then
+ ErrorNoReturn("Semigroups: WreathProduct: usage,\n",
+ "the second argument should be a monoid (as semigroup),");
+ fi;
+
+ m := DegreeOfTransformationCollection(M);
+
+ gensM := List(GeneratorsOfMonoid(M), x -> ImageListOfTransformation(x, m));
+ gensS := GeneratorsOfSemigroup(S);
+
+ orbs := List(ComponentsOfTransformationSemigroup(S), Minimum);
+ n := DegreeOfTransformationCollection(S);
+ rimage := [1 .. n];
+
+ for x in orbs do
+ for y in gensS do
+ RemoveSet(rimage, x ^ y);
+ od;
+ od;
+
+ maps := []; # final generating set for the wreath product
+
+ # move copies of M as by the action induced by S
+ next := [1 .. m * n];
+ for s in gensS do
+ for i in [1 .. n] do
+ next{[1 .. m] + (i - 1) * m} := [1 .. m] + (i ^ s - 1) * m;
+ od;
+ Add(maps, Transformation(next));
+ od;
+
+ gen1 := gensS[1];
+ for i in orbs do
+ newmap := ShallowCopy(ImageListOfTransformation(maps[1], m * n));
+ for x in gensM do
+ newmap{[1 .. m] + (i - 1) * m} := x + (i ^ gen1 - 1) * m;
+ Add(maps, Transformation(newmap));
+ od;
+ od;
+
+ for i in rimage do
+ newmap := OnTuples([1 .. m * n], maps[1]);
+ for x in gensM do
+ newmap{[1 .. m] + (i - 1) * m} := x + (i ^ gen1 - 1) * m;
+ Add(maps, Transformation(newmap));
+ od;
+ od;
+
+ return Semigroup(maps);
+end);
+
#############################################################################
# ?. Isomorphisms
#############################################################################
diff --git a/tst/standard/semitrans.tst b/tst/standard/semitrans.tst
index 53d9c5c71..e367c09b7 100644
--- a/tst/standard/semitrans.tst
+++ b/tst/standard/semitrans.tst
@@ -2813,6 +2813,45 @@ gap> Unbind(rels);
gap> Unbind(x);
gap> Unbind(y);
+#T# Tests wreath product of transf. semgp. and perm. group
+gap> T := FullTransformationMonoid(3);;
+gap> C := Group((1, 3));;
+gap> TC := WreathProduct(T, C);;
+gap> Size(TC) = 39366;
+true
+gap> CC := AsMonoid(IsTransformationMonoid, C);;
+gap> DP := DirectProduct(T, CC);;
+gap> IsSubsemigroup(TC, DP);
+true
+gap> C := Group((1, 2));;
+gap> TC := WreathProduct(T, C);;
+gap> Size(TC) = 1458;
+true
+gap> CC := AsMonoid(IsTransformationMonoid, C);;
+gap> DP := DirectProduct(T, CC);;
+gap> IsSubsemigroup(TC, DP);
+true
+
+#T# Test wreath product of perm. group and transf. semgp.
+gap> W := WreathProduct(Group((1, 2)), FullTransformationMonoid(3));;
+gap> Size(W);
+216
+gap> Transformation([5, 6, 1, 2, 3, 4]) in W;
+true
+gap> Transformation([5, 5, 1, 2, 3, 4]) in W;
+false
+
+#T# Tests wreath product of a monoid not satisfying IsTransformationMonoid
+gap> S := Semigroup(Transformation([1, 2, 3, 3, 3]));;
+gap> C := Group((1, 2));;
+gap> WW := WreathProduct(C, S);;
+gap> Size(WW);
+32
+gap> Transformation([2, 1, 4, 3, 6, 5, 6, 5, 6, 5]) in WW;
+true
+gap> Transformation([2, 1, 4, 3, 6, 5, 6, 5, 7, 8]) in WW;
+false
+
#E#
gap> SEMIGROUPS.StopTest();
gap> STOP_TEST("Semigroups package: standard/semitrans.tst");