diff --git a/crypto/asn1/internal.h b/crypto/asn1/internal.h
index 0631861..49286ea 100644
--- a/crypto/asn1/internal.h
+++ b/crypto/asn1/internal.h
@@ -143,9 +143,6 @@
 OPENSSL_EXPORT int asn1_generalizedtime_to_tm(struct tm *tm,
                                               const ASN1_GENERALIZEDTIME *d);
 
-void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
-                            int combine);
-
 int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
 void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c
index 54e9a99..0fb7344 100644
--- a/crypto/asn1/tasn_dec.c
+++ b/crypto/asn1/tasn_dec.c
@@ -168,8 +168,6 @@
   int otag;
   int ret = 0;
   ASN1_VALUE **pchptr;
-  int combine = aclass & ASN1_TFLG_COMBINE;
-  aclass &= ~ASN1_TFLG_COMBINE;
   if (!pval) {
     return 0;
   }
@@ -440,9 +438,7 @@
 auxerr:
   OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR);
 err:
-  if (combine == 0) {
-    ASN1_item_ex_free(pval, it);
-  }
+  ASN1_item_ex_free(pval, it);
   if (errtt) {
     ERR_add_error_data(4, "Field=", errtt->field_name, ", Type=", it->sname);
   } else {
@@ -602,8 +598,8 @@
     }
   } else {
     // Nothing special
-    ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), -1,
-                           tt->flags & ASN1_TFLG_COMBINE, opt, depth);
+    ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), -1, 0, opt,
+                           depth);
     if (!ret) {
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
       goto err;
diff --git a/crypto/asn1/tasn_fre.c b/crypto/asn1/tasn_fre.c
index 82c0a0c..ebfd3d6 100644
--- a/crypto/asn1/tasn_fre.c
+++ b/crypto/asn1/tasn_fre.c
@@ -66,15 +66,10 @@
 // Free up an ASN1 structure
 
 void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it) {
-  asn1_item_combine_free(&val, it, 0);
+  ASN1_item_ex_free(&val, it);
 }
 
 void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) {
-  asn1_item_combine_free(pval, it, 0);
-}
-
-void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
-                            int combine) {
   const ASN1_TEMPLATE *tt = NULL, *seqtt;
   const ASN1_EXTERN_FUNCS *ef;
   int i;
@@ -117,10 +112,8 @@
       if (asn1_cb) {
         asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
       }
-      if (!combine) {
-        OPENSSL_free(*pval);
-        *pval = NULL;
-      }
+      OPENSSL_free(*pval);
+      *pval = NULL;
       break;
     }
 
@@ -160,10 +153,8 @@
       if (asn1_cb) {
         asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
       }
-      if (!combine) {
-        OPENSSL_free(*pval);
-        *pval = NULL;
-      }
+      OPENSSL_free(*pval);
+      *pval = NULL;
       break;
     }
   }
@@ -176,13 +167,12 @@
     for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
       ASN1_VALUE *vtmp;
       vtmp = sk_ASN1_VALUE_value(sk, i);
-      asn1_item_combine_free(&vtmp, ASN1_ITEM_ptr(tt->item), 0);
+      ASN1_item_ex_free(&vtmp, ASN1_ITEM_ptr(tt->item));
     }
     sk_ASN1_VALUE_free(sk);
     *pval = NULL;
   } else {
-    asn1_item_combine_free(pval, ASN1_ITEM_ptr(tt->item),
-                           tt->flags & ASN1_TFLG_COMBINE);
+    ASN1_item_ex_free(pval, ASN1_ITEM_ptr(tt->item));
   }
 }
 
diff --git a/crypto/asn1/tasn_new.c b/crypto/asn1/tasn_new.c
index 563674d..3727b9b 100644
--- a/crypto/asn1/tasn_new.c
+++ b/crypto/asn1/tasn_new.c
@@ -67,8 +67,6 @@
 #include "internal.h"
 
 
-static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
-                                    int combine);
 static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
 static int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
 static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
