diff --git a/src/libs/middlewares/reqQueryFields.js b/src/libs/middlewares/reqQueryFields.js
index 27b0365b22feb27929dbca488c67e8895f33ae4b..741ae09a75511ff01a5aaae0c59b676ed467be07 100644
--- a/src/libs/middlewares/reqQueryFields.js
+++ b/src/libs/middlewares/reqQueryFields.js
@@ -27,6 +27,7 @@ class ReqQueryFields {
         //    fieldValues: {}
         // }
         if(typeof this.fields[field.name] === 'undefined') {
+            log.debug("added field "+field.name);
             this.fields[field.name] = field;
         }
         return this;
@@ -55,6 +56,21 @@ class ReqQueryFields {
 
         if(typeof this.fieldValues[fieldValue.name] === 'undefined') {
             this.fieldValues[fieldValue.name] = fieldValue;
+            log.debug("added value "+fieldValue.name);
+        }
+        return this;
+    }
+
+    addValueToField(fieldValue, field) {
+        if(typeof this.fields[field] === 'undefined') {
+            throw 'No field with name ' +field+ ' defined';
+        }
+        if(typeof this.fields[field].values === 'undefined') {
+            this.fields[field].values = {};
+        }
+        if(typeof this.fields[field].values[fieldValue.name] === 'undefined') {
+            this.fields[field].values[fieldValue.name] = fieldValue;
+            log.debug("added value "+fieldValue.name+ ' to field ' + field);
         }
         return this;
     }
@@ -66,8 +82,10 @@ class ReqQueryFields {
                 let f = this.fields[key];
                 log.debug('f');
                 log.debug(f);
-                Object.keys(this.fieldValues).map((k, i) => {
-                    let value = this.fieldValues[k];
+                // Unimos os valores aceitos globalmente com os aceitos apenas pelo parâmetro
+                let values = _.merge(this.fieldValues, f.values);
+                Object.keys(values).map((k, i) => {
+                    let value = values[k];
                     log.debug('value');
                     log.debug(value);
                     params.push(value.name);
@@ -119,9 +137,13 @@ class ReqQueryFields {
                 let field = this.fields[key];
                 log.debug(field);
                 let param = req[field.name];
+                log.debug('param');
                 log.debug(param);
                 Object.keys(param).map((k, i) => {
-                    let values = this.fieldValues;
+                    let values = _.merge(this.fieldValues, field.values);
+                    log.debug('ValueS');
+                    log.debug(values);
+                    log.debug('k');
                     log.debug(k);
                     if(typeof values[k] !== 'undefined') {
                         // Clonamos para não alterar
@@ -151,8 +173,11 @@ class ReqQueryFields {
                             // Valor sempre vem como string, necessário fazer parse para o banco
                             if(value.where.type === 'integer') whereValue = parseInt(whereValue, 10);
                             if(value.where.type === 'double') whereValue = parseFloat(whereValue);
+                            if(value.where.type === 'string') whereValue = '%'+whereValue+'%';
                             let tbl = value.where.table || value.table;
-                            req.sql.where(tbl+'.'+value.where.field+' '+value.where.relation+' ?', whereValue);
+                            let whereField = (value.where.type === 'string')? 'LOWER('+tbl+'.'+value.where.field+')' : tbl+'.'+value.where.field;
+                            let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? ';
+                            req.sql.where(whereField + ' ' + value.where.relation + lower, whereValue);
                         }
                     }
                 });
diff --git a/src/libs/routes/city.js b/src/libs/routes/city.js
index 41b22a660096e95b58611c7b4edcfe5e758db79d..3214f7f9d6caaafad8deb6b2d8d94b3525a10a6a 100644
--- a/src/libs/routes/city.js
+++ b/src/libs/routes/city.js
@@ -43,7 +43,20 @@ rqf.addField({
         foreign: 'fk_estado_id',
         foreignTable: 'municipio'
     }
-});
+}).addField({
+    name: 'search',
+    field: false,
+    where: true
+}).addValueToField({
+    name: 'name',
+    table: 'municipio',
+    tableField: 'nome',
+    where: {
+        relation: 'LIKE',
+        type: 'string',
+        field: 'nome'
+    }
+}, 'search');;
 
 // Return all cities
 cityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
@@ -51,4 +64,4 @@ cityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     next();
 }, query, response('city'));
 
-module.exports = cityApp;
\ No newline at end of file
+module.exports = cityApp;
diff --git a/src/libs/routes/region.js b/src/libs/routes/region.js
index be2eb9b044752c09e7e9d55e0deba41442a1a40e..c7f5ec05ec02d810f1c50187c6c33dd4489af278 100644
--- a/src/libs/routes/region.js
+++ b/src/libs/routes/region.js
@@ -28,7 +28,21 @@ rqf.addField({
         field: 'pk_regiao_id',
         table: 'regiao'
     }
-});
+}).addField({
+    name: 'search',
+    field: false,
+    where: true
+}).addValueToField({
+    name: 'name',
+    table: 'regiao',
+    tableField: 'nome',
+    where: {
+        relation: 'LIKE',
+        type: 'string',
+        field: 'nome',
+        table: 'regiao'
+    }
+}, 'search');
 
 regionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.sql.from('regiao');
