diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 2190b0d63c46da1cfa094f94d66f704f857b1b02..dc15ee628f7177a580ef98e422d9dca8c4eeda7a 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index f415ae518ea5e1a78a4b331c77645910a0ad747a..529e815fd61d038c1926597ca22107698db91d5c 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 834b9e159e8fe99f414b3521fe00cc3a2442d0c4..6e418ccb8c0113202ff7aa87e81df01520f7c8a4 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 4f3ecfdb31e77bbcddd5de725013e9d93ef249ca..02a4bb425d3643216956ee9dada28b3f82f65732 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 8a46c7dd21392d2da3157b2a8819b0cee05645bc..03c4f788b5ffb1b704e31a38c96561ff33bfb218 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/gradle.properties b/android/gradle.properties
index 39095cdb7e3dfda047b9a1377b98f5bd5264f096..ba519afb93ab69c86196532ef532b852aa7544ef 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.1.1
-app.versionCode=22
+app.versionName=0.1.2
+app.versionCode=23
diff --git a/assets/icons/button_back.png b/assets/icons/button_back.png
index 2a802ff2d2bc0c90488a1c319288be9f28cdea5e..cc48ffb1dbb653d9a996f139dfbe02969724bfa5 100644
Binary files a/assets/icons/button_back.png and b/assets/icons/button_back.png differ
diff --git a/assets/icons/button_start.png b/assets/icons/button_start.png
index 0a3b74a3b98f45de590a7f290b810daba7120912..6845e2f5c21598ab61f1684d2075aeec0334bf23 100644
Binary files a/assets/icons/button_start.png and b/assets/icons/button_start.png differ
diff --git a/assets/icons/game_fail.png b/assets/icons/game_fail.png
index e93f8fa2815c0bac52c52a719f296671ac841e08..7b44ea172df6a8652ef54713161cb78feaf48c36 100644
Binary files a/assets/icons/game_fail.png and b/assets/icons/game_fail.png differ
diff --git a/assets/icons/game_win.png b/assets/icons/game_win.png
index d73741df40e8cb97e2bf0eec929bba2e7859459a..876334279c1711b349a62131a33607eecf924eb6 100644
Binary files a/assets/icons/game_win.png and b/assets/icons/game_win.png differ
diff --git a/assets/icons/difficulty_easy.png b/assets/icons/level_easy.png
similarity index 100%
rename from assets/icons/difficulty_easy.png
rename to assets/icons/level_easy.png
diff --git a/assets/icons/difficulty_hard.png b/assets/icons/level_hard.png
similarity index 100%
rename from assets/icons/difficulty_hard.png
rename to assets/icons/level_hard.png
diff --git a/assets/icons/difficulty_medium.png b/assets/icons/level_medium.png
similarity index 100%
rename from assets/icons/difficulty_medium.png
rename to assets/icons/level_medium.png
diff --git a/assets/icons/difficulty_nightmare.png b/assets/icons/level_nightmare.png
similarity index 100%
rename from assets/icons/difficulty_nightmare.png
rename to assets/icons/level_nightmare.png
diff --git a/assets/icons/skin_default.png b/assets/icons/skin_default.png
new file mode 100644
index 0000000000000000000000000000000000000000..43dc59805c9f2d9d171b9e54bdccb8c82728d18b
Binary files /dev/null and b/assets/icons/skin_default.png differ
diff --git a/assets/skins/empty.png b/assets/skins/default_empty.png
similarity index 62%
rename from assets/skins/empty.png
rename to assets/skins/default_empty.png
index 586de0573e7f77d97c16942f603b8ee6d9c7d7bc..ccf68cb815852c4470ac3239588c86755459b0f1 100644
Binary files a/assets/skins/empty.png and b/assets/skins/default_empty.png differ
diff --git a/assets/skins/default_tile_0.png b/assets/skins/default_tile_0.png
index 586de0573e7f77d97c16942f603b8ee6d9c7d7bc..ccf68cb815852c4470ac3239588c86755459b0f1 100644
Binary files a/assets/skins/default_tile_0.png and b/assets/skins/default_tile_0.png differ
diff --git a/assets/skins/default_tile_1.png b/assets/skins/default_tile_1.png
index 23690a6cd9133c42af5c1222b19634639f041572..ce1226bde73c449735d59f05d07bb1457bb75e76 100644
Binary files a/assets/skins/default_tile_1.png and b/assets/skins/default_tile_1.png differ
diff --git a/assets/skins/default_tile_2.png b/assets/skins/default_tile_2.png
index ec9272a8c8476f89c5abfb7c0155ee425c861dd5..e4273c6736467fdec9648ef028a55c3df8d3c1d8 100644
Binary files a/assets/skins/default_tile_2.png and b/assets/skins/default_tile_2.png differ
diff --git a/assets/skins/default_tile_3.png b/assets/skins/default_tile_3.png
index 9f546a2f252a142b1947ab99cab5fcd01abfbef4..a31c05d5f181510b08eccbab0e1934a110032fba 100644
Binary files a/assets/skins/default_tile_3.png and b/assets/skins/default_tile_3.png differ
diff --git a/assets/skins/default_tile_4.png b/assets/skins/default_tile_4.png
index 007939df9809ddaab453b71efcbe4e611d08810d..c52c163bf2c8f601112d64a46aed8d6ec482b35e 100644
Binary files a/assets/skins/default_tile_4.png and b/assets/skins/default_tile_4.png differ
diff --git a/assets/skins/default_tile_5.png b/assets/skins/default_tile_5.png
index 39231465aa288a4fca4f6a8b30d66d6eab6cb90a..b121af0436b0b389f5cfe3aa2a90d53e90ccc163 100644
Binary files a/assets/skins/default_tile_5.png and b/assets/skins/default_tile_5.png differ
diff --git a/assets/skins/default_tile_6.png b/assets/skins/default_tile_6.png
index 567407e037578be6f15251e0f101936794a48701..72991dd3f088a90a8b66fecbaffe3981917c2c49 100644
Binary files a/assets/skins/default_tile_6.png and b/assets/skins/default_tile_6.png differ
diff --git a/assets/skins/default_tile_7.png b/assets/skins/default_tile_7.png
index 0687e540437da95f865fc7df85d98df478b68f20..da6ac1f0e936083d1de5e16585446a7cffa5fe7e 100644
Binary files a/assets/skins/default_tile_7.png and b/assets/skins/default_tile_7.png differ
diff --git a/assets/skins/default_tile_8.png b/assets/skins/default_tile_8.png
index 45fa69284816659672cea66e446ea9de00c37755..ed3ee8a1ddcd7a88ae88c49dd7cef4b900699313 100644
Binary files a/assets/skins/default_tile_8.png and b/assets/skins/default_tile_8.png differ
diff --git a/assets/skins/default_tile_flag.png b/assets/skins/default_tile_flag.png
index 15f2f2f76b687665b134492e44acaef589850bd2..26a6d87c8db47a1f4f810b7427802e412098f42c 100644
Binary files a/assets/skins/default_tile_flag.png 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
index 9e8598af1fd30b3c1bdf524bd815b18d3d1ef9c6..3d4a2394a98b8cd33b08179acd9110363ee60f69 100644
Binary files a/assets/skins/default_tile_flag_ko.png 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
index 6f87550f930b4ae093d7620d4616f51a4f1139fc..ebed430a242c8737cc0e0e9ab22a4e4cbd7e1ed5 100644
Binary files a/assets/skins/default_tile_flag_ok.png and b/assets/skins/default_tile_flag_ok.png differ
diff --git a/assets/skins/default_tile_mine.png b/assets/skins/default_tile_mine.png
index 044c7333ce662fb1f15217d55376e8f751975fb0..59bf2cad7dc992c70663f20c2e0e4475b75afe9e 100644
Binary files a/assets/skins/default_tile_mine.png and b/assets/skins/default_tile_mine.png differ
diff --git a/assets/skins/default_tile_mine_not_found.png b/assets/skins/default_tile_mine_not_found.png
index 0c27686a2a9428932261ed88254e76bfb78a2385..30cf53bad717999638460361163b9c7de5b16faf 100644
Binary files a/assets/skins/default_tile_mine_not_found.png and b/assets/skins/default_tile_mine_not_found.png differ
diff --git a/fastlane/metadata/android/en-US/changelogs/23.txt b/fastlane/metadata/android/en-US/changelogs/23.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d316a3a9e2cd0814c079bd68b869092285f5edbd
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/23.txt
@@ -0,0 +1 @@
+Upgrade flutter framework and dependencies, update/clean code, improve layout
diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png
new file mode 100644
index 0000000000000000000000000000000000000000..d94cd4c48e61c0b2a131b828585ef141878cbe03
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/featureGraphic.png differ
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
index a8cff21a3902028c01974a4f3062e10c15544ee9..cab28c740485b7246719d8d443bbf4a403c2955e 100644
Binary files a/fastlane/metadata/android/en-US/images/icon.png and b/fastlane/metadata/android/en-US/images/icon.png differ
diff --git a/fastlane/metadata/android/fr-FR/changelogs/23.txt b/fastlane/metadata/android/fr-FR/changelogs/23.txt
new file mode 100644
index 0000000000000000000000000000000000000000..830875451ccfb7d1252c5566031e61457141844c
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/23.txt
@@ -0,0 +1 @@
+Mise à jour du framework Flutter et de ses dépendances, améliorations de code et d'affichage
diff --git a/icons/build_application_icons.sh b/icons/build_application_icons.sh
index 569a16a50dd3015a45c291a93305ff0f67f77c72..d6f1696bb114b1713bc49f5e88b27ea89607768e 100755
--- a/icons/build_application_icons.sh
+++ b/icons/build_application_icons.sh
@@ -9,8 +9,20 @@ CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
 BASE_DIR="$(dirname "${CURRENT_DIR}")"
 
 SOURCE="${CURRENT_DIR}/icon.svg"
