diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index 70311ae060f1da33789a0c05ba4b9f74a2bdd1e7..7d9b7644118ac6c59f6f76fe267b378f01576aa9 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -56,6 +56,8 @@ const downloads = require(`${libs}/routes/downloads`);
 
 const infrastructure = require(`${libs}/routes/infrastructure`);
 
+const schoolInfrastructure = require(`${libs}/routes/school_infrastructure`);
+
 const distributionFactor = require(`${libs}/routes/distributionFactor`);
 
 const siope = require(`${libs}/routes/siope`);
@@ -98,6 +100,7 @@ api.use('/reset', resetToken);
 api.use('/education_years', educationYears);
 api.use('/downloads', downloads);
 api.use('/infrastructure', infrastructure);
+api.use('/school_infrastructure', schoolInfrastructure);
 api.use('/distribution_factor', distributionFactor);
 api.use('/siope', siope);
 api.use('/out_of_school', outOfSchool);
diff --git a/src/libs/routes/school_infrastructure.js b/src/libs/routes/school_infrastructure.js
index 33d731658f84262d8a40f39ba6149a7473ff0e79..5244b465c5ecbf52c1698e84b5bada3631a3098d 100644
--- a/src/libs/routes/school_infrastructure.js
+++ b/src/libs/routes/school_infrastructure.js
@@ -230,7 +230,7 @@ rqf.addField({
     }
 });
 
-function matchQueries(queryTotal, queryPartial) {
+function matchQueries(queryTotal, queryPartial, queryNeeded) {
     let match = [];
     queryTotal.forEach((result) => {
         let newObj = {};
@@ -240,7 +240,8 @@ function matchQueries(queryTotal, queryPartial) {
         });
         let index = keys.indexOf('total');
         if(index > -1) keys.splice(index, 1);
-        let objMatch = null;
+        let partialMatch = null;
+        let needMatch = null;
 
         for(let i = 0; i < queryPartial.length; ++i) {
             let partial = queryPartial[i];
@@ -253,15 +254,32 @@ function matchQueries(queryTotal, queryPartial) {
                 }
             }
             if(foundMatch) {
-                objMatch = partial;
+                partialMatch = partial;
                 break;
             }
         }
 
-        if(objMatch) {
-            newObj.percentage = (objMatch.total / result.total) * 100;
-            newObj.partial = objMatch.total;
-            newObj.total = result.total
+        for(let i = 0; i < queryNeeded.length; ++i) {
+            let needed = queryNeeded[i];
+            let foundMatch = true;
+            for(let j = 0; j < keys.length; ++j) {
+                let key = keys[j];
+                if(needed[key] !== result[key]) {
+                    foundMatch = false;
+                    break;
+                }
+            }
+            if(foundMatch) {
+                needMatch = needed;
+                break;
+            }
+        }
+
+        if(partialMatch && needMatch) {
+            newObj.percentage = (partialMatch.total / result.total) * 100;
+            newObj.partial = partialMatch.total;
+            newObj.total = result.total;
+            newObj.need_adaptation = needMatch.total;
             match.push(newObj);
         }
     });
@@ -284,6 +302,7 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     .where('escola.local_func_predio_escolar = 1')
     .where('escola.dependencia_adm_id <= 3')
     .order('escola.ano_censo');
+    req.queryIndex.allSchools = req.querySet.push(allSchools) - 1;
 
     // Bibliotecas
     let allLibraries = allSchools.clone();
@@ -386,20 +405,30 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
 
     let needSportsCourtCoverage = allSportsCourt.clone();
     needSportsCourtCoverage.where('escola.quadra_esportes_descoberta = 0');
+    req.queryIndex.needSportsCourtCoverage = req.querySet.push(needSportsCourtCoverage) - 1;
 
     // Pátio
     req.queryIndex.allCourtyard = req.queryIndex.allSchools;
 
     let haveCourtyard = allSchools.clone();
-    haveCourtyard.where('escola.patio_coberto = 1');
+    haveCourtyard.where('escola.patio_coberto = 1 OR escola.patio_descoberto = 1');
     req.queryIndex.haveCourtyard = req.querySet.push(haveCourtyard) - 1;
 
     let needCourtyard = allSchools.clone();
-    needCourtyard.where('escola.patio_descoberto = 0');
+    needCourtyard.where('escola.patio_descoberto = 0 AND escola.patio_descoberto = 0');
     req.queryIndex.needCourtyard = req.querySet.push(needCourtyard) - 1;
 
     // Cobertura do Pátio
-    // TODO:
+    // FIXME: possível fixme no where
+    req.queryIndex.allCourtyardCoverage = req.queryIndex.allSchools;
+
+    let haveCourtyardCoverage = allSchools.clone();
+    haveCourtyardCoverage.where('escola.patio_coberto=0 AND escola.patio_descoberto = 1');
+    req.queryIndex.haveCourtyardCoverage = req.querySet.push(haveCourtyardCoverage) - 1;
+
+    let needCourtyardCoverage = allSchools.clone();
+    needCourtyardCoverage.where('escola.patio_coberto=0 AND escola.patio_descoberto=0');
+    req.queryIndex.needCourtyardCoverage = req.querySet.push(needCourtyardCoverage) - 1;
 
     // Sala de direção
     req.queryIndex.allDirectorRoom = req.queryIndex.allLibraries;
@@ -489,13 +518,6 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     needBroadbandInternet.where('escola.internet_banda_larga = 0');
     req.queryIndex.needBroadbandInternet = req.querySet.push(needBroadbandInternet) - 1;
 
-    // Banheiro dentro do prédio
-    req.queryIndex.allInsideBathroom = req.queryIndex.allSecretary;
-
-    let haveInsideBathroom = allSecretary.clone();
-    haveInsideBathroom.where('escola.sanitario_dentro_predio = 1');
-    req.queryIndex.haveInsideBathroom = req.querySet.push(haveInsideBathroom) - 1;
-
     // Banheiro adequado para educação infantil dentro do prédio
     req.queryIndex.allInsideKidsBathroom = req.queryIndex.allKidsPark;
 
@@ -503,88 +525,95 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     haveInsideKidsBathroom.where('escola.sanitario_ei = 1');
     req.queryIndex.haveInsideKidsBathroom = req.querySet.push(haveInsideKidsBathroom) - 1;
 
-    // Fornecimento de energia
-    req.queryIndex.allEletricEnergy = req.queryIndex.allSecretary;
-
-    let haveEletricEnergy = allSecretary.clone();
-    haveEletricEnergy.where('escola.fornecimento_energia = 1');
-    req.queryIndex.haveEletricEnergy = req.querySet.push(haveEletricEnergy) - 1;
+    let needInsideKidsBathroom = allKidsPark.clone();
+    needInsideKidsBathroom.where('escola.sanitario_ei = 0');
+    req.queryIndex.needInsideKidsBathroom = req.querySet.push(needInsideKidsBathroom) - 1;
 
     // Abastecimento de água
-    req.queryIndex.allWaterSupply = req.queryIndex.allSecretary;
+    req.queryIndex.allWaterSupply = req.queryIndex.allSchools;
 
-    let haveWaterSupply = allSecretary.clone();
+    let haveWaterSupply = allSchools.clone();
     haveWaterSupply.where('escola.fornecimento_agua = 1');
     req.queryIndex.haveWaterSupply = req.querySet.push(haveWaterSupply) - 1;
 
+    let needWaterSupply = allSchools.clone();
+    needWaterSupply.where('escola.fornecimento_agua = 0');
+    req.queryIndex.needWaterSupply = req.querySet.push(needWaterSupply) - 1;
+
     // Água filtrada
-    req.queryIndex.allFilteredWater = req.queryIndex.allSecretary;
+    req.queryIndex.allFilteredWater = req.queryIndex.allSchools;
 
-    let haveFilteredWater = allSecretary.clone();
+    let haveFilteredWater = allSchools.clone();
     haveFilteredWater.where('escola.agua_filtrada = 1');
     req.queryIndex.haveFilteredWater = req.querySet.push(haveFilteredWater) - 1;
 
+    let needFilteredWater = allSchools.clone();
+    needFilteredWater.where('escola.agua_filtrada = 0');
+    req.queryIndex.needFilteredWater = req.querySet.push(needFilteredWater) - 1;
+
     // Coleta de esgoto
-    req.queryIndex.allSewage = req.queryIndex.allSecretary;
+    req.queryIndex.allSewage = req.queryIndex.allSchools;
 
-    let haveSewage = allSecretary.clone();
+    let haveSewage = allSchools.clone();
     haveSewage.where('escola.esgoto_sanitario = 1');
     req.queryIndex.haveSewage = req.querySet.push(haveSewage) - 1;
 
-    // Sala de recursos multifuncionais para Atendimento Educacional Especializado
-    req.queryIndex.allMultifunctionRoom = req.queryIndex.allSecretary;
+    let needSewage = allSchools.clone();
+    needSewage.where('escola.esgoto_sanitario = 0');
+    req.queryIndex.needSewage = req.querySet.push(needSewage) - 1;
+
+    // Dependências adaptada para pessoas com deficiências
+    req.queryIndex.allAdaptedBuilding = req.queryIndex.allSchools;
+
+    let haveAdaptedBuilding = allSchools.clone();
+    haveAdaptedBuilding.where('escola.dependencias_pne = 1');
+    req.queryIndex.haveAdaptedBuilding = req.querySet.push(haveAdaptedBuilding) - 1;
 
-    let haveMultifunctionRoom = allSecretary.clone();
-    haveMultifunctionRoom.where('escola.sala_atendimento_especial = 1');
-    req.queryIndex.haveMultifunctionRoom = req.querySet.push(haveMultifunctionRoom) - 1;
+    let needAdaptedBuilding = allSchools.clone();
+    needAdaptedBuilding.where('escola.dependencias_pne = 0');
+    req.queryIndex.needAdaptedBuilding = req.querySet.push(needAdaptedBuilding) - 1;
 
     // Banheiros adaptados para pessoas com deficiências
-    req.queryIndex.allSpecialBathroom = req.queryIndex.allSecretary;
+    req.queryIndex.allSpecialBathroom = req.queryIndex.allSchools;
 
-    let haveSpecialBathroom = allSecretary.clone();
+    let haveSpecialBathroom = allSchools.clone();
     haveSpecialBathroom.where('escola.sanitario_pne = 1');
     req.queryIndex.haveSpecialBathroom = req.querySet.push(haveSpecialBathroom) - 1;
 
-    // Dependências adaptada para pessoas com deficiências
-    req.queryIndex.allAdaptedBuilding = req.queryIndex.allSecretary;
+    let needSpecialBathroom = allSchools.clone();
+    needSpecialBathroom.where('escola.sanitario_pne = 1');
+    req.queryIndex.needSpecialBathroom = req.querySet.push(needSpecialBathroom) - 1;
 
-    let haveAdaptedBuilding = allSecretary.clone();
-    haveAdaptedBuilding.where('escola.dependencias_pne = 1');
-    req.queryIndex.haveAdaptedBuilding = req.querySet.push(haveAdaptedBuilding) - 1;
 
     next();
 }, multiQuery, (req, res, next) => {
     // Faz o matching entre os resultados
-    let school_place = matchQueries(req.result[req.queryIndex.allSchools], req.result[req.queryIndex.schoolPlace]);
-    let libraries = matchQueries(req.result[req.queryIndex.allLibraries], req.result[req.queryIndex.haveLibraries]);
-    let libraries_reading_room = matchQueries(req.result[req.queryIndex.allLibrariesReadingRoom], req.result[req.queryIndex.haveLibrariesReadingRoom]);
-    let computer_lab = matchQueries(req.result[req.queryIndex.allInfLab], req.result[req.queryIndex.haveInfLab]);
-    let science_lab = matchQueries(req.result[req.queryIndex.allScienceLab], req.result[req.queryIndex.haveScienceLab]);
-    let kids_park = matchQueries(req.result[req.queryIndex.allKidsPark], req.result[req.queryIndex.haveKidsPark]);
-    let nursery = matchQueries(req.result[req.queryIndex.allCribs], req.result[req.queryIndex.haveCribs]);
-    let sports_court = matchQueries(req.result[req.queryIndex.allSportsCourt], req.result[req.queryIndex.haveSportsCourt]);
-    let covered_sports_court = matchQueries(req.result[req.queryIndex.allCoveredSportsCourt], req.result[req.queryIndex.haveCoveredSportsCourt]);
-    let uncovered_sports_court = matchQueries(req.result[req.queryIndex.allUncoveredSportsCourt], req.result[req.queryIndex.haveUncoveredSportsCourt]);
-    let director_room = matchQueries(req.result[req.queryIndex.allDirectorRoom], req.result[req.queryIndex.haveDirectorRoom]);
-    let secretary = matchQueries(req.result[req.queryIndex.allSecretary], req.result[req.queryIndex.haveSecretary]);
-    let teacher_room = matchQueries(req.result[req.queryIndex.allTeacherRoom], req.result[req.queryIndex.haveTeacherRoom]);
-    let kitchen = matchQueries(req.result[req.queryIndex.allKitchen], req.result[req.queryIndex.haveKitchen]);
-    let storeroom = matchQueries(req.result[req.queryIndex.allStoreroom], req.result[req.queryIndex.haveStoreroom]);
-    let warehouse = matchQueries(req.result[req.queryIndex.allWarehouse], req.result[req.queryIndex.haveWarehouse]);
-    let internet = matchQueries(req.result[req.queryIndex.allInternet], req.result[req.queryIndex.haveInternet]);
-    let broadband_internet = matchQueries(req.result[req.queryIndex.allBroadbandInternet], req.result[req.queryIndex.haveBroadbandInternet]);
-    let inside_bathroom = matchQueries(req.result[req.queryIndex.allInsideBathroom], req.result[req.queryIndex.haveInsideBathroom]);
-    let inside_kids_bathroom = matchQueries(req.result[req.queryIndex.allInsideKidsBathroom], req.result[req.queryIndex.haveInsideKidsBathroom]);
-    let eletric_energy = matchQueries(req.result[req.queryIndex.allEletricEnergy], req.result[req.queryIndex.haveEletricEnergy]);
-    let water_supply = matchQueries(req.result[req.queryIndex.allWaterSupply], req.result[req.queryIndex.haveWaterSupply]);
-    let filtered_water = matchQueries(req.result[req.queryIndex.allFilteredWater], req.result[req.queryIndex.haveFilteredWater]);
-    let sewage_treatment = matchQueries(req.result[req.queryIndex.allSewage], req.result[req.queryIndex.haveSewage]);
-    let special_multifunction_room = matchQueries(req.result[req.queryIndex.allMultifunctionRoom], req.result[req.queryIndex.haveMultifunctionRoom]);
-    let special_bathroom = matchQueries(req.result[req.queryIndex.allSpecialBathroom], req.result[req.queryIndex.haveSpecialBathroom]);
-    let adapted_building = matchQueries(req.result[req.queryIndex.allAdaptedBuilding], req.result[req.queryIndex.haveAdaptedBuilding]);
+    let libraries = matchQueries(req.result[req.queryIndex.allLibraries], req.result[req.queryIndex.haveLibraries], req.result[req.queryIndex.needLibraries]);
+    let libraries_reading_room = matchQueries(req.result[req.queryIndex.allLibrariesReadingRoom], req.result[req.queryIndex.haveLibrariesReadingRoom], req.result[req.queryIndex.needLibrariesReadingRoom]);
+    let computer_lab = matchQueries(req.result[req.queryIndex.allInfLab], req.result[req.queryIndex.haveInfLab], req.result[req.queryIndex.needInfLab]);
+    let science_lab = matchQueries(req.result[req.queryIndex.allScienceLab], req.result[req.queryIndex.haveScienceLab], req.result[req.queryIndex.needScienceLab]);
+    let kids_park = matchQueries(req.result[req.queryIndex.allKidsPark], req.result[req.queryIndex.haveKidsPark], req.result[req.queryIndex.needKidsPark]);
+    let nursery = matchQueries(req.result[req.queryIndex.allCribs], req.result[req.queryIndex.haveCribs], req.result[req.queryIndex.needCribs]);
+    let sports_court = matchQueries(req.result[req.queryIndex.allSportsCourt], req.result[req.queryIndex.haveSportsCourt], req.result[req.queryIndex.needSportsCourt]);
+    let sports_court_coverage = matchQueries(req.result[req.queryIndex.allSportsCourtCoverage], req.result[req.queryIndex.haveSportsCourtCoverage], req.result[req.queryIndex.needSportsCourtCoverage]);
+    let courtyard = matchQueries(req.result[req.queryIndex.allCourtyard], req.result[req.queryIndex.haveCourtyard], req.result[req.queryIndex.needCourtyard]);
+    let courtyard_coverage = matchQueries(req.result[req.queryIndex.allCourtyardCoverage], req.result[req.queryIndex.haveCourtyardCoverage], req.result[req.queryIndex.needCourtyardCoverage]);
+    let director_room = matchQueries(req.result[req.queryIndex.allDirectorRoom], req.result[req.queryIndex.haveDirectorRoom], req.result[req.queryIndex.needDirectorRoom]);
+    let secretary = matchQueries(req.result[req.queryIndex.allSecretary], req.result[req.queryIndex.haveSecretary], req.result[req.queryIndex.needSecretary]);
+    let teacher_room = matchQueries(req.result[req.queryIndex.allTeacherRoom], req.result[req.queryIndex.haveTeacherRoom], req.result[req.queryIndex.needTeacherRoom]);
+    let kitchen = matchQueries(req.result[req.queryIndex.allKitchen], req.result[req.queryIndex.haveKitchen], req.result[req.queryIndex.needKitchen]);
+    let storeroom = matchQueries(req.result[req.queryIndex.allStoreroom], req.result[req.queryIndex.haveStoreroom], req.result[req.queryIndex.needStoreroom]);
+    let warehouse = matchQueries(req.result[req.queryIndex.allWarehouse], req.result[req.queryIndex.haveWarehouse], req.result[req.queryIndex.needWarehouse]);
+    let internet = matchQueries(req.result[req.queryIndex.allInternet], req.result[req.queryIndex.haveInternet], req.result[req.queryIndex.needInternet]);
+    let broadband_internet = matchQueries(req.result[req.queryIndex.allBroadbandInternet], req.result[req.queryIndex.haveBroadbandInternet], req.result[req.queryIndex.needBroadbandInternet]);
+    let inside_kids_bathroom = matchQueries(req.result[req.queryIndex.allInsideKidsBathroom], req.result[req.queryIndex.haveInsideKidsBathroom], req.result[req.queryIndex.needInsideKidsBathroom]);
+    let water_supply = matchQueries(req.result[req.queryIndex.allWaterSupply], req.result[req.queryIndex.haveWaterSupply], req.result[req.queryIndex.needWaterSupply]);
+    let filtered_water = matchQueries(req.result[req.queryIndex.allFilteredWater], req.result[req.queryIndex.haveFilteredWater], req.result[req.queryIndex.needFilteredWater]);
+    let sewage = matchQueries(req.result[req.queryIndex.allSewage], req.result[req.queryIndex.haveSewage], req.result[req.queryIndex.needSewage]);
+    let adapted_building = matchQueries(req.result[req.queryIndex.allAdaptedBuilding], req.result[req.queryIndex.haveAdaptedBuilding], req.result[req.queryIndex.needAdaptedBuilding]);
+    let special_bathroom = matchQueries(req.result[req.queryIndex.allSpecialBathroom], req.result[req.queryIndex.haveSpecialBathroom], req.result[req.queryIndex.needSpecialBathroom]);
 
     req.result = [{
-        school_place,
         libraries,
         libraries_reading_room,
         computer_lab,
@@ -592,8 +621,9 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         kids_park,
         nursery,
         sports_court,
-        covered_sports_court,
-        uncovered_sports_court,
+        sports_court_coverage,
+        courtyard,
+        courtyard_coverage,
         director_room,
         secretary,
         teacher_room,
@@ -602,15 +632,12 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         warehouse,
         internet,
         broadband_internet,
-        inside_bathroom,
         inside_kids_bathroom,
-        eletric_energy,
         water_supply,
         filtered_water,
-        sewage_treatment,
-        special_multifunction_room,
-        special_bathroom,
-        adapted_building
+        sewage,
+        adapted_building,
+        special_bathroom
     }];
 
     next();