diff --git a/include/circt-c/Conversion.h b/include/circt-c/Conversion.h
index 5482050a3332..2cf3a6b10abf 100644
--- a/include/circt-c/Conversion.h
+++ b/include/circt-c/Conversion.h
@@ -7,6 +7,7 @@
 
 #include "mlir-c/Support.h"
 
+#include "circt/Conversion/Conversion.capi.h.inc"
 #include "mlir/Conversion/Passes.capi.h.inc"
 
 #endif // CIRCT_C_CONVERSION_H
diff --git a/include/circt-c/Transforms.h b/include/circt-c/Transforms.h
new file mode 100644
index 000000000000..6c32a99f896b
--- /dev/null
+++ b/include/circt-c/Transforms.h
@@ -0,0 +1,12 @@
+//===-- circt-c/Transform.h - C API for dialect transforms --------*- C -*-===//
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CIRCT_C_TRANSFORMS_H
+#define CIRCT_C_TRANSFORMS_H
+
+#include "mlir-c/Support.h"
+
+#include "circt/Transforms/Transforms.capi.h.inc"
+
+#endif // CIRCT_C_TRANSFORMS_H
diff --git a/include/circt/Conversion/CMakeLists.txt b/include/circt/Conversion/CMakeLists.txt
index bc227db34cb6..135c37699b13 100644
--- a/include/circt/Conversion/CMakeLists.txt
+++ b/include/circt/Conversion/CMakeLists.txt
@@ -1,7 +1,7 @@
 set(LLVM_TARGET_DEFINITIONS Passes.td)
-mlir_tablegen(Passes.h.inc -gen-pass-decls -name Conversion)
-mlir_tablegen(Conversion.capi.h.inc -gen-pass-capi-header --prefix Conversion)
-mlir_tablegen(Conversion.capi.cpp.inc -gen-pass-capi-impl --prefix Conversion)
+mlir_tablegen(Passes.h.inc -gen-pass-decls -name CIRCTConversion)
+mlir_tablegen(Conversion.capi.h.inc -gen-pass-capi-header --prefix CIRCTConversion)
+mlir_tablegen(Conversion.capi.cpp.inc -gen-pass-capi-impl --prefix CIRCTConversion)
 add_public_tablegen_target(CIRCTConversionPassIncGen)
 
 add_circt_doc(Passes CIRCTConversionPasses -gen-pass-doc)
