diff --git a/include/memory_space.h b/include/memory_space.h
index a4edf6dfbb58b588a86a99f55674dd88fad45ab4..e2a168c4be35a32352215af9592229f8d47e440f 100644
--- a/include/memory_space.h
+++ b/include/memory_space.h
@@ -48,7 +48,7 @@ class MemorySpace_t : public std::map<RangeAddress_t,char>
 		virtual void MergeFreeRange(RangeAddress_t addr)=0;
 		virtual RangeSet_t::iterator FindFreeRange(RangeAddress_t addr)=0;
 		virtual Range_t GetFreeRange(int size)=0;
-		virtual void AddFreeRange(Range_t newRange)=0;
+		virtual void AddFreeRange(Range_t newRange, bool phantom=false)=0;
 
 		// queries about free areas.
 		virtual bool AreBytesFree(RangeAddress_t addr, int num_bytes)=0;
diff --git a/include/range.h b/include/range.h
index 3dae5383d0ca4dbd6e8e633e2bcfafbc87c201ec..43c352aed24f9bdcfeeae4f0d1cec2fc4bdf7c67 100644
--- a/include/range.h
+++ b/include/range.h
@@ -41,13 +41,15 @@ typedef uintptr_t RangeAddress_t;
 class Range_t
 {
 	public:
-		Range_t(RangeAddress_t p_s, RangeAddress_t p_e) : m_start(p_s), m_end(p_e) { }
-		Range_t() : m_start(0), m_end(0) { }
+		Range_t(RangeAddress_t p_s, RangeAddress_t p_e, bool phantom=false)
+			: m_start(p_s), m_end(p_e), m_phantom(phantom) { }
+		Range_t() : m_start(0), m_end(0), m_phantom(false) { }
 
 		virtual RangeAddress_t GetStart() const { return m_start; }
 		virtual RangeAddress_t GetEnd() const { return m_end; }
 		virtual RangeAddress_t SetStart(RangeAddress_t s) { m_start=s; }
 		virtual RangeAddress_t SetEnd(RangeAddress_t e) { m_end=e; }
+		virtual void SetPhantom(bool phantom) { m_phantom = phantom; };
 
 		virtual bool Is2ByteRange()
 		{
@@ -57,9 +59,13 @@ class Range_t
 		{
 			return (m_end - m_start) == 5;
 		};
+		virtual bool IsPhantom()
+		{
+			return m_phantom;
+		};
 
 	protected:
-
+		bool m_phantom;
 		RangeAddress_t m_start, m_end;
 };