Syncing settings data correctly.
Removing outdated images from assets and texture.go

Change-Id: I308fb5b4a285eb0a8d1d18a7a5abf30a10fcad9b
diff --git a/go/src/hearts/assets/Deal.png b/go/src/hearts/assets/Deal.png
deleted file mode 100644
index c22ea22..0000000
--- a/go/src/hearts/assets/Deal.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/acrossArrow.png b/go/src/hearts/assets/acrossArrow.png
deleted file mode 100644
index 4aaa946..0000000
--- a/go/src/hearts/assets/acrossArrow.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/bluePressed.png b/go/src/hearts/assets/bluePressed.png
deleted file mode 100644
index 1ddd80b..0000000
--- a/go/src/hearts/assets/bluePressed.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/croupierName.png b/go/src/hearts/assets/croupierName.png
deleted file mode 100644
index 8a5a1b6..0000000
--- a/go/src/hearts/assets/croupierName.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/leftArrow.png b/go/src/hearts/assets/leftArrow.png
deleted file mode 100644
index 3361ac6..0000000
--- a/go/src/hearts/assets/leftArrow.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/passPressed.png b/go/src/hearts/assets/passPressed.png
deleted file mode 100644
index cd8c0aa..0000000
--- a/go/src/hearts/assets/passPressed.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/passUnpressed.png b/go/src/hearts/assets/passUnpressed.png
deleted file mode 100644
index 1c5db41..0000000
--- a/go/src/hearts/assets/passUnpressed.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/playPressed.png b/go/src/hearts/assets/playPressed.png
deleted file mode 100644
index 975a00a..0000000
--- a/go/src/hearts/assets/playPressed.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/playUnpressed.png b/go/src/hearts/assets/playUnpressed.png
deleted file mode 100644
index 777848a..0000000
--- a/go/src/hearts/assets/playUnpressed.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/rightArrow.png b/go/src/hearts/assets/rightArrow.png
deleted file mode 100644
index 048b571..0000000
--- a/go/src/hearts/assets/rightArrow.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/takePressed.png b/go/src/hearts/assets/takePressed.png
deleted file mode 100644
index fdae348..0000000
--- a/go/src/hearts/assets/takePressed.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/takeUnpressed.png b/go/src/hearts/assets/takeUnpressed.png
deleted file mode 100644
index f8b6a7a..0000000
--- a/go/src/hearts/assets/takeUnpressed.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/assets/white.png b/go/src/hearts/assets/white.png
deleted file mode 100644
index e878403..0000000
--- a/go/src/hearts/assets/white.png
+++ /dev/null
Binary files differ
diff --git a/go/src/hearts/img/texture/texture.go b/go/src/hearts/img/texture/texture.go
index 08e752b..a112d6c 100644
--- a/go/src/hearts/img/texture/texture.go
+++ b/go/src/hearts/img/texture/texture.go
@@ -181,7 +181,10 @@
 		totalWidth = maxWidth
 	}
 	startX := center.X - totalWidth/2
-	startY := center.Y + (float32(textures[0].R.Max.Y)/scaler-float32(textures[0].R.Max.Y)/newScaler)/2
+	startY := center.Y
+	if len(textures) > 0 {
+		startY = center.Y + (float32(textures[0].R.Max.Y)/scaler-float32(textures[0].R.Max.Y)/newScaler)/2
+	}
 	start := coords.MakeVec(startX, startY)
 	return MakeStringImgLeftAlign(input, color, altColor, displayColor, start, newScaler, maxWidth, u)
 }
@@ -228,47 +231,46 @@
 		"Hearts-2.png", "Hearts-3.png", "Hearts-4.png", "Hearts-5.png", "Hearts-6.png", "Hearts-7.png", "Hearts-8.png",
 		"Hearts-9.png", "Hearts-10.png", "Hearts-Jack.png", "Hearts-Queen.png", "Hearts-King.png", "Hearts-Ace.png", "BakuSquare.png",
 	}
