diff --git a/public/main.js b/public/main.js
index 01d057804784f7ff3603cfaa4db705b4edc401fc..46dae53e0e46a9d5256d0d9e29836699017d2a1c 100644
--- a/public/main.js
+++ b/public/main.js
@@ -5159,7 +5159,19 @@ var $elm$core$Task$perform = F2(
 				A2($elm$core$Task$map, toMessage, task)));
 	});
 var $elm$browser$Browser$document = _Browser_document;
-var $author$project$Creation$new = {freebie: 15, spheres: 6};
+var $author$project$Stats$Mental = {$: 'Mental'};
+var $author$project$Stats$Physical = {$: 'Physical'};
+var $author$project$Stats$Social = {$: 'Social'};
+var $author$project$Creation$new = {
+	attributes: {
+		primary: 7,
+		priority: _Utils_Tuple3($author$project$Stats$Physical, $author$project$Stats$Social, $author$project$Stats$Mental),
+		secondary: 5,
+		tertiary: 3
+	},
+	freebie: 15,
+	spheres: 6
+};
 var $author$project$Stats$Arete = {$: 'Arete'};
 var $author$project$BoundedInt$new = F3(
 	function (value, min, max) {
@@ -5170,6 +5182,17 @@ var $author$project$Stats$newArete = {
 	name: 'Arete',
 	statType: $author$project$Stats$Arete
 };
+var $author$project$Stats$Attribute = function (a) {
+	return {$: 'Attribute', a: a};
+};
+var $author$project$Stats$newAttribute = F2(
+	function (category, name) {
+		return {
+			dots: A3($author$project$BoundedInt$new, 1, 1, 5),
+			name: name,
+			statType: $author$project$Stats$Attribute(category)
+		};
+	});
 var $author$project$Stats$Sphere = {$: 'Sphere'};
 var $author$project$Stats$newSphere = function (name) {
 	return {
@@ -5189,7 +5212,16 @@ var $author$project$Stats$new = _List_fromArray(
 		$author$project$Stats$newSphere('Prime'),
 		$author$project$Stats$newSphere('Spirit'),
 		$author$project$Stats$newSphere('Time'),
-		$author$project$Stats$newArete
+		$author$project$Stats$newArete,
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Physical, 'Strength'),
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Physical, 'Dexterity'),
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Physical, 'Stamina'),
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Social, 'Charisma'),
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Social, 'Manipulation'),
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Social, 'Appearance'),
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Mental, 'Perception'),
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Mental, 'Intelligence'),
+		A2($author$project$Stats$newAttribute, $author$project$Stats$Mental, 'Wits')
 	]);
 var $author$project$Character$new = {creationPoints: $author$project$Creation$new, name: 'Default Name', stats: $author$project$Stats$new};
 var $elm$core$Platform$Cmd$batch = _Platform_batch;
