diff --git a/src/main/java/com/example/App.java b/src/main/java/com/example/App.java
index 9407ea49..86a9eef2 100644
--- a/src/main/java/com/example/App.java
+++ b/src/main/java/com/example/App.java
@@ -1,23 +1,22 @@
 package com.example;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.SQLException;
 
-public class App {
-    private static final String PASSWORD = "";
-    private static final String USERNAME = "gitpod";
-    private static final String JDBC_URL = "jdbc:postgresql://localhost/postgres";
+import com.example.dao.ConnectionManager;
+import com.example.dao.EstadoDAO;
 
+public class App {
     public static void main(String[] args) {
         new App();
     }
 
     public App(){
-        try(var conn = getConnection()){
+        try(var conn = ConnectionManager.getConnection()){
             carregarDriverJDBC();
-            listarEstados(conn);
-            localizarEstado(conn, "PR");
+            var estadoDAO = new EstadoDAO(conn);
+            estadoDAO.listar();
+            estadoDAO.localizar("PR");
             listarDadosTabela(conn, "produto");
         } catch (SQLException e) {
             System.err.println("Não foi possível conectar ao banco de dados: " + e.getMessage());
@@ -51,42 +50,9 @@ private void listarDadosTabela(Connection conn, String tabela) {
         
     }
 
-    private void localizarEstado(Connection conn, String uf) {
-        try{
-            //var sql = "select * from estado where uf = '" + uf + "'"; //suscetível a SQL Injection
-            var sql = "select * from estado where uf = ?";
-            var statement = conn.prepareStatement(sql);
-            //System.out.println(sql);
-            statement.setString(1, uf);
-            var result = statement.executeQuery();
-            if(result.next()){
-                System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
-            }
-            System.out.println();
-        } catch(SQLException e){
-            System.err.println("Erro ao executar consulta SQL: " + e.getMessage());
-        }
-        
-    }
-
-    private void listarEstados(Connection conn) {
-        try{
-            System.out.println("Conexão com o banco realizada com sucesso.");
+    
 
-            var statement = conn.createStatement();
-            var result = statement.executeQuery("select * from estado");
-            while(result.next()){
-                System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
-            }
-            System.out.println();
-        } catch (SQLException e) {
-            System.err.println("Não foi possível executar a consulta ao banco: " + e.getMessage());
-        }
-    }
 
-    private Connection getConnection() throws SQLException {
-        return DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);
-    }
 
     private void carregarDriverJDBC() {
         try {
diff --git a/src/main/java/com/example/AppArrays.java b/src/main/java/com/example/AppArrays.java
new file mode 100644
index 00000000..b7f4e65d
--- /dev/null
+++ b/src/main/java/com/example/AppArrays.java
@@ -0,0 +1,30 @@
+package com.example;
+
+import java.util.Arrays;
+
+public class AppArrays {
+    public static void main(String[] args) {
+
+        int vetor3[] = new int[4];
+        for (int i = 0; i < vetor3.length; i++) {
+            vetor3[i] = 100*(i+1);
+        }
+        System.out.println(Arrays.toString(vetor3));
+        System.out.println();
+
+        double matriz [][] = new double [3][4];
+        for ( int i = 0; i < matriz.length; i++) {
+            for (int j = 0; j < matriz[i].length; j++) {
+                matriz [i][j] = (i*matriz[i].length + j+1)*10;
+            }
+        }
+
+        for ( int i = 0; i < matriz.length; i++) {
+            for (int j = 0; j < matriz[i].length; j++) {
+                System.out.print(matriz[i][j] + " ");
+            }
+            System.out.println();
+        }
+
+    }
+}
diff --git a/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
new file mode 100644
index 00000000..ea58700b
--- /dev/null
+++ b/src/main/java/com/example/AppBd.java
@@ -0,0 +1,65 @@
+package com.example;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+/*import java.sql.Statement;*/
+
+import com.example.dao.DAO;
+import com.example.dao.EstadoDAO;
+import com.example.dao.ProdutoDAO;
+import com.example.model.Marca;
+import com.example.model.Produto;
+
+public class AppBd {
+    private static final String PASSWORD = "";
+    private static final String USER_NAME = "gitpod";
+    private static final String JDBC_URL = "jdbc:postgresql://localhost/postgres";
+
+    public static void main(String[] args) {
+        new AppBd();
+    }
+
+    public AppBd(){
+        try(var conn = getConnection()){
+            var estadoDAO = new EstadoDAO(conn);
+            var listaEstados = estadoDAO.listar();
+            for (var estado : listaEstados) {
+                System.out.println(estado);
+            }
+            estadoDAO.localizar("TO");
+
+            var marca = new Marca();
+            marca.setId(1L);
+
+            var produto = new Produto();
+            produto.setId(205L);
+            produto.setValor(90.0);
+            produto.setMarca(marca);
+            produto.setName("Produto Novo 1");
+            
+            var produtoDAO = new ProdutoDAO(conn);
+            produtoDAO.inserir(produto);
+            produtoDAO.excluir(203L);
+            produtoDAO.alterar(produto);
+            var dao = new DAO(conn);
+            dao.listarDadosTabela("produto");
+            
+        }
+        catch (SQLException e) {
+            System.err.println("Não foi possível carregar o banco de dados" + e.getMessage());        
+        }
+    }    
+
+    private Connection getConnection() throws SQLException{
+        return DriverManager.getConnection(JDBC_URL, USER_NAME, PASSWORD);
+    }
+
+    /*private void carregarDriverJDBC() {
+        try {
+            Class.forName("org.postgresql.Driver");              
+        } catch (ClassNotFoundException e) {
+            System.err.println("Não foi possível carregar a biblioteca para acesso ao banco de dados" + e.getMessage());
+        }
+    }*/
+}
diff --git a/src/main/java/com/example/AppClasses.java b/src/main/java/com/example/AppClasses.java
new file mode 100644
index 00000000..73aca46b
--- /dev/null
+++ b/src/main/java/com/example/AppClasses.java
@@ -0,0 +1,38 @@
+package com.example;
+
+import com.example.model.Cliente;
+
+public class AppClasses {
+    public static void main(String[] args) {
+        System.out.println("Criando Classes");
+        Cliente cliente = new Cliente();
+        cliente.setRenda(-10000);
+        cliente.setSexo('M');
+        cliente.setAnoNascimento(1980);
+        cliente.setNome("Manoel");
+        cliente.setCpf("99999999999");
+        System.out.println("Renda: " + cliente.getRenda());
+        System.out.println("Sexo: " + cliente.getSexo());
+        System.out.println("Ano de Nascimento: " + cliente.getAnoNascimento());
+        System.out.println("Especial " + cliente.isEspecial());
+        System.out.println("Nome: " + cliente.getNome());
+        System.out.println("CPF: " + cliente.getCpf());
+        System.out.println();
+
+        Cliente cliente2 = new Cliente(2000, 'F');
+        cliente2.setAnoNascimento(1970);
+        cliente2.setNome("Joana");
+        cliente2.setCpf("9999999999");
+        System.out.println("Renda: " + cliente2.getRenda());
+        System.out.println("Sexo: " + cliente2.getSexo());
+        System.out.println("Ano de Nascimento: " + cliente2.getAnoNascimento());
+        System.out.println("Especial " + cliente2.isEspecial());
+        System.out.println("Nome: " + cliente2.getNome());
+        System.out.println("CPF: " + cliente2.getCpf());
+
+        if (cliente.getCpf().equals(cliente2.getCpf())) {
+            System.out.println("CPFs são iguais");
+        } else {
+            System.out.println("Cpfs são diferentes");
+        }
+    }}
diff --git a/src/main/java/com/example/AppListas.java b/src/main/java/com/example/AppListas.java
new file mode 100644
index 00000000..4a76cc70
--- /dev/null
+++ b/src/main/java/com/example/AppListas.java
@@ -0,0 +1,25 @@
+package com.example;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.example.model.Cliente;
+
+public class AppListas {
+    public static void main(String[] args) {
+        List<Cliente> listaClientes = new ArrayList<>();
+        var cliente1 = new Cliente();
+        cliente1.setNome("Thiago");
+
+        var cliente2 = new Cliente();
+        cliente2.setNome("Teo");
+
+        listaClientes.add(cliente1);
+        listaClientes.add(cliente2);
+        listaClientes.add(cliente1);
+        listaClientes.add(cliente2);
+        for (Cliente cliente : listaClientes) {
+            System.out.println(cliente);
+        }
+    }
+}
diff --git a/src/main/java/com/example/AppOperadoresRelacionais.java b/src/main/java/com/example/AppOperadoresRelacionais.java
new file mode 100644
index 00000000..490be8ba
--- /dev/null
+++ b/src/main/java/com/example/AppOperadoresRelacionais.java
@@ -0,0 +1,19 @@
+package com.example;
+
+import com.example.model.Cliente;
+
+public class AppOperadoresRelacionais {
+    public static void main(String[] args) {
+        
+        var cliente1 = new Cliente();
+        cliente1.setAnoNascimento(1980);
+
+        var cliente2 = new Cliente();
+        cliente2.setAnoNascimento(2001);
+
+        if(cliente1.getAnoNascimento() == cliente2.getAnoNascimento()){
+            System.out.println("Os clientes nasceram no mesmo ano");
+            System.out.println("O ano que os clientes nasceram é " + cliente1.getAnoNascimento());
+        }
+    }
+}
diff --git a/src/main/java/com/example/AppScanner.java b/src/main/java/com/example/AppScanner.java
new file mode 100644
index 00000000..e2276053
--- /dev/null
+++ b/src/main/java/com/example/AppScanner.java
@@ -0,0 +1,39 @@
+package com.example;
+
+import java.util.Scanner;
+
+import com.example.model.Cliente;
+
+public class AppScanner {
+    public static void main(String[] args) {
+        System.out.println("Criando Classes");
+        Cliente cliente = new Cliente();
+        Scanner scanner = new Scanner(System.in);
+        
+        System.out.println("Digite o nome: ");
+        cliente.setNome(scanner.nextLine());
+
+        System.out.println("Digite o CPF: ");
+        cliente.setCpf(scanner.nextLine());
+
+        System.out.println("Digite a cidade: ");
+        cliente.setCidade(scanner.nextLine());
+
+        System.out.println("Digite a Renda ");
+        cliente.setRenda(scanner.nextDouble());
+
+        System.out.println("Digite o ano de Nascimento: ");
+        cliente.setAnoNascimento(scanner.nextInt());
+        scanner.nextLine();
+
+        System.out.println("Digite o Sexo (M ou F): ");
+        String sexo = scanner.nextLine();
+        cliente.setSexo(sexo.charAt(0));
+
+        System.out.println("Renda: " + cliente.getRenda());
+        System.out.println("Sexo: " + cliente.getSexo());
+        System.out.println("Ano de Nascimento: " + cliente.getAnoNascimento());
+        System.out.println("Especial " + cliente.isEspecial());
+        System.out.println("Nome: " + cliente.getNome());
+        System.out.println("CPF: " + cliente.getCpf());
+    }}
diff --git a/src/main/java/com/example/MathUtil.java b/src/main/java/com/example/MathUtil.java
new file mode 100644
index 00000000..10c20bc5
--- /dev/null
+++ b/src/main/java/com/example/MathUtil.java
@@ -0,0 +1,22 @@
+package com.example;
+
+public class MathUtil {
+    static int mdc(int a, int b){
+        a = Math.abs(a);
+        b = Math.abs(b);        
+        int maior = Math.max(a, b);
+        b = Math.min(a, b);
+        a = maior;
+        
+        if(b>0 && a%b==0)
+            return b;
+
+        if (b==0) {
+            return Math.abs(a);
+        }
+
+        return mdc(a-b, b);
+
+        
+    }
+}
diff --git a/src/main/java/com/example/dao/ConnectionManager.java b/src/main/java/com/example/dao/ConnectionManager.java
new file mode 100644
index 00000000..94b86d6e
--- /dev/null
+++ b/src/main/java/com/example/dao/ConnectionManager.java
@@ -0,0 +1,17 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class ConnectionManager {
+
+    private static final String PASSWORD = "";
+    private static final String USERNAME = "gitpod";
+    private static final String JDBC_URL = "jdbc:postgresql://localhost/postgres";
+
+    public static Connection getConnection() throws SQLException {
+        return DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);
+    }
+    
+}
diff --git a/src/main/java/com/example/dao/DAO.java b/src/main/java/com/example/dao/DAO.java
new file mode 100644
index 00000000..44f5d79b
--- /dev/null
+++ b/src/main/java/com/example/dao/DAO.java
@@ -0,0 +1,41 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class DAO {
+    protected Connection conn;
+
+    public DAO(Connection conn) {
+        this.conn = conn;
+    }
+
+    public void listarDadosTabela(String tabela) {
+        var sql = "select * from " + tabela;
+        try {
+            var statement = conn.createStatement();
+            var result = statement.executeQuery(sql);
+
+            var metadata = result.getMetaData();
+            int cols = metadata.getColumnCount();
+
+            for (int i = 1; i <= cols; i++) {
+                System.out.printf("%-25s | ", metadata.getColumnName(i));
+            }
+            System.out.println();
+
+            while(result.next()){
+                
+                for (int i = 1; i <= cols; i++) {
+                    System.out.printf("%-25s | ", result.getString(i));
+                    
+                }
+                System.out.println("");
+            }
+        } catch (SQLException e) {
+            System.err.println("Não foi possível realizar a consulta: " + e.getMessage());
+        }
+    }
+
+
+}
diff --git a/src/main/java/com/example/dao/EstadoDAO.java b/src/main/java/com/example/dao/EstadoDAO.java
new file mode 100644
index 00000000..ed237bb2
--- /dev/null
+++ b/src/main/java/com/example/dao/EstadoDAO.java
@@ -0,0 +1,81 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.example.model.Estado;
+
+public class EstadoDAO extends DAO{
+    
+
+
+    public EstadoDAO(Connection conn) {
+        super(conn);
+    }
+
+    public List<Estado> listar() throws SQLException {
+        
+            var lista = new LinkedList<Estado>();
+            var statement = conn.createStatement();
+            var result = statement.executeQuery("select * from estado");
+            while(result.next()){
+                var estado = new Estado();
+                estado.setId(result.getLong("id"));
+                estado.setNome(result.getString("nome"));
+                estado.setUf(result.getString("uf"));
+                lista.add(estado);
+            }
+            return lista;    
+    }
+
+    public void localizar(String uf) {
+        try{
+            //var sql = "select * from estado where uf = '" + uf + "'"; //suscetível a SQL Injection
+            var sql = "select * from estado where uf = ?";
+            var statement = conn.prepareStatement(sql);
+            //System.out.println(sql);
+            statement.setString(1, uf);
+            var result = statement.executeQuery();
+            if(result.next()){
+                System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
+            }
+            System.out.println();
+        } catch(SQLException e){
+            System.err.println("Erro ao executar consulta SQL: " + e.getMessage());
+        }        
+    }
+
+    public void alterar(Estado estado) {
+        var sql = "update estado set nome = ?, uf = ?, where id = ?";
+        try (var statement = conn.prepareStatement(sql);){
+            statement.setString(1, estado.getNome());
+            statement.setString(2, estado.getUf());
+            statement.setLong(3, estado.getId());
+            statement.executeUpdate();
+        } catch (SQLException e) {
+            System.err.println("Não foi possível realizar a operação: " + e.getMessage());
+        }
+    }
+
+    public void inserir(Estado estado){
+        var sql = "insert into produto (nome, uf) values (?, ?)";
+        try (var statement = conn.prepareStatement(sql)){
+            statement.setString(1, estado.getNome());
+            statement.setString(2, estado.getUf());
+            
+        } catch (SQLException e) {
+            System.err.println("Não foi possível realizar a operação: " + e.getMessage());
+        }
+    }
+
+    public void excluir(long id){
+        var sql = "delete from estado where id = ?";
+        try (var statement = conn.prepareStatement(sql)){
+            statement.setLong(1, id);
+        } catch (SQLException e) {
+            System.err.println("Não foi possível realizar a operação: " + e.getMessage());
+        }
+    }
+}
diff --git a/src/main/java/com/example/dao/ProdutoDAO.java b/src/main/java/com/example/dao/ProdutoDAO.java
new file mode 100644
index 00000000..d260eb3e
--- /dev/null
+++ b/src/main/java/com/example/dao/ProdutoDAO.java
@@ -0,0 +1,82 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import com.example.model.Produto;
+
+public class ProdutoDAO extends DAO{
+
+    public ProdutoDAO(Connection conn) {
+        super(conn);
+    }
+
+    public void excluir(long id) {
+        var sql = "delete from produto where id = ?";
+        try {
+            var statement = conn.prepareStatement(sql);
+            statement.setLong(1, id);
+            if (statement.executeUpdate() == 1)
+                System.out.println("Produto excluído com sucesso");
+            else
+                System.out.println("O produto não foi localizado");
+        } catch (SQLException e) {
+            System.err.println("Não foi possível realizar a operação: " + e.getMessage());
+        }
+    }
+
+    public void alterar(Produto produto) {
+        var sql = "update produto set nome = ?, marca_id = ?, valor =? where id = ?";
+        try (var statement = conn.prepareStatement(sql);){
+            statement.setString(1, produto.getName());
+            statement.setLong(2, produto.getMarca().getId());
+            statement.setDouble(3, produto.getValor());
+            statement.setLong(4, produto.getId());
+            statement.executeUpdate();
+        } catch (SQLException e) {
+            System.err.println("Não foi possível realizar a operação: " + e.getMessage());
+        }
+    }
+
+    public void inserir(Produto produto) {
+        var sql = "insert into produto (nome, marca_id, valor) values (?, ?, ?)";
+        try (var statement = conn.prepareStatement(sql);){
+            statement.setString(1, produto.getName());
+            statement.setLong(2, produto.getMarca().getId());
+            statement.setDouble(3, produto.getValor());
+            statement.executeUpdate();
+        } catch (SQLException e) {
+            System.err.println("Não foi possível realizar a operação: " + e.getMessage());
+        }
+    }
+
+    public void listar() {
+        try{
+            var statement = conn.createStatement();
+            var result = statement.executeQuery("select * from produto");
+            while(result.next()){
+                System.out.printf("Id: %d Nome: %s ID Marca: %s Valor: %s\n", result.getInt("id"), result.getString("nome"), result.getInt("marca_id"), result.getDouble("valor"));
+            }
+            System.out.println();
+        } catch (SQLException e) {
+            System.err.println("Não foi possível executar a consulta ao banco: " + e.getMessage());
+        }
+    }
+
+    public void localizar(String nome) {
+        try{
+            //var sql = "select * from estado where uf = '" + uf + "'"; //suscetível a SQL Injection
+            var sql = "select * from estado where nome = ?";
+            var statement = conn.prepareStatement(sql);
+            //System.out.println(sql);
+            statement.setString(1, nome);
+            var result = statement.executeQuery();
+            if(result.next()){
+                System.out.printf("Id: %d Nome: %s ID Marca: %s Valor: %s\n", result.getInt("id"), result.getString("nome"), result.getInt("marca_id"), result.getDouble("valor"));
+            }
+            System.out.println();
+        } catch(SQLException e){
+            System.err.println("Erro ao executar consulta SQL: " + e.getMessage());
+        }        
+    }
+}
diff --git a/src/main/java/com/example/model/Cliente.java b/src/main/java/com/example/model/Cliente.java
new file mode 100644
index 00000000..d364df91
--- /dev/null
+++ b/src/main/java/com/example/model/Cliente.java
@@ -0,0 +1,89 @@
+package com.example.model;
+
+public class Cliente{
+    private String nome;
+    private double renda;
+    private char sexo;
+    private int anoNascimento;
+    private boolean especial;
+    private String cpf;
+    private String cidade;
+
+    public Cliente(){
+        double aleatorio = Math.random();
+        if(aleatorio > 0.5)
+            especial = true;
+    }
+
+    public Cliente(double renda, char sexo){
+        this();
+        setRenda(renda);
+        setSexo(sexo);
+    }
+
+    public String getCidade() {
+        return cidade;
+    }
+
+    public void setCidade(String cidade) {
+        this.cidade = cidade;
+    }
+
+    public String getCpf() {
+        return cpf;
+    }
+    public void setCpf(String cpf) {
+        this.cpf = cpf;
+    }
+    
+    public String getNome() {
+        return nome;
+    }
+
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+
+   public boolean isEspecial() {
+    return especial;
+}
+
+    public void setEspecial(boolean especial) {
+        this.especial = especial;
+    }
+
+    public double getRenda() {
+            return renda;
+        }
+
+    public void setRenda(double renda) {
+        if (renda>=0) {
+            this.renda = renda;
+        } else {
+            System.out.println("A renda deve ser maior ou igual a 0");
+        }
+    }
+
+    public int getAnoNascimento() {
+        return anoNascimento;
+    }
+
+    public void setAnoNascimento(int anoNascimento) {
+        this.anoNascimento = anoNascimento;
+    }
+
+    public char getSexo() {
+        return sexo;
+    }
+
+    public void setSexo(char sexo) {
+        if(sexo == 'M' || sexo == 'F')
+            this.sexo = sexo;
+        else
+            System.out.println("Sexo Inválido");
+    }
+
+    public String toString(){
+        return "Cliente" + nome +"Cidade " + cidade;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/model/Estado.java b/src/main/java/com/example/model/Estado.java
new file mode 100644
index 00000000..5e47de50
--- /dev/null
+++ b/src/main/java/com/example/model/Estado.java
@@ -0,0 +1,50 @@
+package com.example.model;
+
+public class Estado {
+    private Long id;
+    private String nome;
+    private String uf;
+    private RegiaoGeografica regiao;
+    private int areKm2;
+    private int populacao;
+
+    public Long getId() {
+        return id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getNome() {
+        return nome;
+    }
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+    public String getUf() {
+        return uf;
+    }
+    public void setUf(String uf) {
+        this.uf = uf;
+    }
+    public RegiaoGeografica getRegiao() {
+        return regiao;
+    }
+    public void setRegiao(RegiaoGeografica regiao) {
+        this.regiao = regiao;
+    }
+    public int getAreKm2() {
+        return areKm2;
+    }
+    public void setAreKm2(int areKm2) {
+        this.areKm2 = areKm2;
+    }
+    public int getPopulacao() {
+        return populacao;
+    }
+    public void setPopulacao(int populacao) {
+        this.populacao = populacao;
+    }
+    public String toString(){
+        return "Estado: " + nome + " ID: " + id + " UF:" + uf;
+    }
+}
diff --git a/src/main/java/com/example/model/Marca.java b/src/main/java/com/example/model/Marca.java
new file mode 100644
index 00000000..f25a4eb3
--- /dev/null
+++ b/src/main/java/com/example/model/Marca.java
@@ -0,0 +1,19 @@
+package com.example.model;
+
+public class Marca {
+    private Long id;
+    private String nome;
+    
+    public Long getId() {
+        return id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getNome() {
+        return nome;
+    }
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+}
diff --git a/src/main/java/com/example/model/Produto.java b/src/main/java/com/example/model/Produto.java
new file mode 100644
index 00000000..43ac8a3a
--- /dev/null
+++ b/src/main/java/com/example/model/Produto.java
@@ -0,0 +1,33 @@
+package com.example.model;
+
+public class Produto {
+    private Long id;
+    private String name;
+    private Marca marca;
+    private Double valor;
+
+    public Double getValor() {
+        return valor;
+    }
+    public void setValor(Double valor) {
+        this.valor = valor;
+    }
+    public Long getId() {
+        return id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    public Marca getMarca() {
+        return marca;
+    }
+    public void setMarca(Marca marca) {
+        this.marca = marca;
+    }
+}
diff --git a/src/main/java/com/example/model/RegiaoGeografica.java b/src/main/java/com/example/model/RegiaoGeografica.java
new file mode 100644
index 00000000..ef8bdfa8
--- /dev/null
+++ b/src/main/java/com/example/model/RegiaoGeografica.java
@@ -0,0 +1,19 @@
+package com.example.model;
+
+public class RegiaoGeografica {
+    private Long id;
+    private String nome;
+    
+    public Long getId() {
+        return id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getNome() {
+        return nome;
+    }
+    public void setNome(String nome) {
+        this.nome = nome;
+    };
+}
diff --git a/src/test/java/com/example/MathUtilTest.java b/src/test/java/com/example/MathUtilTest.java
new file mode 100644
index 00000000..4edea003
--- /dev/null
+++ b/src/test/java/com/example/MathUtilTest.java
@@ -0,0 +1,131 @@
+package com.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class MathUtilTest {
+    @Test
+    void testMdcP1BImpar() {
+        int a = 6, b = 3;
+        int esperado = 3;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP1BPar() {
+        int a = 6, b = 2;
+        int esperado = 2;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP3Negativo() {
+        int a = -6, b = 0;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP3Positivo() {
+        int a = 6, b = 0;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP5() {
+        int a = 6, b = 0;
+        int esperado = MathUtil.mdc(b, a);
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP7() {
+        int a = 6, b = 0;
+        int esperado = MathUtil.mdc(-b, a);
+        int obtido = MathUtil.mdc(-a, -b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP8() {
+        int a = 6;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, a);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP8Negativo() {
+        int a = -6;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, a);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP12DoisPrimos() {
+        int p = 7;
+        int a = p;
+        int esperado = p;
+        int obtido = MathUtil.mdc(a, p);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP12UmPrimo() {
+        int p = 7;
+        int a = 2;
+        int esperado = 1;
+        int obtido = MathUtil.mdc(a, p);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP12PrimoeUm() {
+        int p = 7;
+        int a = 1;
+        int esperado = 1;
+        int obtido = MathUtil.mdc(a, p);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcCasoGeral30e12() {
+        int a = 30;
+        int b = 12;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcCasoGeral12e9() {
+        int a = 12;
+        int b = 9;
+        int esperado = 3;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    
+}
