diff --git a/libIRDB/include/core/archdesc.hpp b/libIRDB/include/core/archdesc.hpp
index 761ef70225d5a9faaa0b5c2fc33c4b3e9640f728..89c2b40e1cffaf993d97682377516fd1640f1fe6 100644
--- a/libIRDB/include/core/archdesc.hpp
+++ b/libIRDB/include/core/archdesc.hpp
@@ -19,7 +19,7 @@
  */
 
 
-enum AD_FileType_t { AD_ELF, AD_CGC };
+enum AD_FileType_t { AD_ELF, AD_CGC, AD_PE };
 
 class ArchitectureDescription_t
 {
diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp
index 9aa6b986491d4b3116798a77acc668fb378bc0c9..c11c14b8b7eb68d89df886e989c30787d02d7b9a 100644
--- a/libIRDB/src/core/fileir.cpp
+++ b/libIRDB/src/core/fileir.cpp
@@ -701,25 +701,38 @@ void FileIR_t::SetArchitecture()
 	{
 		archdesc->SetFileType(AD_ELF);
 	}
+	else if((e_ident[EI_MAG0]=='M') &&
+	   (e_ident[EI_MAG1]=='Z'))
+	{
+		archdesc->SetFileType(AD_PE);
+	}
 	else
 	{
-		cerr << "ELF magic number wrong:  is this an ELF file? " <<endl;
+		cerr << "File format magic number wrong:  is this an ELF, PE or CGC file? [" << e_ident[EI_MAG0] << " " << e_ident[EI_MAG1] << "]" << endl;
 		exit(-1);
 	}
 
 
-	switch(e_ident[4])
+	if (archdesc->GetFileType() == AD_PE)
 	{
-		case ELFCLASS32:
-			archdesc->SetBitWidth(32);
-			break;
-		case ELFCLASS64:
-			archdesc->SetBitWidth(64);
-			break;
-		case ELFCLASSNONE:
-		default:
-			cerr << "Unknown ELF class " <<endl;
-			exit(-1);
+		// just assume 64 bit for Windows, o/w could also extract from file
+		archdesc->SetBitWidth(64);
+	}
+	else
+	{
+		switch(e_ident[4])
+		{
+			case ELFCLASS32:
+				archdesc->SetBitWidth(32);
+				break;
+			case ELFCLASS64:
+				archdesc->SetBitWidth(64);
+				break;
+			case ELFCLASSNONE:
+			default:
+				cerr << "Unknown ELF class " <<endl;
+				exit(-1);
+		}
 	}
 }
 
diff --git a/libIRDB/test/fill_in_cfg.cpp b/libIRDB/test/fill_in_cfg.cpp
index 72eec53f8296b605c4f2e4b3bcd3351e5ec136af..8b6959d0c0274532951c27a839ded160157fdb9a 100644
--- a/libIRDB/test/fill_in_cfg.cpp
+++ b/libIRDB/test/fill_in_cfg.cpp
@@ -41,7 +41,7 @@ using namespace libIRDB;
 using namespace std;
 using namespace EXEIO;
 
-set< pair<db_id_t,int> > missed_instructions;
+set< pair<db_id_t,virtual_offset_t> > missed_instructions;
 int failed_target_count=0;
 
 pqxxDB_t pqxx_interface;
@@ -99,7 +99,7 @@ void set_fallthrough
 
 	/* get the address of the next instrution */
 	
-	int virtual_offset=insn->GetAddress()->GetVirtualOffset() + insn->GetDataBits().size();
+	virtual_offset_t virtual_offset=insn->GetAddress()->GetVirtualOffset() + insn->GetDataBits().size();
 
 	/* create a pair of offset/file */
 	pair<db_id_t,virtual_offset_t> p(insn->GetAddress()->GetFileID(),virtual_offset);
@@ -110,7 +110,8 @@ void set_fallthrough
 	/* sanity, note we may see odd control transfers to 0x0 */
 	if(fallthrough_insn==NULL &&   virtual_offset!=0)
 	{
-		cout<<"Cannot set fallthrough for "<<std::hex<<insn->GetAddress()->GetVirtualOffset()<<"."<<endl;
+		cout<<"Cannot set fallthrough for "<<std::hex<<insn->GetAddress()->GetVirtualOffset();
+		cout<< " : "<<insn->getDisassembly()<<endl;
 		bad_fallthrough_count++;
 	}
 