diff --git a/src/libs/routes/state.js b/src/libs/routes/state.js
index 399be41416f9c458523ec0d24bde0254ef909a0c..0a706a38e7d3db2f233d72a53fa32fe4e9396646 100644
--- a/src/libs/routes/state.js
+++ b/src/libs/routes/state.js
@@ -43,7 +43,20 @@ rqf.addField({
         foreign: 'fk_regiao_id',
         foreignTable: 'estado'
     }
-});
+}).addField({
+    name: 'search',
+    field: false,
+    where: true
+}).addValueToField({
+    name: 'name',
+    table: 'estado',
+    tableField: 'nome',
+    where: {
+        relation: 'LIKE',
+        type: 'string',
+        field: 'nome'
+    }
+}, 'search');
 
 stateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.sql.from('estado')
diff --git a/src/test/city.js b/src/test/city.js
index 761bcb0eeb21e55cd73d4aaac4dbd2db87c6cb90..ff8612fd9f27412d92a4e4626b7c777fb416efa1 100644
--- a/src/test/city.js
+++ b/src/test/city.js
@@ -70,4 +70,18 @@ describe('request cities', () => {
                 done();
             })
     })
+
+    it('should search for Curitiba', (done) => {
+        chai.request(server)
+            .get('/api/v1/city?search=name:curitiba')
+            .end((err, res) => {
+                res.should.have.status(200);
+                res.should.be.json;
+                res.body.should.have.property('result');
+                res.body.result.should.be.a('array');
+                res.body.result[0].should.have.property('pk_cod_ibge');
+                res.body.result[0].should.have.property('nome');
+                done();
+            });
+    });
 });
diff --git a/src/test/region.js b/src/test/region.js
index 12cf3d09fa82ce3b2f030d26d4997cf820aa2932..13e8316d99fb4c7d7f59cb83ba0e0c4f232089ba 100644
--- a/src/test/region.js
+++ b/src/test/region.js
@@ -53,4 +53,19 @@ describe('request regions', () => {
                 done();
             });
     });
+
+    it('shoul search for south region', (done) => {
+        chai.request(server)
+            .get('/api/v1/region?search=name:sul')
+            .end((err, res) => {
+                res.should.have.status(200);
+                res.should.be.json;
+                res.body.should.have.property('result');
+                res.body.result.should.be.a('array');
+                res.body.result.should.have.length(1);
+                res.body.result[0].should.have.property('pk_regiao_id');
+                res.body.result[0].should.have.property('nome');
+                done();
+            });
+    });
 });
diff --git a/src/test/state.js b/src/test/state.js
index d3794f98df89b6a2f410c93107daa7033b019792..c1b08f92c240163cd0cb84910256f9f1e8bee4a2 100644
--- a/src/test/state.js
+++ b/src/test/state.js
@@ -71,4 +71,20 @@ describe('request states', () => {
                 done();
             });
     });
+
+    it('should search for Paraná', (done) => {
+        chai.request(server)
+            .get('/api/v1/state?search=name:paran')
+            .end((err, res) => {
+                res.should.have.status(200);
+                res.should.be.json;
+                res.body.should.have.property('result');
+                res.body.result.should.be.a('array');
+                res.body.result.should.have.length(1);
+                res.body.result[0].should.have.property('pk_estado_id');
+                res.body.result[0].should.have.property('fk_regiao_id');
+                res.body.result[0].should.have.property('nome');
+                done();
+            });
+    });
 });