diff --git a/android/gradle.properties b/android/gradle.properties
index db7a1ee2908d6e94aeb319e1c1b548a8bb245891..14eed3944b547f02179b1b42f4b601f91b7957c0 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.3
-app.versionCode=3
+app.versionName=0.0.4
+app.versionCode=4
diff --git a/assets/files/.gitkeep b/assets/files/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/assets/skins/default_button_mark_mine_off.png b/assets/skins/default_button_mark_mine_off.png
new file mode 100644
index 0000000000000000000000000000000000000000..e94bd696f674b4674317ce8e47ec9f8a88e276fd
Binary files /dev/null and b/assets/skins/default_button_mark_mine_off.png differ
diff --git a/assets/skins/default_button_mark_mine_on.png b/assets/skins/default_button_mark_mine_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..844e04be955563ec32beef6f661e2d2970e6d636
Binary files /dev/null and b/assets/skins/default_button_mark_mine_on.png differ
diff --git a/assets/skins/default_0.png b/assets/skins/default_tile_0.png
similarity index 100%
rename from assets/skins/default_0.png
rename to assets/skins/default_tile_0.png
diff --git a/assets/skins/default_1.png b/assets/skins/default_tile_1.png
similarity index 100%
rename from assets/skins/default_1.png
rename to assets/skins/default_tile_1.png
diff --git a/assets/skins/default_2.png b/assets/skins/default_tile_2.png
similarity index 100%
rename from assets/skins/default_2.png
rename to assets/skins/default_tile_2.png
diff --git a/assets/skins/default_3.png b/assets/skins/default_tile_3.png
similarity index 100%
rename from assets/skins/default_3.png
rename to assets/skins/default_tile_3.png
diff --git a/assets/skins/default_4.png b/assets/skins/default_tile_4.png
similarity index 100%
rename from assets/skins/default_4.png
rename to assets/skins/default_tile_4.png
diff --git a/assets/skins/default_5.png b/assets/skins/default_tile_5.png
similarity index 100%
rename from assets/skins/default_5.png
rename to assets/skins/default_tile_5.png
diff --git a/assets/skins/default_6.png b/assets/skins/default_tile_6.png
similarity index 100%
rename from assets/skins/default_6.png
rename to assets/skins/default_tile_6.png
diff --git a/assets/skins/default_7.png b/assets/skins/default_tile_7.png
similarity index 100%
rename from assets/skins/default_7.png
rename to assets/skins/default_tile_7.png
diff --git a/assets/skins/default_8.png b/assets/skins/default_tile_8.png
similarity index 100%
rename from assets/skins/default_8.png
rename to assets/skins/default_tile_8.png
diff --git a/assets/skins/default_tile_flag.png b/assets/skins/default_tile_flag.png
new file mode 100644
index 0000000000000000000000000000000000000000..15f2f2f76b687665b134492e44acaef589850bd2
Binary files /dev/null and b/assets/skins/default_tile_flag.png differ
diff --git a/assets/skins/default_tile_flag_ko.png b/assets/skins/default_tile_flag_ko.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e8598af1fd30b3c1bdf524bd815b18d3d1ef9c6
Binary files /dev/null and b/assets/skins/default_tile_flag_ko.png differ
diff --git a/assets/skins/default_tile_flag_ok.png b/assets/skins/default_tile_flag_ok.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f87550f930b4ae093d7620d4616f51a4f1139fc
Binary files /dev/null and b/assets/skins/default_tile_flag_ok.png differ
diff --git a/assets/skins/default_mine.png b/assets/skins/default_tile_mine.png
similarity index 100%
rename from assets/skins/default_mine.png
rename to assets/skins/default_tile_mine.png
diff --git a/assets/skins/default_tile_mine_not_found.png b/assets/skins/default_tile_mine_not_found.png
new file mode 100644
index 0000000000000000000000000000000000000000..a28db91fca96e5a509956ddd81d51bea2cd974c1
Binary files /dev/null and b/assets/skins/default_tile_mine_not_found.png differ
diff --git a/assets/skins/default_unknown.png b/assets/skins/default_tile_unknown.png
similarity index 100%
rename from assets/skins/default_unknown.png
rename to assets/skins/default_tile_unknown.png
diff --git a/fastlane/metadata/android/en-US/changelogs/4.txt b/fastlane/metadata/android/en-US/changelogs/4.txt
new file mode 100644
index 0000000000000000000000000000000000000000..60ec69f6163967c4cd86a7c5123de298689182f8
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/4.txt
@@ -0,0 +1 @@
+Finalize minimal gameplay.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/4.txt b/fastlane/metadata/android/fr-FR/changelogs/4.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6f741b5ea2b0522dbf8d43262f726a9d86e4702d
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/4.txt
@@ -0,0 +1 @@
+Finalisation du jeu minimal.
diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh
index aae2bcba4f5c4a055565bdc501e43ab802c7c377..c57007a1e5f24a31a3900295cb5af3190164cc35 100755
--- a/icons/build_game_icons.sh
+++ b/icons/build_game_icons.sh
@@ -43,19 +43,33 @@ function build_icon() {
   optipng ${OPTIPNG_OPTIONS} ${TARGET}
 }
 
