diff --git a/cppSettings.gradle b/cppSettings.gradle
new file mode 100644
index 0000000..a0197b2
--- /dev/null
+++ b/cppSettings.gradle
@@ -0,0 +1,243 @@
+// These add the nilibraries shared library to the linker args
+def niLibraryPath = file('ni-libraries/lib').path
+def niLibrary = niLibraryPath + "/libnilibraries.so"
+
+configurations.create('armDeps')
+
+dependencies {
+    armDeps ntcoreDep('cpp', 'arm', 'zip')
+    armDeps wpiUtilDep('arm')
+    armDeps cscoreDep('cpp', 'athena-uberzip', 'zip')
+}
+
+def depLocation = "$buildDir/dependencies"
+
+configurations.armDeps.files.each { file ->
+    def depName = file.name.substring(0, file.name.indexOf('-'))
+    def t = tasks.create("downloadArm${depName.capitalize()}", Copy) {
+        description = "Downloads and unzips the $depName dependency."
+        group = 'Dependencies'
+        from zipTree(file)
+        into "$depLocation/${depName.toLowerCase()}"
+    }
+}
+
+task downloadNetworkTables {
+    description = 'Downloads all needed versions of networktables.'
+    group = 'Dependencies'
+    dependsOn downloadArmNetworkTables
+}
+
+task downloadWpiutil {
+    description = 'Downloads all needed versions of WPIUtil.'
+    group = 'Dependencies'
+    dependsOn downloadArmWpiutil
+}
+
+task downloadCscore {
+    description = 'Downloads all needed versions of cscore.'
+    group = 'Dependencies'
+    dependsOn downloadArmCscore
+}
+
+if (enableSimulation) {
+    configurations.create('nativeDeps')
+
+    dependencies {
+        nativeDeps ntcoreDep('cpp', 'desktop', 'zip')
+        nativeDeps wpiUtilDep('desktop')
+    }
+
+    configurations.nativeDeps.files.each { file ->
+        def depName = file.name.substring(0, file.name.indexOf('-'))
+        def t = tasks.create("downloadNative${depName.capitalize()}", Copy) {
+            description = "Downloads and unzips the $depName dependency."
+            group = 'Dependencies'
+            from zipTree(file)
+            into "$depLocation/${depName.toLowerCase()}"
+        }
+    }
+
+    downloadNetworkTables.dependsOn downloadNativeNetworkTables
+    downloadWpiutil.dependsOn downloadNativeWpiutil
+}
+
+def netTablesUnzipLocation = "$depLocation/networktables"
+def wpiUtilUnzipLocation = "$depLocation/wpiutil"
+def csCoreUnzipLocation = "$depLocation/cscore"
+
+task clean(type: Delete) {
+    description = "Deletes the build directory"
+    group = "Build"
+    delete buildDir
+}
+
+if (!hasProperty("toolChainPath")) {
+    ext.toolChainPath = null
+}
+
+subprojects {
+    ext.defineWpiUtilProperties = {
+        ext.wpiUtil = wpiUtilUnzipLocation
+        ext.wpiUtilInclude = "$wpiUtilUnzipLocation/include"
+        ext.wpiUtilLibArmLocation = "$wpiUtilUnzipLocation/Linux/arm"
+        if (enableSimulation) {
+            ext.wpiUtilLibDesktopLocation = "$wpiUtilUnzipLocation/Linux/amd64"
+        }
+        ext.wpiUtilSharedLib = "$wpiUtilLibArmLocation/libwpiutil.so"
+        ext.wpiUtilSharedLibDebug = "$wpiUtilLibArmLocation/libwpiutil.so.debug"
+        ext.wpiUtilStaticLib = "$wpiUtilLibArmLocation/libwpiutil.a"
+
+        ext.addWpiUtilLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadWpiutil
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args wpiUtilSharedLib
+            }
+        }
+
+        ext.addStaticWpiUtilLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadWpiutil
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args wpiUtilStaticLib
+            }
+        }
+    }
+
+    // This defines a project property that projects depending on network tables can use to setup that dependency.
+    ext.defineNetworkTablesProperties = {
+        ext.netTables = netTablesUnzipLocation
+        ext.netTablesInclude = "$netTablesUnzipLocation/include"
+        ext.netLibArmLocation = "$netTablesUnzipLocation/Linux/arm"
+        if (enableSimulation) {
+            ext.netLibDesktopLocation = "$netTablesUnzipLocation/Linux/amd64"
+        }
+        ext.netSharedLib = "$netLibArmLocation/libntcore.so"
+        ext.netSharedLibDebug = "$netLibArmLocation/libntcore.so.debug"
+        ext.netStaticLib = "$netLibArmLocation/libntcore.a"
+
+        ext.addNetworkTablesLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadNetworkTables
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args netSharedLib
+            }
+            addWpiUtilLibraryLinks(compileTask, linker, targetPlatform)
+        }
+
+        ext.addStaticNetworkTablesLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadNetworkTables
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args netStaticLib
+            }
+            addStaticWpiUtilLibraryLinks(compileTask, linker, targetPlatform)
+        }
+    }
+
+    // This defines a project property that projects depending on cscore can use to setup that dependency.
+    ext.defineCsCoreProperties = {
+        ext.csCore = csCoreUnzipLocation
+        ext.csCoreInclude = "$csCoreUnzipLocation/include"
+        ext.csLibArmLocation = "$csCoreUnzipLocation/lib"
+        ext.csSharedLib = "$csLibArmLocation/libcscore.so"
+        ext.cvSharedLib = "$csLibArmLocation/libopencv.so"
+
+        ext.addCsCoreLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadCscore
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args << '-L' + csLibArmLocation
+                linker.args csSharedLib
+                linker.args cvSharedLib
+            }
+        }
+    }
+
+    ext.defineCrossCompilerProperties = {
+        // We use a custom-built cross compiler with the prefix arm-frc-linux-gnueabi-<util name>
+        // If this ever changes, the prefix will need to be changed here
+        ext.compilerPrefix = 'arm-frc-linux-gnueabi-'
+    }
+
+    plugins.withType(CppPlugin).whenPluginAdded {
+        defineCrossCompilerProperties()
+        model {
+            buildTypes {
+                debug
+            }
+            // Adds a custom toolchain for our compiler prefix and options
+            toolChains {
+                roborioGcc(Gcc) {
+                    if (toolChainPath != null)
+                        path toolChainPath
+                    target('roborio-arm') {
+                        cCompiler.executable = compilerPrefix + cCompiler.executable
+                        cppCompiler.executable = compilerPrefix + cppCompiler.executable
+                        linker.executable = compilerPrefix + linker.executable
+                        assembler.executable = compilerPrefix + assembler.executable
+                        // Gradle auto-adds the -m32 argument to the linker and compiler. Our compiler only supports
+                        // arm, and doesn't understand this flag, so it is removed from both
+                        cppCompiler.withArguments { args ->
+                            args << '-std=c++1y' << '-Wformat=2' << '-Wall' << '-Wextra' << '-Werror' << '-pedantic'
+                            args << '-Wno-psabi' << '-Wno-unused-parameter' << '-fPIC' << '-Og' << '-g3' << '-rdynamic'
+                            //TODO: When the compiler allows us to actually call deprecated functions from within
+                            // deprecated function, remove this line (this will cause calling deprecated functions
+                            // to be treated as a warning rather than an error).
+                            args << '-Wno-error=deprecated-declarations'
+                            args.remove('-m32')
+                        }
+                        linker.withArguments { args ->
+                            args << '-rdynamic'
+                            args.remove('-m32')
+                        }
+                        staticLibArchiver.executable = compilerPrefix + staticLibArchiver.executable
+                    }
+                }
+            }
+
+            platforms {
+                'roborio-arm' {
+                    architecture 'arm'
+                    operatingSystem 'linux'
+                }
+            }
+        }
+
+        ext.niLibraryHeadersRoot = "${rootDir}/ni-libraries/include"
+        ext.niLibraryHeadersChipObject = "${rootDir}/ni-libraries/include/FRC_FPGA_ChipObject"
+
+        ext.binTool = { tool ->
+            if (toolChainPath != null) return "${toolChainPath}/${compilerPrefix}${tool}"
+            return "${compilerPrefix}${tool}"
+        }
+
+        // This task adds the appropriate linker flags for the NI libraries
+        ext.addNiLibraryLinks = { linker, targetPlatform ->
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')){
+                linker.args << '-L' + niLibraryPath
+                linker.args niLibrary
+            }
+        }
+
+        // This task sets up the shared libraries to be stripped
+        ext.debugStripSetup = { project->
+            if (!project.hasProperty('debug')) {
+                project.tasks.whenObjectAdded { task ->
+                    def name = task.name.toLowerCase()
+                    if (name.contains('link') && name.contains('sharedlibrary')) {
+                        def library = task.outputFile.absolutePath
+                        def debugLibrary = task.outputFile.absolutePath + ".debug"
+                        task.doLast {
+                            exec { commandLine binTool('objcopy'), '--only-keep-debug', library, debugLibrary }
+                            exec { commandLine binTool('strip'), '-g', library }
+                            exec { commandLine binTool('objcopy'), "--add-gnu-debuglink=$debugLibrary", library }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
