diff --git a/utest/test_generic_utils.py b/utest/test_generic_utils.py
new file mode 100755
index 0000000..58e3a4a
--- /dev/null
+++ b/utest/test_generic_utils.py
@@ -0,0 +1,117 @@
+#!/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 sys
+import os
+import unittest
+
+root_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..')
+sys.path.insert(0, root_dir)
+
+from generic_utils import *
+
+class MyHash(object):
+    def __init__(self, val):
+        self.val = val
+
+    def __hash__(self):
+        return hash(self.val)
+
+    def __str__(self):
+        return "BoringConstantString"
+
+    def __eq__(self, o ):
+        return type(self) == type(o) and self.val == o.val
+
+class GenericTest(unittest.TestCase):
+    def test_memoize_simple(self):
+        self.count = 0
+
+        @memoize
+        def function():
+            self.count += 1
+            return "Foo"
+
+        self.assertEquals(0, self.count)
+        self.assertEquals("Foo", function())
+        self.assertEquals(1, self.count)
+        self.assertEquals("Foo", function())
+        self.assertEquals(1, self.count)
+
+    def test_memoize_string_args(self):
+        self.count = 0
+
+        @memoize
+        def function(a, b):
+            self.count += 1
+            return "%s:%s" % (a,b)
+
+        self.assertEquals(0, self.count)
+        self.assertEquals("a:b", function('a', 'b'))
+        self.assertEquals(1, self.count)
+        self.assertEquals("ab:", function('ab', ''))
+        self.assertEquals(2, self.count)
+        self.assertEquals("ab:", function('ab', ''))
+        self.assertEquals(2, self.count)
+
+    def test_memoize_kw_args(self):
+        self.count = 0
+
+        @memoize
+        def function(**kw):
+            self.count += 1
+            return ",".join("{k}={v}".format(k=k,v=v) for k,v in kw.items())
+
+        self.assertEquals(0, self.count)
+        self.assertEquals("a=1", function(a=1))
+        self.assertEquals(1, self.count)
+        self.assertEquals("a=1,b=2", function(a=1, b=2))
+        self.assertEquals(2, self.count)
+        self.assertEquals("a=1", function(a=1))
+        self.assertEquals(2, self.count)
+        self.assertEquals("a=1,b=BoringConstantString", function(a=1, b=MyHash('1')))
+        self.assertEquals(3, self.count)
+
+    def test_memoize_with_hashable_object(self):
+        self.count = 0
+
+        @memoize
+        def function(a):
+            self.count += 1
+            return a.val
+
+        self.assertEquals(0, self.count)
+        self.assertEquals("a", function(MyHash('a')))
+        self.assertEquals(1, self.count)
+        self.assertEquals("b", function(MyHash('b')))
+        self.assertEquals(2, self.count)
+        self.assertEquals("a", function(MyHash('a')))
+        self.assertEquals(2, self.count)
+
+if __name__ == '__main__':
+    unittest.main()
