diff --git a/CHANGES b/CHANGES
index 04ea7085fc8d63779bd5b45e07b38e4a8ad57771..e001f5ce84da79287225db79e450fba8629a562a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -24,6 +24,7 @@ OpenLDAP 2.4.18 Engineering
 	Fixed slapd-sql with empty attribute (ITS#6163)
 	Added slapo-pcache olcProxyCacheOffline (ITS#6152)
 	Fixed slapo-translucent to honor sizelimit (ITS#6253)
+	Fixed slapo-translucent filter matching (ITS#6255)
 	Fixed slapo-unique filter matching (ITS#6077)
 	Fixed tools off by one error (ITS#6233)
 	Fixed tools resource leaks (ITS#6145)
diff --git a/servers/slapd/overlays/translucent.c b/servers/slapd/overlays/translucent.c
index 6641de2838b75a7a14fd59626a053d2625484c11..dd9328591658dac24cbe4b8f3f79c69a3cf94cdf 100644
--- a/servers/slapd/overlays/translucent.c
+++ b/servers/slapd/overlays/translucent.c
@@ -794,7 +794,7 @@ static int translucent_search_cb(Operation *op, SlapReply *rs) {
 	Debug(LDAP_DEBUG_TRACE, "==> translucent_search_cb: %s\n",
 		rs->sr_entry->e_name.bv_val, 0, 0);
 
-	op->ors_slimit = tc->slimit;
+	op->ors_slimit = tc->slimit + ( tc->slimit > 0 ? 1 : 0 );
 
 	on = tc->on;
 	ov = on->on_bi.bi_private;
@@ -821,6 +821,11 @@ static int translucent_search_cb(Operation *op, SlapReply *rs) {
 				if ( rc == LDAP_COMPARE_TRUE ) {
 					rs->sr_flags |= REP_ENTRY_MUSTBEFREED;
 					rs->sr_entry = re;
+
+					if ( tc->slimit >= 0 && rs->sr_nentries >= tc->slimit ) {
+						return LDAP_SIZELIMIT_EXCEEDED;
+					}
+
 					return SLAP_CB_CONTINUE;
 				} else {
 					entry_free( re );
@@ -870,6 +875,7 @@ static int translucent_search_cb(Operation *op, SlapReply *rs) {
 		for(ax = le->e_attrs; ax; ax = ax->a_next) {
 			for(a = re->e_attrs; a; a = a->a_next) {
 				if(a->a_desc == ax->a_desc) {
+					test_f = 1;
 					if(a->a_vals != a->a_nvals)
 						ber_bvarray_free(a->a_nvals);
 					ber_bvarray_free(a->a_vals);
@@ -953,6 +959,11 @@ static int translucent_search_cb(Operation *op, SlapReply *rs) {
 	}
 
 	op->o_bd = db;
+
+	if ( rc == SLAP_CB_CONTINUE && tc->slimit >= 0 && rs->sr_nentries >= tc->slimit ) {
+		return LDAP_SIZELIMIT_EXCEEDED;
+	}
+
 	return rc;
 }
 
@@ -1099,9 +1110,10 @@ static int translucent_search(Operation *op, SlapReply *rs) {
 
 	op->o_callback = &cb;
 
+	tc.slimit = op->ors_slimit;
+
 	if ( fr || !fl ) {
 		AttributeName *attrs = op->ors_attrs;
-		tc.slimit = op->ors_slimit;
 		op->ors_slimit = SLAP_NO_LIMIT;
 		op->ors_attrs = NULL;
 		op->o_bd = &ov->db;
@@ -1112,7 +1124,6 @@ static int translucent_search(Operation *op, SlapReply *rs) {
 			filter2bv_x( op, fr, &op->ors_filterstr );
 		}
 		rc = ov->db.bd_info->bi_op_search(op, rs);
-		op->ors_slimit = tc.slimit;
 		op->ors_attrs = attrs;
 		op->o_bd = tc.db;
 		if ( fl ) {
@@ -1155,6 +1166,8 @@ static int translucent_search(Operation *op, SlapReply *rs) {
 		send_ldap_result( op, rs );
 	}
 
+	op->ors_slimit = tc.slimit;
+
 	/* Free in reverse order */
 	if ( fl )
 		trans_filter_free( op, fl );