In this paper we present the design, implementation, and experience in using network layer mechanisms for service differentiation in 802.11 Wireless LANs (WLANs). In particular, we use the Class-Based Weighted Fair Queuing (CBWFQ) mechanism with weights that are dynamically adjusted based on the achieved throughput of the wireless stations and their physical layer transmission rate. The scheme was implemented in a Linux-based testbed, and experiments show that it can effectively support throughput differentiation, and deal with important WLANs problems, such as unfairness due to location-dependent channel errors, uplink-downlink unfairness, and performance degradation for the whole WLAN when a station transmits at a small rate. The experiments involved best-effort traffic, as well as streaming video and voice-over-IP.