Semi-join reducers were introduced in the late seventies as a means to reduce the communication costs of distributed database systems. Subsequent work in the eighties showed, however, that semi-join reducers are rarely beneficial for the distributed systems of that time. This work shows that semi-join reducers can indeed be beneficial in modern client-server or middleware systems ? either to reduce communication costs or to better exploit all the resources of a system. Furthermore, we present and evaluate alternative ways to extend state-of-the-art (dynamic programming) query optimizers in order to generate good query plans with semi-join reducers. We present two variants, called Access Root and Join Root, which differ in their implementation complexity, their running times, and the quality of plans they produce. We present the results of performance experiments that compare both variants with a traditional query optimizer.