diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessage.java b/core/java/src/net/i2p/data/i2cp/I2CPMessage.java
index 3cc7da5039b20e0ac537dd410b5cabb71c86465c..9fedbc78a3079d02d0c6f98927d3aad21d04eb93 100644
--- a/core/java/src/net/i2p/data/i2cp/I2CPMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/I2CPMessage.java
@@ -13,14 +13,14 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import net.i2p.data.DataStructure;
-
 /**
  * Defines the base functionality of API messages
  *
+ * As of 0.9.48, does NOT extend DataStructure.
+ *
  * @author jrandom
  */
-public interface I2CPMessage extends DataStructure {
+public interface I2CPMessage {
     /**
      * Read the contents from the input stream into the current class's format.
      * The stream should be the message body as defined by the client access layer
diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java
index 9a46415135a2eb6cbc69d1e64f8287ce71c04c32..f11bbfdb34cb088d7b5ba734b32abf5302b51021 100644
--- a/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java
+++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java
@@ -16,14 +16,15 @@ import java.io.OutputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.data.DataStructureImpl;
 
 /**
  * Defines the base message implementation.
  *
+ * As of 0.9.48, does NOT extend DataStructureImpl.
+ *
  * @author jrandom
  */
-public abstract class I2CPMessageImpl extends DataStructureImpl implements I2CPMessage {
+public abstract class I2CPMessageImpl implements I2CPMessage {
 
     public I2CPMessageImpl() { // nop
     }
diff --git a/core/java/src/net/i2p/data/i2cp/MessageId.java b/core/java/src/net/i2p/data/i2cp/MessageId.java
index 365dc6dbb7928685a634082f8377033d948b5154..086bc01d398fa52c4410de2330aaf5fbeb31c9ec 100644
--- a/core/java/src/net/i2p/data/i2cp/MessageId.java
+++ b/core/java/src/net/i2p/data/i2cp/MessageId.java
@@ -15,15 +15,16 @@ import java.io.OutputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.data.DataStructureImpl;
 
 /**
  * Defines the message ID of a message delivered between a router and a client
  * in a particular session.  These IDs are not globally unique.
  *
+ * As of 0.9.48, does NOT extend DataStructureImpl.
+ *
  * @author jrandom
  */
-public class MessageId extends DataStructureImpl {
+public class MessageId {
     private long _messageId;
 
     public MessageId() {
diff --git a/core/java/src/net/i2p/data/i2cp/SessionId.java b/core/java/src/net/i2p/data/i2cp/SessionId.java
index 8bf373625a1c0be4ae5c154fa663ddf436ad7ee8..740b0b6e90ce2b2d7b56348ee2a6b45339ad5797 100644
--- a/core/java/src/net/i2p/data/i2cp/SessionId.java
+++ b/core/java/src/net/i2p/data/i2cp/SessionId.java
@@ -14,15 +14,16 @@ import java.io.OutputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.data.DataStructureImpl;
 
 /**
  * Defines the token passed between the router and client to associate messages
  * with a particular session.  These IDs are not globally unique.
  *
+ * As of 0.9.48, does NOT extend DataStructureImpl.
+ *
  * @author jrandom
  */
-public class SessionId extends DataStructureImpl {
+public class SessionId {
     private int _sessionId;
 
     public SessionId() {
diff --git a/core/java/test/junit/net/i2p/data/TunnelIdTest.java b/core/java/test/junit/net/i2p/data/TunnelIdTest.java
index ffa9f303d609277179c779adeee917e7baa15d83..9c087d9572be2a4724e8a2d5e7636f7b72e62abc 100644
--- a/core/java/test/junit/net/i2p/data/TunnelIdTest.java
+++ b/core/java/test/junit/net/i2p/data/TunnelIdTest.java
@@ -26,7 +26,7 @@ public class TunnelIdTest extends StructureTest {
      * so we can test it as a structure
      * @since 0.9.48 TunnelId no longer extends DataStructureImpl
      */
-    private class TunnelIdStructure extends TunnelId implements DataStructure {
+    private static class TunnelIdStructure extends TunnelId implements DataStructure {
         public Hash calculateHash() { return null; }
         public void fromByteArray(byte[] in) {}
         public byte[] toByteArray() { return null; }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/BandwidthLimitsMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/BandwidthLimitsMessageTest.java
index b59870e5b8fbe690040cdb65a470bc6cc1ef18d5..bf1bd5f40a9f3c9c88ce9f741351b4f33d7f1b0c 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/BandwidthLimitsMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/BandwidthLimitsMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,10 +15,10 @@ import net.i2p.data.DataFormatException;
  *
  * @author str4d
  */
-public class BandwidthLimitsMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class BandwidthLimitsMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         BandwidthLimitsMessage msg = new BandwidthLimitsMessage(10240, 1024);
         return msg;
     }
-    public DataStructure createStructureToRead() { return new BandwidthLimitsMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new BandwidthLimitsMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/CreateLeaseSetMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/CreateLeaseSetMessageTest.java
index 1bd017b0c55b97ef8aae93c37c72a4f26b51ff8d..0e1d0c052d55b5e7060e170480aa6f99b91a7181 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/CreateLeaseSetMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/CreateLeaseSetMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.PrivateKey;
 import net.i2p.data.PrivateKeyTest;
@@ -23,8 +21,8 @@ import net.i2p.data.LeaseSetTest;
  *
  * @author jrandom
  */
-public class CreateLeaseSetMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class CreateLeaseSetMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         CreateLeaseSetMessage msg = new CreateLeaseSetMessage();
     	msg.setPrivateKey((PrivateKey)(new PrivateKeyTest()).createDataStructure());
     	msg.setSigningPrivateKey((SigningPrivateKey)(new SigningPrivateKeyTest()).createDataStructure());
@@ -32,5 +30,5 @@ public class CreateLeaseSetMessageTest extends StructureTest {
         msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new CreateLeaseSetMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new CreateLeaseSetMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/CreateSessionMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/CreateSessionMessageTest.java
index 9e0db391a5350df8d4fcc2eb4c154f81206fb2e6..c5982d4890e6c45a0f169cad3f4c3e4bcd34c832 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/CreateSessionMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/CreateSessionMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,11 +15,11 @@ import net.i2p.data.DataFormatException;
  *
  * @author jrandom
  */
-public class CreateSessionMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class CreateSessionMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         CreateSessionMessage msg = new CreateSessionMessage();
         msg.setSessionConfig((SessionConfig)(new SessionConfigTest()).createDataStructure());
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new CreateSessionMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new CreateSessionMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/DestLookupMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/DestLookupMessageTest.java
index 2dc213d4a58c2014f11e53366ad649c520527351..b978ec3930817850c0b9111bf0ffb241fd206393 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/DestLookupMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/DestLookupMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Hash;
 import net.i2p.util.RandomSource;
@@ -19,13 +17,13 @@ import net.i2p.util.RandomSource;
  *
  * @author str4d
  */
-public class DestLookupMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class DestLookupMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         byte h[] = new byte[Hash.HASH_LENGTH];
         RandomSource.getInstance().nextBytes(h);
         Hash hash = new Hash(h);
         DestLookupMessage msg = new DestLookupMessage(hash);
         return msg;
     }
-    public DataStructure createStructureToRead() { return new DestLookupMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new DestLookupMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/DestReplyMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/DestReplyMessageTest.java
index 8e5af028b6bb716df08e604dbe36e2d2801fbf4c..94a36d85c1e991d097a41f80a56a27a4793dec61 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/DestReplyMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/DestReplyMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,10 +15,10 @@ import net.i2p.data.DataFormatException;
  *
  * @author str4d
  */
-public class DestReplyMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class DestReplyMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         DestReplyMessage msg = new DestReplyMessage();
         return msg;
     }
-    public DataStructure createStructureToRead() { return new DestReplyMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new DestReplyMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/DestroySessionMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/DestroySessionMessageTest.java
index 59c0921906bcd79b2f50420ca7791b6a08e1b7f9..66e8168c89117cdd8e28e4734834b5ac8513d9cf 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/DestroySessionMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/DestroySessionMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,11 +15,11 @@ import net.i2p.data.DataFormatException;
  *
  * @author jrandom
  */
-public class DestroySessionMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class DestroySessionMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         DestroySessionMessage msg = new DestroySessionMessage();
         msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new DestroySessionMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new DestroySessionMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/DisconnectMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/DisconnectMessageTest.java
index a02b1dbc9a1293c49413acd3a3cc0fb45b4bbcf9..4c1214a4d7e3550bab27bd50f9e5fc2bcdb0458d 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/DisconnectMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/DisconnectMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,11 +15,11 @@ import net.i2p.data.DataFormatException;
  *
  * @author jrandom
  */
-public class DisconnectMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class DisconnectMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         DisconnectMessage msg = new DisconnectMessage();
         msg.setReason("Because I say so");
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new DisconnectMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new DisconnectMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/GetBandwidthLimitsMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/GetBandwidthLimitsMessageTest.java
index c4c937613a5437914e72c8925bfc600d2e54eaef..0836e23bbb07204ed0984b10c44264411b44b9ca 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/GetBandwidthLimitsMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/GetBandwidthLimitsMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,10 +15,10 @@ import net.i2p.data.DataFormatException;
  *
  * @author str4d
  */
-public class GetBandwidthLimitsMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class GetBandwidthLimitsMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         GetBandwidthLimitsMessage msg = new GetBandwidthLimitsMessage();
         return msg;
     }
-    public DataStructure createStructureToRead() { return new GetBandwidthLimitsMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new GetBandwidthLimitsMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/GetDateMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/GetDateMessageTest.java
index 7333803543e27e886e53e14f2f17223c328c82ec..c0cb1d00a03aaaf7b67fd55c6718f63eb68bd705 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/GetDateMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/GetDateMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,10 +15,10 @@ import net.i2p.data.DataFormatException;
  *
  * @author str4d
  */
-public class GetDateMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class GetDateMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         GetDateMessage msg = new GetDateMessage("0.8.13-0");
         return msg;
     }
-    public DataStructure createStructureToRead() { return new GetDateMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new GetDateMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/I2CPTstBase.java b/core/java/test/junit/net/i2p/data/i2cp/I2CPTstBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..aabc59de2decbba9d694416a399faf1bd12d232b
--- /dev/null
+++ b/core/java/test/junit/net/i2p/data/i2cp/I2CPTstBase.java
@@ -0,0 +1,65 @@
+package net.i2p.data.i2cp;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain 
+ * with no warranty of any kind, either expressed or implied.  
+ * It probably won't make your computer catch on fire, or eat 
+ * your children, but it might.  Use at your own risk.
+ *
+ */
+
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import org.junit.Test;
+
+import net.i2p.data.DataFormatException;
+import net.i2p.data.DataHelper;
+
+/**
+ * Utility class for wrapping I2CP message tests
+ *
+ * @since 0.9.48
+ */
+
+public abstract class I2CPTstBase {
+
+    /** create a populated structure for writing */
+    public abstract I2CPMessageImpl createDataStructure() throws DataFormatException;
+
+    /** create an unpopulated structure for reading */
+    public abstract I2CPMessageImpl createStructureToRead();
+
+    @Test
+    public void testStructure() throws Exception{
+        byte[] temp = null;
+
+        I2CPMessageImpl orig;
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        orig = createDataStructure();
+        orig.writeBytes(baos);
+
+
+        temp = baos.toByteArray();
+
+        I2CPMessageImpl ds;
+        ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+        ds = createStructureToRead();
+        ds.readBytes(bais);
+
+
+        // I2CP message classes don't implement equals()
+        if (!getClass().getName().startsWith("net.i2p.data.i2cp."))
+            assertEquals(orig, ds);
+
+        // Not all classes implement equals, so write out again
+        ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
+        ds.writeBytes(baos2);
+        byte[] temp2 = baos2.toByteArray();
+        assert(DataHelper.eq(temp, temp2));
+    }
+}
diff --git a/core/java/test/junit/net/i2p/data/i2cp/MessageIdTest.java b/core/java/test/junit/net/i2p/data/i2cp/MessageIdTest.java
index 2c8b4735c876fa65c073deed63e7404f31d92b81..38fb30fb169035fe3bbbde60991b2406087194c4 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/MessageIdTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/MessageIdTest.java
@@ -11,6 +11,7 @@ package net.i2p.data.i2cp;
 import net.i2p.data.StructureTest;
 import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
+import net.i2p.data.Hash;
 
 /**
  * Test harness for loading / storing Hash objects
@@ -19,9 +20,21 @@ import net.i2p.data.DataFormatException;
  */
 public class MessageIdTest extends StructureTest {
     public DataStructure createDataStructure() throws DataFormatException {
-        MessageId id = new MessageId();
+        MessageIdStructure id = new MessageIdStructure();
         id.setMessageId(101);
         return id;
     }
-    public DataStructure createStructureToRead() { return new MessageId(); }
+    public DataStructure createStructureToRead() { return new MessageIdStructure(); }
+
+    /**
+     * so we can test it as a structure
+     * @since 0.9.48 no longer extends DataStructureImpl
+     */
+    private static class MessageIdStructure extends MessageId implements DataStructure {
+        public Hash calculateHash() { return null; }
+        public void fromByteArray(byte[] in) {}
+        public byte[] toByteArray() { return null; }
+        public void fromBase64(String in) {}
+        public String toBase64() { return null; }
+    }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/MessagePayloadMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/MessagePayloadMessageTest.java
index 11a9f2892bab59d1439deeabef90b1546be5093b..1ef4293368baf16cebd57f314582828752a47f96 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/MessagePayloadMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/MessagePayloadMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Payload;
 import net.i2p.data.PayloadTest;
@@ -20,14 +18,14 @@ import net.i2p.data.PayloadTest;
  * @author jrandom
  */
  
- public class MessagePayloadMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+ public class MessagePayloadMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         MessagePayloadMessage msg = new MessagePayloadMessage();
         msg.setMessageId(123);
         msg.setPayload((Payload)(new PayloadTest()).createDataStructure());
         msg.setSessionId(321);
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new MessagePayloadMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new MessagePayloadMessage(); }
     
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/MessageStatusMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/MessageStatusMessageTest.java
index eb0cfe2127d9db7df1e0e71eebaff30ac351f4b4..f4760c2e12eddbf6a5c4b13dda9ece36728e2be8 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/MessageStatusMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/MessageStatusMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,8 +15,8 @@ import net.i2p.data.DataFormatException;
  *
  * @author jrandom
  */
-public class MessageStatusMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class MessageStatusMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         MessageStatusMessage msg = new MessageStatusMessage();
         msg.setSessionId(42);
         msg.setMessageId(41);
@@ -27,5 +25,5 @@ public class MessageStatusMessageTest extends StructureTest {
         msg.setNonce(1);
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new MessageStatusMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new MessageStatusMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/ReceiveMessageBeginMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/ReceiveMessageBeginMessageTest.java
index 16f201696b88dae80cc40c4ca4c0b270d5c52dc6..7b1a548c2189857b19b49ea5f8b3949c03658358 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/ReceiveMessageBeginMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/ReceiveMessageBeginMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,12 +15,12 @@ import net.i2p.data.DataFormatException;
  *
  * @author jrandom
  */
-public class ReceiveMessageBeginMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class ReceiveMessageBeginMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         ReceiveMessageBeginMessage msg = new ReceiveMessageBeginMessage();
         msg.setSessionId(321);
         msg.setMessageId(123);
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new ReceiveMessageBeginMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new ReceiveMessageBeginMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/ReceiveMessageEndMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/ReceiveMessageEndMessageTest.java
index cfe738440994cf2444daed9538bae39a73c9f5de..855c801cf032727ca89b5380f83f97a7688940cb 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/ReceiveMessageEndMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/ReceiveMessageEndMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,12 +15,12 @@ import net.i2p.data.DataFormatException;
  *
  * @author jrandom
  */
-public class ReceiveMessageEndMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class ReceiveMessageEndMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         ReceiveMessageEndMessage msg = new ReceiveMessageEndMessage();
         msg.setSessionId(321);
         msg.setMessageId(123);
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new ReceiveMessageEndMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new ReceiveMessageEndMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/ReconfigureSessionMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/ReconfigureSessionMessageTest.java
index 24b2a961821ea7686e902a6da197c17d6aed28c5..8b85a675e2657edd87e1f331d4ce4041630f10dc 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/ReconfigureSessionMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/ReconfigureSessionMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,12 +15,12 @@ import net.i2p.data.DataFormatException;
  *
  * @author str4d
  */
-public class ReconfigureSessionMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class ReconfigureSessionMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         ReconfigureSessionMessage msg = new ReconfigureSessionMessage();
         msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
         msg.setSessionConfig((SessionConfig)(new SessionConfigTest()).createDataStructure());
         return msg;
     }
-    public DataStructure createStructureToRead() { return new ReconfigureSessionMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new ReconfigureSessionMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/ReportAbuseMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/ReportAbuseMessageTest.java
index e529d35f5f02eb4cc5f1ca6670eca5f2bc2cf3eb..11413cbedcf5cccd23428e7bb6cfe7dd76379b5e 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/ReportAbuseMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/ReportAbuseMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,8 +15,8 @@ import net.i2p.data.DataFormatException;
  *
  * @author jrandom
  */
-public class ReportAbuseMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class ReportAbuseMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         ReportAbuseMessage msg = new ReportAbuseMessage();
         msg.setMessageId((MessageId)(new MessageIdTest()).createDataStructure());
         msg.setReason((AbuseReason)(new AbuseReasonTest()).createDataStructure());
@@ -26,5 +24,5 @@ public class ReportAbuseMessageTest extends StructureTest {
         msg.setSeverity((AbuseSeverity)(new AbuseSeverityTest()).createDataStructure());
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new ReportAbuseMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new ReportAbuseMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/RequestLeaseSetMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/RequestLeaseSetMessageTest.java
index 0296c7219a495a5973a6c2867299fcc3d3c56b4d..cd1d5258e292544c45a625eeeff3b54227eaa3ce 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/RequestLeaseSetMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/RequestLeaseSetMessageTest.java
@@ -10,8 +10,6 @@ package net.i2p.data.i2cp;
 
 import java.util.Date;
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Hash;
 import net.i2p.data.TunnelId;
@@ -22,8 +20,8 @@ import net.i2p.data.TunnelIdTest;
  *
  * @author jrandom
  */
-public class RequestLeaseSetMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class RequestLeaseSetMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         RequestLeaseSetMessage msg = new RequestLeaseSetMessage();
         msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
         msg.setEndDate(new Date(1000*60*60*12));
@@ -31,5 +29,5 @@ public class RequestLeaseSetMessageTest extends StructureTest {
         msg.addEndpoint(new Hash(h), (TunnelId)(new TunnelIdTest()).createDataStructure());
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new RequestLeaseSetMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new RequestLeaseSetMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/SendMessageExpiresMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/SendMessageExpiresMessageTest.java
index fa487b9c857c3a6c6350b8a6393518a349c8980a..ceae47790547ec0b2aa5bc3f407bdbc848dfd42a 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/SendMessageExpiresMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/SendMessageExpiresMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
 import net.i2p.data.DestinationTest;
@@ -24,9 +22,9 @@ import net.i2p.data.DateAndFlagsTest;
  * @author str4d
  */
  
- public class SendMessageExpiresMessageTest extends StructureTest {
+ public class SendMessageExpiresMessageTest extends I2CPTstBase {
     
-    public DataStructure createDataStructure() throws DataFormatException {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         SendMessageExpiresMessage msg = new SendMessageExpiresMessage();
         msg.setDestination((Destination)(new DestinationTest()).createDataStructure());
         msg.setPayload((Payload)(new PayloadTest()).createDataStructure());
@@ -37,6 +35,6 @@ import net.i2p.data.DateAndFlagsTest;
         msg.setFlags(daf.getFlags());
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new SendMessageExpiresMessage(); }  
+    public I2CPMessageImpl createStructureToRead() { return new SendMessageExpiresMessage(); }  
     
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/SendMessageMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/SendMessageMessageTest.java
index e5798da43e139e43ac87ef513bb58663122a50f4..d2df66ec57ea604d97fa40544bcdaef3f9a94863 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/SendMessageMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/SendMessageMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
 import net.i2p.data.DestinationTest;
@@ -22,9 +20,9 @@ import net.i2p.data.PayloadTest;
  * @author jrandom
  */
  
- public class SendMessageMessageTest extends StructureTest {
+ public class SendMessageMessageTest extends I2CPTstBase {
     
-    public DataStructure createDataStructure() throws DataFormatException {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         SendMessageMessage msg = new SendMessageMessage();
         msg.setDestination((Destination)(new DestinationTest()).createDataStructure());
         msg.setPayload((Payload)(new PayloadTest()).createDataStructure());
@@ -32,6 +30,6 @@ import net.i2p.data.PayloadTest;
         msg.setNonce(1);
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new SendMessageMessage(); }  
+    public I2CPMessageImpl createStructureToRead() { return new SendMessageMessage(); }  
     
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/SessionIdTest.java b/core/java/test/junit/net/i2p/data/i2cp/SessionIdTest.java
index 45f9e1bcb070ae2b2619e1fa7b09e167ada38914..bbfd4edfbb40853f2234f03028b47548476a2efd 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/SessionIdTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/SessionIdTest.java
@@ -11,6 +11,7 @@ package net.i2p.data.i2cp;
 import net.i2p.data.StructureTest;
 import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
+import net.i2p.data.Hash;
 
 /**
  * Test harness for loading / storing SessionId objects
@@ -19,9 +20,21 @@ import net.i2p.data.DataFormatException;
  */
 public class SessionIdTest extends StructureTest {
     public DataStructure createDataStructure() throws DataFormatException {
-        SessionId id = new SessionId();
+        SessionIdStructure id = new SessionIdStructure();
         id.setSessionId(7);
         return id;
     }
-    public DataStructure createStructureToRead() { return new SessionId(); }
+    public DataStructure createStructureToRead() { return new SessionIdStructure(); }
+
+    /**
+     * so we can test it as a structure
+     * @since 0.9.48 no longer extends DataStructureImpl
+     */
+    private static class SessionIdStructure extends SessionId implements DataStructure {
+        public Hash calculateHash() { return null; }
+        public void fromByteArray(byte[] in) {}
+        public byte[] toByteArray() { return null; }
+        public void fromBase64(String in) {}
+        public String toBase64() { return null; }
+    }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/SessionStatusMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/SessionStatusMessageTest.java
index 86db6fcf8c239b08bed1da6aec46d63a20f41d6a..435a4889ec5baf801525f5ba7f90393ddcc60f95 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/SessionStatusMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/SessionStatusMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,12 +15,12 @@ import net.i2p.data.DataFormatException;
  *
  * @author jrandom
  */
-public class SessionStatusMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class SessionStatusMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         SessionStatusMessage msg = new SessionStatusMessage();
         msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
         msg.setStatus(SessionStatusMessage.STATUS_CREATED);
         return msg; 
     }
-    public DataStructure createStructureToRead() { return new SessionStatusMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new SessionStatusMessage(); }
 }
diff --git a/core/java/test/junit/net/i2p/data/i2cp/SetDateMessageTest.java b/core/java/test/junit/net/i2p/data/i2cp/SetDateMessageTest.java
index 5d4317a817d5e0811cfde1742fe9b2027c8e40c1..14ff526d9277aa9db06f32833597d6bf3763e676 100644
--- a/core/java/test/junit/net/i2p/data/i2cp/SetDateMessageTest.java
+++ b/core/java/test/junit/net/i2p/data/i2cp/SetDateMessageTest.java
@@ -8,8 +8,6 @@ package net.i2p.data.i2cp;
  *
  */
 
-import net.i2p.data.StructureTest;
-import net.i2p.data.DataStructure;
 import net.i2p.data.DataFormatException;
 
 /**
@@ -17,10 +15,10 @@ import net.i2p.data.DataFormatException;
  *
  * @author str4d
  */
-public class SetDateMessageTest extends StructureTest {
-    public DataStructure createDataStructure() throws DataFormatException {
+public class SetDateMessageTest extends I2CPTstBase {
+    public I2CPMessageImpl createDataStructure() throws DataFormatException {
         SetDateMessage msg = new SetDateMessage("0.8.13-0");
         return msg;
     }
-    public DataStructure createStructureToRead() { return new SetDateMessage(); }
+    public I2CPMessageImpl createStructureToRead() { return new SetDateMessage(); }
 }