diff --git a/config.json.example b/config.json.example
deleted file mode 100644
index 1fa157c1e562f3843ef2f44bf60e1793fbf9c1e7..0000000000000000000000000000000000000000
--- a/config.json.example
+++ /dev/null
@@ -1,157 +0,0 @@
-{
-    "development":
-    {
-        "port": 3000,
-        "ip": "127.0.0.1",
-        "debug" : true,
-        "monetdb": {
-            "host": "simcaqdb3.c3sl.ufpr.br",
-            "port": 50000,
-            "dbname": "simcaq",
-            "user": "monetdb",
-            "password":"monetdb",
-            "nrConnections": "4"
-        },
-        "cdn" : {
-            "url": "http://simcaqdb3.c3sl.ufpr.br:3000",
-            "download": "https://simcaqdev.c3sl.ufpr.br/download/"
-        },
-        "mongodb" : {
-            "uri": "mongodb://localhost/dev_users"
-        },
-        "monq": {
-            "uri": "mongodb://localhost/dev_monq"
-        },
-        "default": {
-            "api": {
-                "version" : "v1"
-            },
-            "lde": {
-                "url": "http://ldedev.c3sl.ufpr.br/#"
-            },
-            "simcaq": {
-                "url": "http://simcaqdev.c3sl.ufpr.br/#"
-            }
-        },
-        "email": {
-            "host": "SMTP.office365.com",
-            "port": 587,
-            "secureConnection": false,
-            "auth": {
-                "user": "dadoseducacionais@ufpr.br",
-                "pass": "COLOCAR_A_SENHA_AQUI"
-            },
-            "tls": {
-                "ciphers": "SSLv3"
-            },
-            "from": "\"Laboratório de Dados Educacionais\" <dadoseducacionais@ufpr.br>"
-        },
-        "security": {
-            "tokenLife": 3600
-        }
-    },
-    "test":
-    {
-        "port": 3000,
-        "ip": "127.0.0.1",
-        "debug" : true,
-        "monetdb": {
-            "host": "simcaqdb3.c3sl.ufpr.br",
-            "port": 50000,
-            "dbname": "simcaq",
-            "user": "monetdb",
-            "password":"monetdb",
-            "nrConnections": "4"
-        },
-        "cdn" : {
-            "url": "http://simcaqdb3.c3sl.ufpr.br:3000",
-            "download": "https://simcaqdev.c3sl.ufpr.br/download/"
-        },
-        "mongodb" : {
-            "uri": "mongodb://localhost/test_users",
-            "secret": "SimCAQC3SL"
-        },
-        "monq": {
-            "uri": "mongodb://localhost/test_monq"
-        },
-        "default": {
-            "api": {
-                "version" : "v1"
-            },
-            "lde": {
-                "url": "http://ldedev.c3sl.ufpr.br/#"
-            },
-            "simcaq": {
-                "url": "http://simcaqdev.c3sl.ufpr.br/#"
-            }
-        },
-        "email": {
-            "host": "SMTP.office365.com",
-            "port": 587,
-            "secureConnection": false,
-            "auth": {
-                "user": "dadoseducacionais@ufpr.br",
-                "pass": "COLOCAR_A_SENHA_AQUI"
-            },
-            "tls": {
-                "ciphers": "SSLv3"
-            },
-            "from": "\"Laboratório de Dados Educacionais\" <dadoseducacionais@ufpr.br>"
-        },
-        "security": {
-            "tokenLife": 3600
-        }
-    },
-    "production":
-    {
-        "port": 3000,
-        "ip": "127.0.0.1",
-        "debug" : false,
-        "monetdb": {
-            "host": "simcaqdb3.c3sl.ufpr.br",
-            "port": 50000,
-            "dbname": "simcaq",
-            "user": "monetdb",
-            "password":"monetdb",
-            "nrConnections": "4"
-        },
-        "cdn" : {
-            "url": "http://simcaqdb3.c3sl.ufpr.br:7000",
-            "download": "https://simcaq.c3sl.ufpr.br/download/"
-        },
-        "mongodb" : {
-            "uri": "mongodb://localhost/users",
-            "secret": "SimCAQC3SL"
-        },
-        "monq": {
-            "uri": "mongodb://localhost/monq"
-        },
-        "default": {
-            "api": {
-                "version" : "v1"
-            },
-            "lde": {
-                "url": "http://lde.c3sl.ufpr.br/#"
-            },
-            "simcaq": {
-                "url": "http://simcaq.c3sl.ufpr.br/#"
-            }
-        },
-        "email": {
-            "host": "SMTP.office365.com",
-            "port": 587,
-            "secureConnection": false,
-            "auth": {
-                "user": "dadoseducacionais@ufpr.br",
-                "pass": "COLOCAR_A_SENHA_AQUI"
-            },
-            "tls": {
-                "ciphers": "SSLv3"
-            },
-            "from": "\"Laboratório de Dados Educacionais\" <dadoseducacionais@ufpr.br>"
-        },
-        "security": {
-            "tokenLife": 3600
-        }
-    }
-}
diff --git a/package.json b/package.json
index 7dfdb851bb284b14fde47cfb150526dd37da0626..ee49663181dfbe88f1567fc0f31877f519e1b57e 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
     "babel-core": "^6.26.3",
     "babel-preset-es2015": "^6.24.1",
     "babel-register": "^6.26.0",
+    "bcrypt": "^5.1.0",
     "bcrypt-nodejs": "0.0.3",
     "body-parser": "^1.18.3",
     "chai": "^3.5.0",
@@ -51,6 +52,7 @@
     "mocha": "^3.5.3",
     "monetdb-pool": "0.0.8",
     "mongoose": "^4.13.17",
+    "multer": "^1.4.5-lts.1",
     "natives": "^1.1.6",
     "nconf": "^0.8.5",
     "node-uuid": "^1.4.8",
@@ -60,7 +62,10 @@
     "passport": "^0.3.2",
     "passport-http-bearer": "^1.0.1",
     "passport-oauth2-client-password": "^0.1.2",
+    "pg": "^8.10.0",
     "request": "^2.88.0",
+    "sequelize": "^6.31.0",
+    "sequelize-cli": "^6.6.0",
     "sqlstring": "^2.3.1",
     "squel": "^5.12.2",
     "winston": "^2.4.4"
diff --git a/script_req.sh b/script_req.sh
new file mode 100755
index 0000000000000000000000000000000000000000..125204b86fb256e0608e25f161dccddb4cbc1ddc
--- /dev/null
+++ b/script_req.sh
@@ -0,0 +1,10 @@
+curl -X 'POST' \
+  'http://10.254.221.20:3000/api/v1//auth/token' \
+  -H 'accept: application/json' \
+  -H 'Content-Type: application/json' \
+  -d '{
+  "email": "eduardomsouza@ufpr.br",
+  "password": "teste123",
+  "client_secret": "LDE",
+  "grant_type": "password"
+}'
\ No newline at end of file
diff --git a/src/libs/api_mongo.txt b/src/libs/api_mongo.txt
new file mode 100644
index 0000000000000000000000000000000000000000..58f659659e0ed9d275a7375126a840823d782e20
--- /dev/null
+++ b/src/libs/api_mongo.txt
@@ -0,0 +1,6 @@
+*downloads.js
+*resetToken.js (V)
+*pqr.js
+*simulation.js
+*user.js (V)
+*verifyToken.js (V)
diff --git a/src/libs/app.js b/src/libs/app.js
index 9f1851050788f7494c1ef14ec530f255668bfcb0..bab5e52d57d27260c16c60719855c60f4be71255 100644
--- a/src/libs/app.js
+++ b/src/libs/app.js
@@ -19,10 +19,6 @@ const api_v2 = require('./routes_v2/api');
 
 const passport = require('passport');
 
-const mongoose = require(`${libs}/db/mongoose`);
-
-const db = mongoose();
-
 require(`${libs}/middlewares/passport`);
 
 app.use(bodyParser.json({limit: '50mb'}));
diff --git a/src/libs/db/mongoose.js b/src/libs/db/mongoose.js
deleted file mode 100644
index f9d2ed8ef59767e262f77fa21e2a93d444139145..0000000000000000000000000000000000000000
--- a/src/libs/db/mongoose.js
+++ /dev/null
@@ -1,21 +0,0 @@
-const libs = `${process.cwd()}/libs`;
-
-const config = require(`${libs}/config`);
-
-const log = require(`${libs}/log`)(module);
-
-const mongoose = require('mongoose');
-
-mongoose.Promise = global.Promise;
-
-module.exports = () => {
-    // Get mongodb URI (ip and port) in config file
-    const mongoUri = process.env.MONGO_URI || config.mongodb.uri;
-    log.info(`Connecting to MongoDB on URI ${mongoUri}`);
-    // Connection singleton
-    const db = mongoose.connect(mongoUri);
-
-    mongoose.connection.once('open', () => { log.info("MongoDB connected"); });
-
-    return db;
-};
diff --git a/src/libs/db/postgres.js b/src/libs/db/postgres.js
new file mode 100644
index 0000000000000000000000000000000000000000..c60d28c6932491dbee5ba88a5f86412d707cda23
--- /dev/null
+++ b/src/libs/db/postgres.js
@@ -0,0 +1,8 @@
+const Sequelize = require('sequelize');
+
+// if you are using postgres, your DB URL will look like this
+const DATABASE_URL = 'postgres://postgres:postgres@localhost:5432/postgres'
+
+const db = new Sequelize(DATABASE_URL)
+
+module.exports = db
\ No newline at end of file
diff --git a/src/libs/middlewares/authorize.js b/src/libs/middlewares/authorize.js
new file mode 100644
index 0000000000000000000000000000000000000000..592c193bedc33e136d23f95019cc0c0515ca7455
--- /dev/null
+++ b/src/libs/middlewares/authorize.js
@@ -0,0 +1,39 @@
+const express = require('express');
+
+const pubApp = express();
+
+const libs = `${process.cwd()}/libs`;
+
+const PermissionRole = require(`${libs}/models/permissionRole`)
+
+const mapPermission = {
+    'criar publicacao': '1',
+    'editar publicacao': '2',
+    'apagar publicacao': '3',
+    'criar atividade': '4',
+    'editar atividade': '5',
+    'apagar atividade': '6',
+}
+ 
+function authorized(permission) {
+  return async function (req, res, next) {
+    const permission_id = mapPermission[permission]
+    const userRole = req.user.role_id; // Assuming user role is stored in req.user.role
+    const hasPermission = await PermissionRole.findOne({where:{role_id:userRole, permission_id: permission_id}}).catch(function (err) {
+      if (err) {
+          log.error(err);
+          return next({ err });
+      }
+  });
+    if (hasPermission) {
+      // User has permission, proceed to next middleware or route handler
+      next();
+    } else {
+      // User does not have permission, return unauthorized response
+      res.status(403).json({ message: 'Unauthorized' });
+    }
+  };
+}
+
+module.exports = authorized
+
diff --git a/src/libs/middlewares/downloadDatabase.js b/src/libs/middlewares/downloadDatabase.js
index c4672ff0bf5d925d7d8d0466a260d3025fbc4e09..6f2dec6fb0271e43dce8580794b8c766c3ba9c9c 100644
--- a/src/libs/middlewares/downloadDatabase.js
+++ b/src/libs/middlewares/downloadDatabase.js
@@ -10,11 +10,11 @@ const config = require(`${libs}/config`);
 
 const Download = require(`${libs}/models/download`);
 
-module.exports = function download(table, mappingTable) {
+module.exports = function download(table, mapping_table) {
     return (req, res, next) => {
         // First, query the mapping
-        execute(`SELECT target_name, name FROM ${mappingTable}`, undefined, (err, result) => {
-            if(err) {
+        execute(`SELECT target_name, name FROM ${mapping_table}`, undefined, (err, result) => {
+            if (err) {
                 log.error(err.stack);
                 next(new Error('Request could not be satisfied due to a database error.'));
             } else {
@@ -23,7 +23,7 @@ module.exports = function download(table, mappingTable) {
                 result.forEach((field) => {
                     req.sql.field(`CASE ${table}.${field.name} WHEN true THEN 1 WHEN false THEN 0 ELSE ${table}.${field.name} END AS ${field.target_name}`);
                     // req.sql.field(table + '.' + field.name, field.target_name);
-                    if(header === '') header += field.target_name;
+                    if (header === '') header += field.target_name;
                     else header = header + ';' + field.target_name;
                 });
 
@@ -36,53 +36,51 @@ module.exports = function download(table, mappingTable) {
                     header
                 };
 
-                request.post(config.cdn.url + '/api/v1/file', {form}, (err, response, body) => {
-                    if(err) {
+                request.post(config.cdn.url + '/api/v1/file', { form }, async (err, response, body) => {
+                    if (err) {
                         log.error(err);
-                        return res.json({error: err});
+                        return res.json({ error: err });
                     }
 
-                    Download.findOne({query: req.sql.toString()}, (err, download) => {
-                        if(download) {
-                            download.updatedAt = Date.now();
-                            if(download.userId != req.user._id) {
-                                let dl = new Download({
-                                    userId: req.user._id,
-                                    table,
-                                    name: req.query.name,
-                                    mappingTable,
-                                    query: req.sql.toString(),
-                                    status: 'Enviando',
-                                    expired: false
-                                });
-                                console.log(dl);
-                                dl.save((err) => {
-                                    if(err) log.error(err);
-                                });
-                            }
-                        } else {
-                            download = new Download({
-                                userId: req.user._id,
+                    let download = await Download.findOne({ where: { query: req.sql.toString() } }).catch(function (err) {
+                        if (err) {
+                            log.error(err);
+                        }
+                    })
+                    if (download) {
+                        download.updated_at = new Date();
+                        if (download.user_id != req.user.id) {
+                            let dl = await Download.create({
+                                user_id: req.user.id,
                                 table,
                                 name: req.query.name,
-                                mappingTable,
-                                query: req.sql.toString(),
+                                mapping_table,
                                 query: req.sql.toString(),
                                 status: 'Enviando',
                                 expired: false
                             });
-                            console.log(download);
+                            console.log(dl);
+                            dl.save().catch(function (err) {
+                                if (err) log.error(err);
+                            });
                         }
-
-                        download.save((err) => {
-                            if(err) {
-                                log.error(err);
-                            }
-                            res.json({msg: 'Wait for download email', waitForIt: true});
+                    } else {
+                        download = await Download.create({
+                            user_id: req.user.id,
+                            table,
+                            name: req.query.name,
+                            mapping_table,
+                            query: req.sql.toString(),
+                            status: 'Enviando',
+                            expired: false
                         });
-                    });
+                        console.log(download);
+                    }
+
+                    await download.save()
+                    res.json({ msg: 'Wait for download email', waitForIt: true });
                 });
-            }
+            };
         });
     }
-};
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/libs/middlewares/multer.config.js b/src/libs/middlewares/multer.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..d4c7263fcb7c80451d81242186ce3c881a458b69
--- /dev/null
+++ b/src/libs/middlewares/multer.config.js
@@ -0,0 +1,6 @@
+const multer = require('multer');
+
+var storage = multer.memoryStorage()
+var upload = multer({storage: storage});
+
+module.exports = upload;
diff --git a/src/libs/middlewares/oauth2.js b/src/libs/middlewares/oauth2.js
index cc9a45ede4a3158bc055166202c6d20fb84a6dff..f5f4b658a4146276b5e06cd1849aa336f687043e 100644
--- a/src/libs/middlewares/oauth2.js
+++ b/src/libs/middlewares/oauth2.js
@@ -7,11 +7,15 @@ const libs = `${process.cwd()}/libs`;
 const config = require(`${libs}/config`);
 const log = require(`${libs}/log`)(module);
 
-const db = require(`${libs}/db/mongoose`);
 const User = require(`${libs}/models/user`);
 const AccessToken = require(`${libs}/models/accessToken`);
 const RefreshToken = require(`${libs}/models/refreshToken`);
 
+const origin_to_secret = {
+    'SimCAQ': 'FcmZp9bZpk8yxSJA',
+    'LDE': 'LDE'
+};
+
 // create OAuth 2.0 server
 let aserver = oauth2orize.createServer()
 
@@ -23,86 +27,73 @@ let errFn = (cb, err) => {
 }
 
 // Destroys any old tokens and generates a new access and refresh token
-let generateTokens = (data, done) => {
+let generateTokens = (userId, clientId,userRole, done) => {
     // curries in `done` callback so we don't need to pass it
-    let errorHandler = errFn.bind(undefined, done);
-    let refreshToken;
     let refreshTokenValue;
-    let token;
     let tokenValue;
+    let admin = false; 
 
-    RefreshToken.remove(data, errorHandler);
-    AccessToken.remove(data, errorHandler);
+    RefreshToken.destroy({where:{"user_id": userId, "client_id": clientId}});
+    AccessToken.destroy({where:{"user_id": userId, "client_id": clientId}});
 
     tokenValue = crypto.randomBytes(32).toString('hex');
     refreshTokenValue = crypto.randomBytes(32).toString('hex');
 
-    data.token = tokenValue;
-    token = new AccessToken(data);
-
-    data.token = refreshTokenValue;
-    refreshToken = new RefreshToken(data);
+    AccessToken.create({
+        user_id:userId, 
+        client_id:clientId,
+        token:tokenValue
+    })
 
-    refreshToken.save(errorHandler);
+    let refreshed_token = refreshTokenValue;
 
-    token.save((err) => {
-        if (err) {
-            log.error(err);
-            return done(err);
-        }
-        done(null, tokenValue, refreshTokenValue, {
-            'expires_in': config.security.tokenLife
-        });
+    RefreshToken.create({
+        user_id:userId, 
+        client_id:clientId,
+        token:refreshed_token
     })
-};
+    if(userRole == 1){
+        admin = true;
+    }
+    done(null, tokenValue, refreshTokenValue, {'admin': admin},{
+        'expires_in': config.security.tokenLife
+    });
 
-// Exchange username & password for access token.
-aserver.exchange(oauth2orize.exchange.password((client, username, password, scope, done) => {
-    User.findOne({ email: username }, (err, user) => {
-        if (err) {
-            return done(err);
-        }
+};
 
-        if (!user || !user.checkPassword(password)) {
-            return done(null, false);
-        }
 
-        var model = {
-            userId: user._id,
-            clientId: client._id
-        };
-        log.info(`Gerando token para usuário ${user.name}`);
-        generateTokens(model, done);
-    })
+// Exchange username & password for access token.
+aserver.exchange(oauth2orize.exchange.password(function(client, username, password, scope, done) {
+    User.findOne({ 
+      where: {email:username} 
+    }).then(function(user) {
+      if(user == null|| !user.checkPassword(user, password)){
+        return done(null, false);
+      }
+
+      if(origin_to_secret[user.dataValues.origin] != client.client_secret){
+        console.log("Erro de client_secret");
+        return done(null, false);
+      }
+      log.info(`Gerando token para usuário ${user.name}`);
+      generateTokens(user.dataValues.id, client.id, user.dataValues.role_id, done);
+    }).catch(function(error) {
+      return done(error);
+    });
+  }));
 
-}));
 
 // Exchange refreshToken for access token.
 aserver.exchange(oauth2orize.exchange.refreshToken((client, refreshToken, scope, done)  =>{
-    RefreshToken.findOne({ token: refreshToken, clientId: client._id }, (err, token) => {
-        if (err) {
-            return done(err);
-        }
-
+    RefreshToken.findOne({where: {token: refreshToken, client_id: client.id }}).then(function(token){
         if (!token) {
             return done(null, false);
         }
-
-        User.findById(token.userId, (err, user)  => {
-            if (err) { 
-                log.error(err);
-                return done(err);
-            }
+        User.findByPk(token.user_id).then(function(user){
             if (!user) { 
                 return done(null, false); 
             }
-
-            var model = {
-                userId: user._id,
-                clientId: client._id
-            };
-
-            generateTokens(model, done);
+            generateTokens(user.id, client.id, done);
         })
     })
 }))
@@ -114,8 +105,14 @@ aserver.exchange(oauth2orize.exchange.refreshToken((client, refreshToken, scope,
 // exchange middleware will be invoked to handle the request.  Clients must
 // authenticate when making requests to this endpoint.
 
+
+// ,function(err, user) {
+//     if (err) { console.log("Erro de autenticação"); }
+//     if (!user) { console.log("Erro de usuario ausente");}
+// }
+
 exports.token = [
     passport.authenticate(['oauth2-client-password'], { session: false }),
     aserver.token(),
     aserver.errorHandler()
-];
+];
\ No newline at end of file
diff --git a/src/libs/middlewares/passport.js b/src/libs/middlewares/passport.js
index ab895a9604072e3b77a6384ac0c0f9066dcf6753..7e8d5120f6ea9d258e98f76621d252218c84a3c7 100644
--- a/src/libs/middlewares/passport.js
+++ b/src/libs/middlewares/passport.js
@@ -8,60 +8,51 @@ const config = require(`${libs}/config`);
 const User = require(`${libs}/models/user`);
 const Client = require(`${libs}/models/client`);
 const AccessToken = require(`${libs}/models/accessToken`);
-const RefreshToken = require(`${libs}/models/refreshToken`);
-const email = require(`${libs}/middlewares/email`);
 
-passport.use(new ClientPasswordStrategy( (clientId, clientSecret, done) => {
-        Client.findOne({ _id: clientId }, (err, client) => {
-            if (err) {
-                return done(err);
-            }
 
+passport.use(new ClientPasswordStrategy(
+    function (client_id, client_secret, done) {
+        Client.findOne({
+            where: { id: client_id }
+        }).then(function (client) {
             if (!client) {
+                console.log("Erro de cliente");
                 return done(null, false);
             }
-
-            if (client.clientSecret !== clientSecret) {
+            if (client.client_secret !== client_secret) {
+                console.log("Erro de Chave Secreta");
                 return done(null, false);
             }
-
             return done(null, client);
-        })
+        }).catch(function (error) {
+            return done(error);
+        });
     }
 ));
 
-passport.use(new BearerStrategy( (accessToken, done) => {
-        AccessToken.findOne({ token: accessToken }, (err, token) => {
-            if (err) {
-                return done(err);
-            }
-
-            if (!token) {
-                return done(null, false);
-            }
-
-            if( Math.round((Date.now()-token.created)/1000) > config.security.tokenLife) {
-                AccessToken.remove({ token: accessToken }, (err) => {
-                    if (err) {
-                        return done(err);
-                    }
-                });
+passport.use(new BearerStrategy(async (accessToken, done) => {
+    const token = await AccessToken.findOne({ where: { token: accessToken } })
+    if (!token) {
+        console.log("ERRO Token");
+        return done(null, false);
+    }
 
-                return done(null, false, { msg: 'Token expired' });
+    if (Math.round((Date.now() - token.created) / 1000) > config.security.tokenLife) {
+        AccessToken.destroy({where:{ token: accessToken} }).catch(function (err) {
+            if (err) {
+                log.error(err);
+                return next({ err });
             }
+        });
 
-            User.findById(token.userId, function(err, usuario) {
-                if (err) {
-                    return done(err);
-                }
-
-                if (!usuario) {
-                    return done(null, false, { msg: 'Unknown user' });
-                }
-
-                var info = { scope: '*' };
-                done(null, usuario, info);
-            })
-        })
+        return done(null, false, { msg: 'Token expired' });
     }
-));
+    User.findByPk(token.user_id).then(function (usuario) {
+        if (!usuario) {
+            console.log("ERRO NAO USUARIO");
+            return done(null, false, { msg: 'Unknown user' });
+        }
+        var info = { scope: '*' };
+        done(null, usuario, info);
+    })
+}));
diff --git a/src/libs/models/accessToken.js b/src/libs/models/accessToken.js
index daab5898a66b952f72359d9685e951b1acf980b7..54e4a4ba8e3b375e2bd0a4b73414e4d59096974d 100644
--- a/src/libs/models/accessToken.js
+++ b/src/libs/models/accessToken.js
@@ -1,29 +1,32 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js')
 const libs = `${process.cwd()}/libs`;
 const User = require(`${libs}/models/user`);
 const Client = require(`${libs}/models/client`);
 
-let AccessToken = new Schema({
-    userId: {
-        type: Schema.Types.ObjectId,
-        required: true,
-        ref: 'User'
+var AccessToken = db.define("AccessToken",{
+    user_id: {
+        type: Sequelize.STRING,
+        allowNull: false
     },
-    clientId: {
-        type: Schema.Types.ObjectId,
-        required: true,
-        ref: 'Client'
+    client_id:{
+        type: Sequelize.STRING,
+        allowNull: false
     },
-    token: {
-        type: String,
+    token:{
+        type: Sequelize.STRING, 
+        allowNull: false,
         unique: true,
-        required: true
+        primaryKey: true
     },
-    createdAt: {
-        type: Date,
-        default: Date.now
-    }
-});
+    created_at:{
+        type: Sequelize.DATE,
+        defaultValue: Date.now
+    }},
+    {timestamps: false}
+);
 
-module.exports = mongoose.model('AccessToken', AccessToken);
+AccessToken.hasOne(User, { foreignKey: 'id' });
+AccessToken.hasOne(Client, { foreignKey: 'id' });
+
+module.exports = AccessToken;
diff --git a/src/libs/models/activity.js b/src/libs/models/activity.js
new file mode 100644
index 0000000000000000000000000000000000000000..92fc6f087fba744219badcd69ad7785b2d4b3b61
--- /dev/null
+++ b/src/libs/models/activity.js
@@ -0,0 +1,80 @@
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
+const libs = `${process.cwd()}/libs`;
+
+var Activity = db.define("Activity",{
+    id:{
+        type: Sequelize.STRING,
+        allowNull:false,
+        unique: true,
+        primaryKey: true
+    },
+    type:{
+        type: Sequelize.STRING,
+        allowNull:false
+    },
+    title:{
+        type: Sequelize.STRING,
+        allowNull:false,
+    },
+    subtitle:{
+        type: Sequelize.STRING
+    },
+    date:{
+        type: Sequelize.STRING,
+        allowNull:false
+    },
+    authors:{
+        type: Sequelize.STRING,
+    },
+    text:{
+        type: Sequelize.STRING,
+        allowNull: false
+    },
+    name_headline:{
+        type: Sequelize.STRING,
+        allowNull:false
+    },
+    resume_headline:{
+        type:Sequelize.STRING,
+        allowNull:false
+    },
+    date_headline:{
+        type: Sequelize.STRING,
+        allowNull:false
+    },
+    local_headline:{
+        type:Sequelize.STRING,
+        allowNull:false
+    },
+    additional_headline:{
+        type:Sequelize.STRING
+    },
+    is_draft:{
+        type:Sequelize.BOOLEAN,
+        allowNull:false,
+        defaultValue: true
+    },
+    is_headline:{
+        type:Sequelize.BOOLEAN,
+        allowNull: false,
+        defaultValue: false
+    }
+
+},
+{timestamps: false});
+
+Activity.generateObjectId = function(){
+    var timestamp = (new Date().getTime() / 1000 | 0).toString(16);
+    return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, function() {
+        return (Math.random() * 16 | 0).toString(16);
+    }).toLowerCase();
+}
+
+const setObjectId = act => {
+   act.id = Activity.generateObjectId()
+};
+
+Activity.beforeCreate(setObjectId);
+
+module.exports = Activity;
\ No newline at end of file
diff --git a/src/libs/models/client.js b/src/libs/models/client.js
index 8ac80d8d158705f63efbbecc72de37d1fef6a3ac..b4eabcbca46ed440b8655cc77b6b5b147e35c54c 100644
--- a/src/libs/models/client.js
+++ b/src/libs/models/client.js
@@ -1,17 +1,24 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
 
-let Client = new Schema({
-    name: {
-        type: String,
+var Client = db.define("client",{
+    id:{
+        type: Sequelize.STRING,
+        allowNull:false,
         unique: true,
-        required: true
+        primaryKey: true
     },
-    clientSecret: {
-        type: String,
-        required: true,
+    name:{
+        type: Sequelize.STRING,
+        allowNull:false,
         unique: true
-    }
-});
+    },
+    client_secret:{
+        type: Sequelize.STRING,
+        allowNull:false,
+        unique:true
+    },
+},
+{timestamps: false});
 
-module.exports = mongoose.model('Client', Client);
+module.exports = Client;
\ No newline at end of file
diff --git a/src/libs/models/download.js b/src/libs/models/download.js
index 989896d9a2b6547c11c9b1bc71019db3bb7617a5..3d59249aad2592bf6ae5f7bcc668bdd71d0de1f6 100644
--- a/src/libs/models/download.js
+++ b/src/libs/models/download.js
@@ -1,53 +1,60 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+const Sequelize = require("sequelize");
+const crypto = require('crypto');
+const db = require('../db/postgres.js');
 const libs = `${process.cwd()}/libs`;
-const log = require(`${libs}/log`)(module);
 const User = require(`${libs}/models/user`);
 
-let Download = new Schema({
-    userId: {
-        type: Schema.Types.ObjectId,
-        required: true,
-        ref: 'User'
-    },
-    table: {
-        type: String,
-        required: true
-    },
-    name: {
-        type: String,
-        required: true
-    },
-    mappingTable: {
-        type: String,
-        required: true
+var Download = db.define("Download",{
+    id:{
+        type: Sequelize.INTEGER, 
+        allowNull: false,
+        autoIncrement: true,
+        unique: true,
+        primaryKey: true
+    },
+    user_id: {
+        type: Sequelize.STRING,
+        allowNull: false
+    },
+    table:{
+        type: Sequelize.STRING, 
+        allowNull: false,
+    },
+    name:{
+        type: Sequelize.STRING,
+        allowNull: false,
+    },
+    mapping_table:{
+        type: Sequelize.STRING,
+        allowNull:false
     },
     query: {
-        type: String,
-        required: true
+        type: Sequelize.STRING,
+        allowNull:false
     },
-    createdAt: {
-        type: Date,
-        required: true,
-        default: Date.now
-    },
-    updatedAt: {
-        type: Date,
-        required: true,
-        default: Date.now
+    created_at:{
+        type: Sequelize.DATE,
+        defaultValue: Date.now
+    }, 
+    updated_at: {
+        type: Sequelize.DATE,
+        defaultValue: Date.now
     },
     status: {
-        type: String
+        type: Sequelize.STRING
     },
     size: {
-        type: Number
+        type: Sequelize.NUMBER
     },
     expired: {
-        type: Boolean
+        type: Sequelize.BOOLEAN
     },
     link: {
-        type: String
-    }
-});
+        type: Sequelize.STRING,
+    }},
+    {timestamps: false}
+);
+
+Download.hasOne(User,{ foreignKey: 'id' });
 
-module.exports = mongoose.model('Download', Download);
+module.exports = Download
diff --git a/src/libs/models/file.js b/src/libs/models/file.js
new file mode 100644
index 0000000000000000000000000000000000000000..aa6ba077e60ae1b400e401d470f46aa7f2bc53e3
--- /dev/null
+++ b/src/libs/models/file.js
@@ -0,0 +1,39 @@
+
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
+const libs = `${process.cwd()}/libs`;
+
+var File = db.define("File",{
+    id: {
+        type: Sequelize.STRING,
+        allowNull:false,
+        unique: true,
+        primaryKey: true
+    },
+    type:{
+        type: Sequelize.STRING
+    },
+    name: {
+        type: Sequelize.STRING
+    },
+    data: {
+        type: Sequelize.BLOB('long')
+    }
+},
+{timestamps: false});
+
+File.generateObjectId = function(){
+    var timestamp = (new Date().getTime() / 1000 | 0).toString(16);
+    return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, function() {
+        return (Math.random() * 16 | 0).toString(16);
+    }).toLowerCase();
+}
+
+const setObjectId = file => {
+   file.id = File.generateObjectId()
+};
+
+File.beforeCreate(setObjectId);
+
+module.exports=File;
+	
diff --git a/src/libs/models/permission.js b/src/libs/models/permission.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba35c4ce57dcb2f4655cb038d76814f4d54933f8
--- /dev/null
+++ b/src/libs/models/permission.js
@@ -0,0 +1,39 @@
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
+const libs = `${process.cwd()}/libs`;
+const Role = require(`${libs}/models/role`);
+
+var Permission = db.define("PermissionRole",{
+    id:{
+        type: Sequelize.STRING,
+        allowNull:false,
+        unique: true,
+        primaryKey: true
+    },
+    permission_name:{
+        type: Sequelize.STRING,
+        allowNull:false,
+    },
+    permission_description:{
+        type: Sequelize.STRING,
+        allowNull:false
+    }
+},
+{timestamps: false});
+
+Permission.generateObjectId = function(){
+    var timestamp = (new Date().getTime() / 1000 | 0).toString(16);
+    return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, function() {
+        return (Math.random() * 16 | 0).toString(16);
+    }).toLowerCase();
+}
+
+const setObjectId = permission => {
+   permission.id = Permission.generateObjectId()
+};
+
+Permission.beforeCreate(setObjectId);
+
+
+module.exports = Permission;
+
diff --git a/src/libs/models/permissionRole.js b/src/libs/models/permissionRole.js
new file mode 100644
index 0000000000000000000000000000000000000000..e415acc697f2db9af4be231efdb8e855cbd9ec53
--- /dev/null
+++ b/src/libs/models/permissionRole.js
@@ -0,0 +1,29 @@
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
+const libs = `${process.cwd()}/libs`;
+const Role = require(`${libs}/models/role`);
+const Permission = require(`${libs}/models/permission`);
+
+var PermissionRole = db.define("PermissionRole",{
+    id:{
+        type: Sequelize.INTEGER,
+        allowNull:false,
+        unique: true,
+        primaryKey: true
+    },
+    role_id:{
+        type: Sequelize.INTEGER,
+        allowNull:false,
+    },
+    permission_id:{
+        type: Sequelize.INTEGER,
+        allowNull:false
+    }
+},
+{timestamps: false});
+
+PermissionRole.hasMany(Role, {foreignKey: 'id'});
+PermissionRole.hasMany(Permission, {foreignKey: 'id'});
+
+module.exports = PermissionRole;
+
diff --git a/src/libs/models/pqr.js b/src/libs/models/pqr.js
index f92703188323cef17807f70f1f2198b54a13aa1b..2a9fb9dd657d13494efd9d57fa3f1a0c59a3c59d 100644
--- a/src/libs/models/pqr.js
+++ b/src/libs/models/pqr.js
@@ -1,16 +1,19 @@
-const mongoose = require('mongoose')
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
 
-const libs = `${process.cwd()}/libs`;
-const log = require(`${libs}/log`)(module);
-const User = require(`${libs}/models/user`);
-
-const Schema = mongoose.Schema;
-
-let PQRSchema = new Schema({
+var PQR = db.define("pqr",{
+    id:{
+        type: Sequelize.INTEGER, 
+        allowNull: false,
+        unique: true,
+        primaryKey: true
+    },
     content: {
-        type: String,
-        required: true,
+        type: Sequelize.STRING, 
+        allowNull: false
     }
-});
+},
+{timestamps: false});
+
 
-module.exports = mongoose.model('PQR', PQRSchema);
+module.exports = PQR;
diff --git a/src/libs/models/publication.js b/src/libs/models/publication.js
new file mode 100644
index 0000000000000000000000000000000000000000..bd537bc0825b44a0e79d384e5bf631537784ef69
--- /dev/null
+++ b/src/libs/models/publication.js
@@ -0,0 +1,83 @@
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
+const libs = `${process.cwd()}/libs`;
+
+var Publication = db.define("Publication",{
+    id:{
+        type: Sequelize.STRING,
+        allowNull:false,
+        unique: true,
+        primaryKey: true
+    },
+    filter:{
+        type: Sequelize.ENUM("Artigo", "Tese", "Dissertação", "Relatório", "Periódico"),
+        allowNull:false,
+        validate: {
+            notNull: { msg: "O campo categoria é obrigatória e aceita apenas os valores 'Artigo', 'Tese', 'Dissertação', 'Relatório', 'Periódico."},
+            isIn:{
+                args: [["Artigo", "Tese", "Dissertação", "Relatório", "Periódico"]],
+                msg: "O campo categoria é obrigatória e aceita apenas os valores 'Artigo', 'Tese', 'Dissertação', 'Relatório', 'Periódico'."
+            }
+        }
+    },
+    title:{
+        type: Sequelize.STRING,
+        allowNull:false,
+    },
+    authors:{
+        type: Sequelize.STRING,
+        allowNull:false
+    },
+    organization:{
+        type: Sequelize.STRING,
+        allowNull:false
+    },
+    year:{
+        type:Sequelize.STRING,
+        allowNull:false
+    },
+    text:{ 
+        type: Sequelize.ENUM("Baixar","Acessar"),
+        allowNull:false,
+        validate: {
+            notNull: { msg: "O campo origem é obrigatória e aceita apenas os valores 'Baixar', 'Acessar'."},
+            isIn:{
+                args: [["Baixar", "Acessar"]],
+                msg: "O campo origem é obrigatória e aceita apenas os valores 'Baixar', 'Acessar'."}
+        }
+    },
+    link:{
+        type: Sequelize.STRING
+    },
+    upload:{
+        type: Sequelize.STRING
+    },
+    is_draft:{
+        type:Sequelize.BOOLEAN,
+        allowNull:false,
+        defaultValue: true
+    },
+    is_headline:{
+        type:Sequelize.BOOLEAN,
+        allowNull: false,
+        defaultValue: false
+    }
+},{timestamp:true,
+  createdAt: 'created_at',
+  updatedAt: 'updated_at'}
+);
+
+Publication.generateObjectId = function(){
+    var timestamp = (new Date().getTime() / 1000 | 0).toString(16);
+    return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, function() {
+        return (Math.random() * 16 | 0).toString(16);
+    }).toLowerCase();
+}
+
+const setObjectId = pb => {
+   pb.id = Publication.generateObjectId()
+};
+
+Publication.beforeCreate(setObjectId);
+
+module.exports = Publication;
\ No newline at end of file
diff --git a/src/libs/models/refreshToken.js b/src/libs/models/refreshToken.js
index c5f8fd63cdd30733bb60f341e6617420d945b037..aebdd9b2ec4d8e32acb6e8a03c1264b88305b9a7 100644
--- a/src/libs/models/refreshToken.js
+++ b/src/libs/models/refreshToken.js
@@ -1,30 +1,33 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+const Sequelize = require("sequelize");
 const libs = `${process.cwd()}/libs`;
+const db = require('../db/postgres.js');
 const User = require(`${libs}/models/user`);
 const Client = require(`${libs}/models/client`);
 
-let RefreshToken = new Schema({
-    userId: {
-        type: Schema.Types.ObjectId,
-        required: true,
-        ref: 'User'
+var RefreshToken = db.define("RefreshToken",{
+    user_id: {
+        type: Sequelize.STRING,
+        allowNull: false
     },
-    clientId: {
-        type: Schema.Types.ObjectId,
-        required: true,
-        ref: 'Client'
+    client_id:{
+        type: Sequelize.STRING,
+        allowNull: false
     },
-    token: {
-        type: String,
+    token:{
+        type: Sequelize.STRING, 
+        allowNull: false,
         unique: true,
-        required: true
+        primaryKey: true
     },
-    createdAt: {
-        type: Date,
-        default: Date.now
-    }
-});
+    created_at:{
+        type: Sequelize.DATE,
+        defaultValue: Date.now
+    }},
+    {timestamps: false}
+);
 
-module.exports = mongoose.model('RefreshToken', RefreshToken);
+RefreshToken.hasOne(User, { foreignKey: 'id' });
+RefreshToken.hasOne(Client, { foreignKey: 'id' });
+
+module.exports = RefreshToken;
 
diff --git a/src/libs/models/resetToken.js b/src/libs/models/resetToken.js
index 322d528188a78525b4e003a65c6355fc0c2039c6..dca5488a85842a84ccc06c1afc02dc4c34f7ae69 100644
--- a/src/libs/models/resetToken.js
+++ b/src/libs/models/resetToken.js
@@ -1,46 +1,38 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
+const Sequelize = require("sequelize");
 const libs = `${process.cwd()}/libs`;
-const log = require(`${libs}/log`)(module);
+const db = require('../db/postgres.js');
 const User = require(`${libs}/models/user`);
 const uuid = require('node-uuid');
 
-let ResetToken = new Schema({
-    userId: {
-        type: Schema.Types.ObjectId,
-        required: true,
-        ref: 'User'
+var ResetToken = db.define("ResetToken",{
+    user_id: {
+        type: Sequelize.STRING,
+        allowNull: false
     },
-    token: {
-        type: String,
-        required: true
+    token:{
+        type: Sequelize.STRING, 
+        allowNull: false,
+        unique: true,
+        primaryKey: true
     },
-    reset: {
-        type: Boolean,
-        required: true,
-        default: false
+    reset:{
+        type: Sequelize.BOOLEAN,
+        allowNull: false,
+        defaultValue: false
     },
-    createdAt: {
-        type: Date,
-        required: true,
-        default: Date.now
-    }
-});
+    created_at:{
+        type: Sequelize.DATE,
+        defaultValue: Date.now
+    }},
+    {timestamps: false}
+);
 
-ResetToken.methods.createResetToken = function (done) {
-    let resetToken = this;
-    let token = uuid.v4();
-    resetToken.set('token', token);
-    resetToken.reset = false;
-    resetToken.save(function(err) {
-        if (err)
-            return done(err);
-        return done(null, token);
-    })
-}
-ResetToken.methods.hasExpired = function () {
+ResetToken.prototype.hasExpired = function () {
     var now = new Date();
     return (now - this.createdAt) > 86400; //Expire if token is 1 day old
 };
 
-module.exports = mongoose.model('ResetToken', ResetToken);
+ResetToken.hasOne(User,{ foreignKey: 'id' });
+
+
+module.exports = ResetToken
diff --git a/src/libs/models/role.js b/src/libs/models/role.js
new file mode 100644
index 0000000000000000000000000000000000000000..d594b061a5dd082a26c2bf41f4d80e6b78214230
--- /dev/null
+++ b/src/libs/models/role.js
@@ -0,0 +1,23 @@
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
+
+var Role = db.define("Role",{
+    id:{
+        type: Sequelize.INTEGER,
+        allowNull:false,
+        unique: true,
+        primaryKey: true
+    },
+    role_name:{
+        type: Sequelize.STRING,
+        allowNull:false,
+    },
+    // token:{
+    //     type: Sequelize.STRING,
+    //     allowNull:false,
+    // }
+},
+{timestamps: false});
+
+module.exports = Role;
+
diff --git a/src/libs/models/simulation.js b/src/libs/models/simulation.js
index f1d3b0bd2448fe7640affd57e3d33d330ad7912c..21d2de89547e34a8118ab2579b410a44ff969d0e 100644
--- a/src/libs/models/simulation.js
+++ b/src/libs/models/simulation.js
@@ -1,34 +1,39 @@
-const mongoose = require('mongoose')
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js')
+const User = require(`./user.js`);
 
-const libs = `${process.cwd()}/libs`;
-const log = require(`${libs}/log`)(module);
-const User = require(`${libs}/models/user`);
-
-const Schema = mongoose.Schema;
-
-let SimulationSchema = new Schema({
-    userId: {
-        type: Schema.Types.ObjectId,
-        required: true,
-        ref: 'User'
+var Simulation = db.define("Simulation",{
+    id:{
+        type: Sequelize.INTEGER, 
+        allowNull: false,
+        autoIncrement: true,
+        unique: true,
+        primaryKey: true
     },
-    content: {
-        type: String,
-        required: true,
+    user_id: {
+        type: Sequelize.STRING, 
+        allowNull: false
+    },
+    content:{
+        type: Sequelize.STRING,
+        allowNull: false
     },
     name: {
-        type: String
+        type: Sequelize.STRING,
     },
-    createdAt: {
-        type: Date,
-        required: true,
-        default: Date.now
+    created_at:{
+        type: Sequelize.DATE,
+        allowNull: false,
+        defaultValue: Date.now
     },
-    updatedAt: {
+    updated_at: {
         type: Date,
         required: true,
         default: Date.now
     }
-});
+},
+{timestamps: false});
+
+Simulation.hasOne(User,{ foreignKey: 'id' });
 
-module.exports = mongoose.model('Simulation', SimulationSchema);
+module.exports = Simulation;
diff --git a/src/libs/models/user.js b/src/libs/models/user.js
index be62f4a5cf87074e2f84695f3d1e190c20b8c118..405909eb1e39ea94a0b283aed9c1fedf8295ec25 100644
--- a/src/libs/models/user.js
+++ b/src/libs/models/user.js
@@ -1,119 +1,202 @@
-const mongoose = require('mongoose');
-const crypto = require('crypto')
+const Sequelize = require("sequelize");
+const crypto = require('crypto');
+const db = require('../db/postgres.js');
 const libs = `${process.cwd()}/libs`;
-const log = require(`${libs}/log`)(module);
-const Schema = mongoose.Schema;
+const Role = require(`${libs}/models/role`);
 
-// set up a mongoose model
-var UserSchema = new Schema({
-    email: {
-        type: String,
+// set up a sequelize model 
+var User = db.define("User",{
+    id:{
+        type: Sequelize.STRING,
+        allowNull:false,
         unique: true,
-        required: [true, 'O campo Email é obrigatório.']
+        primaryKey: true
     },
-    hashedPassword: {
-        type: String,
-        required: [true, 'O campo Senha é obrigatório.']
+    email: {
+        type: Sequelize.STRING,
+        allowNull: false,
+        unique: true,
+        validate: {
+            notNull: { msg: "O campo Email é obrigatório." },
+            notEmpty: { msg: "O campo Email é obrigatório." }
+        }
     },
-    salt: {
-        type: String,
-        required: true
+    password:{
+        type: Sequelize.VIRTUAL
     },
-    name: {
-        type: String,
-        required: [true, 'O campo Nome é obrigatório.']
+    hashed_password:{
+        type: Sequelize.STRING,
+        allowNull: false,
     },
-    nickname: {
-        type: String,
-        required: [true, 'O campo Apelido é obrigatório.']
+    salt: {
+        type: Sequelize.STRING,
+        allowNull: false,
+    },
+    name:{
+        type: Sequelize.STRING,
+        allowNull: false,
+        validate: {
+            notNull: { msg: "O campo Nome é obrigatório." },
+            notEmpty: { msg: "O campo Nome é obrigatório." }
+        }
+    },
+    nickname:{
+        type: Sequelize.STRING,
+        allowNull: false,
+        validate: {
+            notNull: { msg: "O campo Apelido é obrigatório." },
+            notEmpty: { msg: "O campo Apelido é obrigatório." }
+        }
     },
     cpf:{
-        type: String,
+        type: Sequelize.STRING,
+        allowNull: false,
         unique: true,
-        required: [true, 'O campo CPF é obrigatório.']
+        validate: {
+            notNull: { msg: "O campo CPF é obrigatório." },
+            notEmpty: { msg: "O campo CPF é obrigatório." }
+        }
     },
     cep:{
-        type: String,
-        required: [true, 'O campo CEP é obrigatório.']
-    },
-    schooling: {
-        type: String,
-        required: [true, 'O campo Formação é obrigatório.']
-    },
-    course: {
-        type: String,
-    },
-    complement: {
-        type: String,
-    },
-    address: {
-        type: String,
-    },
-    phone: {
-        type: String,
-    },
-    segment: {
-        type: String,
-        required: [true, 'O campo Segmento é obrigatório.']
-    },
-    role: {
-        type: String,
-        required: [true, 'O campo Função é obrigatório.']
-    },
-    institutionName: {
-        type: String,
-        required: [true, 'O campo Instituição em que trabalha ou estuda é obrigatório.']
-    },
-    state: {
-        type: String,
-        required: [true, 'O campo Estado é obrigatório.']
-    },
-    city: {
-        type: String,
-        required: [true, 'O campo Cidade é obrigatório.']
-    },
-    receiveEmails: {
-        type: Boolean
-    },
-    createdAt: {
-        type: Date,
-        default: Date.now
-    },
-    origin: {
-        type: String,
-        enum: ['LDE', 'SimCAQ', 'MAPFOR'],
-        required: [true, 'O campo origem é obrigatória e aceita apenas os valores "LDE", "SimCAQ" e "MAPFOR"']
-    },
-    verified: {
-        type: Boolean,
-        default: false
-    },
-    citesegment: {
-        type: String
-    },
-    citerole: {
-        type: String
-    },
-    admin: {
-        type: Boolean,
-        default: false
+        type: Sequelize.STRING,
+        allowNull: false,
+        validate: {
+            notNull: { msg: "O campo CEP é obrigatório." },
+            notEmpty: { msg: "O campo CEP é obrigatório." }
+        }
+    },
+    schooling:{
+        type: Sequelize.STRING,
+        allowNull: false, 
+        validate: {
+            notNull: { msg: "O campo Formação é obrigatório." },
+            notEmpty: { msg: "O campo Formação é obrigatório." }
+        }
+    },
+    course:{
+        type: Sequelize.STRING,
+    },
+    complement:{
+        type: Sequelize.STRING
+    },
+    address:{
+        type: Sequelize.STRING,
+    },
+    phone:{
+        type: Sequelize.STRING,
+    },
+    segment:{
+        type: Sequelize.STRING,
+        allowNull: false,
+        validate: {
+            notNull: { msg: "O campo Segmento é obrigatório." },
+            notEmpty: { msg: "O campo Segmento é obrigatório." }
+        }
+    },
+    role:{
+        type: Sequelize.STRING,
+        allowNull: false,
+        validate: {
+            notNull: { msg: "O campo Função é obrigatório." },
+            notEmpty: { msg: "O campo Função é obrigatório." }
+        }
+    },
+    institution_name:{
+        type: Sequelize.STRING,
+        allowNull: false,
+        validate: {
+            notNull: { msg: "O campo Instituição em que trabalha ou estuda é obrigatório." },
+            notEmpty: { msg: "O campo Instituição em que trabalha ou estuda é obrigatório." }
+        }
+    },
+    state:{
+        type: Sequelize.STRING,
+        allowNull: false,
+        validate: {
+            notNull: { msg: "O campo Estado é obrigatório." },
+            notEmpty: { msg: "O campo Estado é obrigatório." }
+        }
+    },
+    city:{
+        type: Sequelize.STRING,
+        allowNull: false,
+        validate: {
+            notNull: { msg: "O campo Cidade é obrigatório." },
+            notEmpty: { msg: "O campo Cidade é obrigatório." }
+        }
+    },
+    receive_email:{
+        type: Sequelize.BOOLEAN,
+    },
+    created_at:{
+        type: Sequelize.DATE,
+        defaultValue: Date.now
+    },
+    origin:{
+        type: Sequelize.ENUM("LDE", "SimCAQ", "MAPFOR"),
+        allowNull:false,
+        validate: {
+            notNull: { msg: "O campo origem é obrigatória e aceita apenas os valores 'LDE', 'SimCAQ' e 'MAPFOR'."},
+            notEmpty: { msg: "O campo origem é obrigatória e aceita apenas os valores 'LDE', 'SimCAQ' e 'MAPFOR'."}
+        }
+    },
+    verified:{
+        type: Sequelize.BOOLEAN,
+        defaultValue:false
+    },
+    citesegment:{
+        type: Sequelize.STRING,
+    },
+    citerole:{
+        type: Sequelize.STRING
+    },
+    admin:{
+        type: Sequelize.BOOLEAN,
+        defaultValue:false
+    },
+    role_id:{
+        type: Sequelize.NUMBER,
+        allowNull:false,
+        defaultValue: 0
     }
-});
+},
+    {timestamps: false}
+);
+
+User.hasOne(Role, {foreignKey: 'id'});
+
+User.generateSalt = function() {
+    return crypto.randomBytes(128).toString('hex');
+}
+
+User.encryptPassword = function(password, salt) {
+    return crypto.pbkdf2Sync(password+'', salt, 10000, 512, 'sha512').toString('hex');
+}
+
+User.generateObjectId = function(){
+    var timestamp = (new Date().getTime() / 1000 | 0).toString(16);
+    return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, function() {
+        return (Math.random() * 16 | 0).toString(16);
+    }).toLowerCase();
+}
+
+const setSaltAndPassword = user => {
+    if (user.changed('password')) {
+        user.salt = User.generateSalt()
+        user.hashed_password = User.encryptPassword(user.password, user.salt).toString('hex');
+   }
+}
 
-UserSchema.methods.encryptPassword = function(password) {
-    return crypto.pbkdf2Sync(password+'', this.salt, 10000, 512, 'sha512');
+const setObjectId = user => {
+   user.id = User.generateObjectId()
 };
 
-UserSchema.virtual('password').set(function(password) {
-    this._plainPassword = password+'';
-    this.salt = crypto.randomBytes(128).toString('hex');
-    this.hashedPassword = this.encryptPassword(password).toString('hex');
-}).get(function() {
-    return this._plainPassword;
-});
+User.beforeCreate(setSaltAndPassword)
+User.beforeCreate(setObjectId)
+User.beforeUpdate(setSaltAndPassword)
 
-UserSchema.methods.checkPassword = function(password) {
-    return this.encryptPassword(password).toString('hex') === this.hashedPassword;
+User.prototype.checkPassword = function(user, enteredPassword) {
+    return User.encryptPassword(enteredPassword, user.salt) === user.hashed_password
 }
 
-module.exports = mongoose.model('User', UserSchema);
+module.exports = User; 
diff --git a/src/libs/models/userActivity.js b/src/libs/models/userActivity.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c1f8b56003b6e05243e4746ef6185cedad7df1b
--- /dev/null
+++ b/src/libs/models/userActivity.js
@@ -0,0 +1,29 @@
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
+const libs = `${process.cwd()}/libs`;
+const User = require(`${libs}/models/user`);
+const Activity = require(`${libs}/models/activity`);
+
+var userActivity = db.define("userActivity",{
+    id:{
+        type: Sequelize.INTEGER,
+        allowNull:false,
+        unique: true,
+        primaryKey: true
+    },
+    user_id:{
+        type: Sequelize.STRING,
+        allowNull:false,
+    },
+    activity_id:{
+        type: Sequelize.STRING,
+        allowNull:false
+    }
+},
+{timestamps: false});
+
+userActivity.hasMany(User, {foreignKey: 'id'});
+userActivity.hasMany(Activity, {foreignKey: 'id'});
+
+module.exports = userActivity;
+
diff --git a/src/libs/models/userPublication.js b/src/libs/models/userPublication.js
new file mode 100644
index 0000000000000000000000000000000000000000..654dd3c33827fb926fa4b5d1e7e48241a03689df
--- /dev/null
+++ b/src/libs/models/userPublication.js
@@ -0,0 +1,29 @@
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js');
+const libs = `${process.cwd()}/libs`;
+const User = require(`${libs}/models/user`);
+const Publication = require(`${libs}/models/publication`);
+
+var userPublication = db.define("userPublication",{
+    id:{
+        type: Sequelize.INTEGER,
+        allowNull:false,
+        unique: true,
+        primaryKey: true
+    },
+    user_id:{
+        type: Sequelize.STRING,
+        allowNull:false,
+    },
+    publication_id:{
+        type: Sequelize.STRING,
+        allowNull:false
+    }
+},
+{timestamps: false});
+
+userPublication.hasMany(User, {foreignKey: 'id'});
+userPublication.hasMany(Publication, {foreignKey: 'id'});
+
+module.exports = userPublication;
+
diff --git a/src/libs/models/verificationToken.js b/src/libs/models/verificationToken.js
index ef7e109e16364874ea7d3f4b07b6e19ce74c3eae..9038cac1961db16f3f88522c89efe089243a3819 100644
--- a/src/libs/models/verificationToken.js
+++ b/src/libs/models/verificationToken.js
@@ -1,41 +1,31 @@
-const mongoose = require('mongoose');
-const Schema = mongoose.Schema;
-const libs = `${process.cwd()}/libs`;
-const log = require(`${libs}/log`)(module);
-const User = require(`${libs}/models/user`);
+const Sequelize = require("sequelize");
+const db = require('../db/postgres.js')
+const User = require(`./user.js`);
 const uuid = require('node-uuid');
 
-let VerificationToken = new Schema({
-    userId: {
-        type: Schema.Types.ObjectId,
-        required: true,
-        ref: 'User'
+var VerificationToken = db.define("VerificationToken",{
+    user_id: {
+        type: Sequelize.STRING, 
+        allowNull: false
     },
-    token: {
-        type: String,
-        required: true
+    token:{
+        type: Sequelize.STRING,
+        allowNull: false,
+        primaryKey: true
     },
-    verified: {
-        type: Boolean,
-        required: true,
-        default: false
+    verified:{
+        type: Sequelize.BOOLEAN,
+        allowNull: false,
+        defaultValue: false
     },
-    createdAt: {
-        type: Date,
-        required: true,
-        default: Date.now
+    created_at:{
+        type: Sequelize.DATE,
+        allowNull: false,
+        defaultValue: Date.now
     }
-});
+},
+{timestamps: false});
 
-VerificationToken.methods.createVerificationToken = function(done) {
-    let verificationToken = this;
-    let token = uuid.v4();
-    verificationToken.set('token', token);
-    verificationToken.verified = false;
-    verificationToken.save(function(err) {
-        if (err) return done(err);
-        return done(null, token);
-    })
-}
+VerificationToken.hasOne(User,{ foreignKey: 'id' });
 
-module.exports = mongoose.model('VerificationToken', VerificationToken);
+module.exports = VerificationToken;
diff --git a/src/libs/routes_v1/activity.js b/src/libs/routes_v1/activity.js
new file mode 100644
index 0000000000000000000000000000000000000000..51ef67ea1ae60d35636dc42f3770f62b0fd9b29b
--- /dev/null
+++ b/src/libs/routes_v1/activity.js
@@ -0,0 +1,207 @@
+const express = require('express');
+
+const activityApp = express();
+
+const libs = `${process.cwd()}/libs`;
+
+const config = require(`${libs}/config`);
+
+const log = require(`${libs}/log`)(module);
+
+const Activity = require(`${libs}/models/activity`);
+
+const response = require(`${libs}/middlewares/response`);
+
+const email = require(`${libs}/middlewares/email`);
+
+const passport = require('passport');
+
+const fileWorker = require('./file.controller.js');
+
+let upload = require('../middlewares/multer.config.js');
+
+const authorized = require(`${libs}/middlewares/authorize.js`);
+
+function emailSyntax(email) {
+  const regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
+  return regex.test(email);
+}
+
+activityApp.get('/', async (req, res, next) => {
+  const page = parseInt(req.query.page) || 1; 
+  const pageSize = parseInt(req.query.pageSize) || 5; 
+  try {
+    const totalCount = await Activity.count();
+    const offset = (page - 1) * pageSize;
+
+    const acts = await Activity.findAll({
+      offset,
+      limit: pageSize,
+      order:[
+        ['date', 'DESC']]
+    });
+
+    res.json({
+      page,
+      pageSize,
+      totalCount,
+      data: acts,
+    });
+  } catch (error) {
+    console.error(error);
+    res.status(500).json({ error: 'An error occurred' });
+  }
+});
+
+activityApp.get('/drafts', async (req, res, next) => {
+    const page = parseInt(req.query.page) || 1; 
+    const pageSize = parseInt(req.query.pageSize) || 5; 
+    try {
+      const totalCount = await Activity.count({where: {
+        is_draft: true
+      }});
+      const offset = (page - 1) * pageSize;
+  
+      const acts = await Activity.findAll({
+        offset,
+        limit: pageSize,
+        where: {
+          is_draft: true
+        },
+        order:[
+            ['date', 'DESC']]
+      });
+  
+      res.json({
+        page,
+        pageSize,
+        totalCount,
+        data: acts,
+      });
+    } catch (error) {
+      console.error(error);
+      res.status(500).json({ error: 'An error occurred' });
+    }
+  });
+
+activityApp.get('/:id', (req, res, next) => {
+    Activity.findByPk(req.params.id).then((act) => {
+    if (!act) {
+      res.statusCode = 404;
+      res.json({ msg: "A atividade não está cadastrada" });
+    } else {
+      req.result = act.toJSON();
+      next();
+    }
+  }).catch(function (err) {
+    log.error(err);
+    return next(err);
+  });
+}, response('activity'));
+
+
+function transformDateFormat(dateString) {
+  // Split the date string into day, month, and year components
+  var parts = dateString.split('/');
+
+  // Extract day, month, and year values
+  var day = parts[0];
+  var month = parts[1];
+  var year = parts[2];
+
+  // Concatenate the components in "yyyy/mm/dd" format
+  var transformedDate = year + '/' + month + '/' + day;
+
+  return transformedDate;
+}
+
+
+
+activityApp.post('/', passport.authenticate('bearer', { session: false }), authorized('criar atividade'), async (req, res, next) => {
+  console.log(req.body);
+  let act = await Activity.create({
+    id: 0,
+    type:req.body.tipo,
+    title: req.body.titulo,
+    subtitle: req.body.subtitulo,
+    date: transformDateFormat(req.body.dataDePostagem),
+    authors:req.body.autor,
+    text: req.body.texto,
+    name_headline: req.body.nome,
+    resume_headline: req.body.resumo,
+    date_headline: transformDateFormat(req.body.dataAtividade),
+    local_headline: req.body.local,
+    additional_headline: req.body.informacoes,
+    is_draft: req.body.rascunho,
+    is_headline: req.body.is_headline
+  }).catch(function (err) {
+    log.error(err);
+    let errors = [];
+    for (let errName in err.errors) {
+      errors.push(err.errors[errName].message);
+    }
+    log.error(errors);
+    res.statusCode = 400;
+    return res.json({ err, errors });
+    // handle error;
+  });
+  if(!act){
+    res.statusCode = 400;
+    return res;
+  }
+  req.result = act.toJSON();
+  next();
+}, response('activity'));
+
+activityApp.put('/:id', passport.authenticate('bearer', { session: false }), authorized('editar atividade'), async (req, res, next) => {
+  let act = await Activity.findByPk(req.params.id).catch(function (err) {
+    if (err) {
+      log.error(err);
+      return next({ err });
+    }
+  })
+  if (!act) {
+    res.statusCode = 404;
+    return next({
+      err: {
+        message: 'Atividade não encontrada'
+      }
+    });
+  }
+  console.log("TEste");
+  act.type = req.body.type || act.type;
+  act.title = req.body.title || act.title;
+  act.subtitle = req.body.subtitle || act.subtitle;
+  act.date = req.body.date || act.date;
+  act.authors = req.body.autores || act.authors;
+  act.text= req.body.text || act.text;
+  act.name_headline= req.body.name_headline || act.name_headline;
+  act.resume_headline= req.body.resume_headline || act.resume_headline;
+  act.date_headline= req.body.date_headline || act.date_headline;
+  act.local_headline= req.body.local_headline || act.local_headline;
+  act.additional_headline= req.body.additional_headline || act.additional_headline;
+  act.is_draft= req.body.is_draft || act.is_draft;
+  act.is_headline= req.body.is_headline || act.is_headline;
+
+  act.save().catch(err => {
+    if (err) {
+      log.error(err);
+      return next({ message: 'Erro ao atualizar publicacao' });
+    }
+  })
+  let activity = act.toJSON();
+  res.json({ activity: activity});
+
+});
+
+activityApp.delete('/:id', passport.authenticate('bearer', { session: false }), authorized('editar atividade'), async (req, res, next) => {
+  await Activity.destroy({where:{id:req.params.id}}).catch(function (err) {
+    if (err) {
+        log.error(err);
+        return next({ err });
+    }
+});
+  return next({ msg: 'Activity Deleted', status: 200 });
+});
+
+module.exports = activityApp;
diff --git a/src/libs/routes_v1/api.js b/src/libs/routes_v1/api.js
index 4b6a56309deb7c253c77353b95c1bb8f9054f285..75a8e663f013e2716c8f01fdd99225b2265fb51e 100644
--- a/src/libs/routes_v1/api.js
+++ b/src/libs/routes_v1/api.js
@@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public License
 along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
 */
 
+
 const express = require('express');
 
 const api = express();
@@ -26,6 +27,8 @@ const libs = `${process.cwd()}/libs`;
 
 const config = require(`${libs}/config`);
 
+const test = require('./test');
+
 const classes = require('./class');
 
 const enrollment = require('./enrollment');
@@ -134,11 +137,16 @@ const message = require(`${libs}/routes_v1/message`);
 
 const courseStudents = require(`${libs}/routes_v1/courseStudents`);
 
+const publication = require(`${libs}/routes_v1/publication`);
+
+const activity = require(`${libs}/routes_v1/activity`);
+
 api.get('/', (req, res) => {
     res.json({ msg: 'SimCAQ API v1 is running' });
 });
 
 // mount API routes_v1
+api.use('/test', test);
 api.use('/user', user);
 api.use('/simulation', simulation);
 api.use('/class', classes);
@@ -193,4 +201,10 @@ api.use('/universityLocalOffer', universityLocalOffer);
 api.use('/message', message);
 api.use('/course_students', courseStudents);
 
+//Publication 
+api.use('/publication', publication);
+
+//Activity
+api.use('/activity', activity);
+
 module.exports = api;
diff --git a/src/libs/routes_v1/downloads.js b/src/libs/routes_v1/downloads.js
index 2ec83b9ee7ffa82bbaf3e873c949c842dd6b6ab1..cd6cad0b127ce0186ba204aab70b9e5638b57813 100644
--- a/src/libs/routes_v1/downloads.js
+++ b/src/libs/routes_v1/downloads.js
@@ -8,46 +8,43 @@ const log = require(`${libs}/log`)(module);
 
 const Download = require(`${libs}/models/download`);
 
-const User = require(`${libs}/models/user`);
-
 const passport = require('passport');
 
 const request = require(`request`);
 
 const config = require(`${libs}/config`);
 
-downloadApp.get('/', passport.authenticate('bearer', {session: false}), (req, res, next) => {
-    request.get(config.cdn.url + '/api/v1/file', (err, response, body) => {
+downloadApp.get('/', passport.authenticate('bearer', { session: false }), (req, res, next) => {
+    request.get(config.cdn.url + '/api/v1/file', async (err, response, body) => {
         let cdn = JSON.parse(body);
-        Download.find({userId: req.user._id}, (err, downloads) => {
+        const downloads = await Download.findAll({ where: { user_id: req.user.id } }).catch(function (err) {
             if (err) {
                 log.error(err);
                 return next(err);
             }
-            
-            if(!downloads) {
-                res.statusCode = 404;
-                return res.json({msg: 'Nenhum download encontrado'});
-            } else {
-                downloads.forEach((dl) => {
-                    for(let i = 0; i < cdn.length; ++i) {
-                        if(cdn[i].query == dl.query) {
-                            dl.status = cdn[i].expired ? 'Expirado' : 'Enviado';
-                            dl.size = cdn[i].size;
-                            dl.expired = cdn[i].expired;
-                            dl.updatedAt = cdn[i].lastAccess;
-                            dl.link = config.cdn.download + '/' + cdn[i]._id;
-
-                            dl.save((err) => {
-                                if(err) log.error(err);
-                            });
-                            return;
-                        }
-                    }
-                });
-            }
-            res.json(downloads);
         });
+        if (!downloads) {
+            res.statusCode = 404;
+            return res.json({ msg: 'Nenhum download encontrado' });
+        } else {
+            downloads.forEach((dl) => {
+                for (let i = 0; i < cdn.length; ++i) {
+                    if (cdn[i].query == dl.query) {
+                        dl.status = cdn[i].expired ? 'Expirado' : 'Enviado';
+                        dl.size = cdn[i].size;
+                        dl.expired = cdn[i].expired;
+                        dl.updatedAt = cdn[i].lastAccess;
+                        dl.link = config.cdn.download + '/' + cdn[i]._id;
+
+                        dl.save((err) => {
+                            if (err) log.error(err);
+                        });
+                        return;
+                    }
+                }
+            });
+        }
+        res.json(downloads);
     });
 });
 
diff --git a/src/libs/routes_v1/file.controller.js b/src/libs/routes_v1/file.controller.js
new file mode 100644
index 0000000000000000000000000000000000000000..06464342676c391e309e061ace568b4390e3515b
--- /dev/null
+++ b/src/libs/routes_v1/file.controller.js
@@ -0,0 +1,41 @@
+var stream = require('stream');
+const libs = `${process.cwd()}/libs`;
+const File = require(`${libs}/models/file`);
+
+exports.uploadFile = async (_file) => {
+	let file = await File.create({
+        id: 0,
+		type: _file.mimetype,
+		name: _file.originalname,
+		data: _file.buffer
+	}).catch(err => {
+		console.log(err);
+		res.json({msg: 'Error', detail: err});
+	});
+	return file.id;
+}
+
+exports.listAllFiles = (req, res) => {
+	File.findAll({attributes: ['id', 'name']}).then(files => {
+	  res.json(files);
+	}).catch(err => {
+		console.log(err);
+		res.json({msg: 'Error', detail: err});
+	});
+}
+
+exports.downloadFile = (req, res) => {
+	File.findByPk(req.params.id).then(file => {
+		var fileContents = Buffer.from(file.data, "base64");
+		var readStream = new stream.PassThrough();
+		readStream.end(fileContents);
+		
+		res.set('Content-disposition', 'attachment; filename=' + file.name);
+		res.set('Content-Type', file.type);
+
+		readStream.pipe(res);
+	}).catch(err => {
+		console.log(err);
+		res.json({msg: 'Error', detail: err});
+	});
+}
diff --git a/src/libs/routes_v1/publication.js b/src/libs/routes_v1/publication.js
new file mode 100644
index 0000000000000000000000000000000000000000..1eff1f6b814ed6309fe78ec9ab23d8e7ffe5c25a
--- /dev/null
+++ b/src/libs/routes_v1/publication.js
@@ -0,0 +1,207 @@
+const express = require('express');
+
+const pubApp = express();
+
+const libs = `${process.cwd()}/libs`;
+
+const config = require(`${libs}/config`);
+
+const log = require(`${libs}/log`)(module);
+
+const Publication = require(`${libs}/models/publication`);
+
+const File = require(`${libs}/models/file`);
+
+const response = require(`${libs}/middlewares/response`);
+
+const email = require(`${libs}/middlewares/email`);
+
+const passport = require('passport');
+
+const fileWorker = require('./file.controller.js');
+
+let upload = require('../middlewares/multer.config.js');
+
+const authorized = require(`${libs}/middlewares/authorize.js`);
+
+function emailSyntax(email) {
+  const regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
+  return regex.test(email);
+}
+
+pubApp.get('/', async (req, res, next) => {
+  const page = parseInt(req.query.page) || 1; // Current page number
+  const pageSize = parseInt(req.query.pageSize) || 5; // Number of items per page
+  try {
+    const totalCount = await Publication.count();
+    const offset = (page - 1) * pageSize;
+
+    const publis = await Publication.findAll({
+      offset,
+      limit: pageSize,
+    });
+
+    res.json({
+      page,
+      pageSize,
+      totalCount,
+      data: publis,
+    });
+  } catch (error) {
+    console.error(error);
+    res.status(500).json({ error: 'An error occurred' });
+  }
+});
+
+pubApp.get('/drafts', async (req, res, next) => {
+  const page = parseInt(req.query.page) || 1; // Current page number
+  const pageSize = parseInt(req.query.pageSize) || 5; // Number of items per page
+
+  try {
+    // Count total number of items
+    const totalCount = await Publication.count({ where: {
+      is_draft: true
+    }});
+
+    // Calculate offset based on page and pageSize
+    const offset = (page - 1) * pageSize;
+
+    // Query the database with pagination options
+    const drafts = await Publication.findAll({
+      offset,
+      limit: pageSize,
+      where: {
+        is_draft: true
+      }
+    });
+
+    res.json({
+      page,
+      pageSize,
+      totalCount,
+      data: drafts,
+    });
+  } catch (error) {
+    console.error(error);
+    res.status(500).json({ error: 'An error occurred' });
+  }
+});
+
+
+pubApp.get('/:id', async (req, res, next) => {
+  let pb = await Publication.findByPk(req.params.id).catch(function (err) {
+    log.error(err);
+    return next(err);}
+  );
+  if (!pb) {
+      res.statusCode = 404;
+      res.json({ msg: "A publicação não está cadastrada" });
+    } 
+  else {
+    let publ = pb.toJSON();
+    publ.Filename = null;
+    const file_ = await File.findByPk(pb.upload).catch((err) => {
+      log.error(err);
+      return next(err);
+    });
+    if(file_){
+      publ.Filename = file_.name;
+      }
+    req.result = publ;
+    next();
+    }
+  }, response('publication'));
+
+pubApp.post('/', passport.authenticate('bearer', { session: false }), authorized('criar publicacao'), upload.single('file'), async (req, res, next) => {
+  let _file_id = null
+  if(req.file){
+    _file_id = await fileWorker.uploadFile(req.file);
+    if(!_file_id)
+      console.log("NAO ARQUIVO");}
+  let data = JSON.parse(req.body.data);
+  let pb = await Publication.create({
+    id: 0,
+    filter: data.categoria,
+    title: data.title,
+    authors: data.autores,
+    organization: data.organizacao,
+    year: data.ano,
+    text: data.texto,
+    link: data.link,
+    upload: _file_id,
+    is_draft: data.rascunho,
+    is_homepage: data.homepage
+  }).catch(function (err) {
+    log.error(err);
+    let errors = [];
+    for (let errName in err.errors) {
+      errors.push(err.errors[errName].message);
+    }
+    log.error(errors);
+    res.statusCode = 400;
+    return res.json({ err, errors });
+    // handle error;
+  });
+  req.result = pb.toJSON();
+  next();
+}, response('publication'));
+
+pubApp.post('/edit', passport.authenticate('bearer', { session: false }), authorized('editar publicacao'), upload.single('file'), async (req, res, next) => {
+  let _file_id = null
+  if(req.file){
+    _file_id = await fileWorker.uploadFile(req.file);
+    if(!_file_id)
+      console.log("NAO ARQUIVO");}
+  let data = JSON.parse(req.body.data);
+  req.result = data.toJSON();
+  next();
+}, response('publication'));
+
+pubApp.put('/edit/:id', passport.authenticate('bearer', { session: false }), authorized('editar publicacao'), async (req, res, next) => {
+  console.log(req);
+  let pb = await Publication.findByPk(req.params.id).catch(function (err) {
+    if (err) {
+      log.error(err);
+      return next({ err });
+    }
+  })
+  if (!pb) {
+    res.statusCode = 404;
+    return next({
+      err: {
+        message: 'Publicação não encontrada'
+      }
+    });
+  }
+  pb.filter = req.body.categoria || pb.filter;
+  pb.title = req.body.title || pb.title;
+  pb.authors = req.body.autores || pb.authors;
+  pb.organization= req.body.organizacao || pb.organization;
+  pb.year= req.body.ano || pb.year;
+  pb.text= req.body.texto || pb.text;
+  pb.link= req.body.link || pb.link;
+  pb.upload= req.body.upload || pb.upload;
+  pb.is_homepage= req.body.homepage || pb.is_homepage;
+  console.log(pb);
+  pb.save().catch(err => {
+    if (err) {
+      log.error(err);
+      return next({ message: 'Erro ao atualizar publicacao' });
+    }
+  })
+  let p = pb.toJSON();
+  res.json({ publication: p });
+
+});
+
+pubApp.delete('/:id', passport.authenticate('bearer', { session: false }), authorized('apagar publicacao'), async (req, res, next) => {
+  await Publication.destroy({where:{id:req.params.id}}).catch(function (err) {
+    if (err) {
+        log.error(err);
+        return next({ err });
+    }
+});
+  return next({ msg: 'Publication Deleted', status: 200 });
+});
+
+module.exports = pubApp;
diff --git a/src/libs/routes_v1/resetToken.js b/src/libs/routes_v1/resetToken.js
index 34ece8455adf7b77208dc200a95641ed04638609..579bec0bde0c4bdff26e2f1dc588ff801697a82f 100644
--- a/src/libs/routes_v1/resetToken.js
+++ b/src/libs/routes_v1/resetToken.js
@@ -10,72 +10,72 @@ const ResetToken = require(`${libs}/models/resetToken`);
 
 const User = require(`${libs}/models/user`);
 
-resetTokenApp.get('/:token', (req, res, next) => {
+resetTokenApp.get('/:token', async (req, res, next) => {
     let token = req.params.token;
-    ResetToken.findOne({token: token}, (err, rToken) => {
-        if(err) {
+    let rToken = await ResetToken.findOne({where:{ token: token} }).catch(function (err) {
+        if (err) {
             log.error(err);
-            return next(err);
+            return next({ err });
         }
-        if(!rToken) {
-            // TODO: generate new reset token
-            res.statusCode = 404;
-            return next({msg: 'Token not found', status:404});
-        }
-        if (rToken.hasExpired()) {
-            res.statusCode = 410;
-            ResetToken.remove({token: token}, (err) => {
-                if(err) {
-                    log.error(err);
-                    next(err);
-                }
-            })
-            return next({msg: 'Token expired', status: 410});
-        }
-        User.findById(rToken.userId, (err, user) => {
-            if(err) {
+    })
+    if (!rToken) {
+        res.statusCode = 404;
+        return next({ msg: 'Token not found', status: 404 });
+    }
+    if (rToken.hasExpired()) {
+        res.statusCode = 410;
+        await ResetToken.destroy({where:{ token: token}}).catch(function (err) {
+            if (err) {
                 log.error(err);
-                next(err);
+                return next({ err });
             }
-            let u = user.toObject();
-            delete u.salt;
-            delete u.hashedPassword;
-            res.json({user: u});
-        });
-    });
+        })
+        return next({ msg: 'Token expired', status: 410 });
+    }
+    let _user = await User.findByPk(rToken.user_id).catch(function (err) {
+        if (err) {
+            log.error(err);
+            return next({ err });
+        }
+    })
+    let u = _user.toJSON();
+    delete u.salt;
+    delete u.hashed_password;
+    res.json({ user: u });
 });
-resetTokenApp.post('/:token', (req, res, next) => {
+
+resetTokenApp.post('/:token', async (req, res, next) => {
     let token = req.params.token;
-    ResetToken.findOne({token: token}, (err, rToken) => {
-        if(err) {
+    let rToken = await ResetToken.findOne({where:{ token: token}}).catch(function (err) {
+        if (err) {
             log.error(err);
-            return next(err);
+            return next({ err });
         }
-        if(!rToken) {
-            res.statusCode = 404;
-            return next({msg: 'Token not found', status:404});
+    })
+    if (!rToken) {
+        res.statusCode = 404;
+        return next({ msg: 'Token not found', status: 404 });
+    }
+    let _user = await User.findByPk(rToken.user_id).catch(function (err) {
+        if (err) {
+            log.error(err);
+            return next({ err });
         }
-        User.findById(rToken.userId, (err, user) => {
-            if(err) {
-                log.error(err);
-                next(err);
-            }
-            user.password = req.body.password;
-            user.save((err) => {
-                if(err) {
-                    log.error(err);
-                    next(err);
-                }
-                ResetToken.remove({token: token}, (err) => {
-                    if(err) {
-                        log.error(err);
-                        next(err);
-                    }
-                })
-                res.json({msg: "Senha alterada com sucesso"});
-            })
-        });
-    });
-})
+    })
+    await _user.update({password:req.body.password});
+    _user.save().catch(function (err) {
+        if (err) {
+            log.error(err);
+            return next({ err });
+        }
+    })
+    await ResetToken.destroy({where:{token: token} }).catch(function (err) {
+        if (err) {
+            log.error(err);
+            return next({ err });
+        }
+    })
+    res.json({ msg: "Senha alterada com sucesso" });
+});
 
 module.exports = resetTokenApp;
diff --git a/src/libs/routes_v1/simulation.js b/src/libs/routes_v1/simulation.js
index 4b2e40c33dd1855116353f618a7c87c13078eb84..cc0ab38025dc0a9b2c39c4ebaa3f8a962d178525 100644
--- a/src/libs/routes_v1/simulation.js
+++ b/src/libs/routes_v1/simulation.js
@@ -6,12 +6,6 @@ const libs = `${process.cwd()}/libs`;
 
 const log = require(`${libs}/log`)(module);
 
-const squel = require('squel');
-
-const query = require(`${libs}/middlewares/query`).query;
-
-const response = require(`${libs}/middlewares/response`);
-
 const Simulation = require(`${libs}/models/simulation`);
 
 const PQR = require(`${libs}/models/pqr`);
@@ -20,7 +14,7 @@ const passport = require('passport');
 
 simulationApp.get('/time', (req, res, next) => {
     const maxTime = parseInt(req.query.max_time, 10);
-    if(isNaN(maxTime)) {
+    if (isNaN(maxTime)) {
         res.status(400);
         next({
             status: 400,
@@ -28,57 +22,61 @@ simulationApp.get('/time', (req, res, next) => {
         });
     }
     res.json({
-        result: Array.apply(null, {length: maxTime}).map(Number.call, Number).map((i)=>i+1)
+        result: Array.apply(null, { length: maxTime }).map(Number.call, Number).map((i) => i + 1)
     });
 });
 
-simulationApp.get('/pqr', (req, res) => {
-    PQR.findOne((err, pqr) => {
-        if(err) {
+simulationApp.get('/pqr', async (req, res) => {
+    let pqr = await PQR.findOne({ attributes: ['content'] }).catch(function (err) {
+        if (err) {
             log.error(err);
-            return next({err});
+            return next({ err });
         }
-
-        res.json(pqr);
     });
+    if (pqr)
+        res.json(pqr);
 });
 
-simulationApp.put('/pqr', passport.authenticate('bearer', { session: false }), (req, res, next) => {
-    let user = req.user.toObject();
-
-    PQR.findOne((err, pqr) => {
-        if(err) {
-            log.error(err)
-            return next({err});
+simulationApp.put('/pqr', passport.authenticate('bearer', { session: false }), async (req, res, next) => {
+    let user = req.user;
+    let pqr = await PQR.findOne().catch(function (err) {
+        if (err) {
+            log.error(err);
+            return next({ err });
         }
+    });
+    if (!user.admin) {
+        log.info(`Usuário ${user.email} tentou alterar o PQR, mas não tem privilégio`);
+        res.statusCode = 401;
+        return next({ err: { msg: 'Unauthorized' } });
+    }
 
-        if(!user.admin) {
-            log.info(`Usuário ${user.email} tentou alterar o PQR, mas não tem privilégio`);
-            res.statusCode = 401;
-            return next({err: { msg: 'Unauthorized'}});
-        }
-        pqr.content = req.body.content || pqr.content;
-        pqr.save((err) => {
-            if(err) {
+    if(pqr){
+        let _content = req.body.content || pqr.content;
+        pqr.content = _content;
+        await pqr.save({fields:['content']}).catch(function (err) {
+            if (err) {
                 log.error(err);
-                return next({err});
+                return next({ err });
             }
-            res.json({msg: 'PQR updated'})
-        });
-    });
+        });}
+    
+    res.json({ msg: 'PQR updated' })
+
 });
 
-simulationApp.get('/', passport.authenticate('bearer', { session: false }), (req, res) => {
-    let user = req.user.toObject();
-    let query = Simulation.find({userId: user._id}).select('userId name createdAt updatedAt');
-    query.exec((err, simulations) => {
-        if(err) {
+simulationApp.get('/', passport.authenticate('bearer', { session: false }), async (req, res) => {
+    let user = req.user;
+    let simulations = await Simulation.findAll({ where: { user_id: user.id } }, { attributes: ['user_id', 'name', 'created_at', 'updated_at'] }).catch(function (err) {
+        if (err) {
             log.error(err);
-            return next({err});
+            return next({ err });
         }
-
-        res.json(simulations);
-    });
+    })
+    if (!simulations){
+        res.json("Simulations not found");
+    }
+    res.json(simulations);
 
     // Simulation.find({userId: user._id}, (err, simulations) => {
     //     if(err) {
@@ -90,78 +88,74 @@ simulationApp.get('/', passport.authenticate('bearer', { session: false }), (req
     // });
 });
 
-simulationApp.post('/', passport.authenticate('bearer', { session: false }), (req, res, next) => {
-    let user = req.user.toObject();
+simulationApp.post('/', passport.authenticate('bearer', { session: false }), async (req, res, next) => {
+    let user = req.user;
 
-    let simulation = new Simulation({
-        userId: user._id,
+    let simulation = await Simulation.create({
+        user_id: user.id,
         content: req.body.content,
         name: req.body.name
     });
 
-    simulation.save((err) => {
-        if(err) {
+    await simulation.save().catch(function (err) {
+        if (err) {
             log.error(err);
-            return next({err});
+            return next({ err });
         }
+    });
 
-        res.json({msg: 'Simulation created', simulation});
-    })
-});
+    res.json({ msg: 'Simulation created', simulation });
+})
 
-simulationApp.get('/:id', passport.authenticate('bearer', { session: false }), (req, res) => {
-    let user = req.user.toObject();
+simulationApp.get('/:id', passport.authenticate('bearer', { session: false }), async (req, res) => {
+    let user = req.user;
 
-    Simulation.findOne({_id: req.params.id, userId: user._id}, (err, simulation) => {
-        if(err) {
+    let simulation = await Simulation.findOne({where:{id: req.params.id, user_id: user.id }}).catch(function (err) {
+        if (err) {
             log.error(err);
-            return next({err});
+            return next({ err });
         }
-
-        res.json(simulation);
     });
+    res.json(simulation);
+
 });
 
-simulationApp.put('/:id', passport.authenticate('bearer', { session: false }), (req, res, next) => {
-    let user = req.user.toObject();
+simulationApp.put('/:id', passport.authenticate('bearer', { session: false }), async (req, res, next) => {
+    let user = req.user;
 
-    Simulation.findOne({_id: req.params.id, userId: user._id}, (err, simulation) => {
-        if(err) {
+    let simulation = await Simulation.findOne({ where: { id: req.params.id, user_id: user.id } }).catch(function (err) {
+        if (err) {
             log.error(err);
-            return next({err});
+            return next({ err });
         }
+    });
 
-        if(!simulation) {
-            res.statusCode = 404;
-            return next({err: { msg: 'Simulation not found'}});
-        }
-
-        simulation.content = req.body.content || simulation.content;
-        simulation.name = req.body.name || simulation.name;
-        simulation.updatedAt = Date.now();
-
-        simulation.save((err) => {
-            if(err) {
-                log.error(err);
-                return next(err);
-            }
+    if (!simulation) {
+        res.statusCode = 404;
+        return next({ err: { msg: 'Simulation not found' } });
+    }
 
-            res.json(simulation);
-        });
+    simulation.content = req.body.content || simulation.content;
+    simulation.name = req.body.name || simulation.name;
+    simulation.updated_at = new Date();
+    await simulation.save({fields:['content','name','updated_at']}).catch(function (err) {
+        if (err) {
+            log.error(err);
+            return next({ err });
+        }
     });
+    res.json({ msg: 'Simulation created', simulation });
 });
 
-simulationApp.delete('/:id', passport.authenticate('bearer', { session: false }), (req, res, next) => {
-    let user = req.user.toObject();
-
-    Simulation.remove({_id: req.params.id, userId: user._id}, (err, simulation) => {
-        if(err) {
+simulationApp.delete('/:id', passport.authenticate('bearer', { session: false }), async (req, res, next) => {
+    let user = req.user;
+    await Simulation.destroy({where: { "id": req.params.id, "user_id": user.id } }).catch(function (err) {
+        if (err) {
             log.error(err);
-            return next({err});
+            return next({ err });
         }
-
-        res.json({msg: 'Simulation removed'});
     });
+    res.json({ msg: 'Simulation removed' });
 });
 
 module.exports = simulationApp;
diff --git a/src/libs/routes_v1/test.js b/src/libs/routes_v1/test.js
new file mode 100644
index 0000000000000000000000000000000000000000..9e8482dcf3bbdcb52faf269d9a7e7f57d37069cf
--- /dev/null
+++ b/src/libs/routes_v1/test.js
@@ -0,0 +1,100 @@
+const express = require('express');
+const oauth2orize = require('oauth2orize');
+const passport = require('passport');
+const ClientPasswordStrategy = require('passport-oauth2-client-password');
+const testApp = express();
+const libs = `${process.cwd()}/libs`;
+
+const Client = require(`${libs}/models/client`);
+const User = require(`${libs}/models/user`)
+var server = oauth2orize.createServer();
+
+passport.use(new ClientPasswordStrategy(
+    function(client_id, client_secret, done) {
+      Client.findOne({where: {client_id: client_id} 
+      }).then(function(err, client) {
+        if(err){
+            console.log("Erro de requisicao");
+            return done(err);
+        }
+        if(!client){
+            console.log("Erro de cliente");
+            return done(null, false);
+        }
+        if (client.client_secret !== client_secret){
+            console.log("Erro de geracao Chave Secreta");
+            return done(null, false);
+        } 
+        console.log("Tudo certo nesse use");
+        return done(null, client);
+      })
+    }
+  ));
+
+let generateTokens = (userId, clientId, done) => {
+    // curries in `done` callback so we don't need to pass it
+    let refreshTokenValue;
+    let token;
+    let tokenValue;
+
+    RefreshToken.destroy({where:{"user_id": userId, "client_id": clientId}});
+    AccessToken.destroy({where:{"user_id": userId, "client_id": clientId}});
+
+    tokenValue = crypto.randomBytes(32).toString('hex');
+    refreshTokenValue = crypto.randomBytes(32).toString('hex');
+
+    AccessToken.create({
+        user_id:userId, 
+        client_id:clientId,
+        token:tokenValue
+    })
+
+    let refreshed_token = refreshTokenValue;
+
+    RefreshToken.create({
+        user_id:userId, 
+        client_id:clientId,
+        token:refreshed_token
+    })
+
+    token.save((err) => {
+        if (err) {
+            log.error(err);
+            return done(err);
+        }
+        done(null, tokenValue, refreshTokenValue, {
+            'expires_in': config.security.tokenLife
+        });
+    })
+};
+
+
+let entrar = function(client, username, done) {
+    User.findOne({ 
+      where: {email:username} 
+    }).then(function(user) {
+      console.log(user)
+      if(user == null){
+        return done(null, false);
+      }
+      if(user.dataValues.origin != client.client_secret){
+        console.log("Erro de client_secret");
+        return done(null, false);
+      }
+      log.info(`Gerando token para usuário ${user.name}`);
+      generateTokens(user._id, client._id, done);
+    }).catch(function(error) {
+      return done(error);
+    });
+  };
+
+
+
+
+
+testApp.post('/', (req, res, next) =>{
+    entrar(req.body, req.body.username);
+});
+
+
+module.exports = testApp;
\ No newline at end of file
diff --git a/src/libs/routes_v1/user.js b/src/libs/routes_v1/user.js
index 7ff088eea62f34ffd3b66de4a28ae42807a97e8d..1a6044cc1f7775116c9ab1895ba2671f17d135eb 100644
--- a/src/libs/routes_v1/user.js
+++ b/src/libs/routes_v1/user.js
@@ -20,6 +20,8 @@ const email = require(`${libs}/middlewares/email`);
 
 const passport = require('passport');
 
+const uuid = require('node-uuid');
+
 function emailSyntax(email) {
   const regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
   return regex.test(email);
@@ -56,16 +58,16 @@ userApp.get('/segment', (req, res, next) => {
 
 userApp.get('/role', (req, res, next) => {
   req.result = [
-    {"Gestores e equipe gestora das secretarias e ministério da Educação" : ["Dirigente municipal, estadual e federal", "Secretário do MEC", "Servidor da área de planejamento educacional", "Membro de associação de gestores (Ex. Undime, Consed, etc)", "Outro [citar função]"]},
-    {"Gestores dos órgãos de planejamento e finanças (das três esferas de governo)" : ["Equipe gestora dos órgãos de planejamento", "Equipe gestora dos órgãos de finanças", "Outro [citar função]"]},
-    {"Agentes do poder legislativo" : ["Parlamentar", "Assessor/a parlamentar", "Auditor/a dos tribunais de conta", "Conselheiro/a de tribunais de conta.", "Outro [citar função]"]},
-    {"Agentes dos conselhos de educação" : ["Conselheiro/a municipais, estaduais e federais", "Conselheiro/a do Fundeb", "Outro [citar função]"]},
-    {"Profissionais da educação" : ["Professor/a da Educação Básica", "Profissional da educação não-docente", "Outro [citar função]"]},
-    {"Sindicato" : ["Agente de sindicatos"]},
-    {"Sociedade civil interessada no financiamento da Educação Básica de qualidade" : ["Membro de fóruns educacionais", "Membro de ONGs e demais entidades sem fins lucrativos", "Estudante da educação básica e membro de entidades estudantis", "Pais e membros de entidades de pais", "Outro [citar função]"]},
-    {"Comunidade acadêmica" : ["Pesquisador/a", "Estudantes de graduação e pós-graduação", "Representantes de entidades de pesquisa (Ex.: ANPED, ANPAE e FINEDUCA)", "Outro [citar função]"]},
-    {"Imprensa" : ["Jornalista", "Outro [citar função]"]},
-    {"Outro [citar segmento]" : []}
+    { "Gestores e equipe gestora das secretarias e ministério da Educação": ["Dirigente municipal, estadual e federal", "Secretário do MEC", "Servidor da área de planejamento educacional", "Membro de associação de gestores (Ex. Undime, Consed, etc)", "Outro [citar função]"] },
+    { "Gestores dos órgãos de planejamento e finanças (das três esferas de governo)": ["Equipe gestora dos órgãos de planejamento", "Equipe gestora dos órgãos de finanças", "Outro [citar função]"] },
+    { "Agentes do poder legislativo": ["Parlamentar", "Assessor/a parlamentar", "Auditor/a dos tribunais de conta", "Conselheiro/a de tribunais de conta.", "Outro [citar função]"] },
+    { "Agentes dos conselhos de educação": ["Conselheiro/a municipais, estaduais e federais", "Conselheiro/a do Fundeb", "Outro [citar função]"] },
+    { "Profissionais da educação": ["Professor/a da Educação Básica", "Profissional da educação não-docente", "Outro [citar função]"] },
+    { "Sindicato": ["Agente de sindicatos"] },
+    { "Sociedade civil interessada no financiamento da Educação Básica de qualidade": ["Membro de fóruns educacionais", "Membro de ONGs e demais entidades sem fins lucrativos", "Estudante da educação básica e membro de entidades estudantis", "Pais e membros de entidades de pais", "Outro [citar função]"] },
+    { "Comunidade acadêmica": ["Pesquisador/a", "Estudantes de graduação e pós-graduação", "Representantes de entidades de pesquisa (Ex.: ANPED, ANPAE e FINEDUCA)", "Outro [citar função]"] },
+    { "Imprensa": ["Jornalista", "Outro [citar função]"] },
+    { "Outro [citar segmento]": [] }
   ]
   next();
 }, response('role'));
@@ -92,214 +94,249 @@ userApp.get('/', passport.authenticate('bearer', {session: false}), (req, res, n
 */
 
 userApp.get('/me', passport.authenticate('bearer', { session: false }), (req, res, next) => {
-  let user = req.user.toObject();
-  delete user.hashedPassword;
-  delete user.salt;
-  req.result = user;
+  let u = req.user.toJSON();
+  u._id = u.id;
+  u.institutionName = u.institution_name;
+  u.receiveEmails = u.receive_email;
+  u.receive_emails = u.receive_email;
+  delete u.id;
+  delete u.institution_name;
+  delete u.receive_email;
+  delete u.hashed_password;
+  delete u.salt;
+
+  req.result = u;
   next();
 }, response('user'));
 
+function isEmpty(str) {
+  return (!str || str.length === 0 );
+}
+
 userApp.get('/:id', (req, res, next) => {
-  User.findById(req.params.id, (err, user) => {
-    if(err) {
-      log.error(err);
-      return next(err);
-    }
-    if(!user) {
-      req.statusCode = 404;
-      next({msg: 'User not found'});
+  User.findByPk(req.params.id).then((user) => {
+    if (!user) {
+      res.statusCode = 404;
+      res.json({ msg: "O usuário não está cadastrado" });
     } else {
-      let u = user.toObject;
-      delete u.hashedPassword;
+      let u = user.toJSON();
+      u._id = u.id;
+      u.institutionName = u.institution_name;
+      u.receiveEmails = u.receive_email;
+      u.receive_emails = u.receive_email;
+      delete u.id;
+      delete u.institution_name;
+      delete u.receive_email;
+      delete u.hashed_password;
       delete u.salt;
       req.result = u;
       next();
     }
+  }).catch(function (err) {
+    log.error(err);
+    return next(err);
   });
 }, response('user'));
 
-userApp.post('/', (req, res, next) => {
-  let user = new User({
-    email: req.body.email,
-    password: req.body.password,
-    name: req.body.name,
-    nickname: req.body.nickname,
-    cpf: req.body.cpf,
-    cep: req.body.cep,
-    complement: req.body.complement,
-    address: req.body.address,
-    phone: req.body.phone,
-    schooling: req.body.schooling,
-    course: req.body.course,
-    segment: req.body.segment,
-    role: req.body.role,
-    institutionName: req.body.institutionName,
-    state: req.body.state,
-    city: req.body.city,
-    receiveEmails: false || req.body.receiveEmails,
-    origin: req.body.origin,
-    citesegment: req.body.citesegment,
-    citerole: req.body.citerole,
-    admin: false
-  });
-
+userApp.post('/', async (req, res, next) => {
   if (typeof req.body.password === 'undefined' || !req.body.password) {
     res.statusCode = 400;
-    return res.json({errors: ["O campo senha é obrigatório"]});
-  } else {
-    user.save((err) => {
-      if(err) {
+    return res.json({ errors: ["O campo senha é obrigatório"] });
+  } 
+  else {
+    let user = await User.create({
+      id: 0,
+      email: req.body.email,
+      password: req.body.password,
+      hashed_password: 0,
+      salt: 0,
+      name: req.body.name,
+      nickname: req.body.nickname,
+      cpf: req.body.cpf,
+      cep: req.body.cep,
+      complement: req.body.complement,
+      address: req.body.address,
+      phone: req.body.phone,
+      schooling: req.body.schooling,
+      course: req.body.course,
+      segment: req.body.segment,
+      role: req.body.role,
+      institution_name: req.body.institutionName,
+      state: req.body.state,
+      city: req.body.city,
+      receive_email: false || req.body.receiveEmails || req.body.receive_emails,
+      origin: req.body.origin,
+      citesegment: req.body.citesegment,
+      citerole: req.body.citerole,
+      admin: false,
+      role_id: 0
+    }).catch(function (err) {
+      log.error(err);
+      let errors = [];
+      for (let errName in err.errors) {
+        errors.push(err.errors[errName].message);
+      }
+      log.error(errors);
+      res.statusCode = 400;
+      return res.json({ err, errors });
+      // handle error;
+    });
+    let tokenValue = uuid.v4();
+    const verificationToken = VerificationToken.create({
+      user_id: user.id,
+      token: tokenValue,
+      verified: false
+    });
+    if (!verificationToken) {
+      res.statusCode = 404;
+      return res.json({ msg: "Couldn't create Verification Token" });
+    }
+    let url = config.default.lde.url + '/verify';
+    let text = `Olá, ${user.name}, seja bem vindo/a ao Laboratório de Dados Educacionais.\n\nClique neste link para confirmar sua conta: ${url}/${tokenValue}`;
+    // Send confirmation email
+    let mailOptions = {
+      to: `"${user.name} <${user.email}>"`,
+      subject: "Confirme seu cadastro - Laboratório de Dados Educacionais",
+      text
+    }
+    email(mailOptions, (err, info) => {
+      if (err) {
         log.error(err);
-        let errors = [];
-        for(let errName in err.errors) {
-          errors.push(err.errors[errName].message);
-        }
-        log.error(errors);
-        res.statusCode = 400;
-        return res.json({err, errors});
+        res.json({ msg: 'Message not delivered, user created but not confirmed' });
       }
-
-      // Create verification token
-      let verificationToken = new VerificationToken({
-        userId: user._id
-      });
-
-      verificationToken.createVerificationToken((err, token) => {
-        if(err) {
-          log.error(err);
-          return next(err);
-        }
-        let url = config.default.lde.url + '/verify';
-        let text = `Olá, ${user.name}, seja bem vindo/a ao Laboratório de Dados Educacionais.\n\nClique neste link para confirmar sua conta: ${url}/${token}`;
-        // Send confirmation email
-        let mailOptions = {
-          to: `"${user.name} <${user.email}>"`,
-          subject: "Confirme seu cadastro - Laboratório de Dados Educacionais",
-          text
-        }
-        email(mailOptions, (err, info) => {
-          if(err) {
-            log.error(err);
-            res.json({msg: 'User created'});
-          }
-          if(info) {
-            log.info(`Message ${info.messageId} sent: ${info.response}`);
-            log.info(`Usuário ${user.email} foi criado`);
-          }
-          res.json({msg: 'User created'});
-        });
-      });
+      if (info) {
+        log.info(`Message ${info.messageId} sent: ${info.response}`);
+        log.info(`Usuário ${user.email} foi criado`);
+      }
+      res.json({ msg: 'User created' });
     });
   }
-
 });
 
-userApp.put('/:id', passport.authenticate('bearer', { session: false }), (req, res, next) => {
-  User.findById(req.params.id, (err, user) => {
+userApp.put('/:id', passport.authenticate('bearer', { session: false }), async (req, res, next) => {
+  let user = await User.findByPk(req.params.id).catch(function (err) {
     if (err) {
       log.error(err);
-      return next({err});
+      return next({ err });
     }
-
-    if(!user) {
-      res.statusCode = 404;
-      return next({err: {
+  })
+  if (!user) {
+    res.statusCode = 404;
+    return next({
+      err: {
         message: 'Usuário não encontrado'
-      }});
-    }
+      }
+    });
+  }
 
-    user.email = req.body.email || user.email;
-    user.name = req.body.name || user.name;
-    user.nickname = req.body.nickname || user.nickname || user.name;
-    user.cep = req.body.cep || user.cep;
-    user.complement = req.body.complement || user.complement;
-    user.address = req.body.address || user.address;
-    user.phone = req.body.phone || user.phone;
-    user.schooling = req.body.schooling || user.schooling;
-    user.course = req.body.course || user.course;
-    user.segment = req.body.segment || user.segment;
-    user.role = req.body.role || user.role;
-    user.institutionName = req.body.institutionName || user.institutionName;
-    user.state = req.body.state || user.state;
-    user.city = req.body.city || user.city;
-    user.receiveEmails = req.body.receiveEmails || user.receiveEmails;
-    user.citesegment = req.body.citesegment || user.citesegment;
-    user.citerole = req.body.citerole || user.citerole;
+  user.email = req.body.email || user.email;
+  user.name = req.body.name || user.name;
+  user.nickname = req.body.nickname || user.nickname || user.name;
+  user.cep = req.body.cep || user.cep;
+  user.complement = req.body.complement || user.complement;
+  user.address = req.body.address || user.address;
+  user.phone = req.body.phone || user.phone;
+  user.schooling = req.body.schooling || user.schooling;
+  user.course = req.body.course || user.course;
+  user.segment = req.body.segment || user.segment;
+  user.role = req.body.role || user.role;
+  user.institutionName = req.body.institutionName || user.institutionName;
+  user.state = req.body.state || user.state;
+  user.city = req.body.city || user.city;
+  user.receive_email = req.body.receiveEmails || req.body.receive_emails || user.receive_email;
+  user.citesegment = req.body.citesegment || user.citesegment;
+  user.citerole = req.body.citerole || user.citerole;
 
-    if ((req.body.password) && (req.body.newpassword)) {
-        if (req.body.password != req.body.newpassword) {
-            if (user.checkPassword(req.body.password)) {
-                user.password = req.body.newpassword;
-            } else {
-                res.statusCode = 500;
-                return res.json({error: {
-                    message: 'A senha atual está incorreta'
-                }});
-            }
-        } else {
-            res.statusCode = 500;
-            return res.json({error: {
-                message: 'A nova senha é a mesma da senha atual'
-            }});
+  if((!isEmpty(req.body.password)) && (!isEmpty(req.body.newpassword))){
+    if (req.body.password != req.body.newpassword) {
+      if (user.checkPassword(user, req.body.password)) {
+          await user.update({password:req.body.newpassword});
+        } 
+      else {
+        res.statusCode = 500;
+        return res.json({
+          error: {
+            message: 'A senha atual está incorreta'
+          }
+        });
+      }
+    } else {
+      res.statusCode = 500;
+      return res.json({
+        error: {
+          message: 'A nova senha é a mesma da senha atual'
         }
+      });
     }
+  }
+
+  user.save().catch(err => {
+    if (err) {
+      log.error(err);
+      return next({ message: 'Erro ao atualizar usuário' });
+    }})
+  let u = user.toJSON();
+  u._id = u.id;
+  u.institutionName = u.institution_name;
+  u.receiveEmails = u.receive_email;
+  u.receive_emails = u.receive_email;
+  delete u.id;
+  delete u.institution_name;
+  delete u.receive_email;
+  delete u.hashed_password;
+  delete u.salt;
+  delete u.password;
+  res.json({ user: u });
 
-    user.save(err => {
-      if(err) {
-        log.error(err);
-        return next({message: 'Erro ao atualizar usuário'});
-      }
-      let u = user.toObject();
-      delete u.hashedPassword;
-      delete u.salt;
-      res.json({user: u});
-    })
-  })
 });
 
-userApp.get('/reset/password', (req, res, next) => {
+
+userApp.get('/reset/password', async (req, res, next) => {
   let emailAddress = req.query.email;
-  User.findOne({email: emailAddress}, (err, user)=> {
-    if(err) {
-      log.error(err);
-      let errors = [];
-      for(let errName in err.errors) {
-        errors.push(err.errors[errName].message);
-      }
-      res.statusCode = 400;
-      return res.json({err, errors});
+  let user = await User.findOne({ where: { email: emailAddress } }).catch(function (err) {
+    log.error(err);
+    let errors = [];
+    for (let errName in err.errors) {
+      errors.push(err.errors[errName].message);
     }
-    if (!user) {
+    log.error(errors);
+    res.statusCode = 400;
+    return res.json({ err, errors });
+    // handle error;
+  });
+  if (!user) {
+    res.statusCode = 404;
+    res.json({ msg: "O usuário não está cadastrado" });
+  }
+  else {
+    let tokenValue = uuid.v4();
+    const rt = await ResetToken.create({
+      user_id: user.id,
+      token: tokenValue,
+      reset: false
+    });
+    if (!rt) {
       res.statusCode = 404;
-      res.json({msg: "O usuário não está cadastrado"});
+      return res.json({ msg: "Couldn't create Reset Password Token" });
     }
-    else {
-      let resetToken = new ResetToken({
-        userId: user._id
-      });
-      resetToken.createResetToken((err, token) => {
-        if (err) {
-          log.error(err);
-          return next(err);
-        }
-        let url = config.default.lde.url + '/reset-password';
-        let text = `Olá, ${user.name}.\n\nRecebemos uma solicitação para redefinir sua senha do Laboratório de Dados Educacionais. Clique neste link para redefinir a sua senha: ${url}/${token}`;
-        let mailOptions = {
-          to: `"${user.name} <${user.email}>"`,
-          subject: "Redefinição de Senha - Laboratório de Dados Educacionais",
-          text
-        }
-        email(mailOptions, (err, info) => {
-          if(err) {
-            log.error(err);
-            res.json({msg: 'Undelivered Reset Password Mail'});
-          }
-          log.info(`Message ${info.messageId} sent: ${info.response}`);
-          res.json({msg: 'Reset Password Mail Successfully Delivered'});
-        });
-      })
+    let url = config.default.lde.url + '/reset-password';
+    let text = `Olá, ${user.name}.\n\nRecebemos uma solicitação para redefinir sua senha do Laboratório de Dados Educacionais. Clique neste link para redefinir a sua senha: ${url}/${tokenValue}`;
+    let mailOptions = {
+      to: `"${user.name} <${user.email}>"`,
+      subject: "Redefinição de Senha - Laboratório de Dados Educacionais",
+      text
     }
-  })
-})
+    console.log(mailOptions);
+    email(mailOptions, (err, info) => {
+      if (err) {
+        console.log(err);
+        log.error(err);
+        res.json({ msg: 'Undelivered Reset Password Mail' });
+      }
+      log.info(`Message ${info.messageId} sent: ${info.response}`);
+      res.json({ msg: 'Reset Password Mail Successfully Delivered' });
+    });
+  }
+});
 
 module.exports = userApp;
diff --git a/src/libs/routes_v1/verifyToken.js b/src/libs/routes_v1/verifyToken.js
index d54f64aa162c767c765784398dbcab455a9d666e..81731fe3809df11cd7cb69d04c430642c58cc54c 100644
--- a/src/libs/routes_v1/verifyToken.js
+++ b/src/libs/routes_v1/verifyToken.js
@@ -10,43 +10,45 @@ const VerificationToken = require(`${libs}/models/verificationToken`);
 
 const User = require(`${libs}/models/user`);
 
-verifyTokenApp.get('/:token', (req, res, next) => {
+verifyTokenApp.get('/:token', async (req, res, next) => {
     let token = req.params.token;
-    VerificationToken.findOne({token: token}, (err, vToken) => {
-        if(err) {
+    let vToken = await VerificationToken.findOne({ where: { token: token } }).catch(function (err) {
+        if (err) {
             log.error(err);
-            return next(err);
+            return next({ err });
         }
-        if(!vToken) {
-            // TODO: generate new verification token
-            res.statusCode = 404;
-            return next({msg: 'Token not found', status:404});
+    })
+    if (!vToken) {
+        // TODO: generate new verification token
+        res.statusCode = 404;
+        return next({ msg: 'Token not found', status: 404 });
+    }
+    let _user = await User.findByPk(vToken.user_id).catch(function (err) {
+        if (err) {
+            log.error(err);
+            return next({ err });
+        }
+    }) 
+    if(!_user){
+        return done(null, false); 
+    }
+    await _user.update({verified:true});
+    await _user.save().catch(err => {
+        if (err) {
+          log.error(err);
+          return next({ message: 'Erro ao atualizar usuário' });
+        }})
+    vToken.verified = true;
+    await vToken.save().catch(err => {
+        if (err) {
+            log.error(err);
+            next(err);
         }
-        User.findById(vToken.userId, (err, user) => {
-            if(err) {
-                log.error(err);
-                next(err);
-            }
-            user.verified = true;
-            user.save((err) => {
-                if(err) {
-                    log.error(err);
-                    next(err);
-                }
-            });
-            let u = user.toObject();
-            delete u.salt;
-            delete u.hashedPassword;
-            vToken.verified = true;
-            vToken.save((err) => {
-                if(err) {
-                    log.error(err);
-                    next(err);
-                }
-            });
-            res.json({msg: 'User verified', user: u});
-        });
     });
+    let u = _user.toJSON();
+    delete u['salt'];
+    delete u['hashed_password'];
+    res.json({ msg: 'User verified', u });
 });
 
 module.exports = verifyTokenApp;
diff --git a/src/libs/routes_v2/resetToken.js b/src/libs/routes_v2/resetToken.js
index 34ece8455adf7b77208dc200a95641ed04638609..3d67a1e2390dcd206f248fa3af59bda16e2fcbb6 100644
--- a/src/libs/routes_v2/resetToken.js
+++ b/src/libs/routes_v2/resetToken.js
@@ -32,7 +32,7 @@ resetTokenApp.get('/:token', (req, res, next) => {
             })
             return next({msg: 'Token expired', status: 410});
         }
-        User.findById(rToken.userId, (err, user) => {
+        User.findByPk(rToken.userId, (err, user) => {
             if(err) {
                 log.error(err);
                 next(err);
@@ -55,7 +55,7 @@ resetTokenApp.post('/:token', (req, res, next) => {
             res.statusCode = 404;
             return next({msg: 'Token not found', status:404});
         }
-        User.findById(rToken.userId, (err, user) => {
+        User.findByPk(rToken.userId, (err, user) => {
             if(err) {
                 log.error(err);
                 next(err);
diff --git a/src/libs/routes_v2/user.js b/src/libs/routes_v2/user.js
index 7ff088eea62f34ffd3b66de4a28ae42807a97e8d..a2ab63a5dd0c8c24bf3d18dbc39a9e0b3e739b72 100644
--- a/src/libs/routes_v2/user.js
+++ b/src/libs/routes_v2/user.js
@@ -100,7 +100,7 @@ userApp.get('/me', passport.authenticate('bearer', { session: false }), (req, re
 }, response('user'));
 
 userApp.get('/:id', (req, res, next) => {
-  User.findById(req.params.id, (err, user) => {
+  User.findOne({id:req.params.id}, (err, user) => {
     if(err) {
       log.error(err);
       return next(err);
@@ -195,7 +195,7 @@ userApp.post('/', (req, res, next) => {
 });
 
 userApp.put('/:id', passport.authenticate('bearer', { session: false }), (req, res, next) => {
-  User.findById(req.params.id, (err, user) => {
+  User.findOne({id:req.params.id}, (err, user) => {
     if (err) {
       log.error(err);
       return next({err});
diff --git a/src/libs/routes_v2/verifyToken.js b/src/libs/routes_v2/verifyToken.js
index d54f64aa162c767c765784398dbcab455a9d666e..8978cd4bb84d75b48a060799a1ab846aa627180a 100644
--- a/src/libs/routes_v2/verifyToken.js
+++ b/src/libs/routes_v2/verifyToken.js
@@ -22,7 +22,7 @@ verifyTokenApp.get('/:token', (req, res, next) => {
             res.statusCode = 404;
             return next({msg: 'Token not found', status:404});
         }
-        User.findById(vToken.userId, (err, user) => {
+        User.findOne({id:vToken.userId}, (err, user) => {
             if(err) {
                 log.error(err);
                 next(err);