diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index 400a8e3..7e7daa6 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -33,6 +33,9 @@
  * |[
  * gst-launch dvbsrc polarity="h" frequency=11302000 symbol-rate=27500 diseqc-src=0 pids=50:102:103 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mad ! alsasink
  * ]| Captures and renders a transport stream from dvb card 0 that is a DVB-S card for a program at tuned frequency 11302000 Hz, symbol rate of 27500 kHz with PMT pid of 50 and elementary stream pids of 102 and 103.
+ * |[
+ * gst-launch-1.0  dvbsrc  polarity="h" frequency=10773250 modulation=8PSK symbol-rate=22000  delivery-system=dvb-s2 ! tsdemux name=demux program-number=21100 ! video/x-h264 ! queue2 ! h264parse ! avdec_h264 ! videoconvert ! xvimagesink demux. ! audio/x-ac3 ! queue2  ! decodebin !  audioresample ! audioconvert ! alsasink
+ * ]| Captures and renders a transport stream from dvb card 0 that is a DVB-S2 card for a program at tuned frequency 10773250, symbol rate of 22000, modulation 8PSK, delivery-system DVBS2, with SID 21100.
  * </refsect2>
  */
 
@@ -91,7 +94,9 @@ enum
   ARG_DVBSRC_INVERSION,
   ARG_DVBSRC_STATS_REPORTING_INTERVAL,
   ARG_DVBSRC_TIMEOUT,
-  ARG_DVBSRC_DVB_BUFFER_SIZE
+  ARG_DVBSRC_DVB_BUFFER_SIZE,
+  ARG_DVBSRC_DELIVERY_SYSTEM,
+  ARG_DVBSRC_ROLLOFF
 };
 
 #define DEFAULT_ADAPTER 0
@@ -113,6 +118,8 @@ enum
 #define DEFAULT_TIMEOUT 1000000 /* 1 second */
 #define DEFAULT_DVB_BUFFER_SIZE (10*188*1024)   /* Default is the same as the kernel default */
 #define DEFAULT_BUFFER_SIZE 8192        /* not a property */
+#define DEFAULT_DELIVERY_SYSTEM SYS_UNDEFINED   /* S2API property */
+#define DEFAULT_ROLLOFF ROLLOFF_35      /* S2API property */
 
 static void gst_dvbsrc_output_frontend_stats (GstDvbSrc * src);
 
@@ -268,6 +275,62 @@ gst_dvbsrc_inversion_get_type (void)
   return dvbsrc_inversion_type;
 }
 
+#define GST_TYPE_DVBSRC_DELIVERY_SYSTEM (gst_dvbsrc_delivery_system_get_type ())
+static GType
+gst_dvbsrc_delivery_system_get_type (void)
+{
+  static GType dvbsrc_delivery_system_type = 0;
+  static GEnumValue delivery_system_types[] = {
+    {SYS_UNDEFINED, "UNDEFINED", "undefined"},
+    {SYS_DVBC_ANNEX_A, "DVBC-ANNEX-A", "dvbc-annex-a"},
+    {SYS_DVBC_ANNEX_B, "DVBC-ANNEX-B", "dvbc-annex-b"},
+    {SYS_DVBT, "DVB-T", "dvb-t"},
+    {SYS_DSS, "DSS", "dss"},
+    {SYS_DVBS, "DVB-S", "dvb-s"},
+    {SYS_DVBS2, "DVB-S2", "dvb-s2"},
+    {SYS_DVBH, "DVB-H", "dvb-h"},
+    {SYS_ISDBT, "ISDBT", "isdbt"},
+    {SYS_ISDBS, "ISDBS", "isdbs"},
+    {SYS_ISDBC, "ISDBC", "isdbc"},
+    {SYS_ATSC, "ATSC", "atsc"},
+    {SYS_ATSCMH, "ATSCMH", "atscmh"},
+    {SYS_DTMB, "DTMB", "dtmb"},
+    {SYS_CMMB, "CMMB", "cmmb"},
+    {SYS_DAB, "DAB", "dab"},
+    {SYS_DVBT2, "DVB-T2", "dvb-t2"},
+    {SYS_TURBO, "TURBO", "turbo"},
+    {SYS_DVBC_ANNEX_C, "DVBC-ANNEX-C", "dvbc-annex-c"},
+    {0, NULL, NULL},
+  };
+
+  if (!dvbsrc_delivery_system_type) {
+    dvbsrc_delivery_system_type =
+        g_enum_register_static ("GstDvbSrcDeliverySystem",
+        delivery_system_types);
+  }
+  return dvbsrc_delivery_system_type;
+}
+
+#define GST_TYPE_DVBSRC_ROLLOFF (gst_dvbsrc_rolloff_get_type ())
+static GType
+gst_dvbsrc_rolloff_get_type (void)
+{
+  static GType dvbsrc_rolloff_type = 0;
+  static GEnumValue rolloff_types[] = {
+    {ROLLOFF_35, "0.35", "35"},
+    {ROLLOFF_20, "0.20", "20"},
+    {ROLLOFF_25, "0.25", "25"},
+    {ROLLOFF_AUTO, "AUTO", "auto"},
+    {0, NULL, NULL},
+  };
+
+  if (!dvbsrc_rolloff_type) {
+    dvbsrc_rolloff_type =
+        g_enum_register_static ("GstDvbSrcRollOff", rolloff_types);
+  }
+  return dvbsrc_rolloff_type;
+}
+
 static void gst_dvbsrc_finalize (GObject * object);
 static void gst_dvbsrc_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
