diff --git a/ap/app/goahead/server/h.c b/ap/app/goahead/server/h.c
new file mode 100755
index 0000000..228b162
--- /dev/null
+++ b/ap/app/goahead/server/h.c
@@ -0,0 +1,146 @@
+#ifdef UEMF
+	#include	"uemf.h"
+#else
+	#include	"basic/basicInternal.h"
+#endif
+
+
+#define H_LEN		0		
+#define H_USED		1		
+#define H_OFFSET	2		
+#define H_INCR		16		
+
+
+int hFree(void ***map, int handle)
+{
+	int 	len;
+	int		*mp;	
+
+	a_assert(map);
+	mp = &((*(int**)map)[-H_OFFSET]);
+	a_assert(mp[H_LEN] >= H_INCR);
+
+	a_assert(mp[handle + H_OFFSET]);
+	a_assert(mp[H_USED]);
+	mp[handle + H_OFFSET] = 0;
+	if (--(mp[H_USED]) == 0) {
+		bfree(B_L, (void*) mp);
+		*map = NULL;
+	}
+
+
+	if (*map == NULL) {
+		handle = -1;
+	} else {
+		len = mp[H_LEN];
+		if (mp[H_USED] < mp[H_LEN]) {
+			for (handle = len - 1; handle >= 0; handle--) {
+				if (mp[handle + H_OFFSET])
+					break;
+			}
+		} else {
+			handle = len;
+		}
+	}
+	return handle + 1;
+}
+
+
+#ifdef B_STATS
+int HALLOC(B_ARGS_DEC, void ***map)
+#else
+int hAlloc(void ***map)
+#endif
+{
+	int		handle, len, memsize, incr;
+	int		*mp;
+
+	a_assert(map);
+
+	if (*map == NULL) {
+		incr = H_INCR;
+		memsize = (incr + H_OFFSET) * sizeof(void**);
+#ifdef B_STATS
+		if ((mp = (int*) balloc(B_ARGS, memsize)) == NULL) {
+#else
+		if ((mp = (int*) balloc(B_L, memsize)) == NULL) {
+#endif
+			return -1;
+		}
+		memset(mp, 0, memsize);
+		mp[H_LEN] = incr;
+		mp[H_USED] = 0;
+		*map = (void**) &mp[H_OFFSET];
+	} else {
+		mp = &((*(int**)map)[-H_OFFSET]);
+	}
+
+	len = mp[H_LEN];
+
+
+	if (mp[H_USED] < mp[H_LEN]) {
+		for (handle = 0; handle < len; handle++) {
+			if (mp[handle+H_OFFSET] == 0) {
+				mp[H_USED]++;
+				return handle;
+			}
+		}
+	} else {
+		handle = len;
+	}
+
+	len += H_INCR;
+	memsize = (len + H_OFFSET) * sizeof(void**);
+	if ((mp = (int*) brealloc(B_L, (void*) mp, memsize)) == NULL) {
+		return -1;
+	}
+	*map = (void**) &mp[H_OFFSET];
+	mp[H_LEN] = len;
+    memset(&mp[H_OFFSET + len - H_INCR], 0, sizeof(int) * H_INCR);
+
+	mp[H_USED]++;
+	return handle;
+}
+
+
+#ifdef B_STATS
+int HALLOCENTRY(B_ARGS_DEC, void ***list, int *max, int size)
+#else
+int hAllocEntry(void ***list, int *max, int size)
+#endif
+{
+	int		id;
+	char_t	*cp;
+
+	a_assert(list);
+	a_assert(max);
+
+#ifdef B_STATS
+	if ((id = HALLOC(B_ARGS, (void***) list)) < 0) {
+#else
+	if ((id = hAlloc((void***) list)) < 0) {
+#endif
+		return -1;
+	}
+
+	if (size > 0) {
+#ifdef B_STATS
+		if ((cp = balloc(B_ARGS, size)) == NULL) {
+#else
+		if ((cp = balloc(B_L, size)) == NULL) {
+#endif
+			hFree(list, id);
+			return -1;
+		}
+		a_assert(cp);
+		memset(cp, 0, size);
+
+		(*list)[id] = (void*) cp;
+	}
+
+	if (id >= *max) {
+		*max = id + 1;
+	}
+	return id;
+}
+
