diff --git a/java_src/src/main/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManager.java b/java_src/src/main/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManager.java
index c7f32fa..6c0b393 100644
--- a/java_src/src/main/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManager.java
+++ b/java_src/src/main/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManager.java
@@ -16,8 +16,6 @@
 
 package com.google.crypto.tink.aead;
 
-import static com.google.crypto.tink.internal.TinkBugException.exceptionIsBug;
-
 import com.google.crypto.tink.Aead;
 import com.google.crypto.tink.KeyTemplate;
 import com.google.crypto.tink.Mac;
@@ -204,17 +202,7 @@
    *     </ul>
    */
   public static final KeyTemplate aes128CtrHmacSha256Template() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesCtrHmacAeadParameters.builder()
-                    .setAesKeySizeBytes(16)
-                    .setHmacKeySizeBytes(32)
-                    .setTagSizeBytes(16)
-                    .setIvSizeBytes(16)
-                    .setHashType(AesCtrHmacAeadParameters.HashType.SHA256)
-                    .setVariant(AesCtrHmacAeadParameters.Variant.TINK)
-                    .build()));
+    return createKeyTemplate(16, 16, 32, 16, HashType.SHA256);
   }
 
   /**
@@ -229,17 +217,21 @@
    *     </ul>
    */
   public static final KeyTemplate aes256CtrHmacSha256Template() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesCtrHmacAeadParameters.builder()
-                    .setAesKeySizeBytes(32)
-                    .setHmacKeySizeBytes(32)
-                    .setTagSizeBytes(32)
-                    .setIvSizeBytes(16)
-                    .setHashType(AesCtrHmacAeadParameters.HashType.SHA256)
-                    .setVariant(AesCtrHmacAeadParameters.Variant.TINK)
-                    .build()));
+    return createKeyTemplate(32, 16, 32, 32, HashType.SHA256);
+  }
+
+  /**
+   * @return a {@link KeyTemplate} containing a {@link AesCtrHmacAeadKeyFormat} with some specific
+   *     parameters.
+   */
+  private static KeyTemplate createKeyTemplate(
+      int aesKeySize, int ivSize, int hmacKeySize, int tagSize, HashType hashType) {
+    AesCtrHmacAeadKeyFormat format =
+        createKeyFormat(aesKeySize, ivSize, hmacKeySize, tagSize, hashType);
+    return KeyTemplate.create(
+        new AesCtrHmacAeadKeyManager().getKeyType(),
+        format.toByteArray(),
+        KeyTemplate.OutputPrefixType.TINK);
   }
 
   private static KeyFactory.KeyFormat<AesCtrHmacAeadKeyFormat> createKeyFormat(
diff --git a/java_src/src/main/java/com/google/crypto/tink/aead/AesEaxKeyManager.java b/java_src/src/main/java/com/google/crypto/tink/aead/AesEaxKeyManager.java
index 2948912..b85206a 100644
--- a/java_src/src/main/java/com/google/crypto/tink/aead/AesEaxKeyManager.java
+++ b/java_src/src/main/java/com/google/crypto/tink/aead/AesEaxKeyManager.java
@@ -16,8 +16,6 @@
 
 package com.google.crypto.tink.aead;
 
-import static com.google.crypto.tink.internal.TinkBugException.exceptionIsBug;
-
 import com.google.crypto.tink.Aead;
 import com.google.crypto.tink.KeyTemplate;
 import com.google.crypto.tink.Registry;
@@ -141,15 +139,7 @@
    *     </ul>
    */
   public static final KeyTemplate aes128EaxTemplate() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesEaxParameters.builder()
-                    .setKeySizeBytes(16)
-                    .setIvSizeBytes(16)
-                    .setTagSizeBytes(16)
-                    .setVariant(AesEaxParameters.Variant.TINK)
-                    .build()));
+    return createKeyTemplate(16, 16, KeyTemplate.OutputPrefixType.TINK);
   }
 
   /**
@@ -162,15 +152,7 @@
    *     </ul>
    */
   public static final KeyTemplate rawAes128EaxTemplate() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesEaxParameters.builder()
-                    .setKeySizeBytes(16)
-                    .setIvSizeBytes(16)
-                    .setTagSizeBytes(16)
-                    .setVariant(AesEaxParameters.Variant.NO_PREFIX)
-                    .build()));
+    return createKeyTemplate(16, 16, KeyTemplate.OutputPrefixType.RAW);
   }
 
   /**
@@ -183,15 +165,7 @@
    *     </ul>
    */
   public static final KeyTemplate aes256EaxTemplate() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesEaxParameters.builder()
