diff --git a/libEXEIO/include/exeio.h b/libEXEIO/include/exeio.h
index b434d90f2a6e855899ca1967f8d20e77c2568b6a..f27c8556d7af114c2759766074643f751156ea5d 100644
--- a/libEXEIO/include/exeio.h
+++ b/libEXEIO/include/exeio.h
@@ -32,6 +32,7 @@ namespace EXEIO
 			virtual const char* get_data() const =0;
 			virtual std::string get_name() const =0;
 			virtual int get_size() const =0;
+			virtual int get_type() const =0;
 			virtual EXEIO::virtual_offset_t get_address() const =0;
 			virtual bool mightContainStrings() const =0;
 	};		
diff --git a/libEXEIO/src/exeio_elf.h b/libEXEIO/src/exeio_elf.h
index 6b2ae5a6e90154a7d3ba9bb48d14475603e85f84..cd2230b757b674a77aff6ab723d9ccdd1327a76d 100644
--- a/libEXEIO/src/exeio_elf.h
+++ b/libEXEIO/src/exeio_elf.h
@@ -31,6 +31,7 @@ namespace EXEIO
 			const char* get_data() const { return s->get_data(); }
 			std::string get_name() const { return s->get_name(); }
 			int get_size() const { return s->get_size(); }
+			int get_type() const { return s->get_type(); }
 			EXEIO::virtual_offset_t get_address() const { return s->get_address(); }
 			bool mightContainStrings() const { assert(0); }
 
diff --git a/libEXEIO/src/exeio_pe.h b/libEXEIO/src/exeio_pe.h
index f4ab2eff6d92b9939eb18d046b4ab03e3c2c7d0f..868ddeec9e26f2bd578b7e81b12130baa2394b3f 100644
--- a/libEXEIO/src/exeio_pe.h
+++ b/libEXEIO/src/exeio_pe.h
@@ -32,6 +32,7 @@ namespace EXEIO
 			const char* get_data() const  { return s->get_raw_data().c_str(); }
 			std::string get_name() const { return s->get_name(); }
 			int get_size() const  { return s->get_virtual_size(); }
+			int get_type() const  { assert(0); } // not imp'd yet
 			EXEIO::virtual_offset_t get_address() const { 
 				EXEIO::virtual_offset_t base = b->get_image_base_64();
 				return base + s->get_virtual_address(); 
diff --git a/libIRDB/include/core/eh.hpp b/libIRDB/include/core/eh.hpp
index 96068ab1f567dd5cce1d4c87cd97a8acfb19a67b..77082ae522f1dcafd68ba4080ec539266f9f1f17 100644
--- a/libIRDB/include/core/eh.hpp
+++ b/libIRDB/include/core/eh.hpp
@@ -65,6 +65,9 @@ class EhProgram_t : public BaseObj_t, virtual public IRDB_SDK::EhProgram_t
 
 	EhProgramListing_t& GetFDEProgram() { return fde_program; }
 	const EhProgramListing_t& getFDEProgram() const { return fde_program; }
+	void setCIEProgram(const EhProgramListing_t& p) { cie_program=p; }
+	void setFDEProgram(const EhProgramListing_t& p) { fde_program=p; }
+
 
         uint64_t getCodeAlignmentFactor() const { return code_alignment_factor; }
         void setCodeAlignmentFactor(const uint64_t caf) 
diff --git a/libIRDB/include/core/fileir.hpp b/libIRDB/include/core/fileir.hpp
index 65b9b2929998d59772a25b1ea9d641703cea748d..17b9a9c5fb4d0c753cbbcd1881ac26da57fd8e02 100644
--- a/libIRDB/include/core/fileir.hpp
+++ b/libIRDB/include/core/fileir.hpp
@@ -143,6 +143,10 @@ class FileIR_t : public BaseObj_t, virtual public IRDB_SDK::FileIR_t
 
 		virtual void removeScoop(IRDB_SDK::DataScoop_t* s) ;
 		virtual void moveRelocation(IRDB_SDK::Relocation_t* reloc, IRDB_SDK::Instruction_t* from, IRDB_SDK::Instruction_t* to) ;
+		virtual IRDB_SDK::EhProgram_t* copyEhProgram(const IRDB_SDK::EhProgram_t& orig);
+
+		virtual void   setAllEhPrograms(const EhProgramSet_t& new_pgms)  { eh_pgms=new_pgms; }
+
 
 
 
diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp
index 6a743b336322d65d829c6fc24b4427a54efcc3b4..ccdc2d5d0a22a9b7184dc81411d65121f4f5c7df 100644
--- a/libIRDB/src/core/fileir.cpp
+++ b/libIRDB/src/core/fileir.cpp
@@ -1887,4 +1887,14 @@ IRDB_SDK::DataScoop_t* FileIR_t::addNewDataScoop(
 	return newscoop;
 }
 
+IRDB_SDK::EhProgram_t* FileIR_t::copyEhProgram(const IRDB_SDK::EhProgram_t& orig)
+{
+	const auto ehpgm=dynamic_cast<const libIRDB::EhProgram_t*>(&orig);
+	assert(ehpgm);
+	auto new_eh_pgm=new libIRDB::EhProgram_t(*ehpgm);
+        GetAllEhPrograms().insert(new_eh_pgm);
+	return new_eh_pgm;
+}
+
+