diff --git a/bindings/group.go b/bindings/group.go
index 00c45668e08563488884f68e5c9f76b2a0907687..b47d065797c0c75014c669ad43e0bc9cd674b033 100644
--- a/bindings/group.go
+++ b/bindings/group.go
@@ -23,66 +23,66 @@ type GroupChat struct {
 // GroupRequestFunc contains a function callback that is called when a group
 // request is received.
 type GroupRequestFunc interface {
-	GroupRequestCallback(g Group)
+	GroupRequestCallback(g *Group)
 }
 
 // GroupReceiveFunc contains a function callback that is called when a group
 // message is received.
 type GroupReceiveFunc interface {
-	GroupReceiveCallback(msg GroupMessageReceive)
+	GroupReceiveCallback(msg *GroupMessageReceive)
 }
 
 // NewGroupManager creates a new group chat manager.
 func NewGroupManager(client *Client, requestFunc GroupRequestFunc,
-	receiveFunc GroupReceiveFunc) (GroupChat, error) {
+	receiveFunc GroupReceiveFunc) (*GroupChat, error) {
 
 	requestCallback := func(g gs.Group) {
-		requestFunc.GroupRequestCallback(Group{g})
+		requestFunc.GroupRequestCallback(&Group{g})
 	}
 	receiveCallback := func(msg gc.MessageReceive) {
-		receiveFunc.GroupReceiveCallback(GroupMessageReceive{msg})
+		receiveFunc.GroupReceiveCallback(&GroupMessageReceive{msg})
 	}
 
 	// Create a new group chat manager
 	m, err := gc.NewManager(&client.api, requestCallback, receiveCallback)
 	if err != nil {
-		return GroupChat{}, err
+		return nil, err
 	}
 
 	// Start group request and message retrieval workers
 	err = client.api.AddService(m.StartProcesses)
 	if err != nil {
-		return GroupChat{}, err
+		return nil, err
 	}
 
-	return GroupChat{m}, nil
+	return &GroupChat{m}, nil
 }
 
 // MakeGroup creates a new group and sends a group request to all members in the
 // group. The ID of the new group, the rounds the requests were sent on, and the
 // status of the send are contained in NewGroupReport.
-func (g GroupChat) MakeGroup(membership IdList, name, message []byte) (NewGroupReport, error) {
+func (g *GroupChat) MakeGroup(membership *IdList, name, message []byte) (*NewGroupReport, error) {
 	grp, rounds, status, err := g.m.MakeGroup(membership.list, name, message)
-	return NewGroupReport{Group{grp}, rounds, status}, err
+	return &NewGroupReport{&Group{grp}, rounds, status}, err
 }
 
 // ResendRequest resends a group request to all members in the group. The rounds
 // they were sent on and the status of the send are contained in NewGroupReport.
-func (g GroupChat) ResendRequest(groupIdBytes []byte) (NewGroupReport, error) {
+func (g *GroupChat) ResendRequest(groupIdBytes []byte) (*NewGroupReport, error) {
 	groupID, err := id.Unmarshal(groupIdBytes)
 	if err != nil {
-		return NewGroupReport{},
+		return nil,
 			errors.Errorf("Failed to unmarshal group ID: %+v", err)
 	}
 
 	rounds, status, err := g.m.ResendRequest(groupID)
 
-	return NewGroupReport{Group{}, rounds, status}, nil
+	return &NewGroupReport{&Group{}, rounds, status}, nil
 }
 
 // JoinGroup allows a user to join a group when they receive a request. The
 // caller must pass in the serialized bytes of a Group.
-func (g GroupChat) JoinGroup(serializedGroupData []byte) error {
+func (g *GroupChat) JoinGroup(serializedGroupData []byte) error {
 	grp, err := gs.DeserializeGroup(serializedGroupData)
 	if err != nil {
 		return err
@@ -91,7 +91,7 @@ func (g GroupChat) JoinGroup(serializedGroupData []byte) error {
 }
 
 // LeaveGroup deletes a group so a user no longer has access.
-func (g GroupChat) LeaveGroup(groupIdBytes []byte) error {
+func (g *GroupChat) LeaveGroup(groupIdBytes []byte) error {
 	groupID, err := id.Unmarshal(groupIdBytes)
 	if err != nil {
 		return errors.Errorf("Failed to unmarshal group ID: %+v", err)
@@ -102,7 +102,7 @@ func (g GroupChat) LeaveGroup(groupIdBytes []byte) error {
 
 // Send sends the message to the specified group. Returns the round the messages
 // were sent on.
-func (g GroupChat) Send(groupIdBytes, message []byte) (int64, error) {
+func (g *GroupChat) Send(groupIdBytes, message []byte) (int64, error) {
 	groupID, err := id.Unmarshal(groupIdBytes)
 	if err != nil {
 		return 0, errors.Errorf("Failed to unmarshal group ID: %+v", err)
@@ -114,28 +114,28 @@ func (g GroupChat) Send(groupIdBytes, message []byte) (int64, error) {
 
 // GetGroups returns an IdList containing a list of group IDs that the user is a
 // part of.
-func (g GroupChat) GetGroups() IdList {
-	return IdList{g.m.GetGroups()}
+func (g *GroupChat) GetGroups() *IdList {
+	return &IdList{g.m.GetGroups()}
 }
 
 // GetGroup returns the group with the group ID. If no group exists, then the
 // error "failed to find group" is returned.
-func (g GroupChat) GetGroup(groupIdBytes []byte) (Group, error) {
+func (g *GroupChat) GetGroup(groupIdBytes []byte) (*Group, error) {
 	groupID, err := id.Unmarshal(groupIdBytes)
 	if err != nil {
-		return Group{}, errors.Errorf("Failed to unmarshal group ID: %+v", err)
+		return nil, errors.Errorf("Failed to unmarshal group ID: %+v", err)
 	}
 
 	grp, exists := g.m.GetGroup(groupID)
 	if !exists {
-		return Group{}, errors.New("failed to find group")
+		return nil, errors.New("failed to find group")
 	}
 
-	return Group{grp}, nil
+	return &Group{grp}, nil
 }
 
 // NumGroups returns the number of groups the user is a part of.
-func (g GroupChat) NumGroups() int {
+func (g *GroupChat) NumGroups() int {
 	return g.m.NumGroups()
 }
 
@@ -143,20 +143,20 @@ func (g GroupChat) NumGroups() int {
 // the group, a list of rounds that the group requests were sent on, and the
 // status of the send.
 type NewGroupReport struct {
-	group  Group
+	group  *Group
 	rounds []id.Round
 	status gc.RequestStatus
 }
 
 // GetGroup returns the Group.
-func (ngr NewGroupReport) GetGroup() Group {
+func (ngr *NewGroupReport) GetGroup() *Group {
 	return ngr.group
 }
 
 // GetRoundList returns the RoundList containing a list of rounds requests were
 // sent on.
-func (ngr NewGroupReport) GetRoundList() RoundList {
-	return RoundList{ngr.rounds}
+func (ngr *NewGroupReport) GetRoundList() *RoundList {
+	return &RoundList{ngr.rounds}
 }
 
 // GetStatus returns the status of the requests sent when creating a new group.
@@ -164,7 +164,7 @@ func (ngr NewGroupReport) GetRoundList() RoundList {
 //          1   all requests failed to send
 //          2   some request failed and some succeeded
 //          3,  all requests sent successfully
-func (ngr NewGroupReport) GetStatus() int {
+func (ngr *NewGroupReport) GetStatus() int {
 	return int(ngr.status)
 }
 
@@ -179,24 +179,24 @@ type Group struct {
 }
 
 // GetName returns the name set by the user for the group.
-func (g Group) GetName() []byte {
+func (g *Group) GetName() []byte {
 	return g.g.Name
 }
 
 // GetID return the 33-byte unique group ID.
-func (g Group) GetID() []byte {
+func (g *Group) GetID() []byte {
 	return g.g.ID.Bytes()
 }
 
 // GetMembership returns a list of contacts, one for each member in the group.
 // The list is in order; the first contact is the leader/creator of the group.
 // All subsequent members are ordered by their ID.
-func (g Group) GetMembership() GroupMembership {
-	return GroupMembership{g.g.Members}
+func (g *Group) GetMembership() *GroupMembership {
+	return &GroupMembership{g.g.Members}
 }
 
 // Serialize serializes the Group.
-func (g Group) Serialize() []byte {
+func (g *Group) Serialize() []byte {
 	return g.g.Serialize()
 }
 
@@ -211,18 +211,18 @@ type GroupMembership struct {
 }
 
 // Len returns the number of members in the group membership.
-func (gm GroupMembership) Len() int {
-	return gm.Len()
+func (gm *GroupMembership) Len() int {
+	return len(gm.m)
 }
 
 // Get returns the member at the index. The member at index 0 is always the
 // group leader. An error is returned if the index is out of range.
-func (gm GroupMembership) Get(i int) (GroupMember, error) {
+func (gm *GroupMembership) Get(i int) (*GroupMember, error) {
 	if i < 0 || i > gm.Len() {
-		return GroupMember{}, errors.Errorf("ID list index must be between %d "+
+		return nil, errors.Errorf("ID list index must be between %d "+
 			"and the last element %d.", 0, gm.Len())
 	}
-	return GroupMember{gm.m[i]}, nil
+	return &GroupMember{gm.m[i]}, nil
 }
 
 ////
@@ -240,7 +240,7 @@ func (gm GroupMember) GetID() []byte {
 
 // GetDhKey returns the byte representation of the public Diffie–Hellman key of
 // the member.
-func (gm GroupMember) GetDhKey() []byte {
+func (gm *GroupMember) GetDhKey() []byte {
 	return gm.DhKey.Bytes()
 }
 
@@ -255,47 +255,47 @@ type GroupMessageReceive struct {
 }
 
 // GetGroupID returns the 33-byte group ID.
-func (gmr GroupMessageReceive) GetGroupID() []byte {
+func (gmr *GroupMessageReceive) GetGroupID() []byte {
 	return gmr.GroupID.Bytes()
 }
 
 // GetMessageID returns the message ID.
-func (gmr GroupMessageReceive) GetMessageID() []byte {
+func (gmr *GroupMessageReceive) GetMessageID() []byte {
 	return gmr.ID.Bytes()
 }
 
 // GetPayload returns the message payload.
-func (gmr GroupMessageReceive) GetPayload() []byte {
+func (gmr *GroupMessageReceive) GetPayload() []byte {
 	return gmr.Payload
 }
 
 // GetSenderID returns the 33-byte user ID of the sender.
-func (gmr GroupMessageReceive) GetSenderID() []byte {
+func (gmr *GroupMessageReceive) GetSenderID() []byte {
 	return gmr.SenderID.Bytes()
 }
 
 // GetRecipientID returns the 33-byte user ID of the recipient.
-func (gmr GroupMessageReceive) GetRecipientID() []byte {
+func (gmr *GroupMessageReceive) GetRecipientID() []byte {
 	return gmr.RecipientID.Bytes()
 }
 
 // GetEphemeralID returns the ephemeral ID of the recipient.
-func (gmr GroupMessageReceive) GetEphemeralID() int64 {
+func (gmr *GroupMessageReceive) GetEphemeralID() int64 {
 	return gmr.EphemeralID.Int64()
 }
 
 // GetTimestampNano returns the message timestamp in nanoseconds.
-func (gmr GroupMessageReceive) GetTimestampNano() int64 {
+func (gmr *GroupMessageReceive) GetTimestampNano() int64 {
 	return gmr.Timestamp.UnixNano()
 }
 
 // GetRoundID returns the ID of the round the message was sent on.
-func (gmr GroupMessageReceive) GetRoundID() int64 {
+func (gmr *GroupMessageReceive) GetRoundID() int64 {
 	return int64(gmr.RoundID)
 }
 
 // GetRoundTimestampNano returns the timestamp, in nanoseconds, of the round the
 // message was sent on.
-func (gmr GroupMessageReceive) GetRoundTimestampNano() int64 {
+func (gmr *GroupMessageReceive) GetRoundTimestampNano() int64 {
 	return gmr.RoundTimestamp.UnixNano()
 }
diff --git a/bindings/list.go b/bindings/list.go
index a97df24f299d994380d46de8ae9971ad9133c1e7..1331c378e2b2f31c457ef2f3d082c51e186f2fbb 100644
--- a/bindings/list.go
+++ b/bindings/list.go
@@ -123,17 +123,17 @@ type IdList struct {
 }
 
 // MakeIdList creates a new empty IdList.
-func MakeIdList() IdList {
-	return IdList{[]*id.ID{}}
+func MakeIdList() *IdList {
+	return &IdList{[]*id.ID{}}
 }
 
 // Len returns the number of IDs in the list.
-func (idl IdList) Len() int {
+func (idl *IdList) Len() int {
 	return len(idl.list)
 }
 
 // Add appends the ID bytes to the end of the list.
-func (idl IdList) Add(idBytes []byte) error {
+func (idl *IdList) Add(idBytes []byte) error {
 	newID, err := id.Unmarshal(idBytes)
 	if err != nil {
 		return err
@@ -145,7 +145,7 @@ func (idl IdList) Add(idBytes []byte) error {
 
 // Get returns the ID at the index. An error is returned if the index is out of
 // range.
-func (idl IdList) Get(i int) ([]byte, error) {
+func (idl *IdList) Get(i int) ([]byte, error) {
 	if i < 0 || i > len(idl.list) {
 		return nil, errors.Errorf("ID list index must be between %d and the "+
 			"last element %d.", 0, len(idl.list))