diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index e9c7bdb..6d48938 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -1,32 +1,24 @@
-# This is the official list of people who can contribute
-# (and typically have contributed) code to the Vanadium repository.
+# People who have agreed to one of the CLAs and can contribute patches.
 # The AUTHORS file lists the copyright holders; this file
-# lists people. For example, Google employees are listed here
+# lists people.  For example, Google employees are listed here
 # but not in AUTHORS, because Google holds the copyright.
 #
-# The submission process automatically checks to make sure
-# that people submitting code are listed in this file (by email address).
+# https://developers.google.com/open-source/cla/individual
+# https://developers.google.com/open-source/cla/corporate
 #
-# Names should be added to this file only after verifying that
-# the individual or the individual's organization has agreed to
-# the appropriate Contributor License Agreement, found here:
-#
-#     http://code.google.com/legal/individual-cla-v1.0.html
-#     http://code.google.com/legal/corporate-cla-v1.0.html
-#
-# The agreement for individuals can be filled out on the web.
-#
-# When adding J Random Contributor's name to this file,
-# either J's name or J's organization's name should be
-# added to the AUTHORS file, depending on whether the
-# individual or corporate CLA was used.
-
-# Names should be added to this file like so:
+# Names should be added to this file as:
 #     Name <email address>
-#
-# An entry with two email addresses specifies that the
-# first address should be used in the submit logs and
-# that the second address should be recognized as the
-# same person when interacting with Rietveld.
-
-# Please keep the list sorted.
+Ali Ghassemi <aghassemi@google.com>
+Ankur <ataly@google.com>
+Asim Shankar <ashankar@google.com>
+Benjamin Prosnitz <bprosnitz@google.com>
+James Ring <sjr@google.com>
+Jing Jin <jingjin@google.com>
+Jiri Simsa <jsimsa@google.com>
+Ken Ashcraft <kash@google.com>
+Matt Rosencrantz <mattr@google.com>
+Mike Burrows <m3b@google.com>
+Robin Thellend <rthellend@google.com>
+Srdjan Petrovic <spetrovic@google.com>
+Suharsh Sivakumar <suharshs@google.com>
+Todd Wang <toddw@google.com>
\ No newline at end of file
diff --git a/v23/security/access/jni.go b/v23/security/access/jni.go
index 92e4f73..98f294b 100644
--- a/v23/security/access/jni.go
+++ b/v23/security/access/jni.go
@@ -17,45 +17,32 @@
 import "C"
 
 var (
-	aclSign = jutil.ClassSign("io.v.v23.security.access.AccessList")
-
-	// Global reference for io.v.v23.security.access.ACLWrapper class.
-	jACLWrapperClass C.jclass
-	// Global reference for io.v.v23.security.access.Util class.
-	jUtilClass C.jclass
+	// Global reference for io.v.v23.security.access.AccessList class.
+	jAccessListClass C.jclass
 )
 
 func Init(jEnv interface{}) error {
-	class, err := jutil.JFindClass(jEnv, "io/v/v23/security/access/ACLWrapper")
+	class, err := jutil.JFindClass(jEnv, "io/v/v23/security/access/AccessList")
 	if err != nil {
 		return err
 	}
-	jACLWrapperClass = C.jclass(class)
-	class, err = jutil.JFindClass(jEnv, "io/v/v23/security/access/Util")
-	if err != nil {
-		return err
-	}
-	jUtilClass = C.jclass(class)
+	jAccessListClass = C.jclass(class)
 	return nil
 }
 