-	unboundedImgs := []string{"Club.png", "Diamond.png", "Spade.png", "Heart.png", "gray.jpeg", "blue.png", "white.png", "passPressed.png",
-		"passUnpressed.png", "leftArrow.png", "rightArrow.png", "acrossArrow.png", "croupierName.png", "trickDrop.png", "trickDropBlue.png",
-		"player0.jpeg", "player1.jpeg", "player2.jpeg", "player3.jpeg", "laptopIcon.png", "watchIcon.png", "phoneIcon.png", "tabletIcon.png",
-		"playPressed.png", "playUnpressed.png", "bluePressed.png", "takePressed.png", "takeUnpressed.png", "A-Upper.png", "B-Upper.png",
-		"C-Upper.png", "D-Upper.png", "E-Upper.png", "F-Upper.png", "G-Upper.png", "H-Upper.png", "I-Upper.png", "J-Upper.png",
-		"K-Upper.png", "L-Upper.png", "M-Upper.png", "N-Upper.png", "O-Upper.png", "P-Upper.png", "Q-Upper.png", "R-Upper.png",
-		"S-Upper.png", "T-Upper.png", "U-Upper.png", "V-Upper.png", "W-Upper.png", "X-Upper.png", "Y-Upper.png", "Z-Upper.png",
-		"A-Lower.png", "B-Lower.png", "C-Lower.png", "D-Lower.png", "E-Lower.png", "F-Lower.png", "G-Lower.png", "H-Lower.png",
-		"I-Lower.png", "J-Lower.png", "K-Lower.png", "L-Lower.png", "M-Lower.png", "N-Lower.png", "O-Lower.png", "P-Lower.png",
-		"Q-Lower.png", "R-Lower.png", "S-Lower.png", "T-Lower.png", "U-Lower.png", "V-Lower.png", "W-Lower.png", "X-Lower.png",
-		"Y-Lower.png", "Z-Lower.png", "Space.png", "Colon.png", "Bang.png", "1.png", "2.png", "3.png", "4.png", "5.png", "6.png", "7.png",
-		"8.png", "9.png", "0.png", "1-Red.png", "2-Red.png", "3-Red.png", "4-Red.png", "5-Red.png", "6-Red.png", "7-Red.png", "8-Red.png",
-		"9-Red.png", "0-Red.png", "A-Upper-DBlue.png", "B-Upper-DBlue.png", "C-Upper-DBlue.png", "D-Upper-DBlue.png", "E-Upper-DBlue.png",
-		"F-Upper-DBlue.png", "G-Upper-DBlue.png", "H-Upper-DBlue.png", "I-Upper-DBlue.png", "J-Upper-DBlue.png", "K-Upper-DBlue.png",
-		"L-Upper-DBlue.png", "M-Upper-DBlue.png", "N-Upper-DBlue.png", "O-Upper-DBlue.png", "P-Upper-DBlue.png", "Q-Upper-DBlue.png",
-		"R-Upper-DBlue.png", "S-Upper-DBlue.png", "T-Upper-DBlue.png", "U-Upper-DBlue.png", "V-Upper-DBlue.png", "W-Upper-DBlue.png",
-		"X-Upper-DBlue.png", "Y-Upper-DBlue.png", "Z-Upper-DBlue.png", "A-Lower-DBlue.png", "B-Lower-DBlue.png", "C-Lower-DBlue.png",
-		"D-Lower-DBlue.png", "E-Lower-DBlue.png", "F-Lower-DBlue.png", "G-Lower-DBlue.png", "H-Lower-DBlue.png", "I-Lower-DBlue.png",
-		"J-Lower-DBlue.png", "K-Lower-DBlue.png", "L-Lower-DBlue.png", "M-Lower-DBlue.png", "N-Lower-DBlue.png", "O-Lower-DBlue.png",
-		"P-Lower-DBlue.png", "Q-Lower-DBlue.png", "R-Lower-DBlue.png", "S-Lower-DBlue.png", "T-Lower-DBlue.png", "U-Lower-DBlue.png",
-		"V-Lower-DBlue.png", "W-Lower-DBlue.png", "X-Lower-DBlue.png", "Y-Lower-DBlue.png", "Z-Lower-DBlue.png", "Apostrophe-DBlue.png",
-		"Space-DBlue.png", "A-Upper-LBlue.png", "B-Upper-LBlue.png", "C-Upper-LBlue.png", "D-Upper-LBlue.png", "E-Upper-LBlue.png",
-		"F-Upper-LBlue.png", "G-Upper-LBlue.png", "H-Upper-LBlue.png", "I-Upper-LBlue.png", "J-Upper-LBlue.png", "K-Upper-LBlue.png",
-		"L-Upper-LBlue.png", "M-Upper-LBlue.png", "N-Upper-LBlue.png", "O-Upper-LBlue.png", "P-Upper-LBlue.png", "Q-Upper-LBlue.png",
-		"R-Upper-LBlue.png", "S-Upper-LBlue.png", "T-Upper-LBlue.png", "U-Upper-LBlue.png", "V-Upper-LBlue.png", "W-Upper-LBlue.png",
-		"X-Upper-LBlue.png", "Y-Upper-LBlue.png", "Z-Upper-LBlue.png", "A-Lower-LBlue.png", "B-Lower-LBlue.png", "C-Lower-LBlue.png",
-		"D-Lower-LBlue.png", "E-Lower-LBlue.png", "F-Lower-LBlue.png", "G-Lower-LBlue.png", "H-Lower-LBlue.png", "I-Lower-LBlue.png",
-		"J-Lower-LBlue.png", "K-Lower-LBlue.png", "L-Lower-LBlue.png", "M-Lower-LBlue.png", "N-Lower-LBlue.png", "O-Lower-LBlue.png",
-		"P-Lower-LBlue.png", "Q-Lower-LBlue.png", "R-Lower-LBlue.png", "S-Lower-LBlue.png", "T-Lower-LBlue.png", "U-Lower-LBlue.png",
-		"V-Lower-LBlue.png", "W-Lower-LBlue.png", "X-Lower-LBlue.png", "Y-Lower-LBlue.png", "Z-Lower-LBlue.png", "A-Upper-Gray.png",
-		"B-Upper-Gray.png", "C-Upper-Gray.png", "D-Upper-Gray.png", "E-Upper-Gray.png", "F-Upper-Gray.png", "G-Upper-Gray.png",
-		"H-Upper-Gray.png", "I-Upper-Gray.png", "J-Upper-Gray.png", "K-Upper-Gray.png", "L-Upper-Gray.png", "M-Upper-Gray.png",
-		"N-Upper-Gray.png", "O-Upper-Gray.png", "P-Upper-Gray.png", "Q-Upper-Gray.png", "R-Upper-Gray.png", "S-Upper-Gray.png",
-		"T-Upper-Gray.png", "U-Upper-Gray.png", "V-Upper-Gray.png", "W-Upper-Gray.png", "X-Upper-Gray.png", "Y-Upper-Gray.png",
-		"Z-Upper-Gray.png", "A-Lower-Gray.png", "B-Lower-Gray.png", "C-Lower-Gray.png", "D-Lower-Gray.png", "E-Lower-Gray.png",
-		"F-Lower-Gray.png", "G-Lower-Gray.png", "H-Lower-Gray.png", "I-Lower-Gray.png", "J-Lower-Gray.png", "K-Lower-Gray.png",
-		"L-Lower-Gray.png", "M-Lower-Gray.png", "N-Lower-Gray.png", "O-Lower-Gray.png", "P-Lower-Gray.png", "Q-Lower-Gray.png",
-		"R-Lower-Gray.png", "S-Lower-Gray.png", "T-Lower-Gray.png", "U-Lower-Gray.png", "V-Lower-Gray.png", "W-Lower-Gray.png",
-		"X-Lower-Gray.png", "Y-Lower-Gray.png", "Z-Lower-Gray.png", "Space-Gray.png", "RoundedRectangle-DBlue.png",
-		"RoundedRectangle-LBlue.png", "RoundedRectangle-Gray.png", "Rectangle-LBlue.png", "Rectangle-DBlue.png", "HorizontalPullTab.png",
-		"VerticalPullTab.png", "NewGame.png", "NewRound.png", "JoinGame.png", "Deal.png", "Period.png", "SitSpot.png", "WatchSpot.png",
+	unboundedImgs := []string{"Club.png", "Diamond.png", "Spade.png", "Heart.png", "gray.jpeg", "blue.png", "trickDrop.png",
+		"trickDropBlue.png", "player0.jpeg", "player1.jpeg", "player2.jpeg", "player3.jpeg", "laptopIcon.png", "watchIcon.png",
+		"phoneIcon.png", "tabletIcon.png", "A-Upper.png", "B-Upper.png", "C-Upper.png", "D-Upper.png", "E-Upper.png", "F-Upper.png",
+		"G-Upper.png", "H-Upper.png", "I-Upper.png", "J-Upper.png", "K-Upper.png", "L-Upper.png", "M-Upper.png", "N-Upper.png",
+		"O-Upper.png", "P-Upper.png", "Q-Upper.png", "R-Upper.png", "S-Upper.png", "T-Upper.png", "U-Upper.png", "V-Upper.png",
+		"W-Upper.png", "X-Upper.png", "Y-Upper.png", "Z-Upper.png", "A-Lower.png", "B-Lower.png", "C-Lower.png", "D-Lower.png",
+		"E-Lower.png", "F-Lower.png", "G-Lower.png", "H-Lower.png", "I-Lower.png", "J-Lower.png", "K-Lower.png", "L-Lower.png",
+		"M-Lower.png", "N-Lower.png", "O-Lower.png", "P-Lower.png", "Q-Lower.png", "R-Lower.png", "S-Lower.png", "T-Lower.png",
+		"U-Lower.png", "V-Lower.png", "W-Lower.png", "X-Lower.png", "Y-Lower.png", "Z-Lower.png", "Space.png", "Colon.png", "Bang.png",
+		"1.png", "2.png", "3.png", "4.png", "5.png", "6.png", "7.png", "8.png", "9.png", "0.png", "1-Red.png", "2-Red.png", "3-Red.png",
+		"4-Red.png", "5-Red.png", "6-Red.png", "7-Red.png", "8-Red.png", "9-Red.png", "0-Red.png", "A-Upper-DBlue.png", "B-Upper-DBlue.png",
+		"C-Upper-DBlue.png", "D-Upper-DBlue.png", "E-Upper-DBlue.png", "F-Upper-DBlue.png", "G-Upper-DBlue.png", "H-Upper-DBlue.png",
+		"I-Upper-DBlue.png", "J-Upper-DBlue.png", "K-Upper-DBlue.png", "L-Upper-DBlue.png", "M-Upper-DBlue.png", "N-Upper-DBlue.png",
+		"O-Upper-DBlue.png", "P-Upper-DBlue.png", "Q-Upper-DBlue.png", "R-Upper-DBlue.png", "S-Upper-DBlue.png", "T-Upper-DBlue.png",
+		"U-Upper-DBlue.png", "V-Upper-DBlue.png", "W-Upper-DBlue.png", "X-Upper-DBlue.png", "Y-Upper-DBlue.png", "Z-Upper-DBlue.png",
+		"A-Lower-DBlue.png", "B-Lower-DBlue.png", "C-Lower-DBlue.png", "D-Lower-DBlue.png", "E-Lower-DBlue.png", "F-Lower-DBlue.png",
+		"G-Lower-DBlue.png", "H-Lower-DBlue.png", "I-Lower-DBlue.png", "J-Lower-DBlue.png", "K-Lower-DBlue.png", "L-Lower-DBlue.png",
+		"M-Lower-DBlue.png", "N-Lower-DBlue.png", "O-Lower-DBlue.png", "P-Lower-DBlue.png", "Q-Lower-DBlue.png", "R-Lower-DBlue.png",
+		"S-Lower-DBlue.png", "T-Lower-DBlue.png", "U-Lower-DBlue.png", "V-Lower-DBlue.png", "W-Lower-DBlue.png", "X-Lower-DBlue.png",
+		"Y-Lower-DBlue.png", "Z-Lower-DBlue.png", "Apostrophe-DBlue.png", "Space-DBlue.png", "A-Upper-LBlue.png", "B-Upper-LBlue.png",
+		"C-Upper-LBlue.png", "D-Upper-LBlue.png", "E-Upper-LBlue.png", "F-Upper-LBlue.png", "G-Upper-LBlue.png", "H-Upper-LBlue.png",
+		"I-Upper-LBlue.png", "J-Upper-LBlue.png", "K-Upper-LBlue.png", "L-Upper-LBlue.png", "M-Upper-LBlue.png", "N-Upper-LBlue.png",
+		"O-Upper-LBlue.png", "P-Upper-LBlue.png", "Q-Upper-LBlue.png", "R-Upper-LBlue.png", "S-Upper-LBlue.png", "T-Upper-LBlue.png",
+		"U-Upper-LBlue.png", "V-Upper-LBlue.png", "W-Upper-LBlue.png", "X-Upper-LBlue.png", "Y-Upper-LBlue.png", "Z-Upper-LBlue.png",
+		"A-Lower-LBlue.png", "B-Lower-LBlue.png", "C-Lower-LBlue.png", "D-Lower-LBlue.png", "E-Lower-LBlue.png", "F-Lower-LBlue.png",
+		"G-Lower-LBlue.png", "H-Lower-LBlue.png", "I-Lower-LBlue.png", "J-Lower-LBlue.png", "K-Lower-LBlue.png", "L-Lower-LBlue.png",
+		"M-Lower-LBlue.png", "N-Lower-LBlue.png", "O-Lower-LBlue.png", "P-Lower-LBlue.png", "Q-Lower-LBlue.png", "R-Lower-LBlue.png",
+		"S-Lower-LBlue.png", "T-Lower-LBlue.png", "U-Lower-LBlue.png", "V-Lower-LBlue.png", "W-Lower-LBlue.png", "X-Lower-LBlue.png",
+		"Y-Lower-LBlue.png", "Z-Lower-LBlue.png", "A-Upper-Gray.png", "B-Upper-Gray.png", "C-Upper-Gray.png", "D-Upper-Gray.png",
+		"E-Upper-Gray.png", "F-Upper-Gray.png", "G-Upper-Gray.png", "H-Upper-Gray.png", "I-Upper-Gray.png", "J-Upper-Gray.png",
+		"K-Upper-Gray.png", "L-Upper-Gray.png", "M-Upper-Gray.png", "N-Upper-Gray.png", "O-Upper-Gray.png", "P-Upper-Gray.png",
+		"Q-Upper-Gray.png", "R-Upper-Gray.png", "S-Upper-Gray.png", "T-Upper-Gray.png", "U-Upper-Gray.png", "V-Upper-Gray.png",
+		"W-Upper-Gray.png", "X-Upper-Gray.png", "Y-Upper-Gray.png", "Z-Upper-Gray.png", "A-Lower-Gray.png", "B-Lower-Gray.png",
+		"C-Lower-Gray.png", "D-Lower-Gray.png", "E-Lower-Gray.png", "F-Lower-Gray.png", "G-Lower-Gray.png", "H-Lower-Gray.png",
+		"I-Lower-Gray.png", "J-Lower-Gray.png", "K-Lower-Gray.png", "L-Lower-Gray.png", "M-Lower-Gray.png", "N-Lower-Gray.png",
+		"O-Lower-Gray.png", "P-Lower-Gray.png", "Q-Lower-Gray.png", "R-Lower-Gray.png", "S-Lower-Gray.png", "T-Lower-Gray.png",
+		"U-Lower-Gray.png", "V-Lower-Gray.png", "W-Lower-Gray.png", "X-Lower-Gray.png", "Y-Lower-Gray.png", "Z-Lower-Gray.png",
+		"Space-Gray.png", "RoundedRectangle-DBlue.png", "RoundedRectangle-LBlue.png", "RoundedRectangle-Gray.png", "Rectangle-LBlue.png",
+		"Rectangle-DBlue.png", "HorizontalPullTab.png", "VerticalPullTab.png", "NewGame.png", "NewRound.png", "JoinGame.png", "Period.png",
+		"SitSpot.png", "WatchSpot.png",
 	}
 	for _, f := range boundedImgs {
 		a, err := asset.Open(f)
diff --git a/go/src/hearts/img/view/view.go b/go/src/hearts/img/view/view.go
index 2242d1f..e41f594 100644
--- a/go/src/hearts/img/view/view.go
+++ b/go/src/hearts/img/view/view.go
@@ -55,7 +55,7 @@
 		u.Buttons = append(u.Buttons, texture.MakeImgWithoutAlt(sitImg, sitPos, arrangeDim, u))
 	} else {
 		u.Buttons = append(u.Buttons, texture.MakeImgWithoutAlt(sitImg, sitPos, nilDim, u))
-		avatar := uistate.GetAvatar(0, u)
+		avatar := uistate.GetAvatar(1, u)
 		u.BackgroundImgs = append(u.BackgroundImgs, texture.MakeImgWithoutAlt(avatar, sitPos, arrangeDim, u))
 	}
 	// player 2 seat
@@ -64,7 +64,7 @@
 		u.Buttons = append(u.Buttons, texture.MakeImgWithoutAlt(sitImg, sitPos, arrangeDim, u))
 	} else {
 		u.Buttons = append(u.Buttons, texture.MakeImgWithoutAlt(sitImg, sitPos, nilDim, u))
-		avatar := uistate.GetAvatar(0, u)
+		avatar := uistate.GetAvatar(2, u)
 		u.BackgroundImgs = append(u.BackgroundImgs, texture.MakeImgWithoutAlt(avatar, sitPos, arrangeDim, u))
 	}
 	// player 3 seat
