diff --git a/modules/access/dvb/access.c b/modules/access/dvb/access.c
index f88d27f..ae47336 100644
--- a/modules/access/dvb/access.c
+++ b/modules/access/dvb/access.c
@@ -92,6 +92,9 @@ static void Close( vlc_object_t *p_this );
 #define DEVICE_TEXT N_("Device number to use on adapter")
 #define DEVICE_LONGTEXT ""
 
+#define DELIVERY_TEXT N_("Delivery System")
+#define DELIVERY_LONGTEXT ""
+
 #define FREQ_TEXT N_("Transponder/multiplex frequency")
 #define FREQ_LONGTEXT N_("In kHz for DVB-S or Hz for DVB-C/T")
 
@@ -115,6 +118,9 @@ static void Close( vlc_object_t *p_this );
 #define HIGH_VOLTAGE_LONGTEXT N_("Enable high voltage if your cables are " \
     "particularly long. This is not supported by all frontends.")
 
+#define MODULATION_2G_TEXT N_("2nd Gen Modulation")
+#define MODULATION_2G_LONGTEXT N_("DVB-S2, C2 and T2 support")
+
 #define TONE_TEXT N_("22 kHz tone")
 #define TONE_LONGTEXT N_("[0=off, 1=on, -1=auto].")
 
@@ -203,6 +209,8 @@ vlc_module_begin ()
                  false )
     add_integer( "dvb-device", 0, NULL, DEVICE_TEXT, DEVICE_LONGTEXT,
                  true )
+    add_integer( "dvb-delivery", 0, NULL, DELIVERY_TEXT, DELIVERY_LONGTEXT,
+                  true );
     add_integer( "dvb-frequency", 0, NULL, FREQ_TEXT, FREQ_LONGTEXT,
                  false )
     add_integer( "dvb-inversion", 2, NULL, INVERSION_TEXT, INVERSION_LONGTEXT,
@@ -217,6 +225,9 @@ vlc_module_begin ()
                  true )
     add_bool( "dvb-high-voltage", false, NULL, HIGH_VOLTAGE_TEXT,
               HIGH_VOLTAGE_LONGTEXT, true )
+    // TODO: Added 2G modulation
+    add_bool( "dvb-2g-modulation", 0, NULL, MODULATION_2G_TEXT,
+           MODULATION_2G_LONGTEXT, true );
     add_integer( "dvb-tone", -1, NULL, TONE_TEXT, TONE_LONGTEXT,
                  true )
     add_integer( "dvb-fec", 9, NULL, FEC_TEXT, FEC_LONGTEXT, true )
@@ -870,12 +881,15 @@ static void VarInit( access_t *p_access )
     /* */
     var_Create( p_access, "dvb-adapter", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Create( p_access, "dvb-device", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+    var_Create( p_access, "dvb-delivery", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Create( p_access, "dvb-frequency", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Create( p_access, "dvb-inversion", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Create( p_access, "dvb-probe", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
     var_Create( p_access, "dvb-budget-mode", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
 
     /* */
+    //TODO: Added 2nd gen mod
+    var_Create( p_access, "dvb-2g-modulation", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Create( p_access, "dvb-satno", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Create( p_access, "dvb-voltage", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Create( p_access, "dvb-high-voltage", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
@@ -954,8 +968,9 @@ static int ParseMRL( access_t *p_access )
         else GET_OPTION_INT("inversion")
         else GET_OPTION_BOOL("probe")
         else GET_OPTION_BOOL("budget-mode")
-
+		else GET_OPTION_INT("dvb-delivery")
         else GET_OPTION_INT("voltage")
+        else GET_OPTION_BOOL("dvb-2g-modulation")
         else GET_OPTION_BOOL("high-voltage")
         else GET_OPTION_INT("tone")
         else GET_OPTION_INT("satno")
diff --git a/modules/access/dvb/linux_dvb.c b/modules/access/dvb/linux_dvb.c
index af792d8..149ba5c 100644
--- a/modules/access/dvb/linux_dvb.c
+++ b/modules/access/dvb/linux_dvb.c
@@ -87,6 +87,7 @@ struct frontend_t
 #define FRONTEND_LOCK_TIMEOUT 10000000 /* 10 s */
 
 /* Local prototypes */
+static fe_modulation_t DecodeModulationPSK( access_t *p_access );
 static int FrontendInfo( access_t * );
 static int FrontendSetQPSK( access_t * );
 static int FrontendSetQAM( access_t * );
@@ -138,6 +139,7 @@ int FrontendOpen( access_t *p_access )
             return VLC_EGENERIC;
         }
 
+        msg_Dbg( p_access, "Frontend open - about to check type" );
         switch( p_frontend->info.type )
         {
         case FE_OFDM:
@@ -147,7 +149,16 @@ int FrontendOpen( access_t *p_access )
             psz_real = "DVB-C";
             break;
         case FE_QPSK:
-            psz_real = "DVB-S";
+            msg_Dbg( p_access, "Checking for DVB-S or DVB-S2" );
+            if (p_frontend->info.caps & FE_CAN_2G_MODULATION)
+            {
+                // If can do 2G Mod, we have a DVB-S2 card
+                psz_real = "DVB-S2";
+            }
+            else
+            {
+                psz_real = "DVB-S";
+            }
             break;
         case FE_ATSC:
             psz_real = "ATSC";
@@ -245,7 +256,7 @@ int FrontendSet( access_t *p_access )
     case FE_QPSK:
         if( FrontendSetQPSK( p_access ) < 0 )
         {
-            msg_Err( p_access, "DVB-S: tuning failed" );
+            msg_Err( p_access, "DVB-S/DVB-S2: tuning failed" );
             return VLC_EGENERIC;
         }
         break;
@@ -636,7 +647,14 @@ static int FrontendInfo( access_t *p_access )
     switch( p_frontend->info.type )
     {
         case FE_QPSK:
-            msg_Dbg( p_access, "  type = QPSK (DVB-S)" );
+            if( p_frontend->info.caps & FE_CAN_2G_MODULATION )
+            {
+                msg_Dbg( p_access, "  type = DVB-S2" );
+            }
+            else
+            {
+                msg_Dbg( p_access, "  type = DVB-S" );
+            }
             break;
         case FE_QAM:
             msg_Dbg( p_access, "  type = QAM (DVB-C)" );
@@ -726,6 +744,8 @@ static int FrontendInfo( access_t *p_access )
         msg_Dbg(p_access, "  card can mute TS");
     if( p_frontend->info.caps & FE_CAN_RECOVER)
         msg_Dbg(p_access, "  card can recover from a cable unplug");
+    if( p_frontend->info.caps & FE_CAN_2G_MODULATION)
+        msg_Dbg(p_access, "  card can do 2nd gen modulation");
     if( p_frontend->info.caps & FE_CAN_8VSB)
         msg_Dbg(p_access, "  card can do 8vsb");
     if( p_frontend->info.caps & FE_CAN_16VSB)
@@ -759,6 +779,9 @@ static fe_spectral_inversion_t DecodeInversion( access_t *p_access )
     return fe_inversion;
 }
 
+/*****************************************************************************
+ * DecodeFEC: Returns FEC value
+ *****************************************************************************/
 static fe_code_rate_t DecodeFEC( access_t *p_access, int i_val )
 {
     fe_code_rate_t      fe_fec = FEC_NONE;
@@ -777,6 +800,11 @@ static fe_code_rate_t DecodeFEC( access_t *p_access, int i_val )
         case 7: fe_fec = FEC_7_8; break;
         case 8: fe_fec = FEC_8_9; break;
         case 9: fe_fec = FEC_AUTO; break;
+
+        // Added new values
+        case 10: fe_fec = FEC_3_5; break;
+        case 11: fe_fec = FEC_9_10; break;
+
         default:
             /* cannot happen */
             fe_fec = FEC_NONE;
@@ -786,6 +814,9 @@ static fe_code_rate_t DecodeFEC( access_t *p_access, int i_val )
     return fe_fec;
 }
 
+/*****************************************************************************
+ * DecodeModulationQAM: Returns QAM modulation
+ *****************************************************************************/
 static fe_modulation_t DecodeModulationQAM( access_t *p_access )
 {
     switch( var_GetInteger( p_access, "dvb-modulation" ) )
@@ -801,6 +832,10 @@ static fe_modulation_t DecodeModulationQAM( access_t *p_access )
             return QAM_AUTO;
     }
 }
+
+/*****************************************************************************
+ * DecodeModulationOFDM : Returns OFDM modulation
+ *****************************************************************************/
 static fe_modulation_t DecodeModulationOFDM( access_t *p_access )
 {
     switch( var_GetInteger( p_access, "dvb-modulation" ) )
@@ -817,6 +852,9 @@ static fe_modulation_t DecodeModulationOFDM( access_t *p_access )
             return QAM_AUTO;
     }
 }
+/*****************************************************************************
+ * DecodeModulationATSC : Returns ATSC modulation
+ *****************************************************************************/
 static fe_modulation_t DecodeModulationATSC( access_t *p_access )
 {
     switch( var_GetInteger( p_access, "dvb-modulation" ) )
@@ -835,7 +873,37 @@ static fe_modulation_t DecodeModulationATSC( access_t *p_access )
 }
 
 /*****************************************************************************
- * FrontendSetQPSK : controls the FE device
+ * DecodeDeliverySystem : Returns delivery system
+ *****************************************************************************/
+static fe_delivery_system_t DecodeDeliverySystem( access_t *p_access )
+{
+    return var_GetInteger( p_access, "dvb-delivery" );
+}
+
+/*****************************************************************************
+ * DecodeModulationPSK : Returns DVB-S modulation
+ *****************************************************************************/
+static fe_modulation_t DecodeModulationPSK( access_t *p_access )
+{
+    int mod;
+
+    mod = var_GetInteger( p_access, "dvb-modulation" );
+
+    switch(mod)
+    {
+        case QPSK:     return QPSK;
+        case PSK_8:    return PSK_8;
+        case APSK_16:  return APSK_16;
+        case APSK_32:  return APSK_32;
+        default:
+            msg_Dbg( p_access, "DVB modulation not set, got %d, using QPSK",mod);
+            return QPSK;
+    }
+}
+
+
+/*****************************************************************************
+ * DecodeVoltage : controls the FE device
  *****************************************************************************/
 static fe_sec_voltage_t DecodeVoltage( access_t *p_access )
 {
@@ -989,6 +1057,9 @@ static int DoDiseqc( access_t *p_access )
     return 0;
 }
 
+/*****************************************************************************
+ * FrontendSetQPSK : controls the FE device
+ *****************************************************************************/
 static int FrontendSetQPSK( access_t *p_access )
 {
     access_sys_t *p_sys = p_access->p_sys;
@@ -1000,6 +1071,10 @@ static int FrontendSetQPSK( access_t *p_access )
     /* Prepare the fep structure */
     i_frequency = var_GetInteger( p_access, "dvb-frequency" );
 
+    fe_modulation_t modulation = DecodeModulationPSK(p_access);
+    // TODO: is this a valid way of determining between DVB-S and DVB-S2?
+    fe_delivery_system_t delSys = DecodeDeliverySystem(p_access);
+
     i_val = var_GetInteger( p_access, "dvb-lnb-lof1" );
     if( i_val == 0 )
     {
@@ -1074,19 +1149,36 @@ static int FrontendSetQPSK( access_t *p_access )
         return VLC_EGENERIC;
     }
 
-    /* Empty the event queue */
-    for( ; ; )
-    {
-        struct dvb_frontend_event event;
-        if ( ioctl( p_sys->i_frontend_handle, FE_GET_EVENT, &event ) < 0
-              && errno == EWOULDBLOCK )
+    struct dvb_frontend_event ev;
+    struct dtv_property p_tune[] = {
+        { .cmd = DTV_DELIVERY_SYSTEM,    .u.data = delSys },
+        { .cmd = DTV_FREQUENCY,            .u.data = fep.frequency },
+        { .cmd = DTV_MODULATION,        .u.data = modulation },
+        { .cmd = DTV_SYMBOL_RATE,        .u.data = fep.u.qpsk.symbol_rate },
+        { .cmd = DTV_INNER_FEC,            .u.data = fep.u.qpsk.fec_inner },
+        { .cmd = DTV_INVERSION,            .u.data = fep.inversion },
+        { .cmd = DTV_ROLLOFF,            .u.data = ROLLOFF_AUTO },
+        { .cmd = DTV_TUNE },
+    };
+    struct dtv_properties cmdseq_tune = {
+        .num = 8,        //Important - this must match the count of .cmd's above
+        .props = p_tune
+    };
+
+    /* discard stale QPSK events */
+    while( 1 )
+    {
+        if( ioctl(p_sys->i_frontend_handle, FE_GET_EVENT, &ev) == -1)
             break;
     }
 
+    msg_Dbg( p_access, "about to tune: mod=%d delivery=%d, freq=%d",
+             modulation, delSys, fep.frequency);
+
     /* Now send it all to the frontend device */
-    if( (i_ret = ioctl( p_sys->i_frontend_handle, FE_SET_FRONTEND, &fep )) < 0 )
+    if( ioctl(p_sys->i_frontend_handle, FE_SET_PROPERTY, &cmdseq_tune) == -1)
     {
-        msg_Err( p_access, "DVB-S: setting frontend failed (%d) %m", i_ret );
+        msg_Err(p_access,"FE_SET_PROPERTY TUNE failed");
         return VLC_EGENERIC;
     }
 
@@ -1578,7 +1670,7 @@ int CAMOpen( access_t *p_access )
         msg_Dbg( p_access, "CAMInit: NDS scrambling system supported" );
     if ( caps.descr_type & CA_DSS )
         msg_Dbg( p_access, "CAMInit: DSS scrambling system supported" );
- 
+
     if ( caps.slot_num == 0 )
     {
         msg_Err( p_access, "CAMInit: CAM module with no slots" );