@@ -5305,35 +5337,38 @@ var $author$project$Stats$spheresInList = function (stats) {
 var $author$project$Character$changeStat = F2(
 	function (character, stat) {
 		var _v0 = stat.statType;
-		if (_v0.$ === 'Sphere') {
-			var spheres = $author$project$Stats$spheresInList(character.stats);
-			var maybeOldDots = A2($author$project$Stats$dotsOfStatInList, spheres, stat.name);
-			var arete = $author$project$Stats$areteInList(character.stats);
-			var difference = function () {
+		switch (_v0.$) {
+			case 'Arete':
+				return character;
+			case 'Sphere':
+				var spheres = $author$project$Stats$spheresInList(character.stats);
+				var maybeOldDots = A2($author$project$Stats$dotsOfStatInList, spheres, stat.name);
+				var arete = $author$project$Stats$areteInList(character.stats);
+				var difference = function () {
+					if (maybeOldDots.$ === 'Nothing') {
+						return 0;
+					} else {
+						var oldDots = maybeOldDots.a;
+						return (_Utils_cmp(stat.dots.value, arete.dots.value) > 0) ? (arete.dots.value - oldDots.value) : (stat.dots.value - oldDots.value);
+					}
+				}();
 				if (maybeOldDots.$ === 'Nothing') {
-					return 0;
+					return character;
 				} else {
 					var oldDots = maybeOldDots.a;
-					return (_Utils_cmp(stat.dots.value, arete.dots.value) > 0) ? (arete.dots.value - oldDots.value) : (stat.dots.value - oldDots.value);
+					var buyAmount = A2($elm$core$Basics$min, difference, character.creationPoints.spheres);
+					return _Utils_update(
+						character,
+						{
+							creationPoints: A2($author$project$Creation$buySphere, character.creationPoints, buyAmount),
+							stats: A2(
+								$author$project$Stats$changeStatInList,
+								character.stats,
+								A2($author$project$Stats$changeDotsTo, stat, oldDots.value + buyAmount))
+						});
 				}
-			}();
-			if (maybeOldDots.$ === 'Nothing') {
+			default:
 				return character;
-			} else {
-				var oldDots = maybeOldDots.a;
-				var buyAmount = A2($elm$core$Basics$min, difference, character.creationPoints.spheres);
-				return _Utils_update(
-					character,
-					{
-						creationPoints: A2($author$project$Creation$buySphere, character.creationPoints, buyAmount),
-						stats: A2(
-							$author$project$Stats$changeStatInList,
-							character.stats,
-							A2($author$project$Stats$changeDotsTo, stat, oldDots.value + buyAmount))
-					});
-			}
-		} else {
-			return character;
 		}
 	});
 var $author$project$Main$modalValue = F2(
@@ -5388,22 +5423,99 @@ var $author$project$Main$update = F2(
 		}
 	});
 var $author$project$Main$Name = {$: 'Name'};
+var $author$project$Stats$isAttribute = function (stat) {
+	var _v0 = stat.statType;
+	if (_v0.$ === 'Attribute') {
+		return true;
+	} else {
+		return false;
+	}
+};
+var $author$project$Stats$attributesInList = function (stats) {
+	return A2($elm$core$List$filter, $author$project$Stats$isAttribute, stats);
+};
 var $elm$html$Html$div = _VirtualDom_node('div');
 var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text;
 var $elm$html$Html$text = $elm$virtual_dom$VirtualDom$text;
-var $author$project$Main$OpenModal = function (a) {
-	return {$: 'OpenModal', a: a};
-};
-var $elm$json$Json$Encode$string = _Json_wrap;
-var $elm$html$Html$Attributes$stringProperty = F2(
-	function (key, string) {
+var $author$project$Stats$isAttributeOfCategory = F2(
+	function (category, stat) {
+		return _Utils_eq(
+			stat.statType,
+			$author$project$Stats$Attribute(category));
+	});
+var $author$project$Stats$attributesOfCategoryInList = F2(
+	function (category, stats) {
 		return A2(
-			_VirtualDom_property,
-			key,
-			$elm$json$Json$Encode$string(string));
+			$elm$core$List$filter,
+			$author$project$Stats$isAttributeOfCategory(category),
+			stats);
+	});
+var $elm$html$Html$span = _VirtualDom_node('span');
+var $elm$core$String$fromFloat = _String_fromNumber;
+var $elm$svg$Svg$Attributes$height = _VirtualDom_attribute('height');
+var $elm$core$List$map3 = _List_map3;
+var $elm$core$Basics$pow = _Basics_pow;
+var $elm$core$Basics$sqrt = _Basics_sqrt;
+var $elm$svg$Svg$trustedNode = _VirtualDom_nodeNS('http://www.w3.org/2000/svg');
+var $elm$svg$Svg$svg = $elm$svg$Svg$trustedNode('svg');
+var $author$project$Main$toDotPosition = F4(
+	function (size, gap, offset, id) {
+		var marginalIncrease = (size + gap) / 2;
+		return _Utils_Tuple2((id * marginalIncrease) + offset, (((id + 1) % 2) * marginalIncrease) + offset);
+	});
+var $author$project$Main$ChangeStat = function (a) {
+	return {$: 'ChangeStat', a: a};
+};
+var $author$project$Main$boolAsIntString = function (bool) {
+	return bool ? '1' : '0';
+};
+var $elm$core$String$concat = function (strings) {
+	return A2($elm$core$String$join, '', strings);
+};
+var $elm$svg$Svg$Attributes$fill = _VirtualDom_attribute('fill');
+var $elm$svg$Svg$Attributes$fillOpacity = _VirtualDom_attribute('fill-opacity');
+var $elm$core$List$intersperse = F2(
+	function (sep, xs) {
+		if (!xs.b) {
+			return _List_Nil;
+		} else {
+			var hd = xs.a;
+			var tl = xs.b;
+			var step = F2(
+				function (x, rest) {
+					return A2(
+						$elm$core$List$cons,
+						sep,
+						A2($elm$core$List$cons, x, rest));
+				});
+			var spersed = A3($elm$core$List$foldr, step, _List_Nil, tl);
+			return A2($elm$core$List$cons, hd, spersed);
+		}
+	});
+var $elm$core$Tuple$mapBoth = F3(
+	function (funcA, funcB, _v0) {
+		var x = _v0.a;
+		var y = _v0.b;
+		return _Utils_Tuple2(
+			funcA(x),
+			funcB(y));
+	});
+var $elm$core$Tuple$mapFirst = F2(
+	function (func, _v0) {
+		var x = _v0.a;
+		var y = _v0.b;
+		return _Utils_Tuple2(
+			func(x),
+			y);
+	});
+var $elm$core$Tuple$mapSecond = F2(
+	function (func, _v0) {
+		var x = _v0.a;
+		var y = _v0.b;
+		return _Utils_Tuple2(
+			x,
+			func(y));
 	});
-var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className');
-var $elm$html$Html$i = _VirtualDom_node('i');
 var $elm$virtual_dom$VirtualDom$Normal = function (a) {
 	return {$: 'Normal', a: a};
 };
@@ -5421,7 +5533,167 @@ var $elm$html$Html$Events$onClick = function (msg) {
 		'click',
 		$elm$json$Json$Decode$succeed(msg));
 };
-var $elm$html$Html$span = _VirtualDom_node('span');
+var $elm$svg$Svg$Attributes$points = _VirtualDom_attribute('points');
+var $elm$svg$Svg$polygon = $elm$svg$Svg$trustedNode('polygon');
+var $elm$core$Tuple$second = function (_v0) {
+	var y = _v0.b;
+	return y;
+};
+var $elm$svg$Svg$Attributes$stroke = _VirtualDom_attribute('stroke');
+var $elm$svg$Svg$Attributes$strokeWidth = _VirtualDom_attribute('stroke-width');
+var $author$project$Main$tupleToString = function (tuple) {
+	var second = $elm$core$String$fromFloat(tuple.b);
+	var first = $elm$core$String$fromFloat(tuple.a);
+	return first + (',' + second);
+};
+var $author$project$Main$valueOrReset = F2(
+	function (dots, value) {
+		return _Utils_eq(dots.value, value) ? dots.min : value;
+	});
+var $author$project$Main$viewDot = F6(
+	function (stat, size, strokeWidth, isFilled, id, position) {
+		return A2(
+			$elm$svg$Svg$polygon,
+			_List_fromArray(
+				[
+					$elm$svg$Svg$Attributes$points(
+					$elm$core$String$concat(
+						A2(
+							$elm$core$List$intersperse,
+							' ',
+							A2(
+								$elm$core$List$map,
+								$author$project$Main$tupleToString,
+								A2(
+									$elm$core$List$map,
+									$elm$core$Tuple$mapSecond(
+										$elm$core$Basics$add(position.b)),
+									A2(
+										$elm$core$List$map,
+										$elm$core$Tuple$mapFirst(
+											$elm$core$Basics$add(position.a)),
+										A2(
+											$elm$core$List$map,
+											A2(
+												$elm$core$Tuple$mapBoth,
+												$elm$core$Basics$mul(size),
+												$elm$core$Basics$mul(size)),
+											_List_fromArray(
+												[
+													_Utils_Tuple2(0.5, 0.0),
+													_Utils_Tuple2(1.0, 0.5),
+													_Utils_Tuple2(0.5, 1.0),
+													_Utils_Tuple2(0.0, 0.5)
+												])))))))),
+					$elm$svg$Svg$Attributes$fill('var(--bulma-body-color)'),
+					$elm$svg$Svg$Attributes$fillOpacity(
+					$author$project$Main$boolAsIntString(isFilled)),
+					$elm$svg$Svg$Attributes$stroke('var(--bulma-body-color)'),
+					$elm$svg$Svg$Attributes$strokeWidth(
+					$elm$core$String$fromFloat(strokeWidth)),
+					$elm$html$Html$Events$onClick(
+					$author$project$Main$ChangeStat(
+						_Utils_update(
+							stat,
+							{
+								dots: A2(
+									$author$project$BoundedInt$changeTo,
+									stat.dots,
+									A2($author$project$Main$valueOrReset, stat.dots, id + 1))
+							})))
+				]),
+			_List_Nil);
+	});
+var $elm$svg$Svg$Attributes$width = _VirtualDom_attribute('width');
+var $author$project$Main$viewDots = function (stat) {
+	var rangeList = A2($elm$core$List$range, 0, stat.dots.max - 1);
+	var isFilledList = A2(
+		$elm$core$List$map,
+		$elm$core$Basics$gt(stat.dots.value),
+		rangeList);
+	var dotSize = 12;
+	var dotOutline = 0.05 * dotSize;
+	var svgOutlineMargin = $elm$core$Basics$sqrt(
+		2 * A2($elm$core$Basics$pow, dotOutline, 2)) / 2;
+	var dotGap = 4;
+	var marginalIncrease = (dotSize + dotGap) / 2;
+	return A2(
+		$elm$svg$Svg$svg,
+		_List_fromArray(
+			[
+				$elm$svg$Svg$Attributes$width(
+				$elm$core$String$fromFloat((dotSize + (marginalIncrease * (stat.dots.max - 1))) + (2 * svgOutlineMargin))),
+				$elm$svg$Svg$Attributes$height(
+				$elm$core$String$fromFloat((dotSize + marginalIncrease) + (2 * svgOutlineMargin)))
+			]),
+		A4(
+			$elm$core$List$map3,
+			A3($author$project$Main$viewDot, stat, dotSize, dotOutline),
+			isFilledList,
+			rangeList,
+			A2(
+				$elm$core$List$map,
+				A3($author$project$Main$toDotPosition, dotSize, dotGap, svgOutlineMargin),
+				rangeList)));
+};
+var $author$project$Main$viewStat = function (stat) {
+	return A2(
+		$elm$html$Html$div,
+		_List_Nil,
+		_List_fromArray(
+			[
+				A2(
+				$elm$html$Html$span,
+				_List_Nil,
+				_List_fromArray(
+					[
+						$elm$html$Html$text(stat.name)
+					])),
+				A2(
+				$elm$html$Html$span,
+				_List_Nil,
+				_List_fromArray(
+					[
+						$author$project$Main$viewDots(stat)
+					]))
+			]));
+};
+var $author$project$Main$viewStats = function (stats) {
+	return A2(
+		$elm$html$Html$div,
+		_List_Nil,
+		A2($elm$core$List$map, $author$project$Main$viewStat, stats));
+};
+var $author$project$Main$viewAttributes = function (stats) {
+	return A2(
+		$elm$html$Html$div,
+		_List_Nil,
+		_List_fromArray(
+			[
+				$elm$html$Html$text('Physical'),
+				$author$project$Main$viewStats(
+				A2($author$project$Stats$attributesOfCategoryInList, $author$project$Stats$Physical, stats)),
+				$elm$html$Html$text('Social'),
+				$author$project$Main$viewStats(
+				A2($author$project$Stats$attributesOfCategoryInList, $author$project$Stats$Social, stats)),
+				$elm$html$Html$text('Mental'),
+				$author$project$Main$viewStats(
+				A2($author$project$Stats$attributesOfCategoryInList, $author$project$Stats$Mental, stats))
+			]));
+};
+var $author$project$Main$OpenModal = function (a) {
+	return {$: 'OpenModal', a: a};
+};
+var $elm$json$Json$Encode$string = _Json_wrap;
+var $elm$html$Html$Attributes$stringProperty = F2(
+	function (key, string) {
+		return A2(
+			_VirtualDom_property,
+			key,
+			$elm$json$Json$Encode$string(string));
+	});
+var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className');
+var $elm$html$Html$i = _VirtualDom_node('i');
 var $author$project$Main$viewEditableText = F2(
 	function (modalType, content) {
 		return A2(
@@ -5648,207 +5920,13 @@ var $author$project$Main$viewModal = function (model) {
 				]));
 	}
 };
