diff --git a/bind/genobjcw.go b/bind/genobjcw.go
index 94152c6..ba5d5de 100644
--- a/bind/genobjcw.go
+++ b/bind/genobjcw.go
@@ -473,7 +473,7 @@
 	case objc.String:
 		g.Printf("_%s := encodeString(%s)\n", a.Name, a.Name)
 	case objc.Data:
-		g.Printf("_%s := fromSlice(%s, 0)\n", a.Name, a.Name)
+		g.Printf("_%s := fromSlice(%s, false)\n", a.Name, a.Name)
 	case objc.Bool:
 		g.Printf("_%s := %s(0)\n", a.Name, g.cgoType(a.Type))
 		g.Printf("if %s {\n", a.Name)
@@ -500,7 +500,7 @@
 	case objc.String:
 		g.Printf("%s := decodeString(%s)\n", to, from)
 	case objc.Data:
-		g.Printf("%s := toSlice(%s, 1)\n", to, from)
+		g.Printf("%s := toSlice(%s, true)\n", to, from)
 	case objc.Protocol, objc.Class:
 		var proxyName string
 		if n := g.lookupImported(t); n != nil {
diff --git a/bind/testdata/objcw.go b/bind/testdata/objcw.go
index 136c9c9..e1d104a 100644
--- a/bind/testdata/objcw.go
+++ b/bind/testdata/objcw.go
@@ -6,6 +6,7 @@
 
 import (
 	"ObjC/Foundation"
+	"ObjC/Foundation/NSMutableString"
 	"ObjC/UIKit"
 )
 
@@ -37,3 +38,15 @@
 
 func (r *GoUIResponder) PressesBegan(_ Foundation.NSSet, _ UIKit.UIPressesEvent) {
 }
+
+const NSUTF8StringEncoding = 8
+
+func CreateReadNSMutableString() {
+	myData := []byte{'A', 'B'}
+	// Test byte slices. Use NSMutableString because NSString is
+	// represented as Go strings in bindings.
+	// Pass slice from Go to native.
+	mString := NSMutableString.NewWithData(myData, uint(NSUTF8StringEncoding))
+	// Pass slice from native to Go.
+	_ = mString.DataUsingEncoding(uint(NSUTF8StringEncoding))
+}
diff --git a/bind/testdata/objcw.go.golden b/bind/testdata/objcw.go.golden
index dc5ba55..d28a62b 100644
--- a/bind/testdata/objcw.go.golden
+++ b/bind/testdata/objcw.go.golden
@@ -25,6 +25,12 @@
 	Description() (string)
 }
 
+type Foundation_NSMutableString interface {
+	Hash() (uint)
+	Description() (string)
+	DataUsingEncoding(encoding uint) ([]byte)
+}
+
 type UIKit_UIResponder interface {
 	Hash() (uint)
 	Description() (string)
@@ -62,6 +68,7 @@
 
 import "ObjC"
 import _seq "golang.org/x/mobile/bind/seq"
+import "ObjC/Foundation/NSMutableString"
 
 type proxy interface { Bind_proxy_refnum__() int32 }
 
@@ -147,6 +154,48 @@
 }
 
 func init() {
+	NSMutableString.NewWithData = func(data []byte, encoding uint) (ObjC.Foundation_NSMutableString) {
+		_data := fromSlice(data, false)
+		_encoding := C.ulong(encoding)
+		res := C.cproxy_s_NSMutableString_NewWithData(_data, _encoding)
+		var _res ObjC.Foundation_NSMutableString
+		_res_ref := _seq.FromRefNum(int32(res))
+		if _res_ref != nil {
+			if res < 0 { // go object
+				_res = _res_ref.Get().(ObjC.Foundation_NSMutableString)
+			} else { // foreign object
+				_res = (*proxy_class_NSMutableString)(_res_ref)
+			}
+		}
+		return _res
+	}
+	
+}
+
+type proxy_class_NSMutableString _seq.Ref
+
+func (p *proxy_class_NSMutableString) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }
+
+func (p *proxy_class_NSMutableString) Hash() (uint) {
+	res := C.cproxy_NSMutableString_Hash(C.int(p.Bind_proxy_refnum__()))
+	_res := uint(res)
+	return _res
+}
+
+func (p *proxy_class_NSMutableString) Description() (string) {
+	res := C.cproxy_NSMutableString_Description(C.int(p.Bind_proxy_refnum__()))
+	_res := decodeString(res)
+	return _res
+}
+
+func (p *proxy_class_NSMutableString) DataUsingEncoding(encoding uint) ([]byte) {
+	_encoding := C.ulong(encoding)
+	res := C.cproxy_NSMutableString_DataUsingEncoding(C.int(p.Bind_proxy_refnum__()), _encoding)
+	_res := toSlice(res, true)
+	return _res
+}
+
+func init() {
 }
 
 type proxy_class_UIResponder _seq.Ref
@@ -500,6 +549,11 @@
 	return C.int32_t(_seq.ToRefNum(new(objc.GoUIResponder)))
 }
 
+//export proxyobjc__CreateReadNSMutableString
+func proxyobjc__CreateReadNSMutableString() {
+	objc.CreateReadNSMutableString()
+}
+
 //export proxyobjc__DupNSDate
 func proxyobjc__DupNSDate(param_date C.int32_t) C.int32_t {
 	var _param_date Foundation.NSDate
