diff --git a/lib/csetgrp.gd b/lib/csetgrp.gd
index 3dfcf8b20d..eab7e2a1ce 100644
--- a/lib/csetgrp.gd
+++ b/lib/csetgrp.gd
@@ -329,9 +329,11 @@ DeclareCategory("IsRightCoset", IsDomain and IsExternalOrbit and
##
##
##
-## A (right) coset is considered a bicoset if its set of elements simultaneously forms a left
-## coset for the same subgroup. This is the case, for example, if the coset representative normalizes
-## the subgroup.
+## bicoset
+## A (right) coset Ug is considered a bicoset if its set of
+## elements simultaneously forms a left coset for the same subgroup. This is
+## the case if and only if the coset representative g normalizes the
+## subgroup U.
##
##
## <#/GAPDoc>
diff --git a/lib/csetgrp.gi b/lib/csetgrp.gi
index 8e36cd2c9b..1d12e398b1 100644
--- a/lib/csetgrp.gi
+++ b/lib/csetgrp.gi
@@ -634,7 +634,7 @@ function(c)
local s,r;
s:=ActingDomain(c);
r:=Representative(c);
- return ForAll(GeneratorsOfGroup(s),x->r*x/r in s);
+ return ForAll(GeneratorsOfGroup(s),x->x^r in s);
end);
InstallMethodWithRandomSource(Random,
@@ -667,11 +667,11 @@ function(a,b)
local c;
if ActingDomain(a)<>ActingDomain(b) then TryNextMethod();fi;
if not IsBiCoset(a) then # product does not require b to be bicoset
- TryNextMethod();
+ ErrorNoReturn("right cosets can only be multiplied if the left operand is a bicoset");
fi;
c:=RightCoset(ActingDomain(a), Representative(a) * Representative(b) );
- if IsBiCoset(b) then
- SetIsBiCoset(c,true);
+ if HasIsBiCoset(b) then
+ SetIsBiCoset(c,IsBiCoset(b));
fi;
return c;
@@ -684,7 +684,7 @@ local s,r;
s:=ActingDomain(a);
r:=Representative(a);
if not IsBiCoset(a) then
- Error("Inversion only works for cosets of normal subgroups");
+ ErrorNoReturn("only right cosets which are bicosets can be inverted");
fi;
r:=RightCoset(s,Inverse(r));
SetIsBiCoset(r,true);
diff --git a/tst/testbugfix/2018-08-08-bicosets.tst b/tst/testbugfix/2018-08-08-bicosets.tst
new file mode 100644
index 0000000000..6823e824c2
--- /dev/null
+++ b/tst/testbugfix/2018-08-08-bicosets.tst
@@ -0,0 +1,25 @@
+# We used to allow multiplying and inverting right cosets for which this
+# was not valid. This test verifies this is not the case anymore.
+# See
+gap> G := SymmetricGroup(3);;
+gap> U := Group( (1,2) );;
+gap> cos1 := RightCoset(U, (1,2));;
+gap> cos2 := RightCoset(U, (1,3));;
+gap> IsBiCoset(cos1);
+true
+gap> IsBiCoset(cos2);
+false
+
+#
+gap> cos1*cos1 = cos1;
+true
+gap> cos1*cos2 = cos2;
+true
+gap> cos2*cos1;
+Error, right cosets can only be multiplied if the left operand is a bicoset
+
+#
+gap> cos1^-1 = cos1;
+true
+gap> cos2^-1;
+Error, only right cosets which are bicosets can be inverted