diff --git a/native/components/color-selector-button.react.js b/native/components/color-selector-button.react.js
--- a/native/components/color-selector-button.react.js
+++ b/native/components/color-selector-button.react.js
@@ -4,22 +4,31 @@
 import { StyleSheet, TouchableOpacity, View } from 'react-native';
 import tinycolor from 'tinycolor2';
 
+import type { SetState } from 'lib/types/hook-types';
+
 type ColorSelectorButtonProps = {
   +color: string,
-  +currentColor: string,
+  +pendingColor: string,
+  +setPendingColor: SetState<string>,
 };
-
 function ColorSelectorButton(props: ColorSelectorButtonProps): React.Node {
-  const { color, currentColor } = props;
+  const { color, pendingColor, setPendingColor } = props;
 
   const colorSplotchStyle = React.useMemo(() => {
     return [styles.button, { backgroundColor: `#${color}` }];
   }, [color]);
 
-  const isSelected = tinycolor.equals(currentColor, color);
+  const onPendingColorSelected = React.useCallback(() => {
+    setPendingColor(color);
+  }, [setPendingColor, color]);
+
+  const isSelected = tinycolor.equals(pendingColor, color);
   return (
     <View style={isSelected ? styles.outerRingSelected : styles.outerRing}>
-      <TouchableOpacity style={colorSplotchStyle} />
+      <TouchableOpacity
+        style={colorSplotchStyle}
+        onPress={onPendingColorSelected}
+      />
     </View>
   );
 }
diff --git a/native/components/color-selector.react.js b/native/components/color-selector.react.js
--- a/native/components/color-selector.react.js
+++ b/native/components/color-selector.react.js
@@ -1,7 +1,8 @@
 // @flow
 
 import * as React from 'react';
-import { Text, View, StyleSheet } from 'react-native';
+import { Button, Text, View, StyleSheet } from 'react-native';
+import tinycolor from 'tinycolor2';
 
 import { selectedThreadColors } from 'lib/shared/thread-utils';
 
@@ -9,10 +10,11 @@
 
 type ColorSelectorProps = {
   +currentColor: string,
+  +onColorSelected: (hex: string) => void,
 };
-
 function ColorSelector(props: ColorSelectorProps): React.Node {
-  const { currentColor } = props;
+  const { currentColor, onColorSelected } = props;
+  const [pendingColor, setPendingColor] = React.useState(currentColor);
 
   const colorSelectorButtons = React.useMemo(
     () =>
@@ -20,26 +22,44 @@
         <ColorSelectorButton
           key={color}
           color={color}
-          currentColor={currentColor}
+          pendingColor={pendingColor}
+          setPendingColor={setPendingColor}
         />
       )),
-    [currentColor],
+    [pendingColor],
+  );
+
+  const saveButtonDisabled = tinycolor.equals(currentColor, pendingColor);
+  const saveButtonStyle = React.useMemo(
+    () => [
+      styles.saveButton,
+      { backgroundColor: saveButtonDisabled ? '#404040' : `#${pendingColor}` },
+    ],
+    [saveButtonDisabled, pendingColor],
   );
 
+  const onColorSplotchSaved = React.useCallback(() => {
+    onColorSelected(`#${pendingColor}`);
+  }, [onColorSelected, pendingColor]);
+
   return (
     <View style={styles.container}>
-      <View style={styles.textContainer}>
-        <Text style={styles.text}>Select thread color</Text>
-      </View>
+      <Text style={styles.header}>Select thread color</Text>
       <View style={styles.colorButtons}>{colorSelectorButtons}</View>
+      <View style={saveButtonStyle}>
+        <Button
+          title="Save"
+          color="white"
+          onPress={onColorSplotchSaved}
+          disabled={saveButtonDisabled}
+        />
+      </View>
     </View>
   );
 }
 
 const styles = StyleSheet.create({
   colorButtons: {
-    alignItems: 'center',
-    display: 'flex',
     flex: 1,
     flexDirection: 'row',
     flexWrap: 'wrap',
@@ -47,20 +67,21 @@
   },
   container: {
     alignItems: 'center',
-    display: 'flex',
     flex: 1,
-    flexDirection: 'column',
-    flexWrap: 'wrap',
     justifyContent: 'center',
   },
-  text: {
+  header: {
     color: 'white',
     fontSize: 24,
     fontWeight: 'bold',
-  },
-  textContainer: {
     margin: 20,
   },
+  saveButton: {
+    borderRadius: 5,
+    margin: 10,
+    padding: 5,
+    width: 320,
+  },
 });
 
 export default ColorSelector;