diff --git a/libcelt/celt.c b/libcelt/celt.c
index 26ec8e14756093ddacb82dc057c9b81f6325fef4..72045d9a0d35ca3a459b7b10df88a4caf13504d9 100644
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -918,6 +918,14 @@ int celt_encoder_ctl(CELTEncoder * restrict st, int request, ...)
    va_start(ap, request);
    switch (request)
    {
+      case CELT_GET_MODE_REQUEST:
+      {
+         const CELTMode ** value = va_arg(ap, const CELTMode**);
+         if (value==0)
+            goto bad_arg;
+         *value=st->mode;
+      }
+      break;
       case CELT_SET_COMPLEXITY_REQUEST:
       {
          int value = va_arg(ap, celt_int32_t);
@@ -1351,6 +1359,14 @@ int celt_decoder_ctl(CELTDecoder * restrict st, int request, ...)
    va_start(ap, request);
    switch (request)
    {
+      case CELT_GET_MODE_REQUEST:
+      {
+         const CELTMode ** value = va_arg(ap, const CELTMode**);
+         if (value==0)
+            goto bad_arg;
+         *value=st->mode;
+      }
+      break;
       case CELT_RESET_STATE:
       {
          const CELTMode *mode = st->mode;
@@ -1369,11 +1385,9 @@ int celt_decoder_ctl(CELTDecoder * restrict st, int request, ...)
    }
    va_end(ap);
    return CELT_OK;
-#if 0    /* Put this back in if you ever need "bad_arg" */
 bad_arg:
    va_end(ap);
    return CELT_BAD_ARG;
-#endif
 bad_request:
       va_end(ap);
   return CELT_UNIMPLEMENTED;
diff --git a/libcelt/celt.h b/libcelt/celt.h
index aa403641795036ce0f39a24a73c2e40d2e040c49..8ed67f3d9a1ab8e7c7293f4b30a29212ff71d72c 100644
--- a/libcelt/celt.h
+++ b/libcelt/celt.h
@@ -52,6 +52,7 @@ extern "C" {
 #endif
 
 #define _celt_check_int(x) (((void)((x) == (celt_int32_t)0)), (celt_int32_t)(x))
+#define _celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (CELTMode**)(ptr)))
 
 /* Error codes */
 /** No error */
@@ -68,6 +69,9 @@ extern "C" {
 #define CELT_UNIMPLEMENTED    -5
 
 /* Requests */
+#define CELT_GET_MODE_REQUEST    1
+/** Get the CELTMode used by an encoder or decoder */
+#define CELT_GET_MODE(x) CELT_GET_MODE_REQUEST, _celt_check_mode_ptr_ptr(x)
 #define CELT_SET_COMPLEXITY_REQUEST    2
 /** Controls the complexity from 0-10 (int) */
 #define CELT_SET_COMPLEXITY(x) CELT_SET_COMPLEXITY_REQUEST, _celt_check_int(x)