diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d2eaa272b2fafe709304be3afb170da36b5789f
--- /dev/null
+++ b/src/libs/middlewares/id2str.js
@@ -0,0 +1,105 @@
+function gender(id) {
+    switch(id) {
+        case 1:
+        return 'Masculino';
+        case 2:
+        return 'Feminino';
+    }
+}
+
+function period(id) {
+    switch(id) {
+        case 1:
+        return 'Diurno';
+        case 2:
+        return 'Noturno';
+        case 3:
+        return 'Integral';
+        default:
+        return 'Indefinido';
+    }
+}
+
+function schoolYear(id) {
+    switch(id) {
+        case 11:
+            return 'Creche - Menor de 1 ano';
+        case 12:
+            return 'Creche - 1 ano';
+        case 13:
+            return 'Creche - 2 anos';
+        case 14:
+            return 'Creche - 3 anos';
+        case 21:
+            return 'Pré-escola - 4 anos';
+        case 22:
+            return 'Pré-escola - 5 anos';
+        case 31:
+            return 'Ens. Fundamental - 1º Ano';
+        case 32:
+            return 'Ens. Fundamental - 1ª série/2º ano';
+        case 33:
+            return 'Ens. Fundamental - 2ª série/3º ano';
+        case 34:
+            return 'Ens. Fundamental - 3ª série/4º ano';
+        case 35:
+            return 'Ens. Fundamental - 4ª série/5º Ano';
+        case 41:
+            return 'Ens. Fundamental - 5ª série/6º ano';
+        case 42:
+            return 'Ens. Fundamental - 6ª série/7º ano';
+        case 43:
+            return 'Ens. Fundamental - 7ª série/8º ano';
+        case 44:
+            return 'Ens. Fundamental - 8ª serie/9º ano';
+        case 51:
+            return 'Ens. Médio - 1ª série'; // equivalent to 'EM 1 Série'
+        case 52:
+            return 'Ens. Médio - 2ª série'; // equivalent to 'EM 2 Série'
+        case 53:
+            return 'Ens. Médio - 3ª série'; // equivalent to 'EM 3 Série'
+        case 54:
+            return 'Ens. Médio - 4ª série'; // equivalent to 'EM 4 Série'
+        case 61:
+            return 'EJA - anos iniciais do Ens. Fundamental';
+        case 62:
+            return 'EJA - anos finais do Ens. Fundamental';
+        case 63:
+            return 'EJA - Ensino Médio';
+        case 64:
+            return 'EJA semi-presencial';
+        case 71:
+            return 'Educação Profissional';
+        default:
+            return 'Não classificado';
+    }
+}
+
+const ids = {
+    gender_id: gender,
+    period_id: period,
+    school_year_id: schoolYear
+};
+
+function transform(removeId=false) {
+    return (req, res, next) => {
+        // Para cada objeto do resultado
+        req.result.forEach((obj) => {
+            Object.keys(obj).forEach((key) => {
+                // Se não há uma função especificada, retorna
+                if(typeof ids[key] === 'undefined') return;
+                let id = obj[key];
+                obj[key.replace('_id', '_name')] = ids[key](id);
+                if(removeId) delete obj[key];
+            });
+        });
+        next();
+    };
+}
+
+module.exports = {
+    transform,
+    gender,
+    period,
+    schoolYear
+};
diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js
index 317c6b6f7e590ea80a4b078e3a9a1a2d39c1edb6..e27a03aacd3c18205d6ecb628d681691bfaea2f3 100644
--- a/src/libs/routes/enrollment.js
+++ b/src/libs/routes/enrollment.js
@@ -14,6 +14,8 @@ const response = require(`${libs}/middlewares/response`);
 
 const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
 
+const id2str = require(`${libs}/middlewares/id2str`);
+
 let rqf = new ReqQueryFields();
 
 // Complete range of the enrollments dataset.
@@ -281,121 +283,7 @@ enrollmentApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     .order('matricula.ano_censo')
     .where('matricula.tipo=0 OR matricula.tipo=1 OR matricula.tipo=2 OR matricula.tipo=3');
     next();
