diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9b263b2b43cf4c8fc328875bb1beae5e9633f0f0..a4bfb83bf8faa8e1c8532dd115c91793abc41335 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](http://keepachangelog.com/)
 and this project adheres to [Semantic Versioning](http://semver.org/).
 
+## 1.8.2 - 2018-11-23
+### Changed
+- Fixed class count route
+- Fixed classroom count school year bug
+
 ## 1.8.1 - 2018-11-13
 ### Changed
 - Fixed bug in id2str with inexistent convert function
diff --git a/package.json b/package.json
index 65e8d4c96f3372c0348376b054012ae247d64202..bb9438bfbcf40e8adfddb2dd27896bbe557a4dc5 100644
--- a/package.json
+++ b/package.json
@@ -15,37 +15,53 @@
   "dependencies": {
     "agenda": "^0.9.1",
     "apicache": "0.7.0",
+    "babel-cli": "^6.26.0",
+    "babel-core": "^6.26.3",
+    "babel-preset-es2015": "^6.24.1",
+    "babel-register": "^6.26.0",
     "bcrypt-nodejs": "0.0.3",
-    "body-parser": "^1.13.1",
+    "body-parser": "^1.18.3",
     "chai": "^3.5.0",
     "chai-http": "^3.0.0",
+    "chai-xml": "^0.3.2",
     "chalk": "^1.1.3",
     "cookie-parser": "^1.3.5",
-    "cors": "^2.7.1",
-    "csv-express": "^1.1.0",
+    "cors": "^2.8.4",
+    "csv-express": "^1.2.2",
     "debug": "~2.3.x",
     "dirty-chai": "^1.2.2",
-    "express": "^4.13.0",
+    "eslint": "^3.19.0",
+    "eslint-plugin-import": "^2.14.0",
+    "eslint-plugin-react": "^6.10.3",
+    "express": "^4.16.4",
     "forever": "^0.15.2",
+    "gulp-babel": "^6.1.3",
+    "gulp-cli": "^1.4.0",
+    "gulp-function": "^2.2.14",
+    "gulp-istanbul": "^1.1.3",
+    "gulp-plumber": "^1.2.0",
+    "gulp-rename": "^1.4.0",
+    "gulp-uglify": "^2.1.2",
     "js2xmlparser": "^2.0.2",
-    "jsonexport": "^2.0.9",
-    "jwt-simple": "^0.5.0",
-    "lodash": "^4.17.2",
-    "method-override": "^2.3.3",
-    "mocha": "^3.1.2",
+    "jsdoc": "^3.5.5",
+    "jsonexport": "^2.3.0",
+    "jwt-simple": "^0.5.5",
+    "lodash": "^4.17.11",
+    "method-override": "^2.3.10",
+    "mocha": "^3.5.3",
     "monetdb-pool": "0.0.8",
-    "mongoose": "^4.6.0",
-    "nconf": "^0.8.x",
+    "mongoose": "^4.13.17",
+    "nconf": "^0.8.5",
     "node-uuid": "^1.4.8",
-    "nodemailer": "^4.0.1",
+    "nodemailer": "^4.6.8",
     "nodemailer-html-to-text": "^2.1.0",
-    "oauth2orize": "^1.8.1",
+    "oauth2orize": "^1.11.0",
     "passport": "^0.3.2",
     "passport-http-bearer": "^1.0.1",
     "passport-oauth2-client-password": "^0.1.2",
-    "request": "^2.81.0",
-    "squel": "^5.4.2",
-    "winston": "^2.2.0"
+    "request": "^2.88.0",
+    "squel": "^5.12.2",
+    "winston": "^2.4.4"
   },
   "license": "MIT",
   "devDependencies": {
diff --git a/src/libs/app.js b/src/libs/app.js
index 6f464ead79b585ef439b825587413177bdc51223..b8b953c1ca4b23d2cc743611d6570b1d500de1e1 100644
--- a/src/libs/app.js
+++ b/src/libs/app.js
@@ -11,7 +11,6 @@ const log = require(`${libs}/log`)(module);
 
 process.env.NODE_ENV = process.env.NODE_ENV || 'development';
 const config = require(`${libs}/config`);
-const cache = require('apicache').options({ debug: config.debug }).middleware;
 
 const app = express();
 
diff --git a/src/libs/convert/educationLevelSchoolYear.js b/src/libs/convert/educationLevelSchoolYear.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4fe43b73539fdf47650994f5773463d98f05a5f
--- /dev/null
+++ b/src/libs/convert/educationLevelSchoolYear.js
@@ -0,0 +1,36 @@
+module.exports = function educationLevelSchoolYear(id) {
+    switch(id) {
+        case 1: return 'Creche';
+        case 11: return 'Creche - Menor de 1 ano';
+        case 12: return 'Creche - 1 ano';
+        case 13: return 'Creche - 2 anos';
+        case 14: return 'Creche - 3 anos';
+        case 2: return 'Pré-Escola';
+        case 21: return 'Pré-Escola - 4 anos';
+        case 22: return 'Pré-Escola - 5 anos';
+        case 3: return 'Ensino Fundamental - anos iniciais';
+        case 31: return 'Ens. Fundamental - 1º Ano';
+        case 32: return 'Ens. Fundamental - 1ª série/2º ano';
+        case 33: return 'Ens. Fundamental - 2ª série/3º ano';
+        case 34: return 'Ens. Fundamental - 3ª série/4º ano';
+        case 35: return 'Ens. Fundamental - 4ª série/5º Ano';
+        case 4: return 'Ensino Fundamental - anos finais';
+        case 41: return 'Ens. Fundamental - 5ª série/6º ano';
+        case 42: return 'Ens. Fundamental - 6ª série/7º ano';
+        case 43: return 'Ens. Fundamental - 7ª série/8º ano';
+        case 44: return 'Ens. Fundamental - 8ª serie/9º ano';
+        case 5: return 'Ensino Médio';
+        case 51: return 'Ens. Médio - 1ª série';
+        case 52: return 'Ens. Médio - 2ª série';
+        case 53: return 'Ens. Médio - 3ª série';
+        case 54: return 'Ens. Médio - 4ª série';
+        case 6: return 'EJA';
+        case 61: return 'EJA - anos iniciais do Ens. Fundamental';
+        case 62: return 'EJA - anos finais do Ens. Fundamental';
+        case 63: return 'EJA - Ensino Médio';
+        case 64: return 'EJA semi-presencial';
+        case 7: return 'EE exclusiva';
+        case 71: return 'Educação Profissional';
+        default: return 'Não classificada';
+    }
+}
\ No newline at end of file
diff --git a/src/libs/convert/pfe.js b/src/libs/convert/pfe.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ef82c87554dec7a6bb6246083c2bda7fd771d29
--- /dev/null
+++ b/src/libs/convert/pfe.js
@@ -0,0 +1,17 @@
+module.exports = function pfeName(id) {
+    switch(id) {
+        case 1: return 'População fora da escola menor de 1 ano';
+        case 2: return 'População fora da escola 1 ano';
+        case 3: return 'População fora da escola 2 anos';
+        case 4: return 'População fora da escola 3 anos';
+        case 5: return 'População fora da escola 4 anos';
+        case 6: return 'População fora da escola 5 anos';
+        case 7: return 'População fora da escola 6 e 10 anos sem instrução ou com EF incompleto';
+        case 8: return 'População fora da escola 11 a 14 anos sem instrução';
+        case 9: return 'População fora da escola 11 a 14 anos com EF incompleto';
+        case 10: return 'População fora da escola 15 a 24 anos com e EF completo EM incompleto';
+        case 11: return 'População fora da escola 15 anos mais sem instrução';
+        case 12: return 'População fora da escola 15 anos mais com EF incompleto';
+        case 13: return 'População fora da escola 25 anos mais com EF completo e EM incompleto';
+    }
+};
diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js
index 1fa084f717431dc83a1ce28b40b79995e5720843..cb4c8cc1553ae711719878eb84d30ec29d3e993c 100644
--- a/src/libs/middlewares/id2str.js
+++ b/src/libs/middlewares/id2str.js
@@ -31,7 +31,8 @@ const useTransportPublic = require(`${libs}/convert/booleanVariable`);
 const transportationManager = require(`${libs}/convert/transportationManager`);
 const specialClass = require(`${libs}/convert/booleanVariable`);
 const integralTime = require(`${libs}/convert/integralTime`);
-// const educationLevelSchoolYear = require(`${libs}/convert/educationLevelSchoolYear`);
+const educationLevelSchoolYear = require(`${libs}/convert/educationLevelSchoolYear`);
+const pfe = require(`${libs}/convert/pfe`);
 
 const ids = {
     gender_id: gender,
@@ -74,7 +75,8 @@ const ids = {
     use_transport_public_id: useTransportPublic,
     transportation_manager_id: transportationManager,
     special_class_id: specialClass,
-    // education_level_school_year_id: educationLevelSchoolYear,
+    education_level_school_year_id: educationLevelSchoolYear,
+    pfe_id: pfe,
 };
 
 function transform(removeId=false) {
diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index dcd938f36f878c0a855cb61498779e50a6582bbb..c9150981ec646981c8999d25b21ab93cbb3a9c5a 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -80,6 +80,8 @@ const classCount = require(`${libs}/routes/classCount`);
 
 const portalMecInep = require(`${libs}/routes/portalMecInep`);
 
+const enrollmentProjection = require(`${libs}/routes/enrollmentProjection`);
+
 const employees = require(`${libs}/routes/employees`);
 
 const financial = require(`${libs}/routes/financial`);
@@ -126,6 +128,7 @@ api.use('/auxiliar', auxiliar);
 api.use('/verify_teacher', verifyTeacher);
 api.use('/class_count', classCount);
 api.use('/portal_mec_inep', portalMecInep);
+api.use('/enrollment_projection', enrollmentProjection);
 api.use('/employees', employees);
 api.use('/financial', financial);
 
diff --git a/src/libs/routes/classCount.js b/src/libs/routes/classCount.js
index 71b7ab36a540d3e6dff748d7840b3e5e815f0a04..aba72e13eeeaa5c78d29ac42c3faba7d8dadb525 100644
--- a/src/libs/routes/classCount.js
+++ b/src/libs/routes/classCount.js
@@ -320,10 +320,26 @@ function addNullFields(result) {
   });
 }
 
+// SimCAQ
+classCountApp.get('/count', rqf.parse(), (req, res, next) => {
+  req.sql.field("'Brasil'", 'name')
+   .field('turma.ano_censo', 'year')
+   .field('AVG(turma.num_matricula)', 'average')
+   .field('MEDIAN(turma.num_matricula)', 'median')
+   .field('STDDEV_POP(turma.num_matricula)', 'stddev')
+   .field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
+   .field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
+   .from('turma')
+   .group('turma.ano_censo')
+   .order('turma.ano_censo')
+   .where('turma.tipo_turma_id = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
+   next();
+}, rqf.build(), query, addMissing(rqf), id2str.transform(), response('class_count'));
+
 // LDE
 classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
   // Faz a consulta do número de alunos pelas dimensões
-  if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter)) {
+  if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter) || ("education_level_short" in req.dims)) {
     req.sql.field("'Brasil'", 'name')
      .field('turma.ano_censo', 'year')
      .field('AVG(turma.num_matricula)', 'average')
@@ -395,66 +411,4 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
   next();
 }, response('class_count'));
 
