diff --git a/gee/hashmap.vala b/gee/hashmap.vala
index 9fa09d3..dd909d9 100644
--- a/gee/hashmap.vala
+++ b/gee/hashmap.vala
@@ -131,6 +131,27 @@ public class Gee.HashMap<K,V> : Object, Map<K,V> {
 		}
 		return false;
 	}
+	
+	public V? steal (K key) {
+		Node<K,V>** node = lookup_node (key);
+		if (*node != null) {
+		
+			Node<K,V> next = (owned) (*node)->next;
+			
+			(*node)->key = null;
+			var val = (owned) (*node)->value;
+			
+			delete *node;
+
+			*node = (owned) next;
+
+			_nnodes--;
+			resize ();
+			_stamp++;
+			return val;
+		}
+		return null;
+	}
 
 	public void clear () {
 		for (int i = 0; i < _array_size; i++) {
diff --git a/gee/map.vala b/gee/map.vala
index 78858ce..cb96be5 100644
--- a/gee/map.vala
+++ b/gee/map.vala
@@ -80,6 +80,15 @@ public interface Gee.Map<K,V> : GLib.Object {
 	public abstract bool remove (K key);
 
 	/**
+	 * Removes the specified key from this map and returns it's value.
+	 *
+	 * @param key the key to remove from the map
+	 *
+	 * @return    value of the removed key
+	 */
+	public abstract V? steal (K key);
+
+	/**
 	 * Removes all items from this collection. Must not be called on
 	 * read-only collections.
 	 */
diff --git a/gee/readonlymap.vala b/gee/readonlymap.vala
index e629527..4614e48 100644
--- a/gee/readonlymap.vala
+++ b/gee/readonlymap.vala
@@ -79,6 +79,10 @@ public class Gee.ReadOnlyMap<K,V> : Object, Map<K,V> {
 	public bool remove (K key) {
 		assert_not_reached ();
 	}
+	
+	public V? steal (K key) {
+		assert_not_reached ();
+	}
 
 	public void clear () {
 		assert_not_reached ();