-function build_icon_for_skin() {
+function build_icons_for_skin() {
   SKIN_CODE="$1"
 
-  build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/mine.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_mine.png
-  build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/unknown.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_unknown.png
+  build_icon_for_skin ${SKIN_CODE} button_mark_mine_on
+  build_icon_for_skin ${SKIN_CODE} button_mark_mine_off
+
+  build_icon_for_skin ${SKIN_CODE} tile_mine
+  build_icon_for_skin ${SKIN_CODE} tile_mine_not_found
+
+  build_icon_for_skin ${SKIN_CODE} tile_flag
+  build_icon_for_skin ${SKIN_CODE} tile_flag_ok
+  build_icon_for_skin ${SKIN_CODE} tile_flag_ko
+
+  build_icon_for_skin ${SKIN_CODE} tile_unknown
   for VALUE in {0..8};
   do
-    if [ -f "${CURRENT_DIR}/skins/${SKIN_CODE}/${VALUE}.svg" ]; then
-      build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/${VALUE}.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_${VALUE}.png
-    fi
+    build_icon_for_skin ${SKIN_CODE} tile_${VALUE}
   done
 }
 
+function build_icon_for_skin() {
+  SKIN_CODE="$1"
+  IMAGE_CODE="$2"
+
+  build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/${IMAGE_CODE}.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_${IMAGE_CODE}.png
+}
+
 # Game icons
 build_icon ${CURRENT_DIR}/button_back.svg ${BASE_DIR}/assets/icons/button_back.png
 build_icon ${CURRENT_DIR}/button_start.svg ${BASE_DIR}/assets/icons/button_start.png
@@ -71,4 +85,4 @@ build_icon ${CURRENT_DIR}/size_20x20.svg ${BASE_DIR}/assets/icons/size_20x20.png
 build_icon ${CURRENT_DIR}/skins/empty.svg ${BASE_DIR}/assets/skins/empty.png
 
 # Skins
-build_icon_for_skin "default"
+build_icons_for_skin "default"
diff --git a/icons/skins/default/button_mark_mine_off.svg b/icons/skins/default/button_mark_mine_off.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f4ab60e003f36d45b8eb0b9854c1a16a9d40cd3d
--- /dev/null
+++ b/icons/skins/default/button_mark_mine_off.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="-.0013123" y="-.0014381" width="93.668" height="93.679" ry="0" fill="#ea9c1f" stroke="#fff" stroke-width=".24146"/><path d="m62.564 39.496c-4.3118 1.5875-7.5974 2.7182-10.487 6.2927-2.5748 3.1852-6.2927 4.2894-10.487 2.1897v11.444h-2.0975v-28.316c0-0.5797 0.46905-1.0487 1.0487-1.0487s1.0487 0.46905 1.0487 1.0487c2.329 3.3859 6.3764 4.1356 10.487 4.195 6.2927 0.09216 10.487 4.195 10.487 4.195zm-18.878 13.913v2.1344c2.4744 0.50594 4.195 1.5793 4.195 2.8309 0 1.737-3.2876 3.1463-7.3413 3.1463s-7.3413-1.4093-7.3413-3.1463c0-1.2516 1.7206-2.3249 4.195-2.8309v-2.1343c-3.8099 0.65962-6.2927 2.5072-6.2927 4.9652 0 3.0869 3.8816 5.2437 9.4389 5.2437s9.4389-2.1569 9.4389-5.2437c0-2.458-2.4826-4.3055-6.2927-4.9652z" fill="#af0303" stroke="#730202" stroke-linejoin="round" stroke-width=".84528"/></svg>
diff --git a/icons/skins/default/button_mark_mine_on.svg b/icons/skins/default/button_mark_mine_on.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c8c4e65b3c76dad95d53e46650e4cf8b29514425
--- /dev/null
+++ b/icons/skins/default/button_mark_mine_on.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="-.0013123" y="-.0014381" width="93.668" height="93.679" ry="0" fill="#ea9c1f" stroke="#fff" stroke-width=".24146"/><path d="m84.054 29.467c-10.202 3.7561-17.976 6.4314-24.814 14.889-6.0921 7.5364-14.889 10.149-24.814 5.1809v27.078h-4.9628v-66.998c0-1.3716 1.1098-2.4814 2.4814-2.4814s2.4814 1.1098 2.4814 2.4814c5.5105 8.0113 15.087 9.7852 24.814 9.9257 14.889 0.21806 24.814 9.9257 24.814 9.9257zm-44.666 32.918v5.0502c5.8546 1.1971 9.9257 3.7367 9.9257 6.698 0 4.1099-7.7786 7.4443-17.37 7.4443-9.5913 0-17.37-3.3346-17.37-7.4444 0-2.9613 4.0711-5.5009 9.9257-6.698v-5.05c-9.0146 1.5607-14.889 5.9322-14.889 11.748 0 7.3038 9.1842 12.407 22.333 12.407s22.333-5.1034 22.333-12.407c0-5.8158-5.874-10.187-14.889-11.748z" fill="#af0303" stroke="#730202" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/icons/skins/default/0.svg b/icons/skins/default/tile_0.svg
similarity index 100%
rename from icons/skins/default/0.svg
rename to icons/skins/default/tile_0.svg
diff --git a/icons/skins/default/1.svg b/icons/skins/default/tile_1.svg
similarity index 100%
rename from icons/skins/default/1.svg
rename to icons/skins/default/tile_1.svg
diff --git a/icons/skins/default/2.svg b/icons/skins/default/tile_2.svg
similarity index 100%
rename from icons/skins/default/2.svg
rename to icons/skins/default/tile_2.svg
diff --git a/icons/skins/default/3.svg b/icons/skins/default/tile_3.svg
similarity index 100%
rename from icons/skins/default/3.svg
rename to icons/skins/default/tile_3.svg
diff --git a/icons/skins/default/4.svg b/icons/skins/default/tile_4.svg
similarity index 100%
rename from icons/skins/default/4.svg
rename to icons/skins/default/tile_4.svg
diff --git a/icons/skins/default/5.svg b/icons/skins/default/tile_5.svg
similarity index 100%
rename from icons/skins/default/5.svg
rename to icons/skins/default/tile_5.svg
diff --git a/icons/skins/default/6.svg b/icons/skins/default/tile_6.svg
similarity index 100%
rename from icons/skins/default/6.svg
rename to icons/skins/default/tile_6.svg
diff --git a/icons/skins/default/7.svg b/icons/skins/default/tile_7.svg
similarity index 100%
rename from icons/skins/default/7.svg
rename to icons/skins/default/tile_7.svg
diff --git a/icons/skins/default/8.svg b/icons/skins/default/tile_8.svg
similarity index 100%
rename from icons/skins/default/8.svg
rename to icons/skins/default/tile_8.svg
diff --git a/icons/skins/default/tile_flag.svg b/icons/skins/default/tile_flag.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5632b14616e723a3642892f857b1c7372f42f577
--- /dev/null
+++ b/icons/skins/default/tile_flag.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><path d="m87.221 32.63c-10.202 3.7561-17.976 6.4314-24.814 14.889-6.0921 7.5364-14.889 10.149-24.814 5.1809v27.078h-4.9628v-66.998c0-1.3716 1.1098-2.4814 2.4814-2.4814s2.4814 1.1098 2.4814 2.4814c5.5105 8.0113 15.087 9.7852 24.814 9.9257 14.889 0.21806 24.814 9.9257 24.814 9.9257zm-44.666 32.918v5.0502c5.8546 1.1971 9.9257 3.7367 9.9257 6.698 0 4.1099-7.7786 7.4443-17.37 7.4443-9.5913 0-17.37-3.3346-17.37-7.4444 0-2.9613 4.0711-5.5009 9.9257-6.698v-5.05c-9.0146 1.5607-14.889 5.9322-14.889 11.748 0 7.3038 9.1842 12.407 22.333 12.407s22.333-5.1034 22.333-12.407c0-5.8158-5.874-10.187-14.889-11.748z" fill="#e86f04" stroke="#773802" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/icons/skins/default/tile_flag_ko.svg b/icons/skins/default/tile_flag_ko.svg
new file mode 100644
index 0000000000000000000000000000000000000000..dd83b8f039f3d9b0f03a91a78c547f5c6faa2b5a
--- /dev/null
+++ b/icons/skins/default/tile_flag_ko.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><path d="m87.221 32.63c-10.202 3.7561-17.976 6.4314-24.814 14.889-6.0921 7.5364-14.889 10.149-24.814 5.1809v27.078h-4.9628v-66.998c0-1.3716 1.1098-2.4814 2.4814-2.4814s2.4814 1.1098 2.4814 2.4814c5.5105 8.0113 15.087 9.7852 24.814 9.9257 14.889 0.21806 24.814 9.9257 24.814 9.9257zm-44.666 32.918v5.0502c5.8546 1.1971 9.9257 3.7367 9.9257 6.698 0 4.1099-7.7786 7.4443-17.37 7.4443-9.5913 0-17.37-3.3346-17.37-7.4444 0-2.9613 4.0711-5.5009 9.9257-6.698v-5.05c-9.0146 1.5607-14.889 5.9322-14.889 11.748 0 7.3038 9.1842 12.407 22.333 12.407s22.333-5.1034 22.333-12.407c0-5.8158-5.874-10.187-14.889-11.748z" fill="#e80604" stroke="#770302" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/icons/skins/default/tile_flag_ok.svg b/icons/skins/default/tile_flag_ok.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a7db810dcf07cf0d6da6d5afd48c3fb12640d85c
--- /dev/null
+++ b/icons/skins/default/tile_flag_ok.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><path d="m87.221 32.63c-10.202 3.7561-17.976 6.4314-24.814 14.889-6.0921 7.5364-14.889 10.149-24.814 5.1809v27.078h-4.9628v-66.998c0-1.3716 1.1098-2.4814 2.4814-2.4814s2.4814 1.1098 2.4814 2.4814c5.5105 8.0113 15.087 9.7852 24.814 9.9257 14.889 0.21806 24.814 9.9257 24.814 9.9257zm-44.666 32.918v5.0502c5.8546 1.1971 9.9257 3.7367 9.9257 6.698 0 4.1099-7.7786 7.4443-17.37 7.4443-9.5913 0-17.37-3.3346-17.37-7.4444 0-2.9613 4.0711-5.5009 9.9257-6.698v-5.05c-9.0146 1.5607-14.889 5.9322-14.889 11.748 0 7.3038 9.1842 12.407 22.333 12.407s22.333-5.1034 22.333-12.407c0-5.8158-5.874-10.187-14.889-11.748z" fill="#5aaf03" stroke="#027302" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/icons/skins/default/mine.svg b/icons/skins/default/tile_mine.svg
similarity index 100%
rename from icons/skins/default/mine.svg
rename to icons/skins/default/tile_mine.svg
diff --git a/icons/skins/default/tile_mine_not_found.svg b/icons/skins/default/tile_mine_not_found.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f637966fac15986616dc3a7c62aaf4fc0fe13cf6
--- /dev/null
+++ b/icons/skins/default/tile_mine_not_found.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/><g transform="matrix(1.0346 0 0 1.0346 -1.7311 -1.7312)" fill="#787878" stroke="#444343" stroke-width="1.9331"><path d="m92.148 55.869c-0.626-0.939-1.482-1.519-2.568-1.739l-6.792-1.242c0.368-5.669-0.727-11.035-3.286-16.096l5.853-4.224c0.939-0.663 1.491-1.574 1.657-2.733 0.202-1.086-0.037-2.071-0.718-2.954l-0.469-0.718c-0.626-0.883-1.537-1.427-2.733-1.629-1.031-0.166-2.016 0.092-2.954 0.773l-5.632 4.059c-3.81-4.215-8.347-7.206-13.611-8.973l1.27-7.731c0.202-1.104-0.037-2.126-0.718-3.065-0.626-0.883-1.482-1.427-2.568-1.629l-0.856-0.166c-1.104-0.147-2.126 0.092-3.065 0.718-0.884 0.681-1.427 1.565-1.629 2.65l-1.16 7.427c-2.503-0.221-4.951-0.175-7.344 0.138-1.362 0.055-2.641 0.294-3.838 0.718-0.626 0.147-1.224 0.331-1.795 0.552l-3.451-7.51c-0.46-0.994-1.215-1.693-2.264-2.098-1.031-0.423-2.043-0.405-3.037 0.055l-0.773 0.414c-0.994 0.405-1.73 1.16-2.209 2.264-0.368 1.031-0.313 2.043 0.166 3.037l3.506 7.648c-0.202 0.11-0.405 0.249-0.607 0.414-5.264 3.681-9.019 8.31-11.265 13.888l-6.958-1.546c-1.086-0.276-2.098-0.074-3.037 0.607-0.994 0.534-1.592 1.344-1.795 2.43l-0.246 0.772c-0.203 1.104-0.018 2.172 0.552 3.203 0.626 0.883 1.491 1.463 2.595 1.739l6.626 1.546c-0.736 5.835 0.101 11.329 2.512 16.483l-5.411 3.672c-0.939 0.626-1.537 1.491-1.795 2.595-0.147 1.086 0.092 2.098 0.718 3.037l0.469 0.635c0.626 0.939 1.454 1.537 2.485 1.795 1.16 0.147 2.209-0.092 3.147-0.718l5.135-3.424c3.7 4.583 8.255 7.887 13.667 9.912l-1.242 6.323c-0.202 1.104 9e-3 2.154 0.635 3.147 0.626 0.883 1.482 1.427 2.568 1.629l0.801 0.166c1.086 0.258 2.098 0.101 3.037-0.469 0.939-0.681 1.509-1.574 1.712-2.678l1.242-6.074c6 0.626 11.651-0.285 16.952-2.733l4.003 6.074c0.626 0.939 1.509 1.518 2.651 1.739 1.049 0.258 2.043 0.074 2.982-0.552l0.69-0.387c0.939-0.626 1.537-1.518 1.795-2.678 0.203-1.086-9e-3 -2.098-0.635-3.037l-3.81-5.936c4.583-3.7 7.841-8.255 9.774-13.667l6.875 1.242c1.086 0.202 2.098-9e-3 3.037-0.635 0.883-0.607 1.427-1.463 1.629-2.568l0.166-0.773c0.202-1.103-0.01-2.143-0.636-3.119zm-50.085-15.013c-0.824 1.929-2.217 3.297-4.178 4.102-1.962 0.806-3.92 0.815-5.876 0.028-1.936-0.778-3.299-2.13-4.09-4.056s-0.774-3.853 0.05-5.782c0.844-1.92 2.247-3.284 4.209-4.089 1.962-0.806 3.91-0.819 5.846-0.041 1.956 0.787 3.329 2.144 4.12 4.069 0.79 1.925 0.763 3.848-0.081 5.769z" fill="#787878" stroke="#444343" stroke-width="1.9331"/></g></svg>
diff --git a/icons/skins/default/unknown.svg b/icons/skins/default/tile_unknown.svg
similarity index 100%
rename from icons/skins/default/unknown.svg
rename to icons/skins/default/tile_unknown.svg
diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart
index e2a6c0dad2cb19c305589d93875fd5bc959bdeae..30b0e1beba83884c68fef89f1799f31f548a4338 100644
--- a/lib/entities/cell.dart
+++ b/lib/entities/cell.dart
@@ -7,6 +7,7 @@ class Cell {
   bool isMined = false;
   bool isExplored = false;
   bool isMarked = false;
+  bool isExploded = false;
   int minesCountAround = 0;
 
   Cell(
@@ -14,17 +15,10 @@ class Cell {
   );
 
   Container widget(Data myProvider, int row, int col) {
-    String imageAsset = 'assets/skins/' + myProvider.skin + '_unknown.png';
+    bool showSolution = myProvider.gameWin || myProvider.gameFail;
 
-    Color backgroundColor = this.getBackgroundColor();
-
-    if (this.isExplored) {
-      if (this.isMined) {
-        imageAsset = 'assets/skins/' + myProvider.skin + '_mine.png';
-      } else {
-        imageAsset = 'assets/skins/' + myProvider.skin + '_' + this.minesCountAround.toString() + '.png';
-      }
-    }
+    Color backgroundColor = this.getBackgroundColor(myProvider);
+    String imageAsset = this.getImageAssetName(myProvider.skin, showSolution);
 
     return Container(
       decoration: BoxDecoration(
@@ -40,14 +34,64 @@ class Cell {
           fit: BoxFit.fill,
         ),
         onTap: () {
-          BoardUtils.walkOnCell(myProvider, row, col);
-          BoardUtils.checkBoardIsSolved(myProvider);
+          if (!(myProvider.gameWin || myProvider.gameFail)) {
+            if (myProvider.reportMode) {
+              BoardUtils.reportCell(myProvider, row, col);
+            } else {
+              BoardUtils.walkOnCell(myProvider, row, col);
+            }
+          }
+          BoardUtils.checkGameIsFinished(myProvider);
         },
       ),
     );
   }
 
-  Color getBackgroundColor() {
+  String getImageAssetName(String skin, bool showSolution) {
+    String imageAsset = 'assets/skins/' + skin + '_tile_unknown.png';
+
+    if (!showSolution) {
+      // Running game
+      if (this.isExplored) {
+        if (this.isMined) {
+          // Boom
+          imageAsset = 'assets/skins/' + skin + '_tile_mine.png';
+        } else {
+          // Show mines count around
+          imageAsset = 'assets/skins/' + skin + '_tile_' + this.minesCountAround.toString() + '.png';
+        }
+      } else {
+        if (this.isMarked) {
+          // Danger!
+          imageAsset = 'assets/skins/' + skin + '_tile_flag.png';
+        }
+      }
+    } else {
+      // Finished game
+      if (this.isMined) {
+        if (this.isExploded) {
+          // Mine exploded
+          imageAsset = 'assets/skins/' + skin + '_tile_mine.png';
+        } else {
+          // Mine not found
+          imageAsset = 'assets/skins/' + skin + '_tile_mine_not_found.png';
+        }
+      } else {
+        // Show all mines counts
+        imageAsset = 'assets/skins/' + skin + '_tile_' + this.minesCountAround.toString() + '.png';
+      }
+    }
+
+    return imageAsset;
+  }
+
+  Color getBackgroundColor(Data myProvider) {
+    if (myProvider.gameWin) {
+      return Colors.green[300];
+    } else if (myProvider.gameFail) {
+      return Colors.pink[200];
+    }
+
     return Colors.white;
   }
 }
diff --git a/lib/layout/board.dart b/lib/layout/board.dart
index b5e1d1263d986559bb3ead5b1defaf79c9498da4..f3336057ba084a331e33ea69d5c1d43ea189262a 100644
--- a/lib/layout/board.dart
+++ b/lib/layout/board.dart
@@ -5,14 +5,16 @@ import '../provider/data.dart';
 class Board {
 
   static Container buildGameBoard(Data myProvider) {
+    Color borderColor = myProvider.reportMode ? Colors.blue : Colors.black;
+
     return Container(
       margin: EdgeInsets.all(2),
       padding: EdgeInsets.all(2),
       decoration: BoxDecoration(
-        color: Colors.black,
+        color: borderColor,
         borderRadius: BorderRadius.circular(2),
         border: Border.all(
-          color: Colors.black,
+          color: borderColor,
           width: 2,
         ),
       ),
@@ -41,4 +43,40 @@ class Board {
     );
   }
 
+  static FlatButton buildToggleFlagModeButton(Data myProvider) {
+    String reportModeSuffix = myProvider.reportMode ? 'on' : 'off';
+
+    return FlatButton(
+      child: Container(
+        child: Image(
+          image: AssetImage('assets/skins/' + myProvider.skin  + '_button_mark_mine_' + reportModeSuffix + '.png'),
+          fit: BoxFit.fill,
+        ),
+      ),
+      onPressed: () => myProvider.updateReportMode(!myProvider.reportMode),
+    );
+  }
+
+  static Table buildToggleFlagModeLayout(Data myProvider) {
+    Image paddingBlock = Image(
+      image: AssetImage('assets/skins/empty.png'),
+      fit: BoxFit.fill,
+    );
+
+    return Table(
+      defaultColumnWidth: IntrinsicColumnWidth(),
+      children: [
+        TableRow(
+          children: [
+            TableCell(child: paddingBlock),
+            TableCell(child: paddingBlock),
+            TableCell(child: buildToggleFlagModeButton(myProvider)),
+            TableCell(child: paddingBlock),
+            TableCell(child: paddingBlock),
+          ],
+        ),
+      ],
+    );
+  }
+
 }
diff --git a/lib/layout/game.dart b/lib/layout/game.dart
index 8333c64de56f4bea171098b41fc89afde2d810ce..5b226c80aa6378a47e5e0ef8802940d94ad2b1dc 100644
--- a/lib/layout/game.dart
+++ b/lib/layout/game.dart
@@ -14,7 +14,9 @@ class Game {
         children: [
           Board.buildGameBoard(myProvider),
           SizedBox(height: 2),
-          (myProvider.gameWin || myProvider.gameFail) ? Game.buildEndGameMessage(myProvider) : SizedBox(height: 2),
+          (myProvider.gameWin || myProvider.gameFail)
+            ? Game.buildEndGameMessage(myProvider)
+            : Board.buildToggleFlagModeLayout(myProvider)
         ],
       ),
     );
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index d637afad75b6ffc73ceff166a5f68bc08a3a650f..4f571d83827915d74a6785aafe09250c0dd5b03a 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -15,9 +15,10 @@ class Data extends ChangeNotifier {
   String _skin = 'default';
 
   // Game data
-  bool _stateRunning = false;
+  bool _gameRunning = false;
   bool _gameWin = false;
   bool _gameFail = false;
+  bool _reportMode = false;
   int _sizeVertical = null;
   int _sizeHorizontal = null;
   List _cells = [];
@@ -79,12 +80,22 @@ class Data extends ChangeNotifier {
 
   void setCellAsExplored(int row, int col) {
     _cells[row][col].isExplored = true;
+    if (_cells[row][col].isMined) {
+      _cells[row][col].isExploded = true;
+    };
+
+    notifyListeners();
+  }
+
+  void toggleCellMark(int row, int col) {
+    _cells[row][col].isMarked = !_cells[row][col].isMarked;
+    updateReportMode(false);
     notifyListeners();
   }
 
-  bool get stateRunning => _stateRunning;
-  void updateStateRunning(bool stateRunning) {
-    _stateRunning = stateRunning;
+  bool get gameRunning => _gameRunning;
+  void updateGameRunning(bool gameRunning) {
+    _gameRunning = gameRunning;
     updateGameWin(false);
     updateGameFail(false);
     notifyListeners();
@@ -92,15 +103,19 @@ class Data extends ChangeNotifier {
 
   bool get gameWin => _gameWin;
   void updateGameWin(bool gameWin) {
-    print('updateGameWin: ' + (gameWin ? 'true' : 'false'));
     _gameWin = gameWin;
     notifyListeners();
   }
 
   bool get gameFail => _gameFail;
   void updateGameFail(bool gameFail) {
-    print('updateGameFail: ' + (gameFail ? 'true' : 'false'));
     _gameFail = gameFail;
     notifyListeners();
   }
+
+  bool get reportMode => _reportMode;
+  void updateReportMode(bool reportMode) {
+    _reportMode = reportMode;
+    notifyListeners();
+  }
 }
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 39c0be2fa8e96df70f1f4e55e4b61a2a9be8b170..204be18a3d6204578b4c7596fe415b1cca727446 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -15,7 +15,7 @@ class Home extends StatelessWidget {
 
     List<Widget> menuActions = [];
 
-    if (myProvider.stateRunning) {
+    if (myProvider.gameRunning) {
       menuActions = [
         FlatButton(
           child: Container(
@@ -43,7 +43,7 @@ class Home extends StatelessWidget {
       ),
       body: SafeArea(
         child: Center(
-          child: myProvider.stateRunning
+          child: myProvider.gameRunning
             ? Game.buildGameWidget(myProvider)
             : Parameters.buildParametersSelector(myProvider)
         ),
diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart
index 743a832d0d6e80344604d465bf4674cb59c1b0a6..39df1a59b026458a737bfd817540a46c3913e2d6 100644
--- a/lib/utils/board_utils.dart
+++ b/lib/utils/board_utils.dart
@@ -5,15 +5,20 @@ class BoardUtils {
 
   static printGrid(List cells) {
     print('');
-    print('-------');
+    String line = '--';
+    for (var i = 0; i < cells[0].length; i++) {
+      line += '-';
+    }
+    print(line);
     for (var rowIndex = 0; rowIndex < cells.length; rowIndex++) {
-      String row = '';
+      String row = '|';
       for (var colIndex = 0; colIndex < cells[rowIndex].length; colIndex++) {
         row += cells[rowIndex][colIndex].isMined ? 'X' : '.';
       }
+      row += '|';
       print(row);
     }
-    print('-------');
+    print(line);
     print('');
   }
 
@@ -89,8 +94,13 @@ class BoardUtils {
     return cells;
   }
 
+  static void reportCell(Data myProvider, int row, int col) {
+    if (!myProvider.cells[row][col].isExplored) {
+      myProvider.toggleCellMark(row, col);
+    }
+  }
+
   static void walkOnCell(Data myProvider, int row, int col) {
-    print('Walk on cell [' + col.toString() + ',' + row.toString() + ']');
     myProvider.setCellAsExplored(row, col);
 
     if (myProvider.cells[row][col].minesCountAround == 0) {
@@ -154,8 +164,7 @@ class BoardUtils {
     return minesCountAround;
   }
 
-  static bool checkBoardIsSolved(Data myProvider) {
-    print('checkBoardIsSolved');
+  static bool checkGameIsFinished(Data myProvider) {
     List cells = myProvider.cells;
     int sizeHorizontal = cells.length;
     int sizeVertical = cells[0].length;
@@ -166,7 +175,7 @@ class BoardUtils {
     for (var row = 0; row < sizeVertical; row++) {
       for (var col = 0; col < sizeHorizontal; col++) {
         // Walked on a mine
-        if (cells[row][col].isMined == true && cells[row][col].isExplored == true) {
+        if (cells[row][col].isExploded == true) {
           myProvider.updateGameFail(true);
           return false;
         }
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
index 03e51b7743f9243613e7b56814a6f9ba8b1b13b3..909c1ed4a1ea9e202d456a8f1af854c664579eb5 100644
--- a/lib/utils/game_utils.dart
+++ b/lib/utils/game_utils.dart
@@ -4,13 +4,13 @@ import '../utils/board_utils.dart';
 class GameUtils {
 
   static void resetGame(Data myProvider) {
-    myProvider.updateStateRunning(false);
+    myProvider.updateGameRunning(false);
   }
 
   static void startGame(Data myProvider) {
     print('Starting game: ' + myProvider.size + ' - ' + myProvider.level);
     myProvider.updateSize(myProvider.size);
-    myProvider.updateStateRunning(true);
+    myProvider.updateGameRunning(true);
     myProvider.updateCells(
       BoardUtils.createBoard(
         myProvider.sizeHorizontal,
@@ -19,4 +19,5 @@ class GameUtils {
       )
     );
   }
+
 }
diff --git a/pubspec.lock b/pubspec.lock
index f57afd81a9fe9091b34d0f271f0797d0475ce325..b6eca0d9a310f699c2be40fd6273acfa381332e9 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -28,7 +28,7 @@ packages:
       name: charcode
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.0"
+    version: "1.3.1"
   clock:
     dependency: transitive
     description:
@@ -73,7 +73,7 @@ packages:
       name: meta
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.4.0"
+    version: "1.7.0"
   nested:
     dependency: transitive
     description:
@@ -141,7 +141,7 @@ packages:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.4.0"
+    version: "0.4.1"
   typed_data:
     dependency: transitive
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 3915ac927c74635e0da63a07d902a9d06fca2292..2b41f4f19fe230f65d2edd16a773e2f321c5f59b 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -18,6 +18,5 @@ dev_dependencies:
 flutter:
   uses-material-design: true
   assets:
-    - assets/files/
     - assets/icons/
     - assets/skins/