@@ -118,8 +119,7 @@ void set_fallthrough
 	if(fallthrough_insn!=0)
 		insn->SetFallthrough(fallthrough_insn);
 	else
-		missed_instructions.insert(pair<db_id_t,int>(insn->GetAddress()->GetFileID(),virtual_offset));
-
+		missed_instructions.insert(pair<db_id_t,virtual_offset_t>(insn->GetAddress()->GetFileID(),virtual_offset));
 }
 
 
@@ -148,7 +148,7 @@ void set_target
 //			disasm->Argument1.ArgMnemonic<<"."<<endl;
 
 		/* get the offset */
-		int virtual_offset=strtoul(disasm->Argument1.ArgMnemonic, NULL, 16);
+		virtual_offset_t virtual_offset=strtoul(disasm->Argument1.ArgMnemonic, NULL, 16);
 
 		/* create a pair of offset/file */
 		pair<db_id_t,virtual_offset_t> p(insn->GetAddress()->GetFileID(),virtual_offset);
@@ -162,7 +162,7 @@ void set_target
 			unsigned char first_byte=0;
 			if(insn->GetFallthrough())
 				first_byte=(insn->GetFallthrough()->GetDataBits().c_str())[0];
-			int jump_dist=virtual_offset-(insn->GetAddress()->GetVirtualOffset()+(insn->GetDataBits()).size());
+			virtual_offset_t jump_dist=virtual_offset-(insn->GetAddress()->GetVirtualOffset()+(insn->GetDataBits()).size());
 			if(	
 				// jump 1 byte forward
 				jump_dist == 1 &&
@@ -189,7 +189,7 @@ void set_target
 		if(target_insn!=0)
 			insn->SetTarget(target_insn);
 		else
-			missed_instructions.insert( pair<db_id_t,int>(insn->GetAddress()->GetFileID(),virtual_offset));
+			missed_instructions.insert( pair<db_id_t,virtual_offset_t>(insn->GetAddress()->GetFileID(),virtual_offset));
 
 	}
 }
@@ -222,13 +222,13 @@ void add_new_instructions(FileIR_t *firp)
 {
 	int found_instructions=0;
 	for(
-		set< pair<db_id_t,int> >::const_iterator it=missed_instructions.begin();
+		set< pair<db_id_t,virtual_offset_t> >::const_iterator it=missed_instructions.begin();
 		it!=missed_instructions.end(); 
 		++it
    	   )
 	{
 		/* get the address we've missed */
-		int missed_address=(*it).second;
+		virtual_offset_t missed_address=(*it).second;
 
 		/* get the address ID of the instruction that's missing the missed addressed */
 		db_id_t missed_fileid=(*it).first;
@@ -272,7 +272,7 @@ void add_new_instructions(FileIR_t *firp)
 			{
 				const char* data=elfiop.sections[secndx]->get_data();
 				// second=data?
-				int offset_into_section=missed_address-elfiop.sections[secndx]->get_address();
+				virtual_offset_t offset_into_section=missed_address-elfiop.sections[secndx]->get_address();
 	
 				/* disassemble the instruction */
 				DISASM disasm;
@@ -392,18 +392,18 @@ void fill_in_cfg(FileIR_t *firp)
 	/* keep trying this while we're resolving targets.  if at any point we fail to resolve a new target/fallthrough address, then we give up */
 	} while(missed_instructions.size()>failed_target_count);
 
-	cout<<"Caution: Was unable to find instructions for these addresses:"<<endl;
+	cout<<"Caution: Was unable to find instructions for these addresses:"<<hex<<endl;
 	for(
-		set< pair<db_id_t,int> >::const_iterator it=missed_instructions.begin();
+		set< pair<db_id_t,virtual_offset_t> >::const_iterator it=missed_instructions.begin();
 		it!=missed_instructions.end(); 
 		++it
    	   )
 	{
 		/* get the address we've missed */
-		int missed_address=(*it).second;
+		virtual_offset_t missed_address=(*it).second;
 		cout << missed_address << ", ";
 	}
-	cout<<endl;
+	cout<<dec<<endl;
 
 
 	/* set the base IDs for all instructions */