-// SimCAQ
-classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
-  req.sql.field("'Brasil'", 'name')
-   .field('turma.ano_censo', 'year')
-   .field('AVG(turma.num_matricula)', 'average')
-   .field('MEDIAN(turma.num_matricula)', 'median')
-   .field('STDDEV_POP(turma.num_matricula)', 'stddev')
-   .field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
-   .field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
-   .from('turma')
-   .group('turma.ano_censo')
-   .order('turma.ano_censo')
-   .where('turma.tipo_turma_id = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
-   next();
-}, rqf.build(), query, id2str.transform(), (req, res, next) => {
-      req.partial = [];
-      if((req.dims) && (req.dims.size == 1)) {
-        req.partial = req.result;
-
-        // Se a consulta anterior selecionou dimensão:
-        // Considera apenas os anos escolhidos na consulta anterior para contar o número total de alunos
-        let yearFilter = {};
-        if("min_year" in req.filter)
-          yearFilter.min_year = req.filter.min_year;
-        if("max_year" in req.filter)
-          yearFilter.max_year = req.filter.max_year;
-
-        req.resetSql();
-        req.dims = {};
-        req.filter = yearFilter;
-        req.sql.field("'Brasil'", 'name')
-         .field('turma.ano_censo', 'year')
-         .field('AVG(turma.num_matricula)', 'average')
-         .field('MEDIAN(turma.num_matricula)', 'median')
-         .field('STDDEV_POP(turma.num_matricula)', 'stddev')
-         .field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
-         .field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
-         .from('turma')
-         .group('turma.ano_censo')
-         .order('turma.ano_censo')
-         .where('turma.tipo_turma_id = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
-     }
-     next();
-}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
-  // Se possui apenas uma dimensão
-  if(req.partial.length > 0) {
-    const yearClassCount = req.result;
-    req.result = req.partial;
-
-    // Adiciona os totais por anos ao fim da consulta
-    // Como esse tipo de total é específico desse indicador, um label foi adicionado para indicar
-    yearClassCount.forEach((result) => {
-      let obj = {};
-      obj =	result;
-      obj.label = "total_year_average";
-      req.result.push(obj);
-    })
-  }
-  // Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total (req.result)
-  next();
-}, response('class_count'));
-
 module.exports = classCountApp;
