diff --git a/libcelt/celt.c b/libcelt/celt.c
index f85c21dec4468455fae645f10ffb177ccb642c3b..809f8f517aef40b957cb78ecfe7b3843451534ed 100644
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -197,57 +197,42 @@ int celt_encoder_get_size_custom(const CELTMode *mode, int channels)
    return size;
 }
 
-CELTEncoder *celt_encoder_create(int sampling_rate, int channels, int *error)
-{
-   CELTEncoder *st;
-   st = (CELTEncoder *)opus_alloc(celt_encoder_get_size(channels));
-   if (st!=NULL && celt_encoder_init(st, sampling_rate, channels, error)==NULL)
-   {
-      celt_encoder_destroy(st);
-      st = NULL;
-   }
-   return st;
-}
-
 CELTEncoder *celt_encoder_create_custom(const CELTMode *mode, int channels, int *error)
 {
+   int ret;
    CELTEncoder *st = (CELTEncoder *)opus_alloc(celt_encoder_get_size_custom(mode, channels));
-   if (st!=NULL && celt_encoder_init_custom(st, mode, channels, error)==NULL)
+   /* init will handle the NULL case */
+   ret = celt_encoder_init_custom(st, mode, channels);
+   if (ret != CELT_OK)
    {
       celt_encoder_destroy(st);
       st = NULL;
+      if (error)
+         *error = ret;
    }
    return st;
 }
 
-CELTEncoder *celt_encoder_init(CELTEncoder *st, int sampling_rate, int channels, int *error)
+int celt_encoder_init(CELTEncoder *st, int sampling_rate, int channels)
 {
-   celt_encoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels, error);
+   int ret;
+   ret = celt_encoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels);
+   if (ret != CELT_OK)
+      return ret;
    st->upsample = resampling_factor(sampling_rate);
    if (st->upsample==0)
-   {
-      if (error)
-         *error = CELT_BAD_ARG;
-      return NULL;
-   }
-   return st;
+      return CELT_BAD_ARG;
+   else
+      return CELT_OK;
 }
 
-CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels, int *error)
+int celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels)
 {
    if (channels < 0 || channels > 2)
-   {
-      if (error)
-         *error = CELT_BAD_ARG;
-      return NULL;
-   }
+      return CELT_BAD_ARG;
 
    if (st==NULL || mode==NULL)
-   {
-      if (error)
-         *error = CELT_ALLOC_FAIL;
-      return NULL;
-   }
+      return CELT_ALLOC_FAIL;
 
    OPUS_CLEAR((char*)st, celt_encoder_get_size_custom(mode, channels));
 
@@ -274,9 +259,7 @@ CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int
    st->tapset_decision = 0;
    st->complexity = 5;
 
-   if (error)
-      *error = CELT_OK;
-   return st;
+   return CELT_OK;
 }
 
 void celt_encoder_destroy(CELTEncoder *st)
@@ -1921,57 +1904,41 @@ int celt_decoder_get_size_custom(const CELTMode *mode, int channels)
    return size;
 }
 
-CELTDecoder *celt_decoder_create(int sampling_rate, int channels, int *error)
-{
-   CELTDecoder *st;
-   st = (CELTDecoder *)opus_alloc(celt_decoder_get_size(channels));
-   if (st!=NULL && celt_decoder_init(st, sampling_rate, channels, error)==NULL)
-   {
-      celt_decoder_destroy(st);
-      st = NULL;
-   }
-   return st;
-}
-
 CELTDecoder *celt_decoder_create_custom(const CELTMode *mode, int channels, int *error)
 {
+   int ret;
    CELTDecoder *st = (CELTDecoder *)opus_alloc(celt_decoder_get_size_custom(mode, channels));
-   if (st!=NULL && celt_decoder_init_custom(st, mode, channels, error)==NULL)
+   ret = celt_decoder_init_custom(st, mode, channels);
+   if (ret != CELT_OK)
    {
       celt_decoder_destroy(st);
       st = NULL;
+      if (error)
+         *error = ret;
    }
    return st;
 }
 
-CELTDecoder *celt_decoder_init(CELTDecoder *st, int sampling_rate, int channels, int *error)
+int celt_decoder_init(CELTDecoder *st, int sampling_rate, int channels)
 {
-   celt_decoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels, error);
+   int ret;
+   ret = celt_decoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels);
+   if (ret != CELT_OK)
+      return ret;
    st->downsample = resampling_factor(sampling_rate);
    if (st->downsample==0)
-   {
-      if (error)
-         *error = CELT_BAD_ARG;
-      return NULL;
-   }
-   return st;
+      return CELT_BAD_ARG;
+   else
+      return CELT_OK;
 }
 
-CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels, int *error)
+int celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels)
 {
    if (channels < 0 || channels > 2)
-   {
-      if (error)
-         *error = CELT_BAD_ARG;
-      return NULL;
-   }
+      return CELT_BAD_ARG;
 
    if (st==NULL)
-   {
-      if (error)
-         *error = CELT_ALLOC_FAIL;
-      return NULL;
-   }
+      return CELT_ALLOC_FAIL;
 
    OPUS_CLEAR((char*)st, celt_decoder_get_size_custom(mode, channels));
 
@@ -1986,9 +1953,7 @@ CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int
 
    st->loss_count = 0;
 
-   if (error)
-      *error = CELT_OK;
-   return st;
+   return CELT_OK;
 }
 
 void celt_decoder_destroy(CELTDecoder *st)
diff --git a/libcelt/celt.h b/libcelt/celt.h
index 21ac728c1a938052d2fcdad6cf205fb44f7228de..8237076a8b65c06fc2519321b9d96b00a36eac22 100644
--- a/libcelt/celt.h
+++ b/libcelt/celt.h
@@ -171,14 +171,6 @@ CELT_EXPORT int celt_encoder_get_size(int channels);
 
 CELT_EXPORT int celt_encoder_get_size_custom(const CELTMode *mode, int channels);
 
-/** Creates a new encoder state. Each stream needs its own encoder
-    state (can't be shared across simultaneous streams).
- @param channels Number of channels
- @param error Returns an error code
- @return Newly created encoder state.
-*/
-CELT_EXPORT CELTEncoder *celt_encoder_create(int sampling_rate, int channels, int *error);
-
 /** Creates a new encoder state. Each stream needs its own encoder
     state (can't be shared across simultaneous streams).
  @param mode Contains all the information about the characteristics of
@@ -190,9 +182,9 @@ CELT_EXPORT CELTEncoder *celt_encoder_create(int sampling_rate, int channels, in
 */
 CELT_EXPORT CELTEncoder *celt_encoder_create_custom(const CELTMode *mode, int channels, int *error);
 
-CELT_EXPORT CELTEncoder *celt_encoder_init(CELTEncoder *st, int sampling_rate, int channels, int *error);
+CELT_EXPORT int celt_encoder_init(CELTEncoder *st, int sampling_rate, int channels);
 
-CELT_EXPORT CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels, int *error);
+CELT_EXPORT int celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels);
 
 /** Destroys a an encoder state.
  @param st Encoder state to be destroyed
@@ -269,9 +261,9 @@ CELT_EXPORT CELTDecoder *celt_decoder_create(int sampling_rate, int channels, in
  */
 CELT_EXPORT CELTDecoder *celt_decoder_create_custom(const CELTMode *mode, int channels, int *error);
 
-CELT_EXPORT CELTDecoder *celt_decoder_init(CELTDecoder *st, int sampling_rate, int channels, int *error);
+CELT_EXPORT int celt_decoder_init(CELTDecoder *st, int sampling_rate, int channels);
 
-CELT_EXPORT CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels, int *error);
+CELT_EXPORT int celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels);
 
 /** Destroys a a decoder state.
  @param st Decoder state to be destroyed
diff --git a/src/opus_decoder.c b/src/opus_decoder.c
index 57f04ff9bc41394a2bf9d3c8a14a98faf73f0cf5..a90f9104dafc08d3bf72f59176652bd6242e4874 100644
--- a/src/opus_decoder.c
+++ b/src/opus_decoder.c
@@ -109,7 +109,7 @@ int opus_decoder_init(OpusDecoder *st, int Fs, int channels)
     }
 
 	/* Initialize CELT decoder */
-	celt_decoder_init(celt_dec, Fs, channels, &ret);
+	ret = celt_decoder_init(celt_dec, Fs, channels);
 	if (ret != CELT_OK)
 		goto failure;
     celt_decoder_ctl(celt_dec, CELT_SET_SIGNALLING(0));
diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index e7a387fa799e1c13ce15b6ac675e8deaae3cc55c..d21a3ad0e06c8537eea68b1880e61a76468e306a 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -154,7 +154,7 @@ int opus_encoder_init(OpusEncoder* st, int Fs, int channels, int application)
 
     /* Create CELT encoder */
     /* Initialize CELT encoder */
-    celt_encoder_init(celt_enc, Fs, channels, &err);
+    err = celt_encoder_init(celt_enc, Fs, channels);
     if (err != CELT_OK)
         goto failure;
     celt_encoder_ctl(celt_enc, CELT_SET_SIGNALLING(0));