diff --git a/README.md b/README.md
index 44f706bc7d60f906b4d8527a83c540d143e918c5..28a91641fc892b646200d80a60a9c46571d6e5bd 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,89 @@
 # Integration
 
 ## Purpose
-This is to automatically test all the system's components and make sure they 
-work together correctly. If the integration test passes, it should guarantee
-that clients can send messages all the way through the system, including 
-mixing with multiple nodes and an anonymity set greater than 1. If the 
-integration test fails, look at the logs and narrow down the cause by adding
-more logging statements if necessary.
+This is for running the network locally on a single machine. 
+There are 2 testing suite packages (smokeinfra and basice2e) and a 
+general-use long-running network package (localNetwork). 
+
+### Testing Suites
+This is to automatically test all the system's components and make sure they
+work together correctly. These testing suites are used by the xx network team to ensure basic functionality
+of the network and its clients. It is a part of their CI/CD workflow. If the 
+integration tedigga#1
+st fails with an unknown or unhandled error, they look at the logs
+to narrow down and resolve the issue.
+
+[SmokeInfra](./smokeinfra/) is a simple test of the xx network, ensuring that rounds are running. 
+Generally speaking, this is for the xx network team and developers that wish to 
+contribute to how the network operates.
+
+[BasicE2E](./basice2e) determines whether clients can send messages all the way through the system, including 
+mixing with multiple nodes and an anonymity set greater than 1. There are several
+tests of the client in this package, including features such as group messaging,
+file transfer, etc. Whenever a new feature is introduced to the client by the 
+xx network development team, a new test for this feature 
+is added to this testing suite via the run script (`run.sh`)
+
+## Local Network
+
+The [localNetwork package](./localNetwork) is a more general-use network tool.
+This package will run a local version of the xx network on a single machine until a 
+manually killed by the user. This can be done using either the `run.sh`  or the `runpublish.sh` scripts.
+With this network established, a developer may,
+for example, test the xxDK. 
 
 ## How to manually run locally
 
-1. Build the binaries under test for your operating system and place them in 
+1. Build the binaries for your operating system and place them in 
 the `bin` directory.
-1. `cd` to `basice2e/` and run `run.sh`. Observe the results and inspect the 
+2. `cd` to any of the three previously mentioned directories and run `run.sh`. Observe the results and inspect the 
 logs if things go wrong.
-1. Make changes to the `run.sh` script, config files, and binaries as needed
+3. OPTIONAL: Make changes to the `run.sh` script, config files, and binaries as needed
 based on your analysis of the logs. You may want to add more logging or build
 the binaries under test with race condition checking to track down problems.
 
-## What runs on continuous integration?
+## Scripts
 
-The `master` branch of integration runs whenever you merge anything to the 
-`master` branch of any of the projects that integration tests. The CI server 
-downloads the latest `master` branch binaries that any CI server built and 
-uses them to run `basice2e/run.sh`.
+### `build.sh`
 
-The benchmark branch of integration runs nightly and produces information about
-how fast the software runs. It doesn't provide the full performance picture 
-because it runs on one modest CI server, rather than on a team of powerful 
-servers. However, the information it provides is sometimes useful.
+[`build.sh`](./build.sh) generates version information for all repositories under test and
+builds binaries for them in the `bin/` directory.
 
-So, if you make changes that break integration and merge the fixes to the 
-`master` branch of integration, you ought to also merge the `master` branch
-into the `benchmark` branch so that the benchmarks will continue to function.
+### `download_cmix_binaries.sh`
 
-## Automate running locally
+The script [`download_cmix_binaries.sh`](./download_cmix_binaries.sh) accepts an optional flag that
+specifies which platform to download the binaries for. If no flag is specified,
+then the script defaults to the Linux binaries. Refer to the table below for
+details on the flags.
 
