diff --git a/src/libs/app.js b/src/libs/app.js
index 97c2683afc278eaa23034809338dae644a12a115..662b3e9d21e8c328bf6efef8e700ee00c16f8765 100644
--- a/src/libs/app.js
+++ b/src/libs/app.js
@@ -32,6 +32,13 @@ app.use(methodOverride());
 // Middleware tha adds the squel object to req
 app.use((req, res, next) => {
     req.sql = squel.select();
+    // HACK to know wich table we are using
+    req.sql.oldFrom = req.sql.from;
+    req.sql.from = (name, alias = null) => {
+        req.sql.oldFrom(name, alias || null);
+        req.sql.tableFrom = name;
+        return req.sql;
+    };
     next();
 });
 app.use((req, res, next) => {
@@ -52,6 +59,7 @@ app.use((req, res, next) => {
 app.use((err, req, res, next) => {
     res.status(err.status || 500);
     log.error('%s %d %s', req.method, res.statusCode, err.message);
+    log.error(err);
     res.json({ error: err.message }).end();
 });
 
diff --git a/src/libs/middlewares/reqQueryFields.js b/src/libs/middlewares/reqQueryFields.js
index 8dcf018b0cd7285312dca6e2f257aa8b03375f5b..664d166eaa83b48c1d8f6ff8ba1e2f86b8e60afd 100644
--- a/src/libs/middlewares/reqQueryFields.js
+++ b/src/libs/middlewares/reqQueryFields.js
@@ -200,6 +200,7 @@ class ReqQueryFields {
         return (req, res, next) => {
             // Foreach no campos
             let hasJoined = {};
+            let thisTable = req.sql.tableFrom;
             Object.keys(this.fields).forEach((key) => {
                 // Campo
                 let field = this.fields[key];
@@ -217,6 +218,7 @@ class ReqQueryFields {
                         if(!hasJoined[value.table] && typeof value.join !== 'undefined') {
                             let foreignTable = '';
                             if(value.join.foreignTable) foreignTable = value.join.foreignTable+'.';
+                            if(value.join.foreignTable === '@') foreignTable = thisTable+'.';
                             // Fazemos o join
                             let onClause = '';
                             if(Array.isArray(value.join.primary)) {
@@ -237,15 +239,18 @@ class ReqQueryFields {
                         // Se o valor é um campo a ser incluído no SELECT
                         if(typeof field.field !== 'undefined' && field.field) {
                             log.debug('SELECT');
+                            let table = value.table;
+                            if(table === '@') table = thisTable;
                             if (Array.isArray(value.resultField)) {
                                 value.tableField.forEach((f, i) => {
-                                    req.sql.field(value.table+'.'+f, value.resultField[i] || f)
-                                        .group(value.table+'.'+f);
+                                    req.sql.field(table+'.'+f, value.resultField[i] || f)
+                                        .group(table+'.'+f)
+                                        .order(table+'.'+f);
                                 })
                             }else{
-                                req.sql.field(value.table+'.'+value.tableField, value.resultField || value.tableField)
-                                    .order(value.table+'.'+value.tableField)
-                                    .group(value.table+'.'+value.tableField);
+                                req.sql.field(table+'.'+value.tableField, value.resultField || value.tableField)
+                                    .order(table+'.'+value.tableField)
+                                    .group(table+'.'+value.tableField);
                             }
                         }
                         // Se o valor é um campo para ser usado no WHERE
@@ -259,6 +264,7 @@ class ReqQueryFields {
                             log.debug(`Where value é array? ${Array.isArray(whereValue)}`);
 
                             let tbl = value.where.table || value.table;
+                            if (tbl === '@') tbl = thisTable;
                             // multiple where, only tested for  boolean filds
                             if (Array.isArray(value.tableField)) {
                                 let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? ';
diff --git a/src/libs/routes/class.js b/src/libs/routes/class.js
index eabd957844c7be03439ec498c4312d8bee8f1e47..faef41ba559e2aaea438339a5bbac445e6c43e6b 100644
--- a/src/libs/routes/class.js
+++ b/src/libs/routes/class.js
@@ -110,7 +110,23 @@ rqfCount.addField({
     name: 'dims',
     field: true,
     where: false
-}).addValue({
+}).addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+        table: 'turma'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: 'turma'
+    }
+}, 'dims').addValueToField({
     name: 'city',
     table: 'municipio',
     tableField: 'nome',
@@ -126,7 +142,7 @@ rqfCount.addField({
         foreign: 'municipio_id',
         foreignTable: 'turma'
     }
-}).addValue({
+}, 'filter').addValue({
     name: 'state',
     table: 'estado',
     tableField: 'nome',
@@ -285,6 +301,6 @@ classApp.get('/', rqfCount.parse(), rqfCount.build(), (req, res, next) => {
    .order('turma.ano_censo')
    .where('turma.tipo_turma_id = 0 OR turma.tipo_turma_id = 1 OR turma.tipo_turma_id = 2 OR turma.tipo_turma_id = 3');
    next();
-}, query, id2str.transform(true), response('class'));
+}, query, id2str.transform(), response('class'));
 
 module.exports = classApp;
diff --git a/src/libs/routes/classroom.js b/src/libs/routes/classroom.js
index 7140bba1b34a03138bbac1fccdf73f07c721ebe6..58599f19a8e94761d76a2de3e1f21d56456a17de 100644
--- a/src/libs/routes/classroom.js
+++ b/src/libs/routes/classroom.js
@@ -67,7 +67,23 @@ rqf.addField({
         type: 'integer',
         field: 'id'
     }
-}).addValue({
+}).addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+        table: 'escola'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: 'escola'
+    }
+}, 'dims').addValueToField({
     name: 'city',
     table: 'municipio',
     tableField: 'nome',
@@ -83,7 +99,7 @@ rqf.addField({
         foreign: 'municipio_id',
         foreignTable: 'escola'
     }
-}).addValue({
+}, 'filter').addValue({
     name: 'state',
     table: 'estado',
     tableField: 'nome',
@@ -176,6 +192,6 @@ classroomApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         .order('escola.ano_censo')
         .where('escola.situacao_de_funcionamento = 1 AND escola.local_func_predio_escolar = 1');
     next();
-}, query, id2str.transform(true), response('classroom'));
+}, query, id2str.transform(), response('classroom'));
 
 module.exports = classroomApp;
diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js
index b6117dc4ca851bcc0e10cdfd19f96e94f2dc9857..f08db0fb8efea1881370bfa903c9e4977243c3f9 100644
--- a/src/libs/routes/enrollment.js
+++ b/src/libs/routes/enrollment.js
@@ -233,7 +233,22 @@ rqf.addField({
         foreign: 'estado_id',
         foreignTable: 'matricula'
     }
-}).addValue({
+}).addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: 'matricula'
+    }
+}, 'dims').addValueToField({
     name: 'city',
     table: 'municipio',
     tableField: 'nome',
@@ -248,7 +263,22 @@ rqf.addField({
         foreign: 'municipio_id',
         foreignTable: 'matricula'
     }
-}).addValue({
+}, 'filter').addValueToField({
+    name: 'school',
+    table: 'escola',
+    tableField: ['nome_escola', 'id'],
+    resultField: ['school_name', 'school_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: ['id', 'ano_censo'],
+        foreign: ['escola_id', 'ano_censo'],
+        foreignTable: 'matricula'
+    }
+}, 'dims').addValueToField({
     name: 'school',
     table: 'escola',
     tableField: 'nome_escola',
@@ -263,7 +293,7 @@ rqf.addField({
         foreign: ['escola_id', 'ano_censo'],
         foreignTable: 'matricula'
     }
-}).addValue({
+}, 'filter').addValue({
     name: 'location',
     table: 'matricula',
     tableField: 'localizacao_id',
@@ -355,7 +385,7 @@ enrollmentApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     .order('matricula.ano_censo')
     .where('matricula.tipo<=3');
     next();
-}, query, id2str.transform(true), response('enrollment'));
+}, query, id2str.transform(false), response('enrollment'));
 
 let simRqf = new ReqQueryFields();
 
diff --git a/src/libs/routes/region.js b/src/libs/routes/region.js
index a752fa1b6169522d1f2f0983f3c4b7d94748f551..6e7654166f6910ddc1bc9039d2e6a620e96e4d13 100644
--- a/src/libs/routes/region.js
+++ b/src/libs/routes/region.js
@@ -20,13 +20,13 @@ rqf.addField({
     where: true
 }).addValue({
     name: 'id',
-    table: 'regiao',
+    table: '@',
     tableField: 'id',
     where: {
         relation: '=',
         type: 'integer',
         field: 'id',
-        table: 'regiao'
+        table: '@'
     }
 }).addField({
     name: 'search',
@@ -34,21 +34,22 @@ rqf.addField({
     where: true
 }).addValueToField({
     name: 'name',
-    table: 'regiao',
+    table: '@',
     tableField: 'nome',
     where: {
         relation: 'LIKE',
         type: 'string',
         field: 'nome',
-        table: 'regiao'
+        table: '@'
     }
 }, 'search');
 
-regionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
+regionApp.get('/', rqf.parse(), (req, res, next) => {
     req.sql.from('regiao')
         .field('id')
         .field('nome', 'name');
+    console.log(req.sql.toString());
     next();
-}, query, response('region'));
+}, rqf.build(), query, response('region'));
 
 module.exports = regionApp;
diff --git a/src/libs/routes/school.js b/src/libs/routes/school.js
index e88f6bd9d69dd7770233e86e759557a32b4bd126..5320c29fbb3810d6c0b8b71492bbfe64e25c208a 100644
--- a/src/libs/routes/school.js
+++ b/src/libs/routes/school.js
@@ -397,7 +397,23 @@ rqfCount.addField({
         type: 'integer',
         field: 'id'
     }
-}).addValue({
+}).addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+        table: 'escola'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: 'escola'
+    }
+}, 'dims').addValueToField({
     name: 'city',
     table: 'municipio',
     tableField: 'nome',
@@ -413,7 +429,7 @@ rqfCount.addField({
         foreign: 'municipio_id',
         foreignTable: 'escola'
     }
-}).addValue({
+}, 'filter').addValue({
     name: 'state',
     table: 'estado',
     tableField: 'nome',
@@ -859,6 +875,6 @@ schoolApp.get('/count', rqfCount.parse(), rqfCount.build(), (req, res, next) =>
         .order('escola.ano_censo')
         .where('escola.situacao_de_funcionamento = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)');
     next();
-}, query, id2str.transform(true), response('school'));
+}, query, id2str.transform(), response('school'));
 
 module.exports = schoolApp;
