diff --git a/glib/gslice.c b/glib/gslice.c
index 05de6b3..ba67f26 100644
--- a/glib/gslice.c
+++ b/glib/gslice.c
@@ -52,6 +52,7 @@
 #include "gthread.h"
 #include "gthreadprivate.h"
 #include "glib_trace.h"
+#include "memcheck.h"
 
 /* the GSlice allocator is split up into 4 layers, roughly modelled after the slab
  * allocator and magazine extensions as outlined in:
@@ -304,6 +305,8 @@ g_slice_init_nomessage (void)
   mem_assert (sys_page_size == 0);
   mem_assert (MIN_MAGAZINE_SIZE >= 4);
 
+  VALGRIND_CREATE_MEMPOOL(allocator, 0, 0);
+
 #ifdef G_OS_WIN32
   {
     SYSTEM_INFO system_info;
@@ -831,11 +834,13 @@ g_slice_alloc (gsize mem_size)
             thread_memory_magazine1_reload (tmem, ix);
         }
       mem = thread_memory_magazine1_alloc (tmem, ix);
+      VALGRIND_MEMPOOL_ALLOC(allocator, mem, mem_size);
     }
   else if (acat == 2)           /* allocate through slab allocator */
     {
       g_mutex_lock (allocator->slab_mutex);
       mem = slab_allocator_alloc_chunk (chunk_size);
+      VALGRIND_MEMPOOL_ALLOC(allocator, mem, mem_size);
       g_mutex_unlock (allocator->slab_mutex);
     }
   else                          /* delegate to system malloc */
@@ -890,6 +895,8 @@ g_slice_free1 (gsize    mem_size,
         }
       if (G_UNLIKELY (g_mem_gc_friendly))
         memset (mem_block, 0, chunk_size);
+      VALGRIND_MEMPOOL_FREE(allocator, mem_block);
+      VALGRIND_MAKE_MEM_UNDEFINED(mem_block, sizeof(ChunkLink));
       thread_memory_magazine2_free (tmem, ix, mem_block);
     }
   else if (acat == 2)                   /* allocate through slab allocator */
@@ -897,6 +904,8 @@ g_slice_free1 (gsize    mem_size,
       if (G_UNLIKELY (g_mem_gc_friendly))
         memset (mem_block, 0, chunk_size);
       g_mutex_lock (allocator->slab_mutex);
+      VALGRIND_MEMPOOL_FREE(allocator, mem_block);
+      VALGRIND_MAKE_MEM_UNDEFINED(mem_block, sizeof(ChunkLink));
       slab_allocator_free_chunk (chunk_size, mem_block);
       g_mutex_unlock (allocator->slab_mutex);
     }
@@ -951,6 +960,8 @@ g_slice_free_chain_with_offset (gsize    mem_size,
             }
           if (G_UNLIKELY (g_mem_gc_friendly))
             memset (current, 0, chunk_size);
+          VALGRIND_MEMPOOL_FREE(allocator, current);
+          VALGRIND_MAKE_MEM_UNDEFINED(current, sizeof(ChunkLink));
           thread_memory_magazine2_free (tmem, ix, current);
         }
     }
@@ -966,6 +977,8 @@ g_slice_free_chain_with_offset (gsize    mem_size,
             abort();
           if (G_UNLIKELY (g_mem_gc_friendly))
             memset (current, 0, chunk_size);
+          VALGRIND_MEMPOOL_FREE(allocator, current);
+          VALGRIND_MAKE_MEM_UNDEFINED(current, sizeof(ChunkLink));
           slab_allocator_free_chunk (chunk_size, current);
         }
       g_mutex_unlock (allocator->slab_mutex);
