diff --git a/Cargo.toml b/Cargo.toml
index adb5c8b210..a5fa2b3da3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,7 +9,7 @@ members = [
 	"server-cli",
 	"voxygen",
 	"world",
-    "network",
+	"network",
 ]
 
 # default profile for devs, fast to compile, okay enough to run, no debug information
diff --git a/network/Cargo.lock b/network/Cargo.lock
deleted file mode 100644
index e8966891a8..0000000000
--- a/network/Cargo.lock
+++ /dev/null
@@ -1,901 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-[[package]]
-name = "aho-corasick"
-version = "0.7.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "ansi_term"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "async-std"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "async-task 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)",
- "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "async-task"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "bincode"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "bitflags"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "byteorder"
-version = "1.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "cfg-if"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "chrono"
-version = "0.4.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "fnv"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "fuchsia-zircon"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "fuchsia-zircon-sys"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "futures"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "futures-executor"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "futures-io"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "futures-macro"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "futures-sink"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "futures-task"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "futures-timer"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "futures-util"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.1.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "iovec"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "itoa"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "kernel32-sys"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "kv-log-macro"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "libc"
-version = "0.2.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "log"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "matchers"
-version = "0.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "maybe-uninit"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "memchr"
-version = "2.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "memoffset"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "mio"
-version = "0.6.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "mio-uds"
-version = "0.6.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
- "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "miow"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "net2"
-version = "0.2.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "pin-project"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0-alpha.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "proc-macro-hack"
-version = "0.5.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "proc-macro-nested"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "prometheus"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "protobuf 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "protobuf"
-version = "2.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "quick-error"
-version = "1.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "quote"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rand"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.1.56"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "regex"
-version = "1.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
- "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "ryu"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "scopeguard"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde_json"
-version = "1.0.51"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.0.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "smallvec"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "spin"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "syn"
-version = "1.0.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "time"
-version = "0.1.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tracing"
-version = "0.1.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-attributes 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tracing-futures"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tracing-serde"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "matchers 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)",
- "sharded-slab 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-log 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "uvth"
-version = "3.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "veloren_network"
-version = "0.1.0"
-dependencies = [
- "async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "prometheus 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-futures 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "tracing-subscriber 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "uvth 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "winapi-build"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "ws2_32-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[metadata]
-"checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada"
-"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
-"checksum async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267"
-"checksum async-task 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d"
-"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
-"checksum bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf"
-"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
-"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
-"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
-"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2"
-"checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa"
-"checksum crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061"
-"checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285"
-"checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
-"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
-"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
-"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
-"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
-"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
-"checksum futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780"
-"checksum futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8"
-"checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a"
-"checksum futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba"
-"checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6"
-"checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7"
-"checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6"
-"checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27"
-"checksum futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6"
-"checksum futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5"
-"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
-"checksum hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e"
-"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
-"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
-"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
-"checksum kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb"
-"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-"checksum libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005"
-"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
-"checksum matchers 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1"
-"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
-"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
-"checksum memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8"
-"checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f"
-"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
-"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
-"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
-"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
-"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
-"checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6"
-"checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b"
-"checksum pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7804a463a8d9572f13453c516a5faea534a2403d7ced2f0c7e100eeff072772c"
-"checksum pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "385322a45f2ecf3410c68d2a549a4a2685e8051d0f278e39743ff4e451cb9b3f"
-"checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae"
-"checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587"
-"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
-"checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63"
-"checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694"
-"checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3"
-"checksum prometheus 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5567486d5778e2c6455b1b90ff1c558f29e751fc018130fa182e15828e728af1"
-"checksum protobuf 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e86d370532557ae7573551a1ec8235a0f8d6cb276c7c9e6aa490b511c447485"
-"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
-"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f"
-"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
-"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
-"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
-"checksum regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7f6946991529684867e47d86474e3a6d0c0ab9b82d5821e314b1ede31fa3a4b3"
-"checksum regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4"
-"checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae"
-"checksum ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76"
-"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-"checksum serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)" = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399"
-"checksum serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)" = "da07b57ee2623368351e9a0488bb0b261322a15a6e0ae53e243cbdc0f4208da9"
-"checksum sharded-slab 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ae75d0445b5d3778c9da3d1f840faa16d0627c8607f78a74daf69e5b988c39a1"
-"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
-"checksum smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05720e22615919e4734f6a99ceae50d00226c3c5aca406e102ebc33298214e0a"
-"checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
-"checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03"
-"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
-"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
-"checksum tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1721cc8cf7d770cc4257872507180f35a4797272f5962f24c806af9e7faf52ab"
-"checksum tracing-attributes 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "7fbad39da2f9af1cae3016339ad7f2c7a9e870f12e8fd04c4fd7ef35b30c0d2b"
-"checksum tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715"
-"checksum tracing-futures 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "58b0b7fd92dc7b71f29623cc6836dd7200f32161a2313dd78be233a8405694f6"
-"checksum tracing-log 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9"
-"checksum tracing-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79"
-"checksum tracing-subscriber 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cfc50df245be6f0adf35c399cb16dea60e2c7d6cc83ff5dc22d727df06dd6f0c"
-"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
-"checksum uvth 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e59a167890d173eb0fcd7a1b99b84dc05c521ae8d76599130b8e19bef287abbf"
-"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
-"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
-"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
-"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
-"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
diff --git a/network/examples/.gitignore b/network/examples/.gitignore
deleted file mode 100644
index 3a70e511f5..0000000000
--- a/network/examples/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# dont save cargo locks for examples
-*/Cargo.lock
\ No newline at end of file
diff --git a/network/examples/async_recv/Cargo.lock b/network/examples/async_recv/Cargo.lock
new file mode 100644
index 0000000000..d015d8bb72
--- /dev/null
+++ b/network/examples/async_recv/Cargo.lock
@@ -0,0 +1,978 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "aho-corasick"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
+dependencies = [
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "async-recv"
+version = "0.1.0"
+dependencies = [
+ "bincode",
+ "chrono",
+ "clap",
+ "futures",
+ "serde",
+ "tracing",
+ "tracing-subscriber",
+ "uvth",
+ "veloren_network",
+]
+
+[[package]]
+name = "async-std"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267"
+dependencies = [
+ "async-task",
+ "crossbeam-channel 0.4.2",
+ "crossbeam-deque",
+ "crossbeam-utils 0.7.2",
+ "futures-core",
+ "futures-io",
+ "futures-timer",
+ "kv-log-macro",
+ "log",
+ "memchr",
+ "mio",
+ "mio-uds",
+ "num_cpus",
+ "once_cell",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "async-task"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d"
+dependencies = [
+ "libc",
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
+
+[[package]]
+name = "bincode"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf"
+dependencies = [
+ "byteorder",
+ "serde",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+
+[[package]]
+name = "byteorder"
+version = "1.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "chrono"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2"
+dependencies = [
+ "num-integer",
+ "num-traits",
+ "time",
+]
+
+[[package]]
+name = "clap"
+version = "2.33.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa"
+dependencies = [
+ "crossbeam-utils 0.6.6",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061"
+dependencies = [
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils 0.7.2",
+ "lazy_static",
+ "maybe-uninit",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
+dependencies = [
+ "cfg-if",
+ "lazy_static",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "lazy_static",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+dependencies = [
+ "bitflags",
+ "fuchsia-zircon-sys",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+
+[[package]]
+name = "futures"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+ "num_cpus",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc"
+
+[[package]]
+name = "futures-task"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "futures-timer"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6"
+
+[[package]]
+name = "futures-util"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project",
+ "pin-utils",
+ "proc-macro-hack",
+ "proc-macro-nested",
+ "slab",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "kv-log-macro"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ff57d6d215f7ca7eb35a9a64d656ba4d9d2bef114d741dc08048e75e2f5d418"
+dependencies = [
+ "log",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.71"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
+
+[[package]]
+name = "log"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "matchers"
+version = "0.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+
+[[package]]
+name = "memchr"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
+
+[[package]]
+name = "memoffset"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mio"
+version = "0.6.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430"
+dependencies = [
+ "cfg-if",
+ "fuchsia-zircon",
+ "fuchsia-zircon-sys",
+ "iovec",
+ "kernel32-sys",
+ "libc",
+ "log",
+ "miow",
+ "net2",
+ "slab",
+ "winapi 0.2.8",
+]
+
+[[package]]
+name = "mio-uds"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0"
+dependencies = [
+ "iovec",
+ "libc",
+ "mio",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
+dependencies = [
+ "kernel32-sys",
+ "net2",
+ "winapi 0.2.8",
+ "ws2_32-sys",
+]
+
+[[package]]
+name = "net2"
+version = "0.2.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
+
+[[package]]
+name = "pin-project"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9df32da11d84f3a7d70205549562966279adb900e080fad3dccd8e64afccf0ad"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4"
+
+[[package]]
+name = "proc-macro-nested"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "prometheus"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5567486d5778e2c6455b1b90ff1c558f29e751fc018130fa182e15828e728af1"
+dependencies = [
+ "cfg-if",
+ "fnv",
+ "lazy_static",
+ "protobuf",
+ "quick-error",
+ "spin",
+]
+
+[[package]]
+name = "protobuf"
+version = "2.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e86d370532557ae7573551a1ec8235a0f8d6cb276c7c9e6aa490b511c447485"
+
+[[package]]
+name = "quick-error"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
+
+[[package]]
+name = "quote"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom",
+ "libc",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "regex"
+version = "1.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+ "thread_local",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4"
+dependencies = [
+ "byteorder",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "serde"
+version = "1.0.111"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.111"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.53"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06d5a3f5166fb5b42a5439f2eee8b9de149e235961e3eb21c5808fc3ea17ff3e"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
+
+[[package]]
+name = "smallvec"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "syn"
+version = "1.0.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "time"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
+dependencies = [
+ "libc",
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "tracing"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7c6b59d116d218cb2d990eb06b77b64043e0268ef7323aae63d8b30ae462923"
+dependencies = [
+ "cfg-if",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "tracing-futures"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c"
+dependencies = [
+ "pin-project",
+ "tracing",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-serde"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79"
+dependencies = [
+ "serde",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d53c40489aa69c9aed21ff483f26886ca8403df33bdc2d2f87c60c1617826d2"
+dependencies = [
+ "ansi_term",
+ "chrono",
+ "lazy_static",
+ "matchers",
+ "regex",
+ "serde",
+ "serde_json",
+ "sharded-slab",
+ "smallvec",
+ "tracing-core",
+ "tracing-log",
+ "tracing-serde",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+
+[[package]]
+name = "uvth"
+version = "3.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e59a167890d173eb0fcd7a1b99b84dc05c521ae8d76599130b8e19bef287abbf"
+dependencies = [
+ "crossbeam-channel 0.3.9",
+ "log",
+ "num_cpus",
+]
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "veloren_network"
+version = "0.1.0"
+dependencies = [
+ "async-std",
+ "bincode",
+ "futures",
+ "lazy_static",
+ "prometheus",
+ "rand",
+ "serde",
+ "tracing",
+ "tracing-futures",
+ "uvth",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[package]]
+name = "winapi"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
diff --git a/network/examples/async_recv/Cargo.toml b/network/examples/async_recv/Cargo.toml
index 6eb51c19cd..ceb362c679 100644
--- a/network/examples/async_recv/Cargo.toml
+++ b/network/examples/async_recv/Cargo.toml
@@ -17,4 +17,4 @@ tracing = "0.1"
 chrono = "0.4"
 tracing-subscriber = "0.2.3"
 bincode = "1.2"
-serde = "1.0"
\ No newline at end of file
+serde = { version = "1.0", features = ["derive"] }
\ No newline at end of file
diff --git a/network/examples/async_recv/src/main.rs b/network/examples/async_recv/src/main.rs
index 2a547592c1..5da8627fc0 100644
--- a/network/examples/async_recv/src/main.rs
+++ b/network/examples/async_recv/src/main.rs
@@ -1,10 +1,13 @@
+//!run with
+//! ```bash
+//! (cd network/examples/async_recv && RUST_BACKTRACE=1 cargo run)
+//! ```
 use chrono::prelude::*;
 use clap::{App, Arg};
 use futures::executor::block_on;
 use network::{Address, Network, Pid, Stream, PROMISES_NONE};
 use serde::{Deserialize, Serialize};
 use std::{
-    net::SocketAddr,
     thread,
     time::{Duration, Instant},
 };
@@ -107,7 +110,7 @@ fn main() {
 
 fn server(address: Address) {
     let thread_pool = ThreadPoolBuilder::new().build();
-    let server = Network::new(Pid::new(), &thread_pool);
+    let server = Network::new(Pid::new(), &thread_pool, None);
     block_on(server.listen(address.clone())).unwrap(); //await
     println!("waiting for client");
 
@@ -179,7 +182,7 @@ async fn async_task2(mut s: Stream) -> u64 {
 
 fn client(address: Address) {
     let thread_pool = ThreadPoolBuilder::new().build();
-    let client = Network::new(Pid::new(), &thread_pool);
+    let client = Network::new(Pid::new(), &thread_pool, None);
 
     let p1 = block_on(client.connect(address.clone())).unwrap(); //remote representation of p1
     let s1 = block_on(p1.open(16, PROMISES_NONE)).unwrap(); //remote representation of s1
diff --git a/network/examples/chat/Cargo.lock b/network/examples/chat/Cargo.lock
index b0b07e7af0..148709ed50 100644
--- a/network/examples/chat/Cargo.lock
+++ b/network/examples/chat/Cargo.lock
@@ -704,20 +704,6 @@ name = "serde"
 version = "1.0.106"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
 
 [[package]]
 name = "serde_json"
@@ -919,7 +905,6 @@ version = "0.1.0"
 dependencies = [
  "async-std",
  "bincode",
- "byteorder",
  "futures",
  "lazy_static",
  "prometheus",
diff --git a/network/examples/chat/src/main.rs b/network/examples/chat/src/main.rs
index f0df705b80..1ddb0fca0a 100644
--- a/network/examples/chat/src/main.rs
+++ b/network/examples/chat/src/main.rs
@@ -1,3 +1,8 @@
+//!run with
+//! ```bash
+//! (cd network/examples/chat && RUST_BACKTRACE=1 cargo run --release -- --trace=info --port 15006)
+//! (cd network/examples/chat && RUST_BACKTRACE=1 cargo run --release -- --trace=info --port 15006 --mode=client)
+//! ```
 use async_std::io;
 use clap::{App, Arg};
 use futures::executor::{block_on, ThreadPool};
@@ -96,7 +101,7 @@ fn main() {
 
 fn server(address: Address) {
     let thread_pool = ThreadPoolBuilder::new().build();
-    let server = Arc::new(Network::new(Pid::new(), &thread_pool));
+    let server = Arc::new(Network::new(Pid::new(), &thread_pool, None));
     let pool = ThreadPool::new().unwrap();
     block_on(async {
         server.listen(address).await.unwrap();
@@ -135,7 +140,7 @@ async fn client_connection(network: Arc<Network>, participant: Arc<Participant>)
 
 fn client(address: Address) {
     let thread_pool = ThreadPoolBuilder::new().build();
-    let client = Network::new(Pid::new(), &thread_pool);
+    let client = Network::new(Pid::new(), &thread_pool, None);
     let pool = ThreadPool::new().unwrap();
 
     block_on(async {
diff --git a/network/examples/fileshare/Cargo.lock b/network/examples/fileshare/Cargo.lock
index 935f43ccc7..4bf8e8870b 100644
--- a/network/examples/fileshare/Cargo.lock
+++ b/network/examples/fileshare/Cargo.lock
@@ -1010,7 +1010,6 @@ version = "0.1.0"
 dependencies = [
  "async-std",
  "bincode",
- "byteorder",
  "futures",
  "lazy_static",
  "prometheus",
diff --git a/network/examples/fileshare/Cargo.toml b/network/examples/fileshare/Cargo.toml
index a39df5e636..f175a55f1b 100644
--- a/network/examples/fileshare/Cargo.toml
+++ b/network/examples/fileshare/Cargo.toml
@@ -17,6 +17,6 @@ futures = "0.3"
 tracing = "0.1"
 tracing-subscriber = "0.2.3"
 bincode = "1.2"
-serde = "1.0"
+serde = { version = "1.0", features = ["derive"] }
 rand = "0.7.3"
 shellexpand = "2.0.0"
\ No newline at end of file
diff --git a/network/examples/fileshare/src/main.rs b/network/examples/fileshare/src/main.rs
index 4b8e1ef760..5647dfaf07 100644
--- a/network/examples/fileshare/src/main.rs
+++ b/network/examples/fileshare/src/main.rs
@@ -1,5 +1,8 @@
 #![feature(async_closure, exclusive_range_pattern)]
-
+//!run with
+//! (cd network/examples/fileshare && RUST_BACKTRACE=1 cargo run --profile=release -Z unstable-options  -- --trace=info --port 15006)
+//! (cd network/examples/fileshare && RUST_BACKTRACE=1 cargo run --profile=release -Z unstable-options  -- --trace=info --port 15007)
+//! ```
 use async_std::{io, path::PathBuf};
 use clap::{App, Arg, SubCommand};
 use futures::{
@@ -152,7 +155,7 @@ async fn client(mut cmd_sender: mpsc::UnboundedSender<LocalCommand>) {
                 cmd_sender.send(LocalCommand::Disconnect).await.unwrap();
             },
             ("connect", Some(connect_matches)) => {
-                let socketaddr = connect_matches.value_of("ipport").unwrap().parse().unwrap();
+                let socketaddr = connect_matches.value_of("ip:port").unwrap().parse().unwrap();
                 cmd_sender
                     .send(LocalCommand::Connect(Address::Tcp(socketaddr)))
                     .await
diff --git a/network/examples/fileshare/src/server.rs b/network/examples/fileshare/src/server.rs
index 2073f5ab15..9628e4f384 100644
--- a/network/examples/fileshare/src/server.rs
+++ b/network/examples/fileshare/src/server.rs
@@ -28,7 +28,7 @@ impl Server {
         let (command_sender, command_receiver) = mpsc::unbounded();
 
         let thread_pool = ThreadPoolBuilder::new().build();
-        let network = Network::new(Pid::new(), &thread_pool);
+        let network = Network::new(Pid::new(), &thread_pool, None);
 
         let run_channels = Some(ControlChannels { command_receiver });
         (
diff --git a/network/examples/network-speed/Cargo.lock b/network/examples/network-speed/Cargo.lock
new file mode 100644
index 0000000000..2fcebd2eb7
--- /dev/null
+++ b/network/examples/network-speed/Cargo.lock
@@ -0,0 +1,1056 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "aho-corasick"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
+dependencies = [
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "ascii"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbf56136a5198c7b01a49e3afcbef6cf84597273d298f54432926024107b0109"
+
+[[package]]
+name = "async-std"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267"
+dependencies = [
+ "async-task",
+ "crossbeam-channel 0.4.2",
+ "crossbeam-deque",
+ "crossbeam-utils 0.7.2",
+ "futures-core",
+ "futures-io",
+ "futures-timer",
+ "kv-log-macro",
+ "log",
+ "memchr",
+ "mio",
+ "mio-uds",
+ "num_cpus",
+ "once_cell",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "async-task"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d"
+dependencies = [
+ "libc",
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
+
+[[package]]
+name = "bincode"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf"
+dependencies = [
+ "byteorder",
+ "serde",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+
+[[package]]
+name = "byteorder"
+version = "1.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "chrono"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2"
+dependencies = [
+ "num-integer",
+ "num-traits",
+ "time",
+]
+
+[[package]]
+name = "chunked_transfer"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b89647f09b9f4c838cb622799b2843e4e13bff64661dab9a0362bb92985addd"
+
+[[package]]
+name = "clap"
+version = "2.33.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa"
+dependencies = [
+ "crossbeam-utils 0.6.6",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061"
+dependencies = [
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils 0.7.2",
+ "lazy_static",
+ "maybe-uninit",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
+dependencies = [
+ "cfg-if",
+ "lazy_static",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "lazy_static",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+dependencies = [
+ "bitflags",
+ "fuchsia-zircon-sys",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+
+[[package]]
+name = "futures"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+ "num_cpus",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc"
+
+[[package]]
+name = "futures-task"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "futures-timer"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6"
+
+[[package]]
+name = "futures-util"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project",
+ "pin-utils",
+ "proc-macro-hack",
+ "proc-macro-nested",
+ "slab",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "kv-log-macro"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ff57d6d215f7ca7eb35a9a64d656ba4d9d2bef114d741dc08048e75e2f5d418"
+dependencies = [
+ "log",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.71"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
+
+[[package]]
+name = "log"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "matchers"
+version = "0.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+
+[[package]]
+name = "memchr"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
+
+[[package]]
+name = "memoffset"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mio"
+version = "0.6.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430"
+dependencies = [
+ "cfg-if",
+ "fuchsia-zircon",
+ "fuchsia-zircon-sys",
+ "iovec",
+ "kernel32-sys",
+ "libc",
+ "log",
+ "miow",
+ "net2",
+ "slab",
+ "winapi 0.2.8",
+]
+
+[[package]]
+name = "mio-uds"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0"
+dependencies = [
+ "iovec",
+ "libc",
+ "mio",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
+dependencies = [
+ "kernel32-sys",
+ "net2",
+ "winapi 0.2.8",
+ "ws2_32-sys",
+]
+
+[[package]]
+name = "net2"
+version = "0.2.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "network-speed"
+version = "0.1.0"
+dependencies = [
+ "bincode",
+ "clap",
+ "futures",
+ "prometheus",
+ "serde",
+ "tiny_http",
+ "tracing",
+ "tracing-subscriber",
+ "uvth",
+ "veloren_network",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "pin-project"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9df32da11d84f3a7d70205549562966279adb900e080fad3dccd8e64afccf0ad"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4"
+
+[[package]]
+name = "proc-macro-nested"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "prometheus"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5567486d5778e2c6455b1b90ff1c558f29e751fc018130fa182e15828e728af1"
+dependencies = [
+ "cfg-if",
+ "fnv",
+ "lazy_static",
+ "protobuf",
+ "quick-error",
+ "spin",
+]
+
+[[package]]
+name = "protobuf"
+version = "2.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e86d370532557ae7573551a1ec8235a0f8d6cb276c7c9e6aa490b511c447485"
+
+[[package]]
+name = "quick-error"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
+
+[[package]]
+name = "quote"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom",
+ "libc",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "regex"
+version = "1.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+ "thread_local",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4"
+dependencies = [
+ "byteorder",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "serde"
+version = "1.0.111"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.111"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.53"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06d5a3f5166fb5b42a5439f2eee8b9de149e235961e3eb21c5808fc3ea17ff3e"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
+
+[[package]]
+name = "smallvec"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "syn"
+version = "1.0.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "time"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
+dependencies = [
+ "libc",
+ "winapi 0.3.8",
+]
+
+[[package]]
+name = "tiny_http"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15ce4fc3c4cdea1a4399bb1819a539195fb69db4bbe0bde5b7c7f18fed412e02"
+dependencies = [
+ "ascii",
+ "chrono",
+ "chunked_transfer",
+ "log",
+ "url",
+]
+
+[[package]]
+name = "tracing"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7c6b59d116d218cb2d990eb06b77b64043e0268ef7323aae63d8b30ae462923"
+dependencies = [
+ "cfg-if",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "tracing-futures"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c"
+dependencies = [
+ "pin-project",
+ "tracing",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-serde"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79"
+dependencies = [
+ "serde",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d53c40489aa69c9aed21ff483f26886ca8403df33bdc2d2f87c60c1617826d2"
+dependencies = [
+ "ansi_term",
+ "chrono",
+ "lazy_static",
+ "matchers",
+ "regex",
+ "serde",
+ "serde_json",
+ "sharded-slab",
+ "smallvec",
+ "tracing-core",
+ "tracing-log",
+ "tracing-serde",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+dependencies = [
+ "matches",
+]
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4"
+dependencies = [
+ "smallvec",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+
+[[package]]
+name = "url"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb"
+dependencies = [
+ "idna",
+ "matches",
+ "percent-encoding",
+]
+
+[[package]]
+name = "uvth"
+version = "3.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e59a167890d173eb0fcd7a1b99b84dc05c521ae8d76599130b8e19bef287abbf"
+dependencies = [
+ "crossbeam-channel 0.3.9",
+ "log",
+ "num_cpus",
+]
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "veloren_network"
+version = "0.1.0"
+dependencies = [
+ "async-std",
+ "bincode",
+ "futures",
+ "lazy_static",
+ "prometheus",
+ "rand",
+ "serde",
+ "tracing",
+ "tracing-futures",
+ "uvth",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[package]]
+name = "winapi"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
diff --git a/network/examples/network-speed/src/main.rs b/network/examples/network-speed/src/main.rs
index ef44609307..77410c1499 100644
--- a/network/examples/network-speed/src/main.rs
+++ b/network/examples/network-speed/src/main.rs
@@ -1,13 +1,18 @@
+///run with
+/// ```bash
+/// (cd network/examples/network-speed && RUST_BACKTRACE=1 cargo run --profile=debuginfo -Z unstable-options -- --trace=error --protocol=tcp --mode=server)
+/// (cd network/examples/network-speed && RUST_BACKTRACE=1 cargo run --profile=debuginfo -Z unstable-options -- --trace=error --protocol=tcp --mode=client)
+/// ```
 mod metrics;
 
 use clap::{App, Arg};
 use futures::executor::block_on;
-use network::{Address, Network, Pid, PROMISES_CONSISTENCY, PROMISES_ORDERED, MessageBuffer};
+use network::{Address, MessageBuffer, Network, Pid, PROMISES_CONSISTENCY, PROMISES_ORDERED};
 use serde::{Deserialize, Serialize};
 use std::{
+    sync::Arc,
     thread,
     time::{Duration, Instant},
-    sync::Arc,
 };
 use tracing::*;
 use tracing_subscriber::EnvFilter;
@@ -152,11 +157,12 @@ fn client(address: Address) {
     let mut s1 = block_on(p1.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY)).unwrap(); //remote representation of s1
     let mut last = Instant::now();
     let mut id = 0u64;
-    let raw_msg = Arc::new(MessageBuffer{
+    let raw_msg = Arc::new(MessageBuffer {
         data: bincode::serialize(&Msg::Ping {
             id,
             data: vec![0; 1000],
-        }).unwrap(),
+        })
+        .unwrap(),
     });
     loop {
         s1.send_raw(raw_msg.clone()).unwrap();
@@ -172,13 +178,13 @@ fn client(address: Address) {
             std::thread::sleep(std::time::Duration::from_millis(5000));
             break;
         }
-    };
+    }
     drop(s1);
     std::thread::sleep(std::time::Duration::from_millis(5000));
     info!("closing participant");
     block_on(client.disconnect(p1)).unwrap();
-    std::thread::sleep(std::time::Duration::from_millis(75000));
+    std::thread::sleep(std::time::Duration::from_millis(25000));
     info!("DROPPING! client");
     drop(client);
-    std::thread::sleep(std::time::Duration::from_millis(75000));
+    std::thread::sleep(std::time::Duration::from_millis(25000));
 }
diff --git a/network/examples/network-speed/src/metrics.rs b/network/examples/network-speed/src/metrics.rs
index 9186c3fdc8..978c686d58 100644
--- a/network/examples/network-speed/src/metrics.rs
+++ b/network/examples/network-speed/src/metrics.rs
@@ -1,6 +1,4 @@
 use prometheus::{Encoder, Registry, TextEncoder};
-use tiny_http;
-use tracing::*;
 use std::{
     error::Error,
     net::SocketAddr,
@@ -10,6 +8,8 @@ use std::{
     },
     thread,
 };
+use tiny_http;
+use tracing::*;
 
 pub struct SimpleMetrics {
     running: Arc<AtomicBool>,
@@ -54,15 +54,25 @@ impl SimpleMetrics {
                 let request = match server.recv_timeout(TIMEOUT) {
                     Ok(Some(rq)) => rq,
                     Ok(None) => continue,
-                    Err(e) => { println!("error: {}", e); break }
+                    Err(e) => {
+                        println!("error: {}", e);
+                        break;
+                    },
                 };
                 let mf = registry.gather();
                 let encoder = TextEncoder::new();
                 let mut buffer = vec![];
-                encoder.encode(&mf, &mut buffer).expect("Failed to encoder metrics text.");
-                let response = tiny_http::Response::from_string(String::from_utf8(buffer).expect("Failed to parse bytes as a string."));
+                encoder
+                    .encode(&mf, &mut buffer)
+                    .expect("Failed to encoder metrics text.");
+                let response = tiny_http::Response::from_string(
+                    String::from_utf8(buffer).expect("Failed to parse bytes as a string."),
+                );
                 match request.respond(response) {
-                    Err(e) => error!(?e, "The metrics HTTP server had encountered and error with answering"),
+                    Err(e) => error!(
+                        ?e,
+                        "The metrics HTTP server had encountered and error with answering"
+                    ),
                     _ => (),
                 }
             }
@@ -81,4 +91,4 @@ impl Drop for SimpleMetrics {
             .join()
             .expect("Error shutting down prometheus metric exporter");
     }
-}
\ No newline at end of file
+}
diff --git a/network/examples/tcp-loadtest/Cargo.lock b/network/examples/tcp-loadtest/Cargo.lock
new file mode 100644
index 0000000000..189d054fd9
--- /dev/null
+++ b/network/examples/tcp-loadtest/Cargo.lock
@@ -0,0 +1,84 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "getrandom"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.71"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom",
+ "libc",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "tcp-loadtest"
+version = "0.1.0"
+dependencies = [
+ "rand",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
diff --git a/network/examples/tcp-loadtest/src/main.rs b/network/examples/tcp-loadtest/src/main.rs
index acc3e1f746..d1d2bbe9f4 100644
--- a/network/examples/tcp-loadtest/src/main.rs
+++ b/network/examples/tcp-loadtest/src/main.rs
@@ -1,3 +1,7 @@
+//!run with
+//! ```bash
+//! (cd network/examples/tcp-loadtest && RUST_BACKTRACE=1 cargo run 127.0.0.1 52000)
+//! ```
 use std::{
     env,
     io::Write,
diff --git a/network/src/api.rs b/network/src/api.rs
index d8d24e1b1a..cbe13541fa 100644
--- a/network/src/api.rs
+++ b/network/src/api.rs
@@ -1,3 +1,7 @@
+//!
+//!
+//!
+//! (cd network/examples/async_recv && RUST_BACKTRACE=1 cargo run)
 use crate::{
     message::{self, InCommingMessage, MessageBuffer, OutGoingMessage},
     scheduler::Scheduler,
@@ -115,13 +119,13 @@ pub enum StreamError {
 /// use futures::executor::block_on;
 ///
 /// # fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
-/// // Create a Network, listen on port `12345` to accept connections and connect to port `8080` to connect to a (pseudo) database Application
+/// // Create a Network, listen on port `2999` to accept connections and connect to port `8080` to connect to a (pseudo) database Application
 /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
 /// block_on(async{
 ///     # //setup pseudo database!
 ///     # let database = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
 ///     # database.listen(Address::Tcp("127.0.0.1:8080".parse().unwrap())).await?;
-///     network.listen(Address::Tcp("127.0.0.1:12345".parse().unwrap())).await?;
+///     network.listen(Address::Tcp("127.0.0.1:2999".parse().unwrap())).await?;
 ///     let database = network.connect(Address::Tcp("127.0.0.1:8080".parse().unwrap())).await?;
 ///     # Ok(())
 /// })
@@ -248,20 +252,20 @@ impl Network {
     /// use veloren_network::{Address, Network, Pid};
     ///
     /// # fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
-    /// // Create a Network, connect on port `2000` TCP and `2001` UDP like listening above
+    /// // Create a Network, connect on port `2010` TCP and `2011` UDP like listening above
     /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// block_on(async {
-    ///     # remote.listen(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?;
-    ///     # remote.listen(Address::Udp("0.0.0.0:2001".parse().unwrap())).await?;
+    ///     # remote.listen(Address::Tcp("0.0.0.0:2010".parse().unwrap())).await?;
+    ///     # remote.listen(Address::Udp("0.0.0.0:2011".parse().unwrap())).await?;
     ///     let p1 = network
-    ///         .connect(Address::Tcp("127.0.0.1:2000".parse().unwrap()))
+    ///         .connect(Address::Tcp("127.0.0.1:2010".parse().unwrap()))
     ///         .await?;
     ///     # //this doesn't work yet, so skip the test
     ///     # //TODO fixme!
     ///     # return Ok(());
     ///     let p2 = network
-    ///         .connect(Address::Udp("127.0.0.1:2001".parse().unwrap()))
+    ///         .connect(Address::Udp("127.0.0.1:2011".parse().unwrap()))
     ///         .await?;
     ///     assert!(std::sync::Arc::ptr_eq(&p1, &p2));
     ///     # Ok(())
@@ -311,14 +315,14 @@ impl Network {
     /// use veloren_network::{Address, Network, Pid};
     ///
     /// # fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
-    /// // Create a Network, listen on port `2000` TCP and opens returns their Pid
+    /// // Create a Network, listen on port `2020` TCP and opens returns their Pid
     /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// block_on(async {
     ///     network
-    ///         .listen(Address::Tcp("0.0.0.0:2000".parse().unwrap()))
+    ///         .listen(Address::Tcp("0.0.0.0:2020".parse().unwrap()))
     ///         .await?;
-    ///     # remote.connect(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?;
+    ///     # remote.connect(Address::Tcp("0.0.0.0:2020".parse().unwrap())).await?;
     ///     while let Ok(participant) = network.connected().await {
     ///         println!("Participant connected: {}", participant.remote_pid());
     ///         # //skip test here as it would be a endless loop
@@ -350,7 +354,9 @@ impl Network {
     ///
     /// This function will wait for all [`Streams`] to properly close, including
     /// all messages to be send before closing. If an error occurs with one
-    /// of the messavb
+    /// of the messages.
+    /// Except if the remote side already dropped the [`Participant`]
+    /// simultaneously, then messages won't be sended
     ///
     /// # Examples
     /// ```rust
@@ -359,14 +365,14 @@ impl Network {
     /// use veloren_network::{Address, Network, Pid};
     ///
     /// # fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
-    /// // Create a Network, listen on port `2000` TCP and opens returns their Pid and close connection.
+    /// // Create a Network, listen on port `2030` TCP and opens returns their Pid and close connection.
     /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// block_on(async {
     ///     network
-    ///         .listen(Address::Tcp("0.0.0.0:2000".parse().unwrap()))
+    ///         .listen(Address::Tcp("0.0.0.0:2030".parse().unwrap()))
     ///         .await?;
-    ///     # remote.connect(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?;
+    ///     # remote.connect(Address::Tcp("0.0.0.0:2030".parse().unwrap())).await?;
     ///     while let Ok(participant) = network.connected().await {
     ///         println!("Participant connected: {}", participant.remote_pid());
     ///         network.disconnect(participant).await?;
@@ -469,13 +475,13 @@ impl Participant {
     /// use veloren_network::{Address, Network, Pid, PROMISES_CONSISTENCY, PROMISES_ORDERED};
     ///
     /// # fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
-    /// // Create a Network, connect on port 2000 and open a stream
+    /// // Create a Network, connect on port 2100 and open a stream
     /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// block_on(async {
-    ///     # remote.listen(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?;
+    ///     # remote.listen(Address::Tcp("0.0.0.0:2100".parse().unwrap())).await?;
     ///     let p1 = network
-    ///         .connect(Address::Tcp("127.0.0.1:2000".parse().unwrap()))
+    ///         .connect(Address::Tcp("127.0.0.1:2100".parse().unwrap()))
     ///         .await?;
     ///     let _s1 = p1.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?;
     ///     # Ok(())
@@ -530,13 +536,13 @@ impl Participant {
     /// use futures::executor::block_on;
     ///
     /// # fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
-    /// // Create a Network, connect on port 2000 and wait for the other side to open a stream
+    /// // Create a Network, connect on port 2110 and wait for the other side to open a stream
     /// // Note: It's quite unusal to activly connect, but then wait on a stream to be connected, usually the Appication taking initiative want's to also create the first Stream.
     /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// block_on(async {
-    ///     # remote.listen(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?;
-    ///     let p1 = network.connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?;
+    ///     # remote.listen(Address::Tcp("0.0.0.0:2110".parse().unwrap())).await?;
+    ///     let p1 = network.connect(Address::Tcp("127.0.0.1:2110".parse().unwrap())).await?;
     ///     # let p2 = remote.connected().await?;
     ///     # p2.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?;
     ///     let _s1 = p1.opened().await?;
@@ -613,9 +619,14 @@ impl Stream {
     /// any more. A [`StreamError`] will be returned in the error case, e.g.
     /// when the `Stream` got closed already.
     ///
-    /// Note when a `Stream` is dropped, it will still send all messages, though
-    /// the `drop` will return immediately, however, when a [`Participant`]
-    /// gets gracefully shut down, all remaining messages will be send.
+    /// Note when a `Stream` is dropped locally, it will still send all
+    /// messages, though the `drop` will return immediately, however, when a
+    /// [`Participant`] gets gracefully shut down, all remaining messages
+    /// will be send. If the `Stream` is dropped from remote side no further
+    /// messages are send, because the remote side has no way of listening
+    /// to them either way. If the last channel is destroyed (e.g. by losing
+    /// the internet connection or non-gracefull shutdown, pending messages
+    /// are also dropped.
     ///
     /// # Example
     /// ```rust
@@ -623,21 +634,51 @@ impl Stream {
     /// # use veloren_network::{PROMISES_ORDERED, PROMISES_CONSISTENCY};
     /// use uvth::ThreadPoolBuilder;
     /// use futures::executor::block_on;
+    /// use tracing::*;
+    /// use tracing_subscriber::EnvFilter;
     ///
     /// # fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
-    /// // Create a Network, listen on Port `2000` and wait for a Stream to be opened, then answer `Hello World`
+    ///
+    /// std::thread::spawn(|| {
+    /// let filter = EnvFilter::from_default_env()
+    ///             .add_directive("trace".parse().unwrap())
+    ///             .add_directive("async_std::task::block_on=warn".parse().unwrap())
+    ///             .add_directive("veloren_network::tests=trace".parse().unwrap())
+    ///             .add_directive("veloren_network::controller=trace".parse().unwrap())
+    ///             .add_directive("veloren_network::channel=trace".parse().unwrap())
+    ///             .add_directive("veloren_network::message=trace".parse().unwrap())
+    ///             .add_directive("veloren_network::metrics=trace".parse().unwrap())
+    ///             .add_directive("veloren_network::types=trace".parse().unwrap());
+    /// let _sub = tracing_subscriber::FmtSubscriber::builder()
+    ///             // all spans/events with a level higher than TRACE (e.g, info, warn, etc.)
+    ///             // will be written to stdout.
+    ///             .with_max_level(Level::TRACE)
+    ///             .with_env_filter(filter)
+    ///             // sets this to be the default, global subscriber for this application.
+    ///             .try_init();
+    ///
+    /// // Create a Network, listen on Port `2200` and wait for a Stream to be opened, then answer `Hello World`
     /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// block_on(async {
-    ///     network.listen(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?;
-    ///     # let remote_p = remote.connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?;
-    ///     # remote_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?;
-    ///     let participant_a = network.connected().await?;
-    ///     let mut stream_a = participant_a.opened().await?;
+    ///     network.listen(Address::Tcp("127.0.0.1:2200".parse().unwrap())).await.unwrap();
+    ///     # let remote_p = remote.connect(Address::Tcp("127.0.0.1:2200".parse().unwrap())).await.unwrap();
+    ///     # remote_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await.unwrap();
+    ///     let participant_a = network.connected().await.unwrap();
+    ///     let mut stream_a = participant_a.opened().await.unwrap();
     ///     //Send  Message
-    ///     stream_a.send("Hello World");
-    ///     # Ok(())
+    ///     stream_a.send("Hello World").unwrap();
     /// })
+    /// });
+    ///
+    ///     std::thread::sleep(std::time::Duration::from_secs(70));
+    ///     println!("Sleep another 10s");
+    ///     std::thread::sleep(std::time::Duration::from_secs(10));
+    ///     println!("TRACING THE DEADLOCK");
+    ///     assert!(false);
+    ///
+    /// std::thread::sleep(std::time::Duration::from_secs(150));
+    /// Ok(())
     /// # }
     /// ```
     ///
@@ -668,9 +709,9 @@ impl Stream {
     /// # let remote1 = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// # let remote2 = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     /// block_on(async {
-    ///     network.listen(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?;
-    ///     # let remote1_p = remote1.connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?;
-    ///     # let remote2_p = remote2.connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?;
+    ///     network.listen(Address::Tcp("127.0.0.1:2210".parse().unwrap())).await?;
+    ///     # let remote1_p = remote1.connect(Address::Tcp("127.0.0.1:2210".parse().unwrap())).await?;
+    ///     # let remote2_p = remote2.connect(Address::Tcp("127.0.0.1:2210".parse().unwrap())).await?;
     ///     # assert_eq!(remote1_p.remote_pid(), remote2_p.remote_pid());
     ///     # remote1_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?;
     ///     # remote2_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?;
@@ -717,6 +758,31 @@ impl Stream {
     ///
     /// A [`StreamError`] will be returned in the error case, e.g. when the
     /// `Stream` got closed already.
+    ///
+    /// # Example
+    /// ```rust
+    /// use veloren_network::{Network, Address, Pid};
+    /// # use veloren_network::{PROMISES_ORDERED, PROMISES_CONSISTENCY};
+    /// use uvth::ThreadPoolBuilder;
+    /// use futures::executor::block_on;
+    ///
+    /// # fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
+    /// // Create a Network, listen on Port `2220` and wait for a Stream to be opened, then listen on it
+    /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
+    /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
+    /// block_on(async {
+    ///     network.listen(Address::Tcp("127.0.0.1:2220".parse().unwrap())).await?;
+    ///     # let remote_p = remote.connect(Address::Tcp("127.0.0.1:2220".parse().unwrap())).await?;
+    ///     # let mut stream_p = remote_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?;
+    ///     # stream_p.send("Hello World");
+    ///     let participant_a = network.connected().await?;
+    ///     let mut stream_a = participant_a.opened().await?;
+    ///     //Send  Message
+    ///     println!("{}", stream_a.recv::<String>().await?);
+    ///     # Ok(())
+    /// })
+    /// # }
+    /// ```
     #[inline]
     pub async fn recv<M: DeserializeOwned>(&mut self) -> Result<M, StreamError> {
         Ok(message::deserialize(self.recv_raw().await?))
@@ -731,7 +797,7 @@ impl Stream {
         //no need to access self.closed here, as when this stream is closed the Channel
         // is closed which will trigger a None
         let msg = self.b2a_msg_recv_r.next().await?;
-        info!(?msg, "delivering a message");
+        //info!(?msg, "delivering a message");
         Ok(msg.buffer)
     }
 }
@@ -745,6 +811,23 @@ impl Drop for Network {
             "shutting down Participants of Network, while we still have metrics"
         );
         task::block_on(async {
+            // we need to carefully shut down here! as otherwise we might call
+            // Participant::Drop with a2s_disconnect_s here which would open
+            // another task::block, which would panic! also i can't `.write` on
+            // `self.participants` as the `disconnect` fn needs it.
+            let mut participant_clone = self.participants().await;
+            for (_, p) in participant_clone.drain() {
+                match self.disconnect(p).await {
+                    Err(e) => {
+                        error!(
+                            ?e,
+                            "error while dropping network, the error occured when dropping a \
+                             participant but can't be notified to the user any more"
+                        );
+                    },
+                    _ => (),
+                }
+            }
             self.participants.write().await.clear();
         });
         debug!(?pid, "shutting down Scheduler");
diff --git a/network/src/lib.rs b/network/src/lib.rs
index ad086258b6..22219439c0 100644
--- a/network/src/lib.rs
+++ b/network/src/lib.rs
@@ -103,6 +103,7 @@ mod participant;
 mod prios;
 mod protocols;
 mod scheduler;
+#[macro_use]
 mod types;
 
 pub use api::{Address, Network, NetworkError, Participant, ParticipantError, Stream, StreamError};
diff --git a/network/src/metrics.rs b/network/src/metrics.rs
index 8a0b3eb835..eb875040f7 100644
--- a/network/src/metrics.rs
+++ b/network/src/metrics.rs
@@ -27,13 +27,13 @@ pub struct NetworkMetrics {
     // Frames counted at protocol level, seperated by CHANNEL (and PARTICIPANT) AND FRAME TYPE,
     pub frames_wire_out_total: IntCounterVec,
     pub frames_wire_in_total: IntCounterVec,
-    pub frames_count: IntGaugeVec,
-    // send Messages, seperated by STREAM (and PARTICIPANT, CHANNEL),
-    pub message_count: IntGaugeVec,
-    // send Messages bytes, seperated by STREAM (and PARTICIPANT, CHANNEL),
-    pub bytes_send: IntGaugeVec,
-    // Frames, seperated by MESSAGE (and PARTICIPANT, CHANNEL, STREAM),
-    pub frames_message_count: IntGaugeVec,
+    // throughput at protocol level, seperated by CHANNEL (and PARTICIPANT),
+    pub wire_out_throughput: IntCounterVec,
+    pub wire_in_throughput: IntCounterVec,
+    // send(prio) Messages count, seperated by STREAM AND PARTICIPANT,
+    pub message_out_total: IntCounterVec,
+    // send(prio) Messages throughput, seperated by STREAM AND PARTICIPANT,
+    pub message_out_throughput: IntCounterVec,
     // TODO: queued Messages, seperated by STREAM (add PART, CHANNEL),
     // queued Messages, seperated by PARTICIPANT
     pub queued_count: IntGaugeVec,
@@ -137,31 +137,35 @@ impl NetworkMetrics {
             ),
             &["channel", "frametype"],
         )?;
-
-        let frames_count = IntGaugeVec::new(
+        let wire_out_throughput = IntCounterVec::new(
             Opts::new(
-                "frames_count",
-                "number of all frames send by streams on the network",
+                "wire_out_throughput",
+                "throupgput of all data frames send per channel, at the protocol level",
             ),
             &["channel"],
         )?;
-        let message_count = IntGaugeVec::new(
+        let wire_in_throughput = IntCounterVec::new(
             Opts::new(
-                "message_count",
+                "wire_in_throughput",
+                "throupgput of all data frames send per channel, at the protocol level",
+            ),
+            &["channel"],
+        )?;
+        //TODO IN
+        let message_out_total = IntCounterVec::new(
+            Opts::new(
+                "message_out_total",
                 "number of messages send by streams on the network",
             ),
-            &["channel"],
+            &["participant", "stream"],
         )?;
-        let bytes_send = IntGaugeVec::new(
-            Opts::new("bytes_send", "bytes send by streams on the network"),
-            &["channel"],
-        )?;
-        let frames_message_count = IntGaugeVec::new(
+        //TODO IN
+        let message_out_throughput = IntCounterVec::new(
             Opts::new(
-                "frames_message_count",
-                "bytes sends per message on the network",
+                "message_out_throughput",
+                "throughput of messages send by streams on the network",
             ),
-            &["channel"],
+            &["participant", "stream"],
         )?;
         let queued_count = IntGaugeVec::new(
             Opts::new(
@@ -199,10 +203,10 @@ impl NetworkMetrics {
             frames_in_total,
             frames_wire_out_total,
             frames_wire_in_total,
-            frames_count,
-            message_count,
-            bytes_send,
-            frames_message_count,
+            wire_out_throughput,
+            wire_in_throughput,
+            message_out_total,
+            message_out_throughput,
             queued_count,
             queued_bytes,
             participants_ping,
@@ -218,15 +222,15 @@ impl NetworkMetrics {
         registry.register(Box::new(self.channels_disconnected_total.clone()))?;
         registry.register(Box::new(self.streams_opened_total.clone()))?;
         registry.register(Box::new(self.streams_closed_total.clone()))?;
+        registry.register(Box::new(self.network_info.clone()))?;
         registry.register(Box::new(self.frames_out_total.clone()))?;
         registry.register(Box::new(self.frames_in_total.clone()))?;
         registry.register(Box::new(self.frames_wire_out_total.clone()))?;
         registry.register(Box::new(self.frames_wire_in_total.clone()))?;
-        registry.register(Box::new(self.network_info.clone()))?;
-        registry.register(Box::new(self.frames_count.clone()))?;
-        registry.register(Box::new(self.message_count.clone()))?;
-        registry.register(Box::new(self.bytes_send.clone()))?;
-        registry.register(Box::new(self.frames_message_count.clone()))?;
+        registry.register(Box::new(self.wire_out_throughput.clone()))?;
+        registry.register(Box::new(self.wire_in_throughput.clone()))?;
+        registry.register(Box::new(self.message_out_total.clone()))?;
+        registry.register(Box::new(self.message_out_throughput.clone()))?;
         registry.register(Box::new(self.queued_count.clone()))?;
         registry.register(Box::new(self.queued_bytes.clone()))?;
         registry.register(Box::new(self.participants_ping.clone()))?;
diff --git a/network/src/participant.rs b/network/src/participant.rs
index ae9d449dab..adf748cea6 100644
--- a/network/src/participant.rs
+++ b/network/src/participant.rs
@@ -21,13 +21,14 @@ use std::{
         atomic::{AtomicBool, AtomicUsize, Ordering},
         Arc,
     },
+    time::{Duration, Instant},
 };
 use tracing::*;
 
 #[derive(Debug)]
 struct ChannelInfo {
     cid: Cid,
-    cid_string: String, //optimisation
+    cid_string: String, //optimisationmetrics
     b2w_frame_s: mpsc::UnboundedSender<Frame>,
     b2r_read_shutdown: oneshot::Sender<()>,
 }
@@ -109,7 +110,7 @@ impl BParticipant {
         )
     }
 
-    pub async fn run(mut self) {
+    pub async fn run(mut self, b2s_prio_statistic_s: mpsc::UnboundedSender<(Pid, u64, u64)>) {
         //those managers that listen on api::Participant need an additional oneshot for
         // shutdown scenario, those handled by scheduler will be closed by it.
         let (shutdown_send_mgr_sender, shutdown_send_mgr_receiver) = oneshot::channel();
@@ -118,7 +119,8 @@ impl BParticipant {
         let (shutdown_open_mgr_sender, shutdown_open_mgr_receiver) = oneshot::channel();
         let (b2b_prios_flushed_s, b2b_prios_flushed_r) = oneshot::channel();
         let (w2b_frames_s, w2b_frames_r) = mpsc::unbounded::<(Cid, Frame)>();
-        let (prios, a2p_msg_s, b2p_notify_empty_stream_s) = PrioManager::new();
+        let (prios, a2p_msg_s, b2p_notify_empty_stream_s) =
+            PrioManager::new(self.metrics.clone(), self.remote_pid_string.clone());
 
         let run_channels = self.run_channels.take().unwrap();
         futures::join!(
@@ -135,7 +137,12 @@ impl BParticipant {
                 a2p_msg_s.clone(),
             ),
             self.create_channel_mgr(run_channels.s2b_create_channel_r, w2b_frames_s,),
-            self.send_mgr(prios, shutdown_send_mgr_receiver, b2b_prios_flushed_s),
+            self.send_mgr(
+                prios,
+                shutdown_send_mgr_receiver,
+                b2b_prios_flushed_s,
+                b2s_prio_statistic_s
+            ),
             self.stream_close_mgr(
                 run_channels.a2b_close_stream_r,
                 shutdown_stream_close_mgr_receiver,
@@ -158,11 +165,12 @@ impl BParticipant {
         mut prios: PrioManager,
         mut shutdown_send_mgr_receiver: oneshot::Receiver<()>,
         b2b_prios_flushed_s: oneshot::Sender<()>,
+        mut b2s_prio_statistic_s: mpsc::UnboundedSender<(Pid, u64, u64)>,
     ) {
         //This time equals the MINIMUM Latency in average, so keep it down and //Todo:
         // make it configureable or switch to await E.g. Prio 0 = await, prio 50
         // wait for more messages
-        const TICK_TIME: std::time::Duration = std::time::Duration::from_millis(10);
+        const TICK_TIME: Duration = Duration::from_millis(10);
         const FRAMES_PER_TICK: usize = 10005;
         self.running_mgr.fetch_add(1, Ordering::Relaxed);
         let mut closing_up = false;
@@ -180,6 +188,10 @@ impl BParticipant {
             for (_, frame) in frames {
                 self.send_frame(frame, &mut send_cache).await;
             }
+            b2s_prio_statistic_s
+                .send((self.remote_pid, len as u64, /*  */ 0))
+                .await
+                .unwrap();
             async_std::task::sleep(TICK_TIME).await;
             //shutdown after all msg are send!
             if closing_up && (len == 0) {
@@ -199,11 +211,28 @@ impl BParticipant {
     async fn send_frame(&self, frame: Frame, frames_out_total_cache: &mut PidCidFrameCache) {
         // find out ideal channel here
         //TODO: just take first
-        if let Some(ci) = self.channels.write().await.get_mut(0) {
+        let mut lock = self.channels.write().await;
+        if let Some(ci) = lock.get_mut(0) {
+            //note: this is technically wrong we should only increase when it suceeded, but
+            // this requiered me to clone `frame` which is a to big performance impact for
+            // error handling
             frames_out_total_cache
                 .with_label_values(ci.cid, &frame)
                 .inc();
-            ci.b2w_frame_s.send(frame).await.unwrap();
+            if let Err(e) = ci.b2w_frame_s.send(frame).await {
+                warn!(
+                    ?e,
+                    "the channel got closed unexpectedly, cleaning it up now."
+                );
+                let ci = lock.remove(0);
+                if let Err(e) = ci.b2r_read_shutdown.send(()) {
+                    debug!(
+                        ?e,
+                        "error shutdowning channel, which is prob fine as we detected it to no \
+                         longer work in the first place"
+                    );
+                };
+            }
         } else {
             error!("participant has no channel to communicate on");
         }
@@ -219,6 +248,10 @@ impl BParticipant {
         self.running_mgr.fetch_add(1, Ordering::Relaxed);
         trace!("start handle_frames_mgr");
         let mut messages = HashMap::new();
+        let mut dropped_instant = Instant::now();
+        let mut dropped_cnt = 0u64;
+        let mut dropped_sid = Sid::new(0);
+
         while let Some((cid, frame)) = w2b_frames_r.next().await {
             let cid_string = cid.to_string();
             //trace!("handling frame");
@@ -245,19 +278,26 @@ impl BParticipant {
                     // However Stream.send() is not async and their receiver isn't dropped if Steam
                     // is dropped, so i need a way to notify the Stream that it's send messages will
                     // be dropped... from remote, notify local
+                    trace!(
+                        ?sid,
+                        "got remote request to close a stream, without flushing it, local \
+                         messages are dropped"
+                    );
+                    // no wait for flush here, as the remote wouldn't care anyway.
                     if let Some(si) = self.streams.write().await.remove(&sid) {
                         self.metrics
                             .streams_closed_total
                             .with_label_values(&[&self.remote_pid_string])
                             .inc();
                         si.closed.store(true, Ordering::Relaxed);
+                        trace!(?sid, "closed stream from remote");
                     } else {
-                        error!(
+                        warn!(
+                            ?sid,
                             "couldn't find stream to close, either this is a duplicate message, \
                              or the local copy of the Stream got closed simultaniously"
                         );
                     }
-                    trace!("closed frame from remote");
                 },
                 Frame::DataHeader { mid, sid, length } => {
                     let imsg = InCommingMessage {
@@ -283,15 +323,44 @@ impl BParticipant {
                         //debug!(?mid, "finished receiving message");
                         let imsg = messages.remove(&mid).unwrap();
                         if let Some(si) = self.streams.write().await.get_mut(&imsg.sid) {
-                            si.b2a_msg_recv_s.send(imsg).await.unwrap();
+                            if let Err(e) = si.b2a_msg_recv_s.send(imsg).await {
+                                warn!(
+                                    ?e,
+                                    ?mid,
+                                    "dropping message, as streams seem to be in act of beeing \
+                                     dropped right now"
+                                );
+                            }
                         } else {
-                            error!("dropping message as stream no longer seems to exist");
+                            //aggregate errors
+                            let n = Instant::now();
+                            if dropped_sid != imsg.sid
+                                || n.duration_since(dropped_instant) > Duration::from_secs(1)
+                            {
+                                warn!(
+                                    ?dropped_cnt,
+                                    "dropping multiple messages as stream no longer seems to \
+                                     exist because it was dropped probably."
+                                );
+                                dropped_cnt = 0;
+                                dropped_instant = n;
+                                dropped_sid = imsg.sid;
+                            } else {
+                                dropped_cnt += 1;
+                            }
                         }
                     }
                 },
                 _ => unreachable!("never reaches frame!"),
             }
         }
+        if dropped_cnt > 0 {
+            warn!(
+                ?dropped_cnt,
+                "dropping multiple messages as stream no longer seems to exist because it was \
+                 dropped probably."
+            );
+        }
         trace!("stop handle_frames_mgr");
         self.running_mgr.fetch_sub(1, Ordering::Relaxed);
     }
@@ -392,8 +461,8 @@ impl BParticipant {
         let sender = s2b_shutdown_bparticipant_r.await.unwrap();
         debug!("closing all managers");
         for sender in to_shutdown.drain(..) {
-            if sender.send(()).is_err() {
-                warn!("manager seems to be closed already, weird, maybe a bug");
+            if let Err(e) = sender.send(()) {
+                warn!(?e, "manager seems to be closed already, weird, maybe a bug");
             };
         }
         debug!("closing all streams");
@@ -410,7 +479,7 @@ impl BParticipant {
             };
         }
         //Wait for other bparticipants mgr to close via AtomicUsize
-        const SLEEP_TIME: std::time::Duration = std::time::Duration::from_millis(5);
+        const SLEEP_TIME: Duration = Duration::from_millis(5);
         async_std::task::sleep(SLEEP_TIME).await;
         let mut i: u32 = 1;
         while self.running_mgr.load(Ordering::Relaxed) > 1 {
@@ -458,14 +527,15 @@ impl BParticipant {
             // be handled at the remote side.
 
             trace!(?sid, "stopping api to use this stream");
-            self.streams
-                .read()
-                .await
-                .get(&sid)
-                .unwrap()
-                .closed
-                .store(true, Ordering::Relaxed);
+            match self.streams.read().await.get(&sid) {
+                Some(si) => {
+                    si.closed.store(true, Ordering::Relaxed);
+                },
+                None => warn!("couldn't find the stream, might be simulanious close from remote"),
+            }
 
+            //TODO: what happens if RIGHT NOW the remote sends a StreamClose and this
+            // streams get closed and removed? RACE CONDITION
             trace!(?sid, "wait for stream to be flushed");
             let (s2b_stream_finished_closed_s, s2b_stream_finished_closed_r) = oneshot::channel();
             b2p_notify_empty_stream_s
diff --git a/network/src/prios.rs b/network/src/prios.rs
index 7900f97326..fe33ccd109 100644
--- a/network/src/prios.rs
+++ b/network/src/prios.rs
@@ -7,12 +7,16 @@
 
 use crate::{
     message::OutGoingMessage,
+    metrics::NetworkMetrics,
     types::{Frame, Prio, Sid},
 };
 use futures::channel::oneshot;
 use std::{
     collections::{HashMap, HashSet, VecDeque},
-    sync::mpsc::{channel, Receiver, Sender},
+    sync::{
+        mpsc::{channel, Receiver, Sender},
+        Arc,
+    },
 };
 
 use tracing::*;
@@ -32,20 +36,10 @@ pub(crate) struct PrioManager {
     //you can register to be notified if a pid_sid combination is flushed completly here
     sid_flushed_rx: Receiver<(Sid, oneshot::Sender<()>)>,
     queued: HashSet<u8>,
+    metrics: Arc<NetworkMetrics>,
+    pid: String,
 }
 
-/*
-ERROR Okay ich kann die frames und msg nicht counten, da api auf msg basis zöhlt und BParticipant auf frame basis.
-Der Priomanager hört auf gekillte PID, SIDs, und entweder returned sofort wenn keine msg drinn ist, oder schreibt es in id_sid_owned und haut es dann raus
-Evtl sollten wir auch den prioManger auf mehr Async umstellen. auch wenn der TICK selber syncron ist. mal schaun.
-*/
-
-/*
-ERROR, okay wie hauen alles komplett um, PRIOS wird ein  teildes BPARTICIPANT
-Der BPARTICIPANT bekommt vom Scheduler seine throughput werte, und berichtet zurück
-PRIOS wird ASYNC!
-*/
-
 impl PrioManager {
     const FRAME_DATA_SIZE: u64 = 1400;
     const PRIOS: [u32; PRIO_MAX] = [
@@ -56,7 +50,10 @@ impl PrioManager {
         310419, 356578, 409600, 470507, 540470, 620838,
     ];
 
-    pub fn new() -> (
+    pub fn new(
+        metrics: Arc<NetworkMetrics>,
+        pid: String,
+    ) -> (
         Self,
         Sender<(Prio, Sid, OutGoingMessage)>,
         Sender<(Sid, oneshot::Sender<()>)>,
@@ -137,6 +134,8 @@ impl PrioManager {
                 queued: HashSet::new(), //TODO: optimize with u64 and 64 bits
                 sid_flushed_rx,
                 sid_owned: HashMap::new(),
+                metrics,
+                pid,
             },
             messages_tx,
             sid_flushed_tx,
@@ -145,11 +144,19 @@ impl PrioManager {
 
     async fn tick(&mut self) {
         // Check Range
-        let mut times = 0;
+        let mut messages = 0;
         let mut closed = 0;
         for (prio, sid, msg) in self.messages_rx.try_iter() {
             debug_assert!(prio as usize <= PRIO_MAX);
-            times += 1;
+            messages += 1;
+            self.metrics
+                .message_out_total
+                .with_label_values(&[&self.pid, &sid.to_string()])
+                .inc();
+            self.metrics
+                .message_out_throughput
+                .with_label_values(&[&self.pid, &sid.to_string()])
+                .inc_by(msg.buffer.data.len() as i64);
             //trace!(?prio, ?sid, "tick");
             self.queued.insert(prio);
             self.messages[prio as usize].push_back((sid, msg));
@@ -173,8 +180,8 @@ impl PrioManager {
                 return_sender.send(()).unwrap();
             }
         }
-        if times > 0 || closed > 0 {
-            trace!(?times, ?closed, "tick");
+        if messages > 0 || closed > 0 {
+            trace!(?messages, ?closed, "tick");
         }
     }
 
@@ -239,10 +246,14 @@ impl PrioManager {
         no_of_frames: usize,
         frames: &mut E,
     ) {
+        for v in self.messages.iter_mut() {
+            v.reserve_exact(no_of_frames)
+        }
         self.tick().await;
         for _ in 0..no_of_frames {
             match self.calc_next_prio() {
                 Some(prio) => {
+                    //let prio2 = self.calc_next_prio().unwrap();
                     //trace!(?prio, "handle next prio");
                     self.points[prio as usize] += Self::PRIOS[prio as usize];
                     //pop message from front of VecDeque, handle it and push it back, so that all
@@ -268,8 +279,8 @@ impl PrioManager {
                                         .map(|empty_notify| empty_notify.send(()).unwrap());
                                 }
                             } else {
+                                error!(?msg.mid, "repush message");
                                 self.messages[prio as usize].push_back((sid, msg));
-                                //trace!(?m.mid, "repush message");
                             }
                         },
                         None => unreachable!("msg not in VecDeque, but queued"),
@@ -301,15 +312,31 @@ impl std::fmt::Debug for PrioManager {
 mod tests {
     use crate::{
         message::{MessageBuffer, OutGoingMessage},
+        metrics::NetworkMetrics,
         prios::*,
-        types::{Frame, Prio, Sid},
+        types::{Frame, Pid, Prio, Sid},
+    };
+    use futures::{channel::oneshot, executor::block_on};
+    use std::{
+        collections::VecDeque,
+        sync::{mpsc::Sender, Arc},
     };
-    use futures::executor::block_on;
-    use std::{collections::VecDeque, sync::Arc};
 
     const SIZE: u64 = PrioManager::FRAME_DATA_SIZE;
     const USIZE: usize = PrioManager::FRAME_DATA_SIZE as usize;
 
+    fn mock_new() -> (
+        PrioManager,
+        Sender<(Prio, Sid, OutGoingMessage)>,
+        Sender<(Sid, oneshot::Sender<()>)>,
+    ) {
+        let pid = Pid::fake(1);
+        PrioManager::new(
+            Arc::new(NetworkMetrics::new(&pid).unwrap()),
+            pid.to_string(),
+        )
+    }
+
     fn mock_out(prio: Prio, sid: u64) -> (Prio, Sid, OutGoingMessage) {
         let sid = Sid::new(sid);
         (prio, sid, OutGoingMessage {
@@ -365,7 +392,7 @@ mod tests {
 
     #[test]
     fn single_p16() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         msg_tx.send(mock_out(16, 1337)).unwrap();
         let mut frames = VecDeque::new();
         block_on(mgr.fill_frames(100, &mut frames));
@@ -377,7 +404,7 @@ mod tests {
 
     #[test]
     fn single_p16_p20() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         msg_tx.send(mock_out(16, 1337)).unwrap();
         msg_tx.send(mock_out(20, 42)).unwrap();
         let mut frames = VecDeque::new();
@@ -392,7 +419,7 @@ mod tests {
 
     #[test]
     fn single_p20_p16() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         msg_tx.send(mock_out(20, 42)).unwrap();
         msg_tx.send(mock_out(16, 1337)).unwrap();
         let mut frames = VecDeque::new();
@@ -407,7 +434,7 @@ mod tests {
 
     #[test]
     fn multiple_p16_p20() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         msg_tx.send(mock_out(20, 2)).unwrap();
         msg_tx.send(mock_out(16, 1)).unwrap();
         msg_tx.send(mock_out(16, 3)).unwrap();
@@ -433,7 +460,7 @@ mod tests {
 
     #[test]
     fn multiple_fill_frames_p16_p20() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         msg_tx.send(mock_out(20, 2)).unwrap();
         msg_tx.send(mock_out(16, 1)).unwrap();
         msg_tx.send(mock_out(16, 3)).unwrap();
@@ -465,7 +492,7 @@ mod tests {
 
     #[test]
     fn single_large_p16() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         msg_tx.send(mock_out_large(16, 1)).unwrap();
         let mut frames = VecDeque::new();
         block_on(mgr.fill_frames(100, &mut frames));
@@ -479,7 +506,7 @@ mod tests {
 
     #[test]
     fn multiple_large_p16() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         msg_tx.send(mock_out_large(16, 1)).unwrap();
         msg_tx.send(mock_out_large(16, 2)).unwrap();
         let mut frames = VecDeque::new();
@@ -498,7 +525,7 @@ mod tests {
 
     #[test]
     fn multiple_large_p16_sudden_p0() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         msg_tx.send(mock_out_large(16, 1)).unwrap();
         msg_tx.send(mock_out_large(16, 2)).unwrap();
         let mut frames = VecDeque::new();
@@ -524,7 +551,7 @@ mod tests {
 
     #[test]
     fn single_p20_thousand_p16_at_once() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         for _ in 0..998 {
             msg_tx.send(mock_out(16, 2)).unwrap();
         }
@@ -546,7 +573,7 @@ mod tests {
 
     #[test]
     fn single_p20_thousand_p16_later() {
-        let (mut mgr, msg_tx, _flush_tx) = PrioManager::new();
+        let (mut mgr, msg_tx, _flush_tx) = mock_new();
         for _ in 0..998 {
             msg_tx.send(mock_out(16, 2)).unwrap();
         }
diff --git a/network/src/protocols.rs b/network/src/protocols.rs
index 3a96cd380c..b5a8f268f3 100644
--- a/network/src/protocols.rs
+++ b/network/src/protocols.rs
@@ -58,6 +58,26 @@ impl TcpProtocol {
         Self { stream, metrics }
     }
 
+    /// read_except and if it fails, close the protocol
+    async fn read_except_or_close(
+        cid: Cid,
+        mut stream: &TcpStream,
+        mut bytes: &mut [u8],
+        from_wire_sender: &mut mpsc::UnboundedSender<(Cid, Frame)>,
+    ) {
+        match stream.read_exact(&mut bytes).await {
+            Err(e) => {
+                warn!(
+                    ?e,
+                    "closing tcp protocol due to read error, sending close frame to gracefully \
+                     shutdown"
+                );
+                from_wire_sender.send((cid, Frame::Shutdown)).await.unwrap();
+            },
+            _ => (),
+        }
+    }
+
     pub async fn read(
         &self,
         cid: Cid,
@@ -66,8 +86,13 @@ impl TcpProtocol {
     ) {
         trace!("starting up tcp read()");
         let mut metrics_cache = CidFrameCache::new(self.metrics.frames_wire_in_total.clone(), cid);
+        let throughput_cache = self
+            .metrics
+            .wire_in_throughput
+            .with_label_values(&[&cid.to_string()]);
         let mut stream = self.stream.clone();
         let mut end_receiver = end_receiver.fuse();
+
         loop {
             let mut bytes = [0u8; 1];
             let r = select! {
@@ -82,7 +107,8 @@ impl TcpProtocol {
             let frame = match frame_no {
                 FRAME_HANDSHAKE => {
                     let mut bytes = [0u8; 19];
-                    stream.read_exact(&mut bytes).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender)
+                        .await;
                     let magic_number = [
                         bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6],
                     ];
@@ -97,7 +123,8 @@ impl TcpProtocol {
                 },
                 FRAME_INIT => {
                     let mut bytes = [0u8; 16];
-                    stream.read_exact(&mut bytes).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender)
+                        .await;
                     let pid = Pid::from_le_bytes(bytes);
                     stream.read_exact(&mut bytes).await.unwrap();
                     let secret = u128::from_le_bytes(bytes);
@@ -106,7 +133,8 @@ impl TcpProtocol {
                 FRAME_SHUTDOWN => Frame::Shutdown,
                 FRAME_OPEN_STREAM => {
                     let mut bytes = [0u8; 10];
-                    stream.read_exact(&mut bytes).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender)
+                        .await;
                     let sid = Sid::from_le_bytes([
                         bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6],
                         bytes[7],
@@ -121,7 +149,8 @@ impl TcpProtocol {
                 },
                 FRAME_CLOSE_STREAM => {
                     let mut bytes = [0u8; 8];
-                    stream.read_exact(&mut bytes).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender)
+                        .await;
                     let sid = Sid::from_le_bytes([
                         bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6],
                         bytes[7],
@@ -130,7 +159,8 @@ impl TcpProtocol {
                 },
                 FRAME_DATA_HEADER => {
                     let mut bytes = [0u8; 24];
-                    stream.read_exact(&mut bytes).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender)
+                        .await;
                     let mid = Mid::from_le_bytes([
                         bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6],
                         bytes[7],
@@ -147,7 +177,8 @@ impl TcpProtocol {
                 },
                 FRAME_DATA => {
                     let mut bytes = [0u8; 18];
-                    stream.read_exact(&mut bytes).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender)
+                        .await;
                     let mid = Mid::from_le_bytes([
                         bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6],
                         bytes[7],
@@ -158,22 +189,27 @@ impl TcpProtocol {
                     ]);
                     let length = u16::from_le_bytes([bytes[16], bytes[17]]);
                     let mut data = vec![0; length as usize];
-                    stream.read_exact(&mut data).await.unwrap();
+                    throughput_cache.inc_by(length as i64);
+                    Self::read_except_or_close(cid, &mut stream, &mut data, &mut from_wire_sender)
+                        .await;
                     Frame::Data { mid, start, data }
                 },
                 FRAME_RAW => {
                     let mut bytes = [0u8; 2];
-                    stream.read_exact(&mut bytes).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender)
+                        .await;
                     let length = u16::from_le_bytes([bytes[0], bytes[1]]);
                     let mut data = vec![0; length as usize];
-                    stream.read_exact(&mut data).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut data, &mut from_wire_sender)
+                        .await;
                     Frame::Raw(data)
                 },
                 _ => {
                     // report a RAW frame, but cannot rely on the next 2 bytes to be a size.
                     // guessing 256 bytes, which might help to sort down issues
                     let mut data = vec![0; 256];
-                    stream.read(&mut data).await.unwrap();
+                    Self::read_except_or_close(cid, &mut stream, &mut data, &mut from_wire_sender)
+                        .await;
                     Frame::Raw(data)
                 },
             };
@@ -183,6 +219,25 @@ impl TcpProtocol {
         trace!("shutting down tcp read()");
     }
 
+    /// read_except and if it fails, close the protocol
+    async fn write_or_close(
+        stream: &mut TcpStream,
+        bytes: &[u8],
+        to_wire_receiver: &mut mpsc::UnboundedReceiver<Frame>,
+    ) -> bool {
+        match stream.write_all(&bytes).await {
+            Err(e) => {
+                warn!(
+                    ?e,
+                    "got an error writing to tcp, going to close this channel"
+                );
+                to_wire_receiver.close();
+                true
+            },
+            _ => false,
+        }
+    }
+
     //dezerialize here as this is executed in a seperate thread PER channel.
     // Limites Throughput per single Receiver but stays in same thread (maybe as its
     // in a threadpool) for TCP, UDP and MPSC
@@ -190,80 +245,188 @@ impl TcpProtocol {
         trace!("starting up tcp write()");
         let mut stream = self.stream.clone();
         let mut metrics_cache = CidFrameCache::new(self.metrics.frames_wire_out_total.clone(), cid);
+        let throughput_cache = self
+            .metrics
+            .wire_out_throughput
+            .with_label_values(&[&cid.to_string()]);
         while let Some(frame) = to_wire_receiver.next().await {
             metrics_cache.with_label_values(&frame).inc();
-            match frame {
+            if match frame {
                 Frame::Handshake {
                     magic_number,
                     version,
                 } => {
-                    stream
-                        .write_all(&FRAME_HANDSHAKE.to_be_bytes())
+                    Self::write_or_close(
+                        &mut stream,
+                        &FRAME_HANDSHAKE.to_be_bytes(),
+                        &mut to_wire_receiver,
+                    )
+                    .await
+                        || Self::write_or_close(&mut stream, &magic_number, &mut to_wire_receiver)
+                            .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &version[0].to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &version[1].to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &version[2].to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
                         .await
-                        .unwrap();
-                    stream.write_all(&magic_number).await.unwrap();
-                    stream.write_all(&version[0].to_le_bytes()).await.unwrap();
-                    stream.write_all(&version[1].to_le_bytes()).await.unwrap();
-                    stream.write_all(&version[2].to_le_bytes()).await.unwrap();
                 },
                 Frame::Init { pid, secret } => {
-                    stream.write_all(&FRAME_INIT.to_be_bytes()).await.unwrap();
-                    stream.write_all(&pid.to_le_bytes()).await.unwrap();
-                    stream.write_all(&secret.to_le_bytes()).await.unwrap();
+                    Self::write_or_close(
+                        &mut stream,
+                        &FRAME_INIT.to_be_bytes(),
+                        &mut to_wire_receiver,
+                    )
+                    .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &pid.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &secret.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
                 },
                 Frame::Shutdown => {
-                    stream
-                        .write_all(&FRAME_SHUTDOWN.to_be_bytes())
-                        .await
-                        .unwrap();
+                    Self::write_or_close(
+                        &mut stream,
+                        &FRAME_SHUTDOWN.to_be_bytes(),
+                        &mut to_wire_receiver,
+                    )
+                    .await
                 },
                 Frame::OpenStream {
                     sid,
                     prio,
                     promises,
                 } => {
-                    stream
-                        .write_all(&FRAME_OPEN_STREAM.to_be_bytes())
+                    Self::write_or_close(
+                        &mut stream,
+                        &FRAME_OPEN_STREAM.to_be_bytes(),
+                        &mut to_wire_receiver,
+                    )
+                    .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &sid.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &prio.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &promises.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
                         .await
-                        .unwrap();
-                    stream.write_all(&sid.to_le_bytes()).await.unwrap();
-                    stream.write_all(&prio.to_le_bytes()).await.unwrap();
-                    stream.write_all(&promises.to_le_bytes()).await.unwrap();
                 },
                 Frame::CloseStream { sid } => {
-                    stream
-                        .write_all(&FRAME_CLOSE_STREAM.to_be_bytes())
+                    Self::write_or_close(
+                        &mut stream,
+                        &FRAME_CLOSE_STREAM.to_be_bytes(),
+                        &mut to_wire_receiver,
+                    )
+                    .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &sid.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
                         .await
-                        .unwrap();
-                    stream.write_all(&sid.to_le_bytes()).await.unwrap();
                 },
                 Frame::DataHeader { mid, sid, length } => {
-                    stream
-                        .write_all(&FRAME_DATA_HEADER.to_be_bytes())
+                    Self::write_or_close(
+                        &mut stream,
+                        &FRAME_DATA_HEADER.to_be_bytes(),
+                        &mut to_wire_receiver,
+                    )
+                    .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &mid.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &sid.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &length.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
                         .await
-                        .unwrap();
-                    stream.write_all(&mid.to_le_bytes()).await.unwrap();
-                    stream.write_all(&sid.to_le_bytes()).await.unwrap();
-                    stream.write_all(&length.to_le_bytes()).await.unwrap();
                 },
                 Frame::Data { mid, start, data } => {
-                    stream.write_all(&FRAME_DATA.to_be_bytes()).await.unwrap();
-                    stream.write_all(&mid.to_le_bytes()).await.unwrap();
-                    stream.write_all(&start.to_le_bytes()).await.unwrap();
-                    stream
-                        .write_all(&(data.len() as u16).to_le_bytes())
+                    throughput_cache.inc_by(data.len() as i64);
+                    Self::write_or_close(
+                        &mut stream,
+                        &FRAME_DATA.to_be_bytes(),
+                        &mut to_wire_receiver,
+                    )
+                    .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &mid.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
                         .await
-                        .unwrap();
-                    stream.write_all(&data).await.unwrap();
+                        || Self::write_or_close(
+                            &mut stream,
+                            &start.to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &(data.len() as u16).to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
+                        .await
+                        || Self::write_or_close(&mut stream, &data, &mut to_wire_receiver).await
                 },
                 Frame::Raw(data) => {
-                    stream.write_all(&FRAME_RAW.to_be_bytes()).await.unwrap();
-                    stream
-                        .write_all(&(data.len() as u16).to_le_bytes())
+                    Self::write_or_close(
+                        &mut stream,
+                        &FRAME_RAW.to_be_bytes(),
+                        &mut to_wire_receiver,
+                    )
+                    .await
+                        || Self::write_or_close(
+                            &mut stream,
+                            &(data.len() as u16).to_le_bytes(),
+                            &mut to_wire_receiver,
+                        )
                         .await
-                        .unwrap();
-                    stream.write_all(&data).await.unwrap();
+                        || Self::write_or_close(&mut stream, &data, &mut to_wire_receiver).await
                 },
+            } {
+                //failure
+                return;
             }
         }
         trace!("shutting down tcp write()");
@@ -293,6 +456,10 @@ impl UdpProtocol {
     ) {
         trace!("starting up udp read()");
         let mut metrics_cache = CidFrameCache::new(self.metrics.frames_wire_in_total.clone(), cid);
+        let throughput_cache = self
+            .metrics
+            .wire_in_throughput
+            .with_label_values(&[&cid.to_string()]);
         let mut data_in = self.data_in.write().await;
         let mut end_receiver = end_receiver.fuse();
         while let Some(bytes) = select! {
@@ -379,6 +546,7 @@ impl UdpProtocol {
                     ]);
                     let length = u16::from_le_bytes([bytes[17], bytes[18]]);
                     let mut data = vec![0; length as usize];
+                    throughput_cache.inc_by(length as i64);
                     data.copy_from_slice(&bytes[19..]);
                     Frame::Data { mid, start, data }
                 },
@@ -400,6 +568,10 @@ impl UdpProtocol {
         trace!("starting up udp write()");
         let mut buffer = [0u8; 2000];
         let mut metrics_cache = CidFrameCache::new(self.metrics.frames_wire_out_total.clone(), cid);
+        let throughput_cache = self
+            .metrics
+            .wire_out_throughput
+            .with_label_values(&[&cid.to_string()]);
         while let Some(frame) = to_wire_receiver.next().await {
             metrics_cache.with_label_values(&frame).inc();
             let len = match frame {
@@ -572,6 +744,7 @@ impl UdpProtocol {
                     for i in 0..data.len() {
                         buffer[19 + i] = data[i];
                     }
+                    throughput_cache.inc_by(data.len() as i64);
                     19 + data.len()
                 },
                 Frame::Raw(data) => {
diff --git a/network/src/scheduler.rs b/network/src/scheduler.rs
index 23f3bcd421..215e55f1bc 100644
--- a/network/src/scheduler.rs
+++ b/network/src/scheduler.rs
@@ -4,7 +4,7 @@ use crate::{
     metrics::NetworkMetrics,
     participant::BParticipant,
     protocols::{Protocols, TcpProtocol, UdpProtocol},
-    types::{Cid, Pid, Prio, Sid},
+    types::{Cid, Pid, Sid},
 };
 use async_std::{
     io, net,
@@ -51,12 +51,14 @@ struct ControlChannels {
     a2s_connect_r: mpsc::UnboundedReceiver<(Address, oneshot::Sender<io::Result<Participant>>)>,
     a2s_scheduler_shutdown_r: oneshot::Receiver<()>,
     a2s_disconnect_r: mpsc::UnboundedReceiver<(Pid, oneshot::Sender<async_std::io::Result<()>>)>,
+    b2s_prio_statistic_r: mpsc::UnboundedReceiver<(Pid, u64, u64)>,
 }
 
 #[derive(Debug, Clone)]
 struct ParticipantChannels {
     s2a_connected_s: mpsc::UnboundedSender<Participant>,
     a2s_disconnect_s: mpsc::UnboundedSender<(Pid, oneshot::Sender<async_std::io::Result<()>>)>,
+    b2s_prio_statistic_s: mpsc::UnboundedSender<(Pid, u64, u64)>,
 }
 
 #[derive(Debug)]
@@ -92,17 +94,20 @@ impl Scheduler {
         let (a2s_scheduler_shutdown_s, a2s_scheduler_shutdown_r) = oneshot::channel::<()>();
         let (a2s_disconnect_s, a2s_disconnect_r) =
             mpsc::unbounded::<(Pid, oneshot::Sender<async_std::io::Result<()>>)>();
+        let (b2s_prio_statistic_s, b2s_prio_statistic_r) = mpsc::unbounded::<(Pid, u64, u64)>();
 
         let run_channels = Some(ControlChannels {
             a2s_listen_r,
             a2s_connect_r,
             a2s_scheduler_shutdown_r,
             a2s_disconnect_r,
+            b2s_prio_statistic_r,
         });
 
         let participant_channels = ParticipantChannels {
             s2a_connected_s,
             a2s_disconnect_s,
+            b2s_prio_statistic_s,
         };
 
         let metrics = Arc::new(NetworkMetrics::new(&local_pid).unwrap());
@@ -140,7 +145,7 @@ impl Scheduler {
             self.listen_mgr(run_channels.a2s_listen_r),
             self.connect_mgr(run_channels.a2s_connect_r),
             self.disconnect_mgr(run_channels.a2s_disconnect_r),
-            self.prio_adj_mgr(),
+            self.prio_adj_mgr(run_channels.b2s_prio_statistic_r),
             self.scheduler_shutdown_mgr(run_channels.a2s_scheduler_shutdown_r),
         );
     }
@@ -151,7 +156,7 @@ impl Scheduler {
     ) {
         trace!("start listen_mgr");
         a2s_listen_r
-            .for_each_concurrent(None, |(address, s2a_result_s)| {
+            .for_each_concurrent(None, |(address, s2a_listen_result_s)| {
                 let address = address.clone();
 
                 async move {
@@ -169,7 +174,7 @@ impl Scheduler {
                         .write()
                         .await
                         .insert(address.clone(), end_sender);
-                    self.channel_creator(address, end_receiver, s2a_result_s)
+                    self.channel_creator(address, end_receiver, s2a_listen_result_s)
                         .await;
                 }
             })
@@ -275,9 +280,15 @@ impl Scheduler {
         trace!("stop disconnect_mgr");
     }
 
-    async fn prio_adj_mgr(&self) {
+    async fn prio_adj_mgr(
+        &self,
+        mut b2s_prio_statistic_r: mpsc::UnboundedReceiver<(Pid, u64, u64)>,
+    ) {
         trace!("start prio_adj_mgr");
-        //TODO adjust prios in participants here!
+        while let Some((_pid, _frame_cnt, _unused)) = b2s_prio_statistic_r.next().await {
+
+            //TODO adjust prios in participants here!
+        }
         trace!("stop prio_adj_mgr");
     }
 
@@ -300,14 +311,13 @@ impl Scheduler {
         }
         debug!("wait for partiticipants to be shut down");
         for (pid, recv) in waitings {
-            match recv.await {
-                Err(e) => error!(
+            if let Err(e) = recv.await {
+                error!(
                     ?pid,
                     ?e,
                     "failed to finish sending all remainding messages to participant when \
                      shutting down"
-                ),
-                _ => (),
+                );
             };
         }
         //removing the possibility to create new participants, needed to close down
@@ -499,7 +509,7 @@ impl Scheduler {
                             });
                             pool.spawn_ok(
                                 bparticipant
-                                    .run()
+                                    .run(participant_channels.b2s_prio_statistic_s)
                                     .instrument(tracing::info_span!("participant", ?pid)),
                             );
                             //create a new channel within BParticipant and wait for it to run
diff --git a/network/src/types.rs b/network/src/types.rs
index 88a64ce509..2d7855b7bc 100644
--- a/network/src/types.rs
+++ b/network/src/types.rs
@@ -240,6 +240,13 @@ impl From<u64> for Sid {
     fn from(internal: u64) -> Self { Sid { internal } }
 }
 
+impl std::fmt::Display for Sid {
+    #[inline]
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.internal)
+    }
+}
+
 #[inline]
 fn sixlet_to_str(sixlet: u128) -> char {
     match sixlet {
diff --git a/network/tests/closing.rs b/network/tests/closing.rs
new file mode 100644
index 0000000000..32125c94a7
--- /dev/null
+++ b/network/tests/closing.rs
@@ -0,0 +1,136 @@
+use async_std::task;
+use task::block_on;
+use veloren_network::StreamError;
+mod helper;
+use helper::{network_participant_stream, tcp};
+
+#[test]
+fn close_network() {
+    let (_, _) = helper::setup(false, 0);
+    let (_, _p1_a, mut s1_a, _, _p1_b, mut s1_b) = block_on(network_participant_stream(tcp()));
+
+    std::thread::sleep(std::time::Duration::from_millis(200));
+
+    assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed));
+    let msg1: Result<String, _> = block_on(s1_b.recv());
+    assert_eq!(msg1, Err(StreamError::StreamClosed));
+}
+
+#[test]
+fn close_participant() {
+    let (_, _) = helper::setup(false, 0);
+    let (n_a, p1_a, mut s1_a, n_b, p1_b, mut s1_b) = block_on(network_participant_stream(tcp()));
+
+    block_on(n_a.disconnect(p1_a)).unwrap();
+    block_on(n_b.disconnect(p1_b)).unwrap();
+
+    assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed));
+    assert_eq!(
+        block_on(s1_b.recv::<String>()),
+        Err(StreamError::StreamClosed)
+    );
+}
+
+#[test]
+fn close_stream() {
+    let (_, _) = helper::setup(false, 0);
+    let (_n_a, _, mut s1_a, _n_b, _, _) = block_on(network_participant_stream(tcp()));
+
+    // s1_b is dropped directly while s1_a isn't
+    std::thread::sleep(std::time::Duration::from_millis(200));
+
+    assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed));
+    assert_eq!(
+        block_on(s1_a.recv::<String>()),
+        Err(StreamError::StreamClosed)
+    );
+}
+
+#[test]
+fn stream_simple_3msg_then_close() {
+    let (_, _) = helper::setup(false, 0);
+    let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp()));
+
+    s1_a.send(1u8).unwrap();
+    s1_a.send(42).unwrap();
+    s1_a.send("3rdMessage").unwrap();
+    assert_eq!(block_on(s1_b.recv()), Ok(1u8));
+    assert_eq!(block_on(s1_b.recv()), Ok(42));
+    assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string()));
+    drop(s1_a);
+    std::thread::sleep(std::time::Duration::from_millis(200));
+    assert_eq!(s1_b.send("Hello World"), Err(StreamError::StreamClosed));
+}
+
+#[test]
+fn stream_send_first_then_receive() {
+    // recv should still be possible even if stream got closed if they are in queue
+    let (_, _) = helper::setup(false, 0);
+    let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp()));
+
+    s1_a.send(1u8).unwrap();
+    s1_a.send(42).unwrap();
+    s1_a.send("3rdMessage").unwrap();
+    drop(s1_a);
+    std::thread::sleep(std::time::Duration::from_millis(500));
+    assert_eq!(block_on(s1_b.recv()), Ok(1u8));
+    assert_eq!(block_on(s1_b.recv()), Ok(42));
+    assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string()));
+    assert_eq!(s1_b.send("Hello World"), Err(StreamError::StreamClosed));
+}
+
+#[test]
+fn stream_send_100000_then_close_stream() {
+    let (_, _) = helper::setup(false, 0);
+    let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp()));
+    for _ in 0..100000 {
+        s1_a.send("woop_PARTY_HARD_woop").unwrap();
+    }
+    drop(s1_a);
+    let exp = Ok("woop_PARTY_HARD_woop".to_string());
+    println!("start receiving");
+    block_on(async {
+        for _ in 0..100000 {
+            assert_eq!(s1_b.recv().await, exp);
+        }
+    });
+    println!("all received and done");
+}
+
+#[test]
+fn stream_send_100000_then_close_stream_remote() {
+    let (_, _) = helper::setup(false, 0);
+    let (_n_a, _, mut s1_a, _n_b, _, _s1_b) = block_on(network_participant_stream(tcp()));
+    for _ in 0..100000 {
+        s1_a.send("woop_PARTY_HARD_woop").unwrap();
+    }
+    drop(s1_a);
+    drop(_s1_b);
+    //no receiving
+}
+
+#[test]
+fn stream_send_100000_then_close_stream_remote2() {
+    let (_, _) = helper::setup(false, 0);
+    let (_n_a, _, mut s1_a, _n_b, _, _s1_b) = block_on(network_participant_stream(tcp()));
+    for _ in 0..100000 {
+        s1_a.send("woop_PARTY_HARD_woop").unwrap();
+    }
+    drop(_s1_b);
+    std::thread::sleep(std::time::Duration::from_millis(200));
+    drop(s1_a);
+    //no receiving
+}
+
+#[test]
+fn stream_send_100000_then_close_stream_remote3() {
+    let (_, _) = helper::setup(false, 0);
+    let (_n_a, _, mut s1_a, _n_b, _, _s1_b) = block_on(network_participant_stream(tcp()));
+    for _ in 0..100000 {
+        s1_a.send("woop_PARTY_HARD_woop").unwrap();
+    }
+    drop(_s1_b);
+    std::thread::sleep(std::time::Duration::from_millis(200));
+    drop(s1_a);
+    //no receiving
+}
diff --git a/network/tests/helper.rs b/network/tests/helper.rs
index f576324660..3970601aba 100644
--- a/network/tests/helper.rs
+++ b/network/tests/helper.rs
@@ -13,6 +13,7 @@ use tracing_subscriber::EnvFilter;
 use uvth::ThreadPoolBuilder;
 use veloren_network::{Address, Network, Participant, Pid, Stream, PROMISES_NONE};
 
+#[allow(dead_code)]
 pub fn setup(tracing: bool, mut sleep: u64) -> (u64, u64) {
     if tracing {
         sleep += 1000
@@ -48,6 +49,7 @@ pub fn setup(tracing: bool, mut sleep: u64) -> (u64, u64) {
     (0, 0)
 }
 
+#[allow(dead_code)]
 pub async fn network_participant_stream(
     addr: Address,
 ) -> (
@@ -72,6 +74,7 @@ pub async fn network_participant_stream(
     (n_a, p1_a, s1_a, n_b, p1_b, s1_b)
 }
 
+#[allow(dead_code)]
 pub fn tcp() -> veloren_network::Address {
     lazy_static! {
         static ref PORTS: AtomicU16 = AtomicU16::new(5000);
@@ -80,6 +83,7 @@ pub fn tcp() -> veloren_network::Address {
     veloren_network::Address::Tcp(SocketAddr::from(([127, 0, 0, 1], port)))
 }
 
+#[allow(dead_code)]
 pub fn udp() -> veloren_network::Address {
     lazy_static! {
         static ref PORTS: AtomicU16 = AtomicU16::new(5000);
diff --git a/network/tests/integration.rs b/network/tests/integration.rs
index 0f0d489560..92ef6aaa8c 100644
--- a/network/tests/integration.rs
+++ b/network/tests/integration.rs
@@ -1,9 +1,11 @@
 use async_std::task;
 use task::block_on;
-use veloren_network::{NetworkError, StreamError};
+use veloren_network::NetworkError;
 mod helper;
 use helper::{network_participant_stream, tcp, udp};
 use std::io::ErrorKind;
+use uvth::ThreadPoolBuilder;
+use veloren_network::{Address, Network, Pid, PROMISES_CONSISTENCY, PROMISES_ORDERED};
 
 #[test]
 #[ignore]
@@ -13,49 +15,6 @@ fn network_20s() {
     std::thread::sleep(std::time::Duration::from_secs(30));
 }
 
-#[test]
-fn close_network() {
-    let (_, _) = helper::setup(false, 0);
-    let (_, _p1_a, mut s1_a, _, _p1_b, mut s1_b) = block_on(network_participant_stream(tcp()));
-
-    std::thread::sleep(std::time::Duration::from_millis(30));
-
-    assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed));
-    let msg1: Result<String, _> = block_on(s1_b.recv());
-    assert_eq!(msg1, Err(StreamError::StreamClosed));
-}
-
-#[test]
-fn close_participant() {
-    let (_, _) = helper::setup(false, 0);
-    let (n_a, p1_a, mut s1_a, n_b, p1_b, mut s1_b) = block_on(network_participant_stream(tcp()));
-
-    block_on(n_a.disconnect(p1_a)).unwrap();
-    block_on(n_b.disconnect(p1_b)).unwrap();
-
-    std::thread::sleep(std::time::Duration::from_millis(30));
-    assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed));
-    assert_eq!(
-        block_on(s1_b.recv::<String>()),
-        Err(StreamError::StreamClosed)
-    );
-}
-
-#[test]
-fn close_stream() {
-    let (_, _) = helper::setup(false, 0);
-    let (_n_a, _, mut s1_a, _n_b, _, _) = block_on(network_participant_stream(tcp()));
-
-    // s1_b is dropped directly while s1_a isn't
-    std::thread::sleep(std::time::Duration::from_millis(30));
-
-    assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed));
-    assert_eq!(
-        block_on(s1_a.recv::<String>()),
-        Err(StreamError::StreamClosed)
-    );
-}
-
 #[test]
 fn stream_simple() {
     let (_, _) = helper::setup(false, 0);
@@ -78,39 +37,6 @@ fn stream_simple_3msg() {
     assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string()));
 }
 
-#[test]
-fn stream_simple_3msg_then_close() {
-    let (_, _) = helper::setup(false, 0);
-    let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp()));
-
-    s1_a.send(1u8).unwrap();
-    s1_a.send(42).unwrap();
-    s1_a.send("3rdMessage").unwrap();
-    assert_eq!(block_on(s1_b.recv()), Ok(1u8));
-    assert_eq!(block_on(s1_b.recv()), Ok(42));
-    assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string()));
-    drop(s1_a);
-    std::thread::sleep(std::time::Duration::from_millis(30));
-    assert_eq!(s1_b.send("Hello World"), Err(StreamError::StreamClosed));
-}
-
-#[test]
-fn stream_send_first_then_receive() {
-    // recv should still be possible even if stream got closed if they are in queue
-    let (_, _) = helper::setup(false, 0);
-    let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp()));
-
-    s1_a.send(1u8).unwrap();
-    s1_a.send(42).unwrap();
-    s1_a.send("3rdMessage").unwrap();
-    drop(s1_a);
-    std::thread::sleep(std::time::Duration::from_millis(500));
-    assert_eq!(block_on(s1_b.recv()), Ok(1u8));
-    assert_eq!(block_on(s1_b.recv()), Ok(42));
-    assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string()));
-    assert_eq!(s1_b.send("Hello World"), Err(StreamError::StreamClosed));
-}
-
 #[test]
 fn stream_simple_udp() {
     let (_, _) = helper::setup(false, 0);
@@ -133,8 +59,6 @@ fn stream_simple_udp_3msg() {
     assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string()));
 }
 
-use uvth::ThreadPoolBuilder;
-use veloren_network::{Address, Network, Pid};
 #[test]
 #[ignore]
 fn tcp_and_udp_2_connections() -> std::result::Result<(), Box<dyn std::error::Error>> {
@@ -167,7 +91,7 @@ fn failed_listen_on_used_ports() -> std::result::Result<(), Box<dyn std::error::
     let tcp1 = tcp();
     block_on(network.listen(udp1.clone()))?;
     block_on(network.listen(tcp1.clone()))?;
-    std::thread::sleep(std::time::Duration::from_millis(50));
+    std::thread::sleep(std::time::Duration::from_millis(200));
 
     let network2 = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
     let e1 = block_on(network2.listen(udp1));
@@ -182,3 +106,59 @@ fn failed_listen_on_used_ports() -> std::result::Result<(), Box<dyn std::error::
     };
     Ok(())
 }
+
+/// There is a bug an impris-desktop-1 which fails the DOC tests,
+/// it fails exactly `api_stream_send_main` and `api_stream_recv_main` by
+/// deadlocking at different times!
+/// So i rather put the same test into a unit test, as my gues is that it's
+/// compiler related
+#[test]
+fn api_stream_send_main() -> std::result::Result<(), Box<dyn std::error::Error>> {
+    let (_, _) = helper::setup(false, 0);
+    // Create a Network, listen on Port `2200` and wait for a Stream to be opened,
+    // then answer `Hello World`
+    let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
+    let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
+    block_on(async {
+        network
+            .listen(Address::Tcp("127.0.0.1:2200".parse().unwrap()))
+            .await?;
+        let remote_p = remote
+            .connect(Address::Tcp("127.0.0.1:2200".parse().unwrap()))
+            .await?;
+        remote_p
+            .open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY)
+            .await?;
+        let participant_a = network.connected().await?;
+        let mut stream_a = participant_a.opened().await?;
+        //Send  Message
+        stream_a.send("Hello World")?;
+        Ok(())
+    })
+}
+
+#[test]
+fn api_stream_recv_main() -> std::result::Result<(), Box<dyn std::error::Error>> {
+    let (_, _) = helper::setup(false, 0);
+    // Create a Network, listen on Port `2220` and wait for a Stream to be opened,
+    // then listen on it
+    let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
+    let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None);
+    block_on(async {
+        network
+            .listen(Address::Tcp("127.0.0.1:2220".parse().unwrap()))
+            .await?;
+        let remote_p = remote
+            .connect(Address::Tcp("127.0.0.1:2220".parse().unwrap()))
+            .await?;
+        let mut stream_p = remote_p
+            .open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY)
+            .await?;
+        stream_p.send("Hello World")?;
+        let participant_a = network.connected().await?;
+        let mut stream_a = participant_a.opened().await?;
+        //Send  Message
+        println!("{}", stream_a.recv::<String>().await?);
+        Ok(())
+    })
+}