diff --git a/modules/route/back/methods/vehicle/filter.js b/modules/route/back/methods/vehicle/filter.js
index a6cec02940..bc2186e3a6 100644
--- a/modules/route/back/methods/vehicle/filter.js
+++ b/modules/route/back/methods/vehicle/filter.js
@@ -1,5 +1,8 @@
+const {ParameterizedSQL} = require('loopback-connector');
+const {buildFilter, mergeFilters} = require('vn-loopback/util/filter');
+
 module.exports = Self => {
-    Self.remoteMethod('filter', {
+    Self.remoteMethodCtx('filter', {
         description: 'Find all instances of the model matched by filter from the data source.',
         accessType: 'READ',
         accepts: [{
@@ -42,6 +45,9 @@ module.exports = Self => {
         }, {
             arg: 'isKmTruckRate',
             type: 'boolean'
+        }, {
+            arg: 'vehicleStateFk',
+            type: 'number'
         }],
         returns: {
             type: ['object'],
@@ -53,66 +59,79 @@ module.exports = Self => {
         }
     });
 
-    Self.filter = async(filter, search, id, description, companyFk, tradeMark, numberPlate, warehouseFk, chassis, leasing, countryCodeFk, isKmTruckRate, options) => {
+    Self.filter = async(ctx, filter, options) => {
+        const conn = Self.dataSource.connector;
         const myOptions = {};
-        const myWhere = {};
-        const {limit, order, skip, where} = filter;
 
         if (typeof options == 'object') Object.assign(myOptions, options);
 
-        if (search) myWhere.or = [{id: search}, {numberPlate: {like: `%${search}%`}}];
-        if (id) myWhere.id = id;
-        if (description) myWhere.description = {like: `%${description}%`};
-        if (companyFk) myWhere.companyFk = companyFk;
-        if (tradeMark) myWhere.tradeMark = {like: `%${tradeMark}%`};
-        if (numberPlate) myWhere.numberPlate = {like: `%${numberPlate}%`};
-        if (warehouseFk) myWhere.warehouseFk = warehouseFk;
-        if (chassis) myWhere.chassis = {like: `%${chassis}%`};
-        if (leasing) myWhere.leasing = {like: `%${leasing}%`};
-        if (countryCodeFk) myWhere.countryCodeFk = countryCodeFk;
-        if (isKmTruckRate) myWhere.isKmTruckRate = isKmTruckRate;
-
-        Object.assign(where || {}, myWhere);
-
-        const myFilter = {
-            fields: ['id', 'numberPlate', 'tradeMark', 'model', 'm3', 'description', 'isActive', 'warehouseFk', 'companyFk', 'countryCodeFk', 'chassis', 'leasing', 'isKmTruckRate'],
-            include: [
-                {
-                    relation: 'warehouse',
-                    scope: {
-                        fields: ['id', 'name']
-                    }
-                },
-                {
-                    relation: 'company',
-                    scope: {
-                        fields: ['id', 'code']
-                    }
-                },
-                {
-                    relation: 'event',
-                    scope: {
-                        fields: ['vehicleFk', 'vehicleStateFk'],
-                        include: {
-                            relation: 'state',
-                            scope: {
-                                fields: ['id', 'state']
-                            }
-                        },
-                        order: ['started DESC'],
-                        limit: 1
-                    }
-                },
-            ],
-            where: myWhere,
-            order,
-            limit,
-            skip,
-        };
-
-        return Self.find(myFilter, myOptions).map(v => {
-            v.__data.event = v.event()[0];
-            return v;
+        const where = buildFilter(ctx.args, (param, value) => {
+            switch (param) {
+            case 'search':
+                return {or: [{'v.id': value}, {numberPlate: {like: `%${value}%`}}]};
+            case 'id':
+                return {id: value};
+            case 'description':
+                return {description: {like: `%${value}%`}};
+            case 'companyFk':
+                return {companyFk: value};
+            case 'tradeMark':
+                return {tradeMark: {like: `%${value}%`}};
+            case 'numberPlate':
+                return {numberPlate: {like: `%${value}%`}};
+            case 'warehouseFk':
+                return {warehouseFk: value};
+            case 'chassis':
+                return {chassis: {like: `%${value}%`}};
+            case 'leasing':
+                return {leasing: {like: `%${value}%`}};
+            case 'countryCodeFk':
+                return {countryCodeFk: value};
+            case 'isKmTruckRate':
+                return {isKmTruckRate: value};
+            case 'vehicleStateFk':
+                return {vehicleStateFk: value};
+            }
         });
+
+        const myFilter = mergeFilters(filter, {where});
+
+        const stmt = new ParameterizedSQL(`
+            SELECT v.id,
+                    v.numberPlate,
+                    v.tradeMark,
+                    v.model,
+                    v.m3,
+                    v.description,
+                    v.isActive,
+                    v.countryCodeFk,
+                    v.chassis,
+                    v.leasing,
+                    v.isKmTruckRate,
+                    w.name as warehouse,
+                    c.code as company,
+                    sub.state
+                FROM vehicle v
+                    LEFT JOIN warehouse w ON w.id = v.warehouseFk
+                    LEFT JOIN company c ON c.id = v.companyFk
+                    LEFT JOIN (
+                        SELECT e.vehicleFk,
+                                e.vehicleStateFk,
+                                s.state,
+                                ROW_NUMBER() OVER (PARTITION BY e.vehicleFk ORDER BY e.started DESC) as rn
+                        FROM vehicleEvent e
+                            LEFT JOIN vehicleState s ON e.vehicleStateFk = s.id
+                    ) sub ON sub.vehicleFk = v.id AND sub.rn = 1
+                `
+        );
+
+        const sqlWhere = conn.makeWhere(myFilter.where);
+        stmt.merge(sqlWhere);
+        stmt.merge(conn.makePagination(myFilter));
+
+        const sql = ParameterizedSQL.join([stmt], ';');
+        const result = await conn.executeStmt(sql, myOptions);
+
+        return result;
     };
 };
diff --git a/modules/route/back/models/vehicle.json b/modules/route/back/models/vehicle.json
index dbf78f7d12..9269cdebbc 100644
--- a/modules/route/back/models/vehicle.json
+++ b/modules/route/back/models/vehicle.json
@@ -50,6 +50,9 @@
         },
         "vin": {
             "type": "string"
+        },
+        "ppeFk": {
+            "type": "number"
         }
     },
     "relations": {