-//export Java_io_v_v23_security_access_ACLWrapper_nativeWrap
-func Java_io_v_v23_security_access_ACLWrapper_nativeWrap(env *C.JNIEnv, jACLWrapperClass C.jclass, jACL C.jobject) C.jobject {
-	acl, err := GoACL(env, jACL)
+//export Java_io_v_v23_security_access_AccessList_nativeCreate
+func Java_io_v_v23_security_access_AccessList_nativeCreate(env *C.JNIEnv, jAccessList C.jobject) C.jlong {
+	acl, err := GoAccessList(env, jAccessList)
 	if err != nil {
 		jutil.JThrowV(env, err)
-		return nil
+		return C.jlong(0)
 	}
-	jWrapper, err := JavaACLWrapper(env, acl)
-	if err != nil {
-		jutil.JThrowV(env, err)
-		return nil
-	}
-	return C.jobject(jWrapper)
+	jutil.GoRef(&acl) // Un-refed when the AccessList object is finalized
+	return C.jlong(jutil.PtrValue(&acl))
 }
 
-//export Java_io_v_v23_security_access_ACLWrapper_nativeIncludes
-func Java_io_v_v23_security_access_ACLWrapper_nativeIncludes(env *C.JNIEnv, jACLWrapper C.jobject, goPtr C.jlong, jBlessings C.jobjectArray) C.jboolean {
+//export Java_io_v_v23_security_access_AccessList_nativeIncludes
+func Java_io_v_v23_security_access_AccessList_nativeIncludes(env *C.JNIEnv, jAccessList C.jobject, goPtr C.jlong, jBlessings C.jobjectArray) C.jboolean {
 	blessings := jutil.GoStringArray(env, jBlessings)
 	ok := (*(*access.AccessList)(jutil.Ptr(goPtr))).Includes(blessings...)
 	if ok {
@@ -64,8 +51,8 @@
 	return C.JNI_FALSE
 }
 
-//export Java_io_v_v23_security_access_ACLWrapper_nativeAuthorize
-func Java_io_v_v23_security_access_ACLWrapper_nativeAuthorize(env *C.JNIEnv, jACLWrapper C.jobject, goPtr C.jlong, jCtx C.jobject, jCall C.jobject) {
+//export Java_io_v_v23_security_access_AccessList_nativeAuthorize
+func Java_io_v_v23_security_access_AccessList_nativeAuthorize(env *C.JNIEnv, jAccessList C.jobject, goPtr C.jlong, jCtx C.jobject, jCall C.jobject) {
 	ctx, err := jcontext.GoContext(env, jCtx)
 	if err != nil {
 		jutil.JThrowV(env, err)
@@ -81,7 +68,7 @@
 	}
 }
 
-//export Java_io_v_v23_security_access_ACLWrapper_nativeFinalize
-func Java_io_v_v23_security_access_ACLWrapper_nativeFinalize(env *C.JNIEnv, jACLWrapper C.jobject, goPtr C.jlong) {
+//export Java_io_v_v23_security_access_AccessList_nativeFinalize
+func Java_io_v_v23_security_access_AccessList_nativeFinalize(env *C.JNIEnv, jAccessList C.jobject, goPtr C.jlong) {
 	jutil.GoUnref(jutil.Ptr(goPtr))
 }
diff --git a/v23/security/access/util.go b/v23/security/access/util.go
index c5b73fc..a525d44 100644
--- a/v23/security/access/util.go
+++ b/v23/security/access/util.go
@@ -7,61 +7,18 @@
 package access
 
 import (
-	"unsafe"
-
 	"v.io/v23/security/access"
-	"v.io/v23/vom"
 	jutil "v.io/x/jni/util"
 )
 
 // #include "jni.h"
 import "C"
 
-// JavaACL converts the provided Go AccessList into a Java AccessList.
+// GoAccessList converts the provided Java AccessList into a Go AccessList.
 // NOTE: Because CGO creates package-local types and because this method may be
 // invoked from a different package, Java types are passed in an empty interface
 // and then cast into their package local types.
-func JavaACL(jEnv interface{}, acl access.AccessList) (unsafe.Pointer, error) {
-	encoded, err := vom.Encode(acl)
-	if err != nil {
-		return nil, err
-	}
-	jACL, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeACL", []jutil.Sign{jutil.ByteArraySign}, aclSign, encoded)
-	if err != nil {
-		return nil, err
-	}
-	return jACL, nil
-}
-
-// GoACL converts the provided Java AccessList into a Go AccessList.
-// NOTE: Because CGO creates package-local types and because this method may be
-// invoked from a different package, Java types are passed in an empty interface
-// and then cast into their package local types.
-func GoACL(jEnv, jACL interface{}) (access.AccessList, error) {
-	encoded, err := jutil.CallStaticByteArrayMethod(jEnv, jUtilClass, "encodeACL", []jutil.Sign{aclSign}, jACL)
-	if err != nil {
-		return access.AccessList{}, err
-	}
-	var a access.AccessList
-	if err := vom.Decode(encoded, &a); err != nil {
-		return access.AccessList{}, err
-	}
-	return a, nil
-}
-
-// JavaACLWrapper converts the provided Go AccessList into a Java ACLWrapper object.
-// NOTE: Because CGO creates package-local types and because this method may be
-// invoked from a different package, Java types are passed in an empty interface
-// and then cast into their package local types.
-func JavaACLWrapper(jEnv interface{}, acl access.AccessList) (unsafe.Pointer, error) {
-	jACL, err := JavaACL(jEnv, acl)
-	if err != nil {
-		return nil, err
-	}
-	jWrapper, err := jutil.NewObject(jEnv, jACLWrapperClass, []jutil.Sign{jutil.LongSign, aclSign}, int64(jutil.PtrValue(&acl)), jACL)
-	if err != nil {
-		return nil, err
-	}
-	jutil.GoRef(&acl) // Un-refed when the Java ACLWrapper object is finalized.
-	return jWrapper, nil
+func GoAccessList(jEnv, jAccessList interface{}) (acl access.AccessList, err error) {
+	err = jutil.GoVomCopy(jEnv, jAccessList, jAccessListClass, &acl)
+	return
 }
diff --git a/v23/security/jni.go b/v23/security/jni.go
index 31c5138..a349a9f 100644
--- a/v23/security/jni.go
+++ b/v23/security/jni.go
@@ -46,8 +46,8 @@
 	jBlessingRootsImplClass C.jclass
 	// Global reference for io.v.v23.security.CallImpl class.
 	jCallImplClass C.jclass
-	// Global reference for io.v.v23.security.BlessingPatternWrapper class.
-	jBlessingPatternWrapperClass C.jclass
+	// Global reference for io.v.v23.security.BlessingPattern class.
+	jBlessingPatternClass C.jclass
 	// Global reference for io.v.v23.security.CaveatRegistry class.
 	jCaveatRegistryClass C.jclass
 	// Global reference for io.v.v23.security.Util class.
@@ -104,11 +104,11 @@
 		return err
 	}
 	jCallImplClass = C.jclass(class)
-	class, err = jutil.JFindClass(jEnv, "io/v/v23/security/BlessingPatternWrapper")
+	class, err = jutil.JFindClass(jEnv, "io/v/v23/security/BlessingPattern")
 	if err != nil {
 		return err
 	}
-	jBlessingPatternWrapperClass = C.jclass(class)
+	jBlessingPatternClass = C.jclass(class)
 	class, err = jutil.JFindClass(jEnv, "io/v/v23/security/CaveatRegistry")
 	if err != nil {
 		return err
@@ -752,23 +752,19 @@
 	jutil.GoUnref(jutil.Ptr(goPtr))
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeWrap
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeWrap(env *C.JNIEnv, jBlessingPatternWrapperClass C.jclass, jPattern C.jobject) C.jobject {
-	pattern, err := GoBlessingPattern(env, jPattern)
+//export Java_io_v_v23_security_BlessingPattern_nativeCreate
+func Java_io_v_v23_security_BlessingPattern_nativeCreate(env *C.JNIEnv, jBlessingPattern C.jobject) C.jlong {
+	pattern, err := GoBlessingPattern(env, jBlessingPattern)
 	if err != nil {
 		jutil.JThrowV(env, err)
-		return nil
+		return C.jlong(0)
 	}
-	jWrapper, err := JavaBlessingPatternWrapper(env, pattern)
-	if err != nil {
-		jutil.JThrowV(env, err)
-		return nil
-	}
-	return C.jobject(jWrapper)
+	jutil.GoRef(&pattern) // Un-refed when the BlessingPattern object is finalized.
+	return C.jlong(jutil.PtrValue(&pattern))
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeIsMatchedBy
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeIsMatchedBy(env *C.JNIEnv, jBlessingPatternWrapper C.jobject, goPtr C.jlong, jBlessings C.jobjectArray) C.jboolean {
+//export Java_io_v_v23_security_BlessingPattern_nativeIsMatchedBy
+func Java_io_v_v23_security_BlessingPattern_nativeIsMatchedBy(env *C.JNIEnv, jBlessingPattern C.jobject, goPtr C.jlong, jBlessings C.jobjectArray) C.jboolean {
 	blessings := jutil.GoStringArray(env, jBlessings)
 	matched := (*(*security.BlessingPattern)(jutil.Ptr(goPtr))).MatchedBy(blessings...)
 	if matched {
@@ -777,8 +773,8 @@
 	return C.JNI_FALSE
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeIsValid
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeIsValid(env *C.JNIEnv, jBlessingPatternWrapper C.jobject, goPtr C.jlong) C.jboolean {
+//export Java_io_v_v23_security_BlessingPattern_nativeIsValid
+func Java_io_v_v23_security_BlessingPattern_nativeIsValid(env *C.JNIEnv, jBlessingPattern C.jobject, goPtr C.jlong) C.jboolean {
 	valid := (*(*security.BlessingPattern)(jutil.Ptr(goPtr))).IsValid()
 	if valid {
 		return C.JNI_TRUE
@@ -786,18 +782,18 @@
 	return C.JNI_FALSE
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeMakeNonExtendable
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeMakeNonExtendable(env *C.JNIEnv, jBlessingPatternWrapper C.jobject, goPtr C.jlong) C.jobject {
-	p := (*(*security.BlessingPattern)(jutil.Ptr(goPtr))).MakeNonExtendable()
-	jWrapper, err := JavaBlessingPatternWrapper(env, p)
+//export Java_io_v_v23_security_BlessingPattern_nativeMakeNonExtendable
+func Java_io_v_v23_security_BlessingPattern_nativeMakeNonExtendable(env *C.JNIEnv, jBlessingPattern C.jobject, goPtr C.jlong) C.jobject {
+	pattern := (*(*security.BlessingPattern)(jutil.Ptr(goPtr))).MakeNonExtendable()
+	jPattern, err := JavaBlessingPattern(env, pattern)
 	if err != nil {
 		jutil.JThrowV(env, err)
 		return nil
 	}
-	return C.jobject(jWrapper)
+	return C.jobject(jPattern)
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeFinalize
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeFinalize(env *C.JNIEnv, jBlessingPatternWrapper C.jobject, goPtr C.jlong) {
+//export Java_io_v_v23_security_BlessingPattern_nativeFinalize
+func Java_io_v_v23_security_BlessingPattern_nativeFinalize(env *C.JNIEnv, jBlessingPattern C.jobject, goPtr C.jlong) {
 	jutil.GoUnref(jutil.Ptr(goPtr))
 }
diff --git a/v23/security/util.go b/v23/security/util.go
index 5c2c547..4137020 100644
--- a/v23/security/util.go
+++ b/v23/security/util.go
@@ -122,25 +122,22 @@
 	return caveats, nil
 }
 
-// JavaBlessingPattern converts the provided Go BlessingPattern into Java BlessingPattern.
+// JavaBlessingPattern converts the provided Go BlessingPattern into Java
+// BlessingPattern.
 // NOTE: Because CGO creates package-local types and because this method may be
 // invoked from a different package, Java types are passed in an empty interface
 // and then cast into their package local types.
 func JavaBlessingPattern(jEnv interface{}, pattern security.BlessingPattern) (unsafe.Pointer, error) {
-	jBlessingPattern, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeBlessingPattern", []jutil.Sign{jutil.StringSign}, blessingPatternSign, string(pattern))
-	return jBlessingPattern, err
+	return jutil.JVomCopy(jEnv, pattern, jBlessingPatternClass)
 }
 
 // GoBlessingPattern converts the provided Java BlessingPattern into Go BlessingPattern.
 // NOTE: Because CGO creates package-local types and because this method may be
 // invoked from a different package, Java types are passed in an empty interface
 // and then cast into their package local types.
-func GoBlessingPattern(jEnv, jPattern interface{}) (security.BlessingPattern, error) {
-	encoded, err := jutil.CallStaticStringMethod(jEnv, jUtilClass, "encodeBlessingPattern", []jutil.Sign{blessingPatternSign}, jPattern)
-	if err != nil {
-		return security.BlessingPattern(""), err
-	}
-	return security.BlessingPattern(encoded), nil
+func GoBlessingPattern(jEnv, jPattern interface{}) (pattern security.BlessingPattern, err error) {
+	err = jutil.GoVomCopy(jEnv, jPattern, jBlessingPatternClass, &pattern)
+	return
 }
 
 // JavaPublicKey converts the provided Go PublicKey into Java PublicKey.
@@ -205,21 +202,3 @@
 	}
 	return sig, nil
 }
-
-// JavaBlessingPatternWrapper converts the provided Go BlessingPattern into a Java
-// BlessingPatternWrapper object.
-// NOTE: Because CGO creates package-local types and because this method may be
-// invoked from a different package, Java types are passed in an empty interface
-// and then cast into their package local types.
-func JavaBlessingPatternWrapper(jEnv interface{}, pattern security.BlessingPattern) (unsafe.Pointer, error) {
-	jPattern, err := JavaBlessingPattern(jEnv, pattern)
-	if err != nil {
-		return nil, err
-	}
-	jWrapper, err := jutil.NewObject(jEnv, jBlessingPatternWrapperClass, []jutil.Sign{jutil.LongSign, blessingPatternSign}, int64(jutil.PtrValue(&pattern)), jPattern)
-	if err != nil {
-		return nil, err
-	}
-	jutil.GoRef(&pattern) // Un-refed when the Java BlessingPatternWrapper object is finalized.
-	return jWrapper, nil
-}
