diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..85266ff985a71c7c1d0a0933785b77be4d3d3c3d
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,11 @@
+services:
+  simcaq-node:
+    container_name: simcaq-node
+    build: .
+    ports:
+      - '3000:3000'
+    develop:
+      watch:
+        - action: sync
+          path: .
+          target: /API
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100644
index 0000000000000000000000000000000000000000..04db51922c7afe6455aa25ef452e79ead0cd5751
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+echo "Starting simcaq-node"
+gulp watch &> /dev/null &
+cd build
+NODE_ENV=production gulp run
diff --git a/gulpfile.template.js b/gulpfile.template.js
new file mode 100644
index 0000000000000000000000000000000000000000..3de679df0c18e307b692cb22a3cb6446c052fcaf
--- /dev/null
+++ b/gulpfile.template.js
@@ -0,0 +1,20 @@
+const gulp = require('gulp');
+
+const nodemon = require('gulp-nodemon');
+
+gulp.task('run', () => {
+    // process.chdir('build');
+    nodemon({
+        script: 'server.js',
+        // tasks: ['watch'],
+        ignore: ["test/test.js", "gulpfile.babel.js"],
+        ext: 'js html json',
+        env: { 'NODE_ENV': process.env.NODE_ENV }
+    });
+});
+
+gulp.task('default', () => {
+    console.log("Não execuatar apenas gulp, execute da forma:");
+    console.log("\t\tgulp <task>");
+});
+
diff --git a/src/libs/convert/fullAgeRangeIES.js b/src/libs/convert/fullAgeRangeIES.js
new file mode 100644
index 0000000000000000000000000000000000000000..558c513c97bf8e0262e25eb13ccedb7be603c355
--- /dev/null
+++ b/src/libs/convert/fullAgeRangeIES.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 ageRangeIES(id) {
+    switch (id) {
+        case 1:
+        return 'até 29 anos';
+        case 2:
+        return 'de 30 a 34 anos';
+        case 3:
+        return 'de 35 a 39 anos';
+        case 4:
+        return 'de 40 a 44 anos';
+        case 5:
+        return 'de 45 a 49 anos';
+        case 6:
+        return 'de 50 a 54 anos';
+        case 7:
+        return 'de 55 a 59 anos';
+        case 8:
+        return 'de 60 anos ou mais';
+    }
+};
diff --git a/src/libs/middlewares/aggregateData.js b/src/libs/middlewares/aggregateData.js
index eed373ddbbfd98c4a30fc4615823bb5d91a01fc4..5f2e2de94ec247ed6418f048f5f32c8b050251c8 100644
--- a/src/libs/middlewares/aggregateData.js
+++ b/src/libs/middlewares/aggregateData.js
@@ -14,6 +14,7 @@ const convert = {
     region: 'regionCode',
     state: 'stateName',
     age_range: 'ageRangeAggregate',
+    age_range_ies: 'ageRangeIES',
     gender: 'gender',
     ethnic_group: 'ethnicGroup',
     education_level_mod_agg: 'educationLevelModAgg',
@@ -35,7 +36,9 @@ const convert = {
     contract_type_entity: 'contractType',
     total_doc: "totalDoc",
     education_degree_entity: "educationDegreeEntity",
-    government_agreement: "governmentAgreement"
+    government_agreement: "governmentAgreement",
+    work_regime: "workRegime",
+    teacher_schooling: "teacherSchooling",
 }
 
 function aggregateData(req, res, next) {
@@ -43,7 +46,8 @@ function aggregateData(req, res, next) {
         const newResult = []
         const aggregateFields = [
             'gender', 
-            'age_range', 
+            'age_range',
+            'age_range_ies',
             'ethnic_group', 
             'education_level_mod_agg',
             'education_level_mod_doc',
@@ -62,16 +66,19 @@ function aggregateData(req, res, next) {
             'age_range_entity',
             'post_graduation_entity',
             'contract_type_entity',
-            'education_degree_entity'
+            'education_degree_entity',
+            'work_regime',
+            'teacher_schooling' 
         ]
         let id;
         const fields = req.query.dims.split(',');
         let currentAggregateField;
         let currentNonAggregateField;
-    
+        
         // Verifica se o filtro passado está presente nos filtros agregados
         fields.forEach(field => {if (aggregateFields.includes(field)) currentAggregateField = field; else currentNonAggregateField = field});
         if (currentAggregateField) {
+            console.log(currentNonAggregateField)
             req.result.forEach((r) => {
                 // Alguns filtros começam com o id = 0 outros id = 1
                 id = ['ethnic_group', 'integral_time_agg'].includes(currentAggregateField) ? 0 : 1;
@@ -84,9 +91,13 @@ function aggregateData(req, res, next) {
                             [`${currentAggregateField}_id`]: id,
                             [`${currentAggregateField}_name`]: id2str[convert[currentAggregateField]](id)
                         }
-        
-                        if (currentNonAggregateField) {
+                        
+                        if(currentNonAggregateField == 'university'){
                             data[`${currentNonAggregateField}_id`] = r[`${currentNonAggregateField}_id`];
+                            data[`${currentNonAggregateField}_name`] = r[`${currentNonAggregateField}_name`];
+                        }
+                        else if (currentNonAggregateField) {
+                            data[`${currentNonAggregateField}_id`] = data[`${currentNonAggregateField}_id`];
                             data[`${currentNonAggregateField}_name`] = id2str[convert[currentNonAggregateField]](r[`${currentNonAggregateField}_id`]);
                         }
         
diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js
index f366d90a30c8d5c57955856040c78d610b3392b3..8f559421ccbf8288675f4675dbfcee3de0d21881 100644
--- a/src/libs/middlewares/id2str.js
+++ b/src/libs/middlewares/id2str.js
@@ -42,6 +42,7 @@ const stateName = require(`${libs}/convert/stateName`);
 const contractType = require(`${libs}/convert/contractType`);
 const ethnicGroupPnad = require(`${libs}/convert/ethnicGroupPnad`);
 const ageRange = require(`${libs}/convert/ageRange`);
+const ageRangeIES = require(`${libs}/convert/fullAgeRangeIES`);
 const ageRangeAll = require(`${libs}/convert/ageRangeAll`);
 const ageStudentCode = require(`${libs}/convert/ageStudentCode`);
 const fullAgeRange = require(`${libs}/convert/fullAgeRange`);
@@ -161,6 +162,7 @@ const ids = {
     contract_type_id: contractType,
     ethnic_group_pnad_id: ethnicGroupPnad,
     age_range_id: ageRange,
+    age_range_ies_id: ageRangeIES,
     age_range_all_id: ageRangeAll,
     age_range_aggregate_id: ageRangeAggregate,
     full_age_range_id: fullAgeRange,
@@ -309,6 +311,7 @@ module.exports = {
     contractType,
     ethnicGroupPnad,
     ageRange,
+    ageRangeIES,
     ageRangeAggregate,
     ageRangeAll,
     ageStudentCode,
diff --git a/src/libs/routes_v1/iesTeachers.js b/src/libs/routes_v1/iesTeachers.js
index b8eabacd5642d8fbfbfcb8b7a6992404ee24e878..7a644b7202ff64d241f6be15a035e5fd9a56fee0 100644
--- a/src/libs/routes_v1/iesTeachers.js
+++ b/src/libs/routes_v1/iesTeachers.js
@@ -32,6 +32,8 @@ const response = require(`${libs}/middlewares/response`);
 
 const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
 
+const aggregateData = require(`${libs}/middlewares/aggregateData`);
+
 const id2str = require(`${libs}/middlewares/id2str`);
 
 const config = require(`${libs}/config`); 
@@ -48,18 +50,16 @@ iesTeachers.get('/years', (req, res, next) => {
     next();
 }, query, response('years'));
 
-iesTeachers.get('/qtd_doc_ex_com_deficiencia', (req, res, next) => {
-    req.sql.from('docente_ies_agregado')
-    .field('sum(docente_ies_agregado.qtd_doc_ex_com_deficiencia)', 'total')
-    .field('docente_ies_agregado.ano_censo', 'year')
-    .field('docente_ies_agregado.nome_ies', 'university_name')
-    .field('docente_ies_agregado.cod_ies', 'university_id')
-    .group('docente_ies_agregado.cod_ies')
-    .group('docente_ies_agregado.nome_ies')
-    .group('docente_ies_agregado.ano_censo')
-    .order('docente_ies_agregado.ano_censo')
+iesTeachers.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();
-}, query, response('qt_doc_ex_com_deficiencia'));
+}, response('academic_organization'));
 
 rqf.addField({
     name: 'filter',
@@ -194,14 +194,14 @@ rqf.addField({
         field: 'qtd_doc_ex_indigena'
     }
 }).addValue({
-    name: 'qtd_doc_ex_com_deficiencia',
+    name: 'teacher_def',
     table: 'docente_ies_agregado',
     tableField: 'qtd_doc_ex_com_deficiencia',
     resultField: 'qtd_doc_ex_com_deficiencia',
     where: {
         relation: '=',
         type: 'integer',
-        field: 'qtd_doc_ex_com_deficiencia'
+        field: 'cod_ies'
     }
 }).addValue({
     name: 'qtd_doc_ex_0_29',
@@ -454,13 +454,14 @@ rqf.addField({
         field: 'qtd_doc_ex_est'
     }
 }).addValue({
-    name: 'tipo_org_acad',
+    name: 'academic_organization',
     table: 'docente_ies_agregado',
     tableField: 'tipo_org_acad',
-    resultField: 'tipo_org_acad',
+    resultField: 'academic_organization_id',
     where: {
         relation: '=',
         type: 'integer',
+        table: 'docente_ies_agregado',
         field: 'tipo_org_acad'
     }
 }).addValue({
@@ -516,17 +517,128 @@ rqf.addField({
 });
 
 iesTeachers.get('/', rqf.parse(), rqf.build(),  (req, res, next) => {
-    req.sql.from('docente_ies_agregado')
-    .field('sum(docente_ies_agregado.qtd_doc_exe)', 'total')
-    .field('docente_ies_agregado.ano_censo', 'year')
-    .field('docente_ies_agregado.cod_ies', 'university_id')
-    .field('docente_ies_agregado.nome_ies', 'university_name')
-    .group('docente_ies_agregado.ano_censo')
-    .group('docente_ies_agregado.cod_ies')
-    .group('docente_ies_agregado.nome_ies')
-    .order('docente_ies_agregado.ano_censo')
-    console.log(req.sql.toString())
+    if ("university" in req.dims) {
+        if (req.query.dims && req.query.dims.includes('teacher_def')) {
+            req.sql.from('docente_ies_agregado')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_com_deficiencia)', 'total')
+            .field('docente_ies_agregado.ano_censo', 'year')
+            .field('docente_ies_agregado.cod_ies', 'university_id')
+            .field('docente_ies_agregado.nome_ies', 'university_name')
+            .group('docente_ies_agregado.cod_ies')
+            .group('docente_ies_agregado.nome_ies')
+            .group('docente_ies_agregado.ano_censo')
+            .order('docente_ies_agregado.ano_censo')
+        }
+        else if (req.query.dims && req.query.dims.includes('gender'))
+        {
+            req.sql.from('docente_ies_agregado')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_masc)', 'total_masc')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_fem)', 'total_fem')
+            .field('docente_ies_agregado.ano_censo', 'year')
+            .field('docente_ies_agregado.cod_ies', 'university_id')
+            .field('docente_ies_agregado.nome_ies', 'university_name')
+            .group('docente_ies_agregado.ano_censo')
+            .group('docente_ies_agregado.cod_ies')
+            .group('docente_ies_agregado.nome_ies')
+            .order('docente_ies_agregado.ano_censo')
+        } else if(req.query.dims && req.query.dims.includes('age_range_ies'))
+        {
+            req.sql.from('docente_ies_agregado')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_0_29)', 'total_0_29')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_30_34)', 'total_30_34')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_35_39)', 'total_35_39')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_40_44)', 'total_40_44')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_45_49)', 'total_45_49')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_50_54)', 'total_50_54')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_55_59)', 'total_55_59')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_60_mais)', 'qtd_doc_ex_60_mais')
+            .field('docente_ies_agregado.ano_censo', 'year')
+            .field('docente_ies_agregado.cod_ies', 'university_id')
+            .field('docente_ies_agregado.nome_ies', 'university_name')
+            .group('docente_ies_agregado.ano_censo')
+            .group('docente_ies_agregado.cod_ies')
+            .group('docente_ies_agregado.nome_ies')
+            .order('docente_ies_agregado.ano_censo') 
+        } else if(req.query.dims && req.query.dims.includes('ethnic_group')){
+            req.sql.from('docente_ies_agregado')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_cor_nd)', 'total_nd')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_branca)', 'total_branca')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_preta)', 'total_preta')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_parda)', 'total_parda')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_amarela)', 'total_amarela')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_indigena)', 'total_indigena')
+            .field('docente_ies_agregado.ano_censo', 'year')
+            .field('docente_ies_agregado.cod_ies', 'university_id')
+            .field('docente_ies_agregado.nome_ies', 'university_name')
+            .group('docente_ies_agregado.ano_censo')
+            .group('docente_ies_agregado.cod_ies')
+            .group('docente_ies_agregado.nome_ies')
+            .order('docente_ies_agregado.ano_censo') 
+        }else if(req.query.dims && req.query.dims.includes('teacher_schooling')){
+            req.sql.from('docente_ies_agregado')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_sem_grad)', 'total_sem_grad')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_grad)', 'total_grad')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_esp)', 'total_esp')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_mest)', 'total_mest')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_dout)', 'total_dout')
+            .field('docente_ies_agregado.ano_censo', 'year')
+            .field('docente_ies_agregado.cod_ies', 'university_id')
+            .field('docente_ies_agregado.nome_ies', 'university_name')
+            .group('docente_ies_agregado.ano_censo')
+            .group('docente_ies_agregado.cod_ies')
+            .group('docente_ies_agregado.nome_ies')
+            .order('docente_ies_agregado.ano_censo') 
+        }else if(req.query.dims && req.query.dims.includes('academic_organization')){
+            req.sql.from('docente_ies_agregado')
+            .field('SUM(docente_ies_agregado.qtd_doc_exe)', 'total')
+            .field('docente_ies_agregado.tipo_org_acad', 'org_acad')
+            .field('docente_ies_agregado.ano_censo', 'year')
+            .field('docente_ies_agregado.cod_ies', 'university_id')
+            .field('docente_ies_agregado.nome_ies', 'university_name')
+            .group('docente_ies_agregado.ano_censo')
+            .group('docente_ies_agregado.cod_ies')
+            .group('docente_ies_agregado.nome_ies')
+            .group('docente_ies_agregado.tipo_org_acad')
+            .order('docente_ies_agregado.ano_censo') 
+        }else if(req.query.dims && req.query.dims.includes('work_regime')){
+            req.sql.from('docente_ies_agregado')
+            .field('SUM(docente_ies_agregado.qtd_doc_exe)', 'total')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_int)', 'total_tempo_integral')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_de)', 'total_de')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_int_sem_de)', 'total_tempo_integral_sem_de')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_parc)', 'total_tempo_parcial')
+            .field('SUM(docente_ies_agregado.qtd_doc_ex_hor)', 'total_horista')
+            .field('docente_ies_agregado.ano_censo', 'year')
+            .field('docente_ies_agregado.cod_ies', 'university_id')
+            .field('docente_ies_agregado.nome_ies', 'university_name')
+            .group('docente_ies_agregado.ano_censo')
+            .group('docente_ies_agregado.cod_ies')
+            .group('docente_ies_agregado.nome_ies')
+            .group('docente_ies_agregado.tipo_org_acad')
+            .order('docente_ies_agregado.ano_censo') 
+        }
+        else {
+            req.sql.from('docente_ies_agregado')
+            .field('sum(docente_ies_agregado.qtd_doc_exe)', 'total')
+            .field('docente_ies_agregado.ano_censo', 'year')
+            .field('docente_ies_agregado.cod_ies', 'university_id')
+            .field('docente_ies_agregado.nome_ies', 'university_name')
+            .group('docente_ies_agregado.ano_censo')
+            .group('docente_ies_agregado.cod_ies')
+            .group('docente_ies_agregado.nome_ies')
+            .order('docente_ies_agregado.ano_censo')
+            console.log(req.sql.toString())
+        }
+        next();
+    }
+    else {
+        res.status(400);
+        next({
+            status: 400,
+            message: 'Wrong/No filter specified'
+        });
+    }
     next();
-}, query, id2str.transform(false), response('docente_ies_agregado'));
+}, query, aggregateData, id2str.transform(false), response('teacher_ies'));
 
 module.exports = iesTeachers;