diff --git a/assets/kenny/arrowBeige_left.png b/assets/kenny/arrowBeige_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d2fdaae0a322aa0b01767f6838018fbe99f031b
Binary files /dev/null and b/assets/kenny/arrowBeige_left.png differ
diff --git a/assets/kenny/arrowBeige_right.png b/assets/kenny/arrowBeige_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..166bbfe83c11f9f8918309bd790fa0b8b1923ecd
Binary files /dev/null and b/assets/kenny/arrowBeige_right.png differ
diff --git a/assets/kenny/arrowBlue_left.png b/assets/kenny/arrowBlue_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..05d3b3b7bd788db6abf3351e1eba315c0f6f152b
Binary files /dev/null and b/assets/kenny/arrowBlue_left.png differ
diff --git a/assets/kenny/arrowBlue_right.png b/assets/kenny/arrowBlue_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..51fb299c4537f2a8b5a16ae0089ab0e41e0eecec
Binary files /dev/null and b/assets/kenny/arrowBlue_right.png differ
diff --git a/assets/kenny/arrowBrown_left.png b/assets/kenny/arrowBrown_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..de9961bc391b207b163a09827fd288127b163d14
Binary files /dev/null and b/assets/kenny/arrowBrown_left.png differ
diff --git a/assets/kenny/arrowBrown_right.png b/assets/kenny/arrowBrown_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a6b571d6f308991f5822300c6f8ec770bbdba1e
Binary files /dev/null and b/assets/kenny/arrowBrown_right.png differ
diff --git a/assets/kenny/arrowSilver_left.png b/assets/kenny/arrowSilver_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ed60b705238c5782b255868c5198233edbda554
Binary files /dev/null and b/assets/kenny/arrowSilver_left.png differ
diff --git a/assets/kenny/arrowSilver_right.png b/assets/kenny/arrowSilver_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..be71d37da86af30a30c960197227656aca4aee1b
Binary files /dev/null and b/assets/kenny/arrowSilver_right.png differ
diff --git a/assets/kenny/barBack_horizontalLeft.png b/assets/kenny/barBack_horizontalLeft.png
new file mode 100644
index 0000000000000000000000000000000000000000..801e6b5b29ba00f5009a9fcd462cfb4dabd77931
Binary files /dev/null and b/assets/kenny/barBack_horizontalLeft.png differ
diff --git a/assets/kenny/barBack_horizontalMid.png b/assets/kenny/barBack_horizontalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..319bdbc38ebf193cee5310fdbb35ab589a5a3475
Binary files /dev/null and b/assets/kenny/barBack_horizontalMid.png differ
diff --git a/assets/kenny/barBack_horizontalRight.png b/assets/kenny/barBack_horizontalRight.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9a850f506334abd9d52f64f744c7387cab7a279
Binary files /dev/null and b/assets/kenny/barBack_horizontalRight.png differ
diff --git a/assets/kenny/barBack_verticalBottom.png b/assets/kenny/barBack_verticalBottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0e7064bd2886df713fc7e548b237c3021e6e259
Binary files /dev/null and b/assets/kenny/barBack_verticalBottom.png differ
diff --git a/assets/kenny/barBack_verticalMid.png b/assets/kenny/barBack_verticalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d3e8fd2b5e605adb97a592da9c0d528c352c1f9
Binary files /dev/null and b/assets/kenny/barBack_verticalMid.png differ
diff --git a/assets/kenny/barBack_verticalTop.png b/assets/kenny/barBack_verticalTop.png
new file mode 100644
index 0000000000000000000000000000000000000000..543cd193f4438d0971841dc245e78dda4b4de964
Binary files /dev/null and b/assets/kenny/barBack_verticalTop.png differ
diff --git a/assets/kenny/barBlue_horizontalBlue.png b/assets/kenny/barBlue_horizontalBlue.png
new file mode 100644
index 0000000000000000000000000000000000000000..5367dba38591073c177329b2d08825f0decf9eaf
Binary files /dev/null and b/assets/kenny/barBlue_horizontalBlue.png differ
diff --git a/assets/kenny/barBlue_horizontalLeft.png b/assets/kenny/barBlue_horizontalLeft.png
new file mode 100644
index 0000000000000000000000000000000000000000..0245eb3b533adb39089d3b5d5544f3040ce18938
Binary files /dev/null and b/assets/kenny/barBlue_horizontalLeft.png differ
diff --git a/assets/kenny/barBlue_horizontalRight.png b/assets/kenny/barBlue_horizontalRight.png
new file mode 100644
index 0000000000000000000000000000000000000000..e94c0c61e76ad123581c93972a91659a6ce7cec8
Binary files /dev/null and b/assets/kenny/barBlue_horizontalRight.png differ
diff --git a/assets/kenny/barBlue_verticalBottom.png b/assets/kenny/barBlue_verticalBottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..2834db913084b0aa6402b3e2b8db40d1b54771e8
Binary files /dev/null and b/assets/kenny/barBlue_verticalBottom.png differ
diff --git a/assets/kenny/barBlue_verticalMid.png b/assets/kenny/barBlue_verticalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..7629e5527e7a9d9e2d430011c4ab7b143122e5d3
Binary files /dev/null and b/assets/kenny/barBlue_verticalMid.png differ
diff --git a/assets/kenny/barBlue_verticalTop.png b/assets/kenny/barBlue_verticalTop.png
new file mode 100644
index 0000000000000000000000000000000000000000..18dda588ea2c163cac750aae5d5b832ed7e33cc5
Binary files /dev/null and b/assets/kenny/barBlue_verticalTop.png differ
diff --git a/assets/kenny/barGreen_horizontalLeft.png b/assets/kenny/barGreen_horizontalLeft.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b08f21c6657ad089f2371a30c866dd0f7d2ca87
Binary files /dev/null and b/assets/kenny/barGreen_horizontalLeft.png differ
diff --git a/assets/kenny/barGreen_horizontalMid.png b/assets/kenny/barGreen_horizontalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7b5d775bebc60dc63879a9f100fa2dc4056366b
Binary files /dev/null and b/assets/kenny/barGreen_horizontalMid.png differ
diff --git a/assets/kenny/barGreen_horizontalRight.png b/assets/kenny/barGreen_horizontalRight.png
new file mode 100644
index 0000000000000000000000000000000000000000..407b61b535d91dcbbd524f03d9f52bfd556bf039
Binary files /dev/null and b/assets/kenny/barGreen_horizontalRight.png differ
diff --git a/assets/kenny/barGreen_verticalBottom.png b/assets/kenny/barGreen_verticalBottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f733d4c07fa0bfad2d060ece7260ac0c573874c
Binary files /dev/null and b/assets/kenny/barGreen_verticalBottom.png differ
diff --git a/assets/kenny/barGreen_verticalMid.png b/assets/kenny/barGreen_verticalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..03ff210f290097aadfdadb8d958f16de269f4feb
Binary files /dev/null and b/assets/kenny/barGreen_verticalMid.png differ
diff --git a/assets/kenny/barGreen_verticalTop.png b/assets/kenny/barGreen_verticalTop.png
new file mode 100644
index 0000000000000000000000000000000000000000..235afa0b4f1be3e64c4a4b26ed7471eb58e6d8cb
Binary files /dev/null and b/assets/kenny/barGreen_verticalTop.png differ
diff --git a/assets/kenny/barRed_horizontalLeft.png b/assets/kenny/barRed_horizontalLeft.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d8e7a6f84084924da9526600d46c5c8107a3313
Binary files /dev/null and b/assets/kenny/barRed_horizontalLeft.png differ
diff --git a/assets/kenny/barRed_horizontalMid.png b/assets/kenny/barRed_horizontalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..99da8810a636da75e56777141a476a3349270a2c
Binary files /dev/null and b/assets/kenny/barRed_horizontalMid.png differ
diff --git a/assets/kenny/barRed_horizontalRight.png b/assets/kenny/barRed_horizontalRight.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ec2bd4fd1b9336a1ad147e72e0b90cd8a506335
Binary files /dev/null and b/assets/kenny/barRed_horizontalRight.png differ
diff --git a/assets/kenny/barRed_verticalBottom.png b/assets/kenny/barRed_verticalBottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..767d6a4c607e94fc625ef175be65ec02caefa3cf
Binary files /dev/null and b/assets/kenny/barRed_verticalBottom.png differ
diff --git a/assets/kenny/barRed_verticalMid.png b/assets/kenny/barRed_verticalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..934e6f80d48c32fd19067d255ded269a8d157e8c
Binary files /dev/null and b/assets/kenny/barRed_verticalMid.png differ
diff --git a/assets/kenny/barRed_verticalTop.png b/assets/kenny/barRed_verticalTop.png
new file mode 100644
index 0000000000000000000000000000000000000000..35101937914a1de0c7b84c3fe246811b47fa7391
Binary files /dev/null and b/assets/kenny/barRed_verticalTop.png differ
diff --git a/assets/kenny/barYellow_horizontalLeft.png b/assets/kenny/barYellow_horizontalLeft.png
new file mode 100644
index 0000000000000000000000000000000000000000..79c4b63fdde994900ebceb2c3eed8f52b9869908
Binary files /dev/null and b/assets/kenny/barYellow_horizontalLeft.png differ
diff --git a/assets/kenny/barYellow_horizontalMid.png b/assets/kenny/barYellow_horizontalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..38f37b6c06e4a31b51fdea38752be70e9a77f953
Binary files /dev/null and b/assets/kenny/barYellow_horizontalMid.png differ
diff --git a/assets/kenny/barYellow_horizontalRight.png b/assets/kenny/barYellow_horizontalRight.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d00f789fbbb163d20c5184a9970a02e6b218928
Binary files /dev/null and b/assets/kenny/barYellow_horizontalRight.png differ
diff --git a/assets/kenny/barYellow_verticalBottom.png b/assets/kenny/barYellow_verticalBottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0cc9d72dcdbe6c404639f66db905b3203fa29c0
Binary files /dev/null and b/assets/kenny/barYellow_verticalBottom.png differ
diff --git a/assets/kenny/barYellow_verticalMid.png b/assets/kenny/barYellow_verticalMid.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2491258bddf717d2026d2f804bd89a935b4e4a4
Binary files /dev/null and b/assets/kenny/barYellow_verticalMid.png differ
diff --git a/assets/kenny/barYellow_verticalTop.png b/assets/kenny/barYellow_verticalTop.png
new file mode 100644
index 0000000000000000000000000000000000000000..18b96ab2111d5f88218092ca0d6e816552326977
Binary files /dev/null and b/assets/kenny/barYellow_verticalTop.png differ
diff --git a/assets/kenny/buttonLong_beige.png b/assets/kenny/buttonLong_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9b35372b38e503f3e22f3a05c529cd04d82991c
Binary files /dev/null and b/assets/kenny/buttonLong_beige.png differ
diff --git a/assets/kenny/buttonLong_beige_pressed.png b/assets/kenny/buttonLong_beige_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..25378784c18ce313bfe6ec505cef5d962f8d3778
Binary files /dev/null and b/assets/kenny/buttonLong_beige_pressed.png differ
diff --git a/assets/kenny/buttonLong_blue.png b/assets/kenny/buttonLong_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..cbaf8d7817a9bb52324e9bdf9df811638a6a5bd8
Binary files /dev/null and b/assets/kenny/buttonLong_blue.png differ
diff --git a/assets/kenny/buttonLong_blue_pressed.png b/assets/kenny/buttonLong_blue_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ad0b5c2c60076b7a300246003fb4a8fbd35500c
Binary files /dev/null and b/assets/kenny/buttonLong_blue_pressed.png differ
diff --git a/assets/kenny/buttonLong_brown.png b/assets/kenny/buttonLong_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..299dc59d80e91af63053fdc0fe26d6224e43fcfe
Binary files /dev/null and b/assets/kenny/buttonLong_brown.png differ
diff --git a/assets/kenny/buttonLong_brown_pressed.png b/assets/kenny/buttonLong_brown_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec0a49445c98f2f9dbc6285973a913eca9ed7be2
Binary files /dev/null and b/assets/kenny/buttonLong_brown_pressed.png differ
diff --git a/assets/kenny/buttonLong_grey.png b/assets/kenny/buttonLong_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8c3fe09dc4da9950b0d82d926402377ecee47d8
Binary files /dev/null and b/assets/kenny/buttonLong_grey.png differ
diff --git a/assets/kenny/buttonLong_grey_pressed.png b/assets/kenny/buttonLong_grey_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef427446823017796b305b808a73e77fc5b9c149
Binary files /dev/null and b/assets/kenny/buttonLong_grey_pressed.png differ
diff --git a/assets/kenny/buttonRound_beige.png b/assets/kenny/buttonRound_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..69cbb7ba27900d43ff74555b266d232c88f5c35c
Binary files /dev/null and b/assets/kenny/buttonRound_beige.png differ
diff --git a/assets/kenny/buttonRound_blue.png b/assets/kenny/buttonRound_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6fb596e506aaf4d41c5eeec08c5ac60cbad38e0
Binary files /dev/null and b/assets/kenny/buttonRound_blue.png differ
diff --git a/assets/kenny/buttonRound_brown.png b/assets/kenny/buttonRound_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb824ea08112cade237ce70b0e480784d11b9f04
Binary files /dev/null and b/assets/kenny/buttonRound_brown.png differ
diff --git a/assets/kenny/buttonRound_grey.png b/assets/kenny/buttonRound_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fe89f8acde8482d72d2a95572dbf13759eea766
Binary files /dev/null and b/assets/kenny/buttonRound_grey.png differ
diff --git a/assets/kenny/buttonSquare_beige.png b/assets/kenny/buttonSquare_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..15ecc1cab174e47effe6b26d35594886c7b499e8
Binary files /dev/null and b/assets/kenny/buttonSquare_beige.png differ
diff --git a/assets/kenny/buttonSquare_beige_pressed.png b/assets/kenny/buttonSquare_beige_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..2465c870a33cdc902374d3a2136f40c18ce2dcbd
Binary files /dev/null and b/assets/kenny/buttonSquare_beige_pressed.png differ
diff --git a/assets/kenny/buttonSquare_blue.png b/assets/kenny/buttonSquare_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..c165e51f7feb1169ed3cea51e4f87617a1e6b93c
Binary files /dev/null and b/assets/kenny/buttonSquare_blue.png differ
diff --git a/assets/kenny/buttonSquare_blue_pressed.png b/assets/kenny/buttonSquare_blue_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ab31c5c340034da8b1d95e05f9563cb20774ba3
Binary files /dev/null and b/assets/kenny/buttonSquare_blue_pressed.png differ
diff --git a/assets/kenny/buttonSquare_brown.png b/assets/kenny/buttonSquare_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..1707aab0be8282fa1d7e1ed9e5f69f0170c21215
Binary files /dev/null and b/assets/kenny/buttonSquare_brown.png differ
diff --git a/assets/kenny/buttonSquare_brown_pressed.png b/assets/kenny/buttonSquare_brown_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ea2427e98d65f0db66cd11011356c813c226945
Binary files /dev/null and b/assets/kenny/buttonSquare_brown_pressed.png differ
diff --git a/assets/kenny/buttonSquare_grey.png b/assets/kenny/buttonSquare_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..f21b17e1b4b38c0bff17c3db279ec4b6a433ea8f
Binary files /dev/null and b/assets/kenny/buttonSquare_grey.png differ
diff --git a/assets/kenny/buttonSquare_grey_pressed.png b/assets/kenny/buttonSquare_grey_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf7b41072881803606334a14dae6e24b14145ae7
Binary files /dev/null and b/assets/kenny/buttonSquare_grey_pressed.png differ
diff --git a/assets/kenny/cursorGauntlet_blue.png b/assets/kenny/cursorGauntlet_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab9eaafe0d11b360e536799037004edab6b4dfbc
Binary files /dev/null and b/assets/kenny/cursorGauntlet_blue.png differ
diff --git a/assets/kenny/cursorGauntlet_bronze.png b/assets/kenny/cursorGauntlet_bronze.png
new file mode 100644
index 0000000000000000000000000000000000000000..379b6f5c889eb8de8b7ad6738b7fd92144d26b33
Binary files /dev/null and b/assets/kenny/cursorGauntlet_bronze.png differ
diff --git a/assets/kenny/cursorGauntlet_grey.png b/assets/kenny/cursorGauntlet_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6f84c34ad917931ce414044910c0f6693f9ae1a
Binary files /dev/null and b/assets/kenny/cursorGauntlet_grey.png differ
diff --git a/assets/kenny/cursorHand_beige.png b/assets/kenny/cursorHand_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff2bba7414d26868c7e3b9a1cf8e399ae0b653fb
Binary files /dev/null and b/assets/kenny/cursorHand_beige.png differ
diff --git a/assets/kenny/cursorHand_blue.png b/assets/kenny/cursorHand_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ee5baaf38d45a98f51b209a968502e46681c942
Binary files /dev/null and b/assets/kenny/cursorHand_blue.png differ
diff --git a/assets/kenny/cursorHand_grey.png b/assets/kenny/cursorHand_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa83d37ef5c20e9bda94ed989ff8383a4139c8b8
Binary files /dev/null and b/assets/kenny/cursorHand_grey.png differ
diff --git a/assets/kenny/cursorSword_bronze.png b/assets/kenny/cursorSword_bronze.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b43075a33e0f6bd05e39e834bc6ff5894bf76b8
Binary files /dev/null and b/assets/kenny/cursorSword_bronze.png differ
diff --git a/assets/kenny/cursorSword_gold.png b/assets/kenny/cursorSword_gold.png
new file mode 100644
index 0000000000000000000000000000000000000000..ccca5fd30a5ee35e6c5d59212e787285510d5033
Binary files /dev/null and b/assets/kenny/cursorSword_gold.png differ
diff --git a/assets/kenny/cursorSword_silver.png b/assets/kenny/cursorSword_silver.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b37fe8e588fd429e789e50b9fd8b5675f48bbad
Binary files /dev/null and b/assets/kenny/cursorSword_silver.png differ
diff --git a/assets/kenny/iconCheck_beige.png b/assets/kenny/iconCheck_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc4790e7f1e91579f31fc16ca705dacd2719ec21
Binary files /dev/null and b/assets/kenny/iconCheck_beige.png differ
diff --git a/assets/kenny/iconCheck_blue.png b/assets/kenny/iconCheck_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ef72cde22fb2f178e6c6d14853473bd40039dcc
Binary files /dev/null and b/assets/kenny/iconCheck_blue.png differ
diff --git a/assets/kenny/iconCheck_bronze.png b/assets/kenny/iconCheck_bronze.png
new file mode 100644
index 0000000000000000000000000000000000000000..cdaa2f239d8d53bcfdb88e300cde5de81ade3f9f
Binary files /dev/null and b/assets/kenny/iconCheck_bronze.png differ
diff --git a/assets/kenny/iconCheck_grey.png b/assets/kenny/iconCheck_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4016cf7d97d78ab3443a8b0df0f749b4311580e
Binary files /dev/null and b/assets/kenny/iconCheck_grey.png differ
diff --git a/assets/kenny/iconCircle_beige.png b/assets/kenny/iconCircle_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..a5e3ca1ed5671c2cfe54b60cc75e16902b6d5cd4
Binary files /dev/null and b/assets/kenny/iconCircle_beige.png differ
diff --git a/assets/kenny/iconCircle_blue.png b/assets/kenny/iconCircle_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..7062e5c7d1efbb13987f28a76400c89fa8676546
Binary files /dev/null and b/assets/kenny/iconCircle_blue.png differ
diff --git a/assets/kenny/iconCircle_brown.png b/assets/kenny/iconCircle_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..7abf40fe3ce29d58c2492c095da6c454a7b37e12
Binary files /dev/null and b/assets/kenny/iconCircle_brown.png differ
diff --git a/assets/kenny/iconCircle_grey.png b/assets/kenny/iconCircle_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..d35d80be281cb016b4f8eeeeb381969fb7b0d67a
Binary files /dev/null and b/assets/kenny/iconCircle_grey.png differ
diff --git a/assets/kenny/iconCross_beige.png b/assets/kenny/iconCross_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..32278dccd955874b321a7410a35a84342a32065a
Binary files /dev/null and b/assets/kenny/iconCross_beige.png differ
diff --git a/assets/kenny/iconCross_blue.png b/assets/kenny/iconCross_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ab70a18ce0590995d90340d15327f287575b306
Binary files /dev/null and b/assets/kenny/iconCross_blue.png differ
diff --git a/assets/kenny/iconCross_brown.png b/assets/kenny/iconCross_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..7cce69ada1e4cb5a85cfbf0b4acd6ab9b6f1a5cd
Binary files /dev/null and b/assets/kenny/iconCross_brown.png differ
diff --git a/assets/kenny/iconCross_grey.png b/assets/kenny/iconCross_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..f57ccd8c322d5474a09f734c61f72fc63f65f442
Binary files /dev/null and b/assets/kenny/iconCross_grey.png differ
diff --git a/assets/kenny/panelInset_beige.png b/assets/kenny/panelInset_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..f92416fa221ee96a706413b02140b7ecf08e46e1
Binary files /dev/null and b/assets/kenny/panelInset_beige.png differ
diff --git a/assets/kenny/panelInset_beigeLight.png b/assets/kenny/panelInset_beigeLight.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ed1a7bc90f65bce6867a26062079b362c4a3b6d
Binary files /dev/null and b/assets/kenny/panelInset_beigeLight.png differ
diff --git a/assets/kenny/panelInset_blue.png b/assets/kenny/panelInset_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c2b5851e38c010d067501f099cbf88ebc97a492
Binary files /dev/null and b/assets/kenny/panelInset_blue.png differ
diff --git a/assets/kenny/panelInset_brown.png b/assets/kenny/panelInset_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc293f144b4acc58ac8c44ea2f7cb4ff532fc252
Binary files /dev/null and b/assets/kenny/panelInset_brown.png differ
diff --git a/assets/kenny/panel_beige.png b/assets/kenny/panel_beige.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4a1d99d5249af3b6cb7e68681bb806e3b95d24b
Binary files /dev/null and b/assets/kenny/panel_beige.png differ
diff --git a/assets/kenny/panel_beigeLight.png b/assets/kenny/panel_beigeLight.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ccf82cf70d500ed7d5e627f70b54e56cb02ed2a
Binary files /dev/null and b/assets/kenny/panel_beigeLight.png differ
diff --git a/assets/kenny/panel_blue.png b/assets/kenny/panel_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf58c662e703e08e83f31c56834224e6810ee1ac
Binary files /dev/null and b/assets/kenny/panel_blue.png differ
diff --git a/assets/kenny/panel_brown.png b/assets/kenny/panel_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..97c381ba6000d74d29284c3e8bef0f9929c8ffdb
Binary files /dev/null and b/assets/kenny/panel_brown.png differ
diff --git a/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs b/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs
index c2d75f93c997255de0d2027eecf8a171ee6df4a1..fdd47979cc4b97c650c0d5be41b93f8eda1f8d5d 100644
--- a/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs
+++ b/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs
@@ -130,7 +130,7 @@ pub fn extract_nine_patch(
         extracted_quads.push(top_middle_quad);
 
         // Bottom
-        let bottom_y_pos = layout.posy + (layout.width - border.bottom);
+        let bottom_y_pos = layout.posy + (layout.height - border.bottom);
         let bottom_left_quad = ExtractQuadBundle {
             extracted_quad: ExtractedQuad {
                 rect: Rect {
@@ -245,7 +245,7 @@ pub fn extract_nine_patch(
                 },
                 uv_min: Some(Vec2::new(
                     border.left / image_size.x,
-                    border.bottom / image_size.y,
+                    border.top / image_size.y,
                 )),
                 uv_max: Some(Vec2::new(
                     (image_size.x - border.right) / image_size.x,
diff --git a/examples/full_ui.rs b/examples/full_ui.rs
new file mode 100644
index 0000000000000000000000000000000000000000..ed9b075b7d9ab309ec9cbce1c64d52c74e627ba2
--- /dev/null
+++ b/examples/full_ui.rs
@@ -0,0 +1,197 @@
+use bevy::{
+    math::Vec2,
+    prelude::{App as BevyApp, AssetServer, Commands, Handle, Res, ResMut, World},
+    window::{WindowDescriptor, Windows},
+    PipelinedDefaultPlugins,
+};
+use bevy_kayak_ui::{BevyContext, BevyKayakUIPlugin, ImageManager, UICameraBundle};
+use kayak_components::{NinePatch, Text};
+use kayak_core::{
+    context::KayakContext,
+    layout_cache::Space,
+    styles::{LayoutType, Style, StyleProp, Units},
+    widget, Children, EventType, Index, OnEvent,
+};
+use kayak_ui::components::App;
+use kayak_ui::core::rsx;
+
+#[widget]
+fn BlueButton(context: KayakContext, children: Children, styles: Option<Style>) {
+    let (blue_button_handle, blue_button_hover_handle) = {
+        let world = context.get_global_state::<World>();
+        if world.is_err() {
+            return;
+        }
+
+        let mut world = world.unwrap();
+
+        let (handle1, handle2) = {
+            let asset_server = world.get_resource::<AssetServer>().unwrap();
+            let handle1: Handle<bevy::render2::texture::Image> =
+                asset_server.load("../assets/kenny/buttonSquare_blue.png");
+            let handle2: Handle<bevy::render2::texture::Image> =
+                asset_server.load("../assets/kenny/buttonSquare_blue_pressed.png");
+
+            (handle1, handle2)
+        };
+
+        let mut image_manager = world.get_resource_mut::<ImageManager>().unwrap();
+        let blue_button_handle = image_manager.get(&handle1);
+        let blue_button_hover_handle = image_manager.get(&handle2);
+
+        (blue_button_handle, blue_button_hover_handle)
+    };
+
+    let current_button_handle = *context.create_state::<u16>(blue_button_handle).unwrap();
+    dbg!(current_button_handle);
+
+    let button_styles = Style {
+        width: StyleProp::Value(Units::Pixels(200.0)),
+        height: StyleProp::Value(Units::Pixels(50.0)),
+        padding_left: StyleProp::Value(Units::Stretch(1.0)),
+        padding_right: StyleProp::Value(Units::Stretch(1.0)),
+        padding_top: StyleProp::Value(Units::Stretch(1.0)),
+        padding_bottom: StyleProp::Value(Units::Stretch(1.0)),
+        ..styles.clone().unwrap_or_default()
+    };
+
+    let button_id = self.get_id();
+    let on_event = OnEvent::new(move |context, event| match event.event_type {
+        EventType::Click => {
+            dbg!("Clicked!");
+            context.set_current_id(button_id);
+            context.set_state::<u16>(blue_button_hover_handle);
+        }
+        _ => {
+            context.set_state::<u16>(blue_button_handle);
+        }
+    });
+
+    rsx! {
+        <NinePatch
+            border={Space {
+                left: 10.0,
+                right: 10.0,
+                top: 10.0,
+                bottom: 10.0,
+            }}
+            handle={current_button_handle}
+            styles={Some(button_styles)}
+            on_event={Some(on_event)}
+        >
+            {children}
+        </NinePatch>
+    }
+}
+
+fn startup(
+    mut commands: Commands,
+    windows: Res<Windows>,
+    asset_server: Res<AssetServer>,
+    mut image_manager: ResMut<ImageManager>,
+) {
+    commands.spawn_bundle(UICameraBundle::new());
+
+    let window_size = if let Some(window) = windows.get_primary() {
+        Vec2::new(window.width(), window.height())
+    } else {
+        panic!("Couldn't find primary window!");
+    };
+
+    let handle: Handle<bevy::render2::texture::Image> = asset_server.load("kenny/panel_brown.png");
+    let panel_brown_handle = image_manager.get(&handle);
+
+    let context = BevyContext::new(window_size.x, window_size.y, |styles, context| {
+        // Hack to trick the proc macro for right now..
+        let parent_id: Option<Index> = None;
+
+        let nine_patch_styles = Style {
+            layout_type: StyleProp::Value(LayoutType::Column),
+            width: StyleProp::Value(Units::Pixels(512.0)),
+            height: StyleProp::Value(Units::Pixels(512.0)),
+            padding_left: StyleProp::Value(Units::Stretch(1.0)),
+            padding_right: StyleProp::Value(Units::Stretch(1.0)),
+            padding_top: StyleProp::Value(Units::Stretch(1.0)),
+            padding_bottom: StyleProp::Value(Units::Stretch(1.0)),
+            ..Style::default()
+        };
+
+        let app_styles = Style {
+            padding_left: StyleProp::Value(Units::Stretch(1.0)),
+            padding_right: StyleProp::Value(Units::Stretch(1.0)),
+            padding_top: StyleProp::Value(Units::Stretch(1.0)),
+            padding_bottom: StyleProp::Value(Units::Stretch(1.0)),
+            ..styles.clone()
+        };
+
+        let header_styles = Style {
+            width: StyleProp::Value(Units::Pixels(432.0)),
+            height: StyleProp::Value(Units::Pixels(64.0)),
+            bottom: StyleProp::Value(Units::Stretch(1.0)),
+            ..Style::default()
+        };
+
+        let play_button_styles = Style {
+            width: StyleProp::Value(Units::Pixels(54.0)),
+            height: StyleProp::Value(Units::Pixels(45.0)),
+            ..Style::default()
+        };
+
+        let options_button_text_styles = Style {
+            width: StyleProp::Value(Units::Pixels(102.0)),
+            height: StyleProp::Value(Units::Pixels(45.0)),
+            ..Style::default()
+        };
+
+        let options_button_styles = Style {
+            top: StyleProp::Value(Units::Pixels(15.0)),
+            ..Style::default()
+        };
+
+        rsx! {
+            <App styles={Some(app_styles)}>
+                <NinePatch
+                    styles={Some(nine_patch_styles)}
+                    border={Space {
+                        left: 30.0,
+                        right: 30.0,
+                        top: 30.0,
+                        bottom: 30.0,
+                    }}
+                    handle={panel_brown_handle}
+                >
+                    <Text
+                        styles={Some(header_styles)}
+                        size={50.0}
+                        content={"Name My Game Plz".to_string()}
+                    />
+                    <BlueButton>
+                        <Text styles={Some(play_button_styles)} size={30.0} content={"Play".to_string()} />
+                    </BlueButton>
+                    <BlueButton styles={Some(options_button_styles)}>
+                        <Text styles={Some(options_button_text_styles)} size={30.0} content={"Options".to_string()} />
+                    </BlueButton>
+                    <BlueButton styles={Some(options_button_styles)}>
+                        <Text styles={Some(play_button_styles)} size={30.0} content={"Quit".to_string()} />
+                    </BlueButton>
+                </NinePatch>
+            </App>
+        }
+    });
+
+    commands.insert_resource(context);
+}
+
+fn main() {
+    BevyApp::new()
+        .insert_resource(WindowDescriptor {
+            width: 1270.0,
+            height: 720.0,
+            title: String::from("UI Example"),
+            ..Default::default()
+        })
+        .add_plugins(PipelinedDefaultPlugins)
+        .add_plugin(BevyKayakUIPlugin)
+        .add_startup_system(startup)
+        .run();
+}
diff --git a/kayak_core/src/context.rs b/kayak_core/src/context.rs
index 7e39265f163bc81aef7ab29994743e58ea513ced..59d1d52306c005762e0cd1b2e17ee12983186f25 100644
--- a/kayak_core/src/context.rs
+++ b/kayak_core/src/context.rs
@@ -38,6 +38,7 @@ impl KayakContext {
         &mut self,
         initial_state: T,
     ) -> Option<Ref<T>> {
+        dbg!(self.current_id);
         if self.component_states.contains_key(&self.current_id) {
             let states = self.component_states.get_mut(&self.current_id).unwrap();
             if !states.contains::<T>() {
@@ -62,10 +63,12 @@ impl KayakContext {
     }
 
     pub fn set_state<T: resources::Resource + Clone>(&mut self, state: T) {
+        dbg!(self.current_id);
         if self.component_states.contains_key(&self.current_id) {
             let states = self.component_states.get(&self.current_id).unwrap();
             if states.contains::<T>() {
                 let mut mutate_t = states.get_mut::<T>().unwrap();
+                dbg!("Mutating state!");
                 self.widget_manager.dirty_nodes.push(self.current_id);
                 *mutate_t = state;
             } else {
diff --git a/kayak_core/src/styles.rs b/kayak_core/src/styles.rs
index 17266dc971130ef194237f890258de14561921b6..a1671dcf387ec682d5e48b2cb8dd3d6f20d7de92 100644
--- a/kayak_core/src/styles.rs
+++ b/kayak_core/src/styles.rs
@@ -49,6 +49,10 @@ pub struct Style {
     pub padding_right: StyleProp<Units>,
     pub padding_top: StyleProp<Units>,
     pub padding_bottom: StyleProp<Units>,
+    pub margin_left: StyleProp<Units>,
+    pub margin_right: StyleProp<Units>,
+    pub margin_top: StyleProp<Units>,
+    pub margin_bottom: StyleProp<Units>,
 }
 
 impl Default for Style {
@@ -70,6 +74,10 @@ impl Default for Style {
             padding_right: StyleProp::Default,
             padding_top: StyleProp::Default,
             padding_bottom: StyleProp::Default,
+            margin_left: StyleProp::Default,
+            margin_right: StyleProp::Default,
+            margin_top: StyleProp::Default,
+            margin_bottom: StyleProp::Default,
         }
     }
 }
@@ -164,5 +172,21 @@ impl Style {
             StyleProp::Inherit => self.padding_bottom = other.padding_bottom.clone(),
             _ => (),
         }
+        match self.margin_left {
+            StyleProp::Inherit => self.margin_left = other.margin_left.clone(),
+            _ => (),
+        }
+        match self.margin_right {
+            StyleProp::Inherit => self.margin_right = other.margin_right.clone(),
+            _ => (),
+        }
+        match self.margin_top {
+            StyleProp::Inherit => self.margin_top = other.margin_top.clone(),
+            _ => (),
+        }
+        match self.margin_bottom {
+            StyleProp::Inherit => self.margin_bottom = other.margin_bottom.clone(),
+            _ => (),
+        }
     }
 }
diff --git a/kayak_core/src/widget_manager.rs b/kayak_core/src/widget_manager.rs
index 97ed85ebe3fdb3f78e6f8eab4e98726d97f87058..dd141b2000b077425f0792b647b780af24ebd17e 100644
--- a/kayak_core/src/widget_manager.rs
+++ b/kayak_core/src/widget_manager.rs
@@ -139,6 +139,7 @@ impl WidgetManager {
             right: crate::styles::StyleProp::Default,
             top: crate::styles::StyleProp::Default,
             width: crate::styles::StyleProp::Default,
+            ..Style::default()
         };
         for dirty_node_index in self.dirty_render_nodes.drain(..) {
             let dirty_widget = self.current_widgets[dirty_node_index].as_ref().unwrap();
diff --git a/kayak_render_macros/src/children.rs b/kayak_render_macros/src/children.rs
index f948e6727cb1817f9b96c964ab349c6d73ab9471..88dd8dc2c2a1054ae1cc984d18162f0a75749c86 100644
--- a/kayak_render_macros/src/children.rs
+++ b/kayak_render_macros/src/children.rs
@@ -1,3 +1,5 @@
+use std::collections::HashSet;
+
 use crate::{
     arc_function::build_arc_function,
     attribute::Attribute,
@@ -95,60 +97,101 @@ impl Children {
             _ => {
                 let mut iter = children_quotes.iter();
 
-                let first = iter.next().unwrap();
-                let second = iter.next().unwrap();
-
-                let first = build_arc_function(quote! { child1 }, first.clone(), true, 0);
-                let second = build_arc_function(quote! { child2 }, second.clone(), true, 1);
+                // First get shared and non-shared attributes..
+                let mut child_attributes_list = Vec::new();
+                for i in 0..children_quotes.len() {
+                    child_attributes_list.push(self.get_clonable_attributes(i));
+                }
 
-                let children_attributes0: Vec<_> = self.get_clonable_attributes(0);
-                let children_attributes1: Vec<_> = self.get_clonable_attributes(1);
-                let (children_attributes0, children_attributes1, matching) =
-                    handle_tuple_attributes(&children_attributes0, &children_attributes1);
+                let mut all_attributes = HashSet::new();
+                for child_attributes in child_attributes_list.iter() {
+                    for child_attribute in child_attributes {
+                        all_attributes.insert(child_attribute.to_string());
+                    }
+                }
 
-                let base_matching: Vec<proc_macro2::TokenStream> = matching
+                let base_matching: Vec<proc_macro2::TokenStream> = all_attributes
                     .iter()
-                    .map(|a| {
-                        format!("base_{}", a.to_string())
-                            .to_string()
-                            .parse()
-                            .unwrap()
-                    })
+                    .map(|a| format!("base_{}", a).to_string().parse().unwrap())
                     .collect();
 
+                let all_attributes: Vec<proc_macro2::TokenStream> =
+                    all_attributes.iter().map(|a| a.parse().unwrap()).collect();
+
                 let base_clone = quote! {
-                    #(let #base_matching = #matching.clone();)*
+                    #(let #base_matching = #all_attributes.clone();)*
                 };
 
                 let base_clones_inner = quote! {
-                    #(let #matching = #base_matching.clone();)*
+                    #(let #all_attributes = #base_matching.clone();)*
                 };
 
-                let cloned_attrs0 = quote! {
-                    #(let #children_attributes0 = #children_attributes0.clone();)*
-                };
-                let cloned_attrs1 = quote! {
-                    #(let #children_attributes1 = #children_attributes1.clone();)*
-                };
+                let mut output = Vec::new();
+                output.push(quote! { #base_clone });
+                for i in 0..children_quotes.len() {
+                    output.push(quote! { #base_clones_inner });
+                    let name: proc_macro2::TokenStream = format!("child{}", i).parse().unwrap();
+                    let child =
+                        build_arc_function(quote! { #name }, children_quotes[i].clone(), true, i);
+                    output.push(quote! { #child });
+                }
 
-                let tuple_of_tuples = iter.fold(
-                    quote! {
-                        #base_clone
-                        #cloned_attrs0
-                        #base_clones_inner
-                        #first
-                        #base_clones_inner
-                        #cloned_attrs1
-                        #second
-                    },
-                    |renderable, current| quote!((#renderable, #current)),
-                );
+                // let first = iter.next().unwrap();
+                // let second = iter.next().unwrap();
+
+                // let first = build_arc_function(quote! { child1 }, first.clone(), true, 0);
+                // let second = build_arc_function(quote! { child2 }, second.clone(), true, 1);
+
+                // let children_attributes0: Vec<_> = self.get_clonable_attributes(0);
+                // let children_attributes1: Vec<_> = self.get_clonable_attributes(1);
+                // let (children_attributes0, children_attributes1, matching) =
+                //     handle_tuple_attributes(&children_attributes0, &children_attributes1);
+
+                // let base_matching: Vec<proc_macro2::TokenStream> = matching
+                //     .iter()
+                //     .map(|a| {
+                //         format!("base_{}", a.to_string())
+                //             .to_string()
+                //             .parse()
+                //             .unwrap()
+                //     })
+                //     .collect();
+
+                // let base_clone = quote! {
+                //     #(let #base_matching = #matching.clone();)*
+                // };
+
+                // let base_clones_inner = quote! {
+                //     #(let #matching = #base_matching.clone();)*
+                // };
+
+                // let cloned_attrs0 = quote! {
+                //     #(let #children_attributes0 = #children_attributes0.clone();)*
+                // };
+                // let cloned_attrs1 = quote! {
+                //     #(let #children_attributes1 = #children_attributes1.clone();)*
+                // };
+
+                // let tuple_of_tuples = iter.fold(
+                //     quote! {
+                //         #base_clone
+                //         #cloned_attrs0
+                //         #base_clones_inner
+                //         #first
+                //         #base_clones_inner
+                //         #cloned_attrs1
+                //         #second
+                //     },
+                //     |renderable, current| quote!((#renderable, #current)),
+                // );
 
                 quote! {
                     Some(std::sync::Arc::new(move |parent_id: Option<kayak_core::Index>, context: &mut kayak_core::context::KayakContext| {
-                        #tuple_of_tuples
+                        #(#output)*
                     }))
                 }
+
+                // quote! {}
             }
         }
     }