diff -durN a/mem/f_malloc.c b/mem/f_malloc.c
--- a/mem/f_malloc.c	2012-12-21 11:29:09.000000000 -0800
+++ b/mem/f_malloc.c	2012-12-21 13:22:58.000000000 -0800
@@ -444,6 +444,36 @@
 	return (char*)frag+sizeof(struct fm_frag);
 }
 
+/**
+ * \brief Main memory manager allocation function
+ * 
+ * Main memory manager allocation function, provide functionality necessary for pkg_calloc
+ * \param qm memory block
+ * \param size memory allocation size
+ * \return address of allocated memory
+ */
+#ifdef DBG_F_MALLOC
+void* fm_calloc(struct fm_block* qm, unsigned long size,
+					const char* file, const char* func, unsigned int line)
+#else
+void* fm_calloc(struct fm_block* qm, unsigned long size)
+#endif
+{
+    void *ret;
+    ret = fm_malloc(qm, size
+#ifdef DBG_F_MALLOC
+				, file, func, line);
+#else
+		    );
+#endif
+    if (ret != NULL)
+    {
+	memset(ret, 0, size);
+    }
+    return ret;
+}
+
+
 
 #ifdef MEM_JOIN_FREE
 /**
diff -durN a/mem/f_malloc.h b/mem/f_malloc.h
--- a/mem/f_malloc.h	2012-12-21 11:29:09.000000000 -0800
+++ b/mem/f_malloc.h	2012-12-21 13:19:55.000000000 -0800
@@ -152,6 +152,19 @@
 void* fm_malloc(struct fm_block* qm, unsigned long size);
 #endif
 
+/**
+ * \brief Main memory manager allocation function
+ * \param qm memory block
+ * \param size memory allocation size
+ * \return address of allocated memory
+ */
+#ifdef DBG_F_MALLOC
+void* fm_calloc(struct fm_block* qm, unsigned long size,
+					const char* file, const char* func, unsigned int line);
+#else
+void* fm_calloc(struct fm_block* qm, unsigned long size);
+#endif
+
 
 /**
  * \brief Main memory manager free function
diff -durN a/mem/mem.h b/mem/mem.h
--- a/mem/mem.h	2012-12-21 11:29:09.000000000 -0800
+++ b/mem/mem.h	2012-12-21 13:18:17.000000000 -0800
@@ -81,6 +81,8 @@
 #		ifdef F_MALLOC
 #			define pkg_malloc(s) fm_malloc(mem_block, (s), _SRC_LOC_, \
 				_SRC_FUNCTION_, _SRC_LINE_)
+#			define pkg_calloc(s) fm_calloc(mem_block, (s), _SRC_LOC_, \
+				_SRC_FUNCTION_, _SRC_LINE_)
 #			define pkg_free(p)   fm_free(mem_block, (p), _SRC_LOC_,  \
 				_SRC_FUNCTION_, _SRC_LINE_)
 #			define pkg_realloc(p, s) fm_realloc(mem_block, (p), (s), \
@@ -88,6 +90,8 @@
 #		else
 #			define pkg_malloc(s) qm_malloc(mem_block, (s),_SRC_LOC_, \
 				_SRC_FUNCTION_, _SRC_LINE_)
+#			define pkg_calloc(s) qm_calloc(mem_block, (s),_SRC_LOC_, \
+				_SRC_FUNCTION_, _SRC_LINE_)
 #			define pkg_realloc(p, s) qm_realloc(mem_block, (p), (s), \
 				_SRC_LOC_, _SRC_FUNCTION_, _SRC_LINE_)
 #			define pkg_free(p)   qm_free(mem_block, (p), _SRC_LOC_,  \
@@ -96,14 +100,17 @@
 #	else
 #		ifdef F_MALLOC
 #			define pkg_malloc(s) fm_malloc(mem_block, (s))
+#			define pkg_calloc(s) fm_calloc(mem_block, (s))
 #			define pkg_realloc(p, s) fm_realloc(mem_block, (p), (s))
 #			define pkg_free(p)   fm_free(mem_block, (p))
 #		elif defined DL_MALLOC
 #			define pkg_malloc(s) dlmalloc((s))
+#			define pkg_calloc(s) dlcalloc((s))
 #			define pkg_realloc(p, s) dlrealloc((p), (s))
 #			define pkg_free(p)   dlfree((p))
 #		else
 #			define pkg_malloc(s) qm_malloc(mem_block, (s))
+#			define pkg_calloc(s) qm_calloc(mem_block, (s))
 #			define pkg_realloc(p, s) qm_realloc(mem_block, (p), (s))
 #			define pkg_free(p)   qm_free(mem_block, (p))
 #		endif
@@ -137,6 +144,10 @@
 	(  { void *____v123; ____v123=malloc((s)); \
 	   MDBG("malloc %p size %lu end %p\n", ____v123, (unsigned long)(s), (char*)____v123+(s));\
 	   ____v123; } )
+#	define pkg_calloc(s) \
+	(  { void *____v123; ____v123=calloc((s)); \
+	   MDBG("calloc %p size %lu end %p\n", ____v123, (unsigned long)(s), (char*)____v123+(s));\
+	   ____v123; } )
 #	define pkg_realloc(p, s) \
 	(  { void *____v123; ____v123=realloc(p, s); \
 	   MDBG("realloc %p size %lu end %p\n", ____v123, (unsigned long)(s), (char*)____v123+(s));\
diff -durN a/mem/q_malloc.c b/mem/q_malloc.c
--- a/mem/q_malloc.c	2012-12-21 11:29:09.000000000 -0800
+++ b/mem/q_malloc.c	2012-12-21 13:23:10.000000000 -0800
@@ -418,6 +418,27 @@
 }
 
 
+#ifdef DBG_QM_MALLOC
+void* qm_calloc(struct qm_block* qm, unsigned long size,
+					const char* file, const char* func, unsigned int line)
+#else
+void* qm_calloc(struct qm_block* qm, unsigned long size)
+#endif
+{
+    void *ret;
+    ret = qm_malloc(qm, size
+#ifdef DBG_QM_MALLOC
+				, file, func, line);
+#else
+		    );
+#endif
+    if (ret != NULL)
+    {
+	memset(ret, 0, size);
+    }
+    return ret;
+}
+
 
 #ifdef DBG_QM_MALLOC
 void qm_free(struct qm_block* qm, void* p, const char* file, const char* func, 
diff -durN a/mem/q_malloc.h b/mem/q_malloc.h
--- a/mem/q_malloc.h	2012-12-21 11:29:09.000000000 -0800
+++ b/mem/q_malloc.h	2012-12-21 13:20:34.000000000 -0800
@@ -136,6 +136,13 @@
 #endif
 
 #ifdef DBG_QM_MALLOC
+void* qm_calloc(struct qm_block*, unsigned long size, const char* file,
+					const char* func, unsigned int line);
+#else
+void* qm_calloc(struct qm_block*, unsigned long size);
+#endif
+
+#ifdef DBG_QM_MALLOC
 void  qm_free(struct qm_block*, void* p, const char* file, const char* func, 
 				unsigned int line);
 #else
