diff --git a/src/syscall/zx/io/impl.go b/src/syscall/zx/io/impl.go
new file mode 100644
index 0000000..26d33bd
--- /dev/null
+++ b/src/syscall/zx/io/impl.go
@@ -0,0 +1,1855 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build fuchsia
+
+package io
+
+import (
+	_bindings "syscall/zx/fidl"
+	_zx "syscall/zx"
+)
+
+const (
+	KOpenRightReadable uint32 = 0x00000001
+	KOpenRightWritable uint32 = 0x00000002
+	KOpenRightAdmin uint32 = 0x00000004
+	KOpenFlagCreate uint32 = 0x00010000
+	KOpenFlagCreateIfAbsent uint32 = 0x00020000
+	KOpenFlagTruncate uint32 = 0x00040000
+	KOpenFlagDirectory uint32 = 0x00080000
+	KOpenFlagAppend uint32 = 0x00100000
+	KOpenFlagNoRemote uint32 = 0x00200000
+	KOpenFlagNodeReference uint32 = 0x00400000
+	KOpenFlagDescribe uint32 = 0x00800000
+	KOpenFlagStatus uint32 = 0x01000000
+	KModeProtectionMask uint32 = 0x00FFF
+	KModeTypeMask uint32 = 0xFF000
+	KModeTypeDirectory uint32 = 0x04000
+	KModeTypeBlockDevice uint32 = 0x06000
+	KModeTypeFile uint32 = 0x08000
+	KModeTypeSocket uint32 = 0x0C000
+	KModeTypeService uint32 = 0x10000
+	KMaxIoctlHandles uint64 = 2
+	KMaxBuf uint64 = 8192
+	KNodeAttributeFlagCreationTime uint32 = 0x00000001
+	KNodeAttributeFlagModificationTime uint32 = 0x00000002
+	KVmoFlagRead uint32 = 0x00000001
+	KVmoFlagWrite uint32 = 0x00000002
+	KVmoFlagExec uint32 = 0x00000004
+	KVmoFlagPrivate uint32 = 0x00010000
+	KDirentTypeUnknown uint32 = 0
+	KDirentTypeDirectory uint32 = 4
+	KDirentTypeBlockDevice uint32 = 6
+	KDirentTypeFile uint32 = 8
+	KDirentTypeSocket uint32 = 12
+	KDirentTypeService uint32 = 16
+)
+
+type SeekOrigin uint32
+const (
+	SeekOriginStart SeekOrigin = 0
+	SeekOriginCurrent SeekOrigin = 1
+	SeekOriginEnd SeekOrigin = 2
+)
+type Service struct {
+	Reserved uint8 
+}
+
+// Implements Payload.
+func (_ *Service) InlineAlignment() int {
+	return 1
+}
+
+// Implements Payload.
+func (_ *Service) InlineSize() int {
+	return 1
+}
+type FileObject struct {
+	Event _zx.Event `fidl:"*"`
+}
+
+// Implements Payload.
+func (_ *FileObject) InlineAlignment() int {
+	return 4
+}
+
+// Implements Payload.
+func (_ *FileObject) InlineSize() int {
+	return 4
+}
+type DirectoryObject struct {
+	Reserved uint8 
+}
+
+// Implements Payload.
+func (_ *DirectoryObject) InlineAlignment() int {
+	return 1
+}
+
+// Implements Payload.
+func (_ *DirectoryObject) InlineSize() int {
+	return 1
+}
+type Pipe struct {
+	Socket _zx.Socket 
+}
+
+// Implements Payload.
+func (_ *Pipe) InlineAlignment() int {
+	return 4
+}
+
+// Implements Payload.
+func (_ *Pipe) InlineSize() int {
+	return 4
+}
+type Vmofile struct {
+	Vmo _zx.VMO 
+	Offset uint64 
+	Length uint64 
+}
+
+// Implements Payload.
+func (_ *Vmofile) InlineAlignment() int {
+	return 8
+}
+
+// Implements Payload.
+func (_ *Vmofile) InlineSize() int {
+	return 24
+}
+type Device struct {
+	Event _zx.Event `fidl:"*"`
+}
+
+// Implements Payload.
+func (_ *Device) InlineAlignment() int {
+	return 4
+}
+
+// Implements Payload.
+func (_ *Device) InlineSize() int {
+	return 4
+}
+type NodeAttributes struct {
+	Mode uint32 
+	Id uint64 
+	ContentSize uint64 
+	StorageSize uint64 
+	LinkCount uint64 
+	CreationTime uint64 
+	ModificationTime uint64 
+}
+
+// Implements Payload.
+func (_ *NodeAttributes) InlineAlignment() int {
+	return 8
+}
+
+// Implements Payload.
+func (_ *NodeAttributes) InlineSize() int {
+	return 56
+}
+type ObjectInfoTag uint32
+const (
+	ObjectInfoService ObjectInfoTag = iota
+	ObjectInfoFile ObjectInfoTag = iota
+	ObjectInfoDirectory ObjectInfoTag = iota
+	ObjectInfoPipe ObjectInfoTag = iota
+	ObjectInfoVmofile ObjectInfoTag = iota
+	ObjectInfoDevice ObjectInfoTag = iota
+)
+
+// ObjectInfo is a FIDL union.
+type ObjectInfo struct {
+	ObjectInfoTag `fidl:"tag"`
+	Service Service 
+	File FileObject 
+	Directory DirectoryObject 
+	Pipe Pipe 
+	Vmofile Vmofile 
+	Device Device 
+}
+
+// Implements Payload.
+func (_ *ObjectInfo) InlineAlignment() int {
+	return 8
+}
+
+// Implements Payload.
+func (_ *ObjectInfo) InlineSize() int {
+	return 32
+}
+
+func (u *ObjectInfo) Which() ObjectInfoTag {
+	return u.ObjectInfoTag
+}
+
+func (u *ObjectInfo) SetService(service Service) {
+	u.ObjectInfoTag = ObjectInfoService
+	u.Service = service
+}
+
+func (u *ObjectInfo) SetFile(file FileObject) {
+	u.ObjectInfoTag = ObjectInfoFile
+	u.File = file
+}
+
+func (u *ObjectInfo) SetDirectory(directory DirectoryObject) {
+	u.ObjectInfoTag = ObjectInfoDirectory
+	u.Directory = directory
+}
+
+func (u *ObjectInfo) SetPipe(pipe Pipe) {
+	u.ObjectInfoTag = ObjectInfoPipe
+	u.Pipe = pipe
+}
+
+func (u *ObjectInfo) SetVmofile(vmofile Vmofile) {
+	u.ObjectInfoTag = ObjectInfoVmofile
+	u.Vmofile = vmofile
+}
+
+func (u *ObjectInfo) SetDevice(device Device) {
+	u.ObjectInfoTag = ObjectInfoDevice
+	u.Device = device
+}
+
+// Request for Clone.
+type ObjectCloneRequest struct {
+	Flags uint32 
+	Object ObjectInterfaceRequest 
+}
+
+// Implements Payload.
+func (_ *ObjectCloneRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectCloneRequest) InlineSize() int {
+	return 8
+}
+// Clone has no response.
+// Request for Close.
+type ObjectCloseRequest struct {
+}
+
+// Implements Payload.
+func (_ *ObjectCloseRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectCloseRequest) InlineSize() int {
+	return 0
+}
+// Response for Close.
+type ObjectCloseResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *ObjectCloseResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectCloseResponse) InlineSize() int {
+	return 4
+}
+// Request for ListInterfaces.
+type ObjectListInterfacesRequest struct {
+}
+
+// Implements Payload.
+func (_ *ObjectListInterfacesRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectListInterfacesRequest) InlineSize() int {
+	return 0
+}
+// Response for ListInterfaces.
+type ObjectListInterfacesResponse struct {
+	Interfaces []string 
+}
+
+// Implements Payload.
+func (_ *ObjectListInterfacesResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectListInterfacesResponse) InlineSize() int {
+	return 16
+}
+// Request for Bind.
+type ObjectBindRequest struct {
+	Iface string 
+}
+
+// Implements Payload.
+func (_ *ObjectBindRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectBindRequest) InlineSize() int {
+	return 16
+}
+// Bind has no response.
+// Request for Describe.
+type ObjectDescribeRequest struct {
+}
+
+// Implements Payload.
+func (_ *ObjectDescribeRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectDescribeRequest) InlineSize() int {
+	return 0
+}
+// Response for Describe.
+type ObjectDescribeResponse struct {
+	Info ObjectInfo 
+}
+
+// Implements Payload.
+func (_ *ObjectDescribeResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectDescribeResponse) InlineSize() int {
+	return 32
+}
+// Request for OnOpen.
+// OnOpen has no request.
+// Response for OnOpen.
+type ObjectOnOpenResponse struct {
+	S _zx.Status 
+	Info *ObjectInfo 
+}
+
+// Implements Payload.
+func (_ *ObjectOnOpenResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *ObjectOnOpenResponse) InlineSize() int {
+	return 16
+}
+
+type ObjectInterface _bindings.Proxy
+
+func (p *ObjectInterface) Clone(flags uint32,object ObjectInterfaceRequest) error {
+	req_ := ObjectCloneRequest{
+		Flags: flags,
+		Object: object,
+	}
+	err := ((*_bindings.Proxy)(p)).Send(2147483649, &req_)
+	return err
+}
+func (p *ObjectInterface) Close() (_zx.Status, error) {
+	req_ := ObjectCloseRequest{
+	}
+	resp_ := ObjectCloseResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2147483650, &req_, &resp_)
+	return resp_.S, err
+}
+func (p *ObjectInterface) ListInterfaces() ([]string, error) {
+	req_ := ObjectListInterfacesRequest{
+	}
+	resp_ := ObjectListInterfacesResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2147483652, &req_, &resp_)
+	return resp_.Interfaces, err
+}
+func (p *ObjectInterface) Bind(iface string) error {
+	req_ := ObjectBindRequest{
+		Iface: iface,
+	}
+	err := ((*_bindings.Proxy)(p)).Send(2147483653, &req_)
+	return err
+}
+func (p *ObjectInterface) Describe() (ObjectInfo, error) {
+	req_ := ObjectDescribeRequest{
+	}
+	resp_ := ObjectDescribeResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2147483654, &req_, &resp_)
+	return resp_.Info, err
+}
+func (p *ObjectInterface) ExpectOnOpen() (_zx.Status, *ObjectInfo, error) {
+	resp_ := ObjectOnOpenResponse{}
+	err := ((*_bindings.Proxy)(p)).Recv(2147483655, &resp_)
+	return resp_.S, resp_.Info, err
+}
+
+// Object server interface.
+type Object interface {
+	Clone(flags uint32,object ObjectInterfaceRequest) error
+	Close() (_zx.Status, error)
+	ListInterfaces() ([]string, error)
+	Bind(iface string) error
+	Describe() (ObjectInfo, error)
+}
+
+type ObjectInterfaceRequest _bindings.InterfaceRequest
+
+func NewObjectInterfaceRequest() (ObjectInterfaceRequest, *ObjectInterface, error) {
+	req, cli, err := _bindings.NewInterfaceRequest()
+	return ObjectInterfaceRequest(req), (*ObjectInterface)(cli), err
+}
+
+type ObjectStub struct {
+	Impl Object
+}
+
+func (s *ObjectStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Payload, error) {
+	switch ord {
+	case 2147483649:
+		in_ := ObjectCloneRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Clone(in_.Flags,in_.Object)
+		return nil, err_
+	case 2147483650:
+		in_ := ObjectCloseRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectCloseResponse{}
+		s, err_ := s.Impl.Close()
+		out_.S = s
+		return &out_, err_
+	case 2147483652:
+		in_ := ObjectListInterfacesRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectListInterfacesResponse{}
+		interfaces, err_ := s.Impl.ListInterfaces()
+		out_.Interfaces = interfaces
+		return &out_, err_
+	case 2147483653:
+		in_ := ObjectBindRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Bind(in_.Iface)
+		return nil, err_
+	case 2147483654:
+		in_ := ObjectDescribeRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectDescribeResponse{}
+		info, err_ := s.Impl.Describe()
+		out_.Info = info
+		return &out_, err_
+	}
+	return nil, _bindings.ErrUnknownOrdinal
+}
+
+type ObjectService struct {
+	_bindings.BindingSet
+}
+
+func (s *ObjectService) Add(impl Object, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
+	return s.BindingSet.Add(&ObjectStub{Impl: impl}, c, onError)
+}
+
+func (s *ObjectService) EventProxyFor(key _bindings.BindingKey) (*ObjectEventProxy, bool) {
+	pxy, err := s.BindingSet.ProxyFor(key)
+	return (*ObjectEventProxy)(pxy), err
+}
+
+type ObjectEventProxy _bindings.Proxy
+
+func (p *ObjectEventProxy) OnOpen(s _zx.Status,info *ObjectInfo) error {
+	event_ := ObjectOnOpenResponse{
+		S: s,
+		Info: info,
+	}
+	return ((*_bindings.Proxy)(p)).Send(2147483655, &event_)
+}
+
+
+
+// Request for Sync.
+type NodeSyncRequest struct {
+}
+
+// Implements Payload.
+func (_ *NodeSyncRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *NodeSyncRequest) InlineSize() int {
+	return 0
+}
+// Response for Sync.
+type NodeSyncResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *NodeSyncResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *NodeSyncResponse) InlineSize() int {
+	return 4
+}
+// Request for GetAttr.
+type NodeGetAttrRequest struct {
+}
+
+// Implements Payload.
+func (_ *NodeGetAttrRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *NodeGetAttrRequest) InlineSize() int {
+	return 0
+}
+// Response for GetAttr.
+type NodeGetAttrResponse struct {
+	S _zx.Status 
+	Attributes NodeAttributes 
+}
+
+// Implements Payload.
+func (_ *NodeGetAttrResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *NodeGetAttrResponse) InlineSize() int {
+	return 64
+}
+// Request for SetAttr.
+type NodeSetAttrRequest struct {
+	Flags uint32 
+	Attributes NodeAttributes 
+}
+
+// Implements Payload.
+func (_ *NodeSetAttrRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *NodeSetAttrRequest) InlineSize() int {
+	return 64
+}
+// Response for SetAttr.
+type NodeSetAttrResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *NodeSetAttrResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *NodeSetAttrResponse) InlineSize() int {
+	return 4
+}
+// Request for Ioctl.
+type NodeIoctlRequest struct {
+	Opcode uint32 
+	MaxOut uint64 
+	Handles []_zx.Handle `fidl:"2"`
+	In []uint8 `fidl:"8192"`
+}
+
+// Implements Payload.
+func (_ *NodeIoctlRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *NodeIoctlRequest) InlineSize() int {
+	return 48
+}
+// Response for Ioctl.
+type NodeIoctlResponse struct {
+	S _zx.Status 
+	Handles []_zx.Handle `fidl:"2"`
+	Out []uint8 `fidl:"8192"`
+}
+
+// Implements Payload.
+func (_ *NodeIoctlResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *NodeIoctlResponse) InlineSize() int {
+	return 40
+}
+
+type NodeInterface _bindings.Proxy
+
+func (p *NodeInterface) Sync() (_zx.Status, error) {
+	req_ := NodeSyncRequest{
+	}
+	resp_ := NodeSyncResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2164260865, &req_, &resp_)
+	return resp_.S, err
+}
+func (p *NodeInterface) GetAttr() (_zx.Status, NodeAttributes, error) {
+	req_ := NodeGetAttrRequest{
+	}
+	resp_ := NodeGetAttrResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2164260866, &req_, &resp_)
+	return resp_.S, resp_.Attributes, err
+}
+func (p *NodeInterface) SetAttr(flags uint32,attributes NodeAttributes) (_zx.Status, error) {
+	req_ := NodeSetAttrRequest{
+		Flags: flags,
+		Attributes: attributes,
+	}
+	resp_ := NodeSetAttrResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2164260867, &req_, &resp_)
+	return resp_.S, err
+}
+func (p *NodeInterface) Ioctl(opcode uint32,maxOut uint64,handles []_zx.Handle,in []uint8) (_zx.Status, []_zx.Handle, []uint8, error) {
+	req_ := NodeIoctlRequest{
+		Opcode: opcode,
+		MaxOut: maxOut,
+		Handles: handles,
+		In: in,
+	}
+	resp_ := NodeIoctlResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2164260868, &req_, &resp_)
+	return resp_.S, resp_.Handles, resp_.Out, err
+}
+
+// Node server interface.
+type Node interface {
+	Clone(flags uint32,object ObjectInterfaceRequest) error
+	Close() (_zx.Status, error)
+	ListInterfaces() ([]string, error)
+	Bind(iface string) error
+	Describe() (ObjectInfo, error)
+	Sync() (_zx.Status, error)
+	GetAttr() (_zx.Status, NodeAttributes, error)
+	SetAttr(flags uint32,attributes NodeAttributes) (_zx.Status, error)
+	Ioctl(opcode uint32,maxOut uint64,handles []_zx.Handle,in []uint8) (_zx.Status, []_zx.Handle, []uint8, error)
+}
+
+type NodeInterfaceRequest _bindings.InterfaceRequest
+
+func NewNodeInterfaceRequest() (NodeInterfaceRequest, *NodeInterface, error) {
+	req, cli, err := _bindings.NewInterfaceRequest()
+	return NodeInterfaceRequest(req), (*NodeInterface)(cli), err
+}
+
+type NodeStub struct {
+	Impl Node
+}
+
+func (s *NodeStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Payload, error) {
+	switch ord {
+	case 2147483649:
+		in_ := ObjectCloneRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Clone(in_.Flags,in_.Object)
+		return nil, err_
+	case 2147483650:
+		in_ := ObjectCloseRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectCloseResponse{}
+		s, err_ := s.Impl.Close()
+		out_.S = s
+		return &out_, err_
+	case 2147483652:
+		in_ := ObjectListInterfacesRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectListInterfacesResponse{}
+		interfaces, err_ := s.Impl.ListInterfaces()
+		out_.Interfaces = interfaces
+		return &out_, err_
+	case 2147483653:
+		in_ := ObjectBindRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Bind(in_.Iface)
+		return nil, err_
+	case 2147483654:
+		in_ := ObjectDescribeRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectDescribeResponse{}
+		info, err_ := s.Impl.Describe()
+		out_.Info = info
+		return &out_, err_
+	case 2164260865:
+		in_ := NodeSyncRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeSyncResponse{}
+		s, err_ := s.Impl.Sync()
+		out_.S = s
+		return &out_, err_
+	case 2164260866:
+		in_ := NodeGetAttrRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeGetAttrResponse{}
+		s, attributes, err_ := s.Impl.GetAttr()
+		out_.S = s
+		out_.Attributes = attributes
+		return &out_, err_
+	case 2164260867:
+		in_ := NodeSetAttrRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeSetAttrResponse{}
+		s, err_ := s.Impl.SetAttr(in_.Flags,in_.Attributes)
+		out_.S = s
+		return &out_, err_
+	case 2164260868:
+		in_ := NodeIoctlRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeIoctlResponse{}
+		s, handles, out, err_ := s.Impl.Ioctl(in_.Opcode,in_.MaxOut,in_.Handles,in_.In)
+		out_.S = s
+		out_.Handles = handles
+		out_.Out = out
+		return &out_, err_
+	}
+	return nil, _bindings.ErrUnknownOrdinal
+}
+
+type NodeService struct {
+	_bindings.BindingSet
+}
+
+func (s *NodeService) Add(impl Node, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
+	return s.BindingSet.Add(&NodeStub{Impl: impl}, c, onError)
+}
+
+func (s *NodeService) EventProxyFor(key _bindings.BindingKey) (*NodeEventProxy, bool) {
+	pxy, err := s.BindingSet.ProxyFor(key)
+	return (*NodeEventProxy)(pxy), err
+}
+
+type NodeEventProxy _bindings.Proxy
+
+func (p *NodeEventProxy) OnOpen(s _zx.Status,info *ObjectInfo) error {
+	event_ := ObjectOnOpenResponse{
+		S: s,
+		Info: info,
+	}
+	return ((*_bindings.Proxy)(p)).Send(2147483655, &event_)
+}
+
+
+
+// Request for Read.
+type FileReadRequest struct {
+	Count uint64 
+}
+
+// Implements Payload.
+func (_ *FileReadRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileReadRequest) InlineSize() int {
+	return 8
+}
+// Response for Read.
+type FileReadResponse struct {
+	S _zx.Status 
+	Data []uint8 `fidl:"8192"`
+}
+
+// Implements Payload.
+func (_ *FileReadResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileReadResponse) InlineSize() int {
+	return 24
+}
+// Request for ReadAt.
+type FileReadAtRequest struct {
+	Count uint64 
+	Offset uint64 
+}
+
+// Implements Payload.
+func (_ *FileReadAtRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileReadAtRequest) InlineSize() int {
+	return 16
+}
+// Response for ReadAt.
+type FileReadAtResponse struct {
+	S _zx.Status 
+	Data []uint8 `fidl:"8192"`
+}
+
+// Implements Payload.
+func (_ *FileReadAtResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileReadAtResponse) InlineSize() int {
+	return 24
+}
+// Request for Write.
+type FileWriteRequest struct {
+	Data []uint8 `fidl:"8192"`
+}
+
+// Implements Payload.
+func (_ *FileWriteRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileWriteRequest) InlineSize() int {
+	return 16
+}
+// Response for Write.
+type FileWriteResponse struct {
+	S _zx.Status 
+	Actual uint64 
+}
+
+// Implements Payload.
+func (_ *FileWriteResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileWriteResponse) InlineSize() int {
+	return 16
+}
+// Request for WriteAt.
+type FileWriteAtRequest struct {
+	Data []uint8 `fidl:"8192"`
+	Offset uint64 
+}
+
+// Implements Payload.
+func (_ *FileWriteAtRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileWriteAtRequest) InlineSize() int {
+	return 24
+}
+// Response for WriteAt.
+type FileWriteAtResponse struct {
+	S _zx.Status 
+	Actual uint64 
+}
+
+// Implements Payload.
+func (_ *FileWriteAtResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileWriteAtResponse) InlineSize() int {
+	return 16
+}
+// Request for Seek.
+type FileSeekRequest struct {
+	Offset int64 
+	Start SeekOrigin 
+}
+
+// Implements Payload.
+func (_ *FileSeekRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileSeekRequest) InlineSize() int {
+	return 16
+}
+// Response for Seek.
+type FileSeekResponse struct {
+	S _zx.Status 
+	Offset uint64 
+}
+
+// Implements Payload.
+func (_ *FileSeekResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileSeekResponse) InlineSize() int {
+	return 16
+}
+// Request for Truncate.
+type FileTruncateRequest struct {
+	Length uint64 
+}
+
+// Implements Payload.
+func (_ *FileTruncateRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileTruncateRequest) InlineSize() int {
+	return 8
+}
+// Response for Truncate.
+type FileTruncateResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *FileTruncateResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileTruncateResponse) InlineSize() int {
+	return 4
+}
+// Request for GetFlags.
+type FileGetFlagsRequest struct {
+}
+
+// Implements Payload.
+func (_ *FileGetFlagsRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileGetFlagsRequest) InlineSize() int {
+	return 0
+}
+// Response for GetFlags.
+type FileGetFlagsResponse struct {
+	S _zx.Status 
+	Flags uint32 
+}
+
+// Implements Payload.
+func (_ *FileGetFlagsResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileGetFlagsResponse) InlineSize() int {
+	return 8
+}
+// Request for SetFlags.
+type FileSetFlagsRequest struct {
+	Flags uint32 
+}
+
+// Implements Payload.
+func (_ *FileSetFlagsRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileSetFlagsRequest) InlineSize() int {
+	return 4
+}
+// Response for SetFlags.
+type FileSetFlagsResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *FileSetFlagsResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileSetFlagsResponse) InlineSize() int {
+	return 4
+}
+// Request for GetVmo.
+type FileGetVmoRequest struct {
+	Flags uint32 
+}
+
+// Implements Payload.
+func (_ *FileGetVmoRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileGetVmoRequest) InlineSize() int {
+	return 4
+}
+// Response for GetVmo.
+type FileGetVmoResponse struct {
+	S _zx.Status 
+	Vmo _zx.VMO 
+}
+
+// Implements Payload.
+func (_ *FileGetVmoResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileGetVmoResponse) InlineSize() int {
+	return 8
+}
+// Request for GetVmoAt.
+type FileGetVmoAtRequest struct {
+	Flags uint32 
+	Offset uint64 
+	Length uint64 
+}
+
+// Implements Payload.
+func (_ *FileGetVmoAtRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileGetVmoAtRequest) InlineSize() int {
+	return 24
+}
+// Response for GetVmoAt.
+type FileGetVmoAtResponse struct {
+	S _zx.Status 
+	Vmo _zx.VMO 
+}
+
+// Implements Payload.
+func (_ *FileGetVmoAtResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *FileGetVmoAtResponse) InlineSize() int {
+	return 8
+}
+
+type FileInterface _bindings.Proxy
+
+func (p *FileInterface) Read(count uint64) (_zx.Status, []uint8, error) {
+	req_ := FileReadRequest{
+		Count: count,
+	}
+	resp_ := FileReadResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038081, &req_, &resp_)
+	return resp_.S, resp_.Data, err
+}
+func (p *FileInterface) ReadAt(count uint64,offset uint64) (_zx.Status, []uint8, error) {
+	req_ := FileReadAtRequest{
+		Count: count,
+		Offset: offset,
+	}
+	resp_ := FileReadAtResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038082, &req_, &resp_)
+	return resp_.S, resp_.Data, err
+}
+func (p *FileInterface) Write(data []uint8) (_zx.Status, uint64, error) {
+	req_ := FileWriteRequest{
+		Data: data,
+	}
+	resp_ := FileWriteResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038083, &req_, &resp_)
+	return resp_.S, resp_.Actual, err
+}
+func (p *FileInterface) WriteAt(data []uint8,offset uint64) (_zx.Status, uint64, error) {
+	req_ := FileWriteAtRequest{
+		Data: data,
+		Offset: offset,
+	}
+	resp_ := FileWriteAtResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038084, &req_, &resp_)
+	return resp_.S, resp_.Actual, err
+}
+func (p *FileInterface) Seek(offset int64,start SeekOrigin) (_zx.Status, uint64, error) {
+	req_ := FileSeekRequest{
+		Offset: offset,
+		Start: start,
+	}
+	resp_ := FileSeekResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038085, &req_, &resp_)
+	return resp_.S, resp_.Offset, err
+}
+func (p *FileInterface) Truncate(length uint64) (_zx.Status, error) {
+	req_ := FileTruncateRequest{
+		Length: length,
+	}
+	resp_ := FileTruncateResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038086, &req_, &resp_)
+	return resp_.S, err
+}
+func (p *FileInterface) GetFlags() (_zx.Status, uint32, error) {
+	req_ := FileGetFlagsRequest{
+	}
+	resp_ := FileGetFlagsResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038087, &req_, &resp_)
+	return resp_.S, resp_.Flags, err
+}
+func (p *FileInterface) SetFlags(flags uint32) (_zx.Status, error) {
+	req_ := FileSetFlagsRequest{
+		Flags: flags,
+	}
+	resp_ := FileSetFlagsResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038088, &req_, &resp_)
+	return resp_.S, err
+}
+func (p *FileInterface) GetVmo(flags uint32) (_zx.Status, _zx.VMO, error) {
+	req_ := FileGetVmoRequest{
+		Flags: flags,
+	}
+	resp_ := FileGetVmoResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038089, &req_, &resp_)
+	return resp_.S, resp_.Vmo, err
+}
+func (p *FileInterface) GetVmoAt(flags uint32,offset uint64,length uint64) (_zx.Status, _zx.VMO, error) {
+	req_ := FileGetVmoAtRequest{
+		Flags: flags,
+		Offset: offset,
+		Length: length,
+	}
+	resp_ := FileGetVmoAtResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2181038090, &req_, &resp_)
+	return resp_.S, resp_.Vmo, err
+}
+
+// File server interface.
+type File interface {
+	Clone(flags uint32,object ObjectInterfaceRequest) error
+	Close() (_zx.Status, error)
+	ListInterfaces() ([]string, error)
+	Bind(iface string) error
+	Describe() (ObjectInfo, error)
+	Sync() (_zx.Status, error)
+	GetAttr() (_zx.Status, NodeAttributes, error)
+	SetAttr(flags uint32,attributes NodeAttributes) (_zx.Status, error)
+	Ioctl(opcode uint32,maxOut uint64,handles []_zx.Handle,in []uint8) (_zx.Status, []_zx.Handle, []uint8, error)
+	Read(count uint64) (_zx.Status, []uint8, error)
+	ReadAt(count uint64,offset uint64) (_zx.Status, []uint8, error)
+	Write(data []uint8) (_zx.Status, uint64, error)
+	WriteAt(data []uint8,offset uint64) (_zx.Status, uint64, error)
+	Seek(offset int64,start SeekOrigin) (_zx.Status, uint64, error)
+	Truncate(length uint64) (_zx.Status, error)
+	GetFlags() (_zx.Status, uint32, error)
+	SetFlags(flags uint32) (_zx.Status, error)
+	GetVmo(flags uint32) (_zx.Status, _zx.VMO, error)
+	GetVmoAt(flags uint32,offset uint64,length uint64) (_zx.Status, _zx.VMO, error)
+}
+
+type FileInterfaceRequest _bindings.InterfaceRequest
+
+func NewFileInterfaceRequest() (FileInterfaceRequest, *FileInterface, error) {
+	req, cli, err := _bindings.NewInterfaceRequest()
+	return FileInterfaceRequest(req), (*FileInterface)(cli), err
+}
+
+type FileStub struct {
+	Impl File
+}
+
+func (s *FileStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Payload, error) {
+	switch ord {
+	case 2147483649:
+		in_ := ObjectCloneRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Clone(in_.Flags,in_.Object)
+		return nil, err_
+	case 2147483650:
+		in_ := ObjectCloseRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectCloseResponse{}
+		s, err_ := s.Impl.Close()
+		out_.S = s
+		return &out_, err_
+	case 2147483652:
+		in_ := ObjectListInterfacesRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectListInterfacesResponse{}
+		interfaces, err_ := s.Impl.ListInterfaces()
+		out_.Interfaces = interfaces
+		return &out_, err_
+	case 2147483653:
+		in_ := ObjectBindRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Bind(in_.Iface)
+		return nil, err_
+	case 2147483654:
+		in_ := ObjectDescribeRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectDescribeResponse{}
+		info, err_ := s.Impl.Describe()
+		out_.Info = info
+		return &out_, err_
+	case 2164260865:
+		in_ := NodeSyncRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeSyncResponse{}
+		s, err_ := s.Impl.Sync()
+		out_.S = s
+		return &out_, err_
+	case 2164260866:
+		in_ := NodeGetAttrRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeGetAttrResponse{}
+		s, attributes, err_ := s.Impl.GetAttr()
+		out_.S = s
+		out_.Attributes = attributes
+		return &out_, err_
+	case 2164260867:
+		in_ := NodeSetAttrRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeSetAttrResponse{}
+		s, err_ := s.Impl.SetAttr(in_.Flags,in_.Attributes)
+		out_.S = s
+		return &out_, err_
+	case 2164260868:
+		in_ := NodeIoctlRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeIoctlResponse{}
+		s, handles, out, err_ := s.Impl.Ioctl(in_.Opcode,in_.MaxOut,in_.Handles,in_.In)
+		out_.S = s
+		out_.Handles = handles
+		out_.Out = out
+		return &out_, err_
+	case 2181038081:
+		in_ := FileReadRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileReadResponse{}
+		s, data, err_ := s.Impl.Read(in_.Count)
+		out_.S = s
+		out_.Data = data
+		return &out_, err_
+	case 2181038082:
+		in_ := FileReadAtRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileReadAtResponse{}
+		s, data, err_ := s.Impl.ReadAt(in_.Count,in_.Offset)
+		out_.S = s
+		out_.Data = data
+		return &out_, err_
+	case 2181038083:
+		in_ := FileWriteRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileWriteResponse{}
+		s, actual, err_ := s.Impl.Write(in_.Data)
+		out_.S = s
+		out_.Actual = actual
+		return &out_, err_
+	case 2181038084:
+		in_ := FileWriteAtRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileWriteAtResponse{}
+		s, actual, err_ := s.Impl.WriteAt(in_.Data,in_.Offset)
+		out_.S = s
+		out_.Actual = actual
+		return &out_, err_
+	case 2181038085:
+		in_ := FileSeekRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileSeekResponse{}
+		s, offset, err_ := s.Impl.Seek(in_.Offset,in_.Start)
+		out_.S = s
+		out_.Offset = offset
+		return &out_, err_
+	case 2181038086:
+		in_ := FileTruncateRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileTruncateResponse{}
+		s, err_ := s.Impl.Truncate(in_.Length)
+		out_.S = s
+		return &out_, err_
+	case 2181038087:
+		in_ := FileGetFlagsRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileGetFlagsResponse{}
+		s, flags, err_ := s.Impl.GetFlags()
+		out_.S = s
+		out_.Flags = flags
+		return &out_, err_
+	case 2181038088:
+		in_ := FileSetFlagsRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileSetFlagsResponse{}
+		s, err_ := s.Impl.SetFlags(in_.Flags)
+		out_.S = s
+		return &out_, err_
+	case 2181038089:
+		in_ := FileGetVmoRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileGetVmoResponse{}
+		s, vmo, err_ := s.Impl.GetVmo(in_.Flags)
+		out_.S = s
+		out_.Vmo = vmo
+		return &out_, err_
+	case 2181038090:
+		in_ := FileGetVmoAtRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := FileGetVmoAtResponse{}
+		s, vmo, err_ := s.Impl.GetVmoAt(in_.Flags,in_.Offset,in_.Length)
+		out_.S = s
+		out_.Vmo = vmo
+		return &out_, err_
+	}
+	return nil, _bindings.ErrUnknownOrdinal
+}
+
+type FileService struct {
+	_bindings.BindingSet
+}
+
+func (s *FileService) Add(impl File, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
+	return s.BindingSet.Add(&FileStub{Impl: impl}, c, onError)
+}
+
+func (s *FileService) EventProxyFor(key _bindings.BindingKey) (*FileEventProxy, bool) {
+	pxy, err := s.BindingSet.ProxyFor(key)
+	return (*FileEventProxy)(pxy), err
+}
+
+type FileEventProxy _bindings.Proxy
+
+func (p *FileEventProxy) OnOpen(s _zx.Status,info *ObjectInfo) error {
+	event_ := ObjectOnOpenResponse{
+		S: s,
+		Info: info,
+	}
+	return ((*_bindings.Proxy)(p)).Send(2147483655, &event_)
+}
+
+
+
+// Request for Open.
+type DirectoryOpenRequest struct {
+	Flags uint32 
+	Mode uint32 
+	Path string 
+	Object ObjectInterfaceRequest 
+}
+
+// Implements Payload.
+func (_ *DirectoryOpenRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryOpenRequest) InlineSize() int {
+	return 32
+}
+// Open has no response.
+// Request for Unlink.
+type DirectoryUnlinkRequest struct {
+	Path string 
+}
+
+// Implements Payload.
+func (_ *DirectoryUnlinkRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryUnlinkRequest) InlineSize() int {
+	return 16
+}
+// Response for Unlink.
+type DirectoryUnlinkResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *DirectoryUnlinkResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryUnlinkResponse) InlineSize() int {
+	return 4
+}
+// Request for ReadDirents.
+type DirectoryReadDirentsRequest struct {
+	MaxOut uint64 
+}
+
+// Implements Payload.
+func (_ *DirectoryReadDirentsRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryReadDirentsRequest) InlineSize() int {
+	return 8
+}
+// Response for ReadDirents.
+type DirectoryReadDirentsResponse struct {
+	S _zx.Status 
+	Dirents []uint8 `fidl:"8192"`
+}
+
+// Implements Payload.
+func (_ *DirectoryReadDirentsResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryReadDirentsResponse) InlineSize() int {
+	return 24
+}
+// Request for Rewind.
+type DirectoryRewindRequest struct {
+}
+
+// Implements Payload.
+func (_ *DirectoryRewindRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryRewindRequest) InlineSize() int {
+	return 0
+}
+// Response for Rewind.
+type DirectoryRewindResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *DirectoryRewindResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryRewindResponse) InlineSize() int {
+	return 4
+}
+// Request for GetToken.
+type DirectoryGetTokenRequest struct {
+}
+
+// Implements Payload.
+func (_ *DirectoryGetTokenRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryGetTokenRequest) InlineSize() int {
+	return 0
+}
+// Response for GetToken.
+type DirectoryGetTokenResponse struct {
+	S _zx.Status 
+	Token _zx.Handle 
+}
+
+// Implements Payload.
+func (_ *DirectoryGetTokenResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryGetTokenResponse) InlineSize() int {
+	return 8
+}
+// Request for Rename.
+type DirectoryRenameRequest struct {
+	Src string 
+	DstParentToken _zx.Handle 
+	Dst string 
+}
+
+// Implements Payload.
+func (_ *DirectoryRenameRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryRenameRequest) InlineSize() int {
+	return 40
+}
+// Response for Rename.
+type DirectoryRenameResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *DirectoryRenameResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryRenameResponse) InlineSize() int {
+	return 4
+}
+// Request for Link.
+type DirectoryLinkRequest struct {
+	Src string 
+	DstParentToken _zx.Handle 
+	Dst string 
+}
+
+// Implements Payload.
+func (_ *DirectoryLinkRequest) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryLinkRequest) InlineSize() int {
+	return 40
+}
+// Response for Link.
+type DirectoryLinkResponse struct {
+	S _zx.Status 
+}
+
+// Implements Payload.
+func (_ *DirectoryLinkResponse) InlineAlignment() int {
+	return 0
+}
+
+// Implements Payload.
+func (_ *DirectoryLinkResponse) InlineSize() int {
+	return 4
+}
+
+type DirectoryInterface _bindings.Proxy
+
+func (p *DirectoryInterface) Open(flags uint32,mode uint32,path string,object ObjectInterfaceRequest) error {
+	req_ := DirectoryOpenRequest{
+		Flags: flags,
+		Mode: mode,
+		Path: path,
+		Object: object,
+	}
+	err := ((*_bindings.Proxy)(p)).Send(2197815297, &req_)
+	return err
+}
+func (p *DirectoryInterface) Unlink(path string) (_zx.Status, error) {
+	req_ := DirectoryUnlinkRequest{
+		Path: path,
+	}
+	resp_ := DirectoryUnlinkResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2197815298, &req_, &resp_)
+	return resp_.S, err
+}
+func (p *DirectoryInterface) ReadDirents(maxOut uint64) (_zx.Status, []uint8, error) {
+	req_ := DirectoryReadDirentsRequest{
+		MaxOut: maxOut,
+	}
+	resp_ := DirectoryReadDirentsResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2197815299, &req_, &resp_)
+	return resp_.S, resp_.Dirents, err
+}
+func (p *DirectoryInterface) Rewind() (_zx.Status, error) {
+	req_ := DirectoryRewindRequest{
+	}
+	resp_ := DirectoryRewindResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2197815300, &req_, &resp_)
+	return resp_.S, err
+}
+func (p *DirectoryInterface) GetToken() (_zx.Status, _zx.Handle, error) {
+	req_ := DirectoryGetTokenRequest{
+	}
+	resp_ := DirectoryGetTokenResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2197815301, &req_, &resp_)
+	return resp_.S, resp_.Token, err
+}
+func (p *DirectoryInterface) Rename(src string,dstParentToken _zx.Handle,dst string) (_zx.Status, error) {
+	req_ := DirectoryRenameRequest{
+		Src: src,
+		DstParentToken: dstParentToken,
+		Dst: dst,
+	}
+	resp_ := DirectoryRenameResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2197815302, &req_, &resp_)
+	return resp_.S, err
+}
+func (p *DirectoryInterface) Link(src string,dstParentToken _zx.Handle,dst string) (_zx.Status, error) {
+	req_ := DirectoryLinkRequest{
+		Src: src,
+		DstParentToken: dstParentToken,
+		Dst: dst,
+	}
+	resp_ := DirectoryLinkResponse{}
+	err := ((*_bindings.Proxy)(p)).Call(2197815303, &req_, &resp_)
+	return resp_.S, err
+}
+
+// Directory server interface.
+type Directory interface {
+	Clone(flags uint32,object ObjectInterfaceRequest) error
+	Close() (_zx.Status, error)
+	ListInterfaces() ([]string, error)
+	Bind(iface string) error
+	Describe() (ObjectInfo, error)
+	Sync() (_zx.Status, error)
+	GetAttr() (_zx.Status, NodeAttributes, error)
+	SetAttr(flags uint32,attributes NodeAttributes) (_zx.Status, error)
+	Ioctl(opcode uint32,maxOut uint64,handles []_zx.Handle,in []uint8) (_zx.Status, []_zx.Handle, []uint8, error)
+	Open(flags uint32,mode uint32,path string,object ObjectInterfaceRequest) error
+	Unlink(path string) (_zx.Status, error)
+	ReadDirents(maxOut uint64) (_zx.Status, []uint8, error)
+	Rewind() (_zx.Status, error)
+	GetToken() (_zx.Status, _zx.Handle, error)
+	Rename(src string,dstParentToken _zx.Handle,dst string) (_zx.Status, error)
+	Link(src string,dstParentToken _zx.Handle,dst string) (_zx.Status, error)
+}
+
+type DirectoryInterfaceRequest _bindings.InterfaceRequest
+
+func NewDirectoryInterfaceRequest() (DirectoryInterfaceRequest, *DirectoryInterface, error) {
+	req, cli, err := _bindings.NewInterfaceRequest()
+	return DirectoryInterfaceRequest(req), (*DirectoryInterface)(cli), err
+}
+
+type DirectoryStub struct {
+	Impl Directory
+}
+
+func (s *DirectoryStub) Dispatch(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Payload, error) {
+	switch ord {
+	case 2147483649:
+		in_ := ObjectCloneRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Clone(in_.Flags,in_.Object)
+		return nil, err_
+	case 2147483650:
+		in_ := ObjectCloseRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectCloseResponse{}
+		s, err_ := s.Impl.Close()
+		out_.S = s
+		return &out_, err_
+	case 2147483652:
+		in_ := ObjectListInterfacesRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectListInterfacesResponse{}
+		interfaces, err_ := s.Impl.ListInterfaces()
+		out_.Interfaces = interfaces
+		return &out_, err_
+	case 2147483653:
+		in_ := ObjectBindRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Bind(in_.Iface)
+		return nil, err_
+	case 2147483654:
+		in_ := ObjectDescribeRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := ObjectDescribeResponse{}
+		info, err_ := s.Impl.Describe()
+		out_.Info = info
+		return &out_, err_
+	case 2164260865:
+		in_ := NodeSyncRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeSyncResponse{}
+		s, err_ := s.Impl.Sync()
+		out_.S = s
+		return &out_, err_
+	case 2164260866:
+		in_ := NodeGetAttrRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeGetAttrResponse{}
+		s, attributes, err_ := s.Impl.GetAttr()
+		out_.S = s
+		out_.Attributes = attributes
+		return &out_, err_
+	case 2164260867:
+		in_ := NodeSetAttrRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeSetAttrResponse{}
+		s, err_ := s.Impl.SetAttr(in_.Flags,in_.Attributes)
+		out_.S = s
+		return &out_, err_
+	case 2164260868:
+		in_ := NodeIoctlRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := NodeIoctlResponse{}
+		s, handles, out, err_ := s.Impl.Ioctl(in_.Opcode,in_.MaxOut,in_.Handles,in_.In)
+		out_.S = s
+		out_.Handles = handles
+		out_.Out = out
+		return &out_, err_
+	case 2197815297:
+		in_ := DirectoryOpenRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s.Impl.Open(in_.Flags,in_.Mode,in_.Path,in_.Object)
+		return nil, err_
+	case 2197815298:
+		in_ := DirectoryUnlinkRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := DirectoryUnlinkResponse{}
+		s, err_ := s.Impl.Unlink(in_.Path)
+		out_.S = s
+		return &out_, err_
+	case 2197815299:
+		in_ := DirectoryReadDirentsRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := DirectoryReadDirentsResponse{}
+		s, dirents, err_ := s.Impl.ReadDirents(in_.MaxOut)
+		out_.S = s
+		out_.Dirents = dirents
+		return &out_, err_
+	case 2197815300:
+		in_ := DirectoryRewindRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := DirectoryRewindResponse{}
+		s, err_ := s.Impl.Rewind()
+		out_.S = s
+		return &out_, err_
+	case 2197815301:
+		in_ := DirectoryGetTokenRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := DirectoryGetTokenResponse{}
+		s, token, err_ := s.Impl.GetToken()
+		out_.S = s
+		out_.Token = token
+		return &out_, err_
+	case 2197815302:
+		in_ := DirectoryRenameRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := DirectoryRenameResponse{}
+		s, err_ := s.Impl.Rename(in_.Src,in_.DstParentToken,in_.Dst)
+		out_.S = s
+		return &out_, err_
+	case 2197815303:
+		in_ := DirectoryLinkRequest{}
+		if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
+			return nil, err_
+		}
+		out_ := DirectoryLinkResponse{}
+		s, err_ := s.Impl.Link(in_.Src,in_.DstParentToken,in_.Dst)
+		out_.S = s
+		return &out_, err_
+	}
+	return nil, _bindings.ErrUnknownOrdinal
+}
+
+type DirectoryService struct {
+	_bindings.BindingSet
+}
+
+func (s *DirectoryService) Add(impl Directory, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
+	return s.BindingSet.Add(&DirectoryStub{Impl: impl}, c, onError)
+}
+
+func (s *DirectoryService) EventProxyFor(key _bindings.BindingKey) (*DirectoryEventProxy, bool) {
+	pxy, err := s.BindingSet.ProxyFor(key)
+	return (*DirectoryEventProxy)(pxy), err
+}
+
+type DirectoryEventProxy _bindings.Proxy
+
+func (p *DirectoryEventProxy) OnOpen(s _zx.Status,info *ObjectInfo) error {
+	event_ := ObjectOnOpenResponse{
+		S: s,
+		Info: info,
+	}
+	return ((*_bindings.Proxy)(p)).Send(2147483655, &event_)
+}
+
