diff --git a/common/embedded_files.cpp b/common/embedded_files.cpp
index 5e0a4c42fd..2ece333880 100644
--- a/common/embedded_files.cpp
+++ b/common/embedded_files.cpp
@@ -523,3 +523,56 @@ const std::vector<wxString>* EMBEDDED_FILES::UpdateFontFiles()
 
     return &m_fontFiles;
 }
+
+// Move constructor
+EMBEDDED_FILES::EMBEDDED_FILES( EMBEDDED_FILES&& other ) noexcept :
+        m_files( std::move( other.m_files ) ),
+        m_fontFiles( std::move( other.m_fontFiles ) ),
+        m_fileAddedCallback( std::move( other.m_fileAddedCallback ) ),
+        m_embedFonts( other.m_embedFonts )
+{
+    other.m_embedFonts = false;
+}
+
+// Move assignment operator
+EMBEDDED_FILES& EMBEDDED_FILES::operator=(EMBEDDED_FILES&& other) noexcept
+{
+    if (this != &other)
+    {
+        ClearEmbeddedFiles();
+        m_files = std::move( other.m_files );
+        m_fontFiles = std::move( other.m_fontFiles );
+        m_fileAddedCallback = std::move( other.m_fileAddedCallback );
+        m_embedFonts = other.m_embedFonts;
+        other.m_embedFonts = false;
+    }
+    return *this;
+}
+
+// Copy constructor
+EMBEDDED_FILES::EMBEDDED_FILES( const EMBEDDED_FILES& other ) : m_embedFonts( other.m_embedFonts )
+{
+    for( const auto& [name, file] : other.m_files )
+    {
+        m_files[name] = new EMBEDDED_FILE( *file );
+    }
+    m_fontFiles = other.m_fontFiles;
+    m_fileAddedCallback = other.m_fileAddedCallback;
+}
+
+// Copy assignment operator
+EMBEDDED_FILES& EMBEDDED_FILES::operator=( const EMBEDDED_FILES& other )
+{
+    if( this != &other )
+    {
+        ClearEmbeddedFiles();
+        for( const auto& [name, file] : other.m_files )
+        {
+            m_files[name] = new EMBEDDED_FILE( *file );
+        }
+        m_fontFiles = other.m_fontFiles;
+        m_fileAddedCallback = other.m_fileAddedCallback;
+        m_embedFonts = other.m_embedFonts;
+    }
+    return *this;
+}
diff --git a/eeschema/dialogs/dialog_lib_symbol_properties.cpp b/eeschema/dialogs/dialog_lib_symbol_properties.cpp
index e5a7116e22..c4775ae73f 100644
--- a/eeschema/dialogs/dialog_lib_symbol_properties.cpp
+++ b/eeschema/dialogs/dialog_lib_symbol_properties.cpp
@@ -74,7 +74,7 @@ DIALOG_LIB_SYMBOL_PROPERTIES::DIALOG_LIB_SYMBOL_PROPERTIES( SYMBOL_EDIT_FRAME* a
 
     // Give a bit more room for combobox editors
     m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
-    m_fields = new FIELDS_GRID_TABLE( this, aParent, m_grid, m_libEntry );
+    m_fields = new FIELDS_GRID_TABLE( this, aParent, m_grid, m_libEntry, m_embeddedFiles->GetLocalFiles() );
     m_grid->SetTable( m_fields );
     m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, aLibEntry,
                                                       [&]( wxCommandEvent& aEvent )
@@ -89,7 +89,7 @@ DIALOG_LIB_SYMBOL_PROPERTIES::DIALOG_LIB_SYMBOL_PROPERTIES( SYMBOL_EDIT_FRAME* a
 
     wxGridCellAttr* attr = new wxGridCellAttr;
     attr->SetEditor( new GRID_CELL_URL_EDITOR( this, PROJECT_SCH::SchSearchS( &Prj() ),
-                                               aLibEntry ) );
+                                               m_embeddedFiles->GetLocalFiles() ) );
     m_grid->SetAttr( DATASHEET_FIELD, FDC_VALUE, attr );
 
     m_SymbolNameCtrl->SetValidator( FIELD_VALIDATOR( VALUE_FIELD ) );
@@ -515,7 +515,6 @@ bool DIALOG_LIB_SYMBOL_PROPERTIES::TransferDataFromWindow()
     // occurs.
     m_Parent->SetShowDeMorgan( m_hasAlternateBodyStyles->GetValue() );
 
-    m_embeddedFiles->TransferDataFromWindow();
     return true;
 }
 
