diff --git a/src/allocator.c b/src/allocator.c
index f53b84b7034a59a91185e96807215adebec102d6..59c6e5097f67443b933c168f58e791ab2684301b 100644
--- a/src/allocator.c
+++ b/src/allocator.c
@@ -86,7 +86,11 @@ void* h_arena_malloc(HArena *arena, size_t size) {
     return link->rest;
   }
 }
-    
+
+void h_arena_free(HArena *arena, void* ptr) {
+  // To be used later...
+}
+
 void h_delete_arena(HArena *arena) {
   struct arena_link *link = arena->head;
   while (link) {
diff --git a/src/allocator.h b/src/allocator.h
index 3ec9ae90a3638a8b694616735165e71c543da996..3af22d04ed19c2e6043d5b1af3d73c7685f9d8d4 100644
--- a/src/allocator.h
+++ b/src/allocator.h
@@ -23,6 +23,7 @@ typedef struct HArena_ HArena ; // hidden implementation
 
 HArena *h_new_arena(size_t block_size); // pass 0 for default...
 void* h_arena_malloc(HArena *arena, size_t count) __attribute__(( malloc, alloc_size(2) ));
+void h_arena_free(HArena *arena, void* ptr); // For future expansion, with alternate memory managers.
 void h_delete_arena(HArena *arena);
 
 typedef struct {
diff --git a/src/datastructures.c b/src/datastructures.c
index 004f7e7bc35f541e75c79ce35df6f77b57062059..e7552e57adb7c0fe183e51e7cf278a24e6bdbdb6 100644
--- a/src/datastructures.c
+++ b/src/datastructures.c
@@ -30,3 +30,36 @@ void h_carray_append(HCountedArray *array, void* item) {
   }
   array->elements[array->used++] = item;
 }
+
+// HSlist
+
+HSlist* h_slist_new(HArena *arena) {
+  HSlist *ret = h_arena_malloc(arena, sizeof(HSlist));
+  ret->head = NULL;
+  ret->arena = arena;
+  return ret;
+}
+
+void* h_slist_pop(HSlist *slist) {
+  HSlistNode *head = slist->head;
+  if (!head)
+    return NULL;
+  void* ret = head->elem;
+  slist->head = head->next;
+  h_arena_free(slist->arena, head);
+  return ret;
+}
+
+void h_slist_push(HSlist *slist, void* item) {
+  HSlistNode *hnode = h_arena_malloc(slist->arena, sizeof(HSlistNode));
+  hnode->elem = item;
+  hnode->next = slist->head;
+  // write memory barrier here.
+  slist->head = hnode;
+}
+
+void h_slist_free(HSlist *slist) {
+  while (slist->head != NULL)
+    h_slist_pop(slist);
+  h_arena_free(slist->arena, slist);
+}
diff --git a/src/internal.h b/src/internal.h
index cc35a8b6ce0d1f8fffe6d2b98acb1ef0b06e276c..b59f8240ff5b2e2046d5a833442295fda2729ad1 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -154,6 +154,21 @@ HCountedArray *h_carray_new_sized(HArena * arena, size_t size);
 HCountedArray *h_carray_new(HArena * arena);
 void h_carray_append(HCountedArray *array, void* item);
 
+typedef struct HSlistNode_ {
+  void* elem;
+  struct HSlistNode_ *next;
+} HSlistNode;
+
+typedef struct HSlist_ {
+  HSlistNode *head;
+  struct HArena_ *arena;
+} HSlist;
+
+
+HSlist* h_slist_new(HArena *arena);
+void* h_slist_pop(HSlist *slist);
+void h_slist_push(HSlist *slist, void* item);
+void h_slist_free(HSlist *slist);
 
 #if 0
 #include <malloc.h>