diff --git a/gst/rtp/Makefile.am b/gst/rtp/Makefile.am
index 66af79a..7b2afd5 100644
--- a/gst/rtp/Makefile.am
+++ b/gst/rtp/Makefile.am
@@ -54,6 +54,8 @@
 	gstrtpjpegpay.c \
 	gstrtpklvdepay.c \
 	gstrtpklvpay.c \
+	gstrtpL8depay.c \
+	gstrtpL8pay.c \
 	gstrtpL16depay.c \
 	gstrtpL16pay.c \
 	gstrtpL24depay.c \
@@ -112,6 +114,8 @@
 	dboolhuff.h \
 	fnv1hash.h \
 	gstrtpchannels.h \
+	gstrtpL8depay.h \
+	gstrtpL8pay.h \
 	gstrtpL16depay.h \
 	gstrtpL16pay.h \
 	gstrtpL24depay.h \
diff --git a/gst/rtp/gstrtp.c b/gst/rtp/gstrtp.c
index 186cf9c..8b0ef58 100644
--- a/gst/rtp/gstrtp.c
+++ b/gst/rtp/gstrtp.c
@@ -76,6 +76,8 @@
 #include "gstrtpjpegpay.h"
 #include "gstrtpklvdepay.h"
 #include "gstrtpklvpay.h"
+#include "gstrtpL8depay.h"
+#include "gstrtpL8pay.h"
 #include "gstrtpL16depay.h"
 #include "gstrtpL16pay.h"
 #include "gstrtpL24depay.h"
@@ -275,6 +277,12 @@
   if (!gst_rtp_klv_pay_plugin_init (plugin))
     return FALSE;
 
+  if (!gst_rtp_L8_pay_plugin_init (plugin))
+    return FALSE;
+
+  if (!gst_rtp_L8_depay_plugin_init (plugin))
+    return FALSE;
+
   if (!gst_rtp_L16_pay_plugin_init (plugin))
     return FALSE;
 
