diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..fd34c26
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+**/node_modules/
+**/*.log
+package-lock.json
+
+# Coverage directory used by tools like istanbul
+coverage
+docs
+dist
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..59335fd
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,34 @@
+**/node_modules/
+**/*.log
+test/repo-tests*
+
+# Logs
+logs
+*.log
+
+coverage
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# node-waf configuration
+.lock-wscript
+
+build
+
+# Dependency directory
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
+node_modules
+
+test
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..89d4354
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+sudo: false
+language: node_js
+node_js:
+ - "10"
+
+before_install:
+ - npm install -g npm
+
+script:
+ - npm run lint
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..ec01b39
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,171 @@
+
+# [0.7.0](https://github.com/libp2p/interface-transport/compare/v0.6.1...v0.7.0) (2019-09-19)
+
+
+### Features
+
+* timeline and close checking ([#55](https://github.com/libp2p/interface-transport/issues/55)) ([993ca1c](https://github.com/libp2p/interface-transport/commit/993ca1c))
+
+
+
+
+## [0.6.1](https://github.com/libp2p/interface-transport/compare/v0.6.0...v0.6.1) (2019-09-16)
+
+
+### Bug Fixes
+
+* **test:** close with timeout ([#54](https://github.com/libp2p/interface-transport/issues/54)) ([583f02d](https://github.com/libp2p/interface-transport/commit/583f02d))
+
+
+
+
+# [0.6.0](https://github.com/libp2p/interface-transport/compare/v0.5.2...v0.6.0) (2019-09-06)
+
+
+### Features
+
+* add upgrader support to transports ([#53](https://github.com/libp2p/interface-transport/issues/53)) ([a5ad120](https://github.com/libp2p/interface-transport/commit/a5ad120))
+
+
+### BREAKING CHANGES
+
+* Transports must now be passed and use an `Upgrader` instance. See the Readme for usage. Compliance test suites will now need to pass `options` from `common.setup(options)` to their Transport constructor.
+
+* docs: update readme to include upgrader
+
+* docs: update readme to include MultiaddrConnection ref
+
+* feat: add upgrader spy to test suite
+
+* test: validate returned value of spy
+
+
+
+
+## [0.5.2](https://github.com/libp2p/interface-transport/compare/v0.5.1...v0.5.2) (2019-06-11)
+
+
+
+
+## [0.5.1](https://github.com/libp2p/interface-transport/compare/v0.5.0...v0.5.1) (2019-05-01)
+
+
+### Bug Fixes
+
+* move dirty-chai to dependencies ([#52](https://github.com/libp2p/interface-transport/issues/52)) ([f9a7908](https://github.com/libp2p/interface-transport/commit/f9a7908))
+
+
+
+
+# [0.5.0](https://github.com/libp2p/interface-transport/compare/v0.4.0...v0.5.0) (2019-04-29)
+
+
+### Reverts
+
+* "feat: make listen take an array of addrs ([#46](https://github.com/libp2p/interface-transport/issues/46))" ([#51](https://github.com/libp2p/interface-transport/issues/51)) ([030195e](https://github.com/libp2p/interface-transport/commit/030195e))
+
+
+
+
+# [0.4.0](https://github.com/libp2p/interface-transport/compare/v0.3.7...v0.4.0) (2019-04-19)
+
+
+### Features
+
+* add type to AbortError ([#45](https://github.com/libp2p/interface-transport/issues/45)) ([4fd37bb](https://github.com/libp2p/interface-transport/commit/4fd37bb))
+* callbacks -> async / await ([#44](https://github.com/libp2p/interface-transport/issues/44)) ([b30ee5f](https://github.com/libp2p/interface-transport/commit/b30ee5f))
+* make listen take an array of addrs ([#46](https://github.com/libp2p/interface-transport/issues/46)) ([1dc5baa](https://github.com/libp2p/interface-transport/commit/1dc5baa))
+
+
+### BREAKING CHANGES
+
+* All places in the API that used callbacks are now replaced with async/await
+
+* test: add tests for canceling dials
+
+* feat: Adapter class
+
+
+
+
+## [0.3.7](https://github.com/libp2p/interface-transport/compare/v0.3.6...v0.3.7) (2018-11-29)
+
+
+
+
+## [0.3.6](https://github.com/libp2p/interface-transport/compare/v0.3.5...v0.3.6) (2018-04-05)
+
+
+
+
+## [0.3.5](https://github.com/libp2p/interface-transport/compare/v0.3.4...v0.3.5) (2017-03-21)
+
+
+### Bug Fixes
+
+* wrong main path in package.json ([54b83a7](https://github.com/libp2p/interface-transport/commit/54b83a7))
+
+
+
+
+## [0.3.4](https://github.com/libp2p/interface-transport/compare/v0.3.3...v0.3.4) (2017-02-09)
+
+
+
+
+## [0.3.3](https://github.com/libp2p/interface-transport/compare/v0.3.2...v0.3.3) (2016-09-06)
+
+
+
+
+## [0.3.2](https://github.com/libp2p/interface-transport/compare/v0.3.1...v0.3.2) (2016-09-06)
+
+
+### Bug Fixes
+
+* **dial-test:** ensure goodbye works over tcp ([e1346da](https://github.com/libp2p/interface-transport/commit/e1346da))
+
+
+
+
+## [0.3.1](https://github.com/libp2p/interface-transport/compare/v0.3.0...v0.3.1) (2016-09-05)
+
+
+### Bug Fixes
+
+* **package.json:** point to right main ([ace6150](https://github.com/libp2p/interface-transport/commit/ace6150))
+
+
+
+
+# [0.3.0](https://github.com/libp2p/interface-transport/compare/v0.2.0...v0.3.0) (2016-09-05)
+
+
+### Bug Fixes
+
+* **tests:** add place holder test script for releases ([8e9f7cf](https://github.com/libp2p/interface-transport/commit/8e9f7cf))
+
+
+### Features
+
+* **dialer:** remove conn from on connect callback ([1bd20d9](https://github.com/libp2p/interface-transport/commit/1bd20d9))
+* **spec:** update the dial interface to cope with new pull additions ([2e12166](https://github.com/libp2p/interface-transport/commit/2e12166))
+* **tests:** add dial and listen tests ([d50224d](https://github.com/libp2p/interface-transport/commit/d50224d))
+
+
+
+
+# [0.2.0](https://github.com/libp2p/interface-transport/compare/v0.1.1...v0.2.0) (2016-06-16)
+
+
+
+
+## [0.1.1](https://github.com/libp2p/interface-transport/compare/v0.1.0...v0.1.1) (2015-12-12)
+
+
+
+
+# 0.1.0 (2015-09-17)
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..59a33ba
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 David Dias
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5c7fe49
--- /dev/null
+++ b/README.md
@@ -0,0 +1,227 @@
+interface-transport
+===================
+
+[](http://protocol.ai)
+[](http://libp2p.io/)
+[](http://webchat.freenode.net/?channels=%23libp2p)
+[](https://discuss.libp2p.io)
+[](https://travis-ci.com/libp2p/interface-transport)
+[](https://david-dm.org/libp2p/interface-transport)
+[](https://github.com/feross/standard)
+
+> A test suite and interface you can use to implement a libp2p transport. A libp2p transport is understood as something that offers a dial and listen interface.
+
+The primary goal of this module is to enable developers to pick and swap their transport module as they see fit for their libp2p installation, without having to go through shims or compatibility issues. This module and test suite were heavily inspired by abstract-blob-store, interface-stream-muxer and others.
+
+Publishing a test suite as a module lets multiple modules all ensure compatibility since they use the same test suite.
+
+The purpose of this interface is not to reinvent any wheels when it comes to dialing and listening to transports. Instead, it tries to provide a uniform API for several transports through a shimmed interface.
+
+## Lead Maintainer
+
+[Jacob Heun](https://github.com/jacobheun/)
+
+# Modules that implement the interface
+
+- [js-libp2p-tcp](https://github.com/libp2p/js-libp2p-tcp)
+- [js-libp2p-webrtc-star](https://github.com/libp2p/js-libp2p-webrtc-star)
+- [js-libp2p-webrtc-direct](https://github.com/libp2p/js-libp2p-webrtc-direct)
+- [js-libp2p-websocket-star](https://github.com/libp2p/js-libp2p-websocket-star)
+- [js-libp2p-websockets](https://github.com/libp2p/js-libp2p-websockets)
+- [js-libp2p-utp](https://github.com/libp2p/js-libp2p-utp)
+- [webrtc-explorer](https://github.com/diasdavid/webrtc-explorer)
+
+# Badge
+
+Include this badge in your readme if you make a module that is compatible with the interface-transport API. You can validate this by running the tests.
+
+
+
+# How to use the battery of tests
+
+## Node.js
+
+```js
+/* eslint-env mocha */
+'use strict'
+
+const tests = require('interface-transport')
+const multiaddr = require('multiaddr')
+const YourTransport = require('../src')
+
+describe('compliance', () => {
+ tests({
+ setup (options) {
+ let transport = new YourTransport(options)
+
+ const addrs = [
+ multiaddr('valid-multiaddr-for-your-transport'),
+ multiaddr('valid-multiaddr2-for-your-transport')
+ ]
+
+ const network = require('my-network-lib')
+ const connect = network.connect
+ const connector = {
+ delay (delayMs) {
+ // Add a delay in the connection mechanism for the transport
+ // (this is used by the dial tests)
+ network.connect = (...args) => setTimeout(() => connect(...args), delayMs)
+ },
+ restore () {
+ // Restore the connection mechanism to normal
+ network.connect = connect
+ }
+ }
+
+ return { transport, addrs, connector }
+ },
+ teardown () {
+ // Clean up any resources created by setup()
+ }
+ })
+})
+```
+
+# API
+
+A valid transport (one that follows the interface defined) must implement the following API:
+
+**Table of contents:**
+
+- type: `Transport`
+ - `new Transport({ upgrader, ...[options] })`
+ - ` transport.dial(multiaddr, [options])`
+ - ` transport.filter(multiaddrs)`
+ - `transport.createListener([options], handlerFunction)`
+ - type: `transport.Listener`
+ - event: 'listening'
+ - event: 'close'
+ - event: 'connection'
+ - event: 'error'
+ - ` listener.listen(multiaddr)`
+ - `listener.getAddrs()`
+ - ` listener.close([options])`
+
+### Types
+
+#### Upgrader
+Upgraders have 2 methods: `upgradeOutbound` and `upgradeInbound`.
+- `upgradeOutbound` must be called and returned by `transport.dial`.
+- `upgradeInbound` must be called and the results must be passed to the `createListener` `handlerFunction` and the `connection` event handler, anytime a new connection is created.
+
+```js
+const connection = await upgrader.upgradeOutbound(multiaddrConnection)
+const connection = await upgrader.upgradeInbound(multiaddrConnection)
+```
+
+The `Upgrader` methods take a [MultiaddrConnection](#multiaddrconnection) and will return an `interface-connection` instance.
+
+#### MultiaddrConnection
+
+- `MultiaddrConnection`
+ - `sink`: A [streaming iterable sink](https://gist.github.com/alanshaw/591dc7dd54e4f99338a347ef568d6ee9#sink-it)
+ - `source`: A [streaming iterable source](https://gist.github.com/alanshaw/591dc7dd54e4f99338a347ef568d6ee9#source-it)
+ - `close`: A method for closing the connection
+ - `conn`: The raw connection of the transport, such as a TCP socket.
+ - `remoteAddr`: The remote `Multiaddr` of the connection.
+ - `[localAddr]`: An optional local `Multiaddr` of the connection.
+ - `timeline