diff --git a/alib2algo/src/automaton/properties/BackwardBisimulation.h b/alib2algo/src/automaton/properties/BackwardBisimulation.h
index a19650651d116a26d70d6363cb3a4dc15dc81896..9215c55e07ca2d334dff730a56c2f3a769ae04af 100644
--- a/alib2algo/src/automaton/properties/BackwardBisimulation.h
+++ b/alib2algo/src/automaton/properties/BackwardBisimulation.h
@@ -118,14 +118,14 @@ ext::set < ext::pair < StateType, StateType > > BackwardBisimulation::backwardBi
 				if ( ! backwardBisimulation.contains ( ext::make_pair ( p, q ) ) )
 					continue;
 
-				for ( const std::pair < const ext::pair < SymbolType, StateType >, StateType > & pTransition : fta.getTransitionsToState ( p ) ) {
+				for ( const std::pair < const ext::pair < StateType, SymbolType >, StateType > & pTransition : fta.getTransitionsToState ( p ) ) {
 
 					bool exists = false;
-					for ( const std::pair < const ext::pair < SymbolType, StateType >, StateType > & qTransition : fta.getTransitionsToState ( q ) ) {
-						if ( qTransition.first.first != pTransition.first.first )
+					for ( const std::pair < const ext::pair < StateType, SymbolType >, StateType > & qTransition : fta.getTransitionsToState ( q ) ) {
+						if ( qTransition.first.second != pTransition.first.second )
 							continue;
 
-						if ( backwardBisimulation.contains ( ext::make_pair ( pTransition.first.second, qTransition.first.second) ) ) {
+						if ( backwardBisimulation.contains ( ext::make_pair ( pTransition.first.first, qTransition.first.first ) ) ) {
 							exists = true;
 							break;
 						}
diff --git a/alib2algo/src/automaton/properties/ForwardBisimulation.h b/alib2algo/src/automaton/properties/ForwardBisimulation.h
index ccde55cef627ed4e160f0ad7e4250de78fc71685..963b37081d690080c96f2ad7383246071a17d517 100644
--- a/alib2algo/src/automaton/properties/ForwardBisimulation.h
+++ b/alib2algo/src/automaton/properties/ForwardBisimulation.h
@@ -119,11 +119,17 @@ ext::set < ext::pair < StateType, StateType > > ForwardBisimulation::forwardBisi
 				if ( ! forwardBisimulation.contains ( ext::make_pair ( p, q ) ) )
 					continue;
 
-				for ( const std::pair < const ext::pair < SymbolType, StateType >, StateType > & transition : fta.getTransitions ( ) ) {
-					if ( transition.first.second == p ) {
-						const auto & transition2 = fta.getTransitions ( ).find ( std::make_pair ( transition.first.first, q ) );
+				for ( const std::pair < const ext::pair < StateType, SymbolType >, StateType > & pTransition : fta.getTransitions ( ) ) {
+					if ( pTransition.first.first == p ) {
+						bool exists = false;
+						for ( const std::pair < const ext::pair < StateType, SymbolType >, StateType > & qTransition : fta.getTransitions ( ).equal_range ( std::make_pair ( q, pTransition.first.second ) ) ) {
+							if ( forwardBisimulation.contains ( ext::make_pair ( pTransition.second, qTransition.second ) ) ) {
+								exists = true;
+								break;
+							}
+						}
 
-						if ( transition2 == fta.getTransitions ( ).end ( ) || ! forwardBisimulation.contains ( ext::make_pair ( transition.second, transition2->second ) ) ) {
+						if ( ! exists ) {
 							forwardBisimulation.erase ( ext::make_pair ( p, q ) );
 							forwardBisimulation.erase ( ext::make_pair ( q, p ) );
 							changed = true;
@@ -155,15 +161,21 @@ ext::set < ext::pair < StateType, StateType > > ForwardBisimulation::forwardBisi
 				if ( ! forwardBisimulation.contains ( ext::make_pair ( p, q ) ) )
 					continue;
 
-				for ( const std::pair < const ext::pair < common::ranked_symbol < SymbolType >, ext::vector < StateType > >, StateType > & transition : fta.getTransitions ( ) ) {
-					for ( size_t i = 0; i < transition.first.second.size ( ); ++ i ) {
-						if ( transition.first.second [ i ] == p ) {
-							ext::vector < StateType > copy = transition.first.second;
+				for ( const std::pair < const ext::pair < common::ranked_symbol < SymbolType >, ext::vector < StateType > >, StateType > & pTransition : fta.getTransitions ( ) ) {
+					for ( size_t i = 0; i < pTransition.first.second.size ( ); ++ i ) {
+						if ( pTransition.first.second [ i ] == p ) {
+							ext::vector < StateType > copy = pTransition.first.second;
 							copy [ i ] = q;
 
-							const auto & transition2 = fta.getTransitions ( ).find ( std::make_pair ( transition.first.first, std::move ( copy ) ) );
+							bool exists = false;
+							for ( const std::pair < const ext::pair < common::ranked_symbol < SymbolType >, ext::vector < StateType > >, StateType > & qTransition : fta.getTransitions ( ).equal_range ( std::make_pair ( pTransition.first.first, std::move ( copy ) ) ) ) {
+								if ( forwardBisimulation.contains ( ext::make_pair ( pTransition.second, qTransition.second ) ) ) {
+									exists = true;
+									break;
+								}
+							}
 
-							if ( transition2 == fta.getTransitions ( ).end ( ) || ! forwardBisimulation.contains ( ext::make_pair ( transition.second, transition2->second ) ) ) {
+							if ( ! exists ) {
 								forwardBisimulation.erase ( ext::make_pair ( p, q ) );
 								forwardBisimulation.erase ( ext::make_pair ( q, p ) );
 								changed = true;