diff --git a/py_gen/tests/of13.py b/py_gen/tests/of13.py
index 3c9772f..68814cb 100644
--- a/py_gen/tests/of13.py
+++ b/py_gen/tests/of13.py
@@ -26,7 +26,7 @@
 # EPL for the specific language governing permissions and limitations
 # under the EPL.
 import unittest
-import difflib
+from testutil import test_serialization
 
 try:
     import loxi.of13 as ofp
@@ -34,35 +34,6 @@
 except ImportError:
     exit("loxi package not found. Try setting PYTHONPATH.")
 
-# Human-friendly format for binary strings. 8 bytes per line.
-def format_binary(buf):
-    byts = map(ord, buf)
-    lines = [[]]
-    for byt in byts:
-        if len(lines[-1]) == 8:
-            lines.append([])
-        lines[-1].append(byt)
-    return '\n'.join([' '.join(['%02x' % y for y in x]) for x in lines])
-
-def diff(a, b):
-    return '\n'.join(difflib.ndiff(a.splitlines(), b.splitlines()))
-
-# Test serialization / deserialization of a sample object.
-# Depends on the __eq__ method being correct.
-def test_serialization(obj, buf):
-    packed = obj.pack()
-    if packed != buf:
-        a = format_binary(buf)
-        b = format_binary(packed)
-        raise AssertionError("Serialization of %s failed\nExpected:\n%s\nActual:\n%s\nDiff:\n%s" % \
-            (type(obj).__name__, a, b, diff(a, b)))
-    unpacked = type(obj).unpack(buf)
-    if obj != unpacked:
-        a = obj.show()
-        b = unpacked.show()
-        raise AssertionError("Deserialization of %s failed\nExpected:\n%s\nActual:\n%s\nDiff:\n%s" % \
-            (type(obj).__name__, a, b, diff(a, b)))
-
 class TestImports(unittest.TestCase):
     def test_toplevel(self):
         import loxi
diff --git a/py_gen/tests/testutil.py b/py_gen/tests/testutil.py
new file mode 100644
index 0000000..6ca0b7c
--- /dev/null
+++ b/py_gen/tests/testutil.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+# Copyright 2013, Big Switch Networks, Inc.
+#
+# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
+# the following special exception:
+#
+# LOXI Exception
+#
+# As a special exception to the terms of the EPL, you may distribute libraries
+# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
+# that copyright and licensing notices generated by LoxiGen are not altered or removed
+# from the LoxiGen Libraries and the notice provided below is (i) included in
+# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
+# documentation for the LoxiGen Libraries, if distributed in binary form.
+#
+# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
+#
+# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
+# a copy of the EPL at:
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# 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
+# EPL for the specific language governing permissions and limitations
+# under the EPL.
+
+import difflib
+
+# Human-friendly format for binary strings. 8 bytes per line.
+def format_binary(buf):
+    byts = map(ord, buf)
+    lines = [[]]
+    for byt in byts:
+        if len(lines[-1]) == 8:
+            lines.append([])
+        lines[-1].append(byt)
+    return '\n'.join([' '.join(['%02x' % y for y in x]) for x in lines])
+
+def diff(a, b):
+    return '\n'.join(difflib.ndiff(a.splitlines(), b.splitlines()))
+
+# Test serialization / deserialization of a sample object.
+# Depends on the __eq__ method being correct.
+def test_serialization(obj, buf):
+    packed = obj.pack()
+    if packed != buf:
+        a = format_binary(buf)
+        b = format_binary(packed)
+        raise AssertionError("Serialization of %s failed\nExpected:\n%s\nActual:\n%s\nDiff:\n%s" % \
+            (type(obj).__name__, a, b, diff(a, b)))
+    unpacked = type(obj).unpack(buf)
+    if obj != unpacked:
+        a = obj.show()
+        b = unpacked.show()
+        raise AssertionError("Deserialization of %s failed\nExpected:\n%s\nActual:\n%s\nDiff:\n%s" % \
+            (type(obj).__name__, a, b, diff(a, b)))