diff --git a/gst/rtp/gstrtpL8depay.c b/gst/rtp/gstrtpL8depay.c
new file mode 100644
index 0000000..5b9520a
--- /dev/null
+++ b/gst/rtp/gstrtpL8depay.c
@@ -0,0 +1,267 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) <2015> GE Intelligent Platforms Embedded Systems, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:element-rtpL8depay
+ * @see_also: rtpL8pay
+ *
+ * Extract raw audio from RTP packets according to RFC 3551.
+ * For detailed information see: http://www.rfc-editor.org/rfc/rfc3551.txt
+ *
+ * <refsect2>
+ * <title>Example pipeline</title>
+ * |[
+ * gst-launch udpsrc caps='application/x-rtp, media=(string)audio, clock-rate=(int)44100, encoding-name=(string)L8, encoding-params=(string)1, channels=(int)1, payload=(int)96' ! rtpL8depay ! pulsesink
+ * ]| This example pipeline will depayload an RTP raw audio stream. Refer to
+ * the rtpL8pay example to create the RTP stream.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <gst/audio/audio.h>
+
+#include "gstrtpL8depay.h"
+#include "gstrtpchannels.h"
+
+GST_DEBUG_CATEGORY_STATIC (rtpL8depay_debug);
+#define GST_CAT_DEFAULT (rtpL8depay_debug)
+
+static GstStaticPadTemplate gst_rtp_L8_depay_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("audio/x-raw, "
+        "format = (string) U8, "
+        "layout = (string) interleaved, "
+        "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]")
+    );
+
+static GstStaticPadTemplate gst_rtp_L8_depay_sink_template =
+    GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("application/x-rtp, "
+        "media = (string) audio, clock-rate = (int) [ 1, MAX ], "
+        /* "channels = (int) [1, MAX]"  */
+        /* "emphasis = (string) ANY" */
+        /* "channel-order = (string) ANY" */
+        "encoding-name = (string) L8;")
+    );
+
+#define gst_rtp_L8_depay_parent_class parent_class
+G_DEFINE_TYPE (GstRtpL8Depay, gst_rtp_L8_depay, GST_TYPE_RTP_BASE_DEPAYLOAD);
+
+static gboolean gst_rtp_L8_depay_setcaps (GstRTPBaseDepayload * depayload,
+    GstCaps * caps);
+static GstBuffer *gst_rtp_L8_depay_process (GstRTPBaseDepayload * depayload,
+    GstBuffer * buf);
+
+static void
+gst_rtp_L8_depay_class_init (GstRtpL8DepayClass * klass)
+{
+  GstElementClass *gstelement_class;
+  GstRTPBaseDepayloadClass *gstrtpbasedepayload_class;
+
+  gstelement_class = (GstElementClass *) klass;
+  gstrtpbasedepayload_class = (GstRTPBaseDepayloadClass *) klass;
+
+  gstrtpbasedepayload_class->set_caps = gst_rtp_L8_depay_setcaps;
+  gstrtpbasedepayload_class->process = gst_rtp_L8_depay_process;
+
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&gst_rtp_L8_depay_src_template));
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&gst_rtp_L8_depay_sink_template));
+
+  gst_element_class_set_static_metadata (gstelement_class,
+      "RTP audio depayloader", "Codec/Depayloader/Network/RTP",
+      "Extracts raw audio from RTP packets",
+      "Zeeshan Ali <zak147@yahoo.com>," "Wim Taymans <wim.taymans@gmail.com>, "
+      "GE Intelligent Platforms Embedded Systems, Inc.");
+
+  GST_DEBUG_CATEGORY_INIT (rtpL8depay_debug, "rtpL8depay", 0,
+      "Raw Audio RTP Depayloader");
+}
+
+static void
+gst_rtp_L8_depay_init (GstRtpL8Depay * rtpL8depay)
+{
+}
+
+static gint
+gst_rtp_L8_depay_parse_int (GstStructure * structure, const gchar * field,
+    gint def)
+{
+  const gchar *str;
+  gint res;
+
+  if ((str = gst_structure_get_string (structure, field)))
+    return atoi (str);
+
+  if (gst_structure_get_int (structure, field, &res))
+    return res;
+
+  return def;
+}
+
+static gboolean
+gst_rtp_L8_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps)
+{
+  GstStructure *structure;
+  GstRtpL8Depay *rtpL8depay;
+  gint clock_rate;
+  gint channels;
+  GstCaps *srccaps;
+  gboolean res;
+  const gchar *channel_order;
+  const GstRTPChannelOrder *order;
+  GstAudioInfo *info;
+
+  rtpL8depay = GST_RTP_L8_DEPAY (depayload);
+
+  structure = gst_caps_get_structure (caps, 0);
+
+  /* no fixed mapping, we need clock-rate */
+  channels = 0;
+  clock_rate = 0;
+
+  /* caps can overwrite defaults */
+  clock_rate = gst_rtp_L8_depay_parse_int (structure, "clock-rate", clock_rate);
+  if (clock_rate == 0)
+    goto no_clockrate;
+
+  channels =
+      gst_rtp_L8_depay_parse_int (structure, "encoding-params", channels);
+  if (channels == 0) {
+    channels = gst_rtp_L8_depay_parse_int (structure, "channels", channels);
+    if (channels == 0) {
+      /* channels defaults to 1 otherwise */
+      channels = 1;
+    }
+  }
+
+  depayload->clock_rate = clock_rate;
+
+  info = &rtpL8depay->info;
+  gst_audio_info_init (info);
+  info->finfo = gst_audio_format_get_info (GST_AUDIO_FORMAT_U8);
+  info->rate = clock_rate;
+  info->channels = channels;
+  info->bpf = (info->finfo->width / 8) * channels;
+
+  /* add channel positions */
+  channel_order = gst_structure_get_string (structure, "channel-order");
+
+  order = gst_rtp_channels_get_by_order (channels, channel_order);
+  rtpL8depay->order = order;
+  if (order) {
+    memcpy (info->position, order->pos,
+        sizeof (GstAudioChannelPosition) * channels);
+    gst_audio_channel_positions_to_valid_order (info->position, info->channels);
+  } else {
+    GST_ELEMENT_WARNING (rtpL8depay, STREAM, DECODE,
+        (NULL), ("Unknown channel order '%s' for %d channels",
+            GST_STR_NULL (channel_order), channels));
+    /* create default NONE layout */
+    gst_rtp_channels_create_default (channels, info->position);
+  }
+
+  srccaps = gst_audio_info_to_caps (info);
+  res = gst_pad_set_caps (depayload->srcpad, srccaps);
+  gst_caps_unref (srccaps);
+
+  return res;
+
+  /* ERRORS */
+no_clockrate:
+  {
+    GST_ERROR_OBJECT (depayload, "no clock-rate specified");
+    return FALSE;
+  }
+}
+
+static GstBuffer *
+gst_rtp_L8_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf)
+{
+  GstRtpL8Depay *rtpL8depay;
+  GstBuffer *outbuf;
+  gint payload_len;
+  gboolean marker;
+  GstRTPBuffer rtp = { NULL };
+
+  rtpL8depay = GST_RTP_L8_DEPAY (depayload);
+
+  gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp);
+  payload_len = gst_rtp_buffer_get_payload_len (&rtp);
+
+  if (payload_len <= 0)
+    goto empty_packet;
+
+  GST_DEBUG_OBJECT (rtpL8depay, "got payload of %d bytes", payload_len);
+
+  outbuf = gst_rtp_buffer_get_payload_buffer (&rtp);
+  marker = gst_rtp_buffer_get_marker (&rtp);
+
+  if (marker) {
+    /* mark talk spurt with RESYNC */
+    GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_RESYNC);
+  }
+
+  outbuf = gst_buffer_make_writable (outbuf);
+  if (rtpL8depay->order &&
+      !gst_audio_buffer_reorder_channels (outbuf,
+          rtpL8depay->info.finfo->format, rtpL8depay->info.channels,
+          rtpL8depay->info.position, rtpL8depay->order->pos)) {
+    goto reorder_failed;
+  }
+
+  gst_rtp_buffer_unmap (&rtp);
+
+  return outbuf;
+
+  /* ERRORS */
+empty_packet:
+  {
+    GST_ELEMENT_WARNING (rtpL8depay, STREAM, DECODE,
+        ("Empty Payload."), (NULL));
+    gst_rtp_buffer_unmap (&rtp);
+    return NULL;
+  }
+reorder_failed:
+  {
+    GST_ELEMENT_ERROR (rtpL8depay, STREAM, DECODE,
+        ("Channel reordering failed."), (NULL));
+    gst_rtp_buffer_unmap (&rtp);
+    return NULL;
+  }
+}
+
+gboolean
+gst_rtp_L8_depay_plugin_init (GstPlugin * plugin)
+{
+  return gst_element_register (plugin, "rtpL8depay",
+      GST_RANK_SECONDARY, GST_TYPE_RTP_L8_DEPAY);
+}
diff --git a/gst/rtp/gstrtpL8depay.h b/gst/rtp/gstrtpL8depay.h
new file mode 100644
index 0000000..a2d9bec
--- /dev/null
+++ b/gst/rtp/gstrtpL8depay.h
@@ -0,0 +1,65 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) <2015> GE Intelligent Platforms Embedded Systems, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_RTP_L8_DEPAY_H__
+#define __GST_RTP_L8_DEPAY_H__
+
+#include <gst/gst.h>
+#include <gst/rtp/gstrtpbasedepayload.h>
+#include <gst/audio/audio.h>
+
+#include "gstrtpchannels.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RTP_L8_DEPAY \
+  (gst_rtp_L8_depay_get_type())
+#define GST_RTP_L8_DEPAY(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L8_DEPAY,GstRtpL8Depay))
+#define GST_RTP_L8_DEPAY_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L8_DEPAY,GstRtpL8DepayClass))
+#define GST_IS_RTP_L8_DEPAY(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L8_DEPAY))
+#define GST_IS_RTP_L8_DEPAY_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L8_DEPAY))
+
+typedef struct _GstRtpL8Depay GstRtpL8Depay;
+typedef struct _GstRtpL8DepayClass GstRtpL8DepayClass;
+
+struct _GstRtpL8Depay
+{
+  GstRTPBaseDepayload depayload;
+
+  GstAudioInfo info;
+  const GstRTPChannelOrder *order;
+};
+
+struct _GstRtpL8DepayClass
+{
+  GstRTPBaseDepayloadClass parent_class;
+};
+
+GType gst_rtp_L8_depay_get_type (void);
+
+gboolean gst_rtp_L8_depay_plugin_init (GstPlugin * plugin);
+
+G_END_DECLS
+
+#endif /* __GST_RTP_L8_DEPAY_H__ */
diff --git a/gst/rtp/gstrtpL8pay.c b/gst/rtp/gstrtpL8pay.c
new file mode 100644
index 0000000..86e7b22
--- /dev/null
+++ b/gst/rtp/gstrtpL8pay.c
@@ -0,0 +1,250 @@
+/* GStreamer
+ * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) <2015> GE Intelligent Platforms Embedded Systems, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:element-rtpL8pay
+ * @see_also: rtpL8depay
+ *
+ * Payload raw audio into RTP packets according to RFC 3551.
+ * For detailed information see: http://www.rfc-editor.org/rfc/rfc3551.txt
+ *
+ * <refsect2>
+ * <title>Example pipeline</title>
+ * |[
+ * gst-launch -v audiotestsrc ! audioconvert ! rtpL8pay ! udpsink
+ * ]| This example pipeline will payload raw audio. Refer to
+ * the rtpL8depay example to depayload and play the RTP stream.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <string.h>
+
+#include <gst/audio/audio.h>
+#include <gst/rtp/gstrtpbuffer.h>
+
+#include "gstrtpL8pay.h"
+#include "gstrtpchannels.h"
+
+GST_DEBUG_CATEGORY_STATIC (rtpL8pay_debug);
+#define GST_CAT_DEFAULT (rtpL8pay_debug)
+
+static GstStaticPadTemplate gst_rtp_L8_pay_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("audio/x-raw, "
+        "format = (string) U8, "
+        "layout = (string) interleaved, "
+        "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]")
+    );
+
+static GstStaticPadTemplate gst_rtp_L8_pay_src_template =
+    GST_STATIC_PAD_TEMPLATE ("src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("application/x-rtp, "
+        "media = (string) audio, "
+        "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", "
+        "clock-rate = (int) [ 1, MAX ], "
+        "encoding-name = (string) L8, " "channels = (int) [ 1, MAX ];")
+    );
+
+static gboolean gst_rtp_L8_pay_setcaps (GstRTPBasePayload * basepayload,
+    GstCaps * caps);
+static GstCaps *gst_rtp_L8_pay_getcaps (GstRTPBasePayload * rtppayload,
+    GstPad * pad, GstCaps * filter);
+static GstFlowReturn
+gst_rtp_L8_pay_handle_buffer (GstRTPBasePayload * basepayload,
+    GstBuffer * buffer);
+
+#define gst_rtp_L8_pay_parent_class parent_class
+G_DEFINE_TYPE (GstRtpL8Pay, gst_rtp_L8_pay, GST_TYPE_RTP_BASE_AUDIO_PAYLOAD);
+
+static void
+gst_rtp_L8_pay_class_init (GstRtpL8PayClass * klass)
+{
+  GstElementClass *gstelement_class;
+  GstRTPBasePayloadClass *gstrtpbasepayload_class;
+
+  gstelement_class = (GstElementClass *) klass;
+  gstrtpbasepayload_class = (GstRTPBasePayloadClass *) klass;
+
+  gstrtpbasepayload_class->set_caps = gst_rtp_L8_pay_setcaps;
+  gstrtpbasepayload_class->get_caps = gst_rtp_L8_pay_getcaps;
+  gstrtpbasepayload_class->handle_buffer = gst_rtp_L8_pay_handle_buffer;
+
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&gst_rtp_L8_pay_src_template));
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&gst_rtp_L8_pay_sink_template));
+
+  gst_element_class_set_static_metadata (gstelement_class,
+      "RTP audio payloader", "Codec/Payloader/Network/RTP",
+      "Payload-encode Raw audio into RTP packets (RFC 3551)",
+      "Wim Taymans <wim.taymans@gmail.com>, "
+      "GE Intelligent Platforms Embedded Systems, Inc.");
+
+  GST_DEBUG_CATEGORY_INIT (rtpL8pay_debug, "rtpL8pay", 0, "L8 RTP Payloader");
+}
+
+static void
+gst_rtp_L8_pay_init (GstRtpL8Pay * rtpL8pay)
+{
+  GstRTPBaseAudioPayload *rtpbaseaudiopayload;
+
+  rtpbaseaudiopayload = GST_RTP_BASE_AUDIO_PAYLOAD (rtpL8pay);
+
+  /* tell rtpbaseaudiopayload that this is a sample based codec */
+  gst_rtp_base_audio_payload_set_sample_based (rtpbaseaudiopayload);
+}
+
+static gboolean
+gst_rtp_L8_pay_setcaps (GstRTPBasePayload * basepayload, GstCaps * caps)
+{
+  GstRtpL8Pay *rtpL8pay;
+  gboolean res;
+  gchar *params;
+  GstAudioInfo *info;
+  const GstRTPChannelOrder *order;
+  GstRTPBaseAudioPayload *rtpbaseaudiopayload;
+
+  rtpbaseaudiopayload = GST_RTP_BASE_AUDIO_PAYLOAD (basepayload);
+  rtpL8pay = GST_RTP_L8_PAY (basepayload);
+
+  info = &rtpL8pay->info;
+  gst_audio_info_init (info);
+  if (!gst_audio_info_from_caps (info, caps))
+    goto invalid_caps;
+
+  order = gst_rtp_channels_get_by_pos (info->channels, info->position);
+  rtpL8pay->order = order;
+
+  gst_rtp_base_payload_set_options (basepayload, "audio", TRUE, "L8",
+      info->rate);
+  params = g_strdup_printf ("%d", info->channels);
+
+  if (!order && info->channels > 2) {
+    GST_ELEMENT_WARNING (rtpL8pay, STREAM, DECODE,
+        (NULL), ("Unknown channel order for %d channels", info->channels));
+  }
+
+  if (order && order->name) {
+    res = gst_rtp_base_payload_set_outcaps (basepayload,
+        "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT,
+        info->channels, "channel-order", G_TYPE_STRING, order->name, NULL);
+  } else {
+    res = gst_rtp_base_payload_set_outcaps (basepayload,
+        "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT,
+        info->channels, NULL);
+  }
+
+  g_free (params);
+
+  /* octet-per-sample is # channels for L8 */
+  gst_rtp_base_audio_payload_set_sample_options (rtpbaseaudiopayload,
+      info->channels);
+
+  return res;
+
+  /* ERRORS */
+invalid_caps:
+  {
+    GST_DEBUG_OBJECT (rtpL8pay, "invalid caps");
+    return FALSE;
+  }
+}
+
+static GstCaps *
+gst_rtp_L8_pay_getcaps (GstRTPBasePayload * rtppayload, GstPad * pad,
+    GstCaps * filter)
+{
+  GstCaps *otherpadcaps;
+  GstCaps *caps;
+
+  caps = gst_pad_get_pad_template_caps (pad);
+
+  otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad);
+  if (otherpadcaps) {
+    if (!gst_caps_is_empty (otherpadcaps)) {
+      GstStructure *structure;
+      gint channels;
+      gint rate;
+
+      structure = gst_caps_get_structure (otherpadcaps, 0);
+      caps = gst_caps_make_writable (caps);
+
+      if (gst_structure_get_int (structure, "channels", &channels)) {
+        gst_caps_set_simple (caps, "channels", G_TYPE_INT, channels, NULL);
+      } else {
+        /* Support any number of channels, if not explicitly specified */
+        gst_structure_remove_field (structure, "channels");
+      }
+
+      if (gst_structure_get_int (structure, "clock-rate", &rate)) {
+        gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate, NULL);
+      } else {
+        /* Support any rate, if not explicitly specified */
+        gst_structure_remove_field (structure, "rate");
+      }
+
+    }
+    gst_caps_unref (otherpadcaps);
+  }
+
+  if (filter) {
+    GstCaps *tcaps = caps;
+
+    caps = gst_caps_intersect_full (filter, tcaps, GST_CAPS_INTERSECT_FIRST);
+    gst_caps_unref (tcaps);
+  }
+
+  return caps;
+}
+
+static GstFlowReturn
+gst_rtp_L8_pay_handle_buffer (GstRTPBasePayload * basepayload,
+    GstBuffer * buffer)
+{
+  GstRtpL8Pay *rtpL8pay;
+
+  rtpL8pay = GST_RTP_L8_PAY (basepayload);
+  buffer = gst_buffer_make_writable (buffer);
+
+  if (rtpL8pay->order &&
+      !gst_audio_buffer_reorder_channels (buffer, rtpL8pay->info.finfo->format,
+          rtpL8pay->info.channels, rtpL8pay->info.position,
+          rtpL8pay->order->pos)) {
+    return GST_FLOW_ERROR;
+  }
+
+  return GST_RTP_BASE_PAYLOAD_CLASS (parent_class)->handle_buffer (basepayload,
+      buffer);
+}
+
+gboolean
+gst_rtp_L8_pay_plugin_init (GstPlugin * plugin)
+{
+  return gst_element_register (plugin, "rtpL8pay",
+      GST_RANK_SECONDARY, GST_TYPE_RTP_L8_PAY);
+}
diff --git a/gst/rtp/gstrtpL8pay.h b/gst/rtp/gstrtpL8pay.h
new file mode 100644
index 0000000..183eb2f
--- /dev/null
+++ b/gst/rtp/gstrtpL8pay.h
@@ -0,0 +1,64 @@
+/* GStreamer
+ * Copyright (C) <2005> Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) <2015> GE Intelligent Platforms Embedded Systems, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_RTP_L8_PAY_H__
+#define __GST_RTP_L8_PAY_H__
+
+#include <gst/gst.h>
+#include <gst/rtp/gstrtpbaseaudiopayload.h>
+
+#include "gstrtpchannels.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RTP_L8_PAY \
+  (gst_rtp_L8_pay_get_type())
+#define GST_RTP_L8_PAY(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L8_PAY,GstRtpL8Pay))
+#define GST_RTP_L8_PAY_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L8_PAY,GstRtpL8PayClass))
+#define GST_IS_RTP_L8_PAY(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L8_PAY))
+#define GST_IS_RTP_L8_PAY_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L8_PAY))
+
+typedef struct _GstRtpL8Pay GstRtpL8Pay;
+typedef struct _GstRtpL8PayClass GstRtpL8PayClass;
+
+struct _GstRtpL8Pay
+{
+  GstRTPBaseAudioPayload payload;
+
+  GstAudioInfo info;
+  const GstRTPChannelOrder *order;
+};
+
+struct _GstRtpL8PayClass
+{
+  GstRTPBaseAudioPayloadClass parent_class;
+};
+
+GType gst_rtp_L8_pay_get_type (void);
+
+gboolean gst_rtp_L8_pay_plugin_init (GstPlugin * plugin);
+
+G_END_DECLS
+
+#endif /* __GST_RTP_L8_PAY_H__ */
diff --git a/gst/rtp/meson.build b/gst/rtp/meson.build
index 4696633..6f24152 100644
--- a/gst/rtp/meson.build
+++ b/gst/rtp/meson.build
@@ -54,6 +54,8 @@
   'gstrtpj2kpay.c',
   'gstrtpjpegdepay.c',
   'gstrtpjpegpay.c',
+  'gstrtpL8depay.c',
+  'gstrtpL8pay.c',
   'gstrtpL16depay.c',
   'gstrtpL16pay.c',
   'gstrtpL24depay.c',