diff --git a/eeschema/dialogs/dialog_symbol_properties.cpp b/eeschema/dialogs/dialog_symbol_properties.cpp
index 0c637aa449..3da78b4978 100644
--- a/eeschema/dialogs/dialog_symbol_properties.cpp
+++ b/eeschema/dialogs/dialog_symbol_properties.cpp
@@ -327,7 +327,7 @@ DIALOG_SYMBOL_PROPERTIES::DIALOG_SYMBOL_PROPERTIES( SCH_EDIT_FRAME* aParent,
     // so we need to handle m_part == nullptr
     // wxASSERT( m_part );
 
-    m_fields = new FIELDS_GRID_TABLE( this, aParent, m_fieldsGrid, m_symbol );
+    m_fields = new FIELDS_GRID_TABLE( this, aParent, m_fieldsGrid, m_symbol, &aParent->Schematic() );
 
     // Give a bit more room for combobox editors
     m_fieldsGrid->SetDefaultRowSize( m_fieldsGrid->GetDefaultRowSize() + 4 );
diff --git a/eeschema/fields_grid_table.cpp b/eeschema/fields_grid_table.cpp
index f4890f5b4f..d23403bca8 100644
--- a/eeschema/fields_grid_table.cpp
+++ b/eeschema/fields_grid_table.cpp
@@ -131,11 +131,12 @@ static wxString netList( LIB_SYMBOL* aSymbol )
 
 
 FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_BASE_FRAME* aFrame, WX_GRID* aGrid,
-                                      LIB_SYMBOL* aSymbol ) :
+                                      LIB_SYMBOL* aSymbol, EMBEDDED_FILES* aFiles ) :
         m_frame( aFrame ),
         m_dialog( aDialog ),
         m_parentType( SCH_SYMBOL_T ),
         m_part( aSymbol ),
+        m_files( aFiles ),
         m_symbolNetlist( netList( aSymbol ) ),
         m_fieldNameValidator( FIELD_NAME ),
         m_referenceValidator( REFERENCE_FIELD ),
@@ -149,11 +150,12 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_BASE_FRAME* aFra
 
 
 FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
-                                      SCH_SYMBOL* aSymbol ) :
+                                      SCH_SYMBOL* aSymbol, EMBEDDED_FILES* aFiles ) :
         m_frame( aFrame ),
         m_dialog( aDialog ),
         m_parentType( SCH_SYMBOL_T ),
         m_part( aSymbol->GetLibSymbolRef().get() ),
+        m_files( aFiles ),
         m_symbolNetlist( netList( aSymbol, aFrame->GetCurrentSheet() ) ),
         m_fieldNameValidator( FIELD_NAME ),
         m_referenceValidator( REFERENCE_FIELD ),
@@ -167,11 +169,12 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFra
 
 
 FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
-SCH_SHEET* aSheet ) :
+                                      SCH_SHEET* aSheet ) :
         m_frame( aFrame ),
         m_dialog( aDialog ),
         m_parentType( SCH_SHEET_T ),
         m_part( nullptr ),
+        m_files( nullptr ),
         m_fieldNameValidator( FIELD_NAME ),
         m_referenceValidator( SHEETNAME_V ),
         m_valueValidator( VALUE_FIELD ),
@@ -257,21 +260,9 @@ void FIELDS_GRID_TABLE::initGrid( WX_GRID* aGrid )
     fpIdEditor->SetValidator( m_nonUrlValidator );
     m_footprintAttr->SetEditor( fpIdEditor );
 
-    EMBEDDED_FILES* files = nullptr;
-
-    if( m_frame->GetFrameType() == FRAME_SCH )
-    {
-        files = m_frame->GetScreen()->Schematic();
-    }
-    else if( m_frame->GetFrameType() == FRAME_SCH_SYMBOL_EDITOR
-          || m_frame->GetFrameType() == FRAME_SCH_VIEWER )
-    {
-        files = m_part;
-    }
-
     m_urlAttr = new wxGridCellAttr;
     SEARCH_STACK* prjSearchStack = PROJECT_SCH::SchSearchS( &m_frame->Prj() );
-    GRID_CELL_URL_EDITOR* urlEditor = new GRID_CELL_URL_EDITOR( m_dialog, prjSearchStack, files );
+    GRID_CELL_URL_EDITOR* urlEditor = new GRID_CELL_URL_EDITOR( m_dialog, prjSearchStack, m_files );
     urlEditor->SetValidator( m_urlValidator );
     m_urlAttr->SetEditor( urlEditor );
 
