diff --git a/buildSrc/src/main/groovy/ExtraTasks.groovy b/buildSrc/src/main/groovy/ExtraTasks.groovy
new file mode 100644
index 0000000..8b0b123
--- /dev/null
+++ b/buildSrc/src/main/groovy/ExtraTasks.groovy
@@ -0,0 +1,88 @@
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.gradle.api.GradleException;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.gradle.api.Task;
+import org.gradle.api.file.FileTree;
+import org.gradle.api.tasks.compile.JavaCompile;
+import org.gradle.language.base.internal.ProjectLayout;
+import org.gradle.language.base.plugins.ComponentModelBasePlugin;
+import org.gradle.language.nativeplatform.tasks.AbstractNativeSourceCompileTask;
+import org.gradle.model.ModelMap;
+import org.gradle.model.Mutate;
+import org.gradle.model.RuleSource;
+import org.gradle.model.Validate;
+import org.gradle.nativeplatform.NativeBinarySpec;
+import org.gradle.nativeplatform.NativeComponentSpec;
+import org.gradle.nativeplatform.NativeLibrarySpec;
+import org.gradle.nativeplatform.SharedLibraryBinarySpec;
+import org.gradle.nativeplatform.StaticLibraryBinarySpec;
+import org.gradle.nativeplatform.platform.internal.NativePlatformInternal;
+import org.gradle.nativeplatform.toolchain.NativeToolChain;
+import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
+import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider;
+import org.gradle.nativeplatform.toolchain.internal.ToolType;
+import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain;
+import org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppToolChain;
+import org.gradle.nativeplatform.toolchain.internal.tools.ToolRegistry;
+import org.gradle.nativeplatform.test.googletest.GoogleTestTestSuiteBinarySpec;
+import org.gradle.platform.base.BinarySpec;
+import org.gradle.platform.base.ComponentSpec;
+import org.gradle.platform.base.ComponentSpecContainer;
+import org.gradle.platform.base.ComponentType;
+import org.gradle.platform.base.TypeBuilder;
+import org.gradle.nativeplatform.test.tasks.RunTestExecutable;
+import org.gradle.platform.base.BinaryContainer;
+import groovy.transform.CompileStatic;
+
+@CompileStatic
+class ExtraTasks implements Plugin<Project> {
+    @CompileStatic
+    public void apply(Project project) {
+
+    }
+
+    @CompileStatic
+    static class Rules extends RuleSource {
+        @Mutate
+        @CompileStatic
+        void createNativeCompileTask(ModelMap<Task> tasks, BinaryContainer binaries) {
+            tasks.create('compileCpp', Task) { oTask ->
+                def task = (Task) oTask
+                task.group = 'build'
+                task.description = 'Uber task to compile all native code for this project'
+                binaries.each { binary ->
+                    if (binary instanceof NativeBinarySpec && binary.buildable) {
+                        binary.tasks.withType(AbstractNativeSourceCompileTask) { compileTask ->
+                            task.dependsOn compileTask
+                        }
+                    }
+                }
+            }
+        }
+
+        @Mutate
+        @CompileStatic
+        void createNativeTestTask(ModelMap<Task> tasks, BinaryContainer binaries) {
+            tasks.create('testCpp', Task) { oTask ->
+                def task = (Task) oTask
+                task.group = 'build'
+                task.description = 'Uber task to run all native tests for project'
+                binaries.each { binary ->
+                    if (binary instanceof GoogleTestTestSuiteBinarySpec && binary.buildable) {
+                        binary.tasks.withType(RunTestExecutable) { testTask ->
+                            task.dependsOn testTask
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/buildSrc/src/main/groovy/MultiBuilds.groovy b/buildSrc/src/main/groovy/MultiBuilds.groovy
new file mode 100644
index 0000000..aa1a225
--- /dev/null
+++ b/buildSrc/src/main/groovy/MultiBuilds.groovy
@@ -0,0 +1,95 @@
+
+import org.gradle.api.GradleException;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.gradle.api.Task;
+import org.gradle.api.file.FileTree;
+import org.gradle.api.tasks.compile.JavaCompile;
+import org.gradle.language.base.internal.ProjectLayout;
+import org.gradle.language.base.plugins.ComponentModelBasePlugin;
+import org.gradle.language.nativeplatform.tasks.AbstractNativeSourceCompileTask;
+import org.gradle.model.ModelMap;
+import org.gradle.model.Mutate;
+import org.gradle.nativeplatform.test.googletest.GoogleTestTestSuiteBinarySpec;
+import org.gradle.model.RuleSource;
+import org.gradle.model.Validate;
+import org.gradle.nativeplatform.NativeExecutableBinarySpec
+import org.gradle.nativeplatform.NativeBinarySpec;
+import org.gradle.nativeplatform.NativeComponentSpec;
+import org.gradle.nativeplatform.NativeLibrarySpec;
+import org.gradle.nativeplatform.SharedLibraryBinarySpec;
+import org.gradle.nativeplatform.StaticLibraryBinarySpec;
+import org.gradle.nativeplatform.platform.internal.NativePlatformInternal;
+import org.gradle.nativeplatform.toolchain.NativeToolChain;
+import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
+import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider;
+import org.gradle.nativeplatform.toolchain.internal.ToolType;
+import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain;
+import org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppToolChain;
+import org.gradle.nativeplatform.toolchain.internal.tools.ToolRegistry;
+import org.gradle.platform.base.BinarySpec;
+import org.gradle.platform.base.ComponentSpec;
+import org.gradle.platform.base.ComponentSpecContainer;
+import org.gradle.platform.base.BinaryContainer;
+import org.gradle.platform.base.ComponentType;
+import org.gradle.platform.base.TypeBuilder;
+import org.gradle.nativeplatform.tasks.ObjectFilesToBinary;
+import groovy.transform.CompileStatic;
+import groovy.transform.CompileDynamic
+import org.gradle.nativeplatform.BuildTypeContainer
+
+@CompileStatic
+class MultiBuilds implements Plugin<Project> {
+  @CompileStatic
+  public void apply(Project project) {
+
+  }
+
+  @CompileStatic
+  static class Rules extends RuleSource {
+    @Mutate
+    void setupBuildTypes(BuildTypeContainer buildTypes, ProjectLayout projectLayout) {
+        def project = (Project) projectLayout.projectIdentifier
+        if (project.hasProperty('releaseBuild')) {
+            buildTypes.create('debug')
+        } else {
+            buildTypes.create('release')
+        }
+    }
+
+    @CompileDynamic
+    private static void setBuildableFalseDynamically(NativeBinarySpec binary) {
+        binary.buildable = false
+    }
+
+    @Mutate
+    @CompileStatic
+    void disableReleaseGoogleTest(BinaryContainer binaries, ProjectLayout projectLayout) {
+      def project = (Project) projectLayout.projectIdentifier
+      if (project.hasProperty('testRelease')) {
+        return
+      }
+      binaries.withType(GoogleTestTestSuiteBinarySpec) { oSpec ->
+        GoogleTestTestSuiteBinarySpec spec = (GoogleTestTestSuiteBinarySpec) oSpec
+        if (spec.buildType.name == 'release') {
+          Rules.setBuildableFalseDynamically(spec)
+        }
+      }
+        // def crossCompileConfigs = []
+        // for (BuildConfig config : configs) {
+        //     if (!BuildConfigRulesBase.isCrossCompile(config)) {
+        //         continue
+        //     }
+        //     crossCompileConfigs << config.architecture
+        // }
+        // if (!crossCompileConfigs.empty) {
+        //     binaries.withType(GoogleTestTestSuiteBinarySpec) { oSpec ->
+        //         GoogleTestTestSuiteBinarySpec spec = (GoogleTestTestSuiteBinarySpec) oSpec
+        //         if (crossCompileConfigs.contains(spec.targetPlatform.architecture.name)) {
+        //             setBuildableFalseDynamically(spec)
+        //         }
+        //     }
+        // }
+    }
+  }
+}
diff --git a/buildSrc/src/main/groovy/SingleNativeBuild.groovy b/buildSrc/src/main/groovy/SingleNativeBuild.groovy
new file mode 100644
index 0000000..f37fc57
--- /dev/null
+++ b/buildSrc/src/main/groovy/SingleNativeBuild.groovy
@@ -0,0 +1,113 @@
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.gradle.api.GradleException;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.gradle.api.Task;
+import org.gradle.api.file.FileTree;
+import org.gradle.api.tasks.compile.JavaCompile;
+import org.gradle.language.base.internal.ProjectLayout;
+import org.gradle.language.base.plugins.ComponentModelBasePlugin;
+import org.gradle.language.nativeplatform.tasks.AbstractNativeSourceCompileTask;
+import org.gradle.model.ModelMap;
+import org.gradle.model.Mutate;
+import org.gradle.model.RuleSource;
+import org.gradle.model.Validate;
+import org.gradle.nativeplatform.NativeBinarySpec;
+import org.gradle.nativeplatform.NativeComponentSpec;
+import org.gradle.nativeplatform.NativeLibrarySpec;
+import org.gradle.nativeplatform.SharedLibraryBinarySpec;
+import org.gradle.nativeplatform.StaticLibraryBinarySpec;
+import org.gradle.nativeplatform.platform.internal.NativePlatformInternal;
+import org.gradle.nativeplatform.toolchain.NativeToolChain;
+import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
+import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider;
+import org.gradle.nativeplatform.toolchain.internal.ToolType;
+import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain;
+import org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppToolChain;
+import org.gradle.nativeplatform.toolchain.internal.tools.ToolRegistry;
+import org.gradle.platform.base.BinarySpec;
+import org.gradle.platform.base.ComponentSpec;
+import org.gradle.platform.base.ComponentSpecContainer;
+import org.gradle.platform.base.BinaryContainer;
+import org.gradle.platform.base.ComponentType;
+import org.gradle.platform.base.TypeBuilder;
+import org.gradle.nativeplatform.tasks.ObjectFilesToBinary;
+import groovy.transform.CompileStatic;
+
+@CompileStatic
+class SingleNativeBuild implements Plugin<Project> {
+    @CompileStatic
+    public void apply(Project project) {
+
+    }
+
+    @CompileStatic
+    static class Rules extends RuleSource {
+        @Mutate
+        @CompileStatic
+        void setupSingleNativeBuild(ModelMap<Task> tasks, ComponentSpecContainer components, BinaryContainer binaryContainer, ProjectLayout projectLayout) {
+            Project project = (Project) projectLayout.projectIdentifier;
+
+            def nativeName = project.extensions.extraProperties.get('nativeName')
+
+            NativeLibrarySpec base = null
+            def subs = []
+            components.each { component ->
+                if (component.name == "${nativeName}Base") {
+                    base = (NativeLibrarySpec) component
+                } else if (component.name == "${nativeName}" || component.name == "${nativeName}JNI") {
+                    subs << component
+                }
+            }
+            subs.each {
+                ((NativeLibrarySpec) it).binaries.each { oBinary ->
+                    if (oBinary.buildable == false) {
+                        return
+                    }
+                    NativeBinarySpec binary = (NativeBinarySpec) oBinary
+                    NativeBinarySpec baseBin = null
+                    base.binaries.each { oTmpBaseBin ->
+                        if (oTmpBaseBin.buildable == false) {
+                            return
+                        }
+                        def tmpBaseBin = (NativeBinarySpec) oTmpBaseBin
+                        if (tmpBaseBin.targetPlatform.operatingSystem.name == binary.targetPlatform.operatingSystem.name &&
+                                tmpBaseBin.targetPlatform.architecture.name == binary.targetPlatform.architecture.name &&
+                                tmpBaseBin.buildType == binary.buildType) {
+                            baseBin = tmpBaseBin
+                        }
+                    }
+                    baseBin.tasks.withType(AbstractNativeSourceCompileTask) { oCompileTask ->
+                        def compileTask = (AbstractNativeSourceCompileTask) oCompileTask
+                        if (binary instanceof SharedLibraryBinarySpec) {
+                            def sBinary = (SharedLibraryBinarySpec) binary
+                            ObjectFilesToBinary link = (ObjectFilesToBinary) sBinary.tasks.link
+                            link.dependsOn compileTask
+                            link.inputs.dir compileTask.objectFileDir
+                            def tree = project.fileTree(compileTask.objectFileDir)
+                            tree.include '**/*.o'
+                            tree.include '**/*.obj'
+                            link.source tree
+                        } else if (binary instanceof StaticLibraryBinarySpec) {
+                            def sBinary = (StaticLibraryBinarySpec) binary
+                            ObjectFilesToBinary assemble = (ObjectFilesToBinary) sBinary.tasks.createStaticLib
+                            assemble.dependsOn compileTask
+                            assemble.inputs.dir compileTask.objectFileDir
+                            def tree = project.fileTree(compileTask.objectFileDir)
+                            tree.include '**/*.o'
+                            tree.include '**/*.obj'
+                            assemble.source tree
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