@@ -86,11 +84,6 @@
 // Allocate an ASN1 structure
 
 int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) {
-  return asn1_item_ex_combine_new(pval, it, 0);
-}
-
-static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
-                                    int combine) {
   const ASN1_TEMPLATE *tt = NULL;
   const ASN1_EXTERN_FUNCS *ef;
   ASN1_VALUE **pseqval;
@@ -134,13 +127,11 @@
           return 1;
         }
       }
-      if (!combine) {
-        *pval = OPENSSL_malloc(it->size);
-        if (!*pval) {
-          goto memerr;
-        }
-        OPENSSL_memset(*pval, 0, it->size);
+      *pval = OPENSSL_malloc(it->size);
+      if (!*pval) {
+        goto memerr;
       }
+      OPENSSL_memset(*pval, 0, it->size);
       asn1_set_choice_selector(pval, -1, it);
       if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) {
         goto auxerr2;
@@ -160,15 +151,13 @@
           return 1;
         }
       }
-      if (!combine) {
-        *pval = OPENSSL_malloc(it->size);
-        if (!*pval) {
-          goto memerr;
-        }
-        OPENSSL_memset(*pval, 0, it->size);
-        asn1_refcount_set_one(pval, it);
-        asn1_enc_init(pval, it);
+      *pval = OPENSSL_malloc(it->size);
+      if (!*pval) {
+        goto memerr;
       }
+      OPENSSL_memset(*pval, 0, it->size);
+      asn1_refcount_set_one(pval, it);
+      asn1_enc_init(pval, it);
       for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
         pseqval = asn1_get_field_ptr(pval, tt);
         if (!ASN1_template_new(pseqval, tt)) {
@@ -184,13 +173,13 @@
   return 1;
 
 memerr2:
-  asn1_item_combine_free(pval, it, combine);
+  ASN1_item_ex_free(pval, it);
 memerr:
   OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
   return 0;
 
 auxerr2:
-  asn1_item_combine_free(pval, it, combine);
+  ASN1_item_ex_free(pval, it);
 auxerr:
   OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR);
   return 0;
@@ -255,7 +244,7 @@
     goto done;
   }
   // Otherwise pass it back to the item routine
-  ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE);
+  ret = ASN1_item_ex_new(pval, it);
 done:
   return ret;
 }
diff --git a/crypto/asn1/tasn_utl.c b/crypto/asn1/tasn_utl.c
index 9316c22..741ce17 100644
--- a/crypto/asn1/tasn_utl.c
+++ b/crypto/asn1/tasn_utl.c
@@ -203,11 +203,7 @@
 
 // Given an ASN1_TEMPLATE get a pointer to a field
 ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) {
-  ASN1_VALUE **pvaltmp;
-  if (tt->flags & ASN1_TFLG_COMBINE) {
-    return pval;
-  }
-  pvaltmp = offset2ptr(*pval, tt->offset);
+  ASN1_VALUE **pvaltmp = offset2ptr(*pval, tt->offset);
   // NOTE for BOOLEAN types the field is just a plain int so we can't return
   // int **, so settle for (int *).
   return pvaltmp;
diff --git a/include/openssl/asn1t.h b/include/openssl/asn1t.h
index f655193..f3c4b7f 100644
--- a/include/openssl/asn1t.h
+++ b/include/openssl/asn1t.h
@@ -244,11 +244,6 @@
 	(flags), (tag), offsetof(stname, field),\
 	#field, ASN1_ITEM_ref(type) }
 
-/* used when the structure is combined with the parent */
-
-#define ASN1_EX_COMBINE(flags, tag, type) { \
-	(flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) }
-
 /* implicit and explicit helper macros */
 
 #define ASN1_IMP_EX(stname, field, type, tag, ex) \
@@ -441,16 +436,6 @@
 
 #define ASN1_TFLG_ADB_OID	(0x1<<8)
 
-/* This flag means a parent structure is passed
- * instead of the field: this is useful is a
- * SEQUENCE is being combined with a CHOICE for
- * example. Since this means the structure and
- * item name will differ we need to use the
- * ASN1_CHOICE_END_name() macro for example.
- */
-
-#define ASN1_TFLG_COMBINE	(0x1<<10)
-
 /* This is the actual ASN1 item itself */
 
 struct ASN1_ITEM_st {
