diff --git a/include/zipr_mem_space.h b/include/zipr_mem_space.h
index ccc70966af97b434bacc5e572ea12c6205d7f647..8e46e41a189dd62b95b70a60503bb21cbedee9e8 100644
--- a/include/zipr_mem_space.h
+++ b/include/zipr_mem_space.h
@@ -51,6 +51,7 @@ class ZiprMemorySpace_t : public MemorySpace_t
 		void MergeFreeRange(RangeAddress_t addr);
 		RangeSet_t::iterator FindFreeRange(RangeAddress_t addr);
 		Range_t GetFreeRange(int size);
+		std::list<Range_t> GetFreeRanges(size_t size = 0);
 		std::pair<RangeSet_t::const_iterator,RangeSet_t::const_iterator>
 			GetNearbyFreeRanges(const RangeAddress_t hint, size_t count = 0);
 		void AddFreeRange(Range_t newRange);
@@ -105,6 +106,7 @@ class ZiprMemorySpace_t : public MemorySpace_t
 		RangeAddress_t max_plopped;
 		RangeAddress_t min_plopped;
 		ZiprBooleanOption_t m_verbose;
+		static bool SortRangeBySize(const Range_t &a, const Range_t &b);
 };
 
 #endif
diff --git a/src/memory_space.cpp b/src/memory_space.cpp
index 4788d3ca57b3a8255768bdb3819fb538da051a67..1d8f831ad657521dbf65b0d0621e29b880388a9a 100644
--- a/src/memory_space.cpp
+++ b/src/memory_space.cpp
@@ -197,6 +197,26 @@ Range_t ZiprMemorySpace_t::GetLargeRange(void)
 	return Range_t(0,0);
 }
 
+bool ZiprMemorySpace_t::SortRangeBySize(const Range_t &a, const Range_t &b)
+{
+	return (a.GetEnd() - a.GetStart()) <= (b.GetEnd() - b.GetStart());
+}
+
+std::list<Range_t> ZiprMemorySpace_t::GetFreeRanges(size_t size)
+{
+	list<Range_t> result;
+	for( RangeSet_t::iterator it=free_ranges.begin();
+		it!=free_ranges.end();
+		++it)
+	{
+		Range_t r=*it;
+		if(r.GetEnd() - r.GetStart() >= (unsigned) size)
+			result.push_back(r);
+	}
+	result.sort(SortRangeBySize);
+	return result;
+}
+
 Range_t ZiprMemorySpace_t::GetFreeRange(int size)
 {
 	vector<Range_t> v;