diff --git a/src/libs/routes/teacher.js b/src/libs/routes/teacher.js
index c99441600bf1677f8adce9d1fe2167b1d9de9fdc..19cae7848b5220171f687ba8d8c576725b7c807f 100644
--- a/src/libs/routes/teacher.js
+++ b/src/libs/routes/teacher.js
@@ -197,7 +197,22 @@ rqf.addField({
         foreign: 'escola_estado_id',
         foreignTable: 'docente'
     }
-}).addValue({
+}).addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'escola_municipio_id',
+        foreignTable: 'docente'
+    }
+}, 'dims').addValueToField({
     name: 'city',
     table: 'municipio',
     tableField: 'nome',
@@ -212,7 +227,7 @@ rqf.addField({
         foreign: 'escola_municipio_id',
         foreignTable: 'docente'
     }
-}).addValue({
+}, 'filter').addValue({
     name: 'school',
     table: 'escola',
     tableField: 'nome_escola',
@@ -299,6 +314,6 @@ teacherApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
    .order('docente.ano_censo')
    .where('(docente.tipo_docente = 1 OR docente.tipo_docente = 5) AND (turma.tipo_turma_id <= 3)');
    next();
-}, query, id2str.transform(true), response('teacher'));
+}, query, id2str.transform(), response('teacher'));
 
 module.exports = teacherApp;
