diff --git a/CHANGELOG.md b/CHANGELOG.md
index ad2d90ae546c79c8e7cbba04bfc4125f841bb2dc..a25bd9818b975f668f18614a10835ca1353603b6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,10 +4,146 @@ 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.11.17 - 2019-10-08
+## Changed
+- Fix query\_exec
+
+## 1.11.16 - 2019-10-30
+## Changed
+- University Teacher updated
+
+## 1.11.15 - 2019-10-16
+## Changed
+- Fix addMissing for classCount route
+
+## 1.11.14 - 2019-10-13
+## Changed
+- OCDE updated
+
+## 1.11.13 - 2019-09-11
+## Changed
+- Classroom with dim location and city filter, will always return both locations
+
+## 1.11.12 - 2019-09-10
+## Changed
+- Changed classroom filters to match classroomCount
+
+## 1.11.11 - 2019-09-09
+## Changed
+- Changed classroomCount filters
+
+## 1.11.10 - 2019-08-23
+## Changed
+- Removed year limitation
+- Updated existing variables
+
+## 1.11.9 - 2019-07-25
+## Changed
+- Course count order fix
+- Course count missing fix
+
+## 1.11.8 = 2019-07-19
+## Changed
+- Remove /user route
+
+## 1.11.7 - 2019-07-12
+## Changed
+- EnrollmentProjection now returns empty values with 0
+
+## 1.11.6 - 2019-07-11
+## Changed
+- Return haveSportsCourtCoverage and haveCourtyardCoverage = [] in route school_infrastructure 
+
+## 1.11.5 - 2019-07-09
+## Changed
+ - Fix integral time
+ - Fix match queries in school_infrastructure
+
 ## 2019-07-03
 ### Changed
 - Remove mongoose dependency so it can be used in SMPPIR 
 
+## 1.11.4 - 2019-06-17
+## Changed
+- Changed enrollment variable
+- Added location and latitude to state and city
+- Changed courseCount variables
+- Removed 'Not classified' from teacher
+
+## 1.11.3 - 2019-06-17
+## Changed
+- Changed variables from university
+- Removed year limitation from university
+
+## 1.11.2 - 2019-06-17
+## Changed
+- transport now uses an aggregate table
+
+## 1.11.1 - 2019-06-10
+## Changed
+- ClassroomCount now uses an aggregate table
+
+## 1.11.0 - 2019-05-24
+## Changed
+- Add university teacher indicator for 2017
+
+## 1.10.5 - 2019-05-23
+## Changed
+- Revert api.js
+
+## 1.10.4 - 2019-05-23
+## Changed
+- Fix order in enrollment indicator
+## Added
+- Added university enrollment indicator
+- Added course count indicator
+
+## 1.10.3 - 2019-05-22
+## Changed
+- Fix schoolInfrastructure.js
+
+## 1.10.2 - 2019-05-10
+## Changed
+- Fix api.js
+
+## 1.10.0 - 2019-05-10
+## Added
+- Added university indicator
+
+## 1.9.8 - 2019-08-02
+## Changed
+- Fix bug duplicate city name in classroom count
+
+## 1.9.7 - 2019-05-02
+## Changed
+- Fix enrollment projection
+- Fix enrollment number in classroom count
+- Fix error in class count
+
+## 1.9.6 - 2019-04-02
+## Changed
+- Fix null in integral time
+
+## 1.9.5 - 2019-03-15
+## Changed
+- Fix join's in class count route
+
+## 1.9.4 - 2019-03-12
+## Changed
+- Change docente.id to docente.id_docente
+
+## 1.9.3 - 2019-03-12
+## Changed
+- Fix addMissing function
+
+## 1.9.2 - 2019-02-20
+## Changed
+- Fix location variable in table
+
+## 1.9.1 - 2019-02-14
+## Changed
+- Fix join's in financial route
+
 ## 1.9.0 - 2018-11-24
 ## Changed
 - Fix school infrastructure results when partial or needed schools query return empty
diff --git a/package.json b/package.json
index f603817a79d175c397ddb03a822a8537dd0d30a2..541094f97ca0057b75f9aa94238597972d2e1a92 100644
--- a/package.json
+++ b/package.json
@@ -59,6 +59,7 @@
     "passport-http-bearer": "^1.0.1",
     "passport-oauth2-client-password": "^0.1.2",
     "request": "^2.88.0",
+    "sqlstring": "^2.3.1",
     "squel": "^5.12.2",
     "winston": "^2.4.4"
   },
diff --git a/src/libs/convert/academicLevel.js b/src/libs/convert/academicLevel.js
new file mode 100644
index 0000000000000000000000000000000000000000..3f76bc115a7e7897ef7aea4967fa872d07409bf2
--- /dev/null
+++ b/src/libs/convert/academicLevel.js
@@ -0,0 +1,32 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function academicLevel(id) {
+    switch (id) {
+        case 1:
+        return 'Bacharelado';
+        case 2:
+        return 'Licenciatura';
+        case 3:
+        return 'Tecnológico';
+        default:
+        return 'Não classificada';
+    }
+};
diff --git a/src/libs/convert/academicOrganization.js b/src/libs/convert/academicOrganization.js
new file mode 100644
index 0000000000000000000000000000000000000000..14611d15af395aa85678efff3d38ad9d08692d53
--- /dev/null
+++ b/src/libs/convert/academicOrganization.js
@@ -0,0 +1,36 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function academicOrganization(id) {
+    switch (id) {
+        case 1:
+        return 'Universidade';
+        case 2:
+        return 'Centro Universitário';
+        case 3:
+        return 'Faculdade';
+        case 4:
+        return 'Instituto Federal de Educação, Ciência e Tecnologia';
+        case 5:
+        return 'Centro Federal de Educação Tecnológica';
+        default:
+        return 'Não classificada';
+    }
+};
diff --git a/src/libs/convert/ageStudentCode.js b/src/libs/convert/ageStudentCode.js
new file mode 100644
index 0000000000000000000000000000000000000000..450c93610b221fc7af6334690571bba595eee5b3
--- /dev/null
+++ b/src/libs/convert/ageStudentCode.js
@@ -0,0 +1,38 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function ageStudentCode(id) {
+    switch (id) {
+        case 1:
+        return 'Menor que 18 anos';
+        case 2:
+        return 'Entre 18 anos e 24 anos';
+        case 3:
+        return 'Entre 25 anos e 29 anos';
+        case 4:
+        return 'Entre 30 anos e 34 anos';
+        case 5:
+        return 'Entre 35 anos e 39 anos';
+        case 6:
+        return 'Maior que 39 anos';
+        default:
+        return 'Não classificado';
+    }
+};
diff --git a/src/libs/convert/ethnicGroupIES.js b/src/libs/convert/ethnicGroupIES.js
new file mode 100644
index 0000000000000000000000000000000000000000..a57150fcc30d5e46df45ba9c1cd7d97761fc612f
--- /dev/null
+++ b/src/libs/convert/ethnicGroupIES.js
@@ -0,0 +1,38 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function ethnicGroupIES(id) {
+    switch (id) {
+        case 0:
+        return 'Aluno não quis declarar cor/raça';
+        case 1:
+        return 'Branca';
+        case 2:
+        return 'Preta';
+        case 3:
+        return 'Parda';
+        case 4:
+        return 'Amarela';
+        case 5:
+        return 'Indígena';
+        default:
+        return 'Não dispõe da informação (Não resposta)';
+    }
+};
diff --git a/src/libs/convert/ethnicGroupTeacherIES.js b/src/libs/convert/ethnicGroupTeacherIES.js
new file mode 100644
index 0000000000000000000000000000000000000000..7db2936ccc04200a58a7680f32c4a0d2c3122aaa
--- /dev/null
+++ b/src/libs/convert/ethnicGroupTeacherIES.js
@@ -0,0 +1,38 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function ethnicGroupTeacherIES(id) {
+    switch (id) {
+        case 0:
+        return 'Docente não quis declarar cor/raça';
+        case 1:
+        return 'Branca';
+        case 2:
+        return 'Preta';
+        case 3:
+        return 'Parda';
+        case 4:
+        return 'Amarela';
+        case 5:
+        return 'Indígena';
+        default:
+        return 'Não dispõe da informação (Não resposta)';
+    }
+};
diff --git a/src/libs/convert/genderIES.js b/src/libs/convert/genderIES.js
new file mode 100644
index 0000000000000000000000000000000000000000..8eba4fe45cfa21daaaa0d8ea96accb894d8e7453
--- /dev/null
+++ b/src/libs/convert/genderIES.js
@@ -0,0 +1,30 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function genderIES(id) {
+    switch(id) {
+        case 1:
+        return 'Feminino';
+        case 2:
+        return 'Masculino';
+        default:
+        return 'Não declarado';
+    }
+};
diff --git a/src/libs/convert/integralTime.js b/src/libs/convert/integralTime.js
index b231be33d51aca64227301d3eb4d05d10808b6aa..11fd23850e2b51a6bce33ccbec160f0980ec25f8 100644
--- a/src/libs/convert/integralTime.js
+++ b/src/libs/convert/integralTime.js
@@ -19,10 +19,12 @@ along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
 */
 
 module.exports = function integralTime(id) {
-  if (id == null)
-    return 'Não se aplica (semi presencial e EaD)';
-  else if (id == false)
-    return 'Não';
-  else if (id == true)
-    return 'Sim';
+    switch (id) {
+		case true:
+		return 'Sim';
+		case false:
+		return 'Não';
+		default:
+		return 'Não se aplica (semi presencial e EaD)';
+    }
 };
