Filter Underdrainage System
The part of a sand filter you never see, and the part that decides whether it filters and backwashes evenly.
Underdrains for rapid gravity filters
The underdrain sits below the media in a rapid sand filter. It collects the filtered water evenly from the whole filter area, and during backwash it spreads the wash water, and air where used, evenly up through the bed. If the underdrain distributes unevenly, parts of the bed are never properly cleaned, mud balls form, and filter runs get shorter.
Adroit supplies filter underdrainage systems for new water treatment plants and for the rehabilitation of existing filters.

When an underdrain matters most
Application
A new filter needs an underdrain designed for its area, media and backwash rates. In existing filters, damaged nozzles, false-floor problems or media loss can lead to uneven collection and backwashing. Replacing or rehabilitating the underdrain can restore more uniform hydraulic distribution across the filter bed.
How a filter underdrain works
Operation
During filtration, water passes down through the filter media and support layers and enters the underdrain through openings spread evenly across the filter floor. The underdrain carries it to the filtered water outlet.
During backwash, flow is reversed. Water, and air in air-scour systems, is fed into the underdrain and released evenly across the whole floor, lifting and scrubbing the media so that the trapped dirt is washed out to the wash water troughs.
Where filter underdrains are used
Application areas
Filter rehabilitation
Replacement of damaged or inefficient underdrains.
Industrial water treatment
Granular media filters.
Benefits of a well-designed underdrain
Features & advantages
Even filtered water collection
Uniform flow through the whole bed.
Uniform backwash
Complete, even cleaning of the media.
Designed for the filter
Layout matched to filter size, media and backwash rates.
No moving parts
A fixed system with little routine maintenance.
Design basis
Dimensions & manufacturing
Rapid gravity / granular media filters
Filter type
Water or air-water, as designed
Backwash
Filter area, media depth and grading, filtration rate, backwash water and air rates
Design inputs
Frequently asked questions
FAQ
What does a filter underdrain do?
It collects filtered water from under the media and distributes backwash water and air evenly across the filter.
Why does uniform backwash matter?
Uneven backwash leaves parts of the bed dirty while over-disturbing others, which shortens filter runs and lowers water quality.
Can you replace the underdrain in an existing filter?
Yes. Underdrain replacement is a common part of filter rehabilitation.
What information do you need?
Filter dimensions, media details, filtration rate, backwash water and air rates and the filter floor drawings.
Brochures, datasheets & media
Downloads
Documents
files
Photos
photos
Videos
videos
Explore more solutions
Related technologies
Submerged Ultrafiltration (SUF)
Membrane modules immersed directly in the tank, drawing water through the membrane under gentle suction for reuse-quality filtrate.
GDisk® Pile Cloth Disk Filter
Fully submerged, gravity-fed tertiary filter with polyester pile cloth media and automatic backwash, designed for high-efficiency suspended-solids removal in a compact footprint.
Need fine screening sized for your inlet works?
Send us your flow rate, channel dimensions and the fine-solids you need to capture — our engineers will recommend the right Stepflow configuration.
Call us
+91 70248-48383Email
[email protected]
Enquire about Filter Underdrainage System
Product enquiry
Tell us about your requirement and we’ll respond with specifications, references and pricing.
Request a quotation
Fields marked * are required. We typically respond within one business day.
(() => {
if (window.adroitEnquiryButtonsReady) return;
window.adroitEnquiryButtonsReady = true;
const rootSelector = ".adroit-contact-form";
const buttonSelector = [
"#wsf-1-field-38",
"#wsf-1-field-39",
].join(", ");
const values = {
"wsf-1-field-38": "Product Enquiry",
"wsf-1-field-39": "Service Request",
};
function getFormRoot(element) {
return element.closest(rootSelector);
}
function getHiddenField(form) {
let field = form.querySelector(
'input[data-enquiry-type-field="true"]'
);
if (!field) {
field = document.createElement("input");
field.type = "hidden";
field.name = "inquiry_type";
field.dataset.enquiryTypeField = "true";
form.appendChild(field);
}
return field;
}
function getErrorRow(formRoot) {
let errorRow = formRoot.querySelector(
'[data-enquiry-error-row="true"]'
);
if (errorRow) return errorRow;
const fieldsGrid = formRoot.querySelector(".wsf-fields");
const firstField = formRoot.querySelector(
"#wsf-1-field-wrapper-20"
);
if (!fieldsGrid || !firstField) return null;
errorRow = document.createElement("div");
errorRow.className =
"wsf-extra-small-12 wsf-tile wsf-field-wrapper";
errorRow.dataset.enquiryErrorRow = "true";
errorRow.hidden = true;
const errorMessage = document.createElement("div");
errorMessage.className = "wsf-invalid-feedback";
errorMessage.textContent = "This field is required.";
errorMessage.setAttribute("aria-live", "polite");
errorRow.appendChild(errorMessage);
fieldsGrid.insertBefore(errorRow, firstField);
return errorRow;
}
function showError(formRoot) {
const errorRow = getErrorRow(formRoot);
if (!errorRow) return;
errorRow.hidden = false;
const errorMessage = errorRow.querySelector(
".wsf-invalid-feedback"
);
if (errorMessage) {
errorMessage.style.display = "block";
}
formRoot.querySelectorAll(buttonSelector).forEach((button) => {
button.classList.add("is-invalid");
button.setAttribute("aria-invalid", "true");
});
}
function clearError(formRoot) {
const errorRow = formRoot.querySelector(
'[data-enquiry-error-row="true"]'
);
if (errorRow) {
errorRow.hidden = true;
}
formRoot.querySelectorAll(buttonSelector).forEach((button) => {
button.classList.remove("is-invalid");
button.removeAttribute("aria-invalid");
});
}
function hasSelection(formRoot) {
return Boolean(
formRoot.querySelector(
"#wsf-1-field-38.is-selected, #wsf-1-field-39.is-selected"
)
);
}
function validateEnquiry(formRoot) {
if (hasSelection(formRoot)) {
clearError(formRoot);
return true;
}
showError(formRoot);
return false;
}
function selectButton(button) {
const formRoot = getFormRoot(button);
const form = button.closest("form");
if (!formRoot || !form) return;
formRoot.querySelectorAll(buttonSelector).forEach((item) => {
const isSelected = item === button;
item.classList.toggle("is-selected", isSelected);
item.setAttribute("aria-pressed", String(isSelected));
});
getHiddenField(form).value = values[button.id] || "";
clearError(formRoot);
}
/*
* Window capture runs before WS Form's button click handler.
* This stops WS Form AJAX submission only when enquiry type is missing.
*/
window.addEventListener(
"click",
(event) => {
const enquiryButton = event.target.closest(
`${rootSelector} #wsf-1-field-38, ${rootSelector} #wsf-1-field-39`
);
if (enquiryButton) {
selectButton(enquiryButton);
return;
}
const submitButton = event.target.closest(
`${rootSelector} button[type="submit"], ${rootSelector} input[type="submit"]`
);
if (!submitButton) return;
const formRoot = getFormRoot(submitButton);
if (!formRoot) return;
if (validateEnquiry(formRoot)) return;
event.preventDefault();
event.stopImmediatePropagation();
},
true
);
/*
* Covers pressing Enter in a form field.
*/
window.addEventListener(
"submit",
(event) => {
const form = event.target;
if (!(form instanceof HTMLFormElement)) return;
const formRoot = getFormRoot(form);
if (!formRoot) return;
if (validateEnquiry(formRoot)) return;
event.preventDefault();
event.stopImmediatePropagation();
},
true
);
function initialize() {
document.querySelectorAll(rootSelector).forEach((formRoot) => {
const form = formRoot.querySelector("form");
formRoot.querySelectorAll(buttonSelector).forEach((button) => {
button.classList.remove("is-selected", "is-invalid");
button.removeAttribute("aria-invalid");
button.setAttribute("aria-pressed", "false");
});
clearError(formRoot);
if (form) {
getHiddenField(form).value = "";
}
});
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initialize, {
once: true,
});
} else {
initialize();
}
})();