diff --git a/eeschema/fields_grid_table.h b/eeschema/fields_grid_table.h
index c9427f8f2c..38dc1134a1 100644
--- a/eeschema/fields_grid_table.h
+++ b/eeschema/fields_grid_table.h
@@ -85,9 +85,9 @@ class FIELDS_GRID_TABLE : public WX_GRID_TABLE_BASE, public std::vector<SCH_FIEL
 {
 public:
     FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_BASE_FRAME* aFrame, WX_GRID* aGrid,
-                       LIB_SYMBOL* aSymbol );
+                       LIB_SYMBOL* aSymbol, EMBEDDED_FILES* aFiles = nullptr );
     FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
-                       SCH_SYMBOL* aSymbol );
+                       SCH_SYMBOL* aSymbol, EMBEDDED_FILES* aFiles = nullptr );
     FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
                        SCH_SHEET* aSheet );
     FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_EDIT_FRAME* aFrame, WX_GRID* aGrid,
@@ -136,6 +136,7 @@ private:
     DIALOG_SHIM*      m_dialog;
     KICAD_T           m_parentType;
     LIB_SYMBOL*       m_part;
+    EMBEDDED_FILES*   m_files;
     wxString          m_symbolNetlist;
     wxString          m_curdir;
 
diff --git a/eeschema/lib_symbol.cpp b/eeschema/lib_symbol.cpp
index 504ac090e2..36b17f73be 100644
--- a/eeschema/lib_symbol.cpp
+++ b/eeschema/lib_symbol.cpp
@@ -134,6 +134,7 @@ LIB_SYMBOL::LIB_SYMBOL( const wxString& aName, LIB_SYMBOL* aParent, SYMBOL_LIB*
 
 LIB_SYMBOL::LIB_SYMBOL( const LIB_SYMBOL& aSymbol, SYMBOL_LIB* aLibrary ) :
     SYMBOL( aSymbol ),
+    EMBEDDED_FILES( aSymbol ),
     m_me( this, null_deleter() )
 {
     m_library        = aLibrary;
@@ -215,6 +216,8 @@ const LIB_SYMBOL& LIB_SYMBOL::operator=( const LIB_SYMBOL& aSymbol )
     if( parent )
         SetParent( parent.get() );
 
+    EMBEDDED_FILES::operator=( aSymbol );
+
     return *this;
 }
 
diff --git a/include/embedded_files.h b/include/embedded_files.h
index b6e5a12cda..1f03c19ecf 100644
--- a/include/embedded_files.h
+++ b/include/embedded_files.h
@@ -101,6 +101,9 @@ public:
 
     EMBEDDED_FILES() = default;
 
+    EMBEDDED_FILES( EMBEDDED_FILES&& other ) noexcept;
+    EMBEDDED_FILES( const EMBEDDED_FILES& other );
+
     ~EMBEDDED_FILES()
     {
         for( auto& file : m_files )
@@ -261,6 +264,9 @@ public:
         return 0xABBA2345;
     }
 
+    EMBEDDED_FILES& operator=(EMBEDDED_FILES&& other) noexcept;
+    EMBEDDED_FILES& operator=( const EMBEDDED_FILES& other );
+
 private:
     std::map<wxString, EMBEDDED_FILE*> m_files;
     std::vector<wxString>              m_fontFiles;
diff --git a/pcbnew/footprint.cpp b/pcbnew/footprint.cpp
index b94bf34a77..f23819ec99 100644
--- a/pcbnew/footprint.cpp
+++ b/pcbnew/footprint.cpp
@@ -106,7 +106,8 @@ FOOTPRINT::FOOTPRINT( BOARD* parent ) :
 
 
 FOOTPRINT::FOOTPRINT( const FOOTPRINT& aFootprint ) :
-    BOARD_ITEM_CONTAINER( aFootprint )
+    BOARD_ITEM_CONTAINER( aFootprint ),
+    EMBEDDED_FILES( aFootprint )
 {
     m_pos          = aFootprint.m_pos;
     m_fpid         = aFootprint.m_fpid;
@@ -830,6 +831,8 @@ FOOTPRINT& FOOTPRINT::operator=( FOOTPRINT&& aOther )
     for( PCB_GROUP* group : aOther.Groups() )
         Add( group );
 
+    EMBEDDED_FILES::operator=( std::move( aOther ) );
+
     aOther.Groups().clear();
 
     // Copy auxiliary data
@@ -958,6 +961,8 @@ FOOTPRINT& FOOTPRINT::operator=( const FOOTPRINT& aOther )
     m_initial_comments = aOther.m_initial_comments ?
                             new wxArrayString( *aOther.m_initial_comments ) : nullptr;
 
+    EMBEDDED_FILES::operator=( aOther );
+
     return *this;
 }