diff --git a/src/libs/convert/ocdeDetailed.js b/src/libs/convert/ocdeDetailed.js
new file mode 100644
index 0000000000000000000000000000000000000000..e83dc4d933dc997e97c9ded6799bbc72f93ae376
--- /dev/null
+++ b/src/libs/convert/ocdeDetailed.js
@@ -0,0 +1,183 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+module.exports = function ocdeDetailed(id) {
+	switch (id) {
+		case 142:
+		return 'Ciências da educação';
+		case 144:
+		return 'Formação de professor da educação básica';
+		case 145:
+		return 'Formação de professor de matérias específicas';
+		case 146:
+		return 'Formação de professor de disciplinas profissionais';
+		case 210:
+		return 'Artes (cursos gerais)';
+		case 211:
+		return 'Belas artes';
+		case 212:
+		return 'Música e artes cênicas';
+		case 213:
+		return 'Técnicas audiovisuais e produção de mídia';
+		case 214:
+		return 'Design e estilismo';
+		case 215:
+		return 'Artesanato';
+		case 220:
+		return 'Humanidades e letras (cursos gerais)';
+		case 221:
+		return 'Religião e teologia';
+		case 222:
+		return 'Línguas e culturas estrangeiras';
+		case 223:
+		return 'Língua materna (vernácula)';
+		case 225:
+		return 'História e arqueologia';
+		case 226:
+		return 'Filosofia e ética';
+		case 310:
+		return 'Ciências sociais e comportamentais (cursos gerais)';
+		case 311:
+		return 'Psicologia';
+		case 312:
+		return 'Sociologia e estudos culturais';
+		case 313:
+		return 'Ciência política e educação cívica';
+		case 314:
+		return 'Economia';
+		case 321:
+		return 'Jornalismo e reportagem';
+		case 322:
+		return 'Biblioteconomia, informação, arquivos';
+		case 340:
+		return 'Comércio e administração (cursos gerais)';
+		case 341:
+		return 'Vendas em atacado e varejo';
+		case 342:
+		return 'Marketing e publicidade';
+		case 343:
+		return 'Finanças, bancos, seguros';
+		case 344:
+		return 'Contabilidade e tributação';
+		case 345:
+		return 'Gerenciamento e administração';
+		case 346:
+		return 'Secretariado e trabalhos de escritório';
+		case 380:
+		return 'Direito';
+		case 420:
+		return 'Ciências (cursos gerais)';
+		case 421:
+		return 'Biologia e bioquímica';
+		case 422:
+		return 'Ciências ambientais';
+		case 440:
+		return 'Ciências físicas (cursos gerais)';
+		case 441:
+		return 'Física';
+		case 442:
+		return 'Química';
+		case 443:
+		return 'Ciências da terra';
+		case 461:
+		return 'Matemática';
+		case 462:
+		return 'Estatística';
+		case 481:
+		return 'Ciência da computação';
+		case 482:
+		return 'Uso do computador';
+		case 483:
+		return 'Processamento da informação';
+		case 520:
+		return 'Engenharia e profissões de engenharia (cursos gerais)';
+		case 521:
+		return 'Engenharia mecânica e metalurgia (trabalhos com metais)';
+		case 522:
+		return 'Eletricidade e energia';
+		case 523:
+		return 'Eletrônica e automação';
+		case 524:
+		return 'Química e engenharia de processos';
+		case 525:
+		return 'Veículos a motor, construção naval e aeronáutica';
+		case 540:
+		return 'Fabricação e processamento (cursos gerais)';
+		case 541:
+		return 'Processamento de alimentos';
+		case 542:
+		return 'Têxteis, roupas, calçados, couros';
+		case 543:
+		return 'Materiais (madeira, papel, plástico, vidro)';
+		case 544:
+		return 'Mineração e extração';
+		case 581:
+		return 'Arquitetura e urbanismo';
+		case 582:
+		return 'Engenharia civil e de construção';
+		case 621:
+		return 'Produção agrícola e pecuária';
+		case 622:
+		return 'Horticultura';
+		case 623:
+		return 'Engenharia florestal - silvicultura';
+		case 624:
+		return 'Recursos pesqueiros';
+		case 641:
+		return 'Veterinária';
+		case 720:
+		return 'Saúde (cursos gerais)';
+		case 721:
+		return 'Medicina';
+		case 723:
+		return 'Enfermagem e atenção primária (assistência básica)';
+		case 724:
+		return 'Odontologia';
+		case 725:
+		return 'Tecnologias de diagnóstico e tratamento médico';
+		case 726:
+		return 'Terapia e reabilitação';
+		case 727:
+		return 'Farmácia';
+		case 762:
+		return 'Serviço social e orientação';
+		case 811:
+		return 'Hotelaria, restaurantes  e serviços de alimentação';
+		case 812:
+		return 'Viagens, turismo e lazer';
+		case 813:
+		return 'Esportes';
+		case 814:
+		return 'Ciências domésticas';
+		case 815:
+		return 'Serviços de beleza';
+		case 840:
+		return 'Transportes e serviços (cursos gerais)';
+		case 850:
+		return 'Proteção ambiental (cursos gerais)';
+		case 861:
+		return 'Proteção de pessoas e de propriedades';
+		case 862:
+		return 'Saúde e segurança do trabalho';
+		case 863:
+		return 'Setor militar e de defesa';
+		default:
+		return 'Não classificada';
+	}
+};
\ No newline at end of file
diff --git a/src/libs/convert/ocdeGeral.js b/src/libs/convert/ocdeGeral.js
new file mode 100644
index 0000000000000000000000000000000000000000..70671edb3dbbb1083f10e8953c886a2a85bf29c4
--- /dev/null
+++ b/src/libs/convert/ocdeGeral.js
@@ -0,0 +1,44 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function ocdeGeral(id) {
+    switch (id) {
+        case 0:
+        return 'Área básica';
+        case 1:
+        return 'Educação';
+        case 2:
+        return 'Humanidades e artes';
+        case 3:
+        return 'Ciências sociais, negócios e direito';
+        case 4:
+        return 'Ciências, matemática e computação';
+        case 5:
+        return 'Engenharia, produção e construção';
+        case 6:
+        return 'Agricultura e veterinária';
+        case 7:
+        return 'Saúde e bem estar social';
+        case 8:
+        return 'Serviços';
+        default:
+        return 'Não classificada';
+    }
+};
diff --git a/src/libs/convert/ocdeSpecific.js b/src/libs/convert/ocdeSpecific.js
new file mode 100644
index 0000000000000000000000000000000000000000..0133fa97a143dc342799c3a8b3b68c4d6dbb5fa5
--- /dev/null
+++ b/src/libs/convert/ocdeSpecific.js
@@ -0,0 +1,72 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function ocdeSpecific(id) {
+    switch (id) {
+        case 1:
+        return 'Área básica de cursos';
+        case 14:
+        return 'Formação de professor e ciências da educação';
+        case 21:
+        return 'Artes';
+        case 22:
+        return 'Humanidades e letras';
+        case 31:
+        return 'Ciências sociais e comportamentais';
+        case 32:
+        return 'Jornalismo e informação';
+        case 34:
+        return 'Comércio e administração';
+        case 38:
+        return 'Direito';
+        case 42:
+        return 'Ciências da vida';
+        case 44:
+        return 'Ciências físicas';
+        case 46:
+        return 'Matemática e estatística';
+        case 48:
+        return 'Computação';
+        case 52:
+        return 'Engenharia e profissões correlatas';
+        case 54:
+        return 'Produção e processamento';
+        case 58:
+        return 'Arquitetura e construção';
+        case 62:
+        return 'Agricultura, florestas e recursos pasqueiros';
+        case 64:
+        return 'Veterinária';
+        case 72:
+        return 'Saúde';
+        case 76:
+        return 'Serviço social';
+        case 81:
+        return 'Serviços pessoais';
+        case 84:
+        return 'Serviços de transportes (cursos gerais)';
+        case 85:
+        return 'Proteção ambiental';
+        case 86:
+        return 'Serviços de segurança';
+        default:
+        return 'Não classificada';
+    }
+};
diff --git a/src/libs/convert/schoolType.js b/src/libs/convert/schoolType.js
new file mode 100644
index 0000000000000000000000000000000000000000..f485ecb9fabf74e860e34d1d082b0de1eacce36d
--- /dev/null
+++ b/src/libs/convert/schoolType.js
@@ -0,0 +1,30 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function studentDeficiency(id) {
+    switch (id) {
+        case 1:
+        return 'Pública';
+        case 2:
+        return 'Privada';
+        default:
+        return 'Não classificado';
+    }
+};
diff --git a/src/libs/convert/studentDeficiency.js b/src/libs/convert/studentDeficiency.js
new file mode 100644
index 0000000000000000000000000000000000000000..c5ad0e0184de5f4eecf1ed889c7ea526f634ee0d
--- /dev/null
+++ b/src/libs/convert/studentDeficiency.js
@@ -0,0 +1,30 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function studentDeficiency(id) {
+    switch (id) {
+        case 0:
+        return 'Não';
+        case 1:
+        return 'Sim';
+        default:
+        return 'Não declarado'
+    }
+};
diff --git a/src/libs/convert/teacherSchooling.js b/src/libs/convert/teacherSchooling.js
new file mode 100644
index 0000000000000000000000000000000000000000..d31bd2ee9ff6b27fca20e2a2946dea75996e6cbb
--- /dev/null
+++ b/src/libs/convert/teacherSchooling.js
@@ -0,0 +1,36 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function teacherSchooling(id) {
+    switch (id) {
+        case 1:
+        return 'Sem graduação';
+        case 2:
+        return 'Graduação';
+        case 3:
+        return 'Especialização';
+        case 4:
+        return 'Mestrado';
+        case 5:
+        return 'Doutorado';
+        default:
+        return 'Não declarado';
+    }
+};
diff --git a/src/libs/convert/teacherSituation.js b/src/libs/convert/teacherSituation.js
new file mode 100644
index 0000000000000000000000000000000000000000..ae77189bdf25b7117c7a0618ed9f8c8aaaa0a71c
--- /dev/null
+++ b/src/libs/convert/teacherSituation.js
@@ -0,0 +1,36 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function teacherSituation(id) {
+    switch (id) {
+        case 1:
+        return 'Em exercício';
+        case 2:
+        return 'Afastado para qualificação';
+        case 3:
+        return 'Afastado para exercício em outros órgãos/entidades';
+        case 4:
+        return 'Afastado por outros motivos';
+        case 5:
+        return 'Afastado para tratamento de saúde';
+        case 6:
+        return 'Falecido';
+    }
+};
diff --git a/src/libs/convert/transport.js b/src/libs/convert/transport.js
new file mode 100644
index 0000000000000000000000000000000000000000..f5dbeadbcbfa0c6a90e29514edf288b4c61510c8
--- /dev/null
+++ b/src/libs/convert/transport.js
@@ -0,0 +1,48 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function teacherSituation(id) {
+    switch (id) {
+        case 1:
+        return 'public_transport';
+        case 2:
+        return 'van_and_kombi';
+        case 3:
+        return 'micro_bus';
+        case 4:
+        return 'bus';
+        case 5:
+        return 'bike';
+        case 6:
+        return 'animal_traction';
+        case 7:
+        return 'other_vehicle';
+        case 8:
+        return 'waterway_5_Students';
+        case 9:
+        return 'waterway_15_Students';
+        case 10:
+        return 'waterway_35_Students';
+        case 11:
+        return 'waterway_More_Than_35';
+        case 12:
+        return 'subway_and_train';
+    }
+};
diff --git a/src/libs/convert/upperAdmDependency.js b/src/libs/convert/upperAdmDependency.js
new file mode 100644
index 0000000000000000000000000000000000000000..311475ff7774ba18eac407bf4b78a3d93bf438fb
--- /dev/null
+++ b/src/libs/convert/upperAdmDependency.js
@@ -0,0 +1,40 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function upperAdmDependency(id) {
+    switch (id) {
+        case 1:
+        return 'Pública Federal';
+        case 2:
+        return 'Pública Estadual';
+        case 3:
+        return 'Pública Municipal';
+        case 4:
+        return 'Privada com fins lucrativos';
+        case 5:
+        return 'Privada sem fins lucrativos';
+        case 6:
+        return 'Privada confessional';
+        case 7:
+        return 'Especial';
+        default:
+        return 'Não classificada';
+    }
+};
diff --git a/src/libs/convert/upperEducationMod.js b/src/libs/convert/upperEducationMod.js
new file mode 100644
index 0000000000000000000000000000000000000000..47fa9573cf6477f47f7ee435cbd733e9ce3e152b
--- /dev/null
+++ b/src/libs/convert/upperEducationMod.js
@@ -0,0 +1,30 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function upperEducationMod(id) {
+    switch (id) {
+        case 1:
+        return 'Presencial';
+        case 2:
+        return 'A Distância';
+        default:
+        return 'Não classificada';
+    }
+};
diff --git a/src/libs/convert/upperTurn.js b/src/libs/convert/upperTurn.js
new file mode 100644
index 0000000000000000000000000000000000000000..b5cac83f361bebe821ef9be7b4a442500bd43985
--- /dev/null
+++ b/src/libs/convert/upperTurn.js
@@ -0,0 +1,34 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function upperTurn(id) {
+    switch (id) {
+        case 1:
+        return 'Matutino';
+        case 2:
+        return 'Vespertino';
+        case 3:
+        return 'Noturno';
+        case 4:
+        return 'Integral';
+        default:
+        return 'Não aplicavel (Ead)';
+    }
+};
diff --git a/src/libs/convert/workRegime.js b/src/libs/convert/workRegime.js
new file mode 100644
index 0000000000000000000000000000000000000000..f03d97a8ec20ff4466b9024e16a38a425c3465b1
--- /dev/null
+++ b/src/libs/convert/workRegime.js
@@ -0,0 +1,34 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function workRegime(id) {
+    switch (id) {
+        case 1:
+        return 'Tempo Integral com dedicação exclusiva';
+        case 2:
+        return 'Tempo Integral sem dedicação exclusiva';
+        case 3:
+        return 'Tempo Parcial';
+        case 4:
+        return 'Horista';
+        default:
+        return 'Não declarado';
+    }
+};
diff --git a/src/libs/db/query_exec.js b/src/libs/db/query_exec.js
index 0437bf24cc75e8343cb99ed4a4d844fcfb2299f5..904a34fe71b804cfa8a79d580f9be260402f2b07 100644
--- a/src/libs/db/query_exec.js
+++ b/src/libs/db/query_exec.js
@@ -25,6 +25,8 @@ const log = require(`${libs}/log`)(module);
 
 const conn = require(`${libs}/db/monet`);
 
