diff --git a/codegen/generic-client-test-codegen/build.gradle.kts b/codegen/generic-client-test-codegen/build.gradle.kts
index da69f9602b98a..43f4301fc8003 100644
--- a/codegen/generic-client-test-codegen/build.gradle.kts
+++ b/codegen/generic-client-test-codegen/build.gradle.kts
@@ -13,10 +13,6 @@
  * permissions and limitations under the License.
  */
 
-import software.amazon.smithy.gradle.tasks.SmithyBuild
-
-val smithyVersion: String by project
-
 buildscript {
     val smithyVersion: String by project
 
@@ -30,11 +26,13 @@ buildscript {
 }
 
 plugins {
-    val smithyGradleVersion: String by project
-    id("software.amazon.smithy").version(smithyGradleVersion)
+    `java-library`
+    id("software.amazon.smithy.gradle.smithy-base")
 }
 
 dependencies {
+    val smithyVersion: String by project
+
     implementation("software.amazon.smithy:smithy-aws-protocol-tests:$smithyVersion")
     implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion")
     implementation(project(":smithy-aws-typescript-codegen"))
@@ -42,14 +40,3 @@ dependencies {
 
 // This project doesn't produce a JAR.
 tasks["jar"].enabled = false
-
-// Run the SmithyBuild task manually since this project needs the built JAR
-// from smithy-aws-typescript-codegen.
-tasks["smithyBuildJar"].enabled = false
-
-tasks.create<SmithyBuild>("buildSdk") {
-    addRuntimeClasspath = true
-}
-
-// Run the `buildSdk` automatically.
-tasks["build"].finalizedBy(tasks["buildSdk"])
diff --git a/codegen/generic-client-test-codegen/model/echo.smithy b/codegen/generic-client-test-codegen/model/echo.smithy
index c062557d78885..3aebff86f888d 100644
--- a/codegen/generic-client-test-codegen/model/echo.smithy
+++ b/codegen/generic-client-test-codegen/model/echo.smithy
@@ -6,46 +6,53 @@ use aws.protocols#restJson1
 
 @restJson1
 service EchoService {
-    version: "2018-05-10",
-    operations: [Echo, Length],
+    version: "2018-05-10"
+    operations: [
+        Echo
+        Length
+    ]
 }
 
-@http(code: 200, method: "POST", uri: "/echo",)
+@http(code: 200, method: "POST", uri: "/echo")
 operation Echo {
-    input: EchoInput,
-    output: EchoOutput,
-    errors: [PalindromeException],
+    input: EchoInput
+    output: EchoOutput
+    errors: [
+        PalindromeException
+    ]
 }
 
 @readonly
 @http(code: 200, method: "GET", uri: "/length/{string}")
 operation Length {
-    input: LengthInput,
-    output: LengthOutput,
-    errors: [PalindromeException],
+    input: LengthInput
+    output: LengthOutput
+    errors: [
+        PalindromeException
+    ]
 }
 
 structure EchoInput {
-    string: String,
+    string: String
 }
 
 structure EchoOutput {
-    string: String,
+    string: String
 }
 
 structure LengthInput {
     @required
     @httpLabel
-    string: String,
+    string: String
 }
 
 structure LengthOutput {
-    length: Integer,
+    length: Integer
 }
 
 /// For some reason, this service does not like palindromes!
 @httpError(400)
 @error("client")
 structure PalindromeException {
-    message: String,
+    message: String
 }
diff --git a/codegen/generic-client-test-codegen/model/weather.smithy b/codegen/generic-client-test-codegen/model/weather.smithy
index 276d01e926515..c0839fb00b503 100644
--- a/codegen/generic-client-test-codegen/model/weather.smithy
+++ b/codegen/generic-client-test-codegen/model/weather.smithy
@@ -93,7 +93,7 @@ operation OnlyCustomAuthOptional {}
 @readonly
 @http(method: "GET", uri: "/SameAsService")
 operation SameAsService {
-  output := {
-    service: String
-  }
+    output := {
+        service: String
+    }
 }
diff --git a/codegen/gradle.properties b/codegen/gradle.properties
index 80ce77af7cf6e..59f071e4a413d 100644
--- a/codegen/gradle.properties
+++ b/codegen/gradle.properties
@@ -1,2 +1,2 @@
 smithyVersion=1.45.0
-smithyGradleVersion=0.6.0
+smithyGradleVersion=0.10.1
diff --git a/codegen/protocol-test-codegen/build.gradle.kts b/codegen/protocol-test-codegen/build.gradle.kts
index 9cb3eaca52c06..2c41840240232 100644
--- a/codegen/protocol-test-codegen/build.gradle.kts
+++ b/codegen/protocol-test-codegen/build.gradle.kts
@@ -13,10 +13,6 @@
  * permissions and limitations under the License.
  */
 
-import software.amazon.smithy.gradle.tasks.SmithyBuild
-
-val smithyVersion: String by project
-
 buildscript {
     val smithyVersion: String by project
 
@@ -30,25 +26,16 @@ buildscript {
 }
 
 plugins {
-    val smithyGradleVersion: String by project
-    id("software.amazon.smithy").version(smithyGradleVersion)
+    `java-library`
+    id("software.amazon.smithy.gradle.smithy-base")
 }
 
 dependencies {
+    val smithyVersion: String by project
+
+    smithyBuild(project(":smithy-aws-typescript-codegen"))
     implementation("software.amazon.smithy:smithy-aws-protocol-tests:$smithyVersion")
-    implementation(project(":smithy-aws-typescript-codegen"))
 }
 
 // This project doesn't produce a JAR.
 tasks["jar"].enabled = false
-
-// Run the SmithyBuild task manually since this project needs the built JAR
-// from smithy-aws-typescript-codegen.
-tasks["smithyBuildJar"].enabled = false
-
-tasks.create<SmithyBuild>("buildSdk") {
-    addRuntimeClasspath = true
-}
-
-// Run the `buildSdk` automatically.
-tasks["build"].finalizedBy(tasks["buildSdk"])
diff --git a/codegen/sdk-codegen/build.gradle.kts b/codegen/sdk-codegen/build.gradle.kts
index 57eb849925781..a0ec7c8e89769 100644
--- a/codegen/sdk-codegen/build.gradle.kts
+++ b/codegen/sdk-codegen/build.gradle.kts
@@ -15,12 +15,9 @@
 
 import software.amazon.smithy.model.Model
 import software.amazon.smithy.model.shapes.ServiceShape
-import software.amazon.smithy.model.shapes.ShapeId
 import software.amazon.smithy.model.node.Node
-import software.amazon.smithy.gradle.tasks.SmithyBuild
 import software.amazon.smithy.aws.traits.ServiceTrait
 import java.util.stream.Stream
-import kotlin.streams.toList
 
 val smithyVersion: String by project
 
@@ -38,8 +35,8 @@ buildscript {
 }
 
 plugins {
-    val smithyGradleVersion: String by project
-    id("software.amazon.smithy").version(smithyGradleVersion)
+    `java-library`
+    id("software.amazon.smithy.gradle.smithy-base")
 }
 
 dependencies {
@@ -48,18 +45,8 @@ dependencies {
     implementation("software.amazon.smithy:smithy-smoke-test-traits:$smithyVersion")
 }
 
-// This project doesn't produce a JAR.
-tasks["jar"].enabled = false
-
-// Run the SmithyBuild task manually since this project needs the built JAR
-// from smithy-aws-typescript-codegen.
-tasks["smithyBuildJar"].enabled = false
-
-tasks.create<SmithyBuild>("buildSdk") {
-    addRuntimeClasspath = true
-}
-
-configure<software.amazon.smithy.gradle.SmithyExtension> {
+smithy {
+    format.set(false)
     val clientNameProp: String? by project
     if (!(clientNameProp?.isEmpty() ?: true)) {
         smithyBuildConfigs = files("smithy-build-" + clientNameProp + ".json")
@@ -67,6 +54,9 @@ configure<software.amazon.smithy.gradle.SmithyExtension> {
     }
 }
 
+// This project doesn't produce a JAR.
+tasks["jar"].enabled = false
+
 // Generates a smithy-build.json file by creating a new projection for every
 // JSON file found in aws-models/. The generated smithy-build.json file is
 // not committed to git since it's rebuilt each time codegen is performed.
@@ -101,7 +91,7 @@ tasks.register("generate-smithy-build") {
             val clientName = sdkId.split("-").toTypedArray()
                     .map { it.capitalize() }
                     .joinToString(separator = " ")
-            var manifestOverwrites = Node.parse(
+            val manifestOverwrites = Node.parse(
                     File("smithy-aws-typescript-codegen/src/main/resources/software/amazon/smithy/aws/typescript/codegen/package.json.template")
                             .readText()
             ).expectObjectNode()
@@ -150,7 +140,5 @@ tasks.register("generate-default-configs-provider", JavaExec::class) {
     args(listOf(project.properties["defaultsModeConfigOutput"]))
 }
 
-// Run the `buildSdk` automatically.
-tasks["build"]
-        .dependsOn(tasks["generate-smithy-build"])
-        .finalizedBy(tasks["buildSdk"])
+// Ensure the smithy-build.json file is generated before smithy build is executed
+tasks["smithyBuild"].dependsOn(tasks["generate-smithy-build"])
diff --git a/codegen/settings.gradle.kts b/codegen/settings.gradle.kts
index 1bc44fa3ec790..f20b6d8fd9694 100644
--- a/codegen/settings.gradle.kts
+++ b/codegen/settings.gradle.kts
@@ -35,3 +35,18 @@ file(
             .filter { it.isDirectory }
             .forEach { includeBuild(it.absolutePath) }
     }
+
+pluginManagement {
+    val smithyGradleVersion: String by settings
+
+    plugins {
+        id("software.amazon.smithy.gradle.smithy-jar").version(smithyGradleVersion)
+        id("software.amazon.smithy.gradle.smithy-base").version(smithyGradleVersion)
+    }
+
+    repositories {
+        mavenLocal()
+        mavenCentral()
+        gradlePluginPortal()
+    }
+}
diff --git a/codegen/smithy-aws-typescript-codegen/build.gradle.kts b/codegen/smithy-aws-typescript-codegen/build.gradle.kts
index cf6bb338d78cf..b45d44bf9b81c 100644
--- a/codegen/smithy-aws-typescript-codegen/build.gradle.kts
+++ b/codegen/smithy-aws-typescript-codegen/build.gradle.kts
@@ -20,8 +20,6 @@ description = "Generates TypeScript code for AWS protocols from Smithy models"
 extra["displayName"] = "Smithy :: AWS :: Typescript :: Codegen"
 extra["moduleName"] = "software.amazon.smithy.aws.typescript.codegen"
 
-val smithyVersion: String by project
-
 buildscript {
     val smithyVersion: String by project
 
@@ -35,6 +33,8 @@ buildscript {
 }
 
 dependencies {
+    val smithyVersion: String by project
+
     api("software.amazon.smithy:smithy-aws-cloudformation-traits:$smithyVersion")
     api("software.amazon.smithy:smithy-aws-traits:$smithyVersion")
     api("software.amazon.smithy:smithy-aws-endpoints:$smithyVersion")
@@ -49,16 +49,16 @@ dependencies {
 tasks.register("set-aws-sdk-versions") {
     doLast {
         mkdir("$buildDir/generated/resources/software/amazon/smithy/aws/typescript/codegen")
-        var versionsFile =
+        val versionsFile =
                 file("$buildDir/generated/resources/software/amazon/smithy/aws/typescript/codegen/sdkVersions.properties")
-        var roots = project.file("../../packages").listFiles().toMutableList() + project.file("../../clients").listFiles().toList()
+        val roots = project.file("../../packages").listFiles().toMutableList() + project.file("../../clients").listFiles().toList()
         roots.forEach { packageDir ->
-            var packageJsonFile = File(packageDir, "package.json")
+            val packageJsonFile = File(packageDir, "package.json")
             if (packageJsonFile.isFile()) {
-                var packageJson = Node.parse(packageJsonFile.readText()).expectObjectNode()
-                var packageName = packageJson.expectStringMember("name").getValue()
-                var packageVersion = packageJson.expectStringMember("version").getValue()
-                var isPrivate = packageJson.getBooleanMemberOrDefault("private", false)
+                val packageJson = Node.parse(packageJsonFile.readText()).expectObjectNode()
+                val packageName = packageJson.expectStringMember("name").getValue()
+                val packageVersion = packageJson.expectStringMember("version").getValue()
+                val isPrivate = packageJson.getBooleanMemberOrDefault("private", false)
                 if (!isPrivate) {
                     versionsFile.appendText("$packageName=$packageVersion\n")
                 }