-}, query, (req, res, next) => {
-    // ids to strings
-    req.result.forEach((result) => {
-        if(typeof result.gender_id !== 'undefined') {
-            switch (result.gender_id) {
-                case 1:
-                result.gender_name = 'Masculino';
-                break;
-                case 2:
-                result.gender_name = 'Feminino';
-                break;
-            }
-            delete result.gender_id;
-        }
-        if(typeof result.period_id !== 'undefined') {
-            switch (result.period_id) {
-                case 1:
-                result.period_name = 'Diurno';
-                break;
-                case 2:
-                result.period_name = 'Noturno';
-                break;
-                case 3:
-                result.period_name = 'Integral';
-                break;
-                default:
-                result.period_name = 'Indefinido';
-                break;
-            }
-            delete result.period_id;
-        }
-    });
-    next();
-}, response('enrollment'));
-
-function schoolYearIdToStr(schoolYearId) {
-    let schoolYearStr;
-    switch(schoolYearId) {
-        case 11:
-        schoolYearStr = 'Creche - Menor de 1 ano';
-        break;
-        case 12:
-        schoolYearStr = 'Creche - 1 ano';
-        break;
-        case 13:
-        schoolYearStr = 'Creche - 2 anos';
-        break;
-        case 14:
-        schoolYearStr = 'Creche - 3 anos';
-        break;
-        case 21:
-        schoolYearStr = 'Pré-escola - 4 anos';
-        break;
-        case 22:
-        schoolYearStr = 'Pré-escola - 5 anos';
-        break;
-        case 31:
-        schoolYearStr = 'Ens. Fundamental - 1º Ano';
-        break;
-        case 32:
-        schoolYearStr = 'Ens. Fundamental - 1ª série/2º ano';
-        break;
-        case 33:
-        schoolYearStr = 'Ens. Fundamental - 2ª série/3º ano';
-        break;
-        case 34:
-        schoolYearStr = 'Ens. Fundamental - 3ª série/4º ano';
-        break;
-        case 35:
-        schoolYearStr = 'Ens. Fundamental - 4ª série/5º Ano';
-        break;
-        case 41:
-        schoolYearStr = 'Ens. Fundamental - 5ª série/6º ano';
-        break;
-        case 42:
-        schoolYearStr = 'Ens. Fundamental - 6ª série/7º ano';
-        break;
-        case 43:
-        schoolYearStr = 'Ens. Fundamental - 7ª série/8º ano';
-        break;
-        case 44:
-        schoolYearStr = 'Ens. Fundamental - 8ª serie/9º ano';
-        break;
-        case 51:
-        schoolYearStr = 'Ens. Médio - 1ª série'; // equivalent to 'EM 1 Série'
-        break;
-        case 52:
-        schoolYearStr = 'Ens. Médio - 2ª série'; // equivalent to 'EM 2 Série'
-        break;
-        case 53:
-        schoolYearStr = 'Ens. Médio - 3ª série'; // equivalent to 'EM 3 Série'
-        break;
-        case 54:
-        schoolYearStr = 'Ens. Médio - 4ª série'; // equivalent to 'EM 4 Série'
-        break;
-        case 61:
-        schoolYearStr = 'EJA - anos iniciais do Ens. Fundamental';
-        break;
-        case 62:
-        schoolYearStr = 'EJA - anos finais do Ens. Fundamental';
-        break;
-        case 63:
-        schoolYearStr = 'EJA - Ensino Médio';
-        break;
-        case 64:
-        schoolYearStr = 'EJA semi-presencial';
-        break;
-        case 71:
-        schoolYearStr = 'Educação Profissional';
-        break;
-        default:
-        schoolYearStr = 'Não classificado';
-    }
-    return schoolYearStr;
-}
+}, query, id2str.transform(true), response('enrollment'));
 
 let simRqf = new ReqQueryFields();
 
