diff --git a/ext/opus/gstopusdec.c b/ext/opus/gstopusdec.c
index c88b9ee..3785ac5 100644
--- a/ext/opus/gstopusdec.c
+++ b/ext/opus/gstopusdec.c
@@ -75,12 +75,15 @@ G_DEFINE_TYPE (GstOpusDec, gst_opus_dec, GST_TYPE_AUDIO_DECODER);
 
 #define DEFAULT_USE_INBAND_FEC FALSE
 #define DEFAULT_APPLY_GAIN TRUE
+/* Assume the maximum packet duration as per spec, since we don't know anything about the encoder */
+#define DEFAULT_EXPECTED_PACKET_DURATION 120
 
 enum
 {
   PROP_0,
   PROP_USE_INBAND_FEC,
-  PROP_APPLY_GAIN
+  PROP_APPLY_GAIN,
+  PROP_EXPECTED_PACKET_DURATION
 };
 
 
@@ -129,11 +132,19 @@ gst_opus_dec_class_init (GstOpusDecClass * klass)
       g_param_spec_boolean ("use-inband-fec", "Use in-band FEC",
           "Use forward error correction if available", DEFAULT_USE_INBAND_FEC,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
   g_object_class_install_property (gobject_class, PROP_APPLY_GAIN,
       g_param_spec_boolean ("apply-gain", "Apply gain",
           "Apply gain if any is specified in the header", DEFAULT_APPLY_GAIN,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /* Note that, although opusenc only produces single frame packets (thus up to 60ms),
+   * Opus Repacketizer can combine multiple frames for up to 120ms packets. */
+  g_object_class_install_property (gobject_class, PROP_EXPECTED_PACKET_DURATION,
+      g_param_spec_int ("expected-packet-duration", "Expected Packet Duration",
+          "The (maximum) duration of an incoming packet in ms; influences minimum latency",
+          0, 120, DEFAULT_EXPECTED_PACKET_DURATION,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+          /* TODO: can we change in paused? can we change in playing maybe? */
+          GST_PARAM_MUTABLE_PAUSED));
 
   GST_DEBUG_CATEGORY_INIT (opusdec_debug, "opusdec", 0,
       "opus decoding element");
@@ -162,8 +173,9 @@ gst_opus_dec_reset (GstOpusDec * dec)
 static void
 gst_opus_dec_init (GstOpusDec * dec)
 {
-  dec->use_inband_fec = FALSE;
+  dec->use_inband_fec = DEFAULT_USE_INBAND_FEC;
   dec->apply_gain = DEFAULT_APPLY_GAIN;
+  dec->expected_packet_duration = DEFAULT_EXPECTED_PACKET_DURATION;
 
   gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (dec), TRUE);
 
@@ -185,7 +197,7 @@ gst_opus_dec_start (GstAudioDecoder * dec)
      * FEC is on, in which case it buffers one buffer in case one buffer
      * goes missing.
      */
-    gst_audio_decoder_set_latency (dec, 120 * GST_MSECOND, 120 * GST_MSECOND);
+    gst_audio_decoder_set_latency (dec, odec->expected_packet_duration * GST_MSECOND, odec->expected_packet_duration * GST_MSECOND);
   }
 
   return TRUE;
@@ -724,6 +736,9 @@ gst_opus_dec_get_property (GObject * object, guint prop_id, GValue * value,
     case PROP_APPLY_GAIN:
       g_value_set_boolean (value, dec->apply_gain);
       break;
+    case PROP_EXPECTED_PACKET_DURATION:
+      g_value_set_int (value, dec->expected_packet_duration);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -743,6 +758,10 @@ gst_opus_dec_set_property (GObject * object, guint prop_id,
     case PROP_APPLY_GAIN:
       dec->apply_gain = g_value_get_boolean (value);
       break;
+    case PROP_EXPECTED_PACKET_DURATION:
+      dec->expected_packet_duration = g_value_get_int (value);
+      /* TODO: update latency of running pipeline? */
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
diff --git a/ext/opus/gstopusdec.h b/ext/opus/gstopusdec.h
index 4a270fe..092a6c6 100644
--- a/ext/opus/gstopusdec.h
+++ b/ext/opus/gstopusdec.h
@@ -69,6 +69,7 @@ struct _GstOpusDec {
   double r128_gain_volume;
 
   gboolean use_inband_fec;
+  gint expected_packet_duration;
   GstBuffer *last_buffer;
   gboolean primed;
 };