@@ -73,7 +73,7 @@
 		u.Buttons = append(u.Buttons, texture.MakeImgWithoutAlt(sitImg, sitPos, arrangeDim, u))
 	} else {
 		u.Buttons = append(u.Buttons, texture.MakeImgWithoutAlt(sitImg, sitPos, nilDim, u))
-		avatar := uistate.GetAvatar(0, u)
+		avatar := uistate.GetAvatar(3, u)
 		u.BackgroundImgs = append(u.BackgroundImgs, texture.MakeImgWithoutAlt(avatar, sitPos, arrangeDim, u))
 	}
 	// table
diff --git a/go/src/hearts/syncbase/client/main.go b/go/src/hearts/syncbase/client/main.go
index 46ddf10..8924dbd 100644
--- a/go/src/hearts/syncbase/client/main.go
+++ b/go/src/hearts/syncbase/client/main.go
@@ -85,19 +85,16 @@
 	return db.Watch(u.Ctx, tableName, prefix, resumeMarker)
 }
 
-// Joins a set of gamelog and game settings syncgroups
-// TODO(emshack): After joining a syncgroup, advertise user settings data
-func JoinSyncgroups(ch chan bool, logName, settingsName string, u *uistate.UIState) {
-	fmt.Println("Joining syncgroup")
+// Joins gamelog syncgroup
+func JoinLogSyncgroup(ch chan bool, logName string, u *uistate.UIState) {
+	fmt.Println("Joining gamelog syncgroup")
 	u.IsOwner = false
 	app := u.Service.App(util.AppName)
 	db := app.NoSQLDatabase(util.DbName, nil)
 	logSg := db.Syncgroup(logName)
-	settingsSg := db.Syncgroup(settingsName)
 	myInfoJoiner := wire.SyncgroupMemberInfo{8, false}
 	_, err := logSg.Join(u.Ctx, myInfoJoiner)
-	_, err2 := settingsSg.Join(u.Ctx, myInfoJoiner)
-	if err != nil || err2 != nil {
+	if err != nil {
 		fmt.Println("SYNCGROUP JOIN ERROR: ", err)
 		ch <- false
 	} else {
@@ -110,6 +107,23 @@
 	}
 }
 
+// Joins player settings syncgroup
+func JoinSettingsSyncgroup(ch chan bool, settingsName string, u *uistate.UIState) {
+	fmt.Println("Joining user settings syncgroup")
+	app := u.Service.App(util.AppName)
+	db := app.NoSQLDatabase(util.DbName, nil)
+	settingsSg := db.Syncgroup(settingsName)
+	myInfoJoiner := wire.SyncgroupMemberInfo{8, false}
+	_, err := settingsSg.Join(u.Ctx, myInfoJoiner)
+	if err != nil {
+		fmt.Println("SYNCGROUP JOIN ERROR: ", err)
+		ch <- false
+	} else {
+		fmt.Println("Syncgroup joined")
+		ch <- true
+	}
+}
+
 func NumInSG(logName string, u *uistate.UIState) int {
 	app := u.Service.App(util.AppName)
 	db := app.NoSQLDatabase(util.DbName, nil)
diff --git a/go/src/hearts/syncbase/gamelog/logWriter.go b/go/src/hearts/syncbase/gamelog/logWriter.go
index 2cbeeb7..e1fae35 100644
--- a/go/src/hearts/syncbase/gamelog/logWriter.go
+++ b/go/src/hearts/syncbase/gamelog/logWriter.go
@@ -94,6 +94,11 @@
 	return logKeyValue(u.Service, u.Ctx, key, value)
 }
 
+func LogSettingsName(name string, u *uistate.UIState) bool {
+	key := strconv.Itoa(u.GameID) + "/players/" + strconv.Itoa(util.UserID) + "/settings_sg"
+	return logKeyValue(u.Service, u.Ctx, key, name)
+}
+
 // Note: The syntax replicates the way Croupier in Dart/Flutter writes keys.
 func getKey(playerId int, u *uistate.UIState) string {
 	t := int(time.Now().UnixNano() / 1000000)
diff --git a/go/src/hearts/syncbase/server/main.go b/go/src/hearts/syncbase/server/main.go
index 4c3a0f0..6291fd1 100644
--- a/go/src/hearts/syncbase/server/main.go
+++ b/go/src/hearts/syncbase/server/main.go
@@ -114,9 +114,9 @@
 	settingsTable.Put(u.Ctx, fmt.Sprintf("users/%d/settings", util.UserID), value)
 }
 
-// Creates a new set of gamelog and game settings syncgroups
-func CreateSyncgroups(ch chan string, u *uistate.UIState) {
-	fmt.Println("Creating Syncgroup")
+// Creates a new gamelog syncgroup
+func CreateLogSyncgroup(ch chan string, u *uistate.UIState) {
+	fmt.Println("Creating Log Syncgroup")
 	u.IsOwner = true
 	// Generate random gameID information to advertise this game
 	gameID := rand.Intn(1000000)
@@ -163,9 +163,25 @@
 		u.GameID = gameID
 		ch <- logSGName
 	}
-	// Create game settings syncgroup
+}
+
+// Creates a new user settings syncgroup
+func CreateSettingsSyncgroup(ch chan string, u *uistate.UIState) {
+	fmt.Println("Creating Settings Syncgroup")
+	allAccess := access.AccessList{In: []security.BlessingPattern{"..."}}
+	permissions := access.Permissions{
+		"Admin":   allAccess,
+		"Write":   allAccess,
+		"Read":    allAccess,
+		"Resolve": allAccess,
+		"Debug":   allAccess,
+	}
+	tables := []string{util.MountPoint + "/croupier"}
+	myInfoCreator := wire.SyncgroupMemberInfo{8, true}
+	app := u.Service.App(util.AppName)
+	db := app.NoSQLDatabase(util.DbName, nil)
 	settingsSGName := fmt.Sprintf("%s/croupier/%s/%%%%sync/discovery-%d", util.MountPoint, util.SBName, util.UserID)
-	settingsPref := wire.TableRow{util.SettingsName, ""}
+	settingsPref := wire.TableRow{util.SettingsName, fmt.Sprintf("users/%d", util.UserID)}
 	settingsPrefs := []wire.TableRow{settingsPref}
 	settingsSpec := wire.SyncgroupSpec{
 		Description: "croupier syncgroup",
@@ -175,7 +191,7 @@
 		IsPrivate:   false,
 	}
 	settingsSG := db.Syncgroup(settingsSGName)
-	err = settingsSG.Create(u.Ctx, settingsSpec, myInfoCreator)
+	err := settingsSG.Create(u.Ctx, settingsSpec, myInfoCreator)
 	if err != nil {
 		fmt.Println("SYNCGROUP CREATE ERROR: ", err)
 		ch <- ""
diff --git a/go/src/hearts/syncbase/util/util.go b/go/src/hearts/syncbase/util/util.go
index a24b8c8..202016f 100644
--- a/go/src/hearts/syncbase/util/util.go
+++ b/go/src/hearts/syncbase/util/util.go
@@ -8,12 +8,12 @@
 
 const (
 	// switch back to my mountpoint with the following code:
-	MountPoint = "users/emshack@google.com"
-	//MountPoint        = "/192.168.86.254:8101"
-	UserID            = 1223
+	//MountPoint = "users/emshack@google.com"
+	MountPoint        = "/192.168.86.254:8101"
+	UserID            = 123234234
 	UserColor         = 16777215
-	UserAvatar        = "player1.jpeg"
-	UserName          = "EmilyS"
+	UserAvatar        = "player0.jpeg"
+	UserName          = "Emily"
 	SBName            = "syncbase"
 	AppName           = "app"
 	DbName            = "db"
diff --git a/go/src/hearts/syncbase/watch/watch.go b/go/src/hearts/syncbase/watch/watch.go
index 2452590..e5bc8eb 100644
--- a/go/src/hearts/syncbase/watch/watch.go
+++ b/go/src/hearts/syncbase/watch/watch.go
@@ -45,7 +45,6 @@
 					fmt.Println("Unmarshal error:", err)
 				}
 				key := c.Row
-				fmt.Println(key, string(value))
 				userID, _ := strconv.Atoi(strings.Split(key, "/")[1])
 				u.UserData[userID] = valueMap
 			} else {
@@ -70,6 +69,7 @@
 					fmt.Println("Value error:", err)
 				}
 				valueStr := string(value)
+				fmt.Println(valueStr)
 				keyType := strings.Split(key, "/")[1]
 				switch keyType {
 				case "log":
@@ -87,7 +87,13 @@
 						onReady(valueStr, u)
 					}
 				case "players":
-					onPlayers(key, valueStr, u)
+					switch strings.Split(key, "/")[3] {
+					case "player_number":
+						onPlayerNum(key, valueStr, u)
+					case "settings_sg":
+						onSettings(key, valueStr, u)
+					}
+
 				}
 			} else {
 				fmt.Println("Unexpected ChangeType: ", c.ChangeType)
@@ -96,22 +102,21 @@
 	}
 }
 