-var $elm$core$String$fromFloat = _String_fromNumber;
-var $elm$svg$Svg$Attributes$height = _VirtualDom_attribute('height');
-var $elm$core$List$map3 = _List_map3;
-var $elm$core$Basics$pow = _Basics_pow;
-var $elm$core$Basics$sqrt = _Basics_sqrt;
-var $elm$svg$Svg$trustedNode = _VirtualDom_nodeNS('http://www.w3.org/2000/svg');
-var $elm$svg$Svg$svg = $elm$svg$Svg$trustedNode('svg');
-var $author$project$Main$toDotPosition = F4(
-	function (size, gap, offset, id) {
-		var marginalIncrease = (size + gap) / 2;
-		return _Utils_Tuple2((id * marginalIncrease) + offset, (((id + 1) % 2) * marginalIncrease) + offset);
-	});
-var $author$project$Main$ChangeStat = function (a) {
-	return {$: 'ChangeStat', a: a};
-};
-var $author$project$Main$boolAsIntString = function (bool) {
-	return bool ? '1' : '0';
-};
-var $elm$core$String$concat = function (strings) {
-	return A2($elm$core$String$join, '', strings);
-};
-var $elm$svg$Svg$Attributes$fill = _VirtualDom_attribute('fill');
-var $elm$svg$Svg$Attributes$fillOpacity = _VirtualDom_attribute('fill-opacity');
-var $elm$core$List$intersperse = F2(
-	function (sep, xs) {
-		if (!xs.b) {
-			return _List_Nil;
-		} else {
-			var hd = xs.a;
-			var tl = xs.b;
-			var step = F2(
-				function (x, rest) {
-					return A2(
-						$elm$core$List$cons,
-						sep,
-						A2($elm$core$List$cons, x, rest));
-				});
-			var spersed = A3($elm$core$List$foldr, step, _List_Nil, tl);
-			return A2($elm$core$List$cons, hd, spersed);
-		}
-	});
-var $elm$core$Tuple$mapBoth = F3(
-	function (funcA, funcB, _v0) {
-		var x = _v0.a;
-		var y = _v0.b;
-		return _Utils_Tuple2(
-			funcA(x),
-			funcB(y));
-	});
-var $elm$core$Tuple$mapFirst = F2(
-	function (func, _v0) {
-		var x = _v0.a;
-		var y = _v0.b;
-		return _Utils_Tuple2(
-			func(x),
-			y);
-	});
-var $elm$core$Tuple$mapSecond = F2(
-	function (func, _v0) {
-		var x = _v0.a;
-		var y = _v0.b;
-		return _Utils_Tuple2(
-			x,
-			func(y));
-	});
-var $elm$svg$Svg$Attributes$points = _VirtualDom_attribute('points');
-var $elm$svg$Svg$polygon = $elm$svg$Svg$trustedNode('polygon');
-var $elm$core$Tuple$second = function (_v0) {
-	var y = _v0.b;
-	return y;
-};
-var $elm$svg$Svg$Attributes$stroke = _VirtualDom_attribute('stroke');
-var $elm$svg$Svg$Attributes$strokeWidth = _VirtualDom_attribute('stroke-width');
-var $author$project$Main$tupleToString = function (tuple) {
-	var second = $elm$core$String$fromFloat(tuple.b);
-	var first = $elm$core$String$fromFloat(tuple.a);
-	return first + (',' + second);
-};
-var $author$project$Main$valueOrReset = F2(
-	function (dots, value) {
-		return _Utils_eq(dots.value, value) ? dots.min : value;
-	});
-var $author$project$Main$viewDot = F6(
-	function (stat, size, strokeWidth, isFilled, id, position) {
-		return A2(
-			$elm$svg$Svg$polygon,
-			_List_fromArray(
-				[
-					$elm$svg$Svg$Attributes$points(
-					$elm$core$String$concat(
-						A2(
-							$elm$core$List$intersperse,
-							' ',
-							A2(
-								$elm$core$List$map,
-								$author$project$Main$tupleToString,
-								A2(
-									$elm$core$List$map,
-									$elm$core$Tuple$mapSecond(
-										$elm$core$Basics$add(position.b)),
-									A2(
-										$elm$core$List$map,
-										$elm$core$Tuple$mapFirst(
-											$elm$core$Basics$add(position.a)),
-										A2(
-											$elm$core$List$map,
-											A2(
-												$elm$core$Tuple$mapBoth,
-												$elm$core$Basics$mul(size),
-												$elm$core$Basics$mul(size)),
-											_List_fromArray(
-												[
-													_Utils_Tuple2(0.5, 0.0),
-													_Utils_Tuple2(1.0, 0.5),
-													_Utils_Tuple2(0.5, 1.0),
-													_Utils_Tuple2(0.0, 0.5)
-												])))))))),
-					$elm$svg$Svg$Attributes$fill('var(--bulma-body-color)'),
-					$elm$svg$Svg$Attributes$fillOpacity(
-					$author$project$Main$boolAsIntString(isFilled)),
-					$elm$svg$Svg$Attributes$stroke('var(--bulma-body-color)'),
-					$elm$svg$Svg$Attributes$strokeWidth(
-					$elm$core$String$fromFloat(strokeWidth)),
-					$elm$html$Html$Events$onClick(
-					$author$project$Main$ChangeStat(
-						_Utils_update(
-							stat,
-							{
-								dots: A2(
-									$author$project$BoundedInt$changeTo,
-									stat.dots,
-									A2($author$project$Main$valueOrReset, stat.dots, id + 1))
-							})))
-				]),
-			_List_Nil);
-	});
-var $elm$svg$Svg$Attributes$width = _VirtualDom_attribute('width');
-var $author$project$Main$viewDots = function (stat) {
-	var rangeList = A2($elm$core$List$range, 0, stat.dots.max - 1);
-	var isFilledList = A2(
-		$elm$core$List$map,
-		$elm$core$Basics$gt(stat.dots.value),
-		rangeList);
-	var dotSize = 12;
-	var dotOutline = 0.05 * dotSize;
-	var svgOutlineMargin = $elm$core$Basics$sqrt(
-		2 * A2($elm$core$Basics$pow, dotOutline, 2)) / 2;
-	var dotGap = 4;
-	var marginalIncrease = (dotSize + dotGap) / 2;
-	return A2(
-		$elm$svg$Svg$svg,
-		_List_fromArray(
-			[
-				$elm$svg$Svg$Attributes$width(
-				$elm$core$String$fromFloat((dotSize + (marginalIncrease * (stat.dots.max - 1))) + (2 * svgOutlineMargin))),
-				$elm$svg$Svg$Attributes$height(
-				$elm$core$String$fromFloat((dotSize + marginalIncrease) + (2 * svgOutlineMargin)))
-			]),
-		A4(
-			$elm$core$List$map3,
-			A3($author$project$Main$viewDot, stat, dotSize, dotOutline),
-			isFilledList,
-			rangeList,
-			A2(
-				$elm$core$List$map,
-				A3($author$project$Main$toDotPosition, dotSize, dotGap, svgOutlineMargin),
-				rangeList)));
-};
-var $author$project$Main$viewStat = function (stat) {
-	return A2(
-		$elm$html$Html$div,
-		_List_Nil,
-		_List_fromArray(
-			[
-				A2(
-				$elm$html$Html$span,
-				_List_Nil,
-				_List_fromArray(
-					[
-						$elm$html$Html$text(stat.name)
-					])),
-				A2(
-				$elm$html$Html$span,
-				_List_Nil,
-				_List_fromArray(
-					[
-						$author$project$Main$viewDots(stat)
-					]))
-			]));
-};
-var $author$project$Main$viewStats = function (stats) {
-	return A2(
-		$elm$html$Html$div,
-		_List_Nil,
-		A2($elm$core$List$map, $author$project$Main$viewStat, stats));
-};
 var $author$project$Main$view = function (model) {
 	return {
 		body: _List_fromArray(
 			[
 				A2($author$project$Main$viewEditableText, $author$project$Main$Name, model.character.name),
+				$author$project$Main$viewAttributes(
+				$author$project$Stats$attributesInList(model.character.stats)),
 				$author$project$Main$viewStats(
 				$author$project$Stats$spheresInList(model.character.stats)),
 				$author$project$Main$viewStat(
diff --git a/src/Character.elm b/src/Character.elm
index ff02f240e95b996a4dadb33087c6380e7e472d84..ec80334ea843726e3c4fa2c6af066a83241a248e 100644
--- a/src/Character.elm
+++ b/src/Character.elm
@@ -27,6 +27,7 @@ changeName character newName =
 changeStat : Character -> Stat -> Character
 changeStat character stat =
     case stat.statType of
+        Stats.Arete -> character
         Stats.Sphere ->
             let
                 spheres = Stats.spheresInList character.stats
@@ -50,4 +51,5 @@ changeStat character stat =
                             | creationPoints = Creation.buySphere character.creationPoints buyAmount
                             , stats = Stats.changeStatInList character.stats ( Stats.changeDotsTo stat ( oldDots.value + buyAmount ) )
                             }
-        Stats.Arete -> character
\ No newline at end of file
+        Stats.Attribute _ -> 
+            character
\ No newline at end of file
diff --git a/src/Creation.elm b/src/Creation.elm
index 242ba6ad446c1771a5348ea477b9356238a6edc0..796e009d50d04711ce2c4a8167a61c03d3bf46fe 100644
--- a/src/Creation.elm
+++ b/src/Creation.elm
@@ -1,14 +1,36 @@
 module Creation exposing (..)
 
+import Stats exposing (AttributeCategory)
+
 type alias CreationPoints =
     { freebie : Int
     , spheres : Int
+    , attributes :
+        { primary : Int
+        , secondary : Int
+        , tertiary : Int
+        , priority : 
+            ( AttributeCategory
+            , AttributeCategory
+            , AttributeCategory
+            )
+        }
     }
 
 new : CreationPoints 
 new =
     { freebie = 15
     , spheres = 6
+    , attributes =
+        { primary = 7
+        , secondary = 5
+        , tertiary = 3
+        , priority =
+            ( Stats.Physical
+            , Stats.Social
+            , Stats.Mental
+            )
+        }
     }
 
 cost :
diff --git a/src/Main.elm b/src/Main.elm
index e2addf73390f1b6128117a64a5f4acec851b6ceb..a9019745612a443a5426f2e66318cbfa2d8d5a85 100644
--- a/src/Main.elm
+++ b/src/Main.elm
@@ -83,6 +83,7 @@ view model =
     { title = "Character Sheet"
     , body = 
         [ viewEditableText Name model.character.name
+        , viewAttributes ( Stats.attributesInList model.character.stats )
         , viewStats ( Stats.spheresInList model.character.stats )
         , viewStat  ( Stats.areteInList model.character.stats )
         , viewModal model
@@ -107,6 +108,17 @@ viewEditableText modalType content =
             ]
         ]
 
+viewAttributes : List Stat -> Html Msg
+viewAttributes stats =
+    div [] 
+        [ text "Physical"
+        , viewStats ( Stats.attributesOfCategoryInList Stats.Physical stats )
+        , text "Social"
+        , viewStats ( Stats.attributesOfCategoryInList Stats.Social stats )
+        , text "Mental"
+        , viewStats ( Stats.attributesOfCategoryInList Stats.Mental stats )
+        ]
+
 viewStats : List Stat -> Html Msg
 viewStats stats =
     div [] ( List.map viewStat stats )
diff --git a/src/Stats.elm b/src/Stats.elm
index e6dafb40415220ad7984d57cb3efac0a302646c1..bd392f327474a074eb2a017ac14840012a073ef4 100644
--- a/src/Stats.elm
+++ b/src/Stats.elm
@@ -11,6 +11,12 @@ type alias Stat =
 type StatType
     = Sphere
     | Arete
+    | Attribute AttributeCategory
+
+type AttributeCategory
+    = Physical
+    | Social
+    | Mental
 
 new : List Stat
 new =
@@ -24,6 +30,15 @@ new =
     , newSphere "Spirit"
     , newSphere "Time"
     , newArete
+    , newAttribute Physical "Strength"
+    , newAttribute Physical "Dexterity"
+    , newAttribute Physical "Stamina"
+    , newAttribute Social "Charisma"
+    , newAttribute Social "Manipulation"
+    , newAttribute Social "Appearance"
+    , newAttribute Mental "Perception"
+    , newAttribute Mental "Intelligence"
+    , newAttribute Mental "Wits"
     ]
 
 newSphere : String -> Stat
@@ -40,6 +55,13 @@ newArete =
     , statType = Arete
     }
 
+newAttribute : AttributeCategory -> String -> Stat
+newAttribute category name =
+    { name = name
+    , dots = BoundedInt.new 1 1 5
+    , statType = Attribute category
+    }
+
 spheresInList : List Stat -> List Stat
 spheresInList stats =
     List.filter isSphere stats
@@ -61,6 +83,24 @@ isArete : Stat -> Bool
 isArete stat =
     stat.statType == Arete
 
+attributesInList : List Stat -> List Stat
+attributesInList stats =
+    List.filter isAttribute stats
+
+isAttribute : Stat -> Bool
+isAttribute stat =
+    case stat.statType of
+        Attribute _ -> True
+        _ -> False
+
+attributesOfCategoryInList : AttributeCategory -> List Stat -> List Stat
+attributesOfCategoryInList category stats =
+    List.filter ( isAttributeOfCategory category ) stats
+
+isAttributeOfCategory : AttributeCategory -> Stat -> Bool
+isAttributeOfCategory category stat =
+    stat.statType == Attribute category
+
 dotsOfStatInList : List Stat -> String -> Maybe BoundedInt
 dotsOfStatInList stats name =
     let