@@ -433,7 +321,7 @@ enrollmentApp.get('/offer_projection', simRqf.parse(), simRqf.build(), (req, res
     .field('turma.turno', 'period_id')
     .field('etapa_ensino.desc_etapa', 'education_level_name')
     .field('etapa_ensino.id', 'education_level_id')
-    .field('matricula.serie_ano_id')
+    .field('matricula.serie_ano_id', 'school_year_id')
     .field('COUNT(matricula.id)', 'currentOffer')
     .from('matricula')
     .join('etapa_ensino', null, 'matricula.etapa_ensino_id=etapa_ensino.id')
@@ -448,7 +336,7 @@ enrollmentApp.get('/offer_projection', simRqf.parse(), simRqf.build(), (req, res
     .group('matricula.serie_ano_id');
 
     next();
-}, query, (req, res, next) => {
+}, query, id2str.transform(false), (req, res, next) => {
     let years = parseInt(req.filter.simulation_time, 10);
     if(isNaN(years)) years = 0;
     let offerYear = req.result[0].offerYear;
@@ -471,8 +359,8 @@ enrollmentApp.get('/offer_projection', simRqf.parse(), simRqf.build(), (req, res
         }
         temp[period][i.education_level_name].currentOffer += i.currentOffer;
         temp[period][i.education_level_name].grades.push({
-            id: i.serie_ano_id,
-            name: schoolYearIdToStr(i.serie_ano_id),
+            id: i.school_year_id,
+            name: i.school_year_name,
             currentOffer: i.currentOffer
         });
     });
diff --git a/src/libs/routes/spatial.js b/src/libs/routes/spatial.js
index 84587c536d4a10beb23305ab6003872882a7a35e..e56a1ab456f339107409e5a1e365b01f2a3e5f3c 100644
--- a/src/libs/routes/spatial.js
+++ b/src/libs/routes/spatial.js
@@ -14,6 +14,8 @@ const response = require(`${libs}/middlewares/response`);
 
 const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
 
+const id2str = require(`${libs}/middlewares/id2str`);
+
 const spatialApp = express();
 
 let rqf = new ReqQueryFields();
@@ -431,7 +433,7 @@ spatialApp.get('/educational/school_level', rqf.parse(), rqf.build(), (req, res,
 
         let school_levels = {};
         for(let i = 0; i < result.length; ++i) {
-            const school_year  = schoolYearIdToStr(result[i].school_year);
+            const school_year  = id2str.schoolYear(result[i].school_year);
             const school_level = result[i].school_level;
             const census_year = result[i].census_year;
             if (typeof school_levels[school_level] === 'undefined') {
diff --git a/src/test/id2str.js b/src/test/id2str.js
new file mode 100644
index 0000000000000000000000000000000000000000..abb4bc56fe5210feb97198d091ed4f62081730a2
--- /dev/null
+++ b/src/test/id2str.js
@@ -0,0 +1,76 @@
+process.env.NODE_ENV = 'test';
+
+const chai = require('chai');
+
+const dirtyChai = require('dirty-chai');
+
+chai.use(dirtyChai);
+
+const chaiXml = require('chai-xml');
+
+chai.use(chaiXml);
+
+const chaiHttp = require('chai-http');
+
+const assert = chai.assert;
+
+const expect = chai.expect;
+
+const should = chai.should(); // actually call the function
+
+const libs = `${process.cwd()}/libs`;
+
+const server = require(`${libs}/app`);
+
+const id2str = require(`${libs}/middlewares/id2str`);
+
+chai.use(chaiHttp);
+
+describe('id2str middleware', () => {
+    let req, res;
+    it('should return a function', (done) => {
+        expect(id2str.transform).to.be.a.Function;
+        done();
+    });
+
+    it('should transform a gender id', (done) => {
+        expect(id2str.gender(1)).to.deep.equal('Masculino');
+        done();
+    });
+
+    it('should transform a period id', (done) => {
+        expect(id2str.period(1)).to.deep.equal('Diurno');
+        done();
+    });
+
+    it('should transform a school year id', (done) => {
+        expect(id2str.schoolYear(11)).to.deep.equal('Creche - Menor de 1 ano');
+        done();
+    });
+
+    it('should transform a result', (done) => {
+        let req = {
+            result: [{gender_id: 2, period_id: 3, school_year_id: 11}]
+        };
+        id2str.transform(false)(req, {},  (error)=>{
+            if (error) { throw new Error('Expected not to receive an error'); }
+            req.should.have.property('result');
+            req.result.should.not.be.undefined;
+            req.result.should.be.deep.equal([{gender_id: 2, period_id: 3, school_year_id: 11, gender_name: 'Feminino', period_name: 'Integral', school_year_name: 'Creche - Menor de 1 ano'}]);
+            done();
+        });
+    });
+
+    it('should transform a result and delete the ids', (done) => {
+        let req = {
+            result: [{gender_id: 2, period_id: 3, school_year_id: 11}]
+        };
+        id2str.transform(true)(req, {},  (error)=>{
+            if (error) { throw new Error('Expected not to receive an error'); }
+            req.should.have.property('result');
+            req.result.should.not.be.undefined;
+            req.result.should.be.deep.equal([{gender_name: 'Feminino', period_name: 'Integral', school_year_name: 'Creche - Menor de 1 ano'}]);
+            done();
+        });
+    });
+});