diff --git a/libwccl/ops/actions/unify.cpp b/libwccl/ops/actions/unify.cpp
index 0733efdd7ea3f413bb1e64a5c119164a461161d8..0cf51523b57798165bbf0fca69303c3b103ab651 100644
--- a/libwccl/ops/actions/unify.cpp
+++ b/libwccl/ops/actions/unify.cpp
@@ -57,9 +57,13 @@ Bool Unify::execute(const ActionExecContext& context) const
 			std::vector<Corpus2::Lexeme> curr_rem;
 			// get only lexemes that agree with a lexeme from previous token
 			foreach(const Corpus2::Lexeme& curr_lex, remainings[i]) {
+				int curr_match_cats = attribs->matching_categories(curr_lex.tag());
 				foreach(const Corpus2::Lexeme& prev_lex, prev_rem) {
 					Corpus2::Tag inter = curr_lex.tag().get_masked(prev_lex.tag());
-					if (attribs->matching_categories(inter) == attribs->matching_categories(curr_lex.tag())) {
+					int min_to_match = std::min(
+								curr_match_cats,
+								attribs->matching_categories(prev_lex.tag()));
+					if (attribs->matching_categories(inter) == min_to_match) {
 						curr_rem.push_back(curr_lex);
 						break;
 					}