-`build.sh` generates version information for all repositories under test and
-builds binaries for them in the `bin/` directory.
+|Long flag|Short flag|Effect|
+|---|---|---|
+|linux|l|downloads the Linux binaries|
+|mac|m|downloads the Mac binaries|
+
+A second argument can be provided which changes where the script downloads from.
+By default it downloads from a public bucket which includes release and master builds.
+
+|Flag name|Short flag|Effect|
+|---|---|---|
+|dev downloads|d|downloads from internal CI |
+
+This script will require additional set-up steps, see the [Additional Set-Up](#Additional-Set-Up) section for
+details.
+
+### download.sh
 
-`download_cmix_binaries` downloads binaries from certain branches into the `bin/` directory.
-The targeted operating system for the binaries can be specified via command line arguments.
+[`download.sh`](./download.sh) will download all network related repositories to the working
+directory. Each repository will be individually built, with the binary being moved
+to the `binaries/` directory, for the run script (`run.sh`) to initiate. This
+will not require additional steps like `download_cmix_binaries.sh`, it will use up more
+local storage. This will download binaries from release by default.
+
+If you want to build and run custom binaries off of custom branches, you may create a branch in
+local environment styled as `feature/[INSERT_PROJECT_BRANCH]` and run the download script
+checked out into that feature branch.
+
+### `update.sh`
 
 `update.sh` runs `git pull` for each repo under test, and by uncommenting the
 relevant code, checks out the `master` branch of each repo before pulling. This 
@@ -57,3 +100,39 @@ resulting logs, set the INTEGRATION\_EDITOR environment variable:
 If you need to make a lot of exploratory changes to get things integrated,
 using these utility scripts can speed up the process.
 
+### Additional Set Up
+
+You will need to add a personal access token to your environment vars to download binaries via the
+`download_cmix_binaries.sh`.  You can generate one [here](https://gitlab.com/-/profile/personal_access_tokens),
+giving it the "api" scope.
+Please add the following to your `~/.zshrc` or `~/.bash_profile` depending on your shell
+(You could most likely find out what shell you're using by running `echo $0` in the terminal).
+
+```
+export GITLAB_ACCESS_TOKEN=token_here
+```
+
+You could also invoke the script with the var, if you don't want to set it in your file or use
+a different token temporarily.
+
+```
+GITLAB_ACCESS_TOKEN=token_here ./download_cmix_binaries.sh [l/m] d
+```
+
+The script downloads from the CI when the second argument into it (the one after the platform flag) is `d`.
+
+## What runs on continuous integration? (Team Only)
+
+The `master` branch of integration runs whenever you merge anything to the
+`master` branch of any of the projects that integration tests. The CI server
+downloads the latest `master` branch binaries that any CI server built and
+uses them to run `basice2e/run.sh`.
+
+The benchmark branch of integration runs nightly and produces information about
+how fast the software runs. It doesn't provide the full performance picture
+because it runs on one modest CI server, rather than on a team of powerful
+servers. However, the information it provides is sometimes useful.
+
+So, if you make changes that break integration and merge the fixes to the
+`master` branch of integration, you ought to also merge the `master` branch
+into the `benchmark` branch so that the benchmarks will continue to function.
\ No newline at end of file
diff --git a/basice2e/permissioning.yaml b/basice2e/permissioning.yaml
index b0e25e0b088794a775ae522e072768ab99aab33b..3cc181f34440339b84755a9cbe2caa04acd332b7 100644
--- a/basice2e/permissioning.yaml
+++ b/basice2e/permissioning.yaml
@@ -39,17 +39,6 @@ permissiveIPChecking: true
 # Expects duration in"h". (Defaults to 1 weeks (168 hours)
 messageRetentionLimit: "168h"
 
-# "Location of the user discovery contact file.
-udContactPath: "results/udbContact.bin"
-udbAddress: "127.0.0.1:18001"
-# Path to UDB public key PEM file
-udbPubKeyPemPath: "../keys/cmix.rip.crt"
-
-
-clientRegCodes:
-  - "FFFF"
-  - "GGGG"
-
 # Path to the file containing the round ID
 roundIdPath: "results/roundId.txt"
 
@@ -70,8 +59,9 @@ ndfOutputPath: "results/permissions-ndfoutput.json"
 # === REQUIRED FOR ENABLING TLS ===
 # Path to the UDB certificate file
 udbCertPath: "../keys/cmix.rip.crt"
-# Path to the certificate file
-serverCertPath: "../keys/cmix.rip.crt"
+# "Location of the user discovery contact file.
+udContactPath: "results/udbContact.bin"
+udbAddress: "127.0.0.1:18001"
 
 # Time interval (in minutes) in which the database is
 # checked for banned nodes
@@ -95,6 +85,3 @@ RegCodesFilePath: "regCodes.json"
 
 # Set address space size for ephemeral IDs
 addressSpace: 32
-
-# Public address used in NDF to give to client
-registrationAddress: "0.0.0.0:11421"
diff --git a/download.sh b/download.sh
index d16236729225645a7e3c3274c7cc649d62946f2b..7957b8285f196550069e926609644465d2980d99 100755
--- a/download.sh
+++ b/download.sh
@@ -1,47 +1,97 @@
 #!/bin/bash
+
+# If we are on a feature branch, add it to the eval list
+FBRANCH=$(git rev-parse --abbrev-ref HEAD)
+if [[ "$CI_BUILD_REF_NAME" != "" ]]; then
+    FBRANCH=$CI_BUILD_REF_NAME
+fi
+FBRANCH=$(echo $FBRANCH | grep feature)
+# Also check for the branch name without the "feature" on it.
+FBRANCH2=$(echo $FBRANCH | sed 's/feature\///g')
+
 LOCALPATH=$(pwd)
-echo "Local path: $LOCALPATH"
+BINARYPATH=$LOCALPATH/bin
+
+# Clean up pathing
 rm -rf gitlab.com/*
 rm -rf bin/*
 mkdir -p bin
+mkdir -p bin
+
+CHECKOUTBRANCH=""
+setCheckoutBranch() {
+  CHECKOUTBRANCH="release"
+  if [ -z "$FBRANCH"]; then
+    CHECKOUTBRANCH=$FBRANCH
+  fi
+  if [ -z "$FBRANCH2"]; then
+    CHECKOUTBRANCH=$FBRANCH2
+  fi
+
+}
+
+# Download client
 git clone https://git.xx.network/elixxir/client gitlab.com/elixxir/client
 pushd gitlab.com/elixxir/client
+setCheckoutBranch
+git checkout $CHECKOUTBRANCH
 go mod vendor -v
 go mod tidy
-go build -mod vendor -o "$LOCALPATH/bin/client" main.go
+go build -mod vendor -o "$BINARYPATH/client" main.go
 popd
+
+# Download UD
 echo "Downloading user discovery..."
 git clone https://git.xx.network/elixxir/user-discovery-bot gitlab.com/elixxir/user-discovery-bot
 pushd gitlab.com/elixxir/user-discovery-bot
+setCheckoutBranch
+git checkout $CHECKOUTBRANCH
 go mod vendor -v
 go mod tidy
-go build -mod vendor -o "$LOCALPATH/bin/udb" main.go
+go build -mod vendor -o "$BINARYPATH/udb" main.go
 popd
-echo "Downloading permissioning server..."
+
+# Download scheduling server
+echo "Downloading scheduling server..."
 git clone https://git.xx.network/elixxir/registration gitlab.com/elixxir/registration
 pushd gitlab.com/elixxir/registration
+setCheckoutBranch
+git checkout $CHECKOUTBRANCH
 go mod vendor -v
 go mod tidy
-go build -mod vendor -o "$LOCALPATH/bin/permissioning" main.go
+go build -mod vendor -o "$BINARYPATH/permissioning" main.go
 popd
+
+# Download client registrar
 echo "Downloading client registrar"
 git clone https://git.xx.network/elixxir/client-registrar.git gitlab.com/elixxir/client-registrar
 pushd gitlab.com/elixxir/client-registrar
+setCheckoutBranch
+git checkout $CHECKOUTBRANCH
 go mod vendor -v
 go mod tidy
-go build -mod vendor -o "$LOCALPATH/bin/client-registrar" gitlab.com/elixxir/client-registrar
+go build -mod vendor -o "$BINARYPATH/client-registrar" gitlab.com/elixxir/client-registrar
 popd
+
+# Download cMix node
 echo "Downloading cMix node..."
 git clone https://git.xx.network/elixxir/server gitlab.com/elixxir/server
 pushd gitlab.com/elixxir/server
+setCheckoutBranch
+git checkout $CHECKOUTBRANCH
 go mod vendor -v
 go mod tidy
-go build -mod vendor -o "$LOCALPATH/bin/server" main.go
+go build -mod vendor -o "$BINARYPATH/server main".go
 popd
+
+# Download cMix gateway
 echo "Downloading cMix gateway..."
 git clone https://git.xx.network/elixxir/gateway gitlab.com/elixxir/gateway
 pushd gitlab.com/elixxir/gateway
+setCheckoutBranch
+git checkout $CHECKOUTBRANCH
 go mod vendor -v
 go mod tidy
-go build -mod vendor -o "$LOCALPATH/bin/gateway" main.go
+make clean
+go build -mod vendor -o "$BINARYPATH/gateway" main.go
 popd
diff --git a/localNetwork/README.md b/localNetwork/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..875936bc703e1682fb2ce7942786e5d8331060cb
--- /dev/null
+++ b/localNetwork/README.md
@@ -0,0 +1,83 @@
+# Local Continuously Running Network (localNetwork)
+
+This tool runs several servers as a local simulation of the xx network. 
+The basic structure is as follows:
+
+* 3 cMix Nodes, BatchSize of 32
+* 3 Gateways, each connected to its own node
+* User Discovery Bot
+* Scheduling Server
+* Client Registrar
+
+With these tools you may run the xxDK off of the produced [ndf](./ndf.json), testing locally without
+having to operate on MainNet or any other live network.
+
+## Operating the Network
+
+To run the local network, you only need to run either `run.sh` or `runpublic.sh`. The difference
+between these two scripts is described below, in the [scripts section](#scripts). Below is an example of running
+`run.sh`:
+
+```commandline
+./run.sh 
+rm: cannot remove 'gateway*-knownRound': No such file or directory
+rm: cannot remove 'errServer-*': No such file or directory
+rm: cannot remove '*.log': No such file or directory
+rm: cannot remove 'roundId.txt': No such file or directory
+rm: cannot remove '*-knownRound': No such file or directory
+rm: cannot remove 'updateId*': No such file or directory
+rm: cannot remove 'lastupdateid*': No such file or directory
+rm: cannot remove 'udbsession': No such file or directory
+STARTING SERVERS...
+Permissioning:  112749
+Client Registrar:  112750
+Server 0:  112757
+Server 1:  112762
+Server 2:  112763
+Gateway 0 -- 112774
+Gateway 1 -- 112775
+Gateway 2 -- 112776
+You can't use the network until rounds run.
+If it doesn't happen after 1 minute, please Ctrl+C
+and review logs for what went wrong.
+Waiting for rounds to run..............STARTING UDB...
+UDB:  112937
+\nNetwork rounds have run. You may now attempt to connect.
+Press enter to exit... 
+```
+
+This script will run continuously until the user has sent a kill signal. The run script expects
+`Enter/Return` once the network is set up. However, at any point prior of after the network is set 
+up, the user may kill the script using standard kill signals (`CTR+C`, `CTR+D`, etc.).
+
+## Scripts
+
+### `run.sh`
+The `run.sh` script  will run the network with internal IP addresses. This will allow the user
+to test the xxDK from the machine running the local network.
+
+### runpublish.sh` 
+The `runpublish.sh` runs the network with remotely accessible IP addresses. This 
+will allow the user to test the xxDK from another machine, provided they have passed the ndf
+along.
+
+## Configurability of Local Network
+
+If you wish to test with a larger local network, you may use the [config file generation script](./configGen/gen.py). 
+This will generate a programmable number of gateways/servers config files.
+ The snippet below gives an example on how to run this script:
+
+```commandline
+$ cd configGen/
+$  python3 gen.py 
+Total number of nodes: 9
+Minimum number of nodes online to start network: 3
+Size of each team: 3
+```
+
+This example generates 9 cMix nodes with 9 associated gateways. The rounds will have 3 nodes in a team,
+and the network only needs 3 nodes running to start running rounds. 
+
+Once config files have been generated, you need only execute the run script to run a network of the desired size
+and specifications. Please note that this network does run locally, and as such larger networks
+may be resource intensive (depending on the user's machine).
diff --git a/localNetwork/client-registrar.yaml b/localNetwork/client-registrar.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..8187c687401d0ae78e1cfe49af219e2f651e12a3
--- /dev/null
+++ b/localNetwork/client-registrar.yaml
@@ -0,0 +1,36 @@
+# ==================================
+# Client Registrar Configuration
+# ==================================
+
+# Log message level (0 = info, 1 = debug, >1 = trace)
+logLevel: 0
+# Path to log file
+logPath: "results/client-registrar.log"
+
+# Public address, used in NDF it gives to client
+publicAddress: "0.0.0.0:11421"
+# The listening port of this server
+port: 11421
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the registration server private key file
+keyPath: "../keys/cmix.rip.key"
+# Path to the registration server certificate file
+certPath: "../keys/cmix.rip.crt"
+
+# Maximum number of connections per period
+userRegCapacity: 1000
+# How often the number of connections is reset
+userRegLeakPeriod: "24h"
+
+# Database connection information
+dbUsername: "cmix"
+dbPassword: ""
+dbName: "cmix_server"
+dbAddress: ""
+
+# List of client codes to be added to the database (for testing)
+clientRegCodes:
+  - "AAAA"
+  - "BBBB"
+  - "CCCC"
diff --git a/localNetwork/configFileGeneration/gateway_template.yaml b/localNetwork/configFileGeneration/gateway_template.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..21ca39e326dc4bf3e8299f1a78bca60775e497d5
--- /dev/null
+++ b/localNetwork/configFileGeneration/gateway_template.yaml
@@ -0,0 +1,79 @@
+################################################################################
+## Copyright © 2018 Privategrity Corporation                                   #
+##                                                                             #
+## All rights reserved.                                                        #
+################################################################################
+
+##
+# Gateway Configuration File
+##
+
+# Log message level
+loglevel: 0
+
+# Output log file
+log: "results/gateways/gateway-0.log"
+
+# Port for Gateway to listen on. Gateway must be the only listener on this port.
+# Required field.
+Port: 8200
+
+# Local IP address of the Gateway, used for internal listening. Expects an IPv4
+# address without a port. (Default "0.0.0.0")
+listeningAddress: ""
+
+# The public IPv4 address of the Gateway, as reported to the network, to use
+# instead of dynamically looking up Gateway's own IP address. If a port is not
+# included, then the port flag is used instead.
+overridePublicIP: "0.0.0.0"
+
+# The public IP address of the Node associated with this Gateway.
+cmixAddress: "{NODE_ADDR}"
+
+# Period in which the message cleanup function executes. Recommended period is on the order of a minute.
+messageTimeout: "1800s"
+
+# Path to where the IDF is saved. This is used by the wrapper management script.
+idfPath: "results/gateways/misc/gatewayIDF-0.json"
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the private key file
+keyPath: "../keys/cmix.rip.key"
+# Path to the certificate file
+certPath: "../keys/cmix.rip.crt"
+# Path to the permissioning certificate
+schedulingCertPath: "../keys/cmix.rip.crt"
+# Path to the certificate file
+cmixCertPath: "../keys/cmix.rip.crt"
+
+# How often the periodic storage tracker checks for items older than the
+# retention period value. Expects duration in "s", "m", "h". (Defaults to 5
+# minutes)
+cleanupInterval: 5m
+
+# How long a message record should last in the gossip buffer if it arrives
+# before the Gateway starts handling the gossip. (Default 300s)
+bufferExpiration: 300s
+
+# Frequency with which to check the gossip buffer. Should be long, since the
+# thread takes a lock each time it checks the buffer. (Default 150s)
+monitorThreadFrequency: 150s
+
+# Flags for rate limiting communications
+
+# The capacity of rate limiting buckets in the map. (Default 20)
+capacity: 20
+
+# The rate that the rate limiting bucket leaks tokens at [tokens/ns]. (Default 3)
+leakedTokens: 3
+
+# How often the number of leaked tokens is leaked from the bucket. (Default 1ms)
+leakDuration: 1ms
+
+# How often inactive buckets are removed. (Default 10s)
+pollDuration: 10s
+
+# The max age of a bucket without activity before it is removed. (Default 10s)
+bucketMaxAge: 10s
+
+devMode: true
diff --git a/localNetwork/configFileGeneration/gen.py b/localNetwork/configFileGeneration/gen.py
new file mode 100644
index 0000000000000000000000000000000000000000..88799a5b423d53e533fb04e66636eaa76424957c
--- /dev/null
+++ b/localNetwork/configFileGeneration/gen.py
@@ -0,0 +1,103 @@
+import os
+import string
+import random
+
+def randomString(stringLength=4):
+    letters = string.ascii_lowercase
+    return ''.join(random.choice(letters) for i in range(stringLength))
+
+nodes = int(input("Total number of nodes: "))
+minStart = int(input("Minimum number of nodes online to start network: "))
+teamSize = int(input("Size of each team: "))
+
+# Array of integers for ports of each server and gateway in the network
+gateway_ports = []
+node_ports = []
+node_regCodes = []
+
+server_template = ""
+with open("server_template.yaml") as f:
+    server_template = f.read()
+
+gateway_template = ""
+with open("gateway_template.yaml") as f:
+    gateway_template = f.read()
+
+reg_template = ""
+with open("permissioning_template.yaml") as f:
+    reg_template = f.read()
+
+reg_json_template = ""
+with open("registration_template.json") as f:
+    reg_json_template = f.read()
+
+# Generate a list of all ports servers and gateways occupy. Doing this as a 
+# separate step because their configs need every one listed, and generating them
+# once is lighter on CPU cycles.
+for i in range(nodes):
+    gateway_ports.append(8200+i)
+    node_ports.append(11200+i)
+
+    regCode = randomString()
+    # If this regCode is already in the list, we loop until we get one that 
+    # isn't
+    while regCode in node_regCodes:
+        regCode = randomString()
+    node_regCodes.append(regCode)
+
+# Generate server and gateway configs
+for i in range(nodes):
+    with open("../server-{}.yaml".format(i), 'w') as f:
+        # Array of strings defining node and gateway IPs and ports
+        node_addrs = []
+        node_addrs.append("\"{}\"".format(node_ports[i]))
+        # TODO: replace iplistoutput, idf, metrics log
+        # Create a new config based on template
+        s_config = server_template.replace("server-1", "server-" + str(i)) \
+            .replace("gateway-1", "gateway-" + str(i)) \
+            .replace("metrics-server-0", "metrics-server-" + str(i)) \
+            .replace("ipList-1", "ipList-" + str(i)) \
+            .replace("{NODE_ADDR}", "\r\n".join(node_addrs)) \
+            .replace("{DB_ADDR}", "".join(["\"\""])) \
+            .replace("AAAA", node_regCodes[i]) \
+            .replace("nodeID-0.json", "nodeID-"+str(i)+".json") \
+            .replace("11200", str(node_ports[i])) \
+            .replace("results/servers/server-0", "results/servers/server-" + str(i)) \
+            .replace("errServer-0.txt", "errServer-"+str(i)+".txt")
+        f.write(s_config)
+
+    with open("../gateway-{}.yaml".format(i), 'w') as f:
+        # Array of strings defining node and gateway IPs and ports
+        node_addrs = []
+        node_addrs.append("0.0.0.0:{}".format(node_ports[i]))
+
+        # Create a new config based on template
+        g_config = gateway_template.replace("server-1", "server-" + str(i)) \
+            .replace("gateway-0", "gateway-" + str(i)) \
+            .replace("8200", str(gateway_ports[i])) \
+            .replace("{NODE_ADDR}", "".join(node_addrs)) \
+            .replace("gatewayIDF-0", "gatewayIDF-" + str(i))
+
+        f.write(g_config)
+
+
+# Generate permissioning stuff
+with open("../registration.json", "w") as f:
+    config = reg_json_template.replace("{teamSize}", str(teamSize))
+    f.write(config)
+with open("../permissioning-actual.yaml", "w") as f:
+    config = reg_template.replace("{minStart}", str(minStart))
+    f.write(config)
+
+# Generate server regCodes file
+with open("../regCodes.json", "w") as f:
+    f.write("[")
+    countries = ["CR", "GB", "SK", "HR", "IQ", "RU"]
+    for i in range(nodes):
+        f.write("{\"RegCode\": \"" + node_regCodes[i] + "\", \"Order\": \"" + \
+            countries[i % len(countries)] + "\"}")
+        # If not the last element, write a comma
+        if i is not (nodes - 1): 
+            f.write(",")
+
+    f.write("]")
diff --git a/localNetwork/configFileGeneration/permissioning_template.yaml b/localNetwork/configFileGeneration/permissioning_template.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7f55fe158ee5315ba4fc826e183c4e6cc0aa012a
--- /dev/null
+++ b/localNetwork/configFileGeneration/permissioning_template.yaml
@@ -0,0 +1,97 @@
+# ==================================
+# Permissioning Server Configuration
+# ==================================
+
+# Log message level
+logLevel: 1
+
+# Path to log file
+logPath: "results/permissioning.log"
+
+# The listening port of this server
+port: 18000
+
+# Database connection information
+dbUsername: ""
+dbPassword: ""
+dbName: ""
+dbAddress: "0.0.0.0:6969"
+
+# Minimum number of nodes to begin running rounds. this differs from the number of members
+# in a team because some scheduling algorithms may require multiple teams worth of nodes at minimum
+minimumNodes: 3
+
+# The minimum version required of gateways to connect
+minGatewayVersion: "3.0.0"
+
+# The minimum version required of servers to connect
+minServerVersion:  "3.0.0"
+
+# The minimum version required of a client to connect
+minClientVersion: "4.0.0"
+
+# Time interval (in seconds) between committing Node statistics to storage
+nodeMetricInterval: 3
+
+# For testing, use the sequence as the country code. Do not use the geobinning database
+disableGeoBinning: true
+
+# For testing, do not exclude node or gateway IPs which are local to the machine
+allowLocalIPs: true
+
+# Disable pruning of NDF for offline nodes
+# if set to false, network will sleep for five minutes on start
+disableNDFPruning: true
+permissiveIPChecking: true
+
+# How long rounds will be tracked by gateways. Rounds (and messages as an extension)
+# prior to this period are not guaranteed to be delivered to clients.
+# Expects duration in"h". (Defaults to 1 weeks (168 hours)
+messageRetentionLimit: "168h"
+
+# "Location of the user discovery contact file.
+udContactPath: "results/udbContact.bin"
+udbAddress: "127.0.0.1:18001"
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the UDB certificate file
+udbCertPath: "../keys/cmix.rip.crt"
+
+# Path to the file containing the round ID
+roundIdPath: "results/roundId.txt"
+
+# Path to the file containing the update ID
+updateIdPath: "results/updateId.txt"
+
+# Path to whitelisted IPs for client ratelimiting
+whitelistedIpAddressesPath: "whitelist.txt"
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the private key file
+keyPath: "../keys/cmix.rip.key"
+# Path to the certificate file
+certPath: "../keys/cmix.rip.crt"
+
+# Path to the node topology permissioning info
+ndfOutputPath: "ndf.json"
+# Time interval (in minutes) in which the database is
+# checked for banned nodes
+BanTrackerInterval: "3"
+
+groups:
+  cmix:
+    prime: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF"
+    generator: "2"
+  e2e:
+    prime: "E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D49413394C049B7A8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688B55B3DD2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E7861575E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC6ADC718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C4A530E8FFB1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F26E5785302BEDBCA23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE448EEF78E184C7242DD161C7738F32BF29A841698978825B4111B4BC3E1E198455095958333D776D8B2BEEED3A1A1A221A6E37E664A64B83981C46FFDDC1A45E3D5211AAF8BFBC072768C4F50D7D7803D2D4F278DE8014A47323631D7E064DE81C0C6BFA43EF0E6998860F1390B5D3FEACAF1696015CB79C3F9C2D93D961120CD0E5F12CBB687EAB045241F96789C38E89D796138E6319BE62E35D87B1048CA28BE389B575E994DCA755471584A09EC723742DC35873847AEF49F66E43873"
+    generator: "2"
+
+# Path to file with config for scheduling algorithem within the user directory
+schedulingConfigPath: "registration_template.json"
+
+# Path to JSON file with list of Node registration codes (in order of network
+# placement)
+RegCodesFilePath: "regCodes.json"
+
+# Set address space size for ephemeral IDs
+addressSpace: 32
+
diff --git a/localNetwork/configFileGeneration/registration_template.json b/localNetwork/configFileGeneration/registration_template.json
new file mode 100644
index 0000000000000000000000000000000000000000..f66958a3af5434103b5b050d27db7aba07a57aee
--- /dev/null
+++ b/localNetwork/configFileGeneration/registration_template.json
@@ -0,0 +1,12 @@
+{
+    "TeamSize": {teamSize},
+  "BatchSize": 32,
+  "MinimumDelay": 60,
+  "RealtimeDelay": 120,
+  "SemiOptimalOrdering": true,
+  "Threshold":     0.3,
+  "NodeCleanUpInterval": 3,
+  "ResourceQueueTimeout": 300000
+
+
+}
\ No newline at end of file
diff --git a/localNetwork/configFileGeneration/server_template.yaml b/localNetwork/configFileGeneration/server_template.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..bd2258c33cdf7716f79760f86a4bdfe3d60eb974
--- /dev/null
+++ b/localNetwork/configFileGeneration/server_template.yaml
@@ -0,0 +1,45 @@
+# START YAML ===
+# registration code used for first time registration. Unique. Provided by xx network
+registrationCode: "AAAA"
+useGPU: false
+devMode: true
+rawPermAddr: true
+cmix:
+  paths:
+    # Path where the ID will be stored after the ID is created on first run
+    # used by the wrapper script
+    idf: "results/servers/nodeID-0.json"
+    # Path to the self signed TLS cert that the node uses for identification
+    cert: "../keys/cmix.rip.crt"
+    # Path to the private key for the self signed TLS cert
+    key:  "../keys/cmix.rip.key"
+    # Path to where the log will be stored
+    log:  "results/servers/server-0.log"
+    #
+    ipListOutput: "results/servers/ipList-1.txt"
+    # Path where an error file will be placed in the event of a fatal error
+    # used by the wrapper script
+    errOutput: "results/servers/errServer-0.txt"
+  # port the node will communicate on
+  port: 11200
+  overridePublicIP: "0.0.0.0"
+database:
+  name: "cmix_server"
+  username: "cmix"
+  password: ""
+  address: ""
+gateway:
+  paths:
+    # Path to the self signed TLS cert used by the gateway
+    cert: "../keys/cmix.rip.crt"
+scheduling:
+  paths:
+    # Path to the self signed TLS cert used by the permissioning. Provided by xx network
+    cert: "../keys/cmix.rip.crt"
+  # IP Address of the permissioning server, provided by xx network
+  address: "0.0.0.0:18000"
+metrics:
+  # location of stored metrics data. Modification to set to permissioning
+  # server instead of saving will be made at a later date
+  log:  "results/servers/metrics-server-0.log"
+# === END YAML
diff --git a/localNetwork/gateway-0.yaml b/localNetwork/gateway-0.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..171515e829addaa2395ac4b3154f386bc32f27a7
--- /dev/null
+++ b/localNetwork/gateway-0.yaml
@@ -0,0 +1,79 @@
+################################################################################
+## Copyright © 2018 Privategrity Corporation                                   #
+##                                                                             #
+## All rights reserved.                                                        #
+################################################################################
+
+##
+# Gateway Configuration File
+##
+
+# Log message level
+loglevel: 0
+
+# Output log file
+log: "results/gateways/gateway-0.log"
+
+# Port for Gateway to listen on. Gateway must be the only listener on this port.
+# Required field.
+Port: 8200
+
+# Local IP address of the Gateway, used for internal listening. Expects an IPv4
+# address without a port. (Default "0.0.0.0")
+listeningAddress: ""
+
+# The public IPv4 address of the Gateway, as reported to the network, to use
+# instead of dynamically looking up Gateway's own IP address. If a port is not
+# included, then the port flag is used instead.
+overridePublicIP: "0.0.0.0"
+
+# The public IP address of the Node associated with this Gateway.
+cmixAddress: "0.0.0.0:11200"
+
+# Period in which the message cleanup function executes. Recommended period is on the order of a minute.
+messageTimeout: "1800s"
+
+# Path to where the IDF is saved. This is used by the wrapper management script.
+idfPath: "results/gateways/misc/gatewayIDF-0.json"
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the private key file
+keyPath: "../keys/cmix.rip.key"
+# Path to the certificate file
+certPath: "../keys/cmix.rip.crt"
+# Path to the permissioning certificate
+schedulingCertPath: "../keys/cmix.rip.crt"
+# Path to the certificate file
+cmixCertPath: "../keys/cmix.rip.crt"
+
+# How often the periodic storage tracker checks for items older than the
+# retention period value. Expects duration in "s", "m", "h". (Defaults to 5
+# minutes)
+cleanupInterval: 5m
+
+# How long a message record should last in the gossip buffer if it arrives
+# before the Gateway starts handling the gossip. (Default 300s)
+bufferExpiration: 300s
+
+# Frequency with which to check the gossip buffer. Should be long, since the
+# thread takes a lock each time it checks the buffer. (Default 150s)
+monitorThreadFrequency: 150s
+
+# Flags for rate limiting communications
+
+# The capacity of rate limiting buckets in the map. (Default 20)
+capacity: 20
+
+# The rate that the rate limiting bucket leaks tokens at [tokens/ns]. (Default 3)
+leakedTokens: 3
+
+# How often the number of leaked tokens is leaked from the bucket. (Default 1ms)
+leakDuration: 1ms
+
+# How often inactive buckets are removed. (Default 10s)
+pollDuration: 10s
+
+# The max age of a bucket without activity before it is removed. (Default 10s)
+bucketMaxAge: 10s
+
+devMode: true
diff --git a/localNetwork/gateway-1.yaml b/localNetwork/gateway-1.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c10f2a476c421f6b45b75d9f45fed6c1abb46c75
--- /dev/null
+++ b/localNetwork/gateway-1.yaml
@@ -0,0 +1,79 @@
+################################################################################
+## Copyright © 2018 Privategrity Corporation                                   #
+##                                                                             #
+## All rights reserved.                                                        #
+################################################################################
+
+##
+# Gateway Configuration File
+##
+
+# Log message level
+loglevel: 0
+
+# Output log file
+log: "results/gateways/gateway-1.log"
+
+# Port for Gateway to listen on. Gateway must be the only listener on this port.
+# Required field.
+Port: 8201
+
+# Local IP address of the Gateway, used for internal listening. Expects an IPv4
+# address without a port. (Default "0.0.0.0")
+listeningAddress: ""
+
+# The public IPv4 address of the Gateway, as reported to the network, to use
+# instead of dynamically looking up Gateway's own IP address. If a port is not
+# included, then the port flag is used instead.
+overridePublicIP: "0.0.0.0"
+
+# The public IP address of the Node associated with this Gateway.
+cmixAddress: "0.0.0.0:11201"
+
+# Period in which the message cleanup function executes. Recommended period is on the order of a minute.
+messageTimeout: "1800s"
+
+# Path to where the IDF is saved. This is used by the wrapper management script.
+idfPath: "results/gateways/misc/gatewayIDF-1.json"
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the private key file
+keyPath: "../keys/cmix.rip.key"
+# Path to the certificate file
+certPath: "../keys/cmix.rip.crt"
+# Path to the permissioning certificate
+schedulingCertPath: "../keys/cmix.rip.crt"
+# Path to the certificate file
+cmixCertPath: "../keys/cmix.rip.crt"
+
+# How often the periodic storage tracker checks for items older than the
+# retention period value. Expects duration in "s", "m", "h". (Defaults to 5
+# minutes)
+cleanupInterval: 5m
+
+# How long a message record should last in the gossip buffer if it arrives
+# before the Gateway starts handling the gossip. (Default 300s)
+bufferExpiration: 300s
+
+# Frequency with which to check the gossip buffer. Should be long, since the
+# thread takes a lock each time it checks the buffer. (Default 150s)
+monitorThreadFrequency: 150s
+
+# Flags for rate limiting communications
+
+# The capacity of rate limiting buckets in the map. (Default 20)
+capacity: 20
+
+# The rate that the rate limiting bucket leaks tokens at [tokens/ns]. (Default 3)
+leakedTokens: 3
+
+# How often the number of leaked tokens is leaked from the bucket. (Default 1ms)
+leakDuration: 1ms
+
+# How often inactive buckets are removed. (Default 10s)
+pollDuration: 10s
+
+# The max age of a bucket without activity before it is removed. (Default 10s)
+bucketMaxAge: 10s
+
+devMode: true
diff --git a/localNetwork/gateway-2.yaml b/localNetwork/gateway-2.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5b1675110fed9cc0a0a741a2152fe546c35b941f
--- /dev/null
+++ b/localNetwork/gateway-2.yaml
@@ -0,0 +1,79 @@
+################################################################################
+## Copyright © 2018 Privategrity Corporation                                   #
+##                                                                             #
+## All rights reserved.                                                        #
+################################################################################
+
+##
+# Gateway Configuration File
+##
+
+# Log message level
+loglevel: 0
+
+# Output log file
+log: "results/gateways/gateway-2.log"
+
+# Port for Gateway to listen on. Gateway must be the only listener on this port.
+# Required field.
+Port: 8202
+
+# Local IP address of the Gateway, used for internal listening. Expects an IPv4
+# address without a port. (Default "0.0.0.0")
+listeningAddress: ""
+
+# The public IPv4 address of the Gateway, as reported to the network, to use
+# instead of dynamically looking up Gateway's own IP address. If a port is not
+# included, then the port flag is used instead.
+overridePublicIP: "0.0.0.0"
+
+# The public IP address of the Node associated with this Gateway.
+cmixAddress: "0.0.0.0:11202"
+
+# Period in which the message cleanup function executes. Recommended period is on the order of a minute.
+messageTimeout: "1800s"
+
+# Path to where the IDF is saved. This is used by the wrapper management script.
+idfPath: "results/gateways/misc/gatewayIDF-2.json"
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the private key file
+keyPath: "../keys/cmix.rip.key"
+# Path to the certificate file
+certPath: "../keys/cmix.rip.crt"
+# Path to the permissioning certificate
+schedulingCertPath: "../keys/cmix.rip.crt"
+# Path to the certificate file
+cmixCertPath: "../keys/cmix.rip.crt"
+
+# How often the periodic storage tracker checks for items older than the
+# retention period value. Expects duration in "s", "m", "h". (Defaults to 5
+# minutes)
+cleanupInterval: 5m
+
+# How long a message record should last in the gossip buffer if it arrives
+# before the Gateway starts handling the gossip. (Default 300s)
+bufferExpiration: 300s
+
+# Frequency with which to check the gossip buffer. Should be long, since the
+# thread takes a lock each time it checks the buffer. (Default 150s)
+monitorThreadFrequency: 150s
+
+# Flags for rate limiting communications
+
+# The capacity of rate limiting buckets in the map. (Default 20)
+capacity: 20
+
+# The rate that the rate limiting bucket leaks tokens at [tokens/ns]. (Default 3)
+leakedTokens: 3
+
+# How often the number of leaked tokens is leaked from the bucket. (Default 1ms)
+leakDuration: 1ms
+
+# How often inactive buckets are removed. (Default 10s)
+pollDuration: 10s
+
+# The max age of a bucket without activity before it is removed. (Default 10s)
+bucketMaxAge: 10s
+
+devMode: true
diff --git a/localNetwork/ndf.json b/localNetwork/ndf.json
new file mode 100644
index 0000000000000000000000000000000000000000..1a8717851031150a0e7af008be22f3b4172bdbdd
--- /dev/null
+++ b/localNetwork/ndf.json
@@ -0,0 +1 @@
+{"Timestamp":"2019-12-20T16:29:17.475068867-08:00","Gateways":[{"Id":[80,88,123,40,173,239,204,78,152,58,208,191,117,100,128,180,222,99,203,138,138,126,236,35,255,230,36,22,15,229,159,206,1],"Address":"0.0.0.0:8200","Tls_certificate":"-----BEGIN CERTIFICATE-----\nMIIGHTCCBAWgAwIBAgIUOcAn9cpH+hyRH8/UfqtbFDoSxYswDQYJKoZIhvcNAQEL\nBQAwgZIxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTESMBAGA1UEBwwJQ2xhcmVt\nb250MRAwDgYDVQQKDAdFbGl4eGlyMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEZMBcG\nA1UEAwwQZ2F0ZXdheS5jbWl4LnJpcDEfMB0GCSqGSIb3DQEJARYQYWRtaW5AZWxp\neHhpci5pbzAeFw0xOTA4MTYwMDQ4MTNaFw0yMDA4MTUwMDQ4MTNaMIGSMQswCQYD\nVQQGEwJVUzELMAkGA1UECAwCQ0ExEjAQBgNVBAcMCUNsYXJlbW9udDEQMA4GA1UE\nCgwHRWxpeHhpcjEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxGTAXBgNVBAMMEGdhdGV3\nYXkuY21peC5yaXAxHzAdBgkqhkiG9w0BCQEWEGFkbWluQGVsaXh4aXIuaW8wggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC7Dkb6VXFn4cdpU0xh6ji0nTDQ\nUyT9DSNW9I3jVwBrWfqMc4ymJuonMZbuqK+cY2l+suS2eugevWZrtzujFPBRFp9O\n14Jl3fFLfvtjZvkrKbUMHDHFehascwzrp3tXNryiRMmCNQV55TfITVCv8CLE0t1i\nbiyOGM9ZWYB2OjXt59j76lPARYww5qwC46vS6+3Cn2Yt9zkcrGeskWEFa2VttHqF\n910TP+DZk2R5C7koAh6wZYK6NQ4S83YQurdHAT51LKGrbGehFKXq6/OAXCU1JLi3\nkW2PovTb6MZuvxEiRmVAONsOcXKu7zWCmFjuZZwfRt2RhnpcSgzfrarmsGM0LZh6\nJY3MGJ9YdPcVGSz+Vs2E4zWbNW+ZQoqlcGeMKgsIiQ670g0xSjYICqldpt79gaET\n9PZsoXKEmKUaj6pq1d4qXDk7s63HRQazwVLGBdJQK8qX41eCdR8VMKbrCaOkzD5z\ngnEu0jBBAwdMtcigkMIk1GRv91j7HmqwryOBHryLi6NWBY3tjb4So9AppDQB41SH\n3SwNenAbNO1CXeUqN0hHX6I1bE7OlbjqI7tXdrTllHAJTyVVjenPel2ApMXp+LVR\ndDbKtwBiuM6+n+z0I7YYerxN1gfvpYgcXm4uye8dfwotZj6H2J/uSALsU2v9UHBz\nprdrLSZk2YpozJb+CQIDAQABo2kwZzAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\nBBQNpO8btLCBFDfBxjHiX5YxxmNfujAfBgNVHSMEGDAWgBQNpO8btLCBFDfBxjHi\nX5YxxmNfujAUBgNVHREEDTALgglmb28uY28udWswDQYJKoZIhvcNAQELBQADggIB\nAFBB51j37HKheoJVkkoXOiIPVDWiVaagfK84RaTtKApnw1BlniZsBbM8/j4/oPU1\n2zw3wyRijtfp/gG2WiQV5Yuy64ZKsqON7grxzpXaviwEmKFerOpEUG0fzzDUP/6y\ndDviiwQDWSLrj8uy0A4ICbNAcUzNteLk4661sZzouMFNv82Zj24REieTjTiRAd1T\ni5FP6Jm7+IEmCSDKiEdkA2NAeRMoAuGy46GyrH8xDlF9Wb0ylBWLyHUT+kGHCFXv\n83v8HSMEnJxUZmYgdVmYH6OMEDrcFfaOis3LuWEyQnKCyVF5rPdVsno/YMAkbHe2\nhz1Z8r3Vq9D41DSjQ5Ye/o5BlHQazUxHwnFvVpOHRa1rrMgrOoj/np9NODqvg1r0\nf4fesvMEykdI3nxFcgv3VO6OWg44wUPkAdgOCWRVaf2pYljtUAHhAQw9rMwdVDBJ\nXFyYK1bPZQ2u1LKU0Jvh7E1kaiO4whXqm1iGRT5BqoZr0G5LCmCI0Aln2vVJXa5W\nj9pqjIEiff30e0niURKqRXDm0HPXndnuP5fiEIe4GVpUn0ZVIhXxjGxZAvKtbf4D\ngv59XhmKdByackhaZQBn4qPi+e+qcjfn7vSKCXtGS9ty6pFOKxOD3M2KSAKjKLPv\nAM5Yqa/9MSQt+nxIJRlo5aXpGwffZW+4L6fy9Jtjcu4N\n-----END CERTIFICATE-----\n"},{"Id":[119,202,117,27,100,163,223,134,153,205,212,237,214,173,127,236,24,192,194,144,189,255,197,189,165,121,229,68,140,42,188,246,1],"Address":"0.0.0.0:8300","Tls_certificate":"-----BEGIN CERTIFICATE-----\nMIIGHTCCBAWgAwIBAgIUAUBluP82Kv2R/dKPcpsl+9FLsXQwDQYJKoZIhvcNAQEL\nBQAwgZIxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTESMBAGA1UEBwwJQ2xhcmVt\nb250MRAwDgYDVQQKDAdFbGl4eGlyMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEZMBcG\nA1UEAwwQZ2F0ZXdheS5jbWl4LnJpcDEfMB0GCSqGSIb3DQEJARYQYWRtaW5AZWxp\neHhpci5pbzAeFw0xOTA4MTYwMDQ3NTFaFw0yMDA4MTUwMDQ3NTFaMIGSMQswCQYD\nVQQGEwJVUzELMAkGA1UECAwCQ0ExEjAQBgNVBAcMCUNsYXJlbW9udDEQMA4GA1UE\nCgwHRWxpeHhpcjEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxGTAXBgNVBAMMEGdhdGV3\nYXkuY21peC5yaXAxHzAdBgkqhkiG9w0BCQEWEGFkbWluQGVsaXh4aXIuaW8wggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0/EYr1DxZ59vWcqLybsW1oIiT\nAeDu1wQDHLW1qhsvn3KS1DNbQaan0b0xrAZAai3vSrEe9YIq8q7ew7DwiJEUVGN6\n+mlZQ7mQrzjpuWXjW8jmX1OZEp9pPe7Ze+nH9wqyMAt2RN1zawwxlb/YNqeRxi+v\ndTJ4yWeWXrxlqhgXml5miSlMMxHU0XjcZjLfJPn0xo2oHow84vT4TBdT+pwCFoId\n8JlxRjvyr16rO9KkB9nlVsJ0ov+fjXAirdgoka4tKjIDiYofiCDuZfqFccPQkdB4\n0vuFNymEWET1WC0w6PNo5iilOggBDvYjFLXhwC+KOF1lJ5dA7uAPW3l9iLhioGkW\nZd78Q3EgXtK6Kge4dW3DvJVeWLdsJwEIJUuuhjF2bB9oknTocHPwt8jvDaExuOO/\n0Gits0TQdeNDBDMmSxZQ1DJZ+NIRUl2YLfySXfjaZSqL1u7V0EaDWxhxRWQgI6EB\n+QcSGvqrJ0/Y/S5+cRHU5rd2WORwTUOCzjeQvvQXIQabGr5dInfHEdcuKoTFYQ0H\nLa50zEIt94aE2n/Dp0nvVbai+XyGZiSHurKsx5NaY70E1j+XFbiuz0uD9SmqGfgQ\nhj5YG+ml08q7DM3ySP352bXcM5D3Y3voLxc+Sr0LjUHAIUddClI4CLC5l0oJZC6O\nEHhUroCSxk9ufRmXYQIDAQABo2kwZzAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\nBBRzwHeD/lxvYa6VAoZtm/LCYi8bujAfBgNVHSMEGDAWgBRzwHeD/lxvYa6VAoZt\nm/LCYi8bujAUBgNVHREEDTALgglmb28uY28udWswDQYJKoZIhvcNAQELBQADggIB\nAFLe9m8UrCgrRopBOsDTQrQUVpodG9ulfEHDZ3h+8y3rVth2O2/Cvfc11e5chXBW\n+YxItdmTFJJgOP/tdaUZUw43wv9ilNY/V9DfCOirYOi7+mD6hCtBakaxPz50vv3L\nGhfZM+esLhzEgU5xoaR5kdsjerqejBNUMdT8M3hGUhJeFQa0yx1sHGrqsU9i+JGc\nioamZM7zr5VP9uO7fOkA5wX8dCuvdgD1bTP4ISB1hdPAnoRiKTe8jaI/NraWwcFx\nSAznTpVxKwjzJ1cEytGLXw+3Sb1UeqTb4a8GLrMDofi/P7iUDLnvlFRMjRvFkoyH\nIn5pq/cWr0ezmEceOZ833aNWvSirKTJA0gJav+kp+tUPUIGjIATlJq1kaaIKMk4I\nSvwgsGkpHS1sO93R84NDqAb/Ob4mb/pc5n76nnSeUubyxxL8p7+N2+UBH1DStWuk\n/sj73bKVvHdsw57SVkG5TYrnt7hudVQBDi8jV3iXyS1b6YDxm1dKQCS2s7D0gynf\nxURNnrjaAVNjYcvfEGLAVZsOEU30YiiAVtotbbE8Wzvh3H2saj+oH/RLEQlYdG1B\nUgCXZutZon+z1HREUJ6A/VULgJFeyinJVvr8YiVblSJg6qmLvzVSu471ENSMGsNE\n9fjH7YYTYCmkZdkNXsipF/lxaJ5sPkKT8FaHRpR6N9Nj\n-----END CERTIFICATE-----\n"},{"Id":[200,43,213,232,11,4,43,121,126,227,145,167,225,172,1,39,137,105,111,232,83,218,195,186,203,60,99,122,182,145,162,189,1],"Address":"0.0.0.0:8400","Tls_certificate":"-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n"}],"Nodes":[{"Id":[80,88,123,40,173,239,204,78,152,58,208,191,117,100,128,180,222,99,203,138,138,126,236,35,255,230,36,22,15,229,159,206,2],"Address":"-----BEGIN CERTIFICATE-----\n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\nJd4xiuF9ZfCGdFcwN/NHm4NFn1aKBGJK/w==\n-----END CERTIFICATE-----\n","Tls_certificate":"127.0.0.1:57966"},{"Id":[119,202,117,27,100,163,223,134,153,205,212,237,214,173,127,236,24,192,194,144,189,255,197,189,165,121,229,68,140,42,188,246,2],"Address":"-----BEGIN CERTIFICATE-----\n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\ngYLhcEAL2qjMpku9ZGWLYhV63oGEbPU4+w==\n-----END CERTIFICATE-----\n","Tls_certificate":"127.0.0.1:57962"},{"Id":[200,43,213,232,11,4,43,121,126,227,145,167,225,172,1,39,137,105,111,232,83,218,195,186,203,60,99,122,182,145,162,189,2],"Address":"-----BEGIN CERTIFICATE-----\n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\nJBoJnTRJ5Q4FR9gYHFPsJUBS4V5B2Rs42Q==\n-----END CERTIFICATE-----\n","Tls_certificate":"127.0.0.1:57964"}],"Registration":{"Address":"0.0.0.0:18000","Tls_certificate":"-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n"},"Udb":{"Id":[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3]},"E2e":{"Prime":"E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D49413394C049B7A8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688B55B3DD2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E7861575E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC6ADC718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C4A530E8FFB1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F26E5785302BEDBCA23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE448EEF78E184C7242DD161C7738F32BF29A841698978825B4111B4BC3E1E198455095958333D776D8B2BEEED3A1A1A221A6E37E664A64B83981C46FFDDC1A45E3D5211AAF8BFBC072768C4F50D7D7803D2D4F278DE8014A47323631D7E064DE81C0C6BFA43EF0E6998860F1390B5D3FEACAF1696015CB79C3F9C2D93D961120CD0E5F12CBB687EAB045241F96789C38E89D796138E6319BE62E35D87B1048CA28BE389B575E994DCA755471584A09EC723742DC35873847AEF49F66E43873","Small_prime":"","Generator":"2"},"Cmix":{"Prime":"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF","Small_prime":"","Generator":"B22FDF91EE6BA01BDE4969C1A986EA1F81C4A1795921403F3437D681D05E95167C2F6414CCB74AC8D6B3BA8C0E85C7E4DEB0E8B5256D37BC5C21C8BE068F5342858AFF2FC7FF2644EBED8B10271941C74C86CCD71AA6D2D98E4C8C70875044900F842998037A7DFB9BC63BAF1BC2800E73AF9615E4F5B869D4C6DE6E5F48FACE9CA594CC5D228CB7F763A0AD6BF6ED78B27F902D9ADA38A1FCD7D09E398CE377BB15A459044D3B8541DC6D8049B66AE1662682254E69FAD31CA0016251D0522EF8FE587A3F6E3AB1E5F9D8C2998874ABAB205217E95B234A7D3E69713B884918ADB57360B5DE97336C7DC2EB8A3FEFB0C4290E7A92FF5758529AC45273135427"}}
diff --git a/localNetwork/permissioning-actual.yaml b/localNetwork/permissioning-actual.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a04f7f1bfa628a127575551c0ab94c34aff3395e
--- /dev/null
+++ b/localNetwork/permissioning-actual.yaml
@@ -0,0 +1,97 @@
+# ==================================
+# Permissioning Server Configuration
+# ==================================
+
+# Log message level
+logLevel: 1
+
+# Path to log file
+logPath: "results/permissioning.log"
+
+# The listening port of this server
+port: 18000
+
+# Database connection information
+dbUsername: ""
+dbPassword: ""
+dbName: ""
+dbAddress: "0.0.0.0:6969"
+
+# Minimum number of nodes to begin running rounds. this differs from the number of members
+# in a team because some scheduling algorithms may require multiple teams worth of nodes at minimum
+minimumNodes: 3
+
+# The minimum version required of gateways to connect
+minGatewayVersion: "3.0.0"
+
+# The minimum version required of servers to connect
+minServerVersion:  "3.0.0"
+
+# The minimum version required of a client to connect
+minClientVersion: "4.0.0"
+
+# Time interval (in seconds) between committing Node statistics to storage
+nodeMetricInterval: 3
+
+# For testing, use the sequence as the country code. Do not use the geobinning database
+disableGeoBinning: true
+
+# For testing, do not exclude node or gateway IPs which are local to the machine
+allowLocalIPs: true
+
+# Disable pruning of NDF for offline nodes
+# if set to false, network will sleep for five minutes on start
+disableNDFPruning: true
+permissiveIPChecking: true
+
+# How long rounds will be tracked by gateways. Rounds (and messages as an extension)
+# prior to this period are not guaranteed to be delivered to clients.
+# Expects duration in"h". (Defaults to 1 weeks (168 hours)
+messageRetentionLimit: "168h"
+
+# "Location of the user discovery contact file.
+udContactPath: "results/udbContact.bin"
+udbAddress: "127.0.0.1:18001"
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the UDB certificate file
+udbCertPath: "../keys/cmix.rip.crt"
+
+# Path to the file containing the round ID
+roundIdPath: "results/roundId.txt"
+
+# Path to the file containing the update ID
+updateIdPath: "results/updateId.txt"
+
+# Path to whitelisted IPs for client ratelimiting
+whitelistedIpAddressesPath: "whitelist.txt"
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the private key file
+keyPath: "../keys/cmix.rip.key"
+# Path to the certificate file
+certPath: "../keys/cmix.rip.crt"
+
+# Path to the node topology permissioning info
+ndfOutputPath: "ndf.json"
+# Time interval (in minutes) in which the database is
+# checked for banned nodes
+BanTrackerInterval: "3"
+
+groups:
+  cmix:
+    prime: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF"
+    generator: "2"
+  e2e:
+    prime: "E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D49413394C049B7A8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688B55B3DD2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E7861575E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC6ADC718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C4A530E8FFB1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F26E5785302BEDBCA23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE448EEF78E184C7242DD161C7738F32BF29A841698978825B4111B4BC3E1E198455095958333D776D8B2BEEED3A1A1A221A6E37E664A64B83981C46FFDDC1A45E3D5211AAF8BFBC072768C4F50D7D7803D2D4F278DE8014A47323631D7E064DE81C0C6BFA43EF0E6998860F1390B5D3FEACAF1696015CB79C3F9C2D93D961120CD0E5F12CBB687EAB045241F96789C38E89D796138E6319BE62E35D87B1048CA28BE389B575E994DCA755471584A09EC723742DC35873847AEF49F66E43873"
+    generator: "2"
+
+# Path to file with config for scheduling algorithem within the user directory
+schedulingConfigPath: "registration.json"
+
+# Path to JSON file with list of Node registration codes (in order of network
+# placement)
+RegCodesFilePath: "regCodes.json"
+
+# Set address space size for ephemeral IDs
+addressSpace: 32
+
diff --git a/localNetwork/permissioning.yaml b/localNetwork/permissioning.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5c3a331db7fe2428879313915d087978703bd0b0
--- /dev/null
+++ b/localNetwork/permissioning.yaml
@@ -0,0 +1,97 @@
+# ==================================
+# Permissioning Server Configuration
+# ==================================
+
+# Log message level
+loglevel: 0
+# Path to log file
+logPath: "results/registration.log"
+
+# The listening port of this  server
+port: 11420
+
+# Database connection information
+dbUsername: ""
+dbPassword: ""
+dbName: ""
+dbAddress: "0.0.0.0:6969"
+
+# Minimum number of nodes to begin running rounds. this differs from the number of members
+# in a team because some scheduling algorithms may require multiple teams worth of nodes at minimum
+minimumNodes: 3
+
+# The minimum version required of gateways to connect
+minGatewayVersion: "3.0.0"
+
+# The minimum version required of servers to connect
+minServerVersion:  "3.0.0"
+
+# The minimum version required of a client to connect
+minClientVersion: "4.0.0"
+
+# Time interval (in seconds) between committing Node statistics to storage
+nodeMetricInterval: 3
+
+# For testing, use the sequence as the country code. Do not use the geobinning database
+disableGeoBinning: true
+
+# For testing, do not exclude node or gateway IPs which are local to the machine
+allowLocalIPs: true
+
+# Disable pruning of NDF for offline nodes
+# if set to false, network will sleep for five minutes on start
+disableNDFPruning: true
+permissiveIPChecking: true
+
+# How long rounds will be tracked by gateways. Rounds (and messages as an extension)
+# prior to this period are not guaranteed to be delivered to clients.
+# Expects duration in"h". (Defaults to 1 weeks (168 hours)
+messageRetentionLimit: "168h"
+
+# "Location of the user discovery contact file.
+udContactPath: "results/udbContact.bin"
+udbAddress: "127.0.0.1:18001"
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the UDB certificate file
+udbCertPath: "../keys/cmix.rip.crt"
+
+# Path to the file containing the round ID
+roundIdPath: "results/roundId.txt"
+
+# Path to the file containing the update ID
+updateIdPath: "results/updateId.txt"
+
+# Path to whitelisted IPs for client ratelimiting
+whitelistedIpAddressesPath: "whitelist.txt"
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the private key file
+keyPath: "../keys/cmix.rip.key"
+# Path to the certificate file
+certPath: "../keys/cmix.rip.crt"
+
+# Path to the node topology permissioning info
+ndfOutputPath: "ndf.json"
+# Time interval (in minutes) in which the database is
+# checked for banned nodes
+BanTrackerInterval: "3"
+
+# E2E/CMIX Primes
+groups:
+  cmix:
+    prime: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF"
+    generator: "2"
+  e2e:
+    prime: "E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D49413394C049B7A8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688B55B3DD2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E7861575E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC6ADC718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C4A530E8FFB1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F26E5785302BEDBCA23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE448EEF78E184C7242DD161C7738F32BF29A841698978825B4111B4BC3E1E198455095958333D776D8B2BEEED3A1A1A221A6E37E664A64B83981C46FFDDC1A45E3D5211AAF8BFBC072768C4F50D7D7803D2D4F278DE8014A47323631D7E064DE81C0C6BFA43EF0E6998860F1390B5D3FEACAF1696015CB79C3F9C2D93D961120CD0E5F12CBB687EAB045241F96789C38E89D796138E6319BE62E35D87B1048CA28BE389B575E994DCA755471584A09EC723742DC35873847AEF49F66E43873"
+    generator: "2"
+
+# Path to file with config for scheduling algorithm within the user directory
+schedulingConfigPath: "registration.json"
+
+# Path to JSON file with list of Node registration codes (in order of network
+# placement)
+RegCodesFilePath: "regCodes.json"
+
+# Set address space size for ephemeral IDs
+addressSpace: 32
+
diff --git a/localNetwork/regCodes.json b/localNetwork/regCodes.json
new file mode 100644
index 0000000000000000000000000000000000000000..e1638bb8dff0ecc51313febdf1fc5805e4506718
--- /dev/null
+++ b/localNetwork/regCodes.json
@@ -0,0 +1 @@
+[{"RegCode": "wksc", "Order": "CR"},{"RegCode": "uvdt", "Order": "GB"},{"RegCode": "npdd", "Order": "SK"}]
\ No newline at end of file
diff --git a/localNetwork/registration.json b/localNetwork/registration.json
new file mode 100644
index 0000000000000000000000000000000000000000..0d1ae5775356c40dfd400b5578091346c17b2dce
--- /dev/null
+++ b/localNetwork/registration.json
@@ -0,0 +1,12 @@
+{
+    "TeamSize": 3,
+  "BatchSize": 32,
+  "MinimumDelay": 60,
+  "RealtimeDelay": 120,
+  "SemiOptimalOrdering": true,
+  "Threshold":     0.3,
+  "NodeCleanUpInterval": 3,
+  "ResourceQueueTimeout": 300000
+
+
+}
\ No newline at end of file
diff --git a/localNetwork/run.sh b/localNetwork/run.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a41f2f4b8bb1bab27dd4b7a4e235c901ffd48b0b
--- /dev/null
+++ b/localNetwork/run.sh
@@ -0,0 +1,127 @@
+#!/usr/bin/env bash
+
+set -e
+
+# Clear out the previous run's logs
+rm gateway*-knownRound || true
+rm errServer-* || true
+rm *.log || true
+rm roundId.txt || true
+rm *-knownRound || true
+rm updateId* || true
+rm lastupdateid* || true
+rm -r udbsession || true
+rm -fr results || true
+# Globals
+SERVERLOGS=results/servers
+GATEWAYLOGS=results/gateways
+CLIENTOUT=results/clients
+DUMMYOUT=results/dummy-console.txt
+UDBOUT=results/udb-console.txt
+mkdir -p $SERVERLOGS
+mkdir -p $GATEWAYLOGS
+
+## Uncomment to allow for verbose gRPC logs
+#export GRPC_GO_LOG_VERBOSITY_LEVEL=99
+#export GRPC_GO_LOG_SEVERITY_LEVEL=info
+
+
+nodes=$(ls -1q ./server-*.yaml | wc -l | xargs)
+
+BIN_PATH="../bin"
+CONFIG_PATH="$(pwd)"
+
+# Execute finish function on exit
+trap finish EXIT
+trap finish INT
+
+echo "STARTING SERVERS..."
+
+# Copy udbContact into place when running locally.
+cp udbContact.bin results/udbContact.bin
+
+# Run Permissioning
+"$BIN_PATH"/permissioning \
+--logLevel 2 -c "$CONFIG_PATH/permissioning-actual.yaml" &> results/registration_err.log &
+
+echo "Permissioning: " $!
+
+# Run Client Registrar
+"$BIN_PATH"/client-registrar \
+-l 2 -c "$CONFIG_PATH/client-registrar.yaml" &> results/clientRegistrar_err.log &
+
+echo "Client Registrar: " $!
+
+# Run server
+for i in $(seq $nodes $END); do
+    x=$(($i - 1))
+    "$BIN_PATH"/server \
+    -l 2 --config "$CONFIG_PATH/server-$x.yaml" &> $SERVERLOGS/server$x\_err.log &
+
+    echo "Server $x: " $!
+done
+
+# Run Gateway
+for i in $(seq $nodes $END); do
+    x=$(($i - 1))
+    "$BIN_PATH"/gateway \
+    --logLevel 2 --config "$CONFIG_PATH/gateway-$x.yaml" &> $GATEWAYLOGS/gw$x\_err.log &
+    PIDVAL=$!
+    echo "Gateway $x -- $PIDVAL"
+
+done
+
+# Pipe child PIDs into file
+jobs -p > results/serverpids
+finish() {
+    # Read in and kill all child PIDs
+    # NOTE: jobs -p doesn't work in a signal handler
+    echo "STOPPING SERVERS AND GATEWAYS..."
+    for job in $(cat results/serverpids)
+    do
+        echo "KILLING $job"
+        kill $job || true
+    done
+    sleep 5
+
+    for job in $(cat results/serverpids)
+    do
+        echo "KILL -9 $job"
+        kill -9 $job || true
+    done
+    set +x
+}
+
+echo "You can't use the network until rounds run."
+echo "If it doesn't happen after 1 minute, please Ctrl+C"
+echo "and review logs for what went wrong."
+rm rid.txt || true
+touch rid.txt
+echo -n "Waiting for rounds to run..."
+cnt=0
+while [ ! -s rid.txt ] && [ $cnt -lt 240 ]; do
+    sleep 1
+    grep -a "RID 1 ReceiveFinishRealtime END" results/servers/*.log > rid.txt || true
+    cnt=$(($cnt + 1))
+    echo -n "."
+done
+
+# Run UDB
+# Start a user discovery bot server
+echo "STARTING UDB..."
+UDBCMD="../bin/udb --logLevel 3 --config udb.yaml -l 1  --protoUserPath	udbProto.json"
+$UDBCMD >> $UDBOUT 2>&1 &
+echo "UDB: " $!
+echo $! >> results/serverpids
+
+echo "\nNetwork rounds have run. You may now attempt to connect."
+
+
+sleep 4
+
+
+
+
+
+# Wait until user input to exit
+read -p 'Press enter to exit...'
diff --git a/localNetwork/runpublic.sh b/localNetwork/runpublic.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0c0bff3c28e77c50377502cdf89c164b3470fb31
--- /dev/null
+++ b/localNetwork/runpublic.sh
@@ -0,0 +1,31 @@
+# Grab the IP of the NIC inside of our machine so we can 'sed' it into the
+# config files
+if [[ "$OSTYPE" == "linux-gnu"* ]]; then
+    # Linux
+    export IP=$(netstat -nr | grep default | grep -v tun | awk '{print $2}')
+elif [[ "$OSTYPE" == "darwin"* ]]; then
+    # macOS/iOS/watchOS/tvOS/iPadOS/some Darwin distros
+    export IP=$(ipconfig getifaddr $(netstat -nr | grep default | head -1 | awk '{print $4}'))
+else
+    # Unknown.
+    echo I don\'t know how to get an IP from your OS!
+    exit
+fi
+
+# Backup the configs to a folder labelled after the epoch, so an alphabetical
+# sort will sort the oldest to newest. Your oldest backup is probably the
+# original files, but I would suggest trying "git reset --hard" instead if you
+# just want to revert your configs.
+mkdir -p configbackups
+cp -r configurations configbackups/$(date +%s)
+
+# Replace local IPs with the IP our NIC has in all config files
+sed -i '.bak' "s/127\.0\.0\.1/$IP/g" configurations/*
+sed -i '.bak' "s/0\.0\.0\.0/$IP/g" configurations/*
+# Since we back the files up into configbackups, this is only clutter after
+# the sed commands finish. We can clean it up.
+rm configurations/*.bak
+
+# Run the localenvironment
+echo "Preparing to run on $IP ..."
+./run.sh
diff --git a/localNetwork/server-0.yaml b/localNetwork/server-0.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c2fb5626239ba47b83735bd49ff3078fd078a8cf
--- /dev/null
+++ b/localNetwork/server-0.yaml
@@ -0,0 +1,45 @@
+# START YAML ===
+# registration code used for first time registration. Unique. Provided by xx network
+registrationCode: "wksc"
+useGPU: false
+devMode: true
+rawPermAddr: true
+cmix:
+  paths:
+    # Path where the ID will be stored after the ID is created on first run
+    # used by the wrapper script
+    idf: "results/servers/nodeID-0.json"
+    # Path to the self signed TLS cert that the node uses for identification
+    cert: "../keys/cmix.rip.crt"
+    # Path to the private key for the self signed TLS cert
+    key:  "../keys/cmix.rip.key"
+    # Path to where the log will be stored
+    log:  "results/servers/server-0.log"
+    #
+    ipListOutput: "results/servers/ipList-0.txt"
+    # Path where an error file will be placed in the event of a fatal error
+    # used by the wrapper script
+    errOutput: "results/servers/errServer-0.txt"
+  # port the node will communicate on
+  port: 11200
+  overridePublicIP: "0.0.0.0"
+database:
+  name: "cmix_server"
+  username: "cmix"
+  password: ""
+  address: ""
+gateway:
+  paths:
+    # Path to the self signed TLS cert used by the gateway
+    cert: "../keys/cmix.rip.crt"
+scheduling:
+  paths:
+    # Path to the self signed TLS cert used by the permissioning. Provided by xx network
+    cert: "../keys/cmix.rip.crt"
+  # IP Address of the permissioning server, provided by xx network
+  address: "0.0.0.0:18000"
+metrics:
+  # location of stored metrics data. Modification to set to permissioning
+  # server instead of saving will be made at a later date
+  log:  "results/servers/metrics-server-0.log"
+# === END YAML
diff --git a/localNetwork/server-1.yaml b/localNetwork/server-1.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f5881f4c39c8cd915a9ee808e1d0a261722a8ec9
--- /dev/null
+++ b/localNetwork/server-1.yaml
@@ -0,0 +1,45 @@
+# START YAML ===
+# registration code used for first time registration. Unique. Provided by xx network
+registrationCode: "uvdt"
+useGPU: false
+devMode: true
+rawPermAddr: true
+cmix:
+  paths:
+    # Path where the ID will be stored after the ID is created on first run
+    # used by the wrapper script
+    idf: "results/servers/nodeID-1.json"
+    # Path to the self signed TLS cert that the node uses for identification
+    cert: "../keys/cmix.rip.crt"
+    # Path to the private key for the self signed TLS cert
+    key:  "../keys/cmix.rip.key"
+    # Path to where the log will be stored
+    log:  "results/servers/server-1.log"
+    #
+    ipListOutput: "results/servers/ipList-1.txt"
+    # Path where an error file will be placed in the event of a fatal error
+    # used by the wrapper script
+    errOutput: "results/servers/errServer-1.txt"
+  # port the node will communicate on
+  port: 11201
+  overridePublicIP: "0.0.0.0"
+database:
+  name: "cmix_server"
+  username: "cmix"
+  password: ""
+  address: ""
+gateway:
+  paths:
+    # Path to the self signed TLS cert used by the gateway
+    cert: "../keys/cmix.rip.crt"
+scheduling:
+  paths:
+    # Path to the self signed TLS cert used by the permissioning. Provided by xx network
+    cert: "../keys/cmix.rip.crt"
+  # IP Address of the permissioning server, provided by xx network
+  address: "0.0.0.0:18000"
+metrics:
+  # location of stored metrics data. Modification to set to permissioning
+  # server instead of saving will be made at a later date
+  log:  "results/servers/metrics-server-1.log"
+# === END YAML
diff --git a/localNetwork/server-2.yaml b/localNetwork/server-2.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..eb105689d980498455b6c79514dddbbb311f58e3
--- /dev/null
+++ b/localNetwork/server-2.yaml
@@ -0,0 +1,45 @@
+# START YAML ===
+# registration code used for first time registration. Unique. Provided by xx network
+registrationCode: "npdd"
+useGPU: false
+devMode: true
+rawPermAddr: true
+cmix:
+  paths:
+    # Path where the ID will be stored after the ID is created on first run
+    # used by the wrapper script
+    idf: "results/servers/nodeID-2.json"
+    # Path to the self signed TLS cert that the node uses for identification
+    cert: "../keys/cmix.rip.crt"
+    # Path to the private key for the self signed TLS cert
+    key:  "../keys/cmix.rip.key"
+    # Path to where the log will be stored
+    log:  "results/servers/server-2.log"
+    #
+    ipListOutput: "results/servers/ipList-2.txt"
+    # Path where an error file will be placed in the event of a fatal error
+    # used by the wrapper script
+    errOutput: "results/servers/errServer-2.txt"
+  # port the node will communicate on
+  port: 11202
+  overridePublicIP: "0.0.0.0"
+database:
+  name: "cmix_server"
+  username: "cmix"
+  password: ""
+  address: ""
+gateway:
+  paths:
+    # Path to the self signed TLS cert used by the gateway
+    cert: "../keys/cmix.rip.crt"
+scheduling:
+  paths:
+    # Path to the self signed TLS cert used by the permissioning. Provided by xx network
+    cert: "../keys/cmix.rip.crt"
+  # IP Address of the permissioning server, provided by xx network
+  address: "0.0.0.0:18000"
+metrics:
+  # location of stored metrics data. Modification to set to permissioning
+  # server instead of saving will be made at a later date
+  log:  "results/servers/metrics-server-2.log"
+# === END YAML
diff --git a/localNetwork/udb.yaml b/localNetwork/udb.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..14b3ed1ed5398db64c1d56f33d99f499c898ca03
--- /dev/null
+++ b/localNetwork/udb.yaml
@@ -0,0 +1,10 @@
+# UDB Config for E2E Integration test
+log: "./results/udb.log"
+sessionPath: "./results/udbsession"
+sessionPass: "hello"
+certPath: "../keys/cmix.rip.crt"
+port: "18001"
+keyPath: "../keys/cmix.rip.key"
+permCertPath: "../keys/cmix.rip.crt"
+permAddress: "0.0.0.0:18000"
+devMode: true
\ No newline at end of file
diff --git a/localNetwork/udbContact.bin b/localNetwork/udbContact.bin
new file mode 100644
index 0000000000000000000000000000000000000000..10b08460a8ec87eaa6474298845d1deaa9482a5c
--- /dev/null
+++ b/localNetwork/udbContact.bin
@@ -0,0 +1 @@
+<xxc(2)uu49Kr9myQUG0gG8VKwalxmem65pfPu4D2Lk1u8pi/UDrgZ7Ugdw/BAr6QTgt3dDqBSTfbLpgWOpOQvmR1bACzi52YiM90WbtsF4Iy5RZ64mRVbzN+erifSAaH8JAWSoK23KmMJH9F/HqBBwMjWJmpmkpxR0wo4bHDoBnHulqnBf/WxsHBeLk6HRbWqXWljV3LnO0ugSZDxa3cNu8mjfMNnxgoQr3JWY/bgiAHUGvUSHGxfMgmRvbxuFe3TRO9ZNVGhIC291GsvA+6kKnIjC2NuHu+UZ5Gmk86fw/1kbVK6lxFZsWN7dDgDrodUMc0Bnq2fQ+pmwP26x2Wj5tUHUKK+VHqmY+DGHg/RObjpgnr1qctl3/+gpL83Q3TyWwAjH/73tVww/M6lDnFYxAb62k0NYtVKZVFPDqrocFyAlDXaReg1it9VNJSPYiUM4TCimMmtYL6AgcXdMeD5E7UX1vsvmA5Ll9jZNOmoyPWLYt5W9Gvl79Xqgzqlf0t1DxR4ZmFtG/NwH3S1gCARcIlYgCb66j2gifEMH7aAQWyW8YLm2hEZmwLxISnIPjEL3gIOzNHtmGGXN23jUIwAAAgA790tNCG8KTm8tuEBiH/sjKg==xxc>
\ No newline at end of file
diff --git a/localNetwork/udbProto.json b/localNetwork/udbProto.json
new file mode 100644
index 0000000000000000000000000000000000000000..940cadfe9b1bb56946fd38a8c677207245add9e3
--- /dev/null
+++ b/localNetwork/udbProto.json
@@ -0,0 +1 @@
+{"TransmissionID":"MhaUvxgJp0REgqp/FNes3ddICg1vKmIIUr+hABI9PXgD","TransmissionSalt":"aUdWmk0Dtu8YZ9N4fUCl80QAmCZ+eY96BDTAN9//9kI=","TransmissionRSA":{"N":744095517605335188486192402593567285818149781037814392671915097997165799160704009076529206117565015316892087089782583938102479243183663906078668582528984516276493241709164519970005583971481012694667579696383360567823504989650655410246207331522294633002054530951336779742521949130565223443549835766371552961634577790108359687869697030104209247319401651289712207512551543251668177804743453344668589351336794674335174328494860289416890175422687829958938924106165398205285038813958087994742173028066268997679203164659373760933342345626244738488110458781897756397149360694648367300111068967014678500898983090333707836644483738687322761365319344259236535454689996343110842585871572930571278463402471136616034421156328875234527272277980275379473515969296415235308154781609704415193243251254222667078013823356321213274280009612841451973719445431427792198300346805888677562529255025870805189890421627704987545754460307965087998094692006804411392783507966480991167024256590215549839475685306270811326657913050667578064503246626321836700579972796860953792588080819942544062977767967992236600692121009380090485897336412623665757415839315721348591326702012914394412545952829437103713850347584948953528257126120160975904938795178616150713777831589,"E":65537,"D":702540524327712978286466077105790056678969955922255232545891489063744574128612569535199928085456619203859372153966109927796010011603759273638246729040785738035622202988204724082335711421080162694477101925219543187134214539033120295707837878642675511638740378895522619590888057835298904908929813505588790799198357720349344223969868061274671644969751681902643121660346855086187525184614960443841773399647021439245580083376969805274103382587388114414289085660271241356003819929067314812253558149711712876228635033944612512096562618373058664318305855593748378360108198295661336701847393296488506669516858822963804260311691759542739227343536282374650987690037136673732778544975139599300829103845745104309687652878356279709829981494578600603924386279381105751731671579921080691074783353253958778076575957155595416051906390745893233111609000272562409467803170191115741547810223834894875859746256757717726366292758015729401293357270389003259918967902654657293283011346796119435418406947470723708887763547764820828540891209479365431423513260945988353481802346962185241475598840911175187647890159503133204568937310632267175230680232531126383217383814916312952923810037599497876585604599444464808553067231902765607317662766023981051800036686273,"Primes":[26431524235468771028852443590104055376636364921067197450041684258482439988835561020261125258562308094700689754910670346007026107201010688328852518422104352082149765577020457481232265846864075786524112374194109435619505107638299597352847727718122930754740563865787954820820245269180427904294490102595163613363903301612449832540143489589841021282833070290450230168473246516211511298499533872232550844877914066189330777819461606196011609435557144318950621971682270122109937087991576359208132704648705570764167630153594184009208403478937807655656357669009470285691425163502536227383519714393737089527860969984842067786101,28151820189273258942344071129053694480161436139819710188331124791415914831471008775403858034120373831438530464789505032183420165894885328994613924494905439083295166072103442061113078040409562754110291758200572034754286027961921301572668934253552291343681689448082037497152344335274886686268374921532985704635156460979764429070570728443686028271768081803840073189209047377853848238258439123998890243019814395279696459993201039305339332983028931741597790390904270131316198444444886804187393230626448411790408221074812330007942755799986304653723364502190308487509016389841021566288050103973334556368552133193493944408689],"Precomputed":{"Dp":275861918871181765777119358768805009042514512504538856765315959424477607341860685381671569904887601458340659358208317693345833000068530918670905329824669680092015802595205653556965833639852721943062588521732316919659756986505285939077892576089782636316013025988357127995499454722056436616528544641577916467658114626896496413590157420685280964301964082558981299651123802082620103577729849834552463156636605601011676641111307179731631610447855207198410446444461491425045347943699562532590182186851925025599137266354249078570861467256564390137921306217899471678791138011134699170397294423689155274685397614624288178673,"Dq":20251853375093108718674238635432892563921007495734318881533472838489627548476924176040866851955981272517828971313395551327029420652154717499734014133036480629583806088703921134828221879139253331786377393413250059516388743370809492102858684015410780592477790114275535038844384485571048533054744709867618963802570860877854857148803386838061270563205181572605460893517398533291080291147479606024866554731101049481309326072897084076010928068387048779916221764340337818499984617266561381665606317822215493877818423040314663633588189342602717841897580646356474723470712524458623415234392941421286158880506566848352312481377,"Qinv":1782249293930479585148549445278205034617546516712012566064256819261113180298258405511667713490475276726336613818509018461173201977639000556416891523605685233456051292911470649097170785609362912595510275601045219404262259673943809118153699614833210258102652927663612925023313592281316017977621743103307097046836057862305643762370317914029974246165942098634086048350280652529323604758408742898452312792547897909618079071765102987807077305433629474092046709583007609210604882495077254479038254736382806594706188378137791260031991135639188023310238199612626314094372849297487936335153146414944425343861682455207985266708,"CRTValues":null}},"ReceptionID":"uu49Kr9myQUG0gG8VKwalxmem65pfPu4D2Lk1u8pi/UD","ReceptionSalt":"M8xD+2gHGbqwKPwHFxs7+IjutQYuyBUkX2H257o5BdU=","ReceptionRSA":{"N":850387188153991188889446100749739241848829271482462061108409439312531431988795734813327514693008344548532502397064837726907012068926804456615485530991075075479632026273101933309061970039508777559060326644210787796911046233949155489473727669005294322689793791335544727360305644959942063168476363583581030898050353126928764965273874658694962134566452334451854924568242626514389265043292391299760010067072010852660228863317130740474026897759770820934809759670185849936472580423333979237659958984231856174610567212253308506984182380860548206401655999782332308043025450559980137052816211530713615583429240205892728859426128000967414395838939110894033790769681039750313146913688429864118346214901692066118374534016813397369786419474818398950057293996832967235881835337432259690040386208608584839830051784956186429114899224875646403109211367267143599678019107255952565689487312514740269900292167402469336239686704437448306260169629496444993371773823439258565787685710030837201534059640894021404396138451751712905956843779570695671045422782022593718074598748351627333401529057059641321731684199811309173775075814578877100319468485440759413419208114295109676086784903373038008038594143762297734223790838124082684159063469085109435783518725031,"E":65537,"D":564922212042972891506779603709986684962272914422874876092540423872769289935398323184885484645154711027502930510414145293747815500326018670791589385580030144211006599750553715770887147559547944650942359905229184557030627277529401445675232029624235148495438489607025204008203409747486116303247866721674280821649117660056115481226310038842219913218786872835656314004723732098768107056926939591645201310559136617365280437344369150983684163873340894930173985790635539446178597340291613196667556255191759193646646393943456253239701974694076434107586512390304739235381525566166520085882164295171867519962140940902875266686494581933486332733070115573951932064475826442525759304559384157338056633545437785084083189928354125207030609304055082642325819334882909664939190272656190536034921638933681026317152328190142016810293928283213410554345222497221023348512487512997673475708771529517243600219742073183452616019438402558324904073954972062329692828835961585134598049832023174978649417520451705037067815379933732830551892585260348438752787466224668527842810502446714266623795601014094978116799695556231619140778349831856996205593248896859777976571100881350185386707051672977669257878795867903988402998091514995549897864288962757393054768438537,"Primes":[29492971595987200184565588575492524180677323915637743461334512913337954089756992535478030745356298455923396638365524831317118482754099964262507886663300281433334915984551779676428190574578201359535331987821184071989738056990202803783701055959370528270478305175226218851763791555786561228871062383690072445559534386478623474224364245986294525688152961853703225064960942669169364540334937714823971415905428637789133243443480147178878208486722743719938775945712937478778805521783173263515825112840086735855547887576584469859603118910509756820711149404941056507505214523564857945496996487150674719706390219045171074335669,28833553966793039902622472693344948085468484145845354555175845509525852913656457209339298633228826325187527465622133573224700820135296269687184379379824668957542611483930310268532473436266625079565533379890421336412596736616538404624204368463036294562591617517553183068875112160214949467183247851787117317409259574446000362822944034217039330133706829603389396809485151845126091352794981119059018300220209826040784745553271153888708759107151118112035826198322288728622562498893857193711017030398086686353945134010647373894524028231986696810322055915091233789726845203397655178875279735934668248673328323303568542440299],"Precomputed":{"Dp":22035237410890233868459863048338975639819722683815281575052938413439628332162765147926847055043275613688284730725665248110879449899362264829236899315936009893392193130347405158251161198776593825925012295095354961090338647794761436856568384348544759704654930999358405268422632307384972924785564942206454328040993656009976019887941091363945732186709946704404815833892496723925079492767447780739975286934240402358132188919389129905454498658046281432577050584888444445861180895892596225766397251174372446422126467723384631073675430939059008540612500276377295754916960329986927526454681065555835446395523094977597412985733,"Dq":16841607730729779627880254737037774275779080108991259477426970506807599516834294855936468737964805708655851677434354230175954764404521738920387232291067463077265226781891943132572792211121754246391635530802528781571848010706640373056663308127699305062117691053480260736325118535987736173516864180026715457076559142313393867416303731172135824915975669274116088772252187506773681691029370847575861277330815144740242001614038173411351927897550159472187183222786780178092858880596561535853910492143960790906343282877269046075993405262988094570992390564561887627916194430414303984731460217763692273970657921724531238912593,"Qinv":13386450555509069245317666985331292478728039484440837065189457918756926085772889573452664818969207436096145088071795396654392004940595219762405312750934346518716740936238520072004578261328949676162223098531690599793600587771458065485838287464893640290027597304483114889945915722313306140200593797334834667938307085618314432134506785949791967130287157125647210497214516165218726084383497011560605024384546734297139331536623591040849235382041138776467271730696249828686335872619825082175542573979118200539219034800857165800266206532665733326893998872307865475986277696080650713536968589910998008126592314634991854532329,"CRTValues":null}},"Precanned":false,"RegistrationTimestamp":1640900456461843040,"RegCode":"","TransmissionRegValidationSig":"Zln6nmiiuvO2vZGe4jMrHyEWyd3j89GYUjnugb88V+1Q/mdn9BFV/qmiBpnoNyqAn5XOpHmkYOw0DkBX2Tc3w5NQWHiLgcrAMHlZUkinFZ2/jWeLNGuWTFmauu2q+z1C4R/reAjlRiyo2OuKBZxFoE3mbw85mWYoiyyMbEfyNCHK2ScCmdapHP5kSzWeUi2WjaNi+LUBqmWMLX9nWZs24YD6VapNnStcj7w14XTWtUJ/oXtgwI/uMDa3ZvLwCO6JwsRR3VGq98Dbky4eJhXwCnFTW/Jy/ZR5n3xPccU3Eb+/0eHyYwZGORe0Tr7qGq0YI9wFNfjv3rpEmqqScq9sHg==","ReceptionRegValidationSig":"ABBNeRb2gEVIi/LU3c4rwTxauQpJ0PV0Dp78JT3QGXyoThMjDIgpCZHZRr8clexXkDSNZ0GZCKLQtv48e2TJbO15oodzKZq9fS6HPNc/D2l17DBbNCFTy+kM7MKIqHU4dN2h/fhjYgQ0k3WaR04NGSFtX4FSyeDqh8LbQAlrvKn13Z1fCId6kt9Sp3GTWtRMm2RD3hRNYLzrFHqAiH/rDcMy/d4Ar9wTwKlIcFyX3+1ENjAxTcsnjno7+aa5tT8XI0HdlcvrMDkx+m2kbHquqGJM9hCg/XxhrLFqsjY0F0bVp7J2UeHoLw6s6OgEl9Eg5I0k51K+SSMa1Mse1zggkg==","CmixDhPrivateKey":{"Value":23134336198863750741748703660400387868824411194091704843877765878704684400020511760943730932032181255742725205976185967794840498055119688330124475657025083380879051516507316264855378759159543513707252259922784173347685874456358247463151784175729466898154272096842618045994973870223785531415217217965394756900460790339174016946558150507580144972427210564566872862707000226886100833409714665643615263325876515987666291734559374206190550344559412403144311029314745799204676946278572048079685978558133653417488694953610922501137922416052437955367323383147526279158425720871674296239641638893436600760625905793653337291326,"Fingerprint":1019130854791890857},"CmixDhPublicKey":{"Value":40661473203398365346021139834751279657661515042218153062933068745659041507124553367048607412838109996778705972152516147090017024944177990861357148498071195775787956973205443551118903422765769934453067811496751124796541305224646917714432655244199681118218184307551604728113020909007420531039281826284338933975869040846161322930224431922676228280139352116332784218225442881629816602619617561152949947075502732590198688997850331029595028876889786739167152345971604837504050490241011792155573239919262293917635508122225378077992880296300468988471302542680432268331360185693269950450132051419581315000110594207999508607050616011689445128093546507459669376840509120845943383094511932011628510767784841945662325523012877900497552502527594150800481434891933803449151469858078545202819003974303280259033864766743161709598642156724209578764288690522108924880552091308234645729967740909969025514152089886697815454891469560150611996697804062619010044123824507982370347027313396405015494843434897303661589566168416699605512854149233601685403032629550047093556970695648101495563847168540708660964238960062140890332386702253196064038177801032833477139196626595095716721717130200091320630907308046939829403546847081437153253274137106108481349472925,"Fingerprint":1019130854791890857},"E2eDhPrivateKey":{"Value":15868054927490624034769207675284372396111367138702747294809526549406434197505594302868553416930040949078939726209524016245099170354423124146109791439676150153811847753697222698706991672115541614080484720172498069738416608757527621565114235134343850506971256805006649306801742780960331446133932778313421336826492419515327757859355790985926801091202339643161980910811435573134233363961673385626782920679443568800015505367010870530111147205683029126252427303195582360585233280495455148410685790997024364716148825012857917467229638326785383545555885827743352446807694303549475074691875396849487056555719913457474008032697,"Fingerprint":16801541511233098363},"E2eDhPublicKey":{"Value":147139791407699234997192910595075527435460061524772944343748681206265869846642332345707990677406040145177534321538182440717890359993428686109525202118205223891431899168261959123977071363023161983520620405235747590084693661804115691677488049367521195795602971625363864492999496527190606383593289607097185210792999982667279095678826515909506042508081456493456997354040504436530126940434391612132572210469911068602346111602950742796752446044197938946885845119733654743975968520762482827365434031479613917149883640347855512864879556669871625702373555191119636414088476652878563700716501799409607427689929171266147047756204689439519092680494886131474665331718064247744119146288064620933248987203778241513546175445638858254194548267620960510274776658377038971793051901595492445943697519511203993381901627766295075444537422179881027670118336783809271801530698319821686375879565780071214330909899155111647279589474822393047955732167728825532445888096165721311471522851,"Fingerprint":16801541511233098363}}
\ No newline at end of file
diff --git a/localNetwork/whitelist.txt b/localNetwork/whitelist.txt
new file mode 100644
index 0000000000000000000000000000000000000000..446eca0cad0a5393cf757e761a7c33576aab024d
--- /dev/null
+++ b/localNetwork/whitelist.txt
@@ -0,0 +1 @@
+["0.0.0.0", "127.0.0.1"]
\ No newline at end of file
diff --git a/smokeinfra/gateway-1.yaml b/smokeinfra/gateway-1.yaml
index a305d5a2c3531830889df454ee51952897cef30d..94f19980b90db309fe08847236291201ee33430a 100644
--- a/smokeinfra/gateway-1.yaml
+++ b/smokeinfra/gateway-1.yaml
@@ -40,8 +40,6 @@ schedulingCertPath: "../keys/cmix.rip.crt"
 # Path to the certificate file
 cmixCertPath: "../keys/cmix.rip.crt"
 
-knownRoundsPath: "results/gateways/knownrounds-1.json"
-lastUpdateIdPath: "results/gateways/lastupdateid-1.txt"
 devMode: true
 
 
diff --git a/smokeinfra/gateway-2.yaml b/smokeinfra/gateway-2.yaml
index 55d7de5a5b8494d2530cdebac790fec0a4a2da58..4e3ae92fdf405575938bf207ee4c0b453986ecdd 100644
--- a/smokeinfra/gateway-2.yaml
+++ b/smokeinfra/gateway-2.yaml
@@ -40,8 +40,6 @@ schedulingCertPath: "../keys/cmix.rip.crt"
 # Path to the certificate file
 cmixCertPath: "../keys/cmix.rip.crt"
 
-knownRoundsPath: "results/gateways/knownrounds-2.json"
-lastUpdateIdPath: "results/gateways/lastupdateid-2.txt"
 devMode: true
 
 # === END YAML
diff --git a/smokeinfra/gateway-3.yaml b/smokeinfra/gateway-3.yaml
index 2fb8822016acf788f7441594224c69a348eaf75b..d850dc4c007d1ab418ed74dfc7948cfe47835141 100644
--- a/smokeinfra/gateway-3.yaml
+++ b/smokeinfra/gateway-3.yaml
@@ -40,8 +40,6 @@ schedulingCertPath: "../keys/cmix.rip.crt"
 # Path to the certificate file
 cmixCertPath: "../keys/cmix.rip.crt"
 
-knownRoundsPath: "results/gateways/knownrounds-3.json"
-lastUpdateIdPath: "results/gateways/lastupdateid-3.txt"
 devMode: true
 
 # === END YAML
diff --git a/smokeinfra/permissioning.yaml b/smokeinfra/permissioning.yaml
index 5b8b9c035df603ff9a11b56e695c101e88c410a8..85e5919698d5b7dcd3a41ee1ec05caabf903beb1 100644
--- a/smokeinfra/permissioning.yaml
+++ b/smokeinfra/permissioning.yaml
@@ -8,8 +8,6 @@ logLevel: 1
 # Path to log file
 logPath: "results/permissioning.log"
 
-ndfOutputPath: "results/ndf.json"
-
 # The listening port of this server
 port: 18000
 
@@ -26,7 +24,6 @@ minServerVersion:  "3.0.0"
 minClientVersion: "2.0.0"
 nodeMetricInterval: 3
 
-
 # For testing, use the sequence as the country code. Do not use the geobinning database
 disableGeoBinning: true
 
@@ -38,37 +35,34 @@ allowLocalIPs: true
 disableNDFPruning: true
 permissiveIPChecking: true
 
-clientRegCodes:
-  - "FFFF"
-  - "GGGG"
+# How long rounds will be tracked by gateways. Rounds (and messages as an extension)
+# prior to this period are not guaranteed to be delivered to clients.
+# Expects duration in"h". (Defaults to 1 weeks (168 hours)
+messageRetentionLimit: "168h"
 
 # Path to the file containing the round ID
 roundIdPath: "results/roundId.txt"
 
-# Path to UDB public key PEM file
-udbPubKeyPemPath: "../keys/cmix.rip.crt"
-
 # Path to the file containing the update ID
 updateIdPath: "results/updateId.txt"
 
-# Path to the UDB certificate file
-udbCertPath: "../keys/cmix.rip.crt"
-
-ndfOutputPath: "results/permissions-ndfoutput.json"
+# Path to whitelisted IPs for client ratelimiting
+whitelistedIpAddressesPath: "whitelist.txt"
 
 # === REQUIRED FOR ENABLING TLS ===
 # Path to the private key file
 keyPath: "../keys/cmix.rip.key"
 # Path to the certificate file
 certPath: "../keys/cmix.rip.crt"
-# Path to the certificate file
-serverCertPath: "../keys/cmix.rip.crt"
 
+ndfOutputPath: "results/ndf.json"
+
+# === REQUIRED FOR ENABLING TLS ===
+# Path to the UDB certificate file
 udContactPath: "udContact.bin"
+# Path of the user discovery contact file.
+udbCertPath: "../keys/cmix.rip.crt"
 udbAddress: "127.0.0.1:18001"
-# Path to UDB public key PEM file
-udbPubKeyPemPath: "../keys/cmix.rip.crt"
-
 
 # Time interval (in minutes) in which the database is
 # checked for banned nodes
@@ -84,12 +78,6 @@ groups:
     smallprime: "71774C1E818EE0EDB78D3D33EF874D472AB0EDC746A4A099CA6024DBD456676E14C3847890CA8ECE7C90762E8A3393D525729AD849163445AAD9EE9576FB600E4A3B26D5C9BC9AD541DF1B733BB0389D5A25319BE1073C30ABAF3A2E98FC5CF4D6C20908C63151F1714EFA3584326864A8E1CA52E5DEE356E38C6E951F020811EDDAD591F5DA3A16F4E0B43DAD9A7D2461A90B19625298747FD8DE28ED6EFA29D85938BE15E3334F6BB5A5EEAE4FFAAC74479372BC29815F6DE511F562D674904B7745303217DB0F479E924C85C658977224777BC70C2639216E8B0E3B9C7995F94D420B4C4BC412DA088DA5E1F0F0CC22A84ACAC199EBBB6C595F7769D0D0D110D371BF3325325C1CC0E237FEEE0D22F1EA908D57C5FDE0393B4627A86BEBC01E96A793C6F400A523991B18EBF0326F40E0635FD21F78734CC430789C85AE9FF56578B4B00AE5BCE1FCE16C9ECB089066872F8965DB43F55822920FCB3C4E1C744EBCB09C7318CDF3171AEC3D882465145F1C4DABAF4CA6E53AAA38AC2504F6391BA16E1AC39C23D77A4FB3721C39"
     generator: "2"
 
-# Selection of scheduling algorithem to use. Options are:
-#   simple - Schedules multiple teams to maximize performance, does not randomly re-arrange teams, if only a single
-#            only scheduling a single team, will use numerical ordering data for AlphaNet
-#   secure - Schedules new teams randomly, has apropreate buffers to ensure unpredictability, designed for BetaNet
-schedulingAlgorithm: "simple"
-
 # Path to file with config for scheduling algorithem within the user directory
 schedulingConfigPath: "registration.json"
 
@@ -97,3 +85,6 @@ schedulingConfigPath: "registration.json"
 # placement)
 RegCodesFilePath: "regCodes.json"
 
+# Set address space size for ephemeral IDs
+addressSpace: 32
+