diff --git a/src/test/class.js b/src/test/class.js
index c7619d604e9b053e882c7e5a917082c303383e3b..c6fd205a5c0c48fd72c6d49d1846fc1682269159 100644
--- a/src/test/class.js
+++ b/src/test/class.js
@@ -208,7 +208,6 @@ describe('request class', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('rural_location_name');
-                res.body.result[0].should.not.have.property('rural_location_id');
                 done();
             });
     });
@@ -222,7 +221,6 @@ describe('request class', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('education_level_short_name');
-                res.body.result[0].should.not.have.property('education_level_short_id');
                 done();
             });
     });
diff --git a/src/test/enrollment.js b/src/test/enrollment.js
index f48334d74325091bad08b602d5c1088db11297e2..55a47628f5b7a5655f9bbd5eeec8feba43a31425 100644
--- a/src/test/enrollment.js
+++ b/src/test/enrollment.js
@@ -303,7 +303,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('location_name');
-                res.body.result[0].should.not.have.property('location_id');
                 done();
             });
     });
@@ -317,7 +316,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('rural_location_name');
-                res.body.result[0].should.not.have.property('rural_location_id');
                 done();
             });
     });
@@ -331,7 +329,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('school_year_name');
-                res.body.result[0].should.not.have.property('school_year_id');
                 done();
             });
     });