-                    .setKeySizeBytes(32)
-                    .setIvSizeBytes(16)
-                    .setTagSizeBytes(16)
-                    .setVariant(AesEaxParameters.Variant.TINK)
-                    .build()));
+    return createKeyTemplate(32, 16, KeyTemplate.OutputPrefixType.TINK);
   }
 
   /**
@@ -204,15 +178,22 @@
    *     </ul>
    */
   public static final KeyTemplate rawAes256EaxTemplate() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesEaxParameters.builder()
-                    .setKeySizeBytes(32)
-                    .setIvSizeBytes(16)
-                    .setTagSizeBytes(16)
-                    .setVariant(AesEaxParameters.Variant.NO_PREFIX)
-                    .build()));
+    return createKeyTemplate(32, 16, KeyTemplate.OutputPrefixType.RAW);
+  }
+
+  /**
+   * @return a {@link KeyTemplate} containing a {@link AesEaxKeyFormat} with some specified
+   *     parameters.
+   */
+  private static KeyTemplate createKeyTemplate(
+      int keySize, int ivSize, KeyTemplate.OutputPrefixType prefixType) {
+    AesEaxKeyFormat format =
+        AesEaxKeyFormat.newBuilder()
+            .setKeySize(keySize)
+            .setParams(AesEaxParams.newBuilder().setIvSize(ivSize).build())
+            .build();
+    return KeyTemplate.create(
+        new AesEaxKeyManager().getKeyType(), format.toByteArray(), prefixType);
   }
 
   private static KeyFactory.KeyFormat<AesEaxKeyFormat> createKeyFormat(
diff --git a/java_src/src/main/java/com/google/crypto/tink/aead/AesGcmKeyManager.java b/java_src/src/main/java/com/google/crypto/tink/aead/AesGcmKeyManager.java
index 11c3dd3..e1ff14c 100644
--- a/java_src/src/main/java/com/google/crypto/tink/aead/AesGcmKeyManager.java
+++ b/java_src/src/main/java/com/google/crypto/tink/aead/AesGcmKeyManager.java
@@ -16,8 +16,6 @@
 
 package com.google.crypto.tink.aead;
 
-import static com.google.crypto.tink.internal.TinkBugException.exceptionIsBug;
-
 import com.google.crypto.tink.Aead;
 import com.google.crypto.tink.KeyTemplate;
 import com.google.crypto.tink.Registry;
@@ -151,15 +149,7 @@
    *     in older versions.
    */
   public static final KeyTemplate aes128GcmTemplate() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesGcmParameters.builder()
-                    .setKeySizeBytes(16)
-                    .setIvSizeBytes(12)
-                    .setTagSizeBytes(16)
-                    .setVariant(AesGcmParameters.Variant.TINK)
-                    .build()));
+    return createKeyTemplate(16, KeyTemplate.OutputPrefixType.TINK);
   }
 
   /**
@@ -176,15 +166,7 @@
    *     in older versions.
    */
   public static final KeyTemplate rawAes128GcmTemplate() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesGcmParameters.builder()
-                    .setKeySizeBytes(16)
-                    .setIvSizeBytes(12)
-                    .setTagSizeBytes(16)
-                    .setVariant(AesGcmParameters.Variant.NO_PREFIX)
-                    .build()));
+    return createKeyTemplate(16, KeyTemplate.OutputPrefixType.RAW);
   }
 
   /**
@@ -199,15 +181,7 @@
    *     in older versions.
    */
   public static final KeyTemplate aes256GcmTemplate() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesGcmParameters.builder()
-                    .setKeySizeBytes(32)
-                    .setIvSizeBytes(12)
-                    .setTagSizeBytes(16)
-                    .setVariant(AesGcmParameters.Variant.TINK)
-                    .build()));
+    return createKeyTemplate(32, KeyTemplate.OutputPrefixType.TINK);
   }
 
   /**
@@ -224,15 +198,18 @@
    *     in older versions.
    */
   public static final KeyTemplate rawAes256GcmTemplate() {
-    return exceptionIsBug(
-        () ->
-            KeyTemplate.createFrom(
-                AesGcmParameters.builder()
-                    .setKeySizeBytes(32)
-                    .setIvSizeBytes(12)
-                    .setTagSizeBytes(16)
-                    .setVariant(AesGcmParameters.Variant.NO_PREFIX)
-                    .build()));
+    return createKeyTemplate(32, KeyTemplate.OutputPrefixType.RAW);
+  }
+
+  /**
+   * @return a {@link KeyTemplate} containing a {@link AesGcmKeyFormat} with some specified
+   *     parameters.
+   */
+  private static KeyTemplate createKeyTemplate(
+      int keySize, KeyTemplate.OutputPrefixType prefixType) {
+    AesGcmKeyFormat format = AesGcmKeyFormat.newBuilder().setKeySize(keySize).build();
+    return KeyTemplate.create(
+        new AesGcmKeyManager().getKeyType(), format.toByteArray(), prefixType);
   }
 
   private static KeyFactory.KeyFormat<AesGcmKeyFormat> createKeyFormat(
diff --git a/java_src/src/main/java/com/google/crypto/tink/aead/BUILD.bazel b/java_src/src/main/java/com/google/crypto/tink/aead/BUILD.bazel
index 60d6911..e59dbe6 100644
--- a/java_src/src/main/java/com/google/crypto/tink/aead/BUILD.bazel
+++ b/java_src/src/main/java/com/google/crypto/tink/aead/BUILD.bazel
@@ -8,7 +8,6 @@
     name = "aes_gcm_key_manager",
     srcs = ["AesGcmKeyManager.java"],
     deps = [
-        ":aes_gcm_parameters",
         ":aes_gcm_proto_serialization",
         "//proto:aes_gcm_java_proto",
         "//proto:tink_java_proto",
@@ -18,7 +17,6 @@
         "//src/main/java/com/google/crypto/tink/config/internal:tink_fips_util",
         "//src/main/java/com/google/crypto/tink/internal:key_type_manager",
         "//src/main/java/com/google/crypto/tink/internal:primitive_factory",
-        "//src/main/java/com/google/crypto/tink/internal:tink_bug_exception",
         "//src/main/java/com/google/crypto/tink/subtle:aes_gcm_jce",
         "//src/main/java/com/google/crypto/tink/subtle:random",
         "//src/main/java/com/google/crypto/tink/subtle:validators",
@@ -72,7 +70,6 @@
     name = "aes_ctr_hmac_aead_key_manager",
     srcs = ["AesCtrHmacAeadKeyManager.java"],
     deps = [
-        ":aes_ctr_hmac_aead_parameters",
         ":aes_ctr_hmac_aead_proto_serialization",
         ":aes_ctr_key_manager",
         "//proto:aes_ctr_hmac_aead_java_proto",
@@ -87,7 +84,6 @@
         "//src/main/java/com/google/crypto/tink/config/internal:tink_fips_util",
         "//src/main/java/com/google/crypto/tink/internal:key_type_manager",
         "//src/main/java/com/google/crypto/tink/internal:primitive_factory",
-        "//src/main/java/com/google/crypto/tink/internal:tink_bug_exception",
         "//src/main/java/com/google/crypto/tink/mac:hmac_key_manager",
         "//src/main/java/com/google/crypto/tink/subtle:encrypt_then_authenticate",
         "//src/main/java/com/google/crypto/tink/subtle:ind_cpa_cipher",
@@ -230,7 +226,6 @@
     name = "aes_eax_key_manager",
     srcs = ["AesEaxKeyManager.java"],
     deps = [
-        ":aes_eax_parameters",
         ":aes_eax_proto_serialization",
         "//proto:aes_eax_java_proto",
         "//proto:tink_java_proto",
@@ -239,7 +234,6 @@
         "//src/main/java/com/google/crypto/tink:registry",
         "//src/main/java/com/google/crypto/tink/internal:key_type_manager",
         "//src/main/java/com/google/crypto/tink/internal:primitive_factory",
-        "//src/main/java/com/google/crypto/tink/internal:tink_bug_exception",
         "//src/main/java/com/google/crypto/tink/subtle:aes_eax_jce",
         "//src/main/java/com/google/crypto/tink/subtle:random",
         "//src/main/java/com/google/crypto/tink/subtle:validators",
@@ -444,7 +438,6 @@
     name = "aes_gcm_key_manager-android",
     srcs = ["AesGcmKeyManager.java"],
     deps = [
-        ":aes_gcm_parameters-android",
         ":aes_gcm_proto_serialization-android",
         "//proto:aes_gcm_java_proto_lite",
         "//proto:tink_java_proto_lite",
@@ -454,7 +447,6 @@
         "//src/main/java/com/google/crypto/tink/config/internal:tink_fips_util-android",
         "//src/main/java/com/google/crypto/tink/internal:key_type_manager-android",
         "//src/main/java/com/google/crypto/tink/internal:primitive_factory-android",
-        "//src/main/java/com/google/crypto/tink/internal:tink_bug_exception-android",
         "//src/main/java/com/google/crypto/tink/subtle:aes_gcm_jce-android",
         "//src/main/java/com/google/crypto/tink/subtle:random-android",
         "//src/main/java/com/google/crypto/tink/subtle:validators-android",
@@ -508,7 +500,6 @@
     name = "aes_ctr_hmac_aead_key_manager-android",
     srcs = ["AesCtrHmacAeadKeyManager.java"],
     deps = [
-        ":aes_ctr_hmac_aead_parameters-android",
         ":aes_ctr_hmac_aead_proto_serialization-android",
         ":aes_ctr_key_manager-android",
         "//proto:aes_ctr_hmac_aead_java_proto_lite",
@@ -523,7 +514,6 @@
         "//src/main/java/com/google/crypto/tink/config/internal:tink_fips_util-android",
         "//src/main/java/com/google/crypto/tink/internal:key_type_manager-android",
         "//src/main/java/com/google/crypto/tink/internal:primitive_factory-android",
-        "//src/main/java/com/google/crypto/tink/internal:tink_bug_exception-android",
         "//src/main/java/com/google/crypto/tink/mac:hmac_key_manager-android",
         "//src/main/java/com/google/crypto/tink/subtle:encrypt_then_authenticate-android",
         "//src/main/java/com/google/crypto/tink/subtle:ind_cpa_cipher-android",
@@ -666,7 +656,6 @@
     name = "aes_eax_key_manager-android",
     srcs = ["AesEaxKeyManager.java"],
     deps = [
-        ":aes_eax_parameters-android",
         ":aes_eax_proto_serialization-android",
         "//proto:aes_eax_java_proto_lite",
         "//proto:tink_java_proto_lite",
@@ -675,7 +664,6 @@
         "//src/main/java/com/google/crypto/tink:registry-android",
         "//src/main/java/com/google/crypto/tink/internal:key_type_manager-android",
         "//src/main/java/com/google/crypto/tink/internal:primitive_factory-android",
-        "//src/main/java/com/google/crypto/tink/internal:tink_bug_exception-android",
         "//src/main/java/com/google/crypto/tink/subtle:aes_eax_jce-android",
         "//src/main/java/com/google/crypto/tink/subtle:random-android",
         "//src/main/java/com/google/crypto/tink/subtle:validators-android",
diff --git a/java_src/src/test/java/com/google/crypto/tink/internal/BUILD.bazel b/java_src/src/test/java/com/google/crypto/tink/internal/BUILD.bazel
index baca21c..5f6b30d 100644
--- a/java_src/src/test/java/com/google/crypto/tink/internal/BUILD.bazel
+++ b/java_src/src/test/java/com/google/crypto/tink/internal/BUILD.bazel
@@ -9,7 +9,6 @@
     deps = [
         "//proto:tink_java_proto",
         "//src/main/java/com/google/crypto/tink:key_template",
-        "//src/main/java/com/google/crypto/tink/aead:aead_config",
         "//src/main/java/com/google/crypto/tink/aead:aes_gcm_key_manager",
         "//src/main/java/com/google/crypto/tink/internal:key_template_proto_converter",
         "@maven//:com_google_protobuf_protobuf_java",
diff --git a/java_src/src/test/java/com/google/crypto/tink/internal/KeyTemplateProtoConverterTest.java b/java_src/src/test/java/com/google/crypto/tink/internal/KeyTemplateProtoConverterTest.java
index 1c2d5f1..ffdd2e6 100644
--- a/java_src/src/test/java/com/google/crypto/tink/internal/KeyTemplateProtoConverterTest.java
+++ b/java_src/src/test/java/com/google/crypto/tink/internal/KeyTemplateProtoConverterTest.java
@@ -21,12 +21,10 @@
 import static org.junit.Assert.assertThrows;
 
 import com.google.crypto.tink.KeyTemplate;
-import com.google.crypto.tink.aead.AeadConfig;
 import com.google.crypto.tink.aead.AesGcmKeyManager;
 import com.google.crypto.tink.proto.OutputPrefixType;
 import com.google.protobuf.ExtensionRegistryLite;
 import java.security.GeneralSecurityException;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -34,10 +32,6 @@
 /** Tests KeyTemplateProtoConverter. */
 @RunWith(JUnit4.class)
 public final class KeyTemplateProtoConverterTest {
-  @BeforeClass
-  public static void register() throws Exception {
-    AeadConfig.register();
-  }
 
   @Test
   public void toByteArrayFromByteArray_sameValues() throws Exception {