diff --git a/src/libs/routes/classroomCount.js b/src/libs/routes/classroomCount.js
index d28de14a3671b6cc0823491f853b2a403fe89030..6fc655c90c6a78dafafaa6bccab2d6419780f4b4 100644
--- a/src/libs/routes/classroomCount.js
+++ b/src/libs/routes/classroomCount.js
@@ -405,7 +405,14 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => {
                         total_classrooms_needed: 0
                     }
                     schoolYearSet.add(schoolYearHash);
-                    educationLevel.classes_school_year.push(school_year);
+                    // Busca a posição para inserir
+                    let k = 0;
+                    let el = educationLevel.classes_school_year[k];
+                    while((typeof el !== 'undefined') && school_year.school_year_id > el.school_year_id) {
+                        el = educationLevel.classes_school_year[++k];
+                    }
+                    // educationLevel.classes_school_year.push(school_year);
+                    educationLevel.classes_school_year.splice(k, 0, school_year);
                     currentSchoolYear = school_year;
                 }
             }
@@ -558,25 +565,27 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => {
                                 currentEducation.enrollment.day_classes += cityEducation.enrollment.day_classes;
                                 currentEducation.enrollment.night_classes += cityEducation.enrollment.night_classes;
                                 currentEducation.enrollment.total_classrooms_needed += cityEducation.enrollment.total_classrooms_needed;
+                                // Insere as séries escolares, se existirem
                                 if((typeof cityEducation.classes_school_year !== 'undefined') && (typeof currentEducation.classes_school_year !== 'undefined')) {
                                     let n = 0;
                                     let o = 0;
-                                    let cityClass = null;
-                                    let currentClass = null;
+                                    let currentClass = currentEducation.classes_school_year[n];
+                                    let cityClass = cityEducation.classes_school_year[o];
                                     while((typeof cityClass !== 'undefined') && (typeof currentClass !== 'undefined')) {
-                                        cityClass = cityEducation.classes_school_year[o];
                                         currentClass = currentEducation.classes_school_year[n];
+                                        cityClass = cityEducation.classes_school_year[o];
 
                                         // Se a série escolar é menor que a atual, ela não está no vetor, pois o vetor está ordenado e tem range limitado
                                         if(cityClass.school_year_id < currentClass.school_year_id) {
                                             currentEducation.classes_school_year.splice(n, 0, cityClass);
+                                            currentClass = currentEducation.classes_school_year[n];
                                             cityClass = cityEducation.classes_school_year[++o];
                                             continue;
                                         } else if(cityClass.school_year_id > currentClass.school_year_id) {
                                             currentClass = currentEducation.classes_school_year[++n];
-                                            // Se o ano escolar da cidade é  maior que a localidade do objeto atual E o vetor de ano escolar do objeto atual
+                                            // Se o ano escolar da cidade é  maior que do objeto atual E o vetor de ano escolar do objeto atual
                                             // acaba, então este ano escolar falta no objeto atual, pois os anos escolares estão ordenados
-                                            if(typeof currentClass == 'undefined' && typeof cityClass !== 'undefined') {
+                                            if((typeof currentClass == 'undefined') && (typeof cityClass !== 'undefined')) {
                                                 currentEducation.classes_school_year[n] = cityClass;
                                                 currentClass = currentEducation.classes_school_year[n];
                                             }
@@ -616,7 +625,10 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => {
         }
     }
 
-    req.result = reduction || result;
+    req.result = {
+        result: reduction || result,
+        leftovers
+    }
 
     next();
 }, response('classroom_count'));
diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js
index 33d914fcaea2d95976140b6a704217001b0285a3..54ef5beabc0aa84f611acb61e3a6412285838d79 100644
--- a/src/libs/routes/dailyChargeAmount.js
+++ b/src/libs/routes/dailyChargeAmount.js
@@ -321,7 +321,7 @@ rqf.addField({
     }
 });
 
-dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
+dailyChargeAmountApp.get('/', rqf.parse(), (req, res, next) => {
     var status = 0;
     if ('integral_time' in req.filter) {
         if (req.filter['integral_time'] == '0'
@@ -346,14 +346,14 @@ dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         .field('turma.etapa_resumida', 'education_level_short_id')
         .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
         .field('MEDIAN(turma.duracao_turma)/60.0', 'median_class_duration')
-        .field('STDDEV_POP(turma.duracao_turma)/60.0', 'std_class_duration')
+        .field('STDDEV_SAMP(turma.duracao_turma)/60.0', 'std_class_duration')
         .field('QUANTILE(turma.duracao_turma, 0.25)/60.0', 'fstqt_class_duration')
         .field('QUANTILE(turma.duracao_turma, 0.75)/60.0', 'thdqt_class_duration')
         .group('turma.ano_censo')
         .group('turma.etapa_resumida')
         .order('turma.ano_censo')
         .order('turma.etapa_resumida')
-        .where('turma.tipo_turma_id <= 3')
+        .where('turma.tipo_turma_id <= 3 and turma.dependencia_adm_id <= 3')
     } else {
         res.status(400);
         next({
@@ -364,7 +364,7 @@ dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
 
     next();
 
-}, query, addMissing(rqf), (req, res, next) => {
+}, rqf.build(), query, addMissing(rqf), (req, res, next) => {
 
     function sliced(object) {
         return object['education_level_short_id'] > 3;
@@ -380,7 +380,7 @@ dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     next();
 }, id2str.transform(), response('turma'));
 
-dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next) => {
+dailyChargeAmountApp.get('/average', rqf.parse(), (req, res, next) => {
     var status = 0;
     if (('education_level_mod' in req.filter || 'education_level_mod' in req.dims)
     && ('integral_time' in req.filter)) {
@@ -406,7 +406,7 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
         .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
         .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
         .field('MEDIAN(turma.duracao_turma)/60.0', 'median_class_duration')
-        .field('STDDEV_POP(turma.duracao_turma)/60.0', 'std_class_duration')
+        .field('STDDEV_SAMP(turma.duracao_turma)/60.0', 'std_class_duration')
         .field('QUANTILE(turma.duracao_turma, 0.25)/60.0', 'fstqt_class_duration')
         .field('QUANTILE(turma.duracao_turma, 0.75)/60.0', 'thdqt_class_duration')
         .group('turma.ano_censo')
@@ -423,6 +423,6 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
     }
 
     next();
-}, query, addMissing(rqf), id2str.transform(), response('turma'));
+}, rqf.build(), query, addMissing(rqf), id2str.transform(), response('turma'));
 
 module.exports = dailyChargeAmountApp;
diff --git a/src/libs/routes/enrollmentProjection.js b/src/libs/routes/enrollmentProjection.js
new file mode 100644
index 0000000000000000000000000000000000000000..1bbe8ea3934a4fe59116ec0a3d96d292a446d59f
--- /dev/null
+++ b/src/libs/routes/enrollmentProjection.js
@@ -0,0 +1,139 @@
+const express = require('express');
+
+const enrollmentProjectionApp = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const log = require(`${libs}/log`)(module);
+
+const query = require(`${libs}/middlewares/query`).query;
+
+const response = require(`${libs}/middlewares/response`);
+
+const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
+
+const id2str = require(`${libs}/middlewares/id2str`);
+
+const config = require(`${libs}/config`);
+
+let rqf = new ReqQueryFields();
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValueToField({
+    name: 'state',
+    table: 'estado',
+    tableField: ['nome', 'id'],
+    resultField: ['state_name', 'state_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'estado_id',
+        foreignTable: 'projecao_matricula'
+    }
+}, 'dims').addValueToField({
+    name: 'state',
+    table: 'estado',
+    tableField: 'nome',
+    resultField: 'state_name',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'estado_id',
+        foreignTable: 'projecao_matricula'
+    }
+}, 'filter').addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: 'projecao_matricula'
+    }
+}, 'dims').addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: 'nome',
+    resultField: 'city_name',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: 'projecao_matricula'
+    }
+}, 'filter').addValue({
+    name: 'min_year',
+    table: 'projecao_matricula',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '>=',
+        type: 'integer',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'max_year',
+    table: 'projecao_matricula',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '<=',
+        type: 'integer',
+        field: 'ano_censo'
+    }
+});
+
+enrollmentProjectionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
+    req.sql.field("'Brasil'", 'name')
+    .field('SUM(projecao_matricula.urbano_dia_total)', 'urban_day_total')
+    .field('SUM(projecao_matricula.urbano_noite_total)', 'urban_night_total')
+    .field('SUM(projecao_matricula.rural_dia_total)', 'rural_day_total')
+    .field('SUM(projecao_matricula.rural_noite_total)', 'rural_night_total')
+    .field('projecao_matricula.etapa_ensino_escola_ano_id', 'education_level_school_year_id')
+    .field('projecao_matricula.ano_censo', 'year')
+    .from('projecao_matricula')
+    .where('projecao_matricula.etapa_ensino_escola_ano_id <> 7 AND projecao_matricula.etapa_ensino_escola_ano_id < 71')
+    .group('projecao_matricula.etapa_ensino_escola_ano_id')
+    .group('projecao_matricula.ano_censo')
+    .order('projecao_matricula.ano_censo')
+    .order('projecao_matricula.etapa_ensino_escola_ano_id');
+
+    next();
+}, query, id2str.transform(), (req, res, next) => {
+
+    req.result.forEach((r) => {
+        r.urban_day_total = parseInt(r.urban_day_total, 10);
+        r.urban_night_total = parseInt(r.urban_night_total, 10);
+        r.rural_day_total = parseInt(r.rural_day_total, 10);
+        r.rural_night_total = parseInt(r.rural_night_total, 10);
+    });
+    
+    next();
+}, response('enrollment_projection'));
+
+module.exports = enrollmentProjectionApp;
\ No newline at end of file
diff --git a/src/libs/routes/outOfSchool.js b/src/libs/routes/outOfSchool.js
index d7e3915a624bac28541ecbe2460f8ae54d8e0e0c..3d8f33d9959d70906877f767ef242685f54f6350 100644
--- a/src/libs/routes/outOfSchool.js
+++ b/src/libs/routes/outOfSchool.js
@@ -240,4 +240,76 @@ outOfSchoolApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     next();
 }, query, addMissing(rqf), id2str.transform(), response('out_of_school'));
 