-func onPlayers(key, value string, u *uistate.UIState) {
+func onPlayerNum(key, value string, u *uistate.UIState) {
 	userID, _ := strconv.Atoi(strings.Split(key, "/")[2])
 	playerNum, _ := strconv.Atoi(value)
 	u.PlayerData[playerNum] = userID
-	// user := u.UserData[userID]
-	// if user != nil {
-	// 	img := u.Texs[user["avatar"].(string)]
-	// 	name := user["name"].(string)
-	// 	u.CurTable.GetPlayers()[playerNum].SetIconImage(img)
-	// 	u.CurTable.GetPlayers()[playerNum].SetName(name)
-	// }
-	if u.CurView == uistate.Arrange {
+	if u.CurView == uistate.Arrange && !u.CurTable.AllReadyForNewRound() {
 		view.LoadArrangeView(u)
 	}
 }
 
+func onSettings(key, value string, u *uistate.UIState) {
+	joinDone := make(chan bool)
+	go client.JoinSettingsSyncgroup(joinDone, value, u)
+	<-joinDone
+}
+
 func onDeal(value string, u *uistate.UIState) {
 	playerInt, curCards := parsePlayerAndCards(value, u)
 	u.CurTable.GetPlayers()[playerInt].SetHand(curCards)
diff --git a/go/src/hearts/touchhandler/touchhandler.go b/go/src/hearts/touchhandler/touchhandler.go
index d7e545a..ac92827 100644
--- a/go/src/hearts/touchhandler/touchhandler.go
+++ b/go/src/hearts/touchhandler/touchhandler.go
@@ -106,12 +106,15 @@
 	buttonList := findClickedButton(t, u)
 	if len(buttonList) > 0 {
 		if buttonList[0] == u.Buttons[0] {
-			ch := make(chan string)
-			go server.CreateSyncgroups(ch, u)
-			gameStartData := <-ch
-			logName := <-ch
-			settingsName := <-ch
+			logCh := make(chan string)
+			settingsCh := make(chan string)
+			go server.CreateLogSyncgroup(logCh, u)
+			go server.CreateSettingsSyncgroup(settingsCh, u)
+			gameStartData := <-logCh
+			logName := <-logCh
+			settingsName := <-settingsCh
 			if logName != "" && settingsName != "" {
+				gamelog.LogSettingsName(settingsName, u)
 				u.ScanChan <- true
 				u.ScanChan = nil
 				u.SGChan = make(chan bool)
@@ -121,11 +124,20 @@
 		} else {
 			for _, b := range u.Buttons {
 				if buttonList[0] == b {
-					joinDone := make(chan bool)
+					joinLogDone := make(chan bool)
+					joinSettingsDone := make(chan bool)
 					settingsAddr := b.GetInfo()[0]
 					logAddr := b.GetInfo()[1]
-					go client.JoinSyncgroups(joinDone, logAddr, settingsAddr, u)
-					if success := <-joinDone; success {
+					go client.JoinLogSyncgroup(joinLogDone, logAddr, u)
+					go client.JoinSettingsSyncgroup(joinSettingsDone, settingsAddr, u)
+					<-joinSettingsDone
+					if success := <-joinLogDone; success {
+						settingsCh := make(chan string)
+						go server.CreateSettingsSyncgroup(settingsCh, u)
+						sgName := <-settingsCh
+						if sgName != "" {
+							gamelog.LogSettingsName(sgName, u)
+						}
 						u.ScanChan <- true
 						u.ScanChan = nil
 						view.LoadArrangeView(u)
@@ -150,7 +162,9 @@
 			gamelog.LogReady(u)
 		}
 		gamelog.LogPlayerNum(u)
-		view.LoadWaitingView(u)
+		if !u.CurTable.AllReadyForNewRound() {
+			view.LoadWaitingView(u)
+		}
 	}
 }