@@ -456,6 +519,19 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
           "dvb-buffer-size",
           "The kernel buffer size used by the DVB api",
           0, G_MAXUINT, DEFAULT_DVB_BUFFER_SIZE, G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+      ARG_DVBSRC_DELIVERY_SYSTEM,
+      g_param_spec_enum ("delivery-system", "delivery-system",
+          "Delivery System (eg. dvb-s2)", GST_TYPE_DVBSRC_DELIVERY_SYSTEM,
+          DEFAULT_DELIVERY_SYSTEM, G_PARAM_READWRITE));
+
+
+  g_object_class_install_property (gobject_class,
+      ARG_DVBSRC_ROLLOFF,
+      g_param_spec_enum ("rolloff", "rolloff",
+          "Roll-off factor", GST_TYPE_DVBSRC_ROLLOFF,
+          DEFAULT_ROLLOFF, G_PARAM_READWRITE));
 }
 
 /* initialize the new element
@@ -501,6 +577,7 @@ gst_dvbsrc_init (GstDvbSrc * object)
   object->hierarchy_information = DEFAULT_HIERARCHY;
   object->inversion = DEFAULT_INVERSION;
   object->stats_interval = DEFAULT_STATS_REPORTING_INTERVAL;
+  object->delivery_system = DEFAULT_DELIVERY_SYSTEM;
 
   g_mutex_init (&object->tune_mutex);
   object->timeout = DEFAULT_TIMEOUT;
@@ -651,6 +728,12 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
     case ARG_DVBSRC_DVB_BUFFER_SIZE:
       object->dvb_buffer_size = g_value_get_uint (value);
       break;
+    case ARG_DVBSRC_DELIVERY_SYSTEM:
+      object->delivery_system = g_value_get_enum (value);
+      break;
+    case ARG_DVBSRC_ROLLOFF:
+      object->rolloff = g_value_get_enum (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   }
@@ -720,6 +803,12 @@ gst_dvbsrc_get_property (GObject * _object, guint prop_id,
     case ARG_DVBSRC_DVB_BUFFER_SIZE:
       g_value_set_uint (value, object->dvb_buffer_size);
       break;
+    case ARG_DVBSRC_DELIVERY_SYSTEM:
+      g_value_set_enum (value, object->delivery_system);
+      break;
+    case ARG_DVBSRC_ROLLOFF:
+      g_value_set_enum (value, object->rolloff);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   }
@@ -1282,7 +1371,7 @@ gst_dvbsrc_tune (GstDvbSrc * object)
   int n;
   int i;
   int j;
-  unsigned int del_sys = SYS_UNDEFINED;
+  int del_sys = SYS_UNDEFINED;
   unsigned int freq = object->freq;
   unsigned int sym_rate = object->sym_rate * 1000;
   unsigned int bandwidth;
@@ -1333,13 +1422,23 @@ gst_dvbsrc_tune (GstDvbSrc * object)
         inversion = INVERSION_AUTO;
         set_prop (dvb_prop, &n, DTV_SYMBOL_RATE, sym_rate);
         set_prop (dvb_prop, &n, DTV_INNER_FEC, object->code_rate_hp);
-        /* TODO add dvbs2 */
-        del_sys = SYS_DVBS;
+        /* add dvbs2 */
+        if (object->delivery_system == DEFAULT_DELIVERY_SYSTEM)
+          del_sys = SYS_DVBS;   /* default for this adapter type */
+        else
+          del_sys = object->delivery_system;
+
+        if (object->modulation == DEFAULT_MODULATION)
+          set_prop (dvb_prop, &n, DTV_MODULATION, QPSK);
+        else
+          set_prop (dvb_prop, &n, DTV_MODULATION, object->modulation);
+
+        set_prop (dvb_prop, &n, DTV_ROLLOFF, object->rolloff);
 
         GST_INFO_OBJECT (object,
-            "tuning DVB-S to L-Band:%u, Pol:%d, srate=%u, 22kHz=%s",
-            freq, object->pol, sym_rate,
-            object->tone == SEC_TONE_ON ? "on" : "off");
+            "tuning to:%s, ifreq:%u, Pol:%d, srate=%u, 22kHz=%s",
+            del_sys == SYS_DVBS ? "DVB-S" : "DVB-S2", freq, object->pol,
+            sym_rate, object->tone == SEC_TONE_ON ? "on" : "off");
 
         if (object->pol == DVB_POL_H)
           voltage = SEC_VOLTAGE_18;
diff --git a/sys/dvb/gstdvbsrc.h b/sys/dvb/gstdvbsrc.h
index adf6c0e..766bd61 100644
--- a/sys/dvb/gstdvbsrc.h
+++ b/sys/dvb/gstdvbsrc.h
@@ -61,6 +61,8 @@ struct _GstDvbSrc
   int tone;
   int diseqc_src;
   gboolean send_diseqc;
+  int delivery_system;
+  int rolloff;
 
   int bandwidth;
   int code_rate_hp;
@@ -78,6 +80,7 @@ struct _GstDvbSrc
   gboolean need_unlock;
 
   guint dvb_buffer_size;
+
 };
 
 struct _GstDvbSrcClass