+// Versão para o SimCAQ
+let simcaqRqf = new ReqQueryFields();
+
+simcaqRqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValue({
+    name: 'state',
+    table: 'populacao_fora_da_escola',
+    tableField: 'unidade_federativa',
+    resultField: 'state_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'unidade_federativa'
+    }
+}).addValue({
+    name: 'pfe',
+    table: 'populacao_fora_da_escola',
+    tableField: 'codigo_pfe',
+    resultField: 'pfe_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'codigo_pfe'
+    }
+}).addValue({
+    name: 'min_year',
+    table: 'populacao_fora_da_escola',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '>=',
+        type: 'integer',
+        table: 'populacao_fora_da_escola',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'max_year',
+    table: 'populacao_fora_da_escola',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '<=',
+        type: 'integer',
+        table: 'populacao_fora_da_escola',
+        field: 'ano_censo'
+    }
+});
+
+outOfSchoolApp.get('/simcaq', simcaqRqf.parse(), simcaqRqf.build(), (req, res, next) => {
+    req.sql.from('populacao_fora_da_escola')
+    .field('SUM(populacao_fora_da_escola.pop_fora_escola)', 'total')
+    .field("'Brasil'", 'name')
+    .field('populacao_fora_da_escola.ano_censo')
+    .group('populacao_fora_da_escola.ano_censo')
+    .order('populacao_fora_da_escola.ano_censo');
+
+    next();
+}, query, (req, res, next) => {
+	req.result.forEach((i) => {
+		i.total = parseInt(i.total);
+		console.log(i.total);
+	});
+	next();
+}, addMissing(simcaqRqf), id2str.transform(), response('out_of_school'));
+
 module.exports = outOfSchoolApp;