diff --git a/srcgen/Android.bp b/srcgen/Android.bp
deleted file mode 100644
index c5ec8f9..0000000
--- a/srcgen/Android.bp
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2018 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Build the bouncycastle srcgen jar
-// ============================================================
-
-java_library_host {
-    name: "android_bouncycastle_srcgen",
-    libs: ["currysrc"],
-    srcs: ["src/**/*.java"],
-}
diff --git a/srcgen/generate_android_src.sh b/srcgen/generate_android_src.sh
index 76db979..ffdeeb3 100755
--- a/srcgen/generate_android_src.sh
+++ b/srcgen/generate_android_src.sh
@@ -5,11 +5,11 @@
     exit 1
 fi
 
-CLASSPATH=${ANDROID_HOST_OUT}/framework/currysrc.jar:${ANDROID_HOST_OUT}/framework/android_bouncycastle_srcgen.jar
+CLASSPATH=${ANDROID_HOST_OUT}/framework/currysrc.jar
 BOUNCY_CASTLE_DIR=${ANDROID_BUILD_TOP}/external/bouncycastle
 
 cd ${ANDROID_BUILD_TOP}
-make -j15 currysrc android_bouncycastle_srcgen
+make -j15 currysrc
 
 CORE_PLATFORM_API_FILE=${BOUNCY_CASTLE_DIR}/srcgen/core-platform-api.txt
 UNSUPPORTED_APP_USAGE_FILE=${BOUNCY_CASTLE_DIR}/srcgen/unsupported-app-usage.json
@@ -25,11 +25,12 @@
   rm -rf ${SRC_OUT_DIR}
   mkdir -p ${SRC_OUT_DIR}
 
-  java -cp ${CLASSPATH} com.android.bouncycastle.srcgen.BouncyCastleTransform \
-       ${SRC_IN_DIR} \
-       ${SRC_OUT_DIR} \
-       ${CORE_PLATFORM_API_FILE} \
-       ${UNSUPPORTED_APP_USAGE_FILE}
+  java -cp ${CLASSPATH} com.google.currysrc.aosp.RepackagingTransform \
+       --source-dir ${SRC_IN_DIR} \
+       --target-dir ${SRC_OUT_DIR} \
+       --package-transformation "org.bouncycastle:com.android.org.bouncycastle" \
+       --core-platform-api-file ${CORE_PLATFORM_API_FILE} \
+       --unsupported-app-usage-file ${UNSUPPORTED_APP_USAGE_FILE}
 }
 
 BCPROV_SRC_IN_DIR=${BOUNCY_CASTLE_DIR}/bcprov/src/main/java
diff --git a/srcgen/src/main/java/com/android/bouncycastle/srcgen/BouncyCastleTransform.java b/srcgen/src/main/java/com/android/bouncycastle/srcgen/BouncyCastleTransform.java
deleted file mode 100644
index cef22c8..0000000
--- a/srcgen/src/main/java/com/android/bouncycastle/srcgen/BouncyCastleTransform.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.bouncycastle.srcgen;
-
-import static com.google.currysrc.api.process.Rules.createMandatoryRule;
-import static com.google.currysrc.api.process.Rules.createOptionalRule;
-
-import com.google.currysrc.Main;
-import com.google.currysrc.aosp.Annotations;
-import com.google.currysrc.api.RuleSet;
-import com.google.currysrc.api.input.DirectoryInputFileGenerator;
-import com.google.currysrc.api.input.InputFileGenerator;
-import com.google.currysrc.api.output.BasicOutputSourceFileGenerator;
-import com.google.currysrc.api.output.OutputSourceFileGenerator;
-import com.google.currysrc.api.process.Rule;
-import com.google.currysrc.api.process.ast.BodyDeclarationLocators;
-import com.google.currysrc.api.process.ast.TypeLocator;
-import com.google.currysrc.processors.AddMarkerAnnotation;
-import com.google.currysrc.processors.HidePublicClasses;
-import com.google.currysrc.processors.InsertHeader;
-import com.google.currysrc.processors.ModifyQualifiedNames;
-import com.google.currysrc.processors.ModifyStringLiterals;
-import com.google.currysrc.processors.RenamePackage;
-import java.io.File;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
-
-/**
- * Generates bouncycastle sources in the com.android.org.bouncycastle package.
- */
-public class BouncyCastleTransform {
-    static final String ORIGINAL_PACKAGE = "org.bouncycastle";
-    static final String ANDROID_PACKAGE = "com.android.org.bouncycastle";
-
-    /**
-     * Usage:
-     * java BouncyCastleTransform {source dir} {target dir}
-     */
-    public static void main(String[] args) throws Exception {
-        if (args.length != 4) {
-          throw new IllegalArgumentException(
-              "Usage: " + BouncyCastleTransform.class.getCanonicalName()
-                  + " <source-dir>"
-                  + " <target-dir>"
-                  + " <core-platform-api-file>"
-                  + " <unsupported-app-usage-file>");
-        }
-        String sourceDir = args[0];
-        String targetDir = args[1];
-        Path corePlatformApiFile = Paths.get(args[2]);
-        Path unsupportedAppUsageFile = Paths.get(args[3]);
-
-        Map<String, String> options = JavaCore.getOptions();
-        options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_8);
-        options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_8);
-        options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED);
-        options.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-        options.put(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, "4");
-
-        new Main(false /* debug */)
-            .setJdtOptions(options)
-            .execute(new TransformRuleSet(sourceDir, targetDir, corePlatformApiFile,
-                unsupportedAppUsageFile));
-    }
-
-    static class TransformRuleSet implements RuleSet {
-        private final String sourceDir;
-        private final String targetDir;
-        private final Path corePlatformApiFile;
-        private final Path unsupportedAppUsageFile;
-
-        TransformRuleSet(String sourceDir, String targetDir, Path corePlatformApiFile,
-            Path unsupportedAppUsageFile) {
-            this.sourceDir = sourceDir;
-            this.targetDir = targetDir;
-            this.corePlatformApiFile = corePlatformApiFile;
-            this.unsupportedAppUsageFile = unsupportedAppUsageFile;
-        }
-
-        @Override
-        public InputFileGenerator getInputFileGenerator() {
-            return new DirectoryInputFileGenerator(new File(sourceDir));
-        }
-
-        @Override
-        public List<Rule> getRuleList(File ignored) {
-            return Arrays.asList(
-                    // Doc change: Insert a warning about the source code being generated.
-                    createMandatoryRule(
-                            new InsertHeader("/* GENERATED SOURCE. DO NOT MODIFY. */\n")),
-                    // AST change: Change the package of each CompilationUnit
-                    createMandatoryRule(new RenamePackage(ORIGINAL_PACKAGE, ANDROID_PACKAGE)),
-                    // AST change: Change all qualified names in code and javadoc.
-                    createOptionalRule(new ModifyQualifiedNames(ORIGINAL_PACKAGE, ANDROID_PACKAGE)),
-                    // AST change: Change all string literals containing package names in code.
-                    createOptionalRule(new ModifyStringLiterals(ORIGINAL_PACKAGE, ANDROID_PACKAGE)),
-                    // Doc change: Insert @hide on all public classes.
-                    createHidePublicClassesRule(),
-                    // AST change: Add CorePlatformApi to specified classes and members
-                    createOptionalRule(new AddMarkerAnnotation("libcore.api.CorePlatformApi",
-                        BodyDeclarationLocators.readBodyDeclarationLocators(corePlatformApiFile))),
-                    // AST Change: Add UnsupportedAppUsage to specified class members.
-                    createOptionalRule(
-                        Annotations.addUnsupportedAppUsage(unsupportedAppUsageFile))
-                    );
-        }
-
-        private static Rule createHidePublicClassesRule() {
-            List<TypeLocator> publicApiClassesWhitelist = Collections.emptyList();
-            return createOptionalRule(new HidePublicClasses(publicApiClassesWhitelist,
-                    "This class is not part of the Android public SDK API"));
-        }
-
-        @Override
-        public OutputSourceFileGenerator getOutputSourceFileGenerator() {
-            File outputDir = new File(targetDir);
-            return new BasicOutputSourceFileGenerator(outputDir);
-        }
-    }
-
-    private BouncyCastleTransform() {
-    }
-}