+SOURCE_FASTLANE="${CURRENT_DIR}/featureGraphic.svg"
+
 OPTIPNG_OPTIONS="-preserve -quiet -o7"
 
+if [ ! -f "${SOURCE}" ]; then
+  echo "Missing file: ${SOURCE}"
+  exit 1
+fi
+
+if [ ! -f "${SOURCE_FASTLANE}" ]; then
+  echo "Missing file: ${SOURCE_FASTLANE}"
+  exit 1
+fi
+
 # optimize svg
 cp ${SOURCE} ${SOURCE}.tmp
 scour \
@@ -19,6 +31,7 @@ scour \
     --enable-viewboxing \
     --enable-comment-stripping \
     --nindent=4 \
+    --quiet \
     -i ${SOURCE}.tmp \
     -o ${SOURCE}
 rm ${SOURCE}.tmp
@@ -28,6 +41,8 @@ function build_icon() {
   ICON_SIZE="$1"
   TARGET="$2"
 
+  echo "Building ${TARGET}"
+
   TARGET_PNG="${TARGET}.png"
 
   inkscape \
@@ -39,6 +54,36 @@ function build_icon() {
   optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
 }
 
+# build fastlane image
+function build_fastlane_image() {
+  WIDTH="$1"
+  HEIGHT="$2"
+  TARGET="$3"
+
+  echo "Building ${TARGET}"
+
+  cp ${SOURCE_FASTLANE} ${SOURCE_FASTLANE}.tmp
+  scour \
+      --remove-descriptive-elements \
+      --enable-id-stripping \
+      --enable-viewboxing \
+      --enable-comment-stripping \
+      --nindent=4 \
+      --quiet \
+      -i ${SOURCE_FASTLANE}.tmp \
+      -o ${SOURCE_FASTLANE}
+  rm ${SOURCE_FASTLANE}.tmp
+
+  TARGET_PNG="${TARGET}.png"
+
+  inkscape \
+      --export-width=${WIDTH} \
+      --export-height=${HEIGHT} \
+      --export-filename=${TARGET_PNG} \
+      ${SOURCE_FASTLANE}
+
+  optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
+}
 
 build_icon  72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher
 build_icon  48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher
@@ -46,3 +91,5 @@ build_icon  96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher
 build_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher
 build_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher
 build_icon 512 ${BASE_DIR}/fastlane/metadata/android/en-US/images/icon
+
+build_fastlane_image 1024 500 ${BASE_DIR}/fastlane/metadata/android/en-US/images/featureGraphic
diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh
index c57007a1e5f24a31a3900295cb5af3190164cc35..b3b2c88f5f94ae6d9b4181af5aed406c0a21dca9 100755
--- a/icons/build_game_icons.sh
+++ b/icons/build_game_icons.sh
@@ -7,8 +7,55 @@ command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not
 
 CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
 BASE_DIR="$(dirname "${CURRENT_DIR}")"
+ASSETS_DIR="${BASE_DIR}/assets"
 
 OPTIPNG_OPTIONS="-preserve -quiet -o7"
+ICON_SIZE=192
+
+#######################################################
+
+# Game images
+AVAILABLE_GAME_IMAGES="
+  button_back
+  button_start
+  game_fail
+  game_win
+"
+
+# Settings images
+AVAILABLES_GAME_SETTINGS="
+  level:easy,medium,hard,nightmare
+  size:10x10,15x15,20x20
+"
+
+# Skins
+AVAILABLE_SKINS="
+  default
+"
+
+# Images per skin
+SKIN_IMAGES="
+  empty
+  tile_0
+  tile_1
+  tile_2
+  tile_3
+  tile_4
+  tile_5
+  tile_6
+  tile_7
+  tile_8
+  tile_flag_ko
+  tile_flag_ok
+  tile_flag
+  tile_mine_not_found
+  tile_mine
+  tile_unknown
+  button_mark_mine_on
+  button_mark_mine_off
+"
+
+#######################################################
 
 # optimize svg
 function optimize_svg() {
@@ -21,6 +68,7 @@ function optimize_svg() {
       --enable-viewboxing \
       --enable-comment-stripping \
       --nindent=4 \
+      --quiet \
       -i ${SOURCE}.tmp \
       -o ${SOURCE}
   rm ${SOURCE}.tmp
@@ -28,10 +76,16 @@ function optimize_svg() {
 
 # build icons
 function build_icon() {
-  ICON_SIZE=192
   SOURCE="$1"
   TARGET="$2"
 
+  echo "Building ${TARGET}"
+
+  if [ ! -f "${SOURCE}" ]; then
+    echo "Missing file: ${SOURCE}"
+    exit 1
+  fi
+
   optimize_svg "${SOURCE}"
 
   inkscape \
@@ -43,46 +97,56 @@ function build_icon() {
   optipng ${OPTIPNG_OPTIONS} ${TARGET}
 }
 
-function build_icons_for_skin() {
-  SKIN_CODE="$1"
+function build_settings_icons() {
+  INPUT_STRING="$1"
 
-  build_icon_for_skin ${SKIN_CODE} button_mark_mine_on
-  build_icon_for_skin ${SKIN_CODE} button_mark_mine_off
+  SETTING_NAME="$(echo "${INPUT_STRING}" | cut -d":" -f1)"
+  SETTING_VALUES="$(echo "${INPUT_STRING}" | cut -d":" -f2 | tr "," " ")"
 
-  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};
+  for SETTING_VALUE in ${SETTING_VALUES}
   do
-    build_icon_for_skin ${SKIN_CODE} tile_${VALUE}
+    SETTING_CODE="${SETTING_NAME}_${SETTING_VALUE}"
+    build_icon ${CURRENT_DIR}/${SETTING_CODE}.svg ${ASSETS_DIR}/icons/${SETTING_CODE}.png
   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
-}
+  # skin main image
+  build_icon ${CURRENT_DIR}/skin_${SKIN_CODE}.svg ${ASSETS_DIR}/icons/skin_${SKIN_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
-build_icon ${CURRENT_DIR}/difficulty_easy.svg ${BASE_DIR}/assets/icons/difficulty_easy.png
-build_icon ${CURRENT_DIR}/difficulty_medium.svg ${BASE_DIR}/assets/icons/difficulty_medium.png
-build_icon ${CURRENT_DIR}/difficulty_hard.svg ${BASE_DIR}/assets/icons/difficulty_hard.png
-build_icon ${CURRENT_DIR}/difficulty_nightmare.svg ${BASE_DIR}/assets/icons/difficulty_nightmare.png
-build_icon ${CURRENT_DIR}/game_fail.svg ${BASE_DIR}/assets/icons/game_fail.png
-build_icon ${CURRENT_DIR}/game_win.svg ${BASE_DIR}/assets/icons/game_win.png
-build_icon ${CURRENT_DIR}/size_10x10.svg ${BASE_DIR}/assets/icons/size_10x10.png
-build_icon ${CURRENT_DIR}/size_15x15.svg ${BASE_DIR}/assets/icons/size_15x15.png
-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
+  # skin images
+  for SKIN_IMAGE in ${SKIN_IMAGES}
+  do
+    build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/${SKIN_IMAGE}.svg ${ASSETS_DIR}/skins/${SKIN_CODE}_${SKIN_IMAGE}.png
+  done
+}
 
-# Skins
-build_icons_for_skin "default"
+#######################################################
+
+# Create output folders
+mkdir -p ${ASSETS_DIR}/icons
+mkdir -p ${ASSETS_DIR}/skins
+
+# Delete existing generated images
+find ${ASSETS_DIR}/icons -type f -name "*.png" -delete
+find ${ASSETS_DIR}/skins -type f -name "*.png" -delete
+
+# build game images
+for GAME_IMAGE in ${AVAILABLE_GAME_IMAGES}
+do
+  build_icon ${CURRENT_DIR}/${GAME_IMAGE}.svg ${ASSETS_DIR}/icons/${GAME_IMAGE}.png
+done
+
+# build settings images
+for GAME_SETTING in ${AVAILABLES_GAME_SETTINGS}
+do
+  build_settings_icons "${GAME_SETTING}"
+done
+
+# build skins images
+for SKIN in ${AVAILABLE_SKINS}
+do
+  build_icon_for_skin "${SKIN}"
+done
diff --git a/icons/featureGraphic.svg b/icons/featureGraphic.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2033f317c082bce27115e88ca068d358b08318d0
--- /dev/null
+++ b/icons/featureGraphic.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 1024 500" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="1024" height="500" rx="0" ry="0" fill="#977cff"/></svg>
diff --git a/icons/difficulty_easy.svg b/icons/level_easy.svg
similarity index 100%
rename from icons/difficulty_easy.svg
rename to icons/level_easy.svg
diff --git a/icons/difficulty_hard.svg b/icons/level_hard.svg
similarity index 100%
rename from icons/difficulty_hard.svg
rename to icons/level_hard.svg
diff --git a/icons/difficulty_medium.svg b/icons/level_medium.svg
similarity index 100%
rename from icons/difficulty_medium.svg
rename to icons/level_medium.svg
diff --git a/icons/difficulty_nightmare.svg b/icons/level_nightmare.svg
similarity index 100%
rename from icons/difficulty_nightmare.svg
rename to icons/level_nightmare.svg
diff --git a/icons/skin_default.svg b/icons/skin_default.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bb34f915009a3b22734bec8c85090bcb036d3e63
--- /dev/null
+++ b/icons/skin_default.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 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#a4a4a4" stroke="#000" stroke-width="2"/><rect x="-15.387" y="-20.515" width="100" height="100" ry="2" fill="none"/></svg>
diff --git a/icons/skins/empty.svg b/icons/skins/default/empty.svg
similarity index 100%
rename from icons/skins/empty.svg
rename to icons/skins/default/empty.svg
diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart
index 394ea51f348e7e37ecd84cfe9c9e1ece33d82e03..e4ad3b2faded8e7947ed38124128f247cc76cdf8 100644
--- a/lib/entities/cell.dart
+++ b/lib/entities/cell.dart
@@ -67,7 +67,7 @@ class Cell {
   * Compute image asset name, from skin and cell value/state
   */
   String getImageAssetName(Data myProvider) {
-    String imageAsset = 'assets/skins/' + myProvider.skin + '_tile_unknown.png';
+    String imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_unknown.png';
 
     bool showSolution = myProvider.gameWin || myProvider.gameFail;
     if (!showSolution) {
@@ -75,15 +75,15 @@ class Cell {
       if (this.isExplored) {
         if (this.isMined) {
           // Boom
-          imageAsset = 'assets/skins/' + myProvider.skin + '_tile_mine.png';
+          imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine.png';
         } else {
           // Show mines count around
-          imageAsset = 'assets/skins/' + myProvider.skin + '_tile_' + this.minesCountAround.toString() + '.png';
+          imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_' + this.minesCountAround.toString() + '.png';
         }
       } else {
         if (this.isMarked) {
           // Danger!
-          imageAsset = 'assets/skins/' + myProvider.skin + '_tile_flag.png';
+          imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_flag.png';
         }
       }
     } else {
@@ -91,14 +91,14 @@ class Cell {
       if (this.isMined) {
         if (this.isExploded) {
           // Mine exploded
-          imageAsset = 'assets/skins/' + myProvider.skin + '_tile_mine.png';
+          imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine.png';
         } else {
           // Mine not found
-          imageAsset = 'assets/skins/' + myProvider.skin + '_tile_mine_not_found.png';
+          imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine_not_found.png';
         }
       } else {
         // Show all mines counts
-        imageAsset = 'assets/skins/' + myProvider.skin + '_tile_' + this.minesCountAround.toString() + '.png';
+        imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_' + this.minesCountAround.toString() + '.png';
       }
     }
 
@@ -108,18 +108,18 @@ class Cell {
   // Compute cell background color, from cell state
   Color getBackgroundColor(Data myProvider) {
     if (myProvider.gameWin) {
-      return this.isAnimated ? Colors.green[400] : Colors.green[500];
+      return this.isAnimated ? Colors.green.shade400 : Colors.green.shade500;
     }
     if (myProvider.gameFail) {
-      return this.isAnimated ? Colors.pink[200] : Colors.pink[400];
+      return this.isAnimated ? Colors.pink.shade200 : Colors.pink.shade400;
     }
 
-    return this.isAnimated ? Colors.white : Colors.grey[200];
+    return this.isAnimated ? Colors.white : Colors.grey.shade200;
   }
 
   // Compute cell borders, from board size and cell state
   Border getCellBorders(Data myProvider, int row, int col) {
-    Color cellBorderColor = Colors.grey[500];
+    Color cellBorderColor = Colors.grey.shade500;
     double cellBorderWidth = 4;
 
     // Reduce cell border width on big boards
@@ -132,9 +132,9 @@ class Cell {
     }
 
     if (myProvider.gameWin) {
-      cellBorderColor = Colors.green[700];
+      cellBorderColor = Colors.green.shade700;
     } else if (myProvider.gameFail) {
-      cellBorderColor = Colors.pink[300];
+      cellBorderColor = Colors.pink.shade300;
     }
 
     Border borders = Border.all(
diff --git a/lib/layout/board.dart b/lib/layout/board.dart
index 9e4df1e2df752496855747dc6d4cb51eab7c0362..bec58cad43e68d42dea6107b859547b533ebee06 100644
--- a/lib/layout/board.dart
+++ b/lib/layout/board.dart
@@ -6,11 +6,22 @@ import '../utils/board_utils.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),
+      child: Column(
+        children: [
+          buildGameTileset(myProvider)
+        ],
+      ),
+    );
+  }
+
+  static Widget buildGameTileset(Data myProvider) {
+    List cells = myProvider.cells;
+    Color borderColor = myProvider.reportMode ? Colors.blue : Colors.black;
+
+    return Container(
       decoration: BoxDecoration(
         color: borderColor,
         borderRadius: BorderRadius.circular(2),
@@ -19,43 +30,33 @@ class Board {
           width: 2,
         ),
       ),
-      child: Column(
+      child: Table(
+        defaultColumnWidth: IntrinsicColumnWidth(),
         children: [
-          buildGameTileset(myProvider),
-          buildMinesCounterWidget(myProvider),
-        ],
+          for (var row = 0; row < myProvider.sizeVertical; row++)
+            TableRow(children: [
+              for (var col = 0; col < myProvider.sizeHorizontal; col++)
+                Column(children: [
+                  cells[row][col].widget(
+                    myProvider,
+                    row,
+                    col
+                  )
+                ]),
+            ],
+          ),
+        ]
       ),
     );
   }
 
-  static Table buildGameTileset(Data myProvider) {
-    List cells = myProvider.cells;
-
-    return Table(
-      defaultColumnWidth: IntrinsicColumnWidth(),
-      children: [
-        for (var row = 0; row < myProvider.sizeVertical; row++)
-          TableRow(children: [
-            for (var col = 0; col < myProvider.sizeHorizontal; col++)
-              Column(children: [
-                cells[row][col].widget(
-                  myProvider,
-                  row,
-                  col
-                )
-              ]),
-          ]),
-      ]
-    );
-  }
-
   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'),
+          image: AssetImage('assets/skins/' + myProvider.parameterSkin  + '_button_mark_mine_' + reportModeSuffix + '.png'),
           fit: BoxFit.fill,
         ),
       ),
@@ -63,9 +64,9 @@ class Board {
     );
   }
 
-  static Table buildToggleFlagModeLayout(Data myProvider) {
+  static Widget buildToggleFlagModeLayout(Data myProvider) {
     Image paddingBlock = Image(
-      image: AssetImage('assets/skins/empty.png'),
+      image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_empty.png'),
       fit: BoxFit.fill,
     );
 
@@ -85,56 +86,4 @@ class Board {
     );
   }
 
-  static Widget buildMinesCounterWidget(Data myProvider) {
-    int flaggedCellsCount = BoardUtils.countFlaggedCells(myProvider.cells);
-    int minesCount = myProvider.minesCount;
-    double blockSize = 40;
-
-    Image flagIconBlock = Image(
-      image: AssetImage('assets/skins/' + myProvider.skin + '_tile_flag.png'),
-      fit: BoxFit.fill,
-      height: blockSize,
-      width: blockSize,
-    );
-    Image mineIconBlock = Image(
-      image: AssetImage('assets/skins/' + myProvider.skin + '_tile_mine.png'),
-      fit: BoxFit.fill,
-      height: blockSize,
-      width: blockSize,
-    );
-    Text markedMinesCountBlock = Text(
-      flaggedCellsCount.toString(),
-      style: TextStyle(
-        fontSize: blockSize,
-        fontWeight: FontWeight.bold,
-        color: Colors.white
-      ),
-    );
-    Text placedMinesCountBlock = Text(
-      minesCount.toString(),
-      style: TextStyle(
-        fontSize: blockSize,
-        fontWeight: FontWeight.bold,
-        color: Colors.white
-      ),
-    );
-
-    return Column(
-      mainAxisAlignment: MainAxisAlignment.center,
-      crossAxisAlignment: CrossAxisAlignment.center,
-      children: [
-        Row(
-          mainAxisAlignment: MainAxisAlignment.center,
-          crossAxisAlignment: CrossAxisAlignment.center,
-          children: [
-            markedMinesCountBlock,
-            flagIconBlock,
-            SizedBox(width: blockSize * 2),
-            mineIconBlock,
-            placedMinesCountBlock,
-          ],
-        )
-      ]);
-  }
-
 }
diff --git a/lib/layout/game.dart b/lib/layout/game.dart
index 38e0c67aaa86bc8b3ecd12dc7ded54f273efd1c8..f57e986297bdd213919bc04352deab6d708827b9 100644
--- a/lib/layout/game.dart
+++ b/lib/layout/game.dart
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 
 import '../layout/board.dart';
 import '../provider/data.dart';
+import '../utils/board_utils.dart';
 import '../utils/game_utils.dart';
 
 class Game {
@@ -14,16 +15,76 @@ class Game {
         mainAxisAlignment: MainAxisAlignment.start,
         crossAxisAlignment: CrossAxisAlignment.center,
         children: [
-          Board.buildGameBoard(myProvider),
+          SizedBox(height: 8),
+          Game.buildTopIndicatorWidget(myProvider),
           SizedBox(height: 2),
-          gameIsFinished
-            ? Game.buildEndGameMessage(myProvider)
-            : Board.buildToggleFlagModeLayout(myProvider)
+          Expanded(
+            child: Board.buildGameBoard(myProvider),
+          ),
+          SizedBox(height: 2),
+          Container(
+            child: gameIsFinished
+              ? Game.buildEndGameMessage(myProvider)
+              : Board.buildToggleFlagModeLayout(myProvider),
+          ),
+          SizedBox(height: 8),
         ],
       ),
     );
   }
 
+  static Widget buildTopIndicatorWidget(Data myProvider) {
+    int flaggedCellsCount = BoardUtils.countFlaggedCells(myProvider.cells);
+    int minesCount = myProvider.minesCount;
+    double blockSize = 40;
+
+    Image flagIconBlock = Image(
+      image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_tile_flag.png'),
+      fit: BoxFit.fill,
+      height: blockSize,
+      width: blockSize,
+    );
+    Image mineIconBlock = Image(
+      image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_tile_mine.png'),
+      fit: BoxFit.fill,
+      height: blockSize,
+      width: blockSize,
+    );
+    Text markedMinesCountBlock = Text(
+      flaggedCellsCount.toString(),
+      style: TextStyle(
+        fontSize: blockSize,
+        fontWeight: FontWeight.bold,
+        color: Colors.black
+      ),
+    );
+    Text placedMinesCountBlock = Text(
+      minesCount.toString(),
+      style: TextStyle(
+        fontSize: blockSize,
+        fontWeight: FontWeight.bold,
+        color: Colors.black
+      ),
+    );
+
+    return Column(
+      mainAxisAlignment: MainAxisAlignment.center,
+      crossAxisAlignment: CrossAxisAlignment.center,
+      children: [
+        Row(
+          mainAxisAlignment: MainAxisAlignment.center,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: [
+            markedMinesCountBlock,
+            flagIconBlock,
+            SizedBox(width: blockSize * 2),
+            mineIconBlock,
+            placedMinesCountBlock,
+          ],
+        )
+      ]);
+  }
+
   static FlatButton buildRestartGameButton(Data myProvider) {
     return FlatButton(
       child: Container(
diff --git a/lib/layout/parameters.dart b/lib/layout/parameters.dart
index 847290bf96fbb85e03833f45314e217a8c58489e..096510ebfa9faa01475e4bcbb4a30004d311de09 100644
--- a/lib/layout/parameters.dart
+++ b/lib/layout/parameters.dart
@@ -7,18 +7,27 @@ class Parameters {
 
   static Container buildParametersSelector(Data myProvider) {
     return Container(
-      padding: EdgeInsets.all(2),
-      margin: EdgeInsets.all(2),
       child: Column(
-        mainAxisSize: MainAxisSize.min,
-        mainAxisAlignment: MainAxisAlignment.center,
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.center,
         children: [
-          Parameters.buildParameterSelector(myProvider, 'difficulty'),
           SizedBox(height: 5),
-          Parameters.buildParameterSelector(myProvider, 'size'),
+          Expanded(
+            child: Column(
+              mainAxisSize: MainAxisSize.min,
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                Parameters.buildParameterSelector(myProvider, 'level'),
+                SizedBox(height: 5),
+                Parameters.buildParameterSelector(myProvider, 'size'),
+                SizedBox(height: 5),
+              ],
+            ),
+          ),
           SizedBox(height: 5),
-
-          Parameters.buildStartGameButton(myProvider),
+          Container(
+            child: Parameters.buildStartGameButton(myProvider),
+          ),
         ],
       ),
     );
@@ -65,9 +74,13 @@ class Parameters {
     );
   }
 
-  static Table buildParameterSelector(Data myProvider, String parameterCode) {
+  static Widget buildParameterSelector(Data myProvider, String parameterCode) {
     List availableValues = myProvider.getParameterAvailableValues(parameterCode);
 
+    if (availableValues.length == 1) {
+      return SizedBox(height: 1);
+    }
+
     return Table(
       defaultColumnWidth: IntrinsicColumnWidth(),
       children: [
@@ -85,15 +98,15 @@ class Parameters {
     );
   }
 
-  static FlatButton _buildParameterButton(Data myProvider, String parameterCode, String parameterValue) {
+  static Widget _buildParameterButton(Data myProvider, String parameterCode, String parameterValue) {
     String currentValue = myProvider.getParameterValue(parameterCode).toString();
 
     bool isActive = (parameterValue == currentValue);
     String imageAsset = 'assets/icons/' + parameterCode + '_' + parameterValue + '.png';
 
-    return FlatButton(
-      padding: EdgeInsets.all(2),
+    return TextButton(
       child: Container(
+        padding: EdgeInsets.all(2),
         decoration: BoxDecoration(
           color: Colors.white,
           borderRadius: BorderRadius.circular(10),
diff --git a/lib/main.dart b/lib/main.dart
index dd1afff2ab481d34fc88bd2e0751f294b17f42ed..7f448662ed2c1ea856492d67bacbf56f62d81c3a 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:provider/provider.dart';
+import 'package:overlay_support/overlay_support.dart';
 
 import 'provider/data.dart';
 import 'screens/home.dart';
@@ -17,16 +18,18 @@ class MyApp extends StatelessWidget {
     return ChangeNotifierProvider(
       create: (BuildContext context) => Data(),
       child: Consumer<Data>(builder: (context, data, child) {
-        return MaterialApp(
-          debugShowCheckedModeBanner: false,
-          theme: ThemeData(
-            primaryColor: Colors.blue,
-            visualDensity: VisualDensity.adaptivePlatformDensity,
+        return OverlaySupport(
+          child: MaterialApp(
+            debugShowCheckedModeBanner: false,
+            theme: ThemeData(
+              primaryColor: Colors.blue,
+              visualDensity: VisualDensity.adaptivePlatformDensity,
+            ),
+            home: Home(),
+            routes: {
+              Home.id: (context) => Home(),
+            },
           ),
-          home: Home(),
-          routes: {
-            Home.id: (context) => Home(),
-          },
         );
       }),
     );
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 55e77659f9d39b1361647a8e7c144720bec9d0fe..22a07e4093304b88b69d618133ab0d9bf5f2f0f3 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -4,28 +4,33 @@ import 'package:shared_preferences/shared_preferences.dart';
 class Data extends ChangeNotifier {
 
   // Configuration available values
-  List _availableDifficultyLevels = ['easy', 'medium', 'hard', 'nightmare'];
-  List _availableSizes = ['10x10', '15x15', '20x20'];
-  List _availableSkins = ['default'];
+  List _availableLevelValues = ['easy', 'medium', 'hard', 'nightmare'];
+  List _availableSizeValues = ['10x10', '15x15', '20x20'];
+  List _availableSkinValues = ['default'];
 
-  List get availableDifficultyLevels => _availableDifficultyLevels;
-  List get availableSizes => _availableSizes;
-  List get availableSkins => _availableSkins;
+  List get availableLevelValues => _availableLevelValues;
+  List get availableSizeValues => _availableSizeValues;
+  List get availableSkinValues => _availableSkinValues;
 
   // Application default configuration
-  String _level = null;
-  String _levelDefault = 'medium';
-  String _size = null;
-  String _sizeDefault = '15x15';
-  String _skin = null;
-  String _skinDefault = 'default';
+  String _parameterLevel = '';
+  String _parameterLevelDefault = 'medium';
+  String _parameterSize = '';
+  String _parameterSizeDefault = '15x15';
+  String _parameterSkin = '';
+  String _parameterSkinDefault = 'default';
+
+  // Application current configuration
+  String get parameterLevel => _parameterLevel;
+  String get parameterSize => _parameterSize;
+  String get parameterSkin => _parameterSkin;
 
   // Game data
   bool _assetsPreloaded = false;
   bool _gameIsRunning = false;
   bool _animationInProgress = false;
-  int _sizeVertical = null;
-  int _sizeHorizontal = null;
+  int _sizeVertical = 0;
+  int _sizeHorizontal = 0;
   List _cells = [];
   bool _isBoardMined = false;
   int _minesCount = 0;
@@ -33,57 +38,56 @@ class Data extends ChangeNotifier {
   bool _gameWin = false;
   bool _gameFail = false;
 
-  String get level => _level;
-  void updateLevel(String level) {
-    _level = level;
+  void updateParameterLevel(String parameterLevel) {
+    _parameterLevel = parameterLevel;
     notifyListeners();
   }
 
-  String get size => _size;
   int get sizeVertical => _sizeVertical;
   int get sizeHorizontal => _sizeHorizontal;
-  void updateSize(String size) {
-    _size = size;
-    _sizeHorizontal = int.parse(_size.split('x')[0]);
-    _sizeVertical = int.parse(_size.split('x')[1]);
+  void updateParameterSize(String parameterSize) {
+    _parameterSize = parameterSize;
+    _sizeHorizontal = int.parse(_parameterSize.split('x')[0]);
+    _sizeVertical = int.parse(_parameterSize.split('x')[1]);
     notifyListeners();
   }
 
-  String get skin => _skin;
-  void updateSkin(String skin) {
-    _skin = skin;
+  void updateParameterSkin(String parameterSkin) {
+    _parameterSkin = parameterSkin;
     notifyListeners();
   }
 
-  getParameterValue(String parameterCode) {
+  String getParameterValue(String parameterCode) {
     switch(parameterCode) {
-      case 'difficulty': { return _level; }
+      case 'level': { return _parameterLevel; }
       break;
-      case 'size': { return _size; }
+      case 'size': { return _parameterSize; }
       break;
-      case 'skin': { return _skin; }
+      case 'skin': { return _parameterSkin; }
       break;
     }
+    return '';
   }
 
   List getParameterAvailableValues(String parameterCode) {
     switch(parameterCode) {
-      case 'difficulty': { return _availableDifficultyLevels; }
+      case 'level': { return _availableLevelValues; }
       break;
-      case 'size': { return _availableSizes; }
+      case 'size': { return _availableSizeValues; }
       break;
-      case 'skin': { return _availableSkins; }
+      case 'skin': { return _availableSkinValues; }
       break;
     }
+    return [];
   }
 
   setParameterValue(String parameterCode, String parameterValue) async {
     switch(parameterCode) {
-      case 'difficulty': { updateLevel(parameterValue); }
+      case 'level': { updateParameterLevel(parameterValue); }
       break;
-      case 'size': { updateSize(parameterValue); }
+      case 'size': { updateParameterSize(parameterValue); }
       break;
-      case 'skin': { updateSkin(parameterValue); }
+      case 'skin': { updateParameterSkin(parameterValue); }
       break;
     }
     final prefs = await SharedPreferences.getInstance();
@@ -92,9 +96,9 @@ class Data extends ChangeNotifier {
 
   void initParametersValues() async {
     final prefs = await SharedPreferences.getInstance();
-    setParameterValue('difficulty', prefs.getString('difficulty') ?? _levelDefault);
-    setParameterValue('size', prefs.getString('size') ?? _sizeDefault);
-    setParameterValue('skin', prefs.getString('skin') ?? _skinDefault);
+    setParameterValue('level', prefs.getString('level') ?? _parameterLevelDefault);
+    setParameterValue('size', prefs.getString('size') ?? _parameterSizeDefault);
+    setParameterValue('skin', prefs.getString('skin') ?? _parameterSkinDefault);
   }
 
   bool get gameIsRunning => _gameIsRunning;
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 25e8bf694a4a30901174c47d82feda0eb9d62225..d7d778a6652a3b0d147e57c3bdfc038069bb07ac 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -1,5 +1,6 @@
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
+import 'package:overlay_support/overlay_support.dart';
 
 import '../layout/game.dart';
 import '../layout/parameters.dart';
@@ -31,10 +32,10 @@ class _HomeState extends State<Home> {
       'game_fail',
       'game_win',
     ];
-    myProvider.availableDifficultyLevels.forEach(
-      (difficulty) => gameImages.add('difficulty_' + difficulty)
+    myProvider.availableLevelValues.forEach(
+      (level) => gameImages.add('level_' + level)
     );
-    myProvider.availableSizes.forEach(
+    myProvider.availableSizeValues.forEach(
       (size) => gameImages.add('size_' + size)
     );
 
@@ -60,7 +61,7 @@ class _HomeState extends State<Home> {
       (image) => assets.add('assets/skins/default_' + image + '.png')
     );
 
-    assets.add('assets/skins/empty.png');
+    assets.add('assets/skins/default_empty.png');
 
     return assets;
   }
@@ -96,7 +97,8 @@ class _HomeState extends State<Home> {
               fit: BoxFit.fill
             ),
           ),
-          onPressed: () => GameUtils.resetGame(myProvider),
+          onPressed: () => toast('Long press to quit game...'),
+          onLongPress: () => GameUtils.resetGame(myProvider),
         ),
       ];
     }
diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart
index f4bf5b8b323c7a0db3512463b3ea4e3176b3f0a9..8d5394165881169f9c598ba449d8cde295fd09d1 100644
--- a/lib/utils/board_utils.dart
+++ b/lib/utils/board_utils.dart
@@ -85,7 +85,7 @@ class BoardUtils {
     return minesCount;
   }
 
-  static List createInitialEmptyBoard(Data myProvider) {
+  static void createInitialEmptyBoard(Data myProvider) {
     myProvider.updateIsBoardMined(false);
     myProvider.updateCells(createEmptyBoard(myProvider.sizeHorizontal, myProvider.sizeVertical));
   }
@@ -94,7 +94,7 @@ class BoardUtils {
     List cells = myProvider.cells;
     int sizeHorizontal = myProvider.sizeHorizontal;
     int sizeVertical = myProvider.sizeVertical;
-    String level = myProvider.level;
+    String level = myProvider.parameterLevel;
 
     // Shuffle cells to put random mines, expect on currently selected one
     List allowedCells = [];
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
index b83966f4a270fc5d9b1d2f88ad04916999a1fb2a..8e2db5d96d30400f3fa3cd8cf95e47b815e7ea2b 100644
--- a/lib/utils/game_utils.dart
+++ b/lib/utils/game_utils.dart
@@ -9,9 +9,9 @@ class GameUtils {
   }
 
   static void startGame(Data myProvider) {
-    print('Starting game: ' + myProvider.size + ' - ' + myProvider.level);
-    myProvider.updateSize(myProvider.size);
-    myProvider.updateMinesCount(BoardUtils.getMinesCount(myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.level));
+    print('Starting game: ' + myProvider.parameterSize + ' - ' + myProvider.parameterLevel);
+    myProvider.updateParameterSize(myProvider.parameterSize);
+    myProvider.updateMinesCount(BoardUtils.getMinesCount(myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.parameterLevel));
     myProvider.updateGameIsRunning(true);
     BoardUtils.createInitialEmptyBoard(myProvider);
     BoardAnimate.startAnimation(myProvider, 'start');
diff --git a/pubspec.lock b/pubspec.lock
index 681677510aecdfce7d65d5c9f8fb37ce2f80b104..e835daac2b255a96952be38e866dae864708b25f 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -42,21 +42,21 @@ packages:
       name: collection
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.15.0"
+    version: "1.16.0"
   fake_async:
     dependency: transitive
     description:
       name: fake_async
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.0"
+    version: "1.3.0"
   ffi:
     dependency: transitive
     description:
       name: ffi
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.2"
+    version: "2.0.0"
   file:
     dependency: transitive
     description:
@@ -85,7 +85,7 @@ packages:
       name: js
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.6.3"
+    version: "0.6.4"
   matcher:
     dependency: transitive
     description:
@@ -99,7 +99,7 @@ packages:
       name: material_color_utilities
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.1.3"
+    version: "0.1.4"
   meta:
     dependency: transitive
     description:
@@ -114,34 +114,41 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.0"
+  overlay_support:
+    dependency: "direct main"
+    description:
+      name: overlay_support
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.2.1"
   path:
     dependency: transitive
     description:
       name: path
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.8.0"
+    version: "1.8.1"
   path_provider_linux:
     dependency: transitive
     description:
       name: path_provider_linux
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.5"
+    version: "2.1.7"
   path_provider_platform_interface:
     dependency: transitive
     description:
       name: path_provider_platform_interface
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.3"
+    version: "2.0.4"
   path_provider_windows:
     dependency: transitive
     description:
       name: path_provider_windows
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.5"
+    version: "2.1.0"
   platform:
     dependency: transitive
     description:
@@ -169,42 +176,42 @@ packages:
       name: provider
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "6.0.2"
+    version: "6.0.3"
   shared_preferences:
     dependency: "direct main"
     description:
       name: shared_preferences
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.13"
+    version: "2.0.15"
   shared_preferences_android:
     dependency: transitive
     description:
       name: shared_preferences_android
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.11"
+    version: "2.0.12"
   shared_preferences_ios:
     dependency: transitive
     description:
       name: shared_preferences_ios
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.10"
+    version: "2.1.1"
   shared_preferences_linux:
     dependency: transitive
     description:
       name: shared_preferences_linux
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.0"
+    version: "2.1.1"
   shared_preferences_macos:
     dependency: transitive
     description:
       name: shared_preferences_macos
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.3"
+    version: "2.0.4"
   shared_preferences_platform_interface:
     dependency: transitive
     description:
@@ -218,14 +225,14 @@ packages:
       name: shared_preferences_web
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.3"
+    version: "2.0.4"
   shared_preferences_windows:
     dependency: transitive
     description:
       name: shared_preferences_windows
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.0"
+    version: "2.1.1"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -237,7 +244,7 @@ packages:
       name: source_span
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.8.1"
+    version: "1.8.2"
   stack_trace:
     dependency: transitive
     description:
@@ -272,28 +279,21 @@ packages:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.4.8"
-  typed_data:
-    dependency: transitive
-    description:
-      name: typed_data
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "1.3.0"
+    version: "0.4.9"
   vector_math:
     dependency: transitive
     description:
       name: vector_math
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.1"
+    version: "2.1.2"
   win32:
     dependency: transitive
     description:
       name: win32
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.4.0"
+    version: "2.7.0"
   xdg_directories:
     dependency: transitive
     description:
@@ -302,5 +302,5 @@ packages:
     source: hosted
     version: "0.2.0+1"
 sdks:
-  dart: ">=2.15.0 <3.0.0"
-  flutter: ">=2.8.0"
+  dart: ">=2.17.0 <3.0.0"
+  flutter: ">=3.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 1e6564854ac5c104e5f3411519deff72a8454e12..9e465eba07aec83d71ce738757c7bea75240ba4a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -4,13 +4,14 @@ publish_to: 'none'
 version: 1.0.0+1
 
 environment:
-  sdk: ">=2.7.0 <3.0.0"
+  sdk: ">=2.16.1 <3.0.0"
 
 dependencies:
   flutter:
     sdk: flutter
   provider: ^6.0.2
   shared_preferences: ^2.0.6
+  overlay_support: ^1.0.0
 
 dev_dependencies:
   flutter_test: