diff --git a/TDD/biblioteca_test b/TDD/biblioteca_test
index 5fa6b4a1ff76cde638fcf9cacb11eedc32b9228b..8f843d131fb39fe35731bf115fab0f6414f0e910 100755
Binary files a/TDD/biblioteca_test and b/TDD/biblioteca_test differ
diff --git a/TDD/sources/biblioteca-test.cpp b/TDD/sources/biblioteca-test.cpp
index 05603404d0656da8a4cb8212eb6510c0fa61ad1c..681630301b11aee96db362b137e4d0b25c3fc2bb 100644
--- a/TDD/sources/biblioteca-test.cpp
+++ b/TDD/sources/biblioteca-test.cpp
@@ -1,6 +1,7 @@
 #include <iostream>
 #include <tuple>
 #include <chrono>
+#include <memory>
 #include "doctest.h"
 #include "ControladorObras.hpp"
 #include "ControladorUsuarios.hpp"
@@ -45,18 +46,18 @@ TEST_CASE("Biblioteca") {
   CHECK (3 == p.getMes());
 
   cout << "==> Adicionando a obra" << endl;
-  contObras.adicionarObra(p);
+  contObras.adicionarObra(make_shared<Periodico>(p));
   contObras.mostrarDetalhes();
 
-  auto [total, disponiveis] = contObras.pesquisarObra(p);
+  auto [total, disponiveis] = contObras.pesquisarObra(make_shared<Periodico>(p));
   CHECK (1 == total);
   CHECK (1 == disponiveis);
 
   cout << "==> Adicionando mais uma unidade da obra" << endl;
-  contObras.adicionarObra(p);
+  contObras.adicionarObra(make_shared<Periodico>(p));
   contObras.mostrarDetalhes();
 
-  tie(total, disponiveis) = contObras.pesquisarObra(p);
+  tie(total, disponiveis) = contObras.pesquisarObra(make_shared<Periodico>(p));
   CHECK (2 == total);
   CHECK (2 == disponiveis);
 
@@ -71,10 +72,10 @@ TEST_CASE("Biblioteca") {
   CHECK ("Tech Books" == l.getEditora());
 
   cout << "==> Adicionando a obra" << endl;
-  contObras.adicionarObra(l);
+  contObras.adicionarObra(make_shared<Livro>(l));
   contObras.mostrarDetalhes();
 
-  tie(total, disponiveis) = contObras.pesquisarObra(l);
+  tie(total, disponiveis) = contObras.pesquisarObra(make_shared<Livro>(l));
   CHECK (1 == total);
   CHECK (1 == disponiveis);
   cout << "======================================================" << endl;
@@ -84,32 +85,32 @@ TEST_CASE("Biblioteca") {
   chrono::year_month_day epoch = chrono::year_month_day{chrono::year{0}, chrono::month{0}, chrono::day{0}};
 
   cout << "=> Usuario que nao existe tenta realizar um emprestimo: " << endl;
-  chrono::year_month_day dataDevolucao = contUsuarios.registrarEmprestimo("11234", l);
+  chrono::year_month_day dataDevolucao = contUsuarios.registrarEmprestimo("11234", make_shared<Livro>(l));
   CHECK (int(epoch.year()) == int(dataDevolucao.year()));
   CHECK (unsigned(epoch.month()) == unsigned(dataDevolucao.month()));
   CHECK (unsigned(epoch.day()) == unsigned(dataDevolucao.day()));
 
   cout << "=> Usuario que nao existe tenta retornar um emprestimo: " << endl;
-  CHECK (-1 == contUsuarios.retornarEmprestimo("11234", l));
+  CHECK (-1 == contUsuarios.retornarEmprestimo("11234", make_shared<Livro>(l)));
 
   cout << "=> Tenta emprestar uma obra que nao existe " << endl;
   Periodico p1("Revista de Metodos", 2023, 5, 3);
-  dataDevolucao = contUsuarios.registrarEmprestimo("12345", p1);
+  dataDevolucao = contUsuarios.registrarEmprestimo("12345", make_shared<Periodico>(p1));
   CHECK (int(epoch.year()) == int(dataDevolucao.year()));
   CHECK (unsigned(epoch.month()) == unsigned(dataDevolucao.month()));
   CHECK (unsigned(epoch.day()) == unsigned(dataDevolucao.day()));
 
   cout << "=> Tenta retornar uma obra que nao existe " << endl;
-  CHECK (-1 == contUsuarios.retornarEmprestimo("12345", p1));
+  CHECK (-1 == contUsuarios.retornarEmprestimo("12345", make_shared<Periodico>(p1)));
 
   cout << "=> Empresta uma obra que existe: " << endl;
-  dataDevolucao = contUsuarios.registrarEmprestimo("12345", p);
+  dataDevolucao = contUsuarios.registrarEmprestimo("12345", make_shared<Periodico>(p));
   CHECK (int(hoje.year()) == int(dataDevolucao.year()));
   CHECK (unsigned(hoje.month()) == unsigned(dataDevolucao.month()));
   CHECK (unsigned(hoje.day()) == unsigned(dataDevolucao.day()));
 
   cout << "=> Retorna uma obra que existe: " << endl;
-  CHECK (0 == contUsuarios.retornarEmprestimo("12345", p));
+  CHECK (0 == contUsuarios.retornarEmprestimo("12345", make_shared<Periodico>(p)));
 
   //obra existe e ja tem tres emprestimos
   //usuario devolveu com atraso, nao pode emprestar depois
diff --git a/sources/ControladorObras.cpp b/sources/ControladorObras.cpp
index 73ab46fdc11e5a2a8ddb15f430d36c51b0c23188..1d17dbd488f71cbf424bb3c535a7cb2a0cd313a2 100644
--- a/sources/ControladorObras.cpp
+++ b/sources/ControladorObras.cpp
@@ -19,7 +19,7 @@ ControladorObras& ControladorObras::getInstance() {
 void ControladorObras::mostrarDetalhes() const {
   cout << endl << "> LISTANDO OBRAS DO SISTEMA:" << endl << endl;
   for (const auto& obra : this->obras) {
-    obra.mostrarDetalhes();
+    obra->mostrarDetalhes();
     cout << endl << "-----" << endl << endl;
   }
 }
@@ -28,52 +28,52 @@ void ControladorObras::mostrarDetalhes() const {
 pair<int, int> ControladorObras::pesquisarObra(shared_ptr<DescricaoObra> descricao){
   pair <int, int> p = make_pair(0, 0);
 
-  auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) {
-      return descricao->getTitulo() == d.getTitulo();
+  auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](shared_ptr<Obra>(obra)) {
+      return descricao->getTitulo() == obra->getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
     cout << "> Erro: Obra não encontrada" << endl;
   } else {
-    p = make_pair(it_obra->getTotal(), it_obra->getDisponiveis());
+    p = make_pair((*it_obra)->getTotal(), (*it_obra)->getDisponiveis());
   }
 
   return p;
 }
 
 void ControladorObras::adicionarObra(shared_ptr<DescricaoObra> descricao) {
-  auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) {
-      return descricao->getTitulo() == d.getTitulo();
+  auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](shared_ptr<Obra>(obra)) {
+      return descricao->getTitulo() == obra->getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
-    this->obras.push_back(Obra(descricao));
+    this->obras.push_back(make_shared<Obra>(Obra(descricao)));
   } else {
-    it_obra->adicionarObra();
+    (*it_obra)->adicionarObra();
   }
 }
 
 bool ControladorObras::solicitarEmprestimo(shared_ptr<DescricaoObra> descricao){
-  auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) {
-      return descricao->getTitulo() == d.getTitulo();
+  auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](shared_ptr<Obra>(obra)) {
+      return descricao->getTitulo() == obra->getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
     return false;
   }
 
-  return it_obra->emprestar();
+  return (*it_obra)->emprestar();
 }
 
 
 bool ControladorObras::devolverEmprestimo(shared_ptr<DescricaoObra> descricao){
-  auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) {
-      return descricao->getTitulo() == d.getTitulo();
-      });
+  auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](shared_ptr<Obra>(obra)) {
+      return descricao->getTitulo() == obra->getTitulo();
+  });
 
   if (it_obra == this->obras.end()) {
     return false;
   }
 
-  return it_obra->devolver();
+  return (*it_obra)->devolver();
 }
diff --git a/sources/ControladorObras.hpp b/sources/ControladorObras.hpp
index 09dac116e500dfa9fe2c46a3d7273c268f4a67fb..0a25dfe986e411ab64b3a5d68e8214466b5f2792 100644
--- a/sources/ControladorObras.hpp
+++ b/sources/ControladorObras.hpp
@@ -14,7 +14,7 @@ class ControladorObras {
   private:
     // Constructor
     ControladorObras();
-    vector<Obra> obras;
+    vector<shared_ptr<Obra>> obras;
 
   public: