Repository: hyperledger/quilt
Pull request #252 (2019-09-13 19:47:42)

Add STREAM Codecs (STREAM-PR2)
* Rename `codec-framework` to `codecs-framework`
* Add `codecs-stream` to the project.

Signed-off-by: David Fuelling <sappenin@gmail.com>

codecov-io: # [Codecov](https://codecov.io/gh/hyperledger/quilt/pull/252?src=pr&el=h1) Report
> Merging [#252](https://codecov.io/gh/hyperledger/quilt/pull/252?src=pr&el=desc) into [df/stream-pr1-stream-core](https://codecov.io/gh/hyperledger/quilt/commit/6655b287c5ef7fb220c4d1f3e62d4e848a85cfd9?src=pr&el=desc) will **increase** coverage by `1.4%`.
> The diff coverage is `83.14%`.

[![Impacted file tree graph](https://codecov.io/gh/hyperledger/quilt/pull/252/graphs/tree.svg?width=650&token=XEfCq6zC6W&height=150&src=pr)](https://codecov.io/gh/hyperledger/quilt/pull/252?src=pr&el=tree)

```diff
@@                      Coverage Diff                       @@
##             df/stream-pr1-stream-core     #252     +/-   ##
==============================================================
+ Coverage                        68.35%   69.76%   +1.4%     
- Complexity                         408      480     +72     
==============================================================
  Files                              139      174     +35     
  Lines                             2010     2249    +239     
  Branches                           160      164      +4     
==============================================================
+ Hits                              1374     1569    +195     
- Misses                             565      606     +41     
- Partials                            71       74      +3
```


| [Impacted Files](https://codecov.io/gh/hyperledger/quilt/pull/252?src=pr&el=tree) | Coverage Δ | Complexity Δ | |
|---|---|---|---|
| [...g/asn/framework/AsnObjectSerializationContext.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvb3JnL2ludGVybGVkZ2VyL2VuY29kaW5nL2Fzbi9mcmFtZXdvcmsvQXNuT2JqZWN0U2VyaWFsaXphdGlvbkNvbnRleHQuamF2YQ==) | `67.34% <ø> (ø)` | `9 <0> (?)` | |
| [...oding/asn/codecs/AsnIA5StringBasedObjectCodec.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvb3JnL2ludGVybGVkZ2VyL2VuY29kaW5nL2Fzbi9jb2RlY3MvQXNuSUE1U3RyaW5nQmFzZWRPYmplY3RDb2RlYy5qYXZh) | `0% <ø> (ø)` | `0 <0> (?)` | |
| [...r/encoding/asn/codecs/AsnPrintableStringCodec.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvb3JnL2ludGVybGVkZ2VyL2VuY29kaW5nL2Fzbi9jb2RlY3MvQXNuUHJpbnRhYmxlU3RyaW5nQ29kZWMuamF2YQ==) | `0% <ø> (ø)` | `0 <0> (?)` | |
| [...rledger/codecs/ildcp/IldcpCodecContextFactory.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtaWxkY3Avc3JjL21haW4vamF2YS9vcmcvaW50ZXJsZWRnZXIvY29kZWNzL2lsZGNwL0lsZGNwQ29kZWNDb250ZXh0RmFjdG9yeS5qYXZh) | `88.88% <ø> (ø)` | `2 <0> (?)` | |
| [...nterledger/codecs/ildcp/AsnIldcpResponseCodec.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtaWxkY3Avc3JjL21haW4vamF2YS9vcmcvaW50ZXJsZWRnZXIvY29kZWNzL2lsZGNwL0FzbklsZGNwUmVzcG9uc2VDb2RlYy5qYXZh) | `100% <ø> (ø)` | `3 <0> (?)` | |
| [...rledger/encoding/asn/framework/CodecException.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvb3JnL2ludGVybGVkZ2VyL2VuY29kaW5nL2Fzbi9mcmFtZXdvcmsvQ29kZWNFeGNlcHRpb24uamF2YQ==) | `33.33% <ø> (ø)` | `1 <0> (?)` | |
| [...rledger/codecs/ilp/AsnInterledgerAddressCodec.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtaWxwL3NyYy9tYWluL2phdmEvb3JnL2ludGVybGVkZ2VyL2NvZGVjcy9pbHAvQXNuSW50ZXJsZWRnZXJBZGRyZXNzQ29kZWMuamF2YQ==) | `100% <ø> (ø)` | `6 <0> (?)` | |
| [...rledger/encoding/asn/codecs/AsnIA5StringCodec.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvb3JnL2ludGVybGVkZ2VyL2VuY29kaW5nL2Fzbi9jb2RlY3MvQXNuSUE1U3RyaW5nQ29kZWMuamF2YQ==) | `0% <ø> (ø)` | `0 <0> (?)` | |
| [...rg/interledger/codecs/btp/AsnBtpResponseCodec.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtYnRwL3NyYy9tYWluL2phdmEvb3JnL2ludGVybGVkZ2VyL2NvZGVjcy9idHAvQXNuQnRwUmVzcG9uc2VDb2RlYy5qYXZh) | `100% <ø> (ø)` | `1 <0> (?)` | |
| [...nterledger/encoding/asn/codecs/AsnUint16Codec.java](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree#diff-Y29kZWNzLXBhcmVudC9jb2RlY3MtZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvb3JnL2ludGVybGVkZ2VyL2VuY29kaW5nL2Fzbi9jb2RlY3MvQXNuVWludDE2Q29kZWMuamF2YQ==) | `82.35% <ø> (ø)` | `6 <0> (?)` | |
| ... and [127 more](https://codecov.io/gh/hyperledger/quilt/pull/252/diff?src=pr&el=tree-more) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/hyperledger/quilt/pull/252?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/hyperledger/quilt/pull/252?src=pr&el=footer). Last update [6655b28...5a1469d](https://codecov.io/gh/hyperledger/quilt/pull/252?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

sappenin: This PR depends on #244. That should be merged to `master` first, and then we can change the target of this PR to `master`.

Patch:
diff --git a/btp-core/pom.xml b/btp-core/pom.xml
index 7b19ea8..f2a49fd 100644
--- a/btp-core/pom.xml
+++ b/btp-core/pom.xml
@@ -23,7 +23,7 @@
     </dependency>
     <dependency>
       <groupId>org.interledger</groupId>
-      <artifactId>codec-framework</artifactId>
+      <artifactId>codecs-framework</artifactId>
     </dependency>
     <dependency>
       <groupId>org.immutables</groupId>
diff --git a/codecs/codecs-btp/pom.xml b/codecs-parent/codecs-btp/pom.xml
similarity index 95%
rename from codecs/codecs-btp/pom.xml
rename to codecs-parent/codecs-btp/pom.xml
index 64c78f0..73825a2 100644
--- a/codecs/codecs-btp/pom.xml
+++ b/codecs-parent/codecs-btp/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>codecs</artifactId>
     <groupId>org.interledger</groupId>
+    <artifactId>codecs-parent</artifactId>
     <version>0.18.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpErrorCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpErrorCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpErrorCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpErrorCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpErrorDataCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpErrorDataCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpErrorDataCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpErrorDataCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpGeneralizedTimeCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpGeneralizedTimeCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpGeneralizedTimeCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpGeneralizedTimeCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpMessageCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpMessageCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpMessageCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpMessageCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpMessageDataCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpMessageDataCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpMessageDataCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpMessageDataCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpPacketCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpPacketCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpPacketCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpPacketCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpPacketDataCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpPacketDataCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpPacketDataCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpPacketDataCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpResponseCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpResponseCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpResponseCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpResponseCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpResponseDataCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpResponseDataCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpResponseDataCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpResponseDataCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpSubProtocolCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpSubProtocolCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpSubProtocolCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpSubProtocolCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpSubProtocolsCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpSubProtocolsCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpSubProtocolsCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpSubProtocolsCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpTransferCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpTransferCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpTransferCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpTransferCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpTransferDataCodec.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpTransferDataCodec.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpTransferDataCodec.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/AsnBtpTransferDataCodec.java
diff --git a/codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/BtpCodecContextFactory.java b/codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/BtpCodecContextFactory.java
similarity index 100%
rename from codecs/codecs-btp/src/main/java/org/interledger/codecs/btp/BtpCodecContextFactory.java
rename to codecs-parent/codecs-btp/src/main/java/org/interledger/codecs/btp/BtpCodecContextFactory.java
diff --git a/codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpErrorDataCodecTest.java b/codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpErrorDataCodecTest.java
similarity index 100%
rename from codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpErrorDataCodecTest.java
rename to codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpErrorDataCodecTest.java
diff --git a/codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpErrorDataSerializationTest.java b/codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpErrorDataSerializationTest.java
similarity index 100%
rename from codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpErrorDataSerializationTest.java
rename to codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpErrorDataSerializationTest.java
diff --git a/codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpGeneralizedTimeCodecTest.java b/codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpGeneralizedTimeCodecTest.java
similarity index 100%
rename from codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpGeneralizedTimeCodecTest.java
rename to codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpGeneralizedTimeCodecTest.java
diff --git a/codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantBadValuesDecodingTest.java b/codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantBadValuesDecodingTest.java
similarity index 100%
rename from codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantBadValuesDecodingTest.java
rename to codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantBadValuesDecodingTest.java
diff --git a/codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantSerializationBytesTest.java b/codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantSerializationBytesTest.java
similarity index 100%
rename from codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantSerializationBytesTest.java
rename to codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantSerializationBytesTest.java
diff --git a/codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantSerializationTest.java b/codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantSerializationTest.java
similarity index 100%
rename from codecs/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantSerializationTest.java
rename to codecs-parent/codecs-btp/src/test/java/org/interledger/codecs/btp/AsnBtpInstantSerializationTest.java
diff --git a/codecs/codec-framework/README.md b/codecs-parent/codecs-framework/README.md
similarity index 100%
rename from codecs/codec-framework/README.md
rename to codecs-parent/codecs-framework/README.md
diff --git a/codecs/codec-framework/pom.xml b/codecs-parent/codecs-framework/pom.xml
similarity index 79%
rename from codecs/codec-framework/pom.xml
rename to codecs-parent/codecs-framework/pom.xml
index c18a378..f855b3e 100644
--- a/codecs/codec-framework/pom.xml
+++ b/codecs-parent/codecs-framework/pom.xml
@@ -1,21 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>codecs</artifactId>
     <groupId>org.interledger</groupId>
+    <artifactId>codecs-parent</artifactId>
     <version>0.18.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
   <name>Quilt :: Codecs :: Framework</name>
   <description>A framework for writing codecContext.</description>
-  <artifactId>codec-framework</artifactId>
+  <artifactId>codecs-framework</artifactId>
   <packaging>jar</packaging>
 
   <dependencies>
 
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+    </dependency>
+
     <dependency>
       <groupId>org.immutables</groupId>
       <artifactId>value</artifactId>
@@ -39,12 +44,6 @@
       <scope>test</scope>
     </dependency>
 
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <scope>test</scope>
-    </dependency>
-
   </dependencies>
 
 </project>
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnCharStringBasedObjectCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnCharStringBasedObjectCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnCharStringBasedObjectCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnCharStringBasedObjectCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnIA5StringBasedObjectCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnIA5StringBasedObjectCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnIA5StringBasedObjectCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnIA5StringBasedObjectCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnIA5StringCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnIA5StringCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnIA5StringCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnIA5StringCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnObjectCodecBase.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnObjectCodecBase.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnObjectCodecBase.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnObjectCodecBase.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodec.java
similarity index 94%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodec.java
index 6a793d8..4770590 100644
--- a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodec.java
+++ b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodec.java
@@ -9,9 +9,9 @@ package org.interledger.encoding.asn.codecs;
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -27,7 +27,6 @@ import org.interledger.encoding.asn.framework.CodecException;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.Objects;
-import java.util.function.Predicate;
 
 /**
  * ASN.1 object codec that uses a byte array string as an intermediary encoding.
@@ -36,16 +35,16 @@ import java.util.function.Predicate;
  * octet string or integer.
  *
  * <p>Codecs that extend this object can call {@link #getBytes()} and
- * {@link #setBytes(byte[])} in their implementations of {@link #decode()} and
- * {@link #encode(Object)} respectively.
+ * {@link #setBytes(byte[])} in their implementations of {@link #decode()} and {@link #encode(Object)} respectively.
  *
  * <p>The serializers for this object must call {@link #getBytes()} and
- * {@link #setBytes(byte[])} when reading from a stream. The values passed and returned must not
- * contain any length prefixes or tags.
- *
+ * {@link #setBytes(byte[])} when reading from a stream. The values passed and returned must not contain any length
+ * prefixes or tags.
  */
 public abstract class AsnOctetStringBasedObjectCodec<T> extends AsnPrimitiveCodec<T> {
 
+  protected static final byte[] EMPTY_BYTES = new byte[0];
+
   private byte[] bytes;
 
   public AsnOctetStringBasedObjectCodec(AsnSizeConstraint sizeConstraintInOctets) {
@@ -70,7 +69,7 @@ public abstract class AsnOctetStringBasedObjectCodec<T> extends AsnPrimitiveCode
    * @return the internal byte array representation of this object.
    */
   public final byte[] getBytes() {
-    return bytes;
+    return bytes == null ? EMPTY_BYTES : bytes;
   }
 
   /**
@@ -83,6 +82,7 @@ public abstract class AsnOctetStringBasedObjectCodec<T> extends AsnPrimitiveCode
    * {@link CodecException} will be thrown if it is invalid
    *
    * @param bytes the {@link String} representing the value of this object
+   *
    * @throws CodecException if the provided charString fails validation
    */
   public final void setBytes(byte[] bytes) {
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOctetStringCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOpenTypeCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOpenTypeCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOpenTypeCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnOpenTypeCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrimitiveCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrimitiveCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrimitiveCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrimitiveCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrintableStringBasedObjectCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrintableStringBasedObjectCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrintableStringBasedObjectCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrintableStringBasedObjectCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrintableStringCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrintableStringCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrintableStringCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnPrintableStringCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSequenceCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSequenceCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSequenceCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSequenceCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSequenceOfSequenceCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSequenceOfSequenceCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSequenceOfSequenceCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSequenceOfSequenceCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSizeConstraint.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSizeConstraint.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSizeConstraint.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnSizeConstraint.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint16Codec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint16Codec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint16Codec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint16Codec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint32Codec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint32Codec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint32Codec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint32Codec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64Codec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64Codec.java
similarity index 91%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64Codec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64Codec.java
index f432a90..2643b76 100644
--- a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64Codec.java
+++ b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64Codec.java
@@ -9,9 +9,9 @@ package org.interledger.encoding.asn.codecs;
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -25,7 +25,12 @@ import java.math.BigInteger;
 
 /**
  * An ASN.1 codec for UInt64 objects that decodes them into {@link BigInteger} values..
+ *
+ * @see "https://github.com/hyperledger/quilt/issues/201"
+ * @deprecated Unsigned 64bit Integers should use UnsignedLong. This will be replaced by AsnUint64CodecUL as part of
+ *     #201.
  */
+@Deprecated
 public class AsnUint64Codec extends AsnOctetStringBasedObjectCodec<BigInteger> {
 
   public AsnUint64Codec() {
diff --git a/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64CodecUL.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64CodecUL.java
new file mode 100644
index 0000000..060744d
--- /dev/null
+++ b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint64CodecUL.java
@@ -0,0 +1,55 @@
+package org.interledger.encoding.asn.codecs;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Codec Framework
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import com.google.common.primitives.UnsignedLong;
+
+/**
+ * An ASN.1 codec for UInt64 objects that decodes them into {@link UnsignedLong} values.
+ */
+public class AsnUint64CodecUL extends AsnOctetStringBasedObjectCodec<UnsignedLong> {
+
+  public AsnUint64CodecUL() {
+    super(new AsnSizeConstraint(8));
+  }
+
+  @Override
+  public UnsignedLong decode() {
+    byte[] bytes = getBytes();
+    long value = 0;
+    for (int i = 0; i <= 7; i++) {
+      value <<= Byte.SIZE;
+      value |= (bytes[i] & 0xFF);
+    }
+
+    return UnsignedLong.fromLongBits(value);
+  }
+
+  @Override
+  public void encode(UnsignedLong value) {
+    byte[] bytes = new byte[8];
+    for (int i = 0; i <= 7; i++) {
+      bytes[i] = ((byte) ((value.longValue() >> (Byte.SIZE * (7 - i))) & 0xFF));
+    }
+    setBytes(bytes);
+  }
+
+}
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint8Codec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint8Codec.java
similarity index 96%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint8Codec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint8Codec.java
index 14fe681..5d68547 100644
--- a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint8Codec.java
+++ b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUint8Codec.java
@@ -33,7 +33,9 @@ public class AsnUint8Codec extends AsnOctetStringBasedObjectCodec<Short> {
   public Short decode() {
     byte[] bytes = getBytes();
     short value = (short) 0;
-    value |= (bytes[0] & 0xFF);
+    if (bytes.length > 0) {
+      value |= (bytes[0] & 0xFF);
+    }
     return value;
   }
 
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodec.java
similarity index 93%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodec.java
index d426788..bce6b18 100644
--- a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodec.java
+++ b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodec.java
@@ -27,10 +27,8 @@ import java.math.BigInteger;
  * <p>An ASN.1 codec for a variable-size ASN.1 OER integer type, backed by {@link BigInteger}.</p>
  *
  * <p>Per the OER definitions, the integer value is encoded as a length prefix, followed by an
- * unsigned binary integer occupying a variable number of octets; the length prefix contains the
- * number of subsequent octets.</p>
- *
- * @see "http://www.oss.com/asn1/resources/books-whitepapers-pubs/Overview_of_OER.pdf"
+ * unsigned binary integer occupying a variable number of octets; the length prefix contains the number of subsequent
+ * octets.</p>
  */
 public class AsnUintCodec extends AsnOctetStringBasedObjectCodec<BigInteger> {
 
diff --git a/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodecUL.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodecUL.java
new file mode 100644
index 0000000..5656e10
--- /dev/null
+++ b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUintCodecUL.java
@@ -0,0 +1,68 @@
+package org.interledger.encoding.asn.codecs;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Codec Framework
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import com.google.common.primitives.UnsignedLong;
+
+import java.io.ByteArrayOutputStream;
+import java.math.BigInteger;
+
+/**
+ * <p>An ASN.1 codec for a variable-size ASN.1 OER integer type, backed by {@link BigInteger}.</p>
+ *
+ * <p>Per the OER definitions, the integer value is encoded as a length prefix, followed by an
+ * unsigned binary integer occupying a variable number of octets; the length prefix contains the
+ * number of subsequent octets.</p>
+ *
+ * @see "http://www.oss.com/asn1/resources/books-whitepapers-pubs/Overview_of_OER.pdf"
+ */
+public class AsnUintCodecUL extends AsnOctetStringBasedObjectCodec<UnsignedLong> {
+
+  public AsnUintCodecUL() {
+    super(AsnSizeConstraint.UNCONSTRAINED);
+  }
+
+  @Override
+  public UnsignedLong decode() {
+    return UnsignedLong.valueOf(new BigInteger(1, getBytes()));
+  }
+
+  @Override
+  public void encode(final UnsignedLong value) {
+
+    byte[] bytes = value.bigIntegerValue().toByteArray();
+
+    // BigInteger's toByteArray writes data in two's complement, so positive values may have a
+    // leading 0x00 byte, which we want to strip off. However, we only want to strip these
+    // leading values off if the number of bytes is greater than 1 so that we don't produce an
+    // empty array when the BigInteger value is 0.
+    if (bytes[0] == 0x00 && bytes.length > 1) {
+      ByteArrayOutputStream baos = new ByteArrayOutputStream();
+      baos.write(bytes, 1, bytes.length - 1);
+      setBytes(baos.toByteArray());
+      return;
+    }
+
+    setBytes(bytes);
+
+  }
+
+}
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUtf8StringBasedObjectCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUtf8StringBasedObjectCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUtf8StringBasedObjectCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUtf8StringBasedObjectCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUtf8StringCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUtf8StringCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUtf8StringCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/codecs/AsnUtf8StringCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodec.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodec.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodec.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodec.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodecRegistry.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodecRegistry.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodecRegistry.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodecRegistry.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodecSupplier.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodecSupplier.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodecSupplier.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectCodecSupplier.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectSerializationContext.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectSerializationContext.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectSerializationContext.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectSerializationContext.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectSerializer.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectSerializer.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectSerializer.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/AsnObjectSerializer.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContext.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContext.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContext.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContext.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContextFactory.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContextFactory.java
similarity index 57%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContextFactory.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContextFactory.java
index 8dd20ae..f77c14c 100644
--- a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContextFactory.java
+++ b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/CodecContextFactory.java
@@ -32,7 +32,10 @@ import org.interledger.encoding.asn.codecs.AsnSizeConstraint;
 import org.interledger.encoding.asn.codecs.AsnUint16Codec;
 import org.interledger.encoding.asn.codecs.AsnUint32Codec;
 import org.interledger.encoding.asn.codecs.AsnUint64Codec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
 import org.interledger.encoding.asn.codecs.AsnUint8Codec;
+import org.interledger.encoding.asn.codecs.AsnUintCodec;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
 import org.interledger.encoding.asn.codecs.AsnUtf8StringBasedObjectCodec;
 import org.interledger.encoding.asn.codecs.AsnUtf8StringCodec;
 import org.interledger.encoding.asn.serializers.oer.AsnCharStringOerSerializer;
@@ -55,28 +58,32 @@ public class CodecContextFactory {
    */
   public static CodecContext oer() {
     final AsnObjectCodecRegistry mappings = new AsnObjectCodecRegistry()
-            .register(byte[].class, () -> new AsnOctetStringCodec(AsnSizeConstraint.UNCONSTRAINED))
-            .register(Short.class, AsnUint8Codec::new)
-            .register(Integer.class, AsnUint16Codec::new)
-            .register(Long.class, AsnUint32Codec::new)
-            .register(BigInteger.class, AsnUint64Codec::new)
-            .register(String.class, () -> new AsnUtf8StringCodec(AsnSizeConstraint.UNCONSTRAINED));
+        .register(byte[].class, () -> new AsnOctetStringCodec(AsnSizeConstraint.UNCONSTRAINED))
+        .register(Short.class, AsnUint8Codec::new) // unsigned!
+        .register(Integer.class, AsnUint16Codec::new)
+        .register(Long.class, AsnUint32Codec::new) // Make this UnsignedInt or just Int
+        .register(BigInteger.class,
+            AsnUint64Codec::new) // Uint64 should be UnsignedLong or just Long, then AsnUint64 can be BigInteger.
+        .register(String.class, () -> new AsnUtf8StringCodec(AsnSizeConstraint.UNCONSTRAINED));
 
     final AsnObjectSerializationContext serializers = new AsnObjectSerializationContext()
-            .register(AsnCharStringBasedObjectCodec.class, new AsnCharStringOerSerializer())
-            .register(AsnIA5StringCodec.class, new AsnCharStringOerSerializer())
-            .register(AsnIA5StringBasedObjectCodec.class, new AsnCharStringOerSerializer())
-            .register(AsnOctetStringCodec.class, new AsnOctetStringOerSerializer())
-            .register(AsnOpenTypeCodec.class, new AsnOpenTypeOerSerializer())
-            .register(AsnOctetStringBasedObjectCodec.class, new AsnOctetStringOerSerializer())
-            .register(AsnSequenceCodec.class, new AsnSequenceOerSerializer())
-            .register(AsnSequenceOfSequenceCodec.class, new AsnSequenceOfSequenceOerSerializer())
-            .register(AsnUint8Codec.class, new AsnOctetStringOerSerializer())
-            .register(AsnUint16Codec.class, new AsnOctetStringOerSerializer())
-            .register(AsnUint32Codec.class, new AsnOctetStringOerSerializer())
-            .register(AsnUint64Codec.class, new AsnOctetStringOerSerializer())
-            .register(AsnUtf8StringCodec.class, new AsnCharStringOerSerializer())
-            .register(AsnUtf8StringBasedObjectCodec.class, new AsnCharStringOerSerializer());
+        .register(AsnCharStringBasedObjectCodec.class, new AsnCharStringOerSerializer())
+        .register(AsnIA5StringCodec.class, new AsnCharStringOerSerializer())
+        .register(AsnIA5StringBasedObjectCodec.class, new AsnCharStringOerSerializer())
+        .register(AsnOctetStringCodec.class, new AsnOctetStringOerSerializer())
+        .register(AsnOpenTypeCodec.class, new AsnOpenTypeOerSerializer())
+        .register(AsnOctetStringBasedObjectCodec.class, new AsnOctetStringOerSerializer())
+        .register(AsnSequenceCodec.class, new AsnSequenceOerSerializer())
+        .register(AsnSequenceOfSequenceCodec.class, new AsnSequenceOfSequenceOerSerializer())
+        .register(AsnUintCodec.class, new AsnOctetStringOerSerializer())
+        .register(AsnUintCodecUL.class, new AsnOctetStringOerSerializer())
+        .register(AsnUint8Codec.class, new AsnOctetStringOerSerializer())
+        .register(AsnUint16Codec.class, new AsnOctetStringOerSerializer())
+        .register(AsnUint32Codec.class, new AsnOctetStringOerSerializer())
+        .register(AsnUint64Codec.class, new AsnOctetStringOerSerializer())
+        .register(AsnUint64CodecUL.class, new AsnOctetStringOerSerializer())
+        .register(AsnUtf8StringCodec.class, new AsnCharStringOerSerializer())
+        .register(AsnUtf8StringBasedObjectCodec.class, new AsnCharStringOerSerializer());
 
     return new CodecContext(mappings, serializers);
   }
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/CodecException.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/CodecException.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/framework/CodecException.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/framework/CodecException.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnCharStringOerSerializer.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnCharStringOerSerializer.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnCharStringOerSerializer.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnCharStringOerSerializer.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOctetStringOerSerializer.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOctetStringOerSerializer.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOctetStringOerSerializer.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOctetStringOerSerializer.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOpenTypeOerSerializer.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOpenTypeOerSerializer.java
similarity index 91%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOpenTypeOerSerializer.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOpenTypeOerSerializer.java
index a9ed2f3..87f47cc 100644
--- a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOpenTypeOerSerializer.java
+++ b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnOpenTypeOerSerializer.java
@@ -22,13 +22,9 @@ package org.interledger.encoding.asn.serializers.oer;
 
 import static java.lang.String.format;
 
-import org.interledger.encoding.asn.codecs.AsnOctetStringBasedObjectCodec;
 import org.interledger.encoding.asn.codecs.AsnOpenTypeCodec;
-import org.interledger.encoding.asn.codecs.AsnSizeConstraint;
-import org.interledger.encoding.asn.framework.AsnObjectCodec;
 import org.interledger.encoding.asn.framework.AsnObjectSerializationContext;
 import org.interledger.encoding.asn.framework.AsnObjectSerializer;
-import org.interledger.encoding.asn.framework.CodecException;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/codecs/codecs-ildcp/pom.xml b/codecs-parent/codecs-ildcp/pom.xml
similarity index 92%
rename from codecs/codecs-ildcp/pom.xml
rename to codecs-parent/codecs-ildcp/pom.xml
index 1f115fb..53ec132 100644
--- a/codecs/codecs-ildcp/pom.xml
+++ b/codecs-parent/codecs-ildcp/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>codecs</artifactId>
         <groupId>org.interledger</groupId>
+        <artifactId>codecs-parent</artifactId>
         <version>0.18.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -26,7 +26,7 @@
         </dependency>
         <dependency>
             <groupId>org.interledger</groupId>
-            <artifactId>codec-framework</artifactId>
+            <artifactId>codecs-framework</artifactId>
         </dependency>
         <dependency>
             <groupId>org.interledger</groupId>
diff --git a/codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpPacketCodec.java b/codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpPacketCodec.java
similarity index 100%
rename from codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpPacketCodec.java
rename to codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpPacketCodec.java
diff --git a/codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketCodec.java b/codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketCodec.java
similarity index 100%
rename from codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketCodec.java
rename to codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketCodec.java
diff --git a/codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketDataCodec.java b/codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketDataCodec.java
similarity index 100%
rename from codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketDataCodec.java
rename to codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketDataCodec.java
diff --git a/codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpResponseCodec.java b/codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpResponseCodec.java
similarity index 100%
rename from codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpResponseCodec.java
rename to codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpResponseCodec.java
diff --git a/codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpResponsePacketDataCodec.java b/codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpResponsePacketDataCodec.java
similarity index 100%
rename from codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpResponsePacketDataCodec.java
rename to codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/AsnIldcpResponsePacketDataCodec.java
diff --git a/codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpCodecContextFactory.java b/codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpCodecContextFactory.java
similarity index 100%
rename from codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpCodecContextFactory.java
rename to codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpCodecContextFactory.java
diff --git a/codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpCodecException.java b/codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpCodecException.java
similarity index 100%
rename from codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpCodecException.java
rename to codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpCodecException.java
diff --git a/codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpUtils.java b/codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpUtils.java
similarity index 100%
rename from codecs/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpUtils.java
rename to codecs-parent/codecs-ildcp/src/main/java/org/interledger/codecs/ildcp/IldcpUtils.java
diff --git a/codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpPacketCodecTest.java b/codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpPacketCodecTest.java
similarity index 100%
rename from codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpPacketCodecTest.java
rename to codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpPacketCodecTest.java
diff --git a/codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketDataCodecTest.java b/codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketDataCodecTest.java
similarity index 100%
rename from codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketDataCodecTest.java
rename to codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpRequestPacketDataCodecTest.java
diff --git a/codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpResponseCodecTest.java b/codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpResponseCodecTest.java
similarity index 100%
rename from codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpResponseCodecTest.java
rename to codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpResponseCodecTest.java
diff --git a/codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpResponsePacketDataCodecTest.java b/codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpResponsePacketDataCodecTest.java
similarity index 100%
rename from codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpResponsePacketDataCodecTest.java
rename to codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/AsnIldcpResponsePacketDataCodecTest.java
diff --git a/codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/framework/IldcpCodecContextFactoryTest.java b/codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/framework/IldcpCodecContextFactoryTest.java
similarity index 100%
rename from codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/framework/IldcpCodecContextFactoryTest.java
rename to codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/framework/IldcpCodecContextFactoryTest.java
diff --git a/codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/utils/IldcpUtilsTest.java b/codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/utils/IldcpUtilsTest.java
similarity index 100%
rename from codecs/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/utils/IldcpUtilsTest.java
rename to codecs-parent/codecs-ildcp/src/test/java/org/interledger/codecs/ildcp/utils/IldcpUtilsTest.java
diff --git a/codecs/codecs-ilp/README.md b/codecs-parent/codecs-ilp/README.md
similarity index 100%
rename from codecs/codecs-ilp/README.md
rename to codecs-parent/codecs-ilp/README.md
diff --git a/codecs/codecs-ilp/pom.xml b/codecs-parent/codecs-ilp/pom.xml
similarity index 92%
rename from codecs/codecs-ilp/pom.xml
rename to codecs-parent/codecs-ilp/pom.xml
index ff00b9e..9777d97 100644
--- a/codecs/codecs-ilp/pom.xml
+++ b/codecs-parent/codecs-ilp/pom.xml
@@ -4,7 +4,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>org.interledger</groupId>
-        <artifactId>codecs</artifactId>
+        <artifactId>codecs-parent</artifactId>
         <version>0.18.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -31,7 +31,7 @@
         </dependency>
         <dependency>
             <groupId>org.interledger</groupId>
-            <artifactId>codec-framework</artifactId>
+            <artifactId>codecs-framework</artifactId>
         </dependency>
         <dependency>
             <groupId>org.interledger</groupId>
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnConditionCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnConditionCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnConditionCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnConditionCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnFulfillmentCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnFulfillmentCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnFulfillmentCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnFulfillmentCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerAddressCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerAddressCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerAddressCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerAddressCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerAddressPrefixCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerAddressPrefixCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerAddressPrefixCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerAddressPrefixCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerErrorCodeCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerErrorCodeCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerErrorCodeCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerErrorCodeCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerFulfillPacketCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerFulfillPacketCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerFulfillPacketCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerFulfillPacketCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerFulfillPacketDataCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerFulfillPacketDataCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerFulfillPacketDataCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerFulfillPacketDataCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPacketCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPacketCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPacketCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPacketCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPreparePacketCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPreparePacketCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPreparePacketCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPreparePacketCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPreparePacketDataCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPreparePacketDataCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPreparePacketDataCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerPreparePacketDataCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerRejectPacketCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerRejectPacketCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerRejectPacketCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerRejectPacketCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerRejectPacketDataCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerRejectPacketDataCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerRejectPacketDataCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnInterledgerRejectPacketDataCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnTimestampCodec.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnTimestampCodec.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnTimestampCodec.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/AsnTimestampCodec.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/InterledgerCodecContextFactory.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/InterledgerCodecContextFactory.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/InterledgerCodecContextFactory.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/InterledgerCodecContextFactory.java
diff --git a/codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/package-info.java b/codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/package-info.java
similarity index 100%
rename from codecs/codecs-ilp/src/main/java/org/interledger/codecs/ilp/package-info.java
rename to codecs-parent/codecs-ilp/src/main/java/org/interledger/codecs/ilp/package-info.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/AsnInterledgerAddressCodecTest.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/AsnInterledgerAddressCodecTest.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/AsnInterledgerAddressCodecTest.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/AsnInterledgerAddressCodecTest.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/AsnInterledgerAddressPrefixCodecTest.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/AsnInterledgerAddressPrefixCodecTest.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/AsnInterledgerAddressPrefixCodecTest.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/AsnInterledgerAddressPrefixCodecTest.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/ConditionOerSerializerTests.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/ConditionOerSerializerTests.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/ConditionOerSerializerTests.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/ConditionOerSerializerTests.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InstantOerSerializerTest.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InstantOerSerializerTest.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InstantOerSerializerTest.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InstantOerSerializerTest.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InstantOerSerializerTestBadFormat.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InstantOerSerializerTestBadFormat.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InstantOerSerializerTestBadFormat.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InstantOerSerializerTestBadFormat.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerAddressOerSerializerTests.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerAddressOerSerializerTests.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerAddressOerSerializerTests.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerAddressOerSerializerTests.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerFulfillPacketOerSerializerTests.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerFulfillPacketOerSerializerTests.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerFulfillPacketOerSerializerTests.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerFulfillPacketOerSerializerTests.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerPreparePacketOerSerializerTests.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerPreparePacketOerSerializerTests.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerPreparePacketOerSerializerTests.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerPreparePacketOerSerializerTests.java
diff --git a/codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerRejectPacketOerSerializerTests.java b/codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerRejectPacketOerSerializerTests.java
similarity index 100%
rename from codecs/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerRejectPacketOerSerializerTests.java
rename to codecs-parent/codecs-ilp/src/test/java/org/interledger/codecs/ilp/InterledgerRejectPacketOerSerializerTests.java
diff --git a/codecs-parent/codecs-stream/pom.xml b/codecs-parent/codecs-stream/pom.xml
new file mode 100644
index 0000000..1fefc82
--- /dev/null
+++ b/codecs-parent/codecs-stream/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <groupId>org.interledger</groupId>
+    <artifactId>codecs-parent</artifactId>
+    <version>0.18.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <name>Quilt :: Codecs :: STREAM</name>
+  <description>Codecs for the Interledger STREAM classes.</description>
+  <artifactId>codecs-stream</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>codecs-framework</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>codecs-ilp</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>ilp-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>stream-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.datatype</groupId>
+      <artifactId>jackson-datatype-jdk8</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.immutables</groupId>
+      <artifactId>value</artifactId>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+
+</project>
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/AsnAmountTooLargeDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/AsnAmountTooLargeDataCodec.java
new file mode 100644
index 0000000..4c6cebe
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/AsnAmountTooLargeDataCodec.java
@@ -0,0 +1,39 @@
+package org.interledger.codecs.stream;
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.stream.AmountTooLargeErrorData;
+
+public class AsnAmountTooLargeDataCodec extends AsnSequenceCodec<AmountTooLargeErrorData> {
+
+  public AsnAmountTooLargeDataCodec() {
+    super(
+        new AsnUint64CodecUL(),
+        new AsnUint64CodecUL()
+    );
+  }
+
+  /**
+   * Decode and return the value read into the codec during serialization.
+   *
+   * @return the decoded object
+   */
+  @Override
+  public AmountTooLargeErrorData decode() {
+    return AmountTooLargeErrorData.builder()
+        .receivedAmount(getValueAt(0))
+        .maximumAmount(getValueAt(1))
+        .build();
+  }
+
+  /**
+   * Encode the provided value into the codec to be written during serialization.
+   *
+   * @param value the value to encode
+   */
+  @Override
+  public void encode(AmountTooLargeErrorData value) {
+    setValueAt(0, value.receivedAmount());
+    setValueAt(1, value.maximumAmount());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/AsnStreamPacketCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/AsnStreamPacketCodec.java
new file mode 100644
index 0000000..df929b9
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/AsnStreamPacketCodec.java
@@ -0,0 +1,75 @@
+package org.interledger.codecs.stream;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.codecs.stream.frame.AsnStreamFramesCodec;
+import org.interledger.core.InterledgerPacketType;
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint8Codec;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.StreamPacket;
+
+public class AsnStreamPacketCodec extends AsnSequenceCodec<StreamPacket> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamPacketCodec() {
+    super(
+        new AsnUint8Codec(), // version
+        new AsnUint8Codec(), // Ilp Packet Type
+        new AsnUintCodecUL(), // sequence
+        new AsnUintCodecUL(), // PrepareAmount
+        new AsnStreamFramesCodec() // Sequences of Frames
+        // JunkData (Ignored)
+    );
+  }
+
+  /**
+   * Decode and return the value read into the codec during serialization.
+   *
+   * @return the decoded object
+   */
+  @Override
+  public StreamPacket decode() {
+    return StreamPacket.builder()
+        // ignore version at index 0.
+        .interledgerPacketType(InterledgerPacketType.fromCode(getValueAt(1)))
+        .sequence(getValueAt(2))
+        .prepareAmount(getValueAt(3))
+        .frames(getValueAt(4))
+        .build();
+  }
+
+  /**
+   * Encode the provided value into the codec to be written during serialization.
+   *
+   * @param value the value to encode
+   */
+  @Override
+  public void encode(StreamPacket value) {
+    setValueAt(0, value.version());
+    setValueAt(1, value.interledgerPacketType().getType());
+    setValueAt(2, value.sequence());
+    setValueAt(3, value.prepareAmount());
+    setValueAt(4, value.frames());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/StreamCodecContextFactory.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/StreamCodecContextFactory.java
new file mode 100644
index 0000000..a95d312
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/StreamCodecContextFactory.java
@@ -0,0 +1,63 @@
+package org.interledger.codecs.stream;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.codecs.ilp.InterledgerCodecContextFactory;
+import org.interledger.codecs.stream.frame.AsnStreamFrameCodec;
+import org.interledger.encoding.asn.framework.CodecContext;
+import org.interledger.encoding.asn.serializers.oer.AsnSequenceOerSerializer;
+import org.interledger.stream.AmountTooLargeErrorData;
+import org.interledger.stream.StreamPacket;
+import org.interledger.stream.frames.StreamFrame;
+
+import java.util.Objects;
+
+/**
+ * A factory class for constructing a CodecContext that can read and write STREAM objects using ASN.1 OER encoding.
+ */
+public class StreamCodecContextFactory {
+
+  /**
+   * Create an instance of {@link CodecContext} that encodes and decodes Interledger packets using ASN.1 OER encoding.
+   *
+   * @return A new instance of {@link CodecContext}.
+   */
+  public static CodecContext oer() {
+    final CodecContext streamCodecContext = InterledgerCodecContextFactory.oer();
+    return register(streamCodecContext);
+  }
+
+  /**
+   * Register the ILP codecs into the provided context.
+   *
+   * @param context the context to register the codecs into
+   *
+   * @return The supplied {@code context} with ILP Codecs registered into it.
+   */
+  public static CodecContext register(final CodecContext context) {
+    Objects.requireNonNull(context, "context must not be null");
+
+    return context
+        .register(StreamFrame.class, AsnStreamFrameCodec::new, new AsnSequenceOerSerializer())
+        .register(StreamPacket.class, AsnStreamPacketCodec::new, new AsnSequenceOerSerializer())
+        .register(AmountTooLargeErrorData.class, AsnAmountTooLargeDataCodec::new);
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameCodec.java
new file mode 100644
index 0000000..d0bfd33
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.ConnectionAssetDetailsFrame;
+
+public class AsnConnectionAssetDetailsFrameCodec extends AsnStreamFrameCodec<ConnectionAssetDetailsFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameDataCodec.java
new file mode 100644
index 0000000..f711bd1
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameDataCodec.java
@@ -0,0 +1,54 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnSizeConstraint;
+import org.interledger.encoding.asn.codecs.AsnUint8Codec;
+import org.interledger.encoding.asn.codecs.AsnUtf8StringCodec;
+import org.interledger.stream.frames.ConnectionAssetDetailsFrame;
+
+public class AsnConnectionAssetDetailsFrameDataCodec extends AsnSequenceCodec<ConnectionAssetDetailsFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnConnectionAssetDetailsFrameDataCodec() {
+    super(
+        new AsnUtf8StringCodec(AsnSizeConstraint.UNCONSTRAINED),
+        new AsnUint8Codec()
+    );
+  }
+
+  @Override
+  public ConnectionAssetDetailsFrame decode() {
+    return ConnectionAssetDetailsFrame.builder()
+        .sourceAssetCode(getValueAt(0))
+        .sourceAssetScale(getValueAt(1))
+        .build();
+  }
+
+  @Override
+  public void encode(ConnectionAssetDetailsFrame value) {
+    setValueAt(0, value.sourceAssetCode());
+    setValueAt(1, value.sourceAssetScale());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameCodec.java
new file mode 100644
index 0000000..4b0a70d
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.ConnectionCloseFrame;
+
+public class AsnConnectionCloseFrameCodec extends AsnStreamFrameCodec<ConnectionCloseFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameDataCodec.java
new file mode 100644
index 0000000..52dbc78
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameDataCodec.java
@@ -0,0 +1,57 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnIA5StringCodec;
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnSizeConstraint;
+import org.interledger.encoding.asn.codecs.AsnUint8Codec;
+import org.interledger.stream.frames.ConnectionCloseFrame;
+import org.interledger.stream.frames.ErrorCode;
+
+import java.util.Optional;
+
+public class AsnConnectionCloseFrameDataCodec extends AsnSequenceCodec<ConnectionCloseFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnConnectionCloseFrameDataCodec() {
+    super(
+        new AsnUint8Codec(),// Error Code
+        new AsnIA5StringCodec(AsnSizeConstraint.UNCONSTRAINED)// Error Message
+    );
+  }
+
+  @Override
+  public ConnectionCloseFrame decode() {
+    return ConnectionCloseFrame.builder()
+        .errorCode(ErrorCode.of(getValueAt(0)))
+        .errorMessage(Optional.<String>ofNullable(getValueAt(1)).filter($ -> !"".equals($)))
+        .build();
+  }
+
+  @Override
+  public void encode(ConnectionCloseFrame value) {
+    setValueAt(0, value.errorCode().getCode());
+    setValueAt(1, value.errorMessage().orElse(""));
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameCodec.java
new file mode 100644
index 0000000..4138bcb
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.ConnectionDataBlockedFrame;
+
+public class AsnConnectionDataBlockedFrameCodec extends AsnStreamFrameCodec<ConnectionDataBlockedFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameDataCodec.java
new file mode 100644
index 0000000..8a58dc6
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameDataCodec.java
@@ -0,0 +1,50 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.ConnectionDataBlockedFrame;
+
+public class AsnConnectionDataBlockedFrameDataCodec extends AsnSequenceCodec<ConnectionDataBlockedFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnConnectionDataBlockedFrameDataCodec() {
+    super(
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public ConnectionDataBlockedFrame decode() {
+    return ConnectionDataBlockedFrame.builder()
+        .maxOffset(getValueAt(0))
+        .build();
+  }
+
+  @Override
+  public void encode(ConnectionDataBlockedFrame value) {
+    setValueAt(0, value.maxOffset());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameCodec.java
new file mode 100644
index 0000000..ac2bc8b
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.ConnectionDataMaxFrame;
+
+public class AsnConnectionDataMaxFrameCodec extends AsnStreamFrameCodec<ConnectionDataMaxFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameDataCodec.java
new file mode 100644
index 0000000..f81abf8
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameDataCodec.java
@@ -0,0 +1,50 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.ConnectionDataMaxFrame;
+
+public class AsnConnectionDataMaxFrameDataCodec extends AsnSequenceCodec<ConnectionDataMaxFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnConnectionDataMaxFrameDataCodec() {
+    super(
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public ConnectionDataMaxFrame decode() {
+    return ConnectionDataMaxFrame.builder()
+        .maxOffset(getValueAt(0))
+        .build();
+  }
+
+  @Override
+  public void encode(ConnectionDataMaxFrame value) {
+    setValueAt(0, value.maxOffset());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameCodec.java
new file mode 100644
index 0000000..dce3790
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.ConnectionMaxStreamIdFrame;
+
+public class AsnConnectionMaxStreamIdFrameCodec extends AsnStreamFrameCodec<ConnectionMaxStreamIdFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameDataCodec.java
new file mode 100644
index 0000000..8d4e0d8
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameDataCodec.java
@@ -0,0 +1,50 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.ConnectionMaxStreamIdFrame;
+
+public class AsnConnectionMaxStreamIdFrameDataCodec extends AsnSequenceCodec<ConnectionMaxStreamIdFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnConnectionMaxStreamIdFrameDataCodec() {
+    super(
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public ConnectionMaxStreamIdFrame decode() {
+    return ConnectionMaxStreamIdFrame.builder()
+        .maxStreamId(getValueAt(0))
+        .build();
+  }
+
+  @Override
+  public void encode(ConnectionMaxStreamIdFrame value) {
+    setValueAt(0, value.maxStreamId());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameCodec.java
new file mode 100644
index 0000000..4f6632a
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.ConnectionNewAddressFrame;
+
+public class AsnConnectionNewAddressFrameCodec extends AsnStreamFrameCodec<ConnectionNewAddressFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameDataCodec.java
new file mode 100644
index 0000000..9c34984
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameDataCodec.java
@@ -0,0 +1,49 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.codecs.ilp.AsnInterledgerAddressCodec;
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.stream.frames.ConnectionNewAddressFrame;
+
+public class AsnConnectionNewAddressFrameDataCodec extends AsnSequenceCodec<ConnectionNewAddressFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnConnectionNewAddressFrameDataCodec() {
+    super(
+        new AsnInterledgerAddressCodec()
+    );
+  }
+
+  @Override
+  public ConnectionNewAddressFrame decode() {
+    return ConnectionNewAddressFrame.builder()
+        .sourceAddress(getValueAt(0))
+        .build();
+  }
+
+  @Override
+  public void encode(ConnectionNewAddressFrame value) {
+    setValueAt(0, value.sourceAddress());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameCodec.java
new file mode 100644
index 0000000..699d98a
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.ConnectionStreamIdBlockedFrame;
+
+public class AsnConnectionStreamIdBlockedFrameCodec extends AsnStreamFrameCodec<ConnectionStreamIdBlockedFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameDataCodec.java
new file mode 100644
index 0000000..27aec6a
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameDataCodec.java
@@ -0,0 +1,50 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.ConnectionStreamIdBlockedFrame;
+
+public class AsnConnectionStreamIdBlockedFrameDataCodec extends AsnSequenceCodec<ConnectionStreamIdBlockedFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnConnectionStreamIdBlockedFrameDataCodec() {
+    super(
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public ConnectionStreamIdBlockedFrame decode() {
+    return ConnectionStreamIdBlockedFrame.builder()
+        .maxStreamId(getValueAt(0))
+        .build();
+  }
+
+  @Override
+  public void encode(ConnectionStreamIdBlockedFrame value) {
+    setValueAt(0, value.maxStreamId());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameCodec.java
new file mode 100644
index 0000000..5c07fc4
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.StreamCloseFrame;
+
+public class AsnStreamCloseFrameCodec extends AsnStreamFrameCodec<StreamCloseFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameDataCodec.java
new file mode 100644
index 0000000..94843a8
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameDataCodec.java
@@ -0,0 +1,59 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnSizeConstraint;
+import org.interledger.encoding.asn.codecs.AsnUint8Codec;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.encoding.asn.codecs.AsnUtf8StringCodec;
+import org.interledger.stream.frames.ErrorCode;
+import org.interledger.stream.frames.StreamCloseFrame;
+
+public class AsnStreamCloseFrameDataCodec extends AsnSequenceCodec<StreamCloseFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamCloseFrameDataCodec() {
+    super(
+        new AsnUintCodecUL(),
+        new AsnUint8Codec(),
+        new AsnUtf8StringCodec(AsnSizeConstraint.UNCONSTRAINED)
+    );
+  }
+
+  @Override
+  public StreamCloseFrame decode() {
+    return StreamCloseFrame.builder()
+        .streamId(getValueAt(0))
+        .errorCode(ErrorCode.of(getValueAt(1)))
+        .errorMessage(getValueAt(2))
+        .build();
+  }
+
+  @Override
+  public void encode(StreamCloseFrame value) {
+    setValueAt(0, value.streamId());
+    setValueAt(1, value.errorCode().getCode());
+    setValueAt(2, value.errorMessage());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameCodec.java
new file mode 100644
index 0000000..fbce32e
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.StreamDataBlockedFrame;
+
+public class AsnStreamDataBlockedFrameCodec extends AsnStreamFrameCodec<StreamDataBlockedFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameDataCodec.java
new file mode 100644
index 0000000..e3ea9e5
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameDataCodec.java
@@ -0,0 +1,55 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64Codec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.StreamDataBlockedFrame;
+import org.interledger.stream.frames.StreamDataMaxFrame;
+
+public class AsnStreamDataBlockedFrameDataCodec extends AsnSequenceCodec<StreamDataBlockedFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamDataBlockedFrameDataCodec() {
+    super(
+        new AsnUintCodecUL(),
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public StreamDataBlockedFrame decode() {
+    return StreamDataBlockedFrame.builder()
+        .streamId(getValueAt(0))
+        .maxOffset(getValueAt(1))
+        .build();
+  }
+
+  @Override
+  public void encode(StreamDataBlockedFrame value) {
+    setValueAt(0, value.streamId());
+    setValueAt(1, value.maxOffset());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameCodec.java
new file mode 100644
index 0000000..976b393
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.StreamDataFrame;
+
+public class AsnStreamDataFrameCodec extends AsnStreamFrameCodec<StreamDataFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameDataCodec.java
new file mode 100644
index 0000000..3a34c34
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameDataCodec.java
@@ -0,0 +1,57 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnOctetStringCodec;
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnSizeConstraint;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.StreamDataFrame;
+
+public class AsnStreamDataFrameDataCodec extends AsnSequenceCodec<StreamDataFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamDataFrameDataCodec() {
+    super(
+        new AsnUintCodecUL(),
+        new AsnUintCodecUL(),
+        new AsnOctetStringCodec(AsnSizeConstraint.UNCONSTRAINED)
+    );
+  }
+
+  @Override
+  public StreamDataFrame decode() {
+    return StreamDataFrame.builder()
+        .streamId(getValueAt(0))
+        .offset(getValueAt(1))
+        .data(getValueAt(2))
+        .build();
+  }
+
+  @Override
+  public void encode(StreamDataFrame value) {
+    setValueAt(0, value.streamId());
+    setValueAt(1, value.offset());
+    setValueAt(2, value.data());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameCodec.java
new file mode 100644
index 0000000..9cd9c66
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.StreamDataMaxFrame;
+
+public class AsnStreamDataMaxFrameCodec extends AsnStreamFrameCodec<StreamDataMaxFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameDataCodec.java
new file mode 100644
index 0000000..f8581c1
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameDataCodec.java
@@ -0,0 +1,52 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.StreamDataMaxFrame;
+
+public class AsnStreamDataMaxFrameDataCodec extends AsnSequenceCodec<StreamDataMaxFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamDataMaxFrameDataCodec() {
+    super(
+        new AsnUintCodecUL(),
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public StreamDataMaxFrame decode() {
+    return StreamDataMaxFrame.builder()
+        .streamId(getValueAt(0))
+        .maxOffset(getValueAt(1))
+        .build();
+  }
+
+  @Override
+  public void encode(StreamDataMaxFrame value) {
+    setValueAt(0, value.streamId());
+    setValueAt(1, value.maxOffset());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamFrameCodec.java
new file mode 100644
index 0000000..8cc736f
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamFrameCodec.java
@@ -0,0 +1,128 @@
+package org.interledger.codecs.stream.frame;
+
+import static org.interledger.stream.frames.StreamFrameConstants.CONNECTION_ASSET_DETAILS;
+import static org.interledger.stream.frames.StreamFrameConstants.CONNECTION_CLOSE;
+import static org.interledger.stream.frames.StreamFrameConstants.CONNECTION_DATA_BLOCKED;
+import static org.interledger.stream.frames.StreamFrameConstants.CONNECTION_DATA_MAX;
+import static org.interledger.stream.frames.StreamFrameConstants.CONNECTION_MAX_STREAM_ID;
+import static org.interledger.stream.frames.StreamFrameConstants.CONNECTION_NEW_ADDRESS;
+import static org.interledger.stream.frames.StreamFrameConstants.CONNECTION_STREAM_ID_BLOCKED;
+import static org.interledger.stream.frames.StreamFrameConstants.STREAM_CLOSE;
+import static org.interledger.stream.frames.StreamFrameConstants.STREAM_DATA;
+import static org.interledger.stream.frames.StreamFrameConstants.STREAM_DATA_BLOCKED;
+import static org.interledger.stream.frames.StreamFrameConstants.STREAM_DATA_MAX;
+import static org.interledger.stream.frames.StreamFrameConstants.STREAM_MONEY;
+import static org.interledger.stream.frames.StreamFrameConstants.STREAM_MONEY_BLOCKED;
+import static org.interledger.stream.frames.StreamFrameConstants.STREAM_MONEY_MAX;
+
+import org.interledger.encoding.asn.codecs.AsnOpenTypeCodec;
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint8Codec;
+import org.interledger.encoding.asn.framework.CodecException;
+import org.interledger.stream.frames.StreamFrame;
+
+public class AsnStreamFrameCodec<T extends StreamFrame> extends AsnSequenceCodec<T> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamFrameCodec() {
+    super(
+        new AsnUint8Codec(), // type
+        null // FrameCodec
+    );
+    AsnUint8Codec frameTypeCodec = (AsnUint8Codec) getCodecAt(0);
+    frameTypeCodec.setValueChangedEventListener((codec) -> {
+      onFrameTypeChanged(codec.decode());
+    });
+  }
+
+  /**
+   * Decode and return the value read into the codec during serialization.
+   *
+   * @return the decoded object
+   */
+  @Override
+  public T decode() {
+    return getValueAt(1);
+  }
+
+  /**
+   * Encode the provided value into the codec to be written during serialization.
+   *
+   * @param value the value to encode
+   */
+  @Override
+  public void encode(T value) {
+    setValueAt(0, value.streamFrameType().code());
+    setValueAt(1, value);
+  }
+
+  protected void onFrameTypeChanged(short streamFrameTypeCode) {
+    //The frame type has been set so set the packet data
+    switch (streamFrameTypeCode) {
+      case CONNECTION_CLOSE: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnConnectionCloseFrameDataCodec()));
+        return;
+      }
+      case CONNECTION_NEW_ADDRESS: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnConnectionNewAddressFrameDataCodec()));
+        return;
+      }
+      case CONNECTION_DATA_MAX: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnConnectionDataMaxFrameDataCodec()));
+        return;
+      }
+      case CONNECTION_DATA_BLOCKED: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnConnectionDataBlockedFrameDataCodec()));
+        return;
+      }
+      case CONNECTION_MAX_STREAM_ID: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnConnectionMaxStreamIdFrameDataCodec()));
+        return;
+      }
+      case CONNECTION_STREAM_ID_BLOCKED: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnConnectionStreamIdBlockedFrameDataCodec()));
+        return;
+      }
+      case CONNECTION_ASSET_DETAILS: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnConnectionAssetDetailsFrameDataCodec()));
+        return;
+      }
+      case STREAM_CLOSE: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnStreamCloseFrameDataCodec()));
+        return;
+      }
+      case STREAM_MONEY: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnStreamMoneyFrameDataCodec()));
+        return;
+      }
+      case STREAM_MONEY_MAX: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnStreamMoneyMaxFrameDataCodec()));
+        return;
+      }
+      case STREAM_MONEY_BLOCKED: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnStreamMoneyBlockedFrameDataCodec()));
+        return;
+      }
+      case STREAM_DATA: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnStreamDataFrameDataCodec()));
+        return;
+      }
+      case STREAM_DATA_MAX: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnStreamDataMaxFrameDataCodec()));
+        return;
+      }
+      case STREAM_DATA_BLOCKED: {
+        setCodecAt(1, new AsnOpenTypeCodec<>(new AsnStreamDataBlockedFrameDataCodec()));
+        return;
+      }
+      default: {
+        throw new CodecException(
+            String.format("Unknown STREAM Frame packet type: %s", streamFrameTypeCode));
+      }
+    }
+
+  }
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamFramesCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamFramesCodec.java
new file mode 100644
index 0000000..0ba33ae
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamFramesCodec.java
@@ -0,0 +1,38 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceOfSequenceCodec;
+import org.interledger.stream.frames.StreamFrame;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Codec for a List of Frames (i.e., a SEQUENCE-OF Frame).
+ */
+public class AsnStreamFramesCodec
+    extends AsnSequenceOfSequenceCodec<List<StreamFrame>, StreamFrame> {
+
+  public AsnStreamFramesCodec() {
+    super(ArrayList::new, AsnStreamFrameCodec::new);
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameCodec.java
new file mode 100644
index 0000000..57d8655
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.StreamMoneyBlockedFrame;
+
+public class AsnStreamMoneyBlockedFrameCodec extends AsnStreamFrameCodec<StreamMoneyBlockedFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameDataCodec.java
new file mode 100644
index 0000000..1f4b27c
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameDataCodec.java
@@ -0,0 +1,57 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64Codec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.StreamMoneyBlockedFrame;
+
+public class AsnStreamMoneyBlockedFrameDataCodec extends AsnSequenceCodec<StreamMoneyBlockedFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamMoneyBlockedFrameDataCodec() {
+    super(
+        new AsnUintCodecUL(),
+        new AsnUintCodecUL(),
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public StreamMoneyBlockedFrame decode() {
+    return StreamMoneyBlockedFrame.builder()
+        .streamId(getValueAt(0))
+        .sendMax(getValueAt(1))
+        .totalSent(getValueAt(2))
+        .build();
+  }
+
+  @Override
+  public void encode(StreamMoneyBlockedFrame value) {
+    setValueAt(0, value.streamId());
+    setValueAt(1, value.sendMax());
+    setValueAt(2, value.totalSent());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameCodec.java
new file mode 100644
index 0000000..5258b46
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.StreamMoneyFrame;
+
+public class AsnStreamMoneyFrameCodec extends AsnStreamFrameCodec<StreamMoneyFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameDataCodec.java
new file mode 100644
index 0000000..d13ac15
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameDataCodec.java
@@ -0,0 +1,53 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.StreamMoneyFrame;
+
+public class AsnStreamMoneyFrameDataCodec extends AsnSequenceCodec<StreamMoneyFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamMoneyFrameDataCodec() {
+    super(
+        new AsnUintCodecUL(),
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public StreamMoneyFrame decode() {
+    return StreamMoneyFrame.builder()
+        .streamId(getValueAt(0))
+        .shares(getValueAt(1))
+        .build();
+  }
+
+  @Override
+  public void encode(StreamMoneyFrame value) {
+    setValueAt(0, value.streamId());
+    setValueAt(1, value.shares());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameCodec.java
new file mode 100644
index 0000000..ea180db
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameCodec.java
@@ -0,0 +1,27 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Bilateral Transfer Protocol Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.stream.frames.StreamMoneyMaxFrame;
+
+public class AsnStreamMoneyMaxFrameCodec extends AsnStreamFrameCodec<StreamMoneyMaxFrame> {
+
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameDataCodec.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameDataCodec.java
new file mode 100644
index 0000000..be72fc6
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameDataCodec.java
@@ -0,0 +1,57 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import org.interledger.encoding.asn.codecs.AsnSequenceCodec;
+import org.interledger.encoding.asn.codecs.AsnUint64Codec;
+import org.interledger.encoding.asn.codecs.AsnUint64CodecUL;
+import org.interledger.encoding.asn.codecs.AsnUintCodecUL;
+import org.interledger.stream.frames.StreamMoneyMaxFrame;
+
+public class AsnStreamMoneyMaxFrameDataCodec extends AsnSequenceCodec<StreamMoneyMaxFrame> {
+
+  /**
+   * Default constructor.
+   */
+  public AsnStreamMoneyMaxFrameDataCodec() {
+    super(
+        new AsnUintCodecUL(),
+        new AsnUintCodecUL(),
+        new AsnUintCodecUL()
+    );
+  }
+
+  @Override
+  public StreamMoneyMaxFrame decode() {
+    return StreamMoneyMaxFrame.builder()
+        .streamId(getValueAt(0))
+        .receiveMax(getValueAt(1))
+        .totalReceived(getValueAt(2))
+        .build();
+  }
+
+  @Override
+  public void encode(StreamMoneyMaxFrame value) {
+    setValueAt(0, value.streamId());
+    setValueAt(1, value.receiveMax());
+    setValueAt(2, value.totalReceived());
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/package-info.java b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/package-info.java
new file mode 100644
index 0000000..2c10e44
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/main/java/org/interledger/codecs/stream/package-info.java
@@ -0,0 +1,25 @@
+/**
+ * This package holds all the ASN.1 codecs for the Interledger STREAM types.
+ */
+
+package org.interledger.codecs.stream;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Interledger Core Codecs
+ * %%
+ * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
diff --git a/codecs/pom.xml b/codecs-parent/pom.xml
similarity index 79%
rename from codecs/pom.xml
rename to codecs-parent/pom.xml
index fc8f464..a1139e2 100644
--- a/codecs/pom.xml
+++ b/codecs-parent/pom.xml
@@ -3,20 +3,21 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>quilt-parent</artifactId>
     <groupId>org.interledger</groupId>
+    <artifactId>quilt-parent</artifactId>
     <version>0.18.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <name>Codecs: Aggregate Codecs</name>
-  <artifactId>codecs</artifactId>
+  <name>Quilt :: Codecs :: Parent</name>
+  <artifactId>codecs-parent</artifactId>
   <packaging>pom</packaging>
 
   <modules>
-    <module>codec-framework</module>
+    <module>codecs-framework</module>
     <module>codecs-btp</module>
     <module>codecs-ildcp</module>
     <module>codecs-ilp</module>
+    <module>codecs-stream</module>
   </modules>
 </project>
diff --git a/ilp-core/src/main/java/org/interledger/core/InterledgerPacketType.java b/ilp-core/src/main/java/org/interledger/core/InterledgerPacketType.java
index 589fb2b..9870071 100644
--- a/ilp-core/src/main/java/org/interledger/core/InterledgerPacketType.java
+++ b/ilp-core/src/main/java/org/interledger/core/InterledgerPacketType.java
@@ -2,8 +2,6 @@ package org.interledger.core;
 
 import static java.lang.String.format;
 
-import java.util.Objects;
-
 /**
  * Per the IL-RFC-27, ILPv4 packets have three types: 12 for Prepare, 13 for Fulfill, and 14 for Reject. This enum
  * provides some type safety for code that might need this information.
diff --git a/pom.xml b/pom.xml
index 3fe3ac9..4d1b899 100644
--- a/pom.xml
+++ b/pom.xml
@@ -98,9 +98,9 @@
     <module>ilp-core</module>
     <module>btp-core</module>
     <module>ildcp-core</module>
-    <module>jackson-datatypes</module>
-    <module>codecs</module>
     <module>stream-parent</module>
+    <module>jackson-datatypes</module>
+    <module>codecs-parent</module>
   </modules>
 
   <dependencyManagement>
@@ -108,7 +108,7 @@
 
       <dependency>
         <groupId>${project.groupId}</groupId>
-        <artifactId>codec-framework</artifactId>
+        <artifactId>codecs-framework</artifactId>
         <version>${project.version}</version>
       </dependency>
 
@@ -130,6 +130,18 @@
         <version>${project.version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>codecs-stream</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>stream-core</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+
       <dependency>
         <groupId>${project.groupId}</groupId>
         <artifactId>ilp-core</artifactId>
@@ -172,6 +184,13 @@
         <version>${jackson.version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>com.fasterxml.jackson.datatype</groupId>
+        <artifactId>jackson-datatype-jdk8</artifactId>
+        <version>${jackson.version}</version>
+        <scope>test</scope>
+      </dependency>
+
       <dependency>
         <groupId>javax.money</groupId>
         <artifactId>money-api</artifactId>
@@ -210,16 +229,22 @@
         <version>${jackson.version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>com.fasterxml.jackson.core</groupId>
+        <artifactId>jackson-datatype-jdk8</artifactId>
+        <version>${jackson.version}</version>
+      </dependency>
+
       <dependency>
         <groupId>com.google.guava</groupId>
         <artifactId>guava</artifactId>
-        <version>27.1-jre</version>
+        <version>28.1-jre</version>
       </dependency>
 
       <dependency>
         <groupId>org.assertj</groupId>
         <artifactId>assertj-core</artifactId>
-        <version>3.11.1</version>
+        <version>3.13.2</version>
         <scope>test</scope>
       </dependency>
 
@@ -235,9 +260,7 @@
 
   <build>
 
-    <!-- All plugin versions and default config is defined
-          in the pluginManagement section.
-     -->
+    <!-- All plugin versions and default config is defined in the pluginManagement section. -->
 
     <pluginManagement>
       <plugins>
diff --git a/stream-parent/stream-core/pom.xml b/stream-parent/stream-core/pom.xml
index 57c258c..89fc5d0 100644
--- a/stream-parent/stream-core/pom.xml
+++ b/stream-parent/stream-core/pom.xml
@@ -9,10 +9,9 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>stream-core</artifactId>
-
   <name>Quilt :: STREAM :: Core</name>
   <description>Core libraries for implementing the STREAM protocol.</description>
+  <artifactId>stream-core</artifactId>
   <packaging>jar</packaging>
 
   <dependencies>
@@ -32,16 +31,16 @@
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.immutables</groupId>
-      <artifactId>value</artifactId>
-      <scope>provided</scope>
-    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.immutables</groupId>
+      <artifactId>value</artifactId>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
@@ -52,7 +51,5 @@
       <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
-
   </dependencies>
-
 </project>
diff --git a/stream-parent/stream-core/src/main/java/org/interledger/stream/StreamPacket.java b/stream-parent/stream-core/src/main/java/org/interledger/stream/StreamPacket.java
index 1697dc8..94cd846 100644
--- a/stream-parent/stream-core/src/main/java/org/interledger/stream/StreamPacket.java
+++ b/stream-parent/stream-core/src/main/java/org/interledger/stream/StreamPacket.java
@@ -62,7 +62,7 @@ import java.util.List;
 @Immutable
 public interface StreamPacket {
 
-  int VERSION_1 = 1;
+  short VERSION_1 = 1;
 
   /**
    * Get the default builder.
diff --git a/stream-parent/stream-core/src/main/java/org/interledger/stream/frames/StreamMoneyMaxFrame.java b/stream-parent/stream-core/src/main/java/org/interledger/stream/frames/StreamMoneyMaxFrame.java
index aee8b09..c55dc26 100644
--- a/stream-parent/stream-core/src/main/java/org/interledger/stream/frames/StreamMoneyMaxFrame.java
+++ b/stream-parent/stream-core/src/main/java/org/interledger/stream/frames/StreamMoneyMaxFrame.java
@@ -20,9 +20,10 @@ package org.interledger.stream.frames;
  * =========================LICENSE_END==================================
  */
 
+import org.interledger.core.Immutable;
+
 import com.google.common.primitives.UnsignedLong;
 import org.immutables.value.Value;
-import org.interledger.core.Immutable;
 
 /**
  * <p>The amounts in this frame are denominated in the units of the endpoint sending the frame, so the other endpoint


Test patch:
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnSequenceOerSerializer.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnSequenceOerSerializer.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnSequenceOerSerializer.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnSequenceOerSerializer.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnSequenceOfSequenceOerSerializer.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnSequenceOfSequenceOerSerializer.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnSequenceOfSequenceOerSerializer.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/AsnSequenceOfSequenceOerSerializer.java
diff --git a/codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/OerLengthSerializer.java b/codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/OerLengthSerializer.java
similarity index 100%
rename from codecs/codec-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/OerLengthSerializer.java
rename to codecs-parent/codecs-framework/src/main/java/org/interledger/encoding/asn/serializers/oer/OerLengthSerializer.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/MyCustomObject.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/MyCustomObject.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/MyCustomObject.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/MyCustomObject.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/AsnMyCustomObjectCodec.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/AsnMyCustomObjectCodec.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/AsnMyCustomObjectCodec.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/AsnMyCustomObjectCodec.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodecTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodecTest.java
similarity index 94%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodecTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodecTest.java
index 8cc26b9..364e4d5 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodecTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnOctetStringBasedObjectCodecTest.java
@@ -9,9 +9,9 @@ package org.interledger.encoding.asn.codecs;
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,12 +20,12 @@ package org.interledger.encoding.asn.codecs;
  * =========================LICENSE_END==================================
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import org.interledger.encoding.asn.framework.CodecException;
 
 import org.junit.Test;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 /**
  * Unit tests for {@link AsnOctetStringBasedObjectCodec}.
  */
@@ -78,6 +78,7 @@ public class AsnOctetStringBasedObjectCodecTest {
     try {
       codec.setBytes(bytes);
     } catch (CodecException e) {
+
       assertThat(e.getMessage()).isEqualTo("Invalid octet string length. Expected > 1, got 0");
       throw e;
     }
@@ -101,9 +102,6 @@ public class AsnOctetStringBasedObjectCodecTest {
     final AsnOctetStringBasedObjectCodec codec2 = createCodec(new AsnSizeConstraint(1));
     final AsnOctetStringBasedObjectCodec codec3 = createCodec(new AsnSizeConstraint(0));
 
-    // this test also used to go out of its way to compare if codec3 was equal to codec1, codec3 equal to codec2, etc
-    // effectively testing that swapping the operands yields the same result
-    // is this actually necessary?
     assertThat(codec1).isEqualTo(codec2);
     assertThat(codec3).isNotEqualTo(codec1);
     assertThat(codec1).isNotEqualTo(codec3);
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnSizeConstraintTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnSizeConstraintTest.java
similarity index 99%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnSizeConstraintTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnSizeConstraintTest.java
index b1e0c81..0c8fd6c 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnSizeConstraintTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnSizeConstraintTest.java
@@ -9,9 +9,9 @@ package org.interledger.encoding.asn.codecs;
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,10 +20,10 @@ package org.interledger.encoding.asn.codecs;
  * =========================LICENSE_END==================================
  */
 
-import org.junit.Test;
-
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.junit.Test;
+
 /**
  * Unit tests for {@link AsnSizeConstraint}.
  */
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnUintCodecTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnUintCodecTest.java
similarity index 97%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnUintCodecTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnUintCodecTest.java
index b75e0e5..a5254b9 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnUintCodecTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/codecs/AsnUintCodecTest.java
@@ -9,9 +9,9 @@ package org.interledger.encoding.asn.codecs;
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,6 +20,8 @@ package org.interledger.encoding.asn.codecs;
  * =========================LICENSE_END==================================
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import com.google.common.io.BaseEncoding;
 import org.junit.Before;
 import org.junit.Test;
@@ -31,8 +33,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Objects;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 @RunWith(Parameterized.class)
 public class AsnUintCodecTest {
 
@@ -44,8 +44,8 @@ public class AsnUintCodecTest {
   /**
    * Construct an instance of this parameterized test with the supplied inputs.
    *
-   * @param expectedUint         The expected value, as a {@link BigInteger}, of {@code
-   *                             expectedEncodedBytes}, once encoded.
+   * @param expectedUint         The expected value, as a {@link BigInteger}, of {@code expectedEncodedBytes}, once
+   *                             encoded.
    * @param expectedEncodedBytes The expected encoded value, in bytes, of {@code expectedUint}.
    */
   public AsnUintCodecTest(
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/framework/EncodingTests.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/framework/EncodingTests.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/framework/EncodingTests.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/framework/EncodingTests.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/framework/OnValueChangedTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/framework/OnValueChangedTest.java
similarity index 99%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/framework/OnValueChangedTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/framework/OnValueChangedTest.java
index f55c2ce..c391f28 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/framework/OnValueChangedTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/framework/OnValueChangedTest.java
@@ -26,7 +26,6 @@ import org.junit.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-
 public class OnValueChangedTest {
 
   @Test
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/AbstractSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/AbstractSerializerTest.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/AbstractSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/AbstractSerializerTest.java
index 435dac1..4b03526 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/AbstractSerializerTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/AbstractSerializerTest.java
@@ -20,6 +20,8 @@ package org.interledger.encoding.asn.serializers.oer;
  * =========================LICENSE_END==================================
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import org.interledger.encoding.asn.framework.CodecContext;
 import org.interledger.encoding.asn.framework.CodecContextFactory;
 
@@ -29,8 +31,6 @@ import org.junit.Test;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 /**
  * Parameterized unit tests for encoding an instance of {@link T}.
  */
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/BigIntegerOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/BigIntegerOerSerializerTest.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/BigIntegerOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/BigIntegerOerSerializerTest.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ByteArrayOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ByteArrayOerSerializerTest.java
similarity index 99%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ByteArrayOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ByteArrayOerSerializerTest.java
index 1225e58..8e3314b 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ByteArrayOerSerializerTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ByteArrayOerSerializerTest.java
@@ -20,11 +20,12 @@ package org.interledger.encoding.asn.serializers.oer;
  * =========================LICENSE_END==================================
  */
 
-import com.google.common.io.BaseEncoding;
+import static org.assertj.core.api.Assertions.assertThat;
 
 import org.interledger.encoding.asn.framework.CodecContext;
 import org.interledger.encoding.asn.framework.CodecContextFactory;
 
+import com.google.common.io.BaseEncoding;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -37,8 +38,6 @@ import java.io.ByteArrayOutputStream;
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 /**
  * Parameterized unit tests for encoding an instance of {@link AsnOctetStringOerSerializer}.
  */
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IA5StringOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IA5StringOerSerializerTest.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IA5StringOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IA5StringOerSerializerTest.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IA5StringOerSerializerTestBadLength.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IA5StringOerSerializerTestBadLength.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IA5StringOerSerializerTestBadLength.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IA5StringOerSerializerTestBadLength.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IntegerOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IntegerOerSerializerTest.java
similarity index 96%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IntegerOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IntegerOerSerializerTest.java
index 1fdb030..5dbbb1d 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IntegerOerSerializerTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/IntegerOerSerializerTest.java
@@ -20,6 +20,8 @@ package org.interledger.encoding.asn.serializers.oer;
  * =========================LICENSE_END==================================
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -30,8 +32,6 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 /**
  * Parameterized unit tests for encoding an instance of {@link Integer}.
  */
@@ -41,8 +41,7 @@ public class IntegerOerSerializerTest extends AbstractSerializerTest<Integer> {
   /**
    * Construct an instance of this parameterized test with the supplied inputs.
    *
-   * @param inputValue   A {@code int} representing the unsigned 8bit integer to write in OER
-   *                     encoding.
+   * @param inputValue   A {@code int} representing the unsigned 8bit integer to write in OER encoding.
    * @param asn1OerBytes The expected value, in binary, of the supplied {@code intValue}.
    */
   public IntegerOerSerializerTest(final int inputValue, final byte[] asn1OerBytes) {
@@ -90,7 +89,7 @@ public class IntegerOerSerializerTest extends AbstractSerializerTest<Integer> {
       codecContext.write(65536, byteArrayOutputStream);
     } catch (IllegalArgumentException e) {
       assertThat(e.getMessage()).isEqualTo("Uint16 only supports values from 0 to 65535, "
-              + "value 65536 is out of range.");
+          + "value 65536 is out of range.");
       throw e;
     }
   }
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/LongOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/LongOerSerializerTest.java
similarity index 97%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/LongOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/LongOerSerializerTest.java
index 904332d..71c38ba 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/LongOerSerializerTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/LongOerSerializerTest.java
@@ -20,6 +20,8 @@ package org.interledger.encoding.asn.serializers.oer;
  * =========================LICENSE_END==================================
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import org.interledger.encoding.asn.codecs.AsnUint32Codec;
 
 import com.google.common.primitives.Ints;
@@ -34,8 +36,6 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 /**
  * Parameterized unit tests for encoding an instance of {@link AsnUint32Codec}.
  */
@@ -45,8 +45,7 @@ public class LongOerSerializerTest extends AbstractSerializerTest<Long> {
   /**
    * Construct an instance of this parameterized test with the supplied inputs.
    *
-   * @param inputValue   A {@code int} representing the unsigned 8bit integer to write in OER
-   *                     encoding.
+   * @param inputValue   A {@code int} representing the unsigned 8bit integer to write in OER encoding.
    * @param asn1OerBytes The expected value, in binary, of the supplied {@code intValue}.
    */
   public LongOerSerializerTest(final long inputValue, final byte[] asn1OerBytes) {
@@ -115,7 +114,7 @@ public class LongOerSerializerTest extends AbstractSerializerTest<Long> {
       codecContext.write(4294967296L, byteArrayOutputStream);
     } catch (IllegalArgumentException e) {
       assertThat(e.getMessage()).isEqualTo("Uint32 only supports values from 0 to 4294967295, "
-              + "value 4294967296 is out of range.");
+          + "value 4294967296 is out of range.");
       throw e;
     }
   }
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTest.java
similarity index 96%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTest.java
index ae17c6f..27aee33 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTest.java
@@ -9,9 +9,9 @@ package org.interledger.encoding.asn.serializers.oer;
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,8 +20,9 @@ package org.interledger.encoding.asn.serializers.oer;
  * =========================LICENSE_END==================================
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import com.google.common.io.BaseEncoding;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -33,8 +34,6 @@ import java.io.ByteArrayOutputStream;
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 /**
  * Parameterized unit tests for encoding an instance of {@link AsnUint8OerSerializer}.
  */
@@ -47,10 +46,9 @@ public class OerLengthPrefixCodecTest {
   /**
    * Construct an instance of this parameterized test with the supplied inputs.
    *
-   * @param expectedPayloadLength An integer representing the length of a payload that should be
-   *                              encoded as a length-prefix.
-   * @param asn1OerBytes          The expected value, in binary, of the supplied {@code
-   *                              expectedPayloadLength}.
+   * @param expectedPayloadLength An integer representing the length of a payload that should be encoded as a
+   *                              length-prefix.
+   * @param asn1OerBytes          The expected value, in binary, of the supplied {@code expectedPayloadLength}.
    */
   public OerLengthPrefixCodecTest(final int expectedPayloadLength, final byte[] asn1OerBytes) {
     this.expectedPayloadLength = expectedPayloadLength;
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTestBadLength.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTestBadLength.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTestBadLength.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OerLengthPrefixCodecTestBadLength.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OpenTypeOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OpenTypeOerSerializerTest.java
similarity index 99%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OpenTypeOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OpenTypeOerSerializerTest.java
index 97ea5e7..19e8fa1 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OpenTypeOerSerializerTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/OpenTypeOerSerializerTest.java
@@ -9,9 +9,9 @@ package org.interledger.encoding.asn.serializers.oer;
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,6 +20,8 @@ package org.interledger.encoding.asn.serializers.oer;
  * =========================LICENSE_END==================================
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import org.interledger.encoding.asn.codecs.AsnOctetStringBasedObjectCodec;
 import org.interledger.encoding.asn.codecs.AsnOpenTypeCodec;
 import org.interledger.encoding.asn.codecs.AsnSizeConstraint;
@@ -39,8 +41,6 @@ import java.io.ByteArrayOutputStream;
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 /**
  * Parameterized unit tests for encoding an instance of {@link AsnOctetStringOerSerializer}.
  */
@@ -178,6 +178,7 @@ public class OpenTypeOerSerializerTest {
   }
 
   private static class TestType {
+
     public byte[] bytes;
 
     TestType(byte[] bytes) {
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/SequenceOfSequenceIntOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/SequenceOfSequenceIntOerSerializerTest.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/SequenceOfSequenceIntOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/SequenceOfSequenceIntOerSerializerTest.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/SequenceOfSequenceShortOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/SequenceOfSequenceShortOerSerializerTest.java
similarity index 100%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/SequenceOfSequenceShortOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/SequenceOfSequenceShortOerSerializerTest.java
diff --git a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ShortOerSerializerTest.java b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ShortOerSerializerTest.java
similarity index 93%
rename from codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ShortOerSerializerTest.java
rename to codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ShortOerSerializerTest.java
index 9d69800..6a77c61 100644
--- a/codecs/codec-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ShortOerSerializerTest.java
+++ b/codecs-parent/codecs-framework/src/test/java/org/interledger/encoding/asn/serializers/oer/ShortOerSerializerTest.java
@@ -20,6 +20,8 @@ package org.interledger.encoding.asn.serializers.oer;
  * =========================LICENSE_END==================================
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -30,8 +32,6 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 /**
  * Parameterized unit tests for encoding an instance of {@link Short}.
  */
@@ -41,8 +41,7 @@ public class ShortOerSerializerTest extends AbstractSerializerTest<Short> {
   /**
    * Construct an instance of this parameterized test with the supplied inputs.
    *
-   * @param inputValue   A {@code int} representing the unsigned 8bit integer to write in OER
-   *                     encoding.
+   * @param inputValue   A {@code int} representing the unsigned 8bit integer to write in OER encoding.
    * @param asn1OerBytes The expected value, in binary, of the supplied {@code intValue}.
    */
   public ShortOerSerializerTest(final short inputValue, final byte[] asn1OerBytes) {
@@ -78,10 +77,9 @@ public class ShortOerSerializerTest extends AbstractSerializerTest<Short> {
   public void write8BitUInt_Overflow() throws IOException {
     try {
       final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-      codecContext.write((short)256, byteArrayOutputStream);
+      codecContext.write((short) 256, byteArrayOutputStream);
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).isEqualTo("Uint8 only supports values from 0 to 255, "
-              + "value 256 is out of range.");
+      assertThat(e.getMessage()).isEqualTo("Uint8 only supports values from 0 to 255, value 256 is out of range.");
       throw e;
     }
   }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/AsnAmountTooLargeDataCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/AsnAmountTooLargeDataCodecTest.java
new file mode 100644
index 0000000..6d31dee
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/AsnAmountTooLargeDataCodecTest.java
@@ -0,0 +1,146 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream;
+
+ import static org.assertj.core.api.Assertions.assertThat;
+
+ import org.interledger.encoding.asn.framework.CodecContext;
+ import org.interledger.stream.AmountTooLargeErrorData;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.Test;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameter;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.io.ByteArrayInputStream;
+ import java.io.ByteArrayOutputStream;
+ import java.io.IOException;
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnAmountTooLargeDataCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnAmountTooLargeDataCodecTest {
+
+   // first data value (0) is default
+   @Parameter
+   public AmountTooLargeErrorData errorData;
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+
+         // receivedAmount = 0
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.ZERO)
+                 .maximumAmount(UnsignedLong.ONE)
+                 .build()
+         },
+         // receivedAmount = 1
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.ONE)
+                 .maximumAmount(UnsignedLong.ONE)
+                 .build()
+         },
+         // receivedAmount = 10
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.valueOf(10L))
+                 .maximumAmount(UnsignedLong.ONE)
+                 .build()
+         },
+         // receivedAmount = Long.Max - 1
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .maximumAmount(UnsignedLong.ONE)
+                 .build()
+         },
+         // receivedAmount = Long.Max
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.MAX_VALUE)
+                 .maximumAmount(UnsignedLong.ONE)
+                 .build()
+         },
+         // maximumAmount = 0
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.ONE)
+                 .maximumAmount(UnsignedLong.ZERO)
+                 .build()
+         },
+         // maximumAmount = 1
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.ONE)
+                 .maximumAmount(UnsignedLong.ONE)
+                 .build()
+         },
+         // maximumAmount = 10
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.ONE)
+                 .maximumAmount(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // maximumAmount = Long.Max - 1
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.ONE)
+                 .maximumAmount(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // maximumAmount = Long.Max
+         {
+             AmountTooLargeErrorData.builder()
+                 .receivedAmount(UnsignedLong.ONE)
+                 .maximumAmount(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+     });
+   }
+
+   @Test
+   public void testWriteThenRead() throws IOException {
+     final CodecContext context = StreamCodecContextFactory.oer();
+
+     // Encode...
+     final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+     context.write(this.errorData, byteArrayOutputStream);
+
+     // Decode...
+     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+     final AmountTooLargeErrorData decodedErrorData = context.read(AmountTooLargeErrorData.class, byteArrayInputStream);
+
+     assertThat(decodedErrorData).isEqualTo(this.errorData);
+   }
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/AsnStreamPacketCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/AsnStreamPacketCodecTest.java
new file mode 100644
index 0000000..9a03700
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/AsnStreamPacketCodecTest.java
@@ -0,0 +1,145 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream;
+
+ import static org.hamcrest.MatcherAssert.assertThat;
+ import static org.hamcrest.core.Is.is;
+
+ import org.interledger.core.InterledgerPacketType;
+ import org.interledger.encoding.asn.framework.CodecContext;
+ import org.interledger.stream.StreamPacket;
+ import org.interledger.stream.frames.StreamMoneyFrame;
+
+ import com.google.common.primitives.Bytes;
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.Test;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameter;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.io.ByteArrayInputStream;
+ import java.io.ByteArrayOutputStream;
+ import java.io.IOException;
+ import java.util.Arrays;
+ import java.util.Collection;
+ import java.util.Random;
+
+ /**
+  * Unit tests for {@link AsnStreamPacketCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnStreamPacketCodecTest {
+
+   // first data value (0) is default
+   @Parameter
+   public StreamPacket streamPacket;
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+
+         // type = PREPARE
+         {
+             StreamPacket.builder()
+                 .interledgerPacketType(InterledgerPacketType.PREPARE)
+                 .prepareAmount(UnsignedLong.ONE)
+                 .sequence(UnsignedLong.MAX_VALUE)
+                 .addFrames(
+                     StreamMoneyFrame.builder()
+                         .streamId(UnsignedLong.ONE)
+                         .shares(UnsignedLong.ONE)
+                         .build()
+                 )
+                 .build()
+         },
+         // type = FULFILL
+         {
+             StreamPacket.builder()
+                 .interledgerPacketType(InterledgerPacketType.FULFILL)
+                 .prepareAmount(UnsignedLong.ONE)
+                 .sequence(UnsignedLong.MAX_VALUE)
+                 .addFrames(
+                     StreamMoneyFrame.builder()
+                         .streamId(UnsignedLong.ONE)
+                         .shares(UnsignedLong.ONE)
+                         .build()
+                 )
+                 .build()
+         },
+         // type = REJECT
+         {
+             StreamPacket.builder()
+                 .interledgerPacketType(InterledgerPacketType.REJECT)
+                 .prepareAmount(UnsignedLong.ONE)
+                 .sequence(UnsignedLong.MAX_VALUE)
+                 .addFrames(
+                     StreamMoneyFrame.builder()
+                         .streamId(UnsignedLong.ONE)
+                         .shares(UnsignedLong.ONE)
+                         .build()
+                 )
+                 .build()
+         },
+     });
+   }
+
+   @Test
+   public void testWriteThenRead() throws IOException {
+     final CodecContext context = StreamCodecContextFactory.oer();
+
+     // Encode...
+     final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+     context.write(this.streamPacket, byteArrayOutputStream);
+
+     // Decode...
+     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+     final StreamPacket decodedStreamPacket = context.read(StreamPacket.class, byteArrayInputStream);
+
+     assertThat(decodedStreamPacket, is(this.streamPacket));
+   }
+
+   @Test
+   public void tesJunkDataIgnored() throws IOException {
+     final CodecContext context = StreamCodecContextFactory.oer();
+
+     // Encode...
+     final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+     context.write(this.streamPacket, byteArrayOutputStream);
+
+     byte[] junkData = new byte[100];
+     Random rand = new Random();
+     rand.nextBytes(junkData);
+
+     // Decode...
+     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
+         Bytes.concat(byteArrayOutputStream.toByteArray(), junkData)
+     );
+     final StreamPacket decodedStreamPacket = context.read(StreamPacket.class, byteArrayInputStream);
+
+     assertThat(decodedStreamPacket, is(this.streamPacket));
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AbstractAsnFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AbstractAsnFrameCodecTest.java
new file mode 100644
index 0000000..a33ac45
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AbstractAsnFrameCodecTest.java
@@ -0,0 +1,92 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import static org.assertj.core.api.Assertions.assertThat;
+
+ import org.interledger.codecs.stream.StreamCodecContextFactory;
+ import org.interledger.encoding.asn.framework.CodecContext;
+ import org.interledger.stream.frames.ConnectionAssetDetailsFrame;
+ import org.interledger.stream.frames.StreamFrame;
+
+ import org.junit.Test;
+ import org.junit.runners.Parameterized.Parameter;
+
+ import java.io.ByteArrayInputStream;
+ import java.io.ByteArrayOutputStream;
+ import java.io.IOException;
+ import java.util.Objects;
+
+ /**
+  * Abstract helper class for all StreamFrame Codec tests.
+  */
+ public abstract class AbstractAsnFrameCodecTest<T extends StreamFrame> {
+
+   private final Class<T> clazz;
+   // first data value (0) is default
+   @Parameter
+   public T frame;
+
+   /**
+    * Required-args Constructor.
+    * @param clazz A {@link Class} of type `T` that can be used to read from the codec.
+    */
+   protected AbstractAsnFrameCodecTest(final Class<T> clazz) {
+     this.clazz = Objects.requireNonNull(clazz);
+   }
+
+   /**
+    * The primary difference between this test and {@link #testIndividualRead()} is that this context determines the ipr
+    * type from the payload, whereas the test above specifies the type in the method call.
+    */
+   @Test
+   public void testInterledgerPaymentCodec() throws Exception {
+     final CodecContext context = StreamCodecContextFactory.oer();
+     final ByteArrayInputStream asn1OerFrameBytes = constructFrameBytes();
+
+     final StreamFrame decodedFrame = context.read(StreamFrame.class, asn1OerFrameBytes);
+     assertThat(decodedFrame.getClass().getName()).isEqualTo(frame.getClass().getName());
+     assertThat(decodedFrame).isEqualTo(frame);
+   }
+
+   protected ByteArrayInputStream constructFrameBytes() throws IOException {
+     final CodecContext context = StreamCodecContextFactory.oer();
+
+     final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+     context.write(frame, outputStream);
+
+     return new ByteArrayInputStream(outputStream.toByteArray());
+   }
+
+   /**
+    * The primary difference between this test and {@link #testInterledgerPaymentCodec()} is that this context call
+    * specifies the type, whereas the test below determines the type from the payload.
+    */
+   @Test
+   public void testIndividualRead() throws IOException {
+     final CodecContext context = StreamCodecContextFactory.oer();
+     final ByteArrayInputStream asn1OerFrameBytes = constructFrameBytes();
+
+     final T frame = context.read(clazz, asn1OerFrameBytes);
+     assertThat(frame).isEqualTo(frame);
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameCodecTest.java
new file mode 100644
index 0000000..14a298d
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionAssetDetailsFrameCodecTest.java
@@ -0,0 +1,143 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.ConnectionAssetDetailsFrame;
+
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnConnectionAssetDetailsFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnConnectionAssetDetailsFrameCodecTest extends AbstractAsnFrameCodecTest<ConnectionAssetDetailsFrame> {
+
+   public AsnConnectionAssetDetailsFrameCodecTest() {
+     super(ConnectionAssetDetailsFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // assetScale=0
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("USD")
+                 .sourceAssetScale((short) 0)
+                 .build()
+         },
+         // assetScale=1
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("USD")
+                 .sourceAssetScale((short) 1)
+                 .build()
+         },
+         // assetScale=10
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("USD")
+                 .sourceAssetScale((short) 10)
+                 .build()
+         },
+         // assetScale=Max-1
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("USD")
+                 .sourceAssetScale((short) (254))
+                 .build()
+         },
+         // assetScale=Max
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("USD")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+
+         // empty code
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+         // ShortCode=0
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("U")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+         // MediumCode
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("US")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("USD")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+         // LongCode
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("DASH")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+         // LongerCode
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("DASH-DASH-DASH")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+         // Chinese String (UTF)
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("元元元")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+         // Russian String (UTF)
+         {
+             ConnectionAssetDetailsFrame.builder()
+                 .sourceAssetCode("₽")
+                 .sourceAssetScale((short) 255)
+                 .build()
+         },
+     });
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameCodecTest.java
new file mode 100644
index 0000000..c447a1a
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionCloseFrameCodecTest.java
@@ -0,0 +1,68 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.ConnectionCloseFrame;
+ import org.interledger.stream.frames.ErrorCode;
+
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnConnectionCloseFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnConnectionCloseFrameCodecTest extends AbstractAsnFrameCodecTest<ConnectionCloseFrame> {
+
+   public AsnConnectionCloseFrameCodecTest() {
+     super(ConnectionCloseFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+
+         // empty message
+         {
+             ConnectionCloseFrame.builder()
+                 .errorCode(ErrorCode.NoError)
+                 .build()
+         },
+         // full frame
+         {
+             ConnectionCloseFrame.builder()
+                 .errorCode(ErrorCode.NoError)
+                 .errorMessage("present")
+                 .build()
+         },
+
+     });
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameCodecTest.java
new file mode 100644
index 0000000..e325a05
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionDataBlockedFrameCodecTest.java
@@ -0,0 +1,82 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.ConnectionDataBlockedFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnConnectionDataBlockedFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnConnectionDataBlockedFrameCodecTest extends AbstractAsnFrameCodecTest<ConnectionDataBlockedFrame> {
+
+   public AsnConnectionDataBlockedFrameCodecTest() {
+     super(ConnectionDataBlockedFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // maxOffset = 0
+         {
+             ConnectionDataBlockedFrame.builder()
+                 .maxOffset(UnsignedLong.ZERO)
+                 .build()
+         },
+         // maxOffset = 1
+         {
+             ConnectionDataBlockedFrame.builder()
+                 .maxOffset(UnsignedLong.ONE)
+                 .build()
+         },
+         // maxOffset = 10
+         {
+             ConnectionDataBlockedFrame.builder()
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // maxOffset = Long.Max - 1
+         {
+             ConnectionDataBlockedFrame.builder()
+                 .maxOffset(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // maxOffset = Long.Max
+         {
+             ConnectionDataBlockedFrame.builder()
+                 .maxOffset(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+     });
+   }
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameCodecTest.java
new file mode 100644
index 0000000..b82ff98
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionDataMaxFrameCodecTest.java
@@ -0,0 +1,82 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.ConnectionDataMaxFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnConnectionDataMaxFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnConnectionDataMaxFrameCodecTest extends AbstractAsnFrameCodecTest<ConnectionDataMaxFrame> {
+
+   public AsnConnectionDataMaxFrameCodecTest() {
+     super(ConnectionDataMaxFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // maxOffset = 0
+         {
+             ConnectionDataMaxFrame.builder()
+                 .maxOffset(UnsignedLong.ZERO)
+                 .build()
+         },
+         // maxOffset = 1
+         {
+             ConnectionDataMaxFrame.builder()
+                 .maxOffset(UnsignedLong.ONE)
+                 .build()
+         },
+         // maxOffset = 10
+         {
+             ConnectionDataMaxFrame.builder()
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // maxOffset = Long.Max -1
+         {
+             ConnectionDataMaxFrame.builder()
+                 .maxOffset(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // maxOffset = Long.Max
+         {
+             ConnectionDataMaxFrame.builder()
+                 .maxOffset(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+     });
+   }
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameCodecTest.java
new file mode 100644
index 0000000..a3fa72e
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionMaxStreamIdFrameCodecTest.java
@@ -0,0 +1,82 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.ConnectionMaxStreamIdFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnConnectionMaxStreamIdFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnConnectionMaxStreamIdFrameCodecTest extends AbstractAsnFrameCodecTest<ConnectionMaxStreamIdFrame> {
+
+   public AsnConnectionMaxStreamIdFrameCodecTest() {
+     super(ConnectionMaxStreamIdFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // maxStreamId = 0
+         {
+             ConnectionMaxStreamIdFrame.builder()
+                 .maxStreamId(UnsignedLong.ZERO)
+                 .build()
+         },
+         // maxStreamId = 1
+         {
+             ConnectionMaxStreamIdFrame.builder()
+                 .maxStreamId(UnsignedLong.ONE)
+                 .build()
+         },
+         // maxStreamId = 10
+         {
+             ConnectionMaxStreamIdFrame.builder()
+                 .maxStreamId(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // maxStreamId = Long.Max - 1
+         {
+             ConnectionMaxStreamIdFrame.builder()
+                 .maxStreamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // maxStreamId = Long.Max
+         {
+             ConnectionMaxStreamIdFrame.builder()
+                 .maxStreamId(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+     });
+   }
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameCodecTest.java
new file mode 100644
index 0000000..7221889
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionNewAddressFrameCodecTest.java
@@ -0,0 +1,81 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.core.InterledgerAddress;
+ import org.interledger.stream.frames.ConnectionNewAddressFrame;
+
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnConnectionNewAddressFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnConnectionNewAddressFrameCodecTest extends AbstractAsnFrameCodecTest<ConnectionNewAddressFrame> {
+
+   private static final String JUST_RIGHT =
+       "g.foo.0123"
+           + "45678901234567890123456789012345678901234567890123456789012345678901234567890123456"
+           + "78901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+           + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012"
+           + "34567890123456789012345678901234567890123456789012345678901234567890123456789012345"
+           + "67890123456789012345678901234567890123456789012345678901234567890123456789012345678"
+           + "90123456789012345678901234567890123456789012345678901234567890123456789012345678901"
+           + "23456789012345678901234567890123456789012345678901234567890123456789012345678901234"
+           + "56789012345678901234567890123456789012345678901234567890123456789012345678901234567"
+           + "89012345678901234567890123456789012345678901234567890123456789012345678901234567890"
+           + "12345678901234567890123456789012345678901234567890123456789012345678901234567890123"
+           + "45678901234567890123456789012345678901234567890123456789012345678901234567890123456"
+           + "78901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+           + "01234567891234567";
+
+   public AsnConnectionNewAddressFrameCodecTest() {
+     super(ConnectionNewAddressFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+
+         // short address
+         {
+             ConnectionNewAddressFrame.builder()
+                 .sourceAddress(InterledgerAddress.of("test.foo"))
+                 .build()
+         },
+         // long address
+         {
+             ConnectionNewAddressFrame.builder()
+                 .sourceAddress(InterledgerAddress.of(JUST_RIGHT))
+                 .build()
+         },
+     });
+   }
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameCodecTest.java
new file mode 100644
index 0000000..0721979
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnConnectionStreamIdBlockedFrameCodecTest.java
@@ -0,0 +1,83 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.ConnectionStreamIdBlockedFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnConnectionStreamIdBlockedFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnConnectionStreamIdBlockedFrameCodecTest extends
+     AbstractAsnFrameCodecTest<ConnectionStreamIdBlockedFrame> {
+
+   public AsnConnectionStreamIdBlockedFrameCodecTest() {
+     super(ConnectionStreamIdBlockedFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // maxStreamId = 0
+         {
+             ConnectionStreamIdBlockedFrame.builder()
+                 .maxStreamId(UnsignedLong.ZERO)
+                 .build()
+         },
+         // maxStreamId = 1
+         {
+             ConnectionStreamIdBlockedFrame.builder()
+                 .maxStreamId(UnsignedLong.ONE)
+                 .build()
+         },
+         // maxStreamId = 10
+         {
+             ConnectionStreamIdBlockedFrame.builder()
+                 .maxStreamId(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // maxStreamId = Long.Max - 1
+         {
+             ConnectionStreamIdBlockedFrame.builder()
+                 .maxStreamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // maxStreamId = Long.Max
+         {
+             ConnectionStreamIdBlockedFrame.builder()
+                 .maxStreamId(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+     });
+   }
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameCodecTest.java
new file mode 100644
index 0000000..91c05b1
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamCloseFrameCodecTest.java
@@ -0,0 +1,117 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.ErrorCode;
+ import org.interledger.stream.frames.StreamCloseFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnStreamCloseFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnStreamCloseFrameCodecTest extends AbstractAsnFrameCodecTest<StreamCloseFrame> {
+
+   public AsnStreamCloseFrameCodecTest() {
+     super(StreamCloseFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // streamId=0
+         {
+             StreamCloseFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .errorCode(ErrorCode.NoError)
+                 .errorMessage("the error")
+                 .build()
+         },
+         // streamId=1
+         {
+             StreamCloseFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .errorCode(ErrorCode.NoError)
+                 .errorMessage("the error")
+                 .build()
+         },
+         // streamId=10
+         {
+             StreamCloseFrame.builder()
+                 .streamId(UnsignedLong.valueOf(10L))
+                 .errorCode(ErrorCode.NoError)
+                 .errorMessage("the error")
+                 .build()
+         },
+         // streamId=Max-1
+         {
+             StreamCloseFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .errorCode(ErrorCode.NoError)
+                 .errorMessage("the error")
+                 .build()
+         },
+         // streamId=Max
+         {
+             StreamCloseFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE)
+                 .errorCode(ErrorCode.NoError)
+                 .errorMessage("the error")
+                 .build()
+         },
+         // emptyErrorMessage
+         {
+             StreamCloseFrame.builder()
+                 .streamId(UnsignedLong.valueOf(10L))
+                 .errorCode(ErrorCode.NoError)
+                 .build()
+         },
+         // longErrorMessage
+         {
+             StreamCloseFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .errorCode(ErrorCode.NoError)
+                 .errorMessage(
+                     "the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error the error ")
+                 .build()
+         },
+         // OtherCode.
+         {
+             StreamCloseFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .errorCode(ErrorCode.ProtocolViolation)
+                 .errorMessage("the error")
+                 .build()
+         },
+     });
+   }
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameCodecTest.java
new file mode 100644
index 0000000..c982942
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataBlockedFrameCodecTest.java
@@ -0,0 +1,124 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.StreamDataBlockedFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnStreamDataBlockedFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnStreamDataBlockedFrameCodecTest extends AbstractAsnFrameCodecTest<StreamDataBlockedFrame> {
+
+   public AsnStreamDataBlockedFrameCodecTest() {
+     super(StreamDataBlockedFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // streamId=0
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=1
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=10
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.valueOf(10L))
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=Max-1
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=Max
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE)
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // MaxOffset=0
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.ZERO)
+                 .build()
+         },
+         // MaxOffset=1
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.ONE)
+                 .build()
+         },
+         // MaxOffset=10
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // MaxOffset=Max-1
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // MaxOffset=Max
+         {
+             StreamDataBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+
+     });
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameCodecTest.java
new file mode 100644
index 0000000..abe45f0
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataFrameCodecTest.java
@@ -0,0 +1,142 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.crypto.Random;
+ import org.interledger.stream.frames.StreamDataFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnStreamDataFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnStreamDataFrameCodecTest extends AbstractAsnFrameCodecTest<StreamDataFrame> {
+
+   public AsnStreamDataFrameCodecTest() {
+     super(StreamDataFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // streamId=0
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .offset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=1
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .offset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=10
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.valueOf(10L))
+                 .offset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=Max-1
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .offset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=Max
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE)
+                 .offset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // Offset=0
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .offset(UnsignedLong.ZERO)
+                 .build()
+         },
+         // Offset=1
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .offset(UnsignedLong.ONE)
+                 .build()
+         },
+         // Offset=10
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .offset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // Offset=Max-1
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .offset(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // Offset=Max
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .offset(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+
+         // small data
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .offset(UnsignedLong.MAX_VALUE)
+                 .data((byte) 1)
+                 .build()
+         },
+
+         // bigger data
+         {
+             StreamDataFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .offset(UnsignedLong.MAX_VALUE)
+                 .data(Random.randBytes(512))
+                 .build()
+         },
+     });
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameCodecTest.java
new file mode 100644
index 0000000..ea75819
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamDataMaxFrameCodecTest.java
@@ -0,0 +1,124 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.StreamDataMaxFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnStreamDataMaxFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnStreamDataMaxFrameCodecTest extends AbstractAsnFrameCodecTest<StreamDataMaxFrame> {
+
+   public AsnStreamDataMaxFrameCodecTest() {
+     super(StreamDataMaxFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // streamId=0
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=1
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=10
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.valueOf(10L))
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=Max-1
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=Max
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE)
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // MaxOffset=0
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.ZERO)
+                 .build()
+         },
+         // MaxOffset=1
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.ONE)
+                 .build()
+         },
+         // MaxOffset=10
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // MaxOffset=Max-1
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // MaxOffset=Max
+         {
+             StreamDataMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .maxOffset(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+
+     });
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameCodecTest.java
new file mode 100644
index 0000000..cb6c440
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyBlockedFrameCodecTest.java
@@ -0,0 +1,173 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.StreamMoneyBlockedFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnStreamMoneyBlockedFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnStreamMoneyBlockedFrameCodecTest extends AbstractAsnFrameCodecTest<StreamMoneyBlockedFrame> {
+
+   public AsnStreamMoneyBlockedFrameCodecTest() {
+     super(StreamMoneyBlockedFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // streamId=0
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // streamId=1
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // streamId=10
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.valueOf(10L))
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // streamId=Max-1
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // streamId=Max
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // SendMax=0
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.ZERO)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // SendMax=1
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // SendMax=10
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.valueOf(10L))
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // SendMax=Max-1
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // SendMax=Max
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.MAX_VALUE)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // totalSent=0
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.ZERO)
+                 .build()
+         },
+         // totalSent=1
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.ONE)
+                 .build()
+         },
+         // totalSent=10
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // totalSent=Max-1
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // totalSent=Max
+         {
+             StreamMoneyBlockedFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .sendMax(UnsignedLong.ONE)
+                 .totalSent(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+
+     });
+   }
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameCodecTest.java
new file mode 100644
index 0000000..fe1299f
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyFrameCodecTest.java
@@ -0,0 +1,124 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.stream.frames.StreamMoneyFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnStreamMoneyFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnStreamMoneyFrameCodecTest extends AbstractAsnFrameCodecTest<StreamMoneyFrame> {
+
+   public AsnStreamMoneyFrameCodecTest() {
+     super(StreamMoneyFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // streamId=0
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .shares(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=1
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .shares(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=10
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.valueOf(10L))
+                 .shares(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=Max-1
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .shares(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // streamId=Max
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE)
+                 .shares(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // Shares=0
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .shares(UnsignedLong.ZERO)
+                 .build()
+         },
+         // Shares=1
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .shares(UnsignedLong.ONE)
+                 .build()
+         },
+         // Shares=10
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .shares(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // Shares=Max-1
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .shares(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // Shares=Max
+         {
+             StreamMoneyFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .shares(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+
+     });
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameCodecTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameCodecTest.java
new file mode 100644
index 0000000..e98e201
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/AsnStreamMoneyMaxFrameCodecTest.java
@@ -0,0 +1,175 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+
+ import org.interledger.stream.frames.StreamMoneyMaxFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.runner.RunWith;
+ import org.junit.runners.Parameterized;
+ import org.junit.runners.Parameterized.Parameters;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+
+ /**
+  * Unit tests for {@link AsnStreamMoneyMaxFrameCodec}.
+  */
+ @RunWith(Parameterized.class)
+ public class AsnStreamMoneyMaxFrameCodecTest extends AbstractAsnFrameCodecTest<StreamMoneyMaxFrame> {
+
+   public AsnStreamMoneyMaxFrameCodecTest() {
+     super(StreamMoneyMaxFrame.class);
+   }
+
+   /**
+    * The data for this test...
+    */
+   @Parameters
+   public static Collection<Object[]> data() {
+
+     return Arrays.asList(new Object[][] {
+         // streamId=0
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ZERO)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // streamId=1
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // streamId=10
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.valueOf(10L))
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // streamId=Max-1
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // streamId=Max
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.MAX_VALUE)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // ReceiveMax=0
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.ZERO)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // ReceiveMax=1
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // ReceiveMax=10
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.valueOf(10L))
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // ReceiveMax=Max-1
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // ReceiveMax=Max
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.MAX_VALUE)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // totalReceived=0
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.ZERO)
+                 .build()
+         },
+         // totalReceived=1
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.ONE)
+                 .build()
+         },
+         // totalReceived=10
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.valueOf(10L))
+                 .build()
+         },
+         // totalReceived=Max-1
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.MAX_VALUE.minus(UnsignedLong.ONE))
+                 .build()
+         },
+         // totalReceived=Max
+         {
+             StreamMoneyMaxFrame.builder()
+                 .streamId(UnsignedLong.ONE)
+                 .receiveMax(UnsignedLong.ONE)
+                 .totalReceived(UnsignedLong.MAX_VALUE)
+                 .build()
+         },
+
+     });
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/FrameCodecPerfTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/FrameCodecPerfTest.java
new file mode 100644
index 0000000..3899be5
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/FrameCodecPerfTest.java
@@ -0,0 +1,105 @@
+ /*-
+  * ========================LICENSE_START=================================
+  * Interledger Core Codecs
+  * %%
+  * Copyright (C) 2017 - 2018 Hyperledger and its contributors
+  * %%
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * =========================LICENSE_END==================================
+  */
+
+ package org.interledger.codecs.stream.frame;
+
+ import org.interledger.codecs.stream.StreamCodecContextFactory;
+ import org.interledger.encoding.asn.framework.CodecContext;
+ import org.interledger.stream.frames.ConnectionDataMaxFrame;
+
+ import com.google.common.primitives.UnsignedLong;
+ import org.junit.Test;
+
+ import java.io.ByteArrayInputStream;
+ import java.io.ByteArrayOutputStream;
+ import java.io.IOException;
+ import java.text.NumberFormat;
+ import java.util.Locale;
+
+ /**
+  * Unit test to see how long it takes to serialize/deserialize frames when the codec use a BigInteger vs an
+  * UnsignedLong vs a Long.
+  */
+ public class FrameCodecPerfTest {
+
+   /**
+    * This test measures the avg amount of time to serialize and deserialize 1M frames.
+    *
+    * <pre>
+    * Results:
+    * =======
+    * long: 1M Frames --> 0.9s (1,111,111 fps)
+    * long: 10M Frames --> 6.2s (1,612,903 fps)
+    *
+    * UnsignedLong: 1M Frames --> 0.9s (1,111,111 fps)
+    * UnsignedLong: 10M Frames --> 6.4s (1,562,500 fps)
+    * UnsignedLong: 100M Frames --> 52s (1,922,485 fps)
+    *
+    * BigInteger: 1M Frames --> 1.06s (943,396 fps)
+    * BigInteger: 10M Frames --> 6.9s (1,449,275 fps)
+    * </pre>
+    */
+   @Test
+   public void testPerf() throws IOException {
+     final CodecContext context = StreamCodecContextFactory.oer();
+     final ConnectionDataMaxFrame frame = ConnectionDataMaxFrame.builder()
+         .maxOffset(UnsignedLong.ZERO)
+         //.maxOffset(BigInteger.ZERO)
+         //.maxOffset(0)
+         .build();
+     final int numFrames = 1000;
+
+     // Warmup
+     for (int i = 0; i < 50; i++) {
+       // Serialize
+       final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+       context.write(frame, outputStream);
+       final ByteArrayInputStream asn1OerFrameBytes = new ByteArrayInputStream(outputStream.toByteArray());
+
+       // DeSerialize
+       context.read(ConnectionDataMaxFrame.class, asn1OerFrameBytes);
+     }
+
+     final long start = System.nanoTime();
+     final long startMs = System.currentTimeMillis();
+     for (int i = 0; i < numFrames; i++) {
+       // Serialize
+       final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+       context.write(frame, outputStream);
+       final ByteArrayInputStream asn1OerFrameBytes = new ByteArrayInputStream(outputStream.toByteArray());
+
+       // DeSerialize
+       context.read(ConnectionDataMaxFrame.class, asn1OerFrameBytes);
+     }
+
+     final long end = System.nanoTime();
+     final long endMs = System.currentTimeMillis();
+     final long duration = (end - start);
+     final long durationMs = (endMs - startMs);
+
+     System.out.println(
+         String.format("Serialize+Deserialize %s frames took %s ns (%s ms)",
+             NumberFormat.getNumberInstance(Locale.US).format(numFrames),
+             NumberFormat.getNumberInstance(Locale.US).format(duration),
+             NumberFormat.getNumberInstance(Locale.US).format(durationMs)
+         ));
+   }
+
+ }
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/ValidStreamFrameVectorsTest.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/ValidStreamFrameVectorsTest.java
new file mode 100644
index 0000000..af23bd0
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/ValidStreamFrameVectorsTest.java
@@ -0,0 +1,225 @@
+package org.interledger.codecs.stream.frame;
+
+/*-
+ * ========================LICENSE_START=================================
+ * Crypto Conditions
+ * %%
+ * Copyright (C) 2016 - 2018 Ripple Labs
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================LICENSE_END==================================
+ */
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.interledger.codecs.stream.StreamCodecContextFactory;
+import org.interledger.codecs.stream.frame.helpers.StreamFrameTestVector;
+import org.interledger.core.InterledgerAddress;
+import org.interledger.stream.frames.ConnectionAssetDetailsFrame;
+import org.interledger.stream.frames.ConnectionCloseFrame;
+import org.interledger.stream.frames.ConnectionDataBlockedFrame;
+import org.interledger.stream.frames.ConnectionDataMaxFrame;
+import org.interledger.stream.frames.ConnectionMaxStreamIdFrame;
+import org.interledger.stream.frames.ConnectionNewAddressFrame;
+import org.interledger.stream.frames.ConnectionStreamIdBlockedFrame;
+import org.interledger.stream.frames.ErrorCode;
+import org.interledger.stream.frames.StreamCloseFrame;
+import org.interledger.stream.frames.StreamDataBlockedFrame;
+import org.interledger.stream.frames.StreamDataFrame;
+import org.interledger.stream.frames.StreamDataMaxFrame;
+import org.interledger.stream.frames.StreamFrame;
+import org.interledger.stream.frames.StreamFrameType;
+import org.interledger.stream.frames.StreamMoneyBlockedFrame;
+import org.interledger.stream.frames.StreamMoneyFrame;
+import org.interledger.stream.frames.StreamMoneyMaxFrame;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.google.common.primitives.UnsignedLong;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Base64;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * <p>This class tests the Java implementation of STREAM based on a set of pre-computed and validated test
+ * vectors found in the file `ValidStreamFrameVectorsTest.json`.</p>
+ */
+@RunWith(Parameterized.class)
+public class ValidStreamFrameVectorsTest {
+
+  private StreamFrameTestVector streamFrameTestVector;
+
+  public ValidStreamFrameVectorsTest(StreamFrameTestVector streamFrameTestVector) {
+    this.streamFrameTestVector = streamFrameTestVector;
+  }
+
+  /**
+   * Loads a list of tests based on the json-encoded test vector files.
+   */
+  @Parameters(name = "Test Vector {index}: {0}")
+  public static Collection<StreamFrameTestVector> testVectorData() throws Exception {
+    Path path = Paths.get(ValidStreamFrameVectorsTest.class.getClassLoader()
+        .getResource("ValidStreamFrameVectorsTest.json").toURI());
+
+    Stream<String> lines = Files.lines(path);
+    String data = lines.collect(Collectors.joining("\n"));
+    lines.close();
+
+    final ObjectMapper objectMapper = new ObjectMapper();
+    objectMapper.registerModule(new Jdk8Module());
+    objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+    List<StreamFrameTestVector> vectors = objectMapper
+        .readValue(data, new TypeReference<List<StreamFrameTestVector>>() {
+        });
+
+    return vectors;
+  }
+
+  /**
+   * This test parses the conditionBinary, serializes it as a URI, and validates that the generated URI matches
+   * "conditionUri" from the test vector.
+   */
+  @Test
+  public void testParseConditionBinary() throws IOException {
+
+    StreamFrameType type = StreamFrameType.valueOf(streamFrameTestVector.type());
+
+    StreamFrame frameFromTestVectorFile = null;
+    switch (type) {
+      case ConnectionClose: {
+        frameFromTestVectorFile = ConnectionCloseFrame.builder()
+            .errorCode(ErrorCode.of(streamFrameTestVector.errorCode().get()))
+            .errorMessage(streamFrameTestVector.errorMessage())
+            .build();
+        break;
+      }
+      case ConnectionNewAddress: {
+        frameFromTestVectorFile = ConnectionNewAddressFrame.builder()
+            .sourceAddress(InterledgerAddress.of(streamFrameTestVector.sourceAddress().get()))
+            .build();
+        break;
+      }
+      case ConnectionDataMax: {
+        frameFromTestVectorFile = ConnectionDataMaxFrame.builder()
+            .maxOffset(UnsignedLong.valueOf(streamFrameTestVector.maxOffset().get()))
+            .build();
+        break;
+      }
+      case ConnectionDataBlocked: {
+        frameFromTestVectorFile = ConnectionDataBlockedFrame.builder()
+            .maxOffset(UnsignedLong.valueOf(streamFrameTestVector.maxOffset().get()))
+            .build();
+        break;
+      }
+      case ConnectionMaxStreamId: {
+        frameFromTestVectorFile = ConnectionMaxStreamIdFrame.builder()
+            .maxStreamId(UnsignedLong.valueOf(streamFrameTestVector.maxStreamId().get()))
+            .build();
+        break;
+      }
+      case ConnectionStreamIdBlocked: {
+        frameFromTestVectorFile = ConnectionStreamIdBlockedFrame.builder()
+            .maxStreamId(UnsignedLong.valueOf(streamFrameTestVector.maxStreamId().get()))
+            .build();
+        break;
+      }
+      case StreamClose: {
+        frameFromTestVectorFile = StreamCloseFrame.builder()
+            .streamId(UnsignedLong.valueOf(streamFrameTestVector.streamId().get()))
+            .errorCode(ErrorCode.of(streamFrameTestVector.errorCode().get()))
+            .errorMessage(streamFrameTestVector.errorMessage().get())
+            .build();
+        break;
+      }
+      case StreamMoney: {
+        frameFromTestVectorFile = StreamMoneyFrame.builder()
+            .streamId(UnsignedLong.valueOf(streamFrameTestVector.streamId().get()))
+            .shares(UnsignedLong.valueOf(streamFrameTestVector.shares().get()))
+            .build();
+        break;
+      }
+      case StreamMoneyMax: {
+        frameFromTestVectorFile = StreamMoneyMaxFrame.builder()
+            .streamId(UnsignedLong.valueOf(streamFrameTestVector.streamId().get()))
+            .totalReceived(UnsignedLong.valueOf(streamFrameTestVector.totalReceived().get()))
+            .receiveMax(UnsignedLong.valueOf(streamFrameTestVector.receiveMax().get()))
+            .build();
+        break;
+      }
+      case StreamMoneyBlocked: {
+        frameFromTestVectorFile = StreamMoneyBlockedFrame.builder()
+            .streamId(UnsignedLong.valueOf(streamFrameTestVector.streamId().get()))
+            .sendMax(UnsignedLong.valueOf(streamFrameTestVector.sendMax().get()))
+            .totalSent(UnsignedLong.valueOf(streamFrameTestVector.totalSent().get()))
+            .build();
+        break;
+      }
+      case StreamData: {
+        frameFromTestVectorFile = StreamDataFrame.builder()
+            .streamId(UnsignedLong.valueOf(streamFrameTestVector.streamId().get()))
+            .offset(UnsignedLong.valueOf(streamFrameTestVector.offset().get()))
+            .data(Base64.getDecoder().decode(streamFrameTestVector.base64Data().get()))
+            .build();
+        break;
+      }
+      case StreamDataMax: {
+        frameFromTestVectorFile = StreamDataMaxFrame.builder()
+            .streamId(UnsignedLong.valueOf(streamFrameTestVector.streamId().get()))
+            .maxOffset(UnsignedLong.valueOf(streamFrameTestVector.maxOffset().get()))
+            .build();
+        break;
+      }
+      case StreamDataBlocked: {
+        frameFromTestVectorFile = StreamDataBlockedFrame.builder()
+            .streamId(UnsignedLong.valueOf(streamFrameTestVector.streamId().get()))
+            .maxOffset(UnsignedLong.valueOf(streamFrameTestVector.maxOffset().get()))
+            .build();
+        break;
+      }
+      case ConnectionAssetDetails: {
+        frameFromTestVectorFile = ConnectionAssetDetailsFrame.builder()
+            .sourceAssetCode(streamFrameTestVector.sourceAssetCode().get())
+            .sourceAssetScale(streamFrameTestVector.sourceAssetScale().get())
+            .build();
+        break;
+      }
+    }
+
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    StreamCodecContextFactory.oer().write(frameFromTestVectorFile, byteArrayOutputStream);
+
+    assertThat(Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray()))
+        .isEqualTo(streamFrameTestVector.expectedAsn1OerBytes());
+
+    // Read the bytes, and ensure they match.
+    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+    final StreamFrame decodedStreamFrame = StreamCodecContextFactory.oer()
+        .read(StreamFrame.class, byteArrayInputStream);
+    assertThat(decodedStreamFrame).isEqualTo(frameFromTestVectorFile);
+  }
+}
diff --git a/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/helpers/StreamFrameTestVector.java b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/helpers/StreamFrameTestVector.java
new file mode 100644
index 0000000..1d037e9
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/java/org/interledger/codecs/stream/frame/helpers/StreamFrameTestVector.java
@@ -0,0 +1,48 @@
+package org.interledger.codecs.stream.frame.helpers;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.immutables.value.Value.Immutable;
+
+import java.util.Optional;
+
+@Immutable
+@JsonDeserialize(as = ImmutableStreamFrameTestVector.class)
+@JsonSerialize(as = ImmutableStreamFrameTestVector.class)
+public interface StreamFrameTestVector {
+
+  String type();
+
+  Optional<Short> errorCode();
+
+  Optional<String> errorMessage();
+
+  Optional<String> sourceAddress();
+
+  Optional<Long> streamId();
+
+  Optional<Long> maxStreamId();
+
+  Optional<Short> offset();
+
+  Optional<Short> maxOffset();
+
+  Optional<Long> shares();
+
+  Optional<Long> receiveMax();
+
+  Optional<Long> totalReceived();
+
+  Optional<Long> sendMax();
+
+  Optional<Long> totalSent();
+
+  Optional<String> sourceAssetCode();
+
+  Optional<Short> sourceAssetScale();
+
+  Optional<String> base64Data();
+
+  String expectedAsn1OerBytes();
+
+}
diff --git a/codecs-parent/codecs-stream/src/test/resources/ValidStreamFrameVectorsTest.json b/codecs-parent/codecs-stream/src/test/resources/ValidStreamFrameVectorsTest.json
new file mode 100644
index 0000000..33c8067
--- /dev/null
+++ b/codecs-parent/codecs-stream/src/test/resources/ValidStreamFrameVectorsTest.json
@@ -0,0 +1,85 @@
+[
+  {
+    "type": "ConnectionClose",
+    "errorCode": "1",
+    "errorMessage": "I have to tell you something about the future!",
+    "expectedAsn1OerBytes": "ATABLkkgaGF2ZSB0byB0ZWxsIHlvdSBzb21ldGhpbmcgYWJvdXQgdGhlIGZ1dHVyZSE="
+  },
+  {
+    "type": "ConnectionNewAddress",
+    "sourceAddress": "test.example.marty",
+    "expectedAsn1OerBytes": "AhMSdGVzdC5leGFtcGxlLm1hcnR5"
+  },
+  {
+    "type": "ConnectionDataMax",
+    "maxOffset": "2",
+    "expectedAsn1OerBytes": "AwIBAg=="
+  },
+  {
+    "type": "ConnectionDataBlocked",
+    "maxOffset": "3",
+    "expectedAsn1OerBytes": "BAIBAw=="
+  },
+  {
+    "type": "ConnectionMaxStreamId",
+    "maxStreamId": "4",
+    "expectedAsn1OerBytes": "BQIBBA=="
+  },
+  {
+    "type": "ConnectionStreamIdBlocked",
+    "maxStreamId": "5",
+    "expectedAsn1OerBytes": "BgIBBQ=="
+  },
+  {
+    "type": "StreamClose",
+    "streamId": 6,
+    "errorCode": 7,
+    "errorMessage": "I have to tell you something about the future!",
+    "expectedAsn1OerBytes": "EDIBBgcuSSBoYXZlIHRvIHRlbGwgeW91IHNvbWV0aGluZyBhYm91dCB0aGUgZnV0dXJlIQ=="
+  },
+  {
+    "type": "StreamMoney",
+    "streamId": 8,
+    "shares": 9,
+    "expectedAsn1OerBytes": "EQQBCAEJ"
+  },
+  {
+    "type": "StreamMoneyMax",
+    "streamId": 10,
+    "receiveMax": 11,
+    "totalReceived": 12,
+    "expectedAsn1OerBytes": "EgYBCgELAQw="
+  },
+  {
+    "type": "StreamMoneyBlocked",
+    "streamId": 13,
+    "sendMax": 14,
+    "totalSent": 15,
+    "expectedAsn1OerBytes": "EwYBDQEOAQ8="
+  },
+  {
+    "type": "StreamData",
+    "streamId": 16,
+    "offset": 17,
+    "base64Data": "foo",
+    "expectedAsn1OerBytes": "FAcBEAERAn6K"
+  },
+  {
+    "type": "StreamDataMax",
+    "streamId": 18,
+    "maxOffset": 19,
+    "expectedAsn1OerBytes": "FQQBEgET"
+  },
+  {
+    "type": "StreamDataBlocked",
+    "streamId": 20,
+    "maxOffset": 21,
+    "expectedAsn1OerBytes": "FgQBFAEV"
+  },
+  {
+    "type": "ConnectionAssetDetails",
+    "sourceAssetCode": "USD",
+    "sourceAssetScale": 22,
+    "expectedAsn1OerBytes": "BwUDVVNEFg=="
+  }
+]
diff --git a/stream-parent/stream-core/src/test/java/org/interledger/stream/StreamUtilsTest.java b/stream-parent/stream-core/src/test/java/org/interledger/stream/StreamUtilsTest.java
index a0fdb9a..ee0e0fe 100644
--- a/stream-parent/stream-core/src/test/java/org/interledger/stream/StreamUtilsTest.java
+++ b/stream-parent/stream-core/src/test/java/org/interledger/stream/StreamUtilsTest.java
@@ -1,8 +1,6 @@
 package org.interledger.stream;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsNull.nullValue;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
 
 import org.interledger.core.InterledgerFulfillment;
@@ -10,8 +8,6 @@ import org.interledger.core.InterledgerFulfillment;
 import com.google.common.primitives.UnsignedLong;
 import org.junit.Test;
 
-import java.security.SignatureException;
-
 /**
  * Unit tests for {@link StreamUtils}.
  *
@@ -43,11 +39,11 @@ public class StreamUtilsTest {
   };
 
   @Test
-  public void generatedFulfillableFulfillment() throws SignatureException {
+  public void generatedFulfillableFulfillment() {
     InterledgerFulfillment fulfillment = StreamUtils.generatedFulfillableFulfillment(SHARED_SECRET, DATA);
 
-    assertThat(fulfillment.getPreimage(), is(FULFILLMENT));
-    assertThat(fulfillment, is(InterledgerFulfillment.of(FULFILLMENT)));
+    assertThat(fulfillment.getPreimage()).isEqualTo(FULFILLMENT);
+    assertThat(fulfillment).isEqualTo(InterledgerFulfillment.of(FULFILLMENT));
   }
 
   @Test(expected = NullPointerException.class)
@@ -56,7 +52,7 @@ public class StreamUtilsTest {
       StreamUtils.min(null, UnsignedLong.ONE);
       fail();
     } catch (NullPointerException e) {
-      assertThat(e.getMessage(), is(nullValue()));
+      assertThat(e.getMessage()).isNull();
       throw e;
     }
   }
@@ -67,30 +63,30 @@ public class StreamUtilsTest {
       StreamUtils.min(UnsignedLong.ONE, null);
       fail();
     } catch (NullPointerException e) {
-      assertThat(e.getMessage(), is(nullValue()));
+      assertThat(e.getMessage()).isNull();
       throw e;
     }
   }
 
   @Test
   public void minTests() {
-    assertThat(StreamUtils.min(UnsignedLong.ZERO, UnsignedLong.ZERO), is(UnsignedLong.ZERO));
-    assertThat(StreamUtils.min(UnsignedLong.ONE, UnsignedLong.ZERO), is(UnsignedLong.ZERO));
-    assertThat(StreamUtils.min(UnsignedLong.ZERO, UnsignedLong.ONE), is(UnsignedLong.ZERO));
-    assertThat(StreamUtils.min(UnsignedLong.MAX_VALUE, UnsignedLong.ZERO), is(UnsignedLong.ZERO));
-    assertThat(StreamUtils.min(UnsignedLong.ZERO, UnsignedLong.MAX_VALUE), is(UnsignedLong.ZERO));
-    assertThat(StreamUtils.min(UnsignedLong.ONE, UnsignedLong.MAX_VALUE), is(UnsignedLong.ONE));
-    assertThat(StreamUtils.min(UnsignedLong.MAX_VALUE, UnsignedLong.ONE), is(UnsignedLong.ONE));
+    assertThat(StreamUtils.min(UnsignedLong.ZERO, UnsignedLong.ZERO)).isEqualTo(UnsignedLong.ZERO);
+    assertThat(StreamUtils.min(UnsignedLong.ONE, UnsignedLong.ZERO)).isEqualTo(UnsignedLong.ZERO);
+    assertThat(StreamUtils.min(UnsignedLong.ZERO, UnsignedLong.ONE)).isEqualTo(UnsignedLong.ZERO);
+    assertThat(StreamUtils.min(UnsignedLong.MAX_VALUE, UnsignedLong.ZERO)).isEqualTo(UnsignedLong.ZERO);
+    assertThat(StreamUtils.min(UnsignedLong.ZERO, UnsignedLong.MAX_VALUE)).isEqualTo(UnsignedLong.ZERO);
+    assertThat(StreamUtils.min(UnsignedLong.ONE, UnsignedLong.MAX_VALUE)).isEqualTo(UnsignedLong.ONE);
+    assertThat(StreamUtils.min(UnsignedLong.MAX_VALUE, UnsignedLong.ONE)).isEqualTo(UnsignedLong.ONE);
   }
 
   @Test
   public void maxTests() {
-    assertThat(StreamUtils.max(UnsignedLong.ZERO, UnsignedLong.ZERO), is(UnsignedLong.ZERO));
-    assertThat(StreamUtils.max(UnsignedLong.ONE, UnsignedLong.ZERO), is(UnsignedLong.ONE));
-    assertThat(StreamUtils.max(UnsignedLong.ZERO, UnsignedLong.ONE), is(UnsignedLong.ONE));
-    assertThat(StreamUtils.max(UnsignedLong.MAX_VALUE, UnsignedLong.ZERO), is(UnsignedLong.MAX_VALUE));
-    assertThat(StreamUtils.max(UnsignedLong.ZERO, UnsignedLong.MAX_VALUE), is(UnsignedLong.MAX_VALUE));
-    assertThat(StreamUtils.max(UnsignedLong.ONE, UnsignedLong.MAX_VALUE), is(UnsignedLong.MAX_VALUE));
-    assertThat(StreamUtils.max(UnsignedLong.MAX_VALUE, UnsignedLong.ONE), is(UnsignedLong.MAX_VALUE));
+    assertThat(StreamUtils.max(UnsignedLong.ZERO, UnsignedLong.ZERO)).isEqualTo(UnsignedLong.ZERO);
+    assertThat(StreamUtils.max(UnsignedLong.ONE, UnsignedLong.ZERO)).isEqualTo(UnsignedLong.ONE);
+    assertThat(StreamUtils.max(UnsignedLong.ZERO, UnsignedLong.ONE)).isEqualTo(UnsignedLong.ONE);
+    assertThat(StreamUtils.max(UnsignedLong.MAX_VALUE, UnsignedLong.ZERO)).isEqualTo(UnsignedLong.MAX_VALUE);
+    assertThat(StreamUtils.max(UnsignedLong.ZERO, UnsignedLong.MAX_VALUE)).isEqualTo(UnsignedLong.MAX_VALUE);
+    assertThat(StreamUtils.max(UnsignedLong.ONE, UnsignedLong.MAX_VALUE)).isEqualTo(UnsignedLong.MAX_VALUE);
+    assertThat(StreamUtils.max(UnsignedLong.MAX_VALUE, UnsignedLong.ONE)).isEqualTo(UnsignedLong.MAX_VALUE);
   }
 }
diff --git a/stream-parent/stream-core/src/test/java/org/interledger/stream/crypto/JavaxStreamEncryptionServiceTest.java b/stream-parent/stream-core/src/test/java/org/interledger/stream/crypto/JavaxStreamEncryptionServiceTest.java
index 9ce82af..84700ef 100644
--- a/stream-parent/stream-core/src/test/java/org/interledger/stream/crypto/JavaxStreamEncryptionServiceTest.java
+++ b/stream-parent/stream-core/src/test/java/org/interledger/stream/crypto/JavaxStreamEncryptionServiceTest.java
@@ -1,7 +1,6 @@
 package org.interledger.stream.crypto;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.Is.is;
+import static org.assertj.core.api.Assertions.assertThat;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -44,19 +43,19 @@ public class JavaxStreamEncryptionServiceTest {
   @Test
   public void testEncryptToSameRustJs() {
     byte[] encryptedValue = streamEncryptionService.encryptWithIv(SHARED_SECRET, PLAINTEXT, NONCE_IV);
-    assertThat(encryptedValue, is(CIPHERTEXT));
+    assertThat(encryptedValue).isEqualTo(CIPHERTEXT);
   }
 
   @Test
   public void testDecryptToSameAsRustJs() {
     byte[] decryptedValue = streamEncryptionService.decrypt(SHARED_SECRET, CIPHERTEXT);
-    assertThat(decryptedValue, is(PLAINTEXT));
+    assertThat(decryptedValue).isEqualTo(PLAINTEXT);
   }
 
   @Test
   public void losslesslyEncryptAndDecrypts() {
     byte[] cipherMessage = streamEncryptionService.encrypt(SHARED_SECRET, PLAINTEXT);
     byte[] decryptedValue = streamEncryptionService.decrypt(SHARED_SECRET, cipherMessage);
-    assertThat(decryptedValue, is(PLAINTEXT));
+    assertThat(decryptedValue).isEqualTo(PLAINTEXT);
   }
 }