diff --git a/libcorpus2/tagging.cpp b/libcorpus2/tagging.cpp
index 41b073353b8a6a446c874a0bd4ff77a1002320b8..1572fa8355726d4411873be6c6484abb219e5a73 100644
--- a/libcorpus2/tagging.cpp
+++ b/libcorpus2/tagging.cpp
@@ -59,8 +59,7 @@ int mask_card(const Tag& mask)
 			+ PwrNlp::count_bits_set(mask.get_values());
 }
 
-bool select_preferred_disamb(const Tagset& tagset,
-							 Token* token)
+bool select_preferred_disamb(const Tagset& tagset, Token* token)
 {
 	size_t lex_idx = token->get_preferred_lexeme_index(tagset);
 	if(!token->lexemes()[lex_idx].is_disamb()) {
@@ -77,6 +76,18 @@ bool select_preferred_disamb(const Tagset& tagset,
 	return true;
 }
 
+void select_preferred_lexeme(const Tagset& tagset, Token* token)
+{
+	foreach (Lexeme& lex, token->lexemes()) {
+		lex.set_disamb(true);
+	}
+	if (token->lexemes().size() > 1) {
+		std::vector<Lexeme> one;
+		one.push_back(token->get_preferred_lexeme(tagset));
+		token->replace_lexemes(one);
+	}
+}
+
 void expand_optional_attrs(const Tagset& tagset, Token* token)
 {
 	foreach (Lexeme& lex, token->lexemes()) {
diff --git a/libcorpus2/tagging.h b/libcorpus2/tagging.h
index 7ae0a39dd49b1e429b00f0625256afb7c0b38ab0..59fbcd4bfe0c869156c237d6f64c2c2b5b795ee1 100644
--- a/libcorpus2/tagging.h
+++ b/libcorpus2/tagging.h
@@ -50,6 +50,12 @@ int mask_card(const Tag& mask);
   */
 bool select_preferred_disamb(const Tagset& tagset, Token* token);
 
+/** Forces one lexeme per token. The selection is based on tagset
+  * definition order, disamb markers are not respected.
+  * The selected lexeme will be set to disamb=True.
+  */
+void select_preferred_lexeme(const Tagset& tagset, Token* token);
+
 /** Encodes optional attributes with unspecified values as each value set.
   * This is to facilitate safe masking when the value in question is not to be
   * skipped.
diff --git a/swig/tagging.i b/swig/tagging.i
index c9fdd9cdf922473f2f2ac88e487570dabfa03e00..c09e2a1eff46b65f23d3393f70d0df330f620d36 100644
--- a/swig/tagging.i
+++ b/swig/tagging.i
@@ -23,6 +23,8 @@ int mask_card(const Tag& mask);
 
 bool select_preferred_disamb(const Tagset& tagset, Token* token);
 
+void select_preferred_lexeme(const Tagset& tagset, Token* token);
+
 void expand_optional_attrs(const Tagset& tagset, Token* token);
 
 void select_singular_tags(const Tagset& tagset, Token* token);