+const SqlString = require('sqlstring'); 
+
  // Promise that executes an SQL query with optional parameters
  // ```
  // Examples:
@@ -37,25 +39,16 @@ const conn = require(`${libs}/db/monet`);
  // ```
 function execSqlQuery(sqlQuery, sqlQueryParams = []) {
     log.debug(`Executing SQL query '${sqlQuery}' with params '${sqlQueryParams}'`);
+    let queryStrWithParams = SqlString.format(sqlQuery, sqlQueryParams);
     return new Promise((resolve, reject) => {
-        // Prepare statement
-        conn.prepare(sqlQuery, true).then((dbQuery) => {
-            // Execute query
-            dbQuery.exec(sqlQueryParams).then((dbResult) => {
-                // release resources allocated for the prepared statement
-                dbQuery.release();
-                resolve(dbResult.data);
-            }).catch((queryError) => {
-                log.error(`SQL query execution error: ${queryError.message}`);
-                log.error(`SQL query: ${sqlQuery} with params: ${sqlQueryParams}`);
-                // release resources allocated for the prepared statement
-                dbQuery.release();
-                reject(new Error(queryError.message));
-            });
-        }).catch((prepError) => {
-            log.error(`SQL prepared statement error: ${prepError.message}`);
+        // Execute query
+        conn.query(queryStrWithParams, [], true).then((dbResult) => {
+            // release resources allocated for the prepared statement
+            resolve(dbResult.data);
+        },(queryError) => {
+            log.error(`SQL query execution error: ${queryError.message}`);
             log.error(`SQL query: ${sqlQuery} with params: ${sqlQueryParams}`);
-            reject(new Error(prepError.message));
+            reject(new Error(queryError.message));
         });
     });
 }
diff --git a/src/libs/middlewares/addMissing.js b/src/libs/middlewares/addMissing.js
index 6f5ef699eae671c659a66f26bb51e888ad5b62cd..5d0c92fa4b23288c0760b8f303ff8ce834b24cc5 100644
--- a/src/libs/middlewares/addMissing.js
+++ b/src/libs/middlewares/addMissing.js
@@ -22,68 +22,180 @@ module.exports = function addMissing(rqf){
     return (req, res, next) => {
         let dims = Object.keys(req.dims).filter(i => {return i !== 'size';});
         // FIXME: No momento, só funciona para duas dimensões (padrão para o LDE)
-        if(dims.length != 2) return next();
-        if(req.filter.min_year != req.filter.max_year) return next();
+        if((dims.length != 2) && (dims.length == 1 && req.filter.min_year == req.filter.max_year)) return next();
+        // if(req.filter.min_year != req.filter.max_year) return next();
         if(req.result.length === 0) return next();
 
-        let result = req.result;
-        let dimsValues = {};
-        result.forEach((r) => {
-            dims.forEach((dim) => {
-                let rqfName = rqf.fieldValues[dim].resultField;
-                if(typeof dimsValues[rqfName] === 'undefined') {
-                    dimsValues[rqfName] = [];
-                }
-                if(dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
-                    dimsValues[rqfName].push(r[rqfName]);
-                }
-            })
-        });
+        if(dims.length == 2) {
 
-        let G = {};
-        let rqfName = rqf.fieldValues[dims[0]].resultField;
-        let rqfName2 = rqf.fieldValues[dims[1]].resultField;
-        G[rqfName] = {};
-        dimsValues[rqfName].forEach((value) => {
-            let secondDim = {};
+            let result = req.result;
 
-            dimsValues[rqfName2].forEach((dValue) => {
-                secondDim[dValue] = false;
+            let dimsValues = {};
+            result.forEach((r) => {
+                dims.forEach((dim) => {
+                    let rqfName = rqf.fieldValues[dim].resultField;
+                    if(typeof dimsValues[rqfName] === 'undefined') {
+                        dimsValues[rqfName] = [];
+                    }
+                    if(dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
+                        dimsValues[rqfName].push(r[rqfName]);
+                    }
+                })
             });
 
-            G[rqfName][value] = {};
-            G[rqfName][value][rqfName2] = secondDim;
-        });
-
-        result.forEach((r) => {
-            let resultDim1 = r[rqfName];
-            let resultDim2 = r[rqfName2];
-            G[rqfName][resultDim1][rqfName2][resultDim2] = true;
-        });
-
-        Object.keys(G[rqfName]).forEach((dim1Value) => {
-            Object.keys(G[rqfName][dim1Value][rqfName2]).forEach((dim2Value) => {
-                let value = G[rqfName][dim1Value][rqfName2][dim2Value];
-                if(!value) {
-                    let newEntry = Object.assign({}, result[0], {[rqfName]: parseInt(dim1Value, 10), [rqfName2]: parseInt(dim2Value, 10), total: 0});
-                    // result.push(newEntry);
-                    let index = 0;
-                    for(let i = 0; i < result.length; ++i) {
-                        let r = result[i];
-                        index = i;
-                        if(r[rqfName] > newEntry[rqfName]) break;
-                        if(r[rqfName] == newEntry[rqfName] && r[rqfName2] > newEntry[rqfName2]) break;
-                    }
-                    if (newEntry.dim1Value != undefined && newEntry.dim2Value != undefined) {
-                        let newResult = [...result.slice(0, index), newEntry, ...result.slice(index, result.length)];
-                        result = newResult;
+            let G = {};
+            let rqfName = rqf.fieldValues[dims[0]].resultField;
+            let rqfName2 = rqf.fieldValues[dims[1]].resultField;
+            G[rqfName] = {};
+            dimsValues[rqfName].forEach((value) => {
+                let secondDim = {};
+
+                dimsValues[rqfName2].forEach((dValue) => {
+                    secondDim[dValue] = false;
+                });
+
+                G[rqfName][value] = {};
+                G[rqfName][value][rqfName2] = secondDim;
+            });
+
+            result.forEach((r) => {
+                let resultDim1 = r[rqfName];
+                let resultDim2 = r[rqfName2];
+                G[rqfName][resultDim1][rqfName2][resultDim2] = true;
+            });
+
+            Object.keys(G[rqfName]).forEach((dim1Value) => {
+                Object.keys(G[rqfName][dim1Value][rqfName2]).forEach((dim2Value) => {
+                    let value = G[rqfName][dim1Value][rqfName2][dim2Value];
+                    if(!value) {
+                        let newEntry = Object.assign({}, result[0], {[rqfName]: parseInt(dim1Value, 10), [rqfName2]: parseInt(dim2Value, 10), total: 0});
+                        if(newEntry.hasOwnProperty("average"))
+                            newEntry.average = 0;
+                        if(newEntry.hasOwnProperty("median"))
+                            newEntry.median = 0;
+                        if(newEntry.hasOwnProperty("stddev"))
+                            newEntry.stddev = 0;
+                        if(newEntry.hasOwnProperty("first_qt"))
+                            newEntry.first_qt = 0;
+                        if(newEntry.hasOwnProperty("third_qt"))
+                            newEntry.third_qt = 0;
+                        // result.push(newEntry);
+                        let index = 0;
+                        for(let i = 0; i < result.length; ++i) {
+                            let r = result[i];
+                            index = i;
+                            if(r[rqfName] > newEntry[rqfName]) break;
+                            if(r[rqfName] == newEntry[rqfName] && r[rqfName2] > newEntry[rqfName2]) break;
+                        }
+                        if (newEntry.dim1Value == undefined && newEntry.dim2Value == undefined) {
+                            let newResult = [...result.slice(0, index), newEntry, ...result.slice(index, result.length)];
+                            result = newResult;
+                        }
                     }
-                }
+                });
             });
-        });
 
-        req.result = result;
+            req.result = result;
+        }
+
+
+        // Quando é série historica, é uma dimensão com max e min year nos filtros.
+        else if (dims.length == 1 && req.filter.min_year != req.filter.max_year) {
+            let result = req.result;
 
+            //Pega os valores da dimensão
+            let dimsValues = {};
+            result.forEach((r) => {
+
+                // para cada dimensão
+                dims.forEach((dim) => {
+
+                    // pega o nome da dimensao
+                    let rqfName = rqf.fieldValues[dim].resultField;
+                    if (rqfName[0] == "university_id" || rqfName[1] == "university_id") {
+                        rqfName = "university_id"
+                    };
+                    let rqfName2 = "year"
+                    //se n existir o array é uma nova dimensão, então cria os arrays para colocar os ids
+                    if(typeof dimsValues[rqfName] === 'undefined') {
+                        dimsValues[rqfName] = [];
+                    }
+                    if(typeof dimsValues[rqfName2] === 'undefined') {
+                        dimsValues[rqfName2] = [];
+                    }
+                    //se já existe, verifica se está no vetor, se n estiver, adiciona o id
+                    if(dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
+                        dimsValues[rqfName].push(r[rqfName]);
+                    }
+                    //se já existe, verifica se está no vetor, se n estiver, adiciona o ano
+                    if(dimsValues[rqfName2].indexOf(r[rqfName2]) === -1) {
+                        dimsValues[rqfName2].push(r[rqfName2]);
+                    }
+                })
+            })
+
+            //ordena os anos
+            dimsValues["year"] = dimsValues["year"].sort();
+            // console.log(dimsValues);
+
+            let dimsValuesKey = Object.keys(dimsValues);
+            // console.log(dimsValuesKey);
+
+            let firstDim = dimsValuesKey[0];
+            let secondDim = dimsValuesKey[1];
+            let count = 0;
+
+            //Permuta as dimensões em ordem, agora verifica se existe no vetor de resultados.
+            dimsValues[firstDim].forEach((fDim) => {
+                dimsValues[secondDim].forEach((sDim) => {
+
+                     //caso o object chegou ao final e ainda temos coisas para adicionar
+                     if (typeof result[count] === 'undefined' ) {
+                         let newEntry = Object.assign({}, result[count - 1]);
+                         newEntry[firstDim] = fDim;
+                         newEntry[secondDim] = sDim
+                         newEntry["total"] = 0;
+                         let newResult = [...result.slice(0, count), newEntry, ...result.slice(count, result.length)];
+                         result = newResult;
+                         count++;
+                     }
+
+                     //   console.log(fDim,result[count][firstDim],sDim,result[count][secondDim])
+
+                    //está no vetor, aumenta o contador
+                    else if ((fDim == result[count][firstDim]) && (sDim == result[count][secondDim])) {
+                        // console.log("A Entrada Existe");
+                        count++;
+
+                    //se não existe no objecto, vamos ordernar
+                    } else {
+
+                        //  console.log("A entrada " + fDim + " "+ sDim + " Não existe");
+
+                        //Se não existe pega uma copia do próximo, onde a primeira dimensão seja igual
+                        if (result[count][firstDim] == fDim) {
+                            let newEntry = Object.assign({}, result[count]);
+                            newEntry[firstDim] = fDim;
+                            newEntry[secondDim] = sDim
+                            newEntry["total"] = 0;
+                            let newResult = [...result.slice(0, count), newEntry, ...result.slice(count, result.length)];
+                            result = newResult;
+                            count++;
+                        //se não existe pega uma copia do anterior, onde a primeira dimensão seja igual
+                        } else if (result[count - 1][firstDim] == fDim) {
+                             let newEntry = Object.assign({}, result[count - 1]);
+                            newEntry[firstDim] = fDim;
+                            newEntry[secondDim] = sDim
+                            newEntry["total"] = 0;
+                            let newResult = [...result.slice(0, count - 1), newEntry, ...result.slice(count - 1, result.length)];
+                            result = newResult;
+                            count++;
+                        }
+                    }
+                });
+            });
+            req.result = result;
+        }
         next();
     };
 };
diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js
index 65a8b3cab9ad06d15d013a264b8dc88bf376eacd..d800505c1e7d9213199f0e0aa5b28d70a2c3c5ba 100644
--- a/src/libs/middlewares/id2str.js
+++ b/src/libs/middlewares/id2str.js
@@ -27,6 +27,7 @@ const admDependencyPriv = require(`${libs}/convert/admDependencyPriv`);
 const location = require(`${libs}/convert/location`);
 const ruralLocation = require(`${libs}/convert/ruralLocation`);
 const ethnicGroup = require(`${libs}/convert/ethnicGroup`);
+const ethnicGroupIES = require(`${libs}/convert/ethnicGroupIES`);
 const agreement = require(`${libs}/convert/agreement`);
 const booleanVariable = require(`${libs}/convert/booleanVariable`);
 const educationLevel = require(`${libs}/convert/educationLevel`);
@@ -41,18 +42,42 @@ const contractType = require(`${libs}/convert/contractType`);
 const ethnicGroupPnad = require(`${libs}/convert/ethnicGroupPnad`);
 const ageRange = require(`${libs}/convert/ageRange`);
 const ageRangeAll = require(`${libs}/convert/ageRangeAll`);
+const ageStudentCode = require(`${libs}/convert/ageStudentCode`);
 const fullAgeRange = require(`${libs}/convert/fullAgeRange`);
 const genderPnad = require(`${libs}/convert/genderPnad`);
 const fifthHouseholdIncome = require(`${libs}/convert/fifthHouseholdIncome`);
 const extremesHouseholdIncome = require(`${libs}/convert/extremesHouseholdIncome`);
 const educationLevelBasic = require(`${libs}/convert/educationLevelBasic`);
 const useTransport = require(`${libs}/convert/booleanVariable`);
+const transport = require(`${libs}/convert/transport`);
 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 pfe = require(`${libs}/convert/pfe`);
+const upperAdmDependency = require(`${libs}/convert/upperAdmDependency`);
+const academicOrganization = require(`${libs}/convert/academicOrganization`);
+const ocdeSpecific = require(`${libs}/convert/ocdeSpecific`);
+const ocdeGeral = require(`${libs}/convert/ocdeGeral`);
+const ocdeDetailed = require(`${libs}/convert/ocdeDetailed`);
+const academicLevel = require(`${libs}/convert/academicLevel`);
+const upperEducationMod = require(`${libs}/convert/upperEducationMod`);
+const studentDeficiency = require(`${libs}/convert/studentDeficiency`);
+const schoolType = require(`${libs}/convert/schoolType`);
+const upperTurn = require(`${libs}/convert/upperTurn`);
+const teacherSituation = require(`${libs}/convert/teacherSituation`);
+const workRegime = require(`${libs}/convert/workRegime`);
+const substitute = require(`${libs}/convert/booleanVariable`);
+const visitor = require(`${libs}/convert/booleanVariable`);
+const eadTeacher = require(`${libs}/convert/booleanVariable`);
+const graduationPresential = require(`${libs}/convert/booleanVariable`);
+const postgraduateEadTeacher = require(`${libs}/convert/booleanVariable`);
+const postgraduatePresentialTeacher = require(`${libs}/convert/booleanVariable`);
+const teacherSchooling = require(`${libs}/convert/teacherSchooling`);
+const ethnicGroupTeacherIES = require(`${libs}/convert/ethnicGroupTeacherIES`);
+const genderIES = require(`${libs}/convert/genderIES`);
+const deficiency = require(`${libs}/convert/studentDeficiency`);
 
 const ids = {
     gender_id: gender,
@@ -97,6 +122,34 @@ const ids = {
     special_class_id: specialClass,
     education_level_school_year_id: educationLevelSchoolYear,
     pfe_id: pfe,
+    upper_adm_dependency_id: upperAdmDependency,
+    academic_organization_id: academicOrganization,
+    ocde_specific_id: ocdeSpecific,
+    ocde_geral_id: ocdeGeral,
+    ocde_detailed_id: ocdeDetailed,
+    academic_level_id: academicLevel,
+    upper_education_mod_id: upperEducationMod,
+    student_deficiency_id: studentDeficiency,
+    school_type_id: schoolType,
+    upper_turn_id: upperTurn,
+    is_free_id: booleanVariable,
+    night_time_id: booleanVariable,
+    capital_id: booleanVariable,
+    ethnic_group_ies_id: ethnicGroupIES,
+    teacher_situation_id: teacherSituation,
+    work_regime_id: workRegime,
+    substitute_id: booleanVariable,
+    visitor_id: booleanVariable,
+    ead_teacher_id: eadTeacher,
+    graduation_presential_id: graduationPresential,
+    postgraduate_ead_teacher_id: postgraduateEadTeacher,
+    postgraduate_presential_teacher_id: postgraduatePresentialTeacher,
+    teacher_schooling_id: teacherSchooling,
+    ethnic_group_teacher_ies_id: ethnicGroupTeacherIES,
+    gender_ies_id: genderIES,
+    deficiency_id: deficiency,
+    age_student_code_id: ageStudentCode,
+    transport_id: transport
 };
 
 function transform(removeId=false) {
@@ -144,6 +197,7 @@ module.exports = {
     educationLevelBasic,
     educationLevelMod,
     educationLevelShort,
+    educationLevelSchoolYear,
     admDependency,
     admDependencyPriv,
     location,
@@ -160,6 +214,7 @@ module.exports = {
     ethnicGroupPnad,
     ageRange,
     ageRangeAll,
+    ageStudentCode,
     fullAgeRange,
     genderPnad,
     fifthHouseholdIncome,
@@ -167,5 +222,29 @@ module.exports = {
     useTransport,
     transportationManager,
     specialClass,
-    integralTime
+    integralTime,
+    upperAdmDependency,
+    academicOrganization,
+    ocdeSpecific,
+    ocdeGeral,
+    ocdeDetailed,
+    academicLevel,
+    upperEducationMod,
+    studentDeficiency,
+    schoolType,
+    ethnicGroupIES,
+    upperTurn,
+    teacherSituation,
+    workRegime,
+    substitute,
+    visitor,
+    eadTeacher,
+    graduationPresential,
+    postgraduateEadTeacher,
+    postgraduatePresentialTeacher,
+    teacherSchooling,
+    ethnicGroupTeacherIES,
+    genderIES,
+    deficiency,
+    transport
 };
diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index abc8a2d74133a2abf4bac63f47e0e5fdf7bbbbc1..81007df0b8986cdf29115a54adfef6b19fc02fac 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -93,6 +93,14 @@ const youth_jobs = require(`${libs}/routes/SMPPIR/youth_jobs`)
 const youth_education = require(`${libs}/routes/SMPPIR/youth_education`)
 
 
+const universityEnrollment = require(`${libs}/routes/universityEnrollment`);
+
+const courseCount = require(`${libs}/routes/courseCount`);
+
+const university = require(`${libs}/routes/university`);
+
+const universityTeacher = require(`${libs}/routes/universityTeacher`);
+
 api.get('/', (req, res) => {
     res.json({ msg: 'SMPPIR API is running' });
 });
@@ -132,4 +140,4 @@ api.use('/ciganos_sustentability', ciganos_sustentability);
 api.use('/youth_jobs', youth_jobs)
 api.use('/youth_education', youth_education)
 
-module.exports = api;
\ No newline at end of file
+module.exports = api;
diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
new file mode 100644
index 0000000000000000000000000000000000000000..c59892e7fe5e928978b43e5f5ea94959c746c4e5
--- /dev/null
+++ b/src/libs/routes/courseCount.js
@@ -0,0 +1,413 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+const express = require('express');
+
+const courseCountApp = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const log = require(`${libs}/log`)(module);
+
+const squel = require('squel');
+
+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`);
+
+const addMissing = require(`${libs}/middlewares/addMissing`);
+
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
+let rqf = new ReqQueryFields();
+
+courseCountApp.use(cache('15 day'));
+
+courseCountApp.get('/upper_adm_dependency', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 7; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.upperAdmDependency(i)
+        });
+    };
+    next();
+}, response('upper_adm_dependency'));
+
+courseCountApp.get('/years', (req, res, next) => {
+    req.sql.from('curso_ens_superior')
+    .field('DISTINCT curso_ens_superior.ano_censo', 'year');
+    next();
+}, query, response('years'));
+
+courseCountApp.get('/year_range', (req, res, next) => {
+    req.sql.from('curso_ens_superior')
+    .field('MIN(curso_ens_superior.ano_censo)', 'start_year')
+    .field('MAX(curso_ens_superior.ano_censo)', 'end_year');
+    next();
+}, query, response('range'));
+
+courseCountApp.get('/academic_organization', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 5; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.academicOrganization(i)
+        });
+    };
+    next();
+}, response('academic_organization'));
+
+courseCountApp.get('/capital', (req, res, next) => {
+    req.result = [
+        {id: null, name: 'Não Classificado'},
+        {id: 0, name: 'Não'},
+        {id: 1, name: 'Sim'}
+    ];
+    next();
+}, response('capital'));
+
+courseCountApp.get('/ocde_geral', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 8; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.ocdeGeral(i)
+        });
+    };
+    next();
+}, response('ocde_geral'));
+
+courseCountApp.get('/ocde_specific', (req, res, next) => {
+    req.result = [];
+    const defaultCase = null;
+    for(let i = 1; i <= 86; ++i) {
+        let obj = {
+            id: i,
+            name: id2str.ocdeSpecific(i)
+        };
+        if (obj.name !== id2str.ocdeSpecific(defaultCase)){
+            req.result.push(obj);
+        }
+    };
+    req.result.push({
+        id: defaultCase,
+        name: id2str.ocdeSpecific(defaultCase)
+    });
+    next();
+}, response('ocde_specific'));
+
+courseCountApp.get('/ocde_detailed', (req, res, next) => {
+    req.result = [];
+    const defaultCase = null;
+    for(let i = 142; i <= 863; ++i) {
+        let obj = {
+            id: i,
+            name: id2str.ocdeDetailed(i)
+        };
+        if (obj.name !== id2str.ocdeDetailed(defaultCase)){
+            req.result.push(obj);
+        }
+    };
+    req.result.push({
+        id: defaultCase,
+        name: id2str.ocdeDetailed(defaultCase)
+    });
+    next();
+}, response('ocde_detailed'));
+
+courseCountApp.get('/academic_level', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 4; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.academicLevel(i)
+        });
+    };
+    next();
+}, response('academic_level'));
+
+courseCountApp.get('/upper_education_mod', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 3; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.upperEducationMod(i)
+        });
+    };
+    next();
+}, response('upper_education_mod'));
+
+courseCountApp.get('/is_free', (req, res, next) => {
+    req.result = [
+        {id: null, name: 'Não Classificado'},
+        {id: 0, name: 'Não'},
+        {id: 1, name: 'Sim'}
+    ];
+    next();
+}, response('is_free'));
+
+courseCountApp.get('/night_time', (req, res, next) => {
+    req.result = [
+        {id: null, name: 'Não Classificado'},
+        {id: 0, name: 'Não'},
+        {id: 1, name: 'Sim'}
+    ];
+    next();
+}, response('night_time'));
+
+courseCountApp.get('/university', (req, res, next) => {
+    req.sql.from('curso_ens_superior')
+    .field('DISTINCT curso_ens_superior.nome_ies', 'nome')
+    .field('curso_ens_superior.cod_ies', 'cod')
+    next();
+}, query, response('university'));
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValue({
+    name: 'region',
+    table: 'regiao',
+    tableField: ['nome', 'id'],
+    resultField: ['region_name', 'region_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'nome',
+        foreign: 'nome_regiao_curso',
+        foreignTable: 'curso_ens_superior'
+    }
+}).addValue({
+    name: 'state',
+    table: 'estado',
+    tableField: ['nome', 'id'],
+    resultField: ['state_name', 'state_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_uf_curso',
+        foreignTable: 'curso_ens_superior'
+    }
+}).addValue({
+    name: 'city',
+    table: 'curso_ens_superior',
+    tableField: ['municipio_curso', 'cod_municipio_curso'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_municipio_curso'
+    }
+}).addValue({
+    name: 'university',
+    table: 'curso_ens_superior',
+    tableField: ['cod_ies', 'nome_ies'],
+    resultField: ['university_id', 'university_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_ies'
+    }
+}).addValue({
+    name:'upper_adm_dependency',
+    table: 'curso_ens_superior',
+    tableField: 'par_categoria_administrativa',
+    resultField: 'upper_adm_dependency_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_categoria_administrativa'
+    }
+}).addValue({
+    name:'academic_organization',
+    table: 'curso_ens_superior',
+    tableField: 'cod_organizacao_academica',
+    resultField: 'academic_organization_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_organizacao_academica'
+    }
+}).addValue({
+    name:'capital',
+    table: 'curso_ens_superior',
+    tableField: 'tfd_capital_curso',
+    resultField: 'capital_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'tfd_capital_curso'
+    }
+}).addValue({
+    name:'course',
+    table: 'curso_ens_superior',
+    tableField: 'nome_curso',
+    resultField: 'course_name',
+    where: {
+        relation: 'LIKE',
+        type: 'string',
+        field: 'nome_curso'
+    }
+}).addValue({
+    name:'ocde_specific',
+    table: 'curso_ens_superior',
+    tableField: ['cod_ocde_area_especifica', 'nome_ocde_area_especifica'],
+    resultField: ['ocde_specific_id', 'ocde_specific_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_ocde_area_especifica'
+    }
+}).addValue({
+    name:'ocde_geral',
+    table: 'curso_ens_superior',
+    tableField: ['cod_ocde_area_geral', 'nome_ocde_area_geral'],
+    resultField: ['ocde_geral_id', 'ocde_geral_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_ocde_area_geral'
+    }
+}).addValue({
+    name:'ocde_detailed',
+    table: 'curso_ens_superior',
+    tableField: ['cod_ocde_area_detalhada', 'nome_ocde_area_detalhada'],
+    resultField: ['ocde_detailed_id', 'ocde_datailed_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_ocde_area_detalhada'
+    }
+}).addValue({
+    name:'academic_level',
+    table: 'curso_ens_superior',
+    tableField: 'cod_grau_academico',
+    resultField: 'academic_level_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_grau_academico'
+    }
+}).addValue({
+    name:'upper_education_mod',
+    table: 'curso_ens_superior',
+    tableField: 'cod_modalidade_ensino',
+    resultField: 'upper_education_mod_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_modalidade_ensino'
+    }
+}).addValue({
+    name:'is_free',
+    table: 'curso_ens_superior',
+    tableField: 'gratuito',
+    resultField: 'is_free_id',
+    where: {
+        relation: '=',
+        type: 'boolean',
+        field: 'gratuito'
+    }
+}).addValue({
+    name:'night_time',
+    table: 'curso_ens_superior',
+    tableField: 'noturno_curso',
+    resultField: 'night_time_id',
+    where: {
+        relation: '=',
+        type: 'boolean',
+        field: 'noturno_curso'
+    }
+}).addValue({
+    name:'situation',
+    table: 'curso_ens_superior',
+    tableField: 'cod_situacao_curso',
+    resultField: 'situacao_curso_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_situacao_curso'
+    }
+}).addValue({
+    name:'year',
+    table: 'curso_ens_superior',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'min_year',
+    table: 'curso_ens_superior',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '>=',
+        type: 'integer',
+        table: 'curso_ens_superior',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'max_year',
+    table: 'curso_ens_superior',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '<=',
+        type: 'integer',
+        table: 'curso_ens_superior',
+        field: 'ano_censo'
+    }
+});
+
+courseCountApp.get('/', rqf.parse(), (req, res, next) => {
+    req.sql.from('curso_ens_superior')
+        .field('COUNT(curso_ens_superior.cod_curso)', 'total')
+        .field("'Brasil'", 'name')
+        .field('curso_ens_superior.ano_censo', 'year')
+        .group('curso_ens_superior.ano_censo')
+        .order('curso_ens_superior.ano_censo')
+        .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
+        .where('curso_ens_superior.cod_nivel_academico = 1');
+    next();
+}, rqf.build(), query, id2str.transform(), addMissing(rqf), response('course_count'));
+
+module.exports = courseCountApp;
diff --git a/src/libs/routes/university.js b/src/libs/routes/university.js
new file mode 100644
index 0000000000000000000000000000000000000000..959f4adb331344515f139582014150cebbe43749
--- /dev/null
+++ b/src/libs/routes/university.js
@@ -0,0 +1,331 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+const express = require('express');
+
+const universityApp = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const log = require(`${libs}/log`)(module);
+
+const squel = require('squel');
+
+const query = require(`${libs}/middlewares/query`).query;
+
+const response = require(`${libs}/middlewares/response`);
+
+const id2str = require(`${libs}/middlewares/id2str`);
+
+const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
+
+const request = require(`request`);
+
+const config = require(`${libs}/config`);
+
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
+const addMissing = require(`${libs}/middlewares/addMissing`);
+
+let rqf = new ReqQueryFields();
+
+let rqfCount = new ReqQueryFields();
+
+universityApp.use(cache('15 day'));
+
+universityApp.get('/upper_adm_dependency', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 7; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.upperAdmDependency(i)
+        });
+    };
+    next();
+}, response('upper_adm_dependency'));
+
+universityApp.get('/years', (req, res, next) => {
+    req.sql.from('ies_ens_superior')
+    .field('DISTINCT ies_ens_superior.ano_censo', 'year')
+    next();
+}, query, response('years'));
+
+universityApp.get('/year_range', (req, res, next) => {
+    req.sql.from('ies_ens_superior')
+    .field('MIN(ies_ens_superior.ano_censo)', 'start_year')
+    .field('MAX(ies_ens_superior.ano_censo)', 'end_year');
+    next();
+}, query, response('range'));
+
+universityApp.get('/academic_organization', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 5; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.academicOrganization(i)
+        });
+    };
+    next();
+}, response('academic_organization'));
+
+universityApp.get('/capital', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.booleanVariable(i)
+        });
+    };
+    next();
+}, response('capital'));
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addValue({
+    name: 'id',
+    table: 'ies_ens_superior',
+    tableField: 'cod_ies',
+    resultField: 'id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_ies'
+    }
+}).addValue({
+    name: 'city',
+    table: 'municipio',
+    tableField: 'nome',
+    resultField: 'city_name',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_municipio_ies',
+        table: 'ies_ens_superior'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio_ies',
+        foreignTable: 'ies_ens_superior'
+    }
+}).addValue({
+    name: 'state',
+    table: 'estado',
+    tableField: 'nome',
+    resultField: 'state_name',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_uf_ies',
+        table: 'ies_ens_superior'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_uf_ies',
+        foreignTable: 'ies_ens_superior'
+    }
+}).addValue({
+    name: 'year',
+    table: 'ies_ens_superior',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'ano_censo',
+        table: 'ies_ens_superior'
+    }
+}).addField({
+    name: 'search',
+    field: true,
+    where: true
+}).addValueToField({
+    name: 'city_name',
+    table: 'municipio',
+    tableField: 'nome',
+    resultField: 'city_name',
+    dontGroup: true,
+    where: {
+        relation: 'LIKE',
+        type: 'string',
+        field: 'nome'
+    },
+    join: {
+      primary: 'id',
+      foreign: 'cod_municipio_ies',
+      foreignTable: 'ies_ens_superior'
+    }
+}, 'search')
+.addValueToField({
+    name: 'state_name',
+    table: 'estado',
+    tableField: 'nome',
+    resultField: 'state_name',
+    dontGroup: true,
+    where: {
+        relation: 'LIKE',
+        type: 'string',
+        field: 'sigla'
+    },
+    join: {
+      primary: 'id',
+      foreign: 'cod_uf_ies',
+      foreignTable: 'ies_ens_superior'
+    }
+}, 'search');
+
+
+rqfCount.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValue({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_municipio_ies',
+        table: 'ies_ens_superior'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio_ies',
+        foreignTable: 'ies_ens_superior'
+    }
+}).addValue({
+    name: 'region',
+    table: 'regiao',
+    tableField: ['nome', 'id'],
+    resultField: ['region_name', 'region_id'],
+    where: {
+        relation: 'LIKE',
+        type: 'string',
+        field: 'id'
+    },
+    join: {
+        primary: 'nome',
+        foreign: 'nome_regiao_ies',
+        foreignTable: 'ies_ens_superior'
+    }
+
+}).addValue({
+    name: 'min_year',
+    table: '@',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '>=',
+        type: 'integer',
+        table: '@',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'max_year',
+    table: '@',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '<=',
+        type: 'integer',
+        table: '@',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'state',
+    table: 'estado',
+    tableField: ['nome', 'id'],
+    resultField: ['state_name', 'state_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_uf_ies',
+        table: '@'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_uf_ies',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'upper_adm_dependency',
+    table: 'ies_ens_superior',
+    tableField: 'par_categoria_administrativa',
+    resultField: 'upper_adm_dependency_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        table: 'ies_ens_superior',
+        field: 'cod_categoria_administrativa'
+    }
+}).addValue({
+    name: 'academic_organization',
+    table: 'ies_ens_superior',
+    tableField: 'cod_organizacao_academica',
+    resultField: 'academic_organization_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        table: 'ies_ens_superior',
+        field: 'cod_organizacao_academica'
+    }
+}).addValue({
+    name: 'capital',
+    table: 'ies_ens_superior',
+    tableField: 'tfd_capital_ies',
+    resultField: 'capital_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        table: 'ies_ens_superior',
+        field: 'capital_ies'
+    }
+});
+
+universityApp.get('/', rqf.parse(),  rqf.build(), (req, res, next) => {
+    req.sql.from('ies_ens_superior')
+        .field('ies_ens_superior.cod_ies', 'id')
+        .field('ies_ens_superior.ano_censo', 'year')
+        .field('ies_ens_superior.nome_ies', 'name')
+        .field('ies_ens_superior.cod_uf_ies', 'state_id')
+        .field('ies_ens_superior.cod_municipio_ies', 'city_id');
+    next();
+
+}, query, response('university'));
+
+universityApp.get('/count', rqfCount.parse(), (req, res, next) => {
+    req.sql.field('COUNT(*)', 'total')
+    .field("'Brasil'", 'name')
+    .field('ies_ens_superior.ano_censo', 'year')
+    .from('ies_ens_superior')
+    .group('ies_ens_superior.ano_censo')
+    .order('ies_ens_superior.ano_censo')
+
+    next();
+}, rqfCount.build(), query, addMissing(rqfCount), id2str.transform(), response('university'));
+
+module.exports = universityApp;
diff --git a/src/libs/routes/universityEnrollment.js b/src/libs/routes/universityEnrollment.js
new file mode 100644
index 0000000000000000000000000000000000000000..a618a7be5d9eb56dc169b36e70ca2cd04c703f21
--- /dev/null
+++ b/src/libs/routes/universityEnrollment.js
@@ -0,0 +1,492 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+const express = require('express');
+
+const universityEnrollmentApp = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const log = require(`${libs}/log`)(module);
+
+const squel = require('squel');
+
+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 addMissing = require(`${libs}/middlewares/addMissing`);
+
+const config = require(`${libs}/config`);
+
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
+let rqf = new ReqQueryFields();
+
+universityEnrollmentApp.get('/years', (req, res, next) => {
+    req.sql.from('aluno_ens_superior')
+    .field('DISTINCT aluno_ens_superior.ano_censo', 'year');
+    next();
+}, query, response('years'));
+
+universityEnrollmentApp.get('/year_range', (req, res, next) => {
+    req.sql.from('aluno_ens_superior')
+    .field('MIN(aluno_ens_superior.ano_censo)', 'start_year')
+    .field('MAX(aluno_ens_superior.ano_censo)', 'end_year');
+    next();
+}, query, response('range'));
+
+universityEnrollmentApp.get('/academic_organization', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 5; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.academicOrganization(i)
+        });
+    };
+    next();
+}, response('academic_organization'));
+
+universityEnrollmentApp.get('/upper_adm_dependency', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 7; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.upperAdmDependency(i)
+        });
+    };
+    next();
+}, response('upper_adm_dependency'));
+
+universityEnrollmentApp.get('/ocde_geral', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 8; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.ocdeGeral(i)
+        });
+    };
+    next();
+}, response('ocde_geral'));
+
+universityEnrollmentApp.get('/ocde_specific', (req, res, next) => {
+    req.result = [];
+    const defaultCase = null;
+    for(let i = 1; i <= 86; ++i) {
+        let obj = {
+            id: i,
+            name: id2str.ocdeSpecific(i)
+        };
+        if (obj.name !== id2str.ocdeSpecific(defaultCase)){
+            req.result.push(obj);
+        }
+    };
+    req.result.push({
+        id: defaultCase,
+        name: id2str.ocdeSpecific(defaultCase)
+    });
+    next();
+}, response('ocde_specific'));
+
+universityEnrollmentApp.get('/ocde_detailed', (req, res, next) => {
+    req.result = [];
+    const defaultCase = null;
+    for(let i = 142; i <= 863; ++i) {
+        let obj = {
+            id: i,
+            name: id2str.ocdeDetailed(i)
+        };
+        if (obj.name !== id2str.ocdeDetailed(defaultCase)){
+            req.result.push(obj);
+        }
+    };
+    req.result.push({
+        id: defaultCase,
+        name: id2str.ocdeDetailed(defaultCase)
+    });
+    next();
+}, response('ocde_detailed'));
+
+universityEnrollmentApp.get('/upper_turn', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 4; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.upperTurn(i)
+        });
+    };
+    next();
+}, response('upper_turn'));
+
+universityEnrollmentApp.get('/student_deficiency', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.studentDeficiency(i)
+        });
+    };
+    next();
+}, response('student_deficiency'));
+
+universityEnrollmentApp.get('/ethnic_group_ies', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <=5; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.ethnicGroupIES(i)
+        });
+    }
+    next();
+}, response('ethnic_group_ies'));
+
+universityEnrollmentApp.get('/school_type', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 2; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.schoolType(i)
+        });
+    };
+    next();
+}, response('school_type'));
+
+universityEnrollmentApp.get('/university', (req, res, next) => {
+    req.sql.from('aluno_ens_superior')
+    .field('DISTINCT aluno_ens_superior.nome_ies', 'nome')
+    .field('aluno_ens_superior.cod_ies', 'cod')
+    next();
+}, query, response('university'));
+
+universityEnrollmentApp.get('/academic_level', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 4; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.academicLevel(i)
+        });
+    };
+    next();
+}, response('academic_level'));
+
+universityEnrollmentApp.get('/gender_ies', function (req, res, next) {
+    req.result = [];
+    for (var i = 1; i <= 2; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.genderIES(i)
+        });
+    };
+    next();
+}, response('gender_ies'));
+
+universityEnrollmentApp.get('/upper_education_mod', function (req, res, next) {
+    req.result = [];
+    for (var i = 1; i <= 3; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.upperEducationMod(i)
+        });
+    };
+    next();
+}, response('upper_education_mod'));
+
+universityEnrollmentApp.get('/age_student_code', function (req, res, next) {
+    req.result = [];
+    for (var i = 1; i <= 6; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.ageStudentCode(i)
+        });
+    };
+    next();
+}, response('age_student_code'));
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValue({
+    name: 'min_year',
+    table: '@',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '>=',
+        type: 'integer',
+        table: '@',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'max_year',
+    table: '@',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '<=',
+        type: 'integer',
+        table: '@',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'state',
+    table: 'estado',
+    tableField: ['nome', 'id'],
+    resultField: ['state_name', 'state_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_uf_ies',
+        table: '@'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_uf_ies',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_municipio_ies',
+        table: '@'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio_ies',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'region',
+    table: 'regiao',
+    tableField: ['nome', 'id'],
+    resultField: ['region_name', 'region_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_regiao_ies',
+        foreignTable: 'aluno_ens_superior'
+    }
+}).addValue({
+    name: 'university',
+    table: 'aluno_ens_superior',
+    tableField: ['cod_ies', 'nome_ies'],
+    resultField: ['university_id', 'university_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_ies'
+    }
+}).addValue({
+    name: 'age_student_code',
+    table: 'aluno_ens_superior',
+    tableField: 'idade_aluno_codigo',
+    resultField: 'age_student_code_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'idade_aluno_codigo'
+    }
+}).addValue({
+    name: 'upper_adm_dependency',
+    table: 'aluno_ens_superior',
+    tableField: 'par_categoria_administrativa',
+    resultField: 'upper_adm_dependency_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        table: 'aluno_ens_superior',
+        field: 'par_categoria_administrativa'
+    }
+}).addValue({
+    name: 'academic_organization',
+    table: 'aluno_ens_superior',
+    tableField: 'cod_organizacao_academica',
+    resultField: 'academic_organization_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        table: 'aluno_ens_superior',
+        field: 'cod_organizacao_academica'
+    }
+}).addValue({
+    name:'ocde_specific',
+    table: 'aluno_ens_superior',
+    tableField: 'par_cod_ocde_area_especifica',
+    resultField: 'ocde_specific_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_cod_ocde_area_especifica'
+    }
+}).addValue({
+    name:'ocde_geral',
+    table: 'aluno_ens_superior',
+    tableField: 'par_cod_ocde_area_geral',
+    resultField: 'ocde_geral_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_cod_ocde_area_geral'
+    }
+}).addValue({
+    name:'ocde_detailed',
+    table: 'aluno_ens_superior',
+    tableField: 'par_cod_ocde_area_detalhada',
+    resultField: 'ocde_detailed_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_cod_ocde_area_detalhada'
+    }
+}).addValue({
+    name:'academic_level',
+    table: 'aluno_ens_superior',
+    tableField: 'cod_grau_academico',
+    resultField: 'academic_level_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_grau_academico'
+    }
+}).addValue({
+    name:'upper_education_mod',
+    table: 'aluno_ens_superior',
+    tableField: 'cod_modalidade_ensino',
+    resultField: 'upper_education_mod_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_modalidade_ensino'
+    }
+}).addValue({
+    name:'upper_turn',
+    table: 'aluno_ens_superior',
+    tableField: 'cod_turno_aluno',
+    resultField: 'upper_turn_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_turno_aluno'
+    }
+}).addValue({
+    name:'ethnic_group_ies',
+    table: 'aluno_ens_superior',
+    tableField: 'par_cod_cor_raca_aluno',
+    resultField: 'ethnic_group_ies_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_cod_cor_raca_aluno'
+    }
+}).addValue({
+    name:'student_deficiency',
+    table: 'aluno_ens_superior',
+    tableField: 'par_aluno_deficiencia_transtorno_superdotacao',
+    resultField: 'student_deficiency_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_aluno_deficiencia_transtorno_superdotacao'
+    }
+}).addValue({
+    name:'school_type',
+    table: 'aluno_ens_superior',
+    tableField: 'par_tipo_escola_ensino_medio',
+    resultField: 'school_type_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_tipo_escola_ensino_medio'
+    }
+}).addValue({
+    name: 'university',
+    table: 'aluno_ens_superior',
+    tableField: ['cod_ies', 'nome_ies'],
+    resultField: ['university_id', 'university_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_ies'
+    }
+}).addValue({
+    name: 'gender_ies',
+    table: 'aluno_ens_superior',
+    tableField: 'par_genero_aluno',
+    resultField: 'gender_ies_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_genero_aluno'
+    }
+}).addValue({
+    name:'academic_level',
+    table: 'aluno_ens_superior',
+    tableField: 'cod_grau_academico',
+    resultField: 'academic_level_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_grau_academico'
+    }
+});
+
+universityEnrollmentApp.get('/', rqf.parse(), (req, res, next) => {
+
+    if ("university" in req.dims) {
+        req.sql.field('COUNT(*)', 'total')
+        .field("'Brasil'", 'name')
+        .field('aluno_ens_superior.ano_censo', 'year')
+        .from('aluno_ens_superior')
+        .where('aluno_ens_superior.matriculado = 1 AND aluno_ens_superior.cod_nivel_academico = 1')
+        .group('aluno_ens_superior.cod_ies')
+        .group('aluno_ens_superior.ano_censo')
+        .order('aluno_ens_superior.cod_ies')
+        .order('aluno_ens_superior.ano_censo')
+    } else {
+        req.sql.field('COUNT(*)', 'total')
+        .field("'Brasil'", 'name')
+        .field('aluno_ens_superior.ano_censo', 'year')
+        .from('aluno_ens_superior')
+        .where('aluno_ens_superior.matriculado = 1 AND aluno_ens_superior.cod_nivel_academico = 1')
+        .group('aluno_ens_superior.ano_censo')
+        .order('aluno_ens_superior.ano_censo')
+    }
+   next();
+
+},  rqf.build(), query, addMissing(rqf), id2str.transform(false), response('universityEnrollment'));
+
+module.exports = universityEnrollmentApp;
diff --git a/src/libs/routes/universityTeacher.js b/src/libs/routes/universityTeacher.js
new file mode 100644
index 0000000000000000000000000000000000000000..42851c2b85c9dbdd1ec69da7983f2306597dca29
--- /dev/null
+++ b/src/libs/routes/universityTeacher.js
@@ -0,0 +1,490 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+const express = require('express');
+
+const teacherEnrollmentApp = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const log = require(`${libs}/log`)(module);
+
+const squel = require('squel');
+
+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 addMissing = require(`${libs}/middlewares/addMissing`);
+
+const config = require(`${libs}/config`);
+
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
+let rqf = new ReqQueryFields();
+
+teacherEnrollmentApp.get('/years', (req, res, next) => {
+    req.sql.from('docente_ens_superior')
+    .field('DISTINCT docente_ens_superior.ano_censo', 'year');
+    next();
+}, query, response('years'));
+
+teacherEnrollmentApp.get('/year_range', (req, res, next) => {
+    req.sql.from('docente_ens_superior')
+    .field('MIN(docente_ens_superior.ano_censo)', 'start_year')
+    .field('MAX(docente_ens_superior.ano_censo)', 'end_year');
+    next();
+}, query, response('range'));
+
+teacherEnrollmentApp.get('/academic_organization', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 5; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.academicOrganization(i)
+        });
+    };
+    next();
+}, response('academic_organization'));
+
+teacherEnrollmentApp.get('/upper_adm_dependency', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 7; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.upperAdmDependency(i)
+        });
+    };
+    next();
+}, response('upper_adm_dependency'));
+
+teacherEnrollmentApp.get('/teacher_situation', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 6; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.teacherSituation(i)
+        });
+    };
+    next();
+}, response('teacher_situation'));
+
+teacherEnrollmentApp.get('/work_regime', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 4; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.workRegime(i)
+        });
+    };
+    next();
+}, response('work_regime'));
+
+teacherEnrollmentApp.get('/substitute', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.booleanVariable(i)
+        });
+    };
+    next();
+}, response('substitute'));
+
+teacherEnrollmentApp.get('/visitor', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.booleanVariable(i)
+        });
+    };
+    next();
+}, response('visitor'));
+
+teacherEnrollmentApp.get('/ead_teacher', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.booleanVariable(i)
+        });
+    };
+    next();
+}, response('ead_teacher'));
+
+teacherEnrollmentApp.get('/graduation_presential', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.booleanVariable(i)
+        });
+    };
+    next();
+}, response('graduation_presential'));
+
+teacherEnrollmentApp.get('/postgraduate_ead_teacher', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.booleanVariable(i)
+        });
+    };
+    next();
+}, response('postgraduate_ead_teacher'));
+
+teacherEnrollmentApp.get('/postgraduate_presential_teacher', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.booleanVariable(i)
+        });
+    };
+    next();
+}, response('postgraduate_presential_teacher'));
+
+teacherEnrollmentApp.get('/deficiency', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 1; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.booleanVariable(i)
+        });
+    };
+    next();
+}, response('deficiency'));
+
+teacherEnrollmentApp.get('/ethnic_group_teacher_ies', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 5; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.ethnicGroupTeacherIES(i)
+        });
+    };
+    next();
+}, response('ethnic_group_teacher_ies'));
+
+teacherEnrollmentApp.get('/teacher_schooling', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 5; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.teacherSchooling(i)
+        });
+    };
+    next();
+}, response('teacher_schooling'));
+
+teacherEnrollmentApp.get('/gender_ies', (req, res, next) => {
+    req.result = [];
+    for(let i = 1; i <= 2; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.genderIES(i)
+        });
+    };
+    next();
+}, response('gender_ies'));
+
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValue({
+    name: 'min_year',
+    table: '@',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '>=',
+        type: 'integer',
+        table: '@',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'max_year',
+    table: '@',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '<=',
+        type: 'integer',
+        table: '@',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'state',
+    table: 'estado',
+    tableField: ['nome', 'id'],
+    resultField: ['state_name', 'state_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_uf_ies',
+        table: '@'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_uf_ies',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_municipio_ies',
+        table: '@'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio_ies',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'region',
+    table: 'regiao',
+    tableField: ['nome', 'id'],
+    resultField: ['region_name', 'region_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_regiao_ies',
+        foreignTable: 'docente_ens_superior'
+    }
+}).addValue({
+    name: 'university',
+    table: 'docente_ens_superior',
+    tableField: ['cod_ies', 'nome_ies'],
+    resultField: ['university_id', 'university_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_ies'
+    }
+}).addValue({
+    name: 'upper_adm_dependency',
+    table: 'docente_ens_superior',
+    tableField: 'par_categoria_administrativa',
+    resultField: 'upper_adm_dependency_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        table: 'docente_ens_superior',
+        field: 'par_categoria_administrativa'
+    }
+}).addValue({
+    name: 'academic_organization',
+    table: 'docente_ens_superior',
+    tableField: 'cod_organizacao_academica',
+    resultField: 'academic_organization_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        table: 'docente_ens_superior',
+        field: 'cod_organizacao_academica'
+    }
+}).addValue({
+    name:'academic_level',
+    table: 'docente_ens_superior',
+    tableField: 'cod_grau_academico',
+    resultField: 'academic_level_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_grau_academico'
+    }
+}).addValue({
+    name:'upper_education_mod',
+    table: 'docente_ens_superior',
+    tableField: 'cod_modalidade_ensino',
+    resultField: 'upper_education_mod_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_modalidade_ensino'
+    }
+}).addValue({
+    name:'teacher_situation',
+    table: 'docente_ens_superior',
+    tableField: 'par_situacao_docente',
+    resultField: 'teacher_situation_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_situacao_docente'
+    }
+}).addValue({
+    name:'work_regime',
+    table: 'docente_ens_superior',
+    tableField: 'cod_regime_trabalho',
+    resultField: 'work_regime_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_regime_trabalho'
+    }
+}).addValue({
+    name:'substitute',
+    table: 'docente_ens_superior',
+    tableField: 'docente_substituto',
+    resultField: 'substitute_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'docente_substituto'
+    }
+}).addValue({
+    name:'visitor',
+    table: 'docente_ens_superior',
+    tableField: 'docente_visitante',
+    resultField: 'visitor_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'docente_visitante'
+    }
+}).addValue({
+    name:'ead_teacher',
+    table: 'docente_ens_superior',
+    tableField: 'ministra_aula_ead',
+    resultField: 'ead_teacher_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'ministra_aula_ead'
+    }
+}).addValue({
+    name:'graduation_presential',
+    table: 'docente_ens_superior',
+    tableField: 'atua_atividade_graduacao_presencial',
+    resultField: 'graduation_presential_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'atua_atividade_graduacao_presencial'
+    }
+}).addValue({
+    name:'postgraduate_ead_teacher',
+    table: 'docente_ens_superior',
+    tableField: 'atua_atividade_posgraduacao_distancia',
+    resultField: 'postgraduate_ead_teacher_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'atua_atividade_posgraduacao_distancia'
+    }
+}).addValue({
+    name:'postgraduate_presential_teacher',
+    table: 'docente_ens_superior',
+    tableField: 'atua_atividade_posgraduacao_presencial',
+    resultField: 'postgraduate_presential_teacher_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'atua_atividade_posgraduacao_presencial'
+    }
+}).addValue({
+    name:'teacher_schooling',
+    table: 'docente_ens_superior',
+    tableField: 'cod_escolaridade_docente',
+    resultField: 'teacher_schooling_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_escolaridade_docente'
+    }
+}).addValue({
+    name:'ethnic_group_teacher_ies',
+    table: 'docente_ens_superior',
+    tableField: 'cod_cor_raca_docente',
+    resultField: 'ethnic_group_teacher_ies_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_cor_raca_docente'
+    }
+}).addValue({
+    name:'gender_ies',
+    table: 'docente_ens_superior',
+    tableField: 'sexo_docente',
+    resultField: 'gender_ies_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'sexo_docente'
+    }
+}).addValue({
+    name:'deficiency',
+    table: 'docente_ens_superior',
+    tableField: 'par_docente_deficiencia',
+    resultField: 'deficiency_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_docente_deficiencia'
+    }
+});
+
+teacherEnrollmentApp.get('/', rqf.parse(), (req, res, next) => {
+
+    if ("university" in req.dims) {
+        req.sql.field('COUNT(*)', 'total')
+        .field("'Brasil'", 'name')
+        .field('docente_ens_superior.ano_censo', 'year')
+        .from('docente_ens_superior')
+        .group('docente_ens_superior.cod_ies')
+        .group('docente_ens_superior.ano_censo')
+        .order('docente_ens_superior.cod_ies')
+        .order('docente_ens_superior.ano_censo')
+    }
+    else {
+        req.sql.field('COUNT(*)', 'total')
+        .field("'Brasil'", 'name')
+        .field('docente_ens_superior.ano_censo', 'year')
+        .from('docente_ens_superior')
+        .group('docente_ens_superior.ano_censo')
+        .order('docente_ens_superior.ano_censo')
+    }
+
+   next();
+},  rqf.build(), query, addMissing(rqf), id2str.transform(false), response('teacherEnrollment'));
+
+module.exports = teacherEnrollmentApp;