diff --git a/src/libs/routes/spatial.js b/src/libs/routes/spatial.js
index ffda3ceeb3da6adfd2fe2a13cfb661f9e3dfdd95..82daae576ac95f28b17f4b1c8db5923fba2b59a0 100644
--- a/src/libs/routes/spatial.js
+++ b/src/libs/routes/spatial.js
@@ -351,247 +351,26 @@ spatialApp.get('/educational', rqf.parse(), rqf.build(), (req, res, next) => {
     });
 }, response('spatial'));
 
-spatialApp.get('/educational/school_level', (req, res, next) => {
+spatialApp.get('/educational/school_level', rqf.parse(), rqf.build(), (req, res, next) => {
     const enrollmentsPerSchoolLevelYearQry = squel.select()
-        .field('MAX(turma.ano_censo)', 'census_year')
-        .from('turma');
+        .field('MAX(matricula.ano_censo)', 'census_year')
+        .from('matricula');
 
-    const enrollmentsPerSchoolLevelQry = squel.select()
-        .field('COALESCE(SUM(turma.num_matriculas), 0)', 'total')
-        .field('turma.ano_censo', 'census_year')
-        .field('turma.serie_ano', 'school_year')
-        .field('etapa_ensino.desc_etapa', 'school_level')
-        .from('turma')
-        .from('etapa_ensino')
-        .where(`turma.ano_censo IN (${enrollmentsPerSchoolLevelYearQry.toString()})`)
-        .where('turma.fk_etapa_ensino_id = etapa_ensino.pk_etapa_ensino_id')
-        .where('turma.fk_tipo_turma_id <= 3')
-        .group('etapa_ensino.desc_etapa')
-        .group('etapa_ensino.pk_etapa_ensino_id')
-        .group('turma.serie_ano')
-        .group('turma.ano_censo')
-        .order('etapa_ensino.pk_etapa_ensino_id')
-        .order('turma.serie_ano')
-        .order('turma.ano_censo');
-
-    const queryLabels = [ 'enrollment_per_school_level', 'enrollment_census_year' ];
-    const querySet = [ enrollmentsPerSchoolLevelQry, enrollmentsPerSchoolLevelYearQry ];
-    // wait until all queries finish or one of them fail
-    Promise.all(dbExecAll(querySet, enrollmentsPerSchoolLevelYearQry)).then((queryResults) => {
-        const result = queryResults[0];
-        const censusYear = queryResults[1][0]['census_year'];
-
-        let school_levels = {};
-        for(let i = 0; i < result.length; ++i) {
-            const school_year  = schoolYearIdToStr(result[i].school_year);
-            const school_level = result[i].school_level;
-            const census_year = result[i].census_year;
-            if (typeof school_levels[school_level] === 'undefined') {
-                school_levels[school_level] = {};
-            }
-            school_levels[school_level][school_year] = parseInt(result[i].total, 10);
-        }
-
-        let response = [];
-        for(let level in school_levels) {
-            if (school_levels.hasOwnProperty(level)) {
-                let sclevel = {};
-                sclevel["degree"] = level;
-                sclevel["census_year"] = parseInt(censusYear, 10);
-                sclevel["table"] = [];
-                for(let school_year in school_levels[level]) {
-                    if (school_levels[level].hasOwnProperty(school_year)) {
-                        let enrollment = { 'title' : school_year,
-                                           'value' : school_levels[level][school_year] };
-                        sclevel["table"].push(enrollment);
-                    }
-                }
-                response.push(sclevel);
-            }
-        }
-        req.result = response;
-        next();
-    }).catch((error) => {
-        log.error(`[SQL query error] ${error}`);
-        next(error);
-    });
-}, response('location'));
-
-spatialApp.get('/educational/school_level/region/:id', (req, res, next) => {
-    const regionId = parseInt(req.params.id, 10);
-
-    const enrollmentsPerSchoolLevelYearQry = squel.select()
-        .field('MAX(turma.ano_censo)', 'census_year')
-        .from('turma');
-
-    const enrollmentsPerSchoolLevelQry = squel.select()
-        .field('COALESCE(SUM(turma.num_matriculas), 0)', 'total')
-        .field('turma.ano_censo', 'census_year')
-        .field('turma.serie_ano', 'school_year')
-        .field('etapa_ensino.desc_etapa', 'school_level')
-        .from('turma')
-        .from('etapa_ensino')
-        .from('regiao')
-        .where(`turma.fk_regiao_id = ${regionId}`)
-        .where('turma.fk_regiao_id = regiao.pk_regiao_id')
-        .where(`turma.ano_censo IN (${enrollmentsPerSchoolLevelYearQry.toString()})`)
-        .where('turma.fk_etapa_ensino_id = etapa_ensino.pk_etapa_ensino_id')
-        .where('turma.fk_tipo_turma_id <= 3')
-        .group('regiao.nome')
-        .group('etapa_ensino.desc_etapa')
-        .group('etapa_ensino.pk_etapa_ensino_id')
-        .group('turma.serie_ano')
-        .group('turma.ano_censo')
-        .order('regiao.nome')
-        .order('etapa_ensino.pk_etapa_ensino_id')
-        .order('turma.serie_ano')
-        .order('turma.ano_censo');
-
-    const queryLabels = [ 'enrollment_per_school_level', 'enrollment_census_year' ];
-    const querySet = [ enrollmentsPerSchoolLevelQry, enrollmentsPerSchoolLevelYearQry ];
-    // wait until all queries finish or one of them fail
-    Promise.all(dbExecAll(querySet, enrollmentsPerSchoolLevelYearQry)).then((queryResults) => {
-        const result = queryResults[0];
-        const censusYear = queryResults[1][0]['census_year'];
-
-        let school_levels = {};
-        for(let i = 0; i < result.length; ++i) {
-            const school_year  = schoolYearIdToStr(result[i].school_year);
-            const school_level = result[i].school_level;
-            const census_year = result[i].census_year;
-            if (typeof school_levels[school_level] === 'undefined') {
-                school_levels[school_level] = {};
-            }
-            school_levels[school_level][school_year] = parseInt(result[i].total, 10);
-        }
-
-        let response = [];
-        for(let level in school_levels) {
-            if (school_levels.hasOwnProperty(level)) {
-                let sclevel = {};
-                sclevel["degree"] = level;
-                sclevel["census_year"] = parseInt(censusYear, 10);
-                sclevel["table"] = [];
-                for(let school_year in school_levels[level]) {
-                    if (school_levels[level].hasOwnProperty(school_year)) {
-                        let enrollment = { 'title' : school_year,
-                                           'value' : school_levels[level][school_year] };
-                        sclevel["table"].push(enrollment);
-                    }
-                }
-                response.push(sclevel);
-            }
-        }
-        req.result = response;
-        next();
-    }).catch((error) => {
-        log.error(`[SQL query error] ${error}`);
-        next(error);
-    });
-}, response('location'));
-
-spatialApp.get('/educational/school_level/state/:id', (req, res, next) => {
-    const stateId = parseInt(req.params.id, 10);
-
-    const enrollmentsPerSchoolLevelYearQry = squel.select()
-        .field('MAX(turma.ano_censo)', 'census_year')
-        .from('turma');
-
-    const enrollmentsPerSchoolLevelQry = squel.select()
-        .field('COALESCE(SUM(turma.num_matriculas), 0)', 'total')
-        .field('turma.ano_censo', 'census_year')
-        .field('turma.serie_ano', 'school_year')
-        .field('etapa_ensino.desc_etapa', 'school_level')
-        .from('turma')
-        .from('etapa_ensino')
-        .from('estado')
-        .where(`turma.fk_estado_id = ${stateId}`)
-        .where('turma.fk_estado_id = estado.pk_estado_id')
-        .where(`turma.ano_censo IN (${enrollmentsPerSchoolLevelYearQry.toString()})`)
-        .where('turma.fk_etapa_ensino_id = etapa_ensino.pk_etapa_ensino_id')
-        .where('turma.fk_tipo_turma_id <= 3')
-        .group('estado.nome')
-        .group('etapa_ensino.desc_etapa')
-        .group('etapa_ensino.pk_etapa_ensino_id')
-        .group('turma.serie_ano')
-        .group('turma.ano_censo')
-        .order('estado.nome')
-        .order('etapa_ensino.pk_etapa_ensino_id')
-        .order('turma.serie_ano')
-        .order('turma.ano_censo');
-
-    const queryLabels = [ 'enrollment_per_school_level', 'enrollment_census_year' ];
-    const querySet = [ enrollmentsPerSchoolLevelQry, enrollmentsPerSchoolLevelYearQry ];
-    // wait until all queries finish or one of them fail
-    Promise.all(dbExecAll(querySet, enrollmentsPerSchoolLevelYearQry)).then((queryResults) => {
-        const result = queryResults[0];
-        const censusYear = queryResults[1][0]['census_year'];
-
-        let school_levels = {};
-        for(let i = 0; i < result.length; ++i) {
-            const school_year  = schoolYearIdToStr(result[i].school_year);
-            const school_level = result[i].school_level;
-            const census_year = result[i].census_year;
-            if (typeof school_levels[school_level] === 'undefined') {
-                school_levels[school_level] = {};
-            }
-            school_levels[school_level][school_year] = parseInt(result[i].total, 10);
-        }
-
-        let response = [];
-        for(let level in school_levels) {
-            if (school_levels.hasOwnProperty(level)) {
-                let sclevel = {};
-                sclevel["degree"] = level;
-                sclevel["census_year"] = parseInt(censusYear, 10);
-                sclevel["table"] = [];
-                for(let school_year in school_levels[level]) {
-                    if (school_levels[level].hasOwnProperty(school_year)) {
-                        let enrollment = { 'title' : school_year,
-                                           'value' : school_levels[level][school_year] };
-                        sclevel["table"].push(enrollment);
-                    }
-                }
-                response.push(sclevel);
-            }
-        }
-        req.result = response;
-        next();
-    }).catch((error) => {
-        log.error(`[SQL query error] ${error}`);
-        next(error);
-    });
-}, response('location'));
-
-spatialApp.get('/educational/school_level/city/:id', (req, res, next) => {
-    const cityId = parseInt(req.params.id, 10);
-
-    const enrollmentsPerSchoolLevelYearQry = squel.select()
-        .field('MAX(turma.ano_censo)', 'census_year')
-        .from('turma');
-
-    const enrollmentsPerSchoolLevelQry = squel.select()
-        .field('COALESCE(SUM(turma.num_matriculas), 0)', 'total')
-        .field('turma.ano_censo', 'census_year')
-        .field('turma.serie_ano', 'school_year')
-        .field('etapa_ensino.desc_etapa', 'school_level')
-        .from('turma')
-        .from('etapa_ensino')
-        .from('municipio')
-        .where(`turma.fk_municipio_id = ${cityId}`)
-        .where('turma.fk_municipio_id = municipio.pk_cod_ibge')
-        .where(`turma.ano_censo IN (${enrollmentsPerSchoolLevelYearQry.toString()})`)
-        .where('turma.fk_etapa_ensino_id = etapa_ensino.pk_etapa_ensino_id')
-        .where('turma.fk_tipo_turma_id <= 3')
-        .group('municipio.nome')
+    const enrollmentsPerSchoolLevelQry = req.sql.clone()
+        .field('COALESCE(COUNT(matricula.id), 0)', 'total')
+        .field('matricula.ano_censo', 'census_year')
+        .field('matricula.serie_ano_id', 'school_year')
+        .field('etapa_ensino.desc_etapa', 'school_level_name')
+        .from('matricula')
+        .join('etapa_ensino', null, 'matricula.etapa_ensino_id=etapa_ensino.id')
+        .where(`matricula.ano_censo IN (${enrollmentsPerSchoolLevelYearQry.toString()})`)
+        .where('matricula.tipo <= 3')
         .group('etapa_ensino.desc_etapa')
-        .group('etapa_ensino.pk_etapa_ensino_id')
-        .group('turma.serie_ano')
-        .group('turma.ano_censo')
-        .order('municipio.nome')
-        .order('etapa_ensino.pk_etapa_ensino_id')
-        .order('turma.serie_ano')
-        .order('turma.ano_censo');
+        .group('matricula.serie_ano_id')
+        .group('matricula.ano_censo')
+        .order('etapa_ensino.id')
+        .order('matricula.serie_ano_id')
+        .order('matricula.ano_censo');
 
     const queryLabels = [ 'enrollment_per_school_level', 'enrollment_census_year' ];
     const querySet = [ enrollmentsPerSchoolLevelQry, enrollmentsPerSchoolLevelYearQry ];
@@ -634,6 +413,6 @@ spatialApp.get('/educational/school_level/city/:id', (req, res, next) => {
         log.error(`[SQL query error] ${error}`);
         next(error);
     });
-}, response('location'));
+}, response('spatial'));
 
 module.exports = spatialApp;