diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c
index ce00333..4168b1e 100644
--- a/gst/mpegtsmux/mpegtsmux.c
+++ b/gst/mpegtsmux/mpegtsmux.c
@@ -296,6 +296,8 @@ mpegtsmux_class_init (MpegTsMuxClass * klass)
 static void
 mpegtsmux_init (MpegTsMux * mux)
 {
+  GstStructure *poolConfig;
+
   mux->srcpad =
       gst_pad_new_from_static_template (&mpegtsmux_src_factory, "src");
   gst_pad_use_fixed_caps (mux->srcpad);
@@ -316,6 +318,12 @@ mpegtsmux_init (MpegTsMux * mux)
 
   mux->adapter = gst_adapter_new ();
   mux->out_adapter = gst_adapter_new ();
+  mux->pool = gst_buffer_pool_new ();
+
+  poolConfig = gst_buffer_pool_get_config (mux->pool);
+  gst_buffer_pool_config_set_params (poolConfig, NULL, 188, 100, 0);
+  gst_buffer_pool_set_config (mux->pool, poolConfig);
+  gst_buffer_pool_set_active (mux->pool, TRUE);
 
   /* properties */
   mux->m2ts_mode = MPEGTSMUX_DEFAULT_M2TS;
@@ -364,6 +371,7 @@ mpegtsmux_reset (MpegTsMux * mux, gboolean alloc)
 {
   GstBuffer *buf;
   GSList *walk;
+  GstStructure *poolConfig;
 
   mux->first = TRUE;
   mux->last_flow_ret = GST_FLOW_OK;
@@ -410,6 +418,11 @@ mpegtsmux_reset (MpegTsMux * mux, gboolean alloc)
     GST_COLLECT_PADS_STREAM_UNLOCK (mux->collect);
   }
 
+  poolConfig = gst_buffer_pool_get_config (mux->pool);
+  gst_buffer_pool_set_active (mux->pool, FALSE);
+  gst_buffer_pool_config_set_params (poolConfig, NULL, 188, 100, 0);
+  gst_buffer_pool_set_active (mux->pool, TRUE);
+
   if (alloc) {
     mux->tsmux = tsmux_new ();
     tsmux_set_write_func (mux->tsmux, new_packet_cb, mux);
@@ -444,6 +457,10 @@ mpegtsmux_dispose (GObject * object)
     g_hash_table_destroy (mux->programs);
     mux->programs = NULL;
   }
+  if (mux->pool) {
+    g_object_unref (mux->pool);
+    mux->pool = NULL;
+  }
   GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
 }
 
@@ -1663,12 +1680,14 @@ alloc_packet_cb (GstBuffer ** _buf, void *user_data)
   GstBuffer *buf;
   gint offset = 0;
 
-  if (mux->m2ts_mode == TRUE)
+  if (mux->m2ts_mode == TRUE) {
     offset = 4;
 
-  buf = gst_buffer_new_and_alloc (NORMAL_TS_PACKET_LENGTH + offset);
-  gst_buffer_set_size (buf, NORMAL_TS_PACKET_LENGTH);
-
+    buf = gst_buffer_new_and_alloc (NORMAL_TS_PACKET_LENGTH + offset);
+    gst_buffer_set_size (buf, NORMAL_TS_PACKET_LENGTH);
+  } else {
+    gst_buffer_pool_acquire_buffer (mux->pool, &buf, NULL);
+  }
   *_buf = buf;
 }
 
diff --git a/gst/mpegtsmux/mpegtsmux.h b/gst/mpegtsmux/mpegtsmux.h
index 169892c..7c4291c 100644
--- a/gst/mpegtsmux/mpegtsmux.h
+++ b/gst/mpegtsmux/mpegtsmux.h
@@ -163,6 +163,8 @@ struct MpegTsMux {
   /* output buffer aggregation */
   GstAdapter *out_adapter;
   GstBuffer *out_buffer;
+  
+  GstBufferPool *pool;
 
 #if 0
   /* SPN/PTS index handling */
