diff --git a/sources/ControladorObras.cpp b/sources/ControladorObras.cpp
index 76b457767c049648de8570a225a0bca652d7e6c9..73ab46fdc11e5a2a8ddb15f430d36c51b0c23188 100644
--- a/sources/ControladorObras.cpp
+++ b/sources/ControladorObras.cpp
@@ -1,5 +1,6 @@
 #include <iostream>
 #include <algorithm>
+#include <memory>
 
 #include "ControladorObras.hpp"
 
@@ -18,17 +19,17 @@ 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;
   }
 }
 
 // Methods
-pair<int, int> ControladorObras::pesquisarObra(DescricaoObra& descricao){
+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();
+      return descricao->getTitulo() == d.getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
@@ -40,22 +41,21 @@ pair<int, int> ControladorObras::pesquisarObra(DescricaoObra& descricao){
   return p;
 }
 
-void ControladorObras::adicionarObra(DescricaoObra& descricao){
+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();
+      return descricao->getTitulo() == d.getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
-    Obra obra(descricao);
-    this->obras.push_back(obra);        
+    this->obras.push_back(Obra(descricao));
   } else {
     it_obra->adicionarObra();
   }
 }
 
-bool ControladorObras::solicitarEmprestimo(DescricaoObra& descricao){
+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();
+      return descricao->getTitulo() == d.getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
@@ -66,9 +66,9 @@ bool ControladorObras::solicitarEmprestimo(DescricaoObra& descricao){
 }
 
 
-bool ControladorObras::devolverEmprestimo(DescricaoObra& descricao){
+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();
+      return descricao->getTitulo() == d.getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
diff --git a/sources/ControladorObras.hpp b/sources/ControladorObras.hpp
index 757a317288c190bb7b64629a85acd32ed3826238..09dac116e500dfa9fe2c46a3d7273c268f4a67fb 100644
--- a/sources/ControladorObras.hpp
+++ b/sources/ControladorObras.hpp
@@ -3,6 +3,7 @@
 
 #include <vector>
 #include <string>
+#include <memory>
 
 #include "Obra.hpp"
 #include "DescricaoObra.hpp"
@@ -20,10 +21,10 @@ class ControladorObras {
     // Methods
     static ControladorObras& getInstance();
     void mostrarDetalhes() const;
-    pair<int, int> pesquisarObra(DescricaoObra& descricao);
-    void adicionarObra(DescricaoObra& descricao);
-    bool solicitarEmprestimo(DescricaoObra& descricao);
-    bool devolverEmprestimo(DescricaoObra& descricao);
+    pair<int, int> pesquisarObra(shared_ptr<DescricaoObra> descricao);
+    void adicionarObra(shared_ptr<DescricaoObra> descricao);
+    bool solicitarEmprestimo(shared_ptr<DescricaoObra> descricao);
+    bool devolverEmprestimo(shared_ptr<DescricaoObra> descricao);
 
 };
 
diff --git a/sources/ControladorUsuarios.cpp b/sources/ControladorUsuarios.cpp
index bb89a168ef1d6fe8e13feb109185298951f99c0f..44d95f19db611d2f81b3cabd372cc8fd42786b73 100644
--- a/sources/ControladorUsuarios.cpp
+++ b/sources/ControladorUsuarios.cpp
@@ -1,6 +1,7 @@
 #include <iostream>
 #include <algorithm>
 #include <chrono>
+#include <memory>
 
 #include "ControladorUsuarios.hpp"
 #include "Usuario.hpp"
@@ -44,7 +45,7 @@ bool ControladorUsuarios::adicionarUsuario(string nome, string CPF, string ender
 }
 
 
-chrono::year_month_day ControladorUsuarios::registrarEmprestimo(string CPF, DescricaoObra& descricao){
+chrono::year_month_day ControladorUsuarios::registrarEmprestimo(string CPF, shared_ptr<DescricaoObra> descricao){
 
   // Search for user
   auto it = find_if(usuarios.begin(), usuarios.end(), [CPF](Usuario& u) {
@@ -65,7 +66,7 @@ chrono::year_month_day ControladorUsuarios::registrarEmprestimo(string CPF, Desc
 }
 
 
-int ControladorUsuarios::retornarEmprestimo(string CPF, DescricaoObra& descricao){
+int ControladorUsuarios::retornarEmprestimo(string CPF, shared_ptr<DescricaoObra> descricao){
 
   // Search for user
   auto it = find_if(usuarios.begin(), usuarios.end(), [CPF](Usuario& u) {
diff --git a/sources/ControladorUsuarios.hpp b/sources/ControladorUsuarios.hpp
index 0a6af4f0f238c9954ce827217e2982ea1710e7b2..28e41e245be002fde9c40997b8f53e2858f17f8d 100644
--- a/sources/ControladorUsuarios.hpp
+++ b/sources/ControladorUsuarios.hpp
@@ -4,6 +4,7 @@
 #include <chrono>
 #include <string>
 #include <vector>
+#include <memory>
 
 #include "DescricaoObra.hpp"
 #include "Usuario.hpp"
@@ -22,8 +23,8 @@ class ControladorUsuarios {
     // Methods
     static ControladorUsuarios& getInstance();
     bool adicionarUsuario(string nome, string CPF, string endereco, string telefone, string email);
-    chrono::year_month_day registrarEmprestimo(string CPF, DescricaoObra& descricao);
-    int retornarEmprestimo(string CPF, DescricaoObra& descricao);
+    chrono::year_month_day registrarEmprestimo(string CPF, shared_ptr<DescricaoObra> descricao);
+    int retornarEmprestimo(string CPF, shared_ptr<DescricaoObra> descricao);
     int recuperarMultas(string CPF);
     bool registrarMultaPaga(string CPF, int valor);
     
diff --git a/sources/DescricaoObra.cpp b/sources/DescricaoObra.cpp
index 17653075e4429b36b38b74783f7563ef19697a0e..ed32a486795bb4123ea47b7eae9cf3fa253fecf8 100644
--- a/sources/DescricaoObra.cpp
+++ b/sources/DescricaoObra.cpp
@@ -1,27 +1,25 @@
 #include <iostream>
 
 #include "DescricaoObra.hpp"
+#include "Livro.hpp"
+#include "Periodico.hpp"
 
 using namespace std;
 
 // Constructor
-DescricaoObra::DescricaoObra(const string& tipo, const string& titulo, int ano) 
-    : tipo(tipo), titulo(titulo), anoPublicacao(ano) {}
+DescricaoObra::DescricaoObra(const string& titulo, int ano) 
+    : titulo(titulo), anoPublicacao(ano) {}
 
 void DescricaoObra::mostrarDetalhes() const {
-    cout << "Título: " << titulo << "\n";
-    cout << "Ano de Publicação: " << anoPublicacao << "\n";
+    cout << "Título: " << this->getTitulo() << "\n";
+    cout << "Ano de Publicação: " << this->getAnoPublicacao() << "\n";
 }
 
 // Methods
-string DescricaoObra::getTipo() const {
-    return this->tipo;
-}
-
 string DescricaoObra::getTitulo() const {
   return this->titulo;
 }
 
 int DescricaoObra::getAnoPublicacao() const {
   return this->anoPublicacao;
-}
+}
\ No newline at end of file
diff --git a/sources/DescricaoObra.hpp b/sources/DescricaoObra.hpp
index a58d412a563dcc6121d04b4826006b0f9c837b62..c79d5a1b67b548b4e35a043991e43f4887c01139 100644
--- a/sources/DescricaoObra.hpp
+++ b/sources/DescricaoObra.hpp
@@ -9,20 +9,17 @@ class DescricaoObra {
   private:
 
   protected:
-    string tipo;
     string titulo;
     int anoPublicacao;
 
   public:
     // Contructor
-    DescricaoObra() {};
-    DescricaoObra(const string& tipo, const string& titulo, int ano);
-    virtual void mostrarDetalhes() const = 0;
+    DescricaoObra(const string& titulo, int ano);
 
     // Methods
     string getTitulo() const ;
-    string getTipo() const ;
     int getAnoPublicacao() const ;
+    virtual void mostrarDetalhes() const = 0;
 };
 
 
diff --git a/sources/Emprestimo.cpp b/sources/Emprestimo.cpp
index 1a6ca08a85dec1f0468f7cf80bac1609b7d05b11..1f6388d9dc276700af505b608905922c4a956237 100644
--- a/sources/Emprestimo.cpp
+++ b/sources/Emprestimo.cpp
@@ -1,5 +1,6 @@
 #include <iostream>
 #include <chrono>
+#include <memory>
 
 #include "Emprestimo.hpp"
 #include "DescricaoObra.hpp"
@@ -8,7 +9,7 @@
 using namespace std;
 
 // Constructor
-Emprestimo::Emprestimo(DescricaoObra& descricao)
+Emprestimo::Emprestimo(shared_ptr<DescricaoObra> descricao)
   : descricao(descricao) {
 
   const chrono::time_point now{chrono::system_clock::now()};
@@ -21,11 +22,11 @@ Emprestimo::Emprestimo(DescricaoObra& descricao)
 }
 
 void Emprestimo::mostraDetalhes() const {
+  this->descricao->mostrarDetalhes();
   cout << "Data de devolução: ";
   cout << static_cast<unsigned>(this->dataEmprestimo.day()) << "/";
   cout << static_cast<unsigned>(this->dataEmprestimo.month()) << "/";
   cout << static_cast<int>(this->dataEmprestimo.year()) << endl;
-  descricao.mostrarDetalhes();
 }
 
 
@@ -44,5 +45,5 @@ chrono::year_month_day Emprestimo::getDataDevolucao() {
 }
 
 string Emprestimo::getDescricaoTitulo(){
-  return this->descricao.getTitulo();
+  return this->descricao->getTitulo();
 }
diff --git a/sources/Emprestimo.hpp b/sources/Emprestimo.hpp
index 92394761bc06811e5884c4b2546147d4ad646315..b5ea1967f88c7d1f1a46f2fc7ac0856f563c57c6 100644
--- a/sources/Emprestimo.hpp
+++ b/sources/Emprestimo.hpp
@@ -2,17 +2,17 @@
 #define __EMPRESTIMO__
 
 #include <chrono>
+#include <memory>
 #include "DescricaoObra.hpp"
 
 class Emprestimo {
   private:
     std::chrono::year_month_day dataEmprestimo;
-    DescricaoObra &descricao;
+    shared_ptr<DescricaoObra> descricao;
 
   public:
     // Constructor
-    Emprestimo();
-    Emprestimo(DescricaoObra& descricao);
+    Emprestimo(shared_ptr<DescricaoObra> descricao);
     void mostraDetalhes() const;
 
     // Methods
diff --git a/sources/Livro.cpp b/sources/Livro.cpp
index a1996ff5f16eb1a092a87052ebe21fe24daea5c2..87d066307091c04525d7bb9199dc3e30990dded1 100644
--- a/sources/Livro.cpp
+++ b/sources/Livro.cpp
@@ -5,15 +5,18 @@
 
 using namespace std;
 
-Livro::Livro(const DescricaoObra& outro) {
-  if (outro.getTipo() == "livro") {
-    Livro l = static_cast<Livro>(outro);
-    Livro(l.getTitulo(), l.getAnoPublicacao(), l.getAutor(), l.getEditora());
+Livro::Livro(const DescricaoObra& outro) 
+ : DescricaoObra(outro.getTitulo(), outro.getAnoPublicacao())
+{
+  const Livro* l = dynamic_cast<const Livro*>(&outro);
+  if (l != nullptr) {
+    this->autor = l->getAutor();
+    this->editora = l->getEditora();
   }
 }
 
 Livro::Livro(const string& t, int ano, const string& a, const string& e)
-  : DescricaoObra("livro", t, ano), autor(a), editora(e) {}
+  : DescricaoObra(t, ano), autor(a), editora(e) {}
 
 // Description
 void Livro::mostrarDetalhes() const {
@@ -29,4 +32,4 @@ string Livro::getAutor() const {
 
 string Livro::getEditora() const {
   return this->editora;
-}
+}
\ No newline at end of file
diff --git a/sources/Livro.hpp b/sources/Livro.hpp
index f3b8d4182c9762f2edd546f8364f0f2536907179..65e698b1386d23860a9d78caad4bde4e28a4b02e 100644
--- a/sources/Livro.hpp
+++ b/sources/Livro.hpp
@@ -20,7 +20,6 @@ class Livro: public DescricaoObra {
     // Methods
     string getAutor() const ;
     string getEditora() const ;
-
 };
 
 #endif // !__LIVRO__
diff --git a/sources/Obra.cpp b/sources/Obra.cpp
index 333ef874e1a8e67a4381fa3986a6701ad99f24d4..db17acc4ff35dd1cab5e1be5d35615727ae662d4 100644
--- a/sources/Obra.cpp
+++ b/sources/Obra.cpp
@@ -6,11 +6,11 @@
 #include "Periodico.hpp"
 
 // Constructor
-Obra::Obra(DescricaoObra& descricao)
+Obra::Obra(shared_ptr<DescricaoObra> descricao)
   : descricao(descricao), disponiveis(1), total(1) {}
 
 void Obra::mostrarDetalhes() const {
-  this->descricao.mostrarDetalhes();
+  this->descricao->mostrarDetalhes();
   std::cout << "Quantidade disponivel: " << disponiveis << "\n";
   std::cout << "Quantidade total: " << total << "\n";
 }
@@ -40,7 +40,7 @@ void Obra::adicionarObra(){
 }
 
 string Obra::getTitulo() {
-  return this->descricao.getTitulo();
+  return this->descricao->getTitulo();
 }
 
 int Obra::getDisponiveis(){
diff --git a/sources/Obra.hpp b/sources/Obra.hpp
index 9ce0c8af569ce62e9198c110e95819a84f950c1f..a68ed09dbd2f0f0fa26a766ae29fb003607bc5bc 100644
--- a/sources/Obra.hpp
+++ b/sources/Obra.hpp
@@ -1,18 +1,18 @@
 #ifndef __OBRA__
 #define __OBRA__
 
+#include <memory>
 #include "DescricaoObra.hpp"
 
 class Obra {
   private:
-    DescricaoObra& descricao;
+    shared_ptr<DescricaoObra> descricao;
     int disponiveis;
     int total;
 
   public:
     // Contructor
-    Obra();
-    Obra(DescricaoObra& descricao);
+    Obra(shared_ptr<DescricaoObra> descricao);
     void mostrarDetalhes() const;
 
     // Methods
diff --git a/sources/Periodico.cpp b/sources/Periodico.cpp
index b1b0e62e79151b17db0b5194d23ee6d2353c1e2b..ce93ab52e07609c7f9eb52ba66dee1ff2596c2ec 100644
--- a/sources/Periodico.cpp
+++ b/sources/Periodico.cpp
@@ -3,15 +3,18 @@
 #include "Periodico.hpp"
 
 // Contructor
-Periodico::Periodico(const DescricaoObra& outro) {
-  if (outro.getTipo() == "livro") {
-    Periodico p = static_cast<Periodico>(outro);
-    Periodico(p.getTitulo(), p.getAnoPublicacao(), p.getVolume(), p.getMes());
+Periodico::Periodico(const DescricaoObra& outro) 
+ : DescricaoObra(outro.getTitulo(), outro.getAnoPublicacao())
+{
+  const Periodico* p = dynamic_cast<const Periodico*>(&outro);
+  if (p != nullptr) {
+    this->volume = p->getVolume();
+    this->mes = p->getMes();
   }
 }
 
 Periodico::Periodico(const std::string& t, int ano, int vol, int m)
-    : DescricaoObra("periodico", t, ano), volume(vol), mes(m) {}
+    : DescricaoObra(t, ano), volume(vol), mes(m) {}
 
 void Periodico::mostrarDetalhes() const {
     DescricaoObra::mostrarDetalhes();
@@ -26,4 +29,4 @@ int Periodico::getVolume() const {
 
 int Periodico::getMes() const {
   return this->mes;
-}
+}
\ No newline at end of file
diff --git a/sources/Periodico.hpp b/sources/Periodico.hpp
index 879a3109c771fcd08dfb8a57ae0e8581ca892e30..fad54aae33be92c9395332cda729b1a6e1b78a2b 100644
--- a/sources/Periodico.hpp
+++ b/sources/Periodico.hpp
@@ -19,7 +19,6 @@ class Periodico: public DescricaoObra {
     // Methods
     int getVolume() const;
     int getMes() const;
-
 };
 
 
diff --git a/sources/Usuario.cpp b/sources/Usuario.cpp
index 4864d5127cb18854a8c08d8f179db14d9d56341d..13569d11638f3305916d716a4ef0fe93c4076c85 100644
--- a/sources/Usuario.cpp
+++ b/sources/Usuario.cpp
@@ -2,6 +2,7 @@
 #include <iostream>
 #include <algorithm>
 #include <chrono>
+#include <memory>
 
 #include "Emprestimo.hpp"
 #include "Usuario.hpp"
@@ -25,7 +26,7 @@ void Usuario::mostrarDetalhes() const {
 
 
 // Methods
-chrono::year_month_day Usuario::emprestar(DescricaoObra& descricao){
+chrono::year_month_day Usuario::emprestar(shared_ptr<DescricaoObra> descricao){
 
   // Check number of Borrowed works
   if (this->emprestimos->size() >= 3) {
@@ -45,11 +46,11 @@ chrono::year_month_day Usuario::emprestar(DescricaoObra& descricao){
   }
 }
 
-bool Usuario::devolver(DescricaoObra& descricao){
+bool Usuario::devolver(shared_ptr<DescricaoObra> descricao){
 
   // Search for Borrowed work
   auto emp_it = find_if(this->emprestimos->begin(), this->emprestimos->end(), [&descricao](Emprestimo& emp){
-      return emp.getDescricaoTitulo() == descricao.getTitulo();
+      return emp.getDescricaoTitulo() == descricao->getTitulo();
     });
   
   if (emp_it == this->emprestimos->end()){
diff --git a/sources/Usuario.hpp b/sources/Usuario.hpp
index eac1f58fba0a291e9516d40d924481b7b13103a2..15bdace32e64aa2706e0dfc45e9bb63b0f120a5f 100644
--- a/sources/Usuario.hpp
+++ b/sources/Usuario.hpp
@@ -4,6 +4,7 @@
 #include <string>
 #include <vector>
 #include <chrono>
+#include <memory>
 
 #include "DescricaoObra.hpp"
 #include "Emprestimo.hpp"
@@ -28,8 +29,8 @@ class Usuario {
     void mostrarDetalhes() const;
 
     // Methods
-    std::chrono::year_month_day emprestar(DescricaoObra& descricao);
-    bool devolver(DescricaoObra& descricao);
+    std::chrono::year_month_day emprestar(shared_ptr<DescricaoObra> descricao);
+    bool devolver(shared_ptr<DescricaoObra> descricao);
     int atualizarMulta(int valor);    // Increase fee
     string getCPF();
     int getMulta();
diff --git a/sources/main.cpp b/sources/main.cpp
index 6da14af43610febb4a7751f7b649a5f5e0e80fe9..0b5ae75f0da0c49cf0d116197637a7949701a119 100644
--- a/sources/main.cpp
+++ b/sources/main.cpp
@@ -1,6 +1,7 @@
 #include <iostream>
 #include <string>
 #include <limits>
+#include <memory>
 
 #include "Biblioteca.hpp"
 #include "Livro.hpp"
@@ -82,13 +83,11 @@ int main(){
 
   // Cria Periodicos
   cout << "> Criando Periodicos" << endl;
-  Periodico p("Revista de Ciência", 2023, 5, 3);
-  contObras.adicionarObra(p);
+  contObras.adicionarObra(make_shared<Periodico>("Revista de Ciência", 2023, 5, 3));
 
   // Cria Livros
   cout << "> Criando Livros" << endl;
-  Livro l("C++ Programming", 2022, "John Doe", "Tech Books");
-  contObras.adicionarObra(l);
+  contObras.adicionarObra(make_shared<Livro>("C++ Programming", 2022, "John Doe", "Tech Books"));
 
   contObras.mostrarDetalhes();
 
@@ -142,15 +141,13 @@ int main(){
           cout << "Entre com o ano: ";        cin >> ano;
           cout << "Entre com o volume: ";     cin >> volume;
           cout << "Entre com o mês: ";        cin >> mes;
-          Periodico per(titulo, ano, volume, mes);
-          contObras.adicionarObra(per);
+          contObras.adicionarObra(make_shared<Periodico>(titulo, ano, volume, mes));
         } else if (tipoObra == "livro") {
           cout << "Entre com o titulo: ";     getline(cin, titulo);
           cout << "Entre com o ano: ";        cin >> ano; cin.ignore();
           cout << "Entre com o autor: ";      getline(cin, autor);
           cout << "Entre com o editora: ";    getline(cin, editora);
-          Livro liv(titulo, ano, autor, editora);
-          contObras.adicionarObra(liv);
+          contObras.adicionarObra(make_shared<Livro>(titulo, ano, autor, editora));
         } else { cout << "Erro: Tipo não recinhecido! Ignorando operação" << endl; }
         break;
 
@@ -176,15 +173,13 @@ int main(){
           cout << "Entre com o ano: ";        cin >> ano;           
           cout << "Entre com o volume: ";     cin >> volume;        
           cout << "Entre com o mês: ";        cin >> mes;           
-          Periodico per(titulo, ano, volume, mes);
-          contObras.solicitarEmprestimo(per);
+          contObras.solicitarEmprestimo(make_shared<Periodico>(titulo, ano, volume, mes));
         } else if (tipoObra == "livro") {
           cout << "Entre com o titulo: ";     getline(cin, titulo);     
           cout << "Entre com o ano: ";        cin >> ano; cin.ignore();              
           cout << "Entre com o autor: ";      getline(cin, autor);      
           cout << "Entre com o editora: ";    getline(cin, editora);    
-          Livro liv(titulo, ano, autor, editora);
-          contObras.solicitarEmprestimo(liv);
+          contObras.solicitarEmprestimo(make_shared<Livro>(titulo, ano, autor, editora));
         } else { cout << "Erro: Tipo não reconhecido! Ignorando operação" << endl; }
         break;
 
@@ -195,15 +190,13 @@ int main(){
           cout << "Entre com o ano: ";        cin >> ano;            
           cout << "Entre com o volume: ";     cin >> volume;         
           cout << "Entre com o mês: ";        cin >> mes;            
-          Periodico per(titulo, ano, volume, mes);
-          contObras.devolverEmprestimo(per);
+          contObras.devolverEmprestimo(make_shared<Periodico>(titulo, ano, volume, mes));
         } else if (tipoObra == "livro") {
           cout << "Entre com o titulo: ";     getline(cin, titulo);  
           cout << "Entre com o ano: ";        cin >> ano; cin.ignore();            
           cout << "Entre com o autor: ";      getline(cin, autor);   
           cout << "Entre com o editora: ";    getline(cin, editora); 
-          Livro liv(titulo, ano, autor, editora);
-          contObras.devolverEmprestimo(liv);
+          contObras.devolverEmprestimo(make_shared<Livro>(titulo, ano, autor, editora));
         } else { cout << "Erro: Tipo não reconhecido! Ignorando operação" << endl; }
         break;