diff --git a/include/circt/InitAllPasses.h b/include/circt/InitAllPasses.h
index 9f3c1d7f695e..7659f1a1c4d9 100644
--- a/include/circt/InitAllPasses.h
+++ b/include/circt/InitAllPasses.h
@@ -47,10 +47,10 @@ namespace circt {
 
 inline void registerAllPasses() {
   // Conversion Passes
-  registerConversionPasses();
+  registerCIRCTConversionPasses();
 
   // Transformation passes
-  registerTransformsPasses();
+  registerCIRCTTransformsPasses();
 
   // LEC transformation passes
   registerLECTransformsPasses();
diff --git a/include/circt/Transforms/CMakeLists.txt b/include/circt/Transforms/CMakeLists.txt
index cbc53223211b..bc2a0f2695d2 100644
--- a/include/circt/Transforms/CMakeLists.txt
+++ b/include/circt/Transforms/CMakeLists.txt
@@ -1,8 +1,8 @@
 
 set(LLVM_TARGET_DEFINITIONS Passes.td)
-mlir_tablegen(Passes.h.inc -gen-pass-decls -name Transforms)
-mlir_tablegen(Transforms.capi.h.inc -gen-pass-capi-header --prefix Transforms)
-mlir_tablegen(Transforms.capi.cpp.inc -gen-pass-capi-impl --prefix Transforms)
+mlir_tablegen(Passes.h.inc -gen-pass-decls -name CIRCTTransforms)
+mlir_tablegen(Transforms.capi.h.inc -gen-pass-capi-header --prefix CIRCTTransforms)
+mlir_tablegen(Transforms.capi.cpp.inc -gen-pass-capi-impl --prefix CIRCTTransforms)
 add_public_tablegen_target(CIRCTTransformsPassIncGen)
 
 add_mlir_doc(Passes CIRCTGeneralPasses ./ -gen-pass-doc)
diff --git a/lib/Bindings/Python/CIRCTModule.cpp b/lib/Bindings/Python/CIRCTModule.cpp
index 9dcefd19034a..aa091bdf5ee7 100644
--- a/lib/Bindings/Python/CIRCTModule.cpp
+++ b/lib/Bindings/Python/CIRCTModule.cpp
@@ -23,6 +23,7 @@
 #include "circt-c/Dialect/MSFT.h"
 #include "circt-c/Dialect/OM.h"
 #include "circt-c/Dialect/RTG.h"
+#include "circt-c/Transforms.h"
 #ifdef CIRCT_INCLUDE_TESTS
 #include "circt-c/Dialect/RTGTest.h"
 #endif
@@ -53,8 +54,9 @@ static void registerPasses() {
   registerHWArithPasses();
   registerHWPasses();
   registerHandshakePasses();
-  mlirRegisterConversionPasses();
-  mlirRegisterTransformsPasses();
+  mlirRegisterCIRCTConversionPasses();
+  mlirRegisterCIRCTTransformsPasses();
+  mlirRegisterTransformsCSE();
 }
 
 PYBIND11_MODULE(_circt, m) {
diff --git a/lib/Bindings/Python/CMakeLists.txt b/lib/Bindings/Python/CMakeLists.txt
index bd1c7404ed4e..54e3a4743223 100644
--- a/lib/Bindings/Python/CMakeLists.txt
+++ b/lib/Bindings/Python/CMakeLists.txt
@@ -51,6 +51,9 @@ set(PYTHON_BINDINGS_LINK_LIBS
   CIRCTCAPISMT
   CIRCTCAPISV
   CIRCTCAPIVerif
+  CIRCTCAPITransforms
+  # needed for mlirFrozenRewritePatternSetDestroy
+  # but not the actual passes
   MLIRCAPITransforms
 )
 
diff --git a/lib/CAPI/CMakeLists.txt b/lib/CAPI/CMakeLists.txt
index d9ca6a0fe83b..70753aa3a8fd 100644
--- a/lib/CAPI/CMakeLists.txt
+++ b/lib/CAPI/CMakeLists.txt
@@ -4,3 +4,4 @@ add_subdirectory(ExportVerilog)
 add_subdirectory(Dialect)
 add_subdirectory(Firtool)
 add_subdirectory(RtgTool)
+add_subdirectory(Transforms)
diff --git a/lib/CAPI/Transforms/CMakeLists.txt b/lib/CAPI/Transforms/CMakeLists.txt
new file mode 100644
index 000000000000..c487eed1c2b2
--- /dev/null
+++ b/lib/CAPI/Transforms/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_circt_public_c_api_library(CIRCTCAPITransforms
+  Transforms.cpp
+
+  LINK_LIBS PUBLIC
+  CIRCTTransforms
+)
diff --git a/lib/CAPI/Transforms/Transforms.cpp b/lib/CAPI/Transforms/Transforms.cpp
new file mode 100644
index 000000000000..00c24d6e0247
--- /dev/null
+++ b/lib/CAPI/Transforms/Transforms.cpp
@@ -0,0 +1,24 @@
+//===- Transforms.cpp - C API for Transforms Passes -----------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "circt-c/Transforms.h"
+#include "circt/Transforms/Passes.h"
+#include "mlir/CAPI/Pass.h"
+#include "mlir/Pass/Pass.h"
+
+using namespace circt;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "circt/Transforms/Transforms.capi.cpp.inc"
+
+#ifdef __cplusplus
+}
+#endif