@@ -345,7 +342,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('education_level_name');
-                res.body.result[0].should.not.have.property('education_level_id');
                 done();
             });
     });
@@ -359,7 +355,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('education_level_mod_name');
-                res.body.result[0].should.not.have.property('education_level_mod_id');
                 done();
             });
     });
@@ -373,7 +368,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('education_level_short_name');
-                res.body.result[0].should.not.have.property('education_level_short_id');
                 done();
             });
     });
@@ -387,7 +381,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('adm_dependency_name');
-                res.body.result[0].should.not.have.property('adm_dependency_id');
                 done();
             });
     });
@@ -401,7 +394,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('adm_dependency_detailed_name');
-                res.body.result[0].should.not.have.property('adm_dependency_detailed_id');
                 done();
             });
     });
@@ -415,7 +407,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('gender_name');
-                res.body.result[0].should.not.have.property('gender_id');
                 done();
             });
     });
@@ -429,7 +420,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('ethnic_group_name');
-                res.body.result[0].should.not.have.property('ethnic_group_id');
                 done();
             });
     });
@@ -443,7 +433,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('period_name');
-                res.body.result[0].should.not.have.property('period_id');
                 done();
             });
     });
@@ -457,7 +446,6 @@ describe('request enrollments', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('integral_time_name');
-                res.body.result[0].should.not.have.property('integral_time_id');
                 done();
             });
     });
diff --git a/src/test/schoolCount.js b/src/test/schoolCount.js
index 35d84e3b7b3346fd890062066c992df43bd4c7b6..59c100000b03263bab56c12fc895339a08d764f6 100644
--- a/src/test/schoolCount.js
+++ b/src/test/schoolCount.js
@@ -661,7 +661,6 @@ describe('request schools count', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('rural_location_name');
-                res.body.result[0].should.not.have.property('rural_location_id');
                 done();
             });
     });
diff --git a/src/test/teacher.js b/src/test/teacher.js
index a9624eca227c052cba818a5dad246989137f2f76..d32c93e9ad505484de1e3f943fd13d86d8514ba6 100644
--- a/src/test/teacher.js
+++ b/src/test/teacher.js
@@ -264,7 +264,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('location_name');
-                res.body.result[0].should.not.have.property('location_id');
                 done();
             });
     });
@@ -278,7 +277,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('rural_location_name');
-                res.body.result[0].should.not.have.property('rural_location_id');
                 done();
             });
     });
@@ -292,7 +290,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('education_level_mod_name');
-                res.body.result[0].should.not.have.property('education_level_mod_id');
                 done();
             });
     });
@@ -306,7 +303,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('education_level_short_name');
-                res.body.result[0].should.not.have.property('education_level_short_id');
                 done();
             });
     });
@@ -320,7 +316,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('education_type_name');
-                res.body.result[0].should.not.have.property('education_type_id');
                 done();
             });
     });
@@ -334,7 +329,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('adm_dependency_name');
-                res.body.result[0].should.not.have.property('adm_dependency_id');
                 done();
             });
     });
@@ -348,7 +342,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('adm_dependency_detailed_name');
-                res.body.result[0].should.not.have.property('adm_dependency_detailed_id');
                 done();
             });
     });
@@ -362,7 +355,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('gender_name');
-                res.body.result[0].should.not.have.property('gender_id');
                 done();
             });
     });
@@ -376,7 +368,6 @@ describe('request teachers', () => {
                 res.body.should.have.property('result');
                 res.body.result.should.be.a('array');
                 res.body.result[0].should.have.property('ethnic_group_name');
-                res.body.result[0].should.not.have.property('ethnic_group_id');
                 done();
             });
     });