diff --git a/.gitignore b/.gitignore
index e68dd67db9343851c0e5f8d53d278dd238196989..151747ab3738f419bad95ce1f26c3f0e3e7e3c46 100644
--- a/.gitignore
+++ b/.gitignore
@@ -160,3 +160,4 @@ app.*.symbols
 # Obfuscation related
 app.*.map.json
 
+.glci
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..291b7c0438f5450e8ef586add2cff6a533e20258
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,51 @@
+image: cirrusci/flutter:latest
+
+stages:
+  - test
+  - update
+  - build
+  - deploy
+
+tests:
+  stage: test
+  script:
+    - flutter test
+  interruptible: true
+
+update:
+  stage: update
+  script:
+    - flutter packages get
+    - flutter packages upgrade
+  interruptible: true
+
+android:build:
+  stage: build
+  script:
+    # Flutter local configuration
+    - echo flutter.sdk=$FLUTTER_PATH > android/local.properties
+    - echo sdk.dir=$ANDROID_SDK_PATH >> android/local.properties
+    - echo flutter.buildMode=release >> android/local.properties
+    # Android signing
+    - ANDROID_KEYSTORE_PATH=my.keystore
+    - echo $ANDROID_KEYSTORE_FILE | base64 -d > $ANDROID_KEYSTORE_PATH
+    - echo storePassword=$ANDROID_KEY_STORE_PASSWORD > android/key.properties
+    - echo keyPassword=$ANDROID_KEY_PASSWORD >> android/key.properties
+    - echo keyAlias=$ANDROID_KEY_ALIAS >> android/key.properties
+    - echo storeFile=$ANDROID_KEYSTORE_PATH >> android/key.properties
+    # build flutter app
+    - flutter build apk
+  artifacts:
+    paths:
+    - build/app/outputs/apk/release/app-release.apk
+    expire_in: 1 week
+  interruptible: true
+
+android:deploy:
+  stage: deploy
+  only:
+    - master
+  dependencies:
+    - android:build
+  script:
+    - wget ${REPOSITORY_UPDATE_WEBHOOK}?token=${REPOSITORY_TOKEN}
diff --git a/README.md b/README.md
index 5dc35979c828d03c50958ca2aeb36b11c44210a6..2033aa9471d1468f19c7ae762dc854aa06d61d68 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,6 @@ Hangman
 
 [<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
      alt="Get it on F-Droid"
-     height="80">](https://f-droid.org/packages/com.hangman/)
+     height="80">](https://f-droid.org/packages/org.benoitharrault.hangman/)
 
 GNU General Public License (GPLv3).
diff --git a/android/.gitignore b/android/.gitignore
index 0a741cb43d66c6790a2a913fa24c8878fb1ab7b5..decff11a5ed9b97360515443996c0d4f097e3682 100644
--- a/android/.gitignore
+++ b/android/.gitignore
@@ -1,8 +1,6 @@
 gradle-wrapper.jar
 /.gradle
 /captures/
-/gradlew
-/gradlew.bat
 /local.properties
 GeneratedPluginRegistrant.java
 
diff --git a/android/app/build.gradle b/android/app/build.gradle
index fc443e1b7a755b78706a71b8286822d9820b2968..ba06a2de4432b9b5615b0b62db465f30dcc07680 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -33,7 +33,7 @@ android {
 
     defaultConfig {
         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
-        applicationId "com.ahorcado"
+        applicationId "org.benoitharrault.hangman"
         minSdkVersion 21
         targetSdkVersion 29
         versionCode flutterVersionCode.toInteger()
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index ecc39b92c8d56278825b89f3ad058c05abe95f22..f51d31318aafd3d429a768e999b45f720a9bb53c 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.ahorcado">
+    package="org.benoitharrault.hangman">
     <!-- Flutter needs it to communicate with the running application
          to allow setting breakpoints, to provide hot reload, etc.
     -->
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 1bdf935911dda9614a9c55b6e67b40e2530e8b0c..a68012e7b467604dd3a36fe3447b18866219dd26 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.ahorcado">
+    package="org.benoitharrault.hangman">
     <!-- io.flutter.app.FlutterApplication is an android.app.Application that
          calls FlutterMain.startInitialization(this); in its onCreate method.
          In most cases you can leave this as-is, but you if you want to provide
@@ -7,8 +7,7 @@
          FlutterApplication and put your custom class here. -->
     <uses-permission android:name="android.permission.INTERNET"/>
     <application
-        android:name="io.flutter.app.FlutterApplication"
-        android:label="Ahorcado"
+        android:label="Hangman"
         android:icon="@mipmap/ic_launcher">
         <activity
             android:name=".MainActivity"
diff --git a/android/app/src/main/java/com/ahorcado/MainActivity.java b/android/app/src/main/java/com/hangman/MainActivity.java
similarity index 75%
rename from android/app/src/main/java/com/ahorcado/MainActivity.java
rename to android/app/src/main/java/com/hangman/MainActivity.java
index 74fb912985889d7cadd9b2a895341d7622d431c5..810c77b8f7faa2c515871c03ad94b8259a29ef68 100644
--- a/android/app/src/main/java/com/ahorcado/MainActivity.java
+++ b/android/app/src/main/java/com/hangman/MainActivity.java
@@ -1,4 +1,4 @@
-package com.ahorcado;
+package org.benoitharrault.hangman;
 
 import io.flutter.embedding.android.FlutterActivity;
 
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 7121efe2a3487eae1c00ee06363de10d8b01823a..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..57942fbe807e89b845871f9e3087309a477799b1
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
deleted file mode 100644
index dc08b1efd4821d4aac9c4c4e8f2ce859b44b1118..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..06c00715d6fd339092fd1d298cfb740e8fc2a3d4
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
deleted file mode 100644
index 7121efe2a3487eae1c00ee06363de10d8b01823a..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..57942fbe807e89b845871f9e3087309a477799b1
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp 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
deleted file mode 100644
index 739d7880a5a15f86d02efc6ebd0ae6b0bf5ab09c..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..6ed5b02ff7c28f80fa78f09a85b38570966084ed
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
deleted file mode 100644
index 0f3e44868cc4fbfec4356a999e8a0f928bf645d1..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..f05f9f7dd17dbf0cfd58d5846fb0f53954ab0e62
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
deleted file mode 100644
index 739d7880a5a15f86d02efc6ebd0ae6b0bf5ab09c..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..6ed5b02ff7c28f80fa78f09a85b38570966084ed
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp 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
deleted file mode 100644
index 5fe4f45114e97dda128fe874266f5682f37bcbab..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..944c67b1a16817a70459744c2a7e0ff3506d69f8
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
deleted file mode 100644
index 04d8d04a5ad85cebdcb2c9ef75b774a6c2eeceec..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..944c67b1a16817a70459744c2a7e0ff3506d69f8
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
deleted file mode 100644
index 5fe4f45114e97dda128fe874266f5682f37bcbab..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..944c67b1a16817a70459744c2a7e0ff3506d69f8
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp 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
deleted file mode 100644
index 17f6a13ca7e46ce1a2c9ffdacf93eb1baf8960db..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..23329a94b1d843c2b944b29c5042f7f258889d44
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
deleted file mode 100644
index bfc047b6be8e6f002f2f407cc1999f83a5dd3861..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..e3aa0ec3e828e90b6b0041b54da771d2674577bc
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
deleted file mode 100644
index 17f6a13ca7e46ce1a2c9ffdacf93eb1baf8960db..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..23329a94b1d843c2b944b29c5042f7f258889d44
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp 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
deleted file mode 100644
index 9e79e59bbf517446c0644c372063b258260f2058..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..d7d204d09f9f55d58920bc5fa775efc9d2358eab
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
deleted file mode 100644
index fd86b6e699237dc0de58bde8a14c420c9fd85e49..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..c2a46d7fb3ab5f9383f0c54deb3aeb6a968ab108
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
deleted file mode 100644
index 9e79e59bbf517446c0644c372063b258260f2058..0000000000000000000000000000000000000000
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..d7d204d09f9f55d58920bc5fa775efc9d2358eab
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
index ecc39b92c8d56278825b89f3ad058c05abe95f22..f51d31318aafd3d429a768e999b45f720a9bb53c 100644
--- a/android/app/src/profile/AndroidManifest.xml
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.ahorcado">
+    package="org.benoitharrault.hangman">
     <!-- Flutter needs it to communicate with the running application
          to allow setting breakpoints, to provide hot reload, etc.
     -->
diff --git a/android/build.gradle b/android/build.gradle
index e0d7ae2c11afd3a84786ddfa342017f8b59656fe..089a64e8b356474b2b85a47fb62ba944f8a36df7 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,11 +1,12 @@
 buildscript {
+    ext.kotlin_version = '1.3.72'
     repositories {
         google()
         jcenter()
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.5.0'
+        classpath 'com.android.tools.build:gradle:4.1.2'
     }
 }
 
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 296b146b7318dd58663296dbb7555df9ff328ec2..039eda99de884b62037cb230e639b99bdc50c15e 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip
diff --git a/assets/audio/acierto.aac b/assets/audio/success.aac
similarity index 100%
rename from assets/audio/acierto.aac
rename to assets/audio/success.aac
diff --git a/assets/audio/victoria.aac b/assets/audio/victory.aac
similarity index 100%
rename from assets/audio/victoria.aac
rename to assets/audio/victory.aac
diff --git a/assets/files/vocabulario.json b/assets/files/vocabulario.json
deleted file mode 100644
index e33efca0811f7a15c7260babfe7b5a1b3c9a3b61..0000000000000000000000000000000000000000
--- a/assets/files/vocabulario.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-    "VOCABULARIO": [
-        {
-        "CATEGORIA": "ANIMALES",
-        "PISTA": "Es un animal",
-        "PALABRAS": ["ABEJA", "ABEJORRO", "AGUILA", "ALMEJA", "ANACONDA", "ARAÑA", "ASNO", "ATUN", "AVESTRUZ", "AVISPA", "BALLENA", "BESUGO", "BUFALO", "BUHO", "BUITRE", "BURRO", "CABALLO", "CABRA", "CAIMAN", "CAMALEON", "CAMELLO", "CANARIO", "CANGREJO", "CARACOL", "CEBRA", "CERDO", "CIERVO", "CIGALA", "COBRA", "CONEJO", "COTORRA", "COYOTE", "DELFIN", "ELEFANTE", "FOCA", "GACELA", "GALLO", "GACELA", "GARZA", "GATO", "GAVILAN", "GAVIOTA", "GORILA", "GORRION", "GRILLO", "GUEPARDO", "GUSANO", "HALCON", "HAMSTER", "HIENA", "HORMIGA", "IGUANA", "JABALI", "JAGUAR", "JINETA", "JIRAFA", "KOALA", "LAGARTO", "LANGOSTA", "LECHUZA", "LEON", "LEOPARDO", "LEMUR", "LIBELULA", "LIEBRE", "LINCE", "LLAMA", "LOBO", "LOMBRIZ", "LORO", "MARIPOSA", "MARMOTA", "MARSOPA", "MEJILLON", "MONO", "MOSCA", "MULA", "NUTRIA", "ORCA", "OSO", "OSTRA", "OVEJA", "PALOMA", "PANTERA", "PATO", "PAVO", "PERDIZ", "PERRO", "PINGUINO", "PITON", "PULGA", "PULPO", "PUMA", "RANA", "RATON", "SALMON", "SAPO", "TIBURON", "TIGRE", "TOPO", "TORO", "TORTUGA", "TRUCHA", "TUCAN", "VACA", "VIBORA", "ZORRO"]
-        },
-        {
-        "CATEGORIA": "COLORES",
-        "PISTA": "Es un color",
-        "PALABRAS": ["AZUL", "AMARILLO", "VIOLETA", "MARRON", "ROJO", "BLANCO", "NEGRO", "GRIS", "MORADO", "NARANJA", "VERDE", "AMBAR", "AÑIL", "BEIGE", "BEIS", "CARMESI", "CELESTE", "COLORADO", "CREMA", "ESCARLATA", "FUCSIA", "ROSA", "GRANATE", "LILA", "MAGENTA", "OCRE", "PURPURA"]
-        },
-        {
-        "CATEGORIA": "FLORES",
-        "PISTA": "Es una flor",
-        "PALABRAS": ["AMAPOLA", "ROSA", "CLAVEL", "MARGARITA", "AZALEA", "CAMELIA", "GERANIO", "JAZMIN", "LIRIO", "ORQUIDEA", "NARCISO", "TULIPAN", "NENUFAR", "GIRASOL", "DALIA"]
-        },
-        {
-        "CATEGORIA": "DEPORTES",
-        "PISTA": "Es un deporte o juego",
-        "PALABRAS": ["AEROBIC", "AJEDREZ", "ARCO", "BILLAR", "BOLOS", "BOXEO", "BEISBOL", "CICLISMO", "CRICKET", "ESCALADA", "ESGRIMA", "ESQUI", "FUTBOL", "GOLF", "GIMNASIA", "HIPICA", "HOCKEY", "JUDO", "KARATE", "LUCHA", "NATACION", "PADDLE", "PATINAJE", "PETANCA", "PINGPONG", "POLO", "RUGBY", "TENIS", "TIRO", "VOLEIBOL"]
-        },
-        {
-        "CATEGORIA": "ALIMENTOS",
-        "PISTA": "Es un alimento o plato cocinado",
-        "PALABRAS": ["QUESO", "PIZZA", "CHORIZO", "JAMON", "SALAMI", "PAELLA", "PASTEL", "BIZCOCHO", "MACARRONES", "MENESTRA", "ENSALADA", "SOPA", "CHOCOLATE", "SALSA", "HUEVO", "CREMA", "LECHE", "GUARNICION", "CHULETA", "FLAN", "CEVICHE", "COCIDO", "TORTILLA", "TARTA", "PURE", "ALBONDIGA", "GAZPACHO", "TORTITA", "TACO", "BOCADILLO", "TORREZNO", "FIDEUA", "CROQUETA", "SALMOREJO", "EMPANADA", "SANDWICH", "PISTO", "FABADA", "ESCALIBADA", "LENTEJAS", "CHURRO", "ENSAIMADA", "MORCILLA", "YOGUR", "TURRON", "PAPAS", "PORRUSALDA", "CALLOS", "TORRIJA", "BUTIFARRA"]
-        },
-        {
-        "CATEGORIA": "QUIMICOS",
-        "PISTA": "Es un elemento químico",
-        "PALABRAS": ["LITIO", "HELIO", "FOSFORO", "AZUFRE", "NIQUEL", "HIERRO", "PLATA", "MERCURIO", "POLONIO", "PLOMO", "FLUOR", "HIDROGENO", "CARBONO", "OXIGENO", "SODIO", "MAGNESIO", "ALUMINIO", "SILICIO", "CLORO", "POTASIO", "CALCIO", "TITANIO", "COBALTO", "COBRE", "ZINC", "ESTRONCIO", "CADMIO", "YODO", "ESTAÑO", "PLATINO", "RADON", "URANIO", "MOLIBDENO"]
-        },
-        {
-        "CATEGORIA": "VEHICULOS",
-        "PISTA": "Es un vehículo o medio de transporte",
-        "PALABRAS": ["COCHE", "MOTO", "BICICLETA", "TREN", "BARCO", "AVION", "HELICOPTERO", "AUTOBUS", "AUTOMOVIL", "TRINEO", "CARRUAJE", "YATE", "LANCHA", "SUBMARINO", "CANOA", "AVIONETA", "PARAPENTE", "COHETE", "METRO", "TRANVIA", "FUNICULAR", "FERROCARRIL", "CAMION", "CAMIONETA", "TRACTOR", "MOTOCARRO", "FURGONETA", "BUQUE", "KAYAK", "PIRAGUA", "VELERO", "CARRO", "CARROZA", "MONOPATIN", "TRICICLO"]
-        },
-        {
-        "CATEGORIA": "CUERPO",
-        "PISTA": "Es una parte del cuerpo u órgano interno",
-        "PALABRAS": ["BRAZO", "MANO", "CABEZA", "PIERNA", "CUELLO", "CADERA", "RODILLA", "DEDO", "OREJA", "NARIZ", "CARA", "CODO", "OMBLIGO", "ESPALDA", "TOBILLO", "GARGANTA", "CEJA", "MEJILLA", "BOCA", "BARBILLA", "LENGUA", "PARPADO", "PESTAÑA", "HOMBRO", "MUÑECA", "PULGAR", "MUSLO", "TALON", "CEREBRO", "CORAZON", "HIGADO", "RIÑON", "PULMON", "PANCREAS", "VEJIGA", "CINTURA", "PECHO", "PIEL", "DIENTE", "NALGA"]
-        },
-        {
-        "CATEGORIA": "PRENDAS",
-        "PISTA": "Es una prenda de vestir o complemento",
-        "PALABRAS": ["ABRIGO", "GUANTE", "BUFANDA", "CAMISA", "CALCETIN", "CORBATA", "PANTALON", "FALDA", "CAMISETA", "ZAPATO", "SOMBRERO", "MEDIA", "CHAQUETA", "CINTURON", "BLUSA", "GORRO", "SUETER", "JERSEY", "TRAJE", "BOINA", "VESTIDO", "BOTA", "SANDALIA", "CHANCLA", "CORREA", "LIGA"]
-        },
-        {
-        "CATEGORIA": "OFICIOS",
-        "PISTA": "Es una profesión u oficio",
-        "PALABRAS": ["MEDICO", "ENFERMERO", "MAESTRO", "PINTOR", "ALBAÑIL", "ABOGADO", "ZAPATERO", "PSICOLOGO", "FONTANERO", "CARPINTERO", "BANQUERO", "PROFESOR", "MECANICO", "PERIODISTA", "JUEZ", "ELECTRICISTA", "ESCRITOR", "INFORMATICO", "PORTERO", "POLICIA", "DENTISTA", "FUTBOLISTA", "CHOFER", "SASTRE", "CERRAJERO", "PASTOR", "AGRICULTOR", "CARNICERO", "PANADERO", "DEPENDIENTE", "INGENIERO", "ARQUITECTO", "MATEMATICO", "BIOLOGO", "FISICO", "QUIMICO", "FILOSOFO", "ARQUEOLOGO", "FARMACEUTICO", "GEOGRAFO", "HISTORIADOR", "SOCIOLOGO", "MUSICO", "ECONOMISTA", "RADIOLOGO", "GANADERO"]
-        },
-        {
-        "CATEGORIA": "NUMEROS",
-        "PISTA": "Es un número",
-        "PALABRAS": ["QUINCE", "DOCE", "TRECE", "CATORCE", "SIETE", "CIEN", "SIETE", "OCHO", "NUEVE", "DIEZ", "CERO", "CUATRO", "CINCO", "TREINTA", "CUARENTA", "CINCUENTA", "MILLON", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA"]
-        },
-        {
-        "CATEGORIA": "CIUDADES",
-        "PISTA": "Es una ciudad",
-        "PALABRAS": ["ADELAIDA", "AGRA", "ALBACETE", "ALEPO", "ALICANTE", "ANKARA", "ATENAS", "ATLANTA", "AVILA", "BADAJOZ", "BAGDAD", "BANGKOK", "BASORA", "BERLIN", "BERNA", "BILBAO", "BOGOTA", "BOMBAY", "BOSTON", "BRUSELAS", "BURGOS", "CACERES", "CADIZ", "CALCUTA", "CARACAS", "CHICAGO", "COLONIA", "CORDOBA", "CUENCA", "DALLAS", "DAKAR", "DAMASCO", "DETROIT", "DUBAI", "DUBLIN", "ESTAMBUL", "GINEBRA", "HAMBURGO", "HANOI", "HOUSTON", "IBIZA", "JAEN", "KABUL", "KARACHI", "LEIPZIG", "LEON", "LIMA", "LISBOA", "LONDRES", "MADRID", "MALAGA", "MANILA", "MEDELLIN", "MERIDA", "MILAN", "MOSCU", "MUNICH", "MURCIA", "NAGOYA", "NAIROBI", "NAPOLES", "OPORTO", "OSAKA", "OSLO", "PALENCIA", "PARIS", "PEKIN", "PRAGA", "RABAT", "RIAD", "ROMA", "SANTIAGO", "SEGOVIA", "SEUL", "SEVILLA", "SHANGHAI", "SIDNEY", "SINGAPUR", "SOFIA", "TEHERAN", "TOKIO", "TOLEDO", "TORONTO", "TUNEZ", "VALENCIA", "VENECIA", "VIENA", "YAKARTA", "ZAMORA", "ZARAGOZA"]
-        },
-        {
-        "CATEGORIA": "PELICULAS",
-        "PISTA": "Es el título de una película",
-        "PALABRAS": ["AGORA", "AKIRA", "ALIEN", "ALIENTO", "AMADEUS", "AMELIE", "ARDOR", "ARREBATO", "ASESINOS", "AVATAR", "BABEL", "BABYLON", "BAMBI", "BATMAN", "BICHOS", "BLACULA", "BLADE", "BOLERO", "BOLT", "BRAVE", "BRICK", "BROTHERS", "BRUNO", "BURIED", "CABARET", "CALABUCH", "CAMINO", "CANDIDA", "CANDYMAN", "CAPOTE", "CARRIE", "CARS", "CASINO", "CATWOMAN", "CHAPLIN", "CHICAGO", "CLUEDO", "CONTROL", "CYBORG", "DAISY", "DRACULA", "EDTV", "ELEGY", "ERAGON", "ESTOMAGO", "EVITA", "FAILAN", "FARGO", "FRACTURE", "FURTIVOS", "GAMER", "GENOVA", "GHANDI", "GHOST", "GIGLI", "GOOD", "GOMORRA", "GORGO", "GREASE", "GREMLINS", "HACHIKO", "HAMLET", "HANCOCK", "HANNIBAL", "HAPPY", "HERO", "HITCH", "HOME", "HOSTEL", "JARHEAD", "JULIA", "JUMPER", "JUNIOR", "JUNO", "JVCD", "KINSEY", "KUNDUM", "LANTANA", "LOOPER", "MACHETE", "MAMA", "MATILDA", "MATRIX", "MEMENTO", "MONSTER", "MOON", "MUNICH", "NAUFRAGO", "NIAGARA", "OLIVER", "ORIGEN", "OTHELLO", "PAPILLON", "PLACIDO", "PLATOON", "PELOTON", "POSTAL", "PRECIOUS", "PSICOSIS", "PUSH", "RADIO", "RAMBO", "RANGO", "REDS", "REC", "REFLEJOS", "ROBOCOP", "ROCKY", "SAW", "SCARFACE", "SCOOP", "SEVEN", "SHINE", "SHREK", "SICKO", "SINISTER", "SKYFALL", "SPEED", "SPLASH", "STARGATE", "STONE", "SUNSHINE", "SUPERMAN", "SURCOS", "SUSPENSE", "SYRIANA", "TANGLED", "TAXI", "TEKKEN", "TESIS", "TIBURON", "TIDELAND", "TIERRA", "TIME", "TITANIC", "TOOTSIE", "TRISTANA", "TRON", "TROYA", "VACAS", "VALKIRIA", "VERTIGO", "WARRIOR", "XMEN", "XXY", "ZODIAC"]
-        }
-    ]
-}
-
diff --git a/assets/files/word-list-fr.json b/assets/files/word-list-fr.json
new file mode 100644
index 0000000000000000000000000000000000000000..6892b65ca48889cf8c0ffd276780cbbaa76eaf31
--- /dev/null
+++ b/assets/files/word-list-fr.json
@@ -0,0 +1,188 @@
+{
+  "words-list": [
+    {
+      "category": "ANIMAUX",
+      "clue": "Animal",
+      "words": [
+        "ANACONDA",
+        "AUTRUCHE",
+        "BARRACUDA",
+        "BOUQUETIN",
+        "COCCINELLE",
+        "CROCODILE",
+        "DROMADAIRE",
+        "ELEPHANT",
+        "ESCARGOT",
+        "FOURMILIER",
+        "GRENOUILLE",
+        "HIPPOCAMPE",
+        "HIPPOPOTAME",
+        "KANGOUROU",
+        "LIBELLULE",
+        "PERROQUET",
+        "PIPISTRELLE",
+        "RHINOCEROS",
+        "SAUTERELLE",
+        "TARENTULE"
+      ]
+    },
+    {
+      "category": "FRUITS",
+      "clue": "Fruit",
+      "words": [
+        "AUBERGINE",
+        "BETTERAVE",
+        "CITROUILLE",
+        "CONCOMBRE",
+        "FRAMBOISE",
+        "GROSEILLE",
+        "MANDARINE",
+        "MIRABELLE",
+        "MYRTILLE",
+        "PAMPLEMOUSSE"
+      ]
+    },
+    {
+      "category": "METIERS",
+      "clue": "Métier",
+      "words": [
+        "AGRICULTEUR",
+        "ARCHEOLOGUE",
+        "ARCHITECTE",
+        "ASTRONAUTE",
+        "BIJOUTIER",
+        "BIOLOGISTE",
+        "CHARCUTIER",
+        "CHARPENTIER",
+        "CUISINIER",
+        "ELECTRICIEN",
+        "HORTICULTEUR",
+        "INFIRMIER",
+        "MECANICIEN",
+        "MENUISIER",
+        "METEOROLOGUE",
+        "PHOTOGRAPHE",
+        "PROFESSEUR",
+        "STANDARDISTE",
+        "VETERINAIRE",
+        "VOLCANOLOGUE"
+      ]
+    },
+    {
+      "category": "GEOGRAPHIE",
+      "clue": "Géographie",
+      "words": [
+        "ALLEMAGNE",
+        "ANTARCTIQUE",
+        "ARGENTINE",
+        "ATLANTIQUE",
+        "AUSTRALIE",
+        "EMBOUCHURE",
+        "HEMISPHERE",
+        "HYDROGRAPHIE",
+        "KILIMANDJARO",
+        "LUXEMBOURG",
+        "MADAGASCAR",
+        "MEDITERRANEE",
+        "MISSISSIPPI",
+        "NORMANDIE",
+        "PACIFIQUE",
+        "PLANISPHERE",
+        "STRASBOURG",
+        "SUPERFICIE",
+        "VENEZUELA",
+        "WASHINGTON"
+      ]
+    },
+    {
+      "category": "COULEURS",
+      "clue": "Couleur",
+      "words": [
+        "ROUGE",
+        "BLEU",
+        "VERT",
+        "JAUNE",
+        "VIOLET",
+        "ORANGE",
+        "MARRON",
+        "NOIR",
+        "BLANC",
+        "TURQUOISE",
+        "BEIGE",
+        "ROSE"
+      ]
+    },
+    {
+      "category": "FLEURS",
+      "clue": "Fleur",
+      "words": [
+        "ROSE",
+        "PIVOINE",
+        "TULIPE",
+        "JONQUILLE",
+        "CACTUS"
+      ]
+    },
+    {
+      "category": "SPORTS",
+      "clue": "Sport ou jeu",
+      "words": [
+        "GYMNASTIQUE",
+        "FOOTBALL",
+        "HANDBALL",
+        "COURSE",
+        "CYCLISME",
+        "RANDONNEE"
+      ]
+    },
+    {
+      "category": "ALIMENTS",
+      "clue": "Aliment ou plat",
+      "words": [
+        "FROMAGE",
+        "PIZZA",
+        "SAUCISSON",
+        "JAMBON",
+        "SALAMI",
+        "PAELLA",
+        "PATES",
+        "SALADE",
+        "SOUPE",
+        "CHOCOLAT",
+        "OEUF",
+        "CREME",
+        "LAIT",
+        "CORNICHON",
+        "FLAN",
+        "TARTE",
+        "PUREE",
+        "SAUMON",
+        "SANDWICH"
+      ]
+    },
+    {
+      "category": "VEHICULE",
+      "clue": "Véhicule ou moyen de transport",
+      "words": [
+        "VOITURE",
+        "MOTO",
+        "VELO",
+        "TRAIN",
+        "BATEAU",
+        "AVION",
+        "HELICOPTERE",
+        "AUTOBUS",
+        "CAR",
+        "TRAINEAU",
+        "FUSEE",
+        "VOILIER",
+        "PAQUEBOT",
+        "METRO",
+        "SOUS-MARIN",
+        "CAMION",
+        "TRACTEUR",
+        "KAYAK"
+      ]
+    }
+  ]
+}
diff --git a/assets/images/derrotas.png b/assets/images/gameover.png
similarity index 100%
rename from assets/images/derrotas.png
rename to assets/images/gameover.png
diff --git a/assets/images/icon128.png b/assets/images/icon128.png
index 846a4e504b6c63ac0197f672503cb1580b302728..34d4cd6178fe5c6e54a0a108a7dfea52583a7e94 100644
Binary files a/assets/images/icon128.png and b/assets/images/icon128.png differ
diff --git a/assets/images/icon128.png.png b/assets/images/icon128.png.png
new file mode 100644
index 0000000000000000000000000000000000000000..d717a1fee2af97525e23f7549fa3fd2c8cca5cbd
Binary files /dev/null and b/assets/images/icon128.png.png differ
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index b53ed21df3237f64b17b646a95b16ce9f63b7a08..fe91a9db34e6b6b64b226c84003d9b36032d941e 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -1,9 +1 @@
-<p>The objective of the game is to discover a hidden word by matching the letters that make it up.</p>
-<p>For this, the program proposes a random word obtained from the web or from its own word store, depending on the selected game mode.</p>
-<p>The application has 4 levels organized in 2 game modes:</p>
-<ul>
-<li>Topics (offline): Provides a hint about the words, which are organized into categories.</li>
-<li>Junior (online): Reduced list of about 500 easier words for children.</li>
-<li>Advanced (online): Base of about 4,000 words.</li>
-<li>Expert (online): Extensive word base (around 640,000 words), including numerous verb forms, which greatly increases the difficulty.</li>
-<p>Free open source software that does not require any special permission, only the permission of internet connection to search words, although it is possible to play without internet connection in the offline levels.</p>
+<p>Hangman game, simple and classic.</p>
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
index 9e79e59bbf517446c0644c372063b258260f2058..cde3798ae864958a4ba7c20b509de6f30c73f9dc 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/en-US/images/phoneScreenshots/Screenshot_1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_1.png
deleted file mode 100644
index de2e5c9a2f1e18672a2d7cdf557e10939c900586..0000000000000000000000000000000000000000
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_1.png and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_2.png
deleted file mode 100644
index d3c4eaddcb714493ac88c3393712c8d19b0e7947..0000000000000000000000000000000000000000
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_2.png and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_3.png
deleted file mode 100644
index 7dd3fa9cd03b32330e3fe38ee5810b1eb309676c..0000000000000000000000000000000000000000
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_3.png and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
index 426f02612bffd98b505747ebe9a2f925b653203d..3d399340855455e428118aef2417afd4a993181f 100644
--- a/fastlane/metadata/android/en-US/short_description.txt
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -1 +1 @@
-Relive the classic pencil and paper game Hangman.
+Hangman game, simple and classic.
diff --git a/fastlane/metadata/android/fr-FR/images/icon.png b/fastlane/metadata/android/fr-FR/images/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..cde3798ae864958a4ba7c20b509de6f30c73f9dc
Binary files /dev/null and b/fastlane/metadata/android/fr-FR/images/icon.png differ
diff --git a/fastlane/metadata/android/fr/full_description.txt b/fastlane/metadata/android/fr/full_description.txt
index e74105d7319afcedcf8bde0446e7a59007a86615..9888a1207f5f01e323206230c1e3ebac17a04a15 100644
--- a/fastlane/metadata/android/fr/full_description.txt
+++ b/fastlane/metadata/android/fr/full_description.txt
@@ -1,9 +1 @@
-<p>El objetivo del juego es descubrir una palabra oculta acertando las letras que la componen.</p>
-<p>Para ello el programa propone una palabra al azar obtenida de la web o de su propio almacén de palabras, dependiendo del modo de juego seleccionado.</p>
-<p>La aplicación dispone de 4 niveles organizados en 2 modos de juego:</p>
-<ul>
-<li>Temas (offline):  Ofrece una pista sobre las palabras, que están organizadas en categorías.</li>
-<li>Júnior (online): Listado reducido de unas 500 palabras más fáciles para niños.</li>
-<li>Avanzado (online): Base de unas 4.000 palabras.</li>
-<li>Experto (online): Extensa base de palabras (en torno a 640.000 palabras), incluidas numerosas formas verbales, lo que aumenta considerablemente la dificultad.</li>
-<p>Software libre de código abierto que no requiere ningún permiso especial, solo el permiso de conexión a internet para buscar palabras, aunque es posible jugar sin conexión a internet en los niveles offline.</p>
+<p>Jeu du pendu, simple et classique.</p>
diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt
index be838edaa95c44a89416fcf080d2f2eeda4f5f18..ba530a8013c5263dd4b646cb2bc89dbac83f2dae 100644
--- a/fastlane/metadata/android/fr/short_description.txt
+++ b/fastlane/metadata/android/fr/short_description.txt
@@ -1 +1 @@
-Jeu du pendu, amusez-vous avec des mots et des lettres !
+Jeu du pendu, simple et classique.
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000000000000000000000000000000000..442d9132ea32808ad980df4bd233b359f76341a7
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000000000000000000000000000000000000..4f906e0c811fc9e230eb44819f509cd0627f2600
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=`expr $i + 1`
+    done
+    case $i in
+        0) set -- ;;
+        1) set -- "$args0" ;;
+        2) set -- "$args0" "$args1" ;;
+        3) set -- "$args0" "$args1" "$args2" ;;
+        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000000000000000000000000000000000000..ac1b06f93825db68fb0c0b5150917f340eaa5d02
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/icons/build_icons.sh b/icons/build_icons.sh
new file mode 100755
index 0000000000000000000000000000000000000000..323f007b425de52990e09ad251e5bd777d1cf8fb
--- /dev/null
+++ b/icons/build_icons.sh
@@ -0,0 +1,84 @@
+#! /bin/bash
+
+# Check dependencies
+command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
+command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
+command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
+command -v convert >/dev/null 2>&1 || { echo >&2 "I require convert (imagemagick) but it's not installed. Aborting."; exit 1; }
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+BASE_DIR="$(dirname "${CURRENT_DIR}")"
+
+SOURCE="${CURRENT_DIR}/hangman.svg"
+OPTIPNG_OPTIONS="-preserve -quiet -o7"
+
+# optimize svg
+cp ${SOURCE} ${SOURCE}.tmp
+scour \
+    --remove-descriptive-elements \
+    --enable-id-stripping \
+    --enable-viewboxing \
+    --enable-comment-stripping \
+    --nindent=4 \
+    -i ${SOURCE}.tmp \
+    -o ${SOURCE}
+rm ${SOURCE}.tmp
+
+# build icons
+function build_icon() {
+  ICON_SIZE="$1"
+  TARGET="$2"
+
+  TARGET_PNG="${TARGET}.png"
+
+  inkscape \
+      --export-width=${ICON_SIZE} \
+      --export-height=${ICON_SIZE} \
+      --export-filename=${TARGET_PNG} \
+      ${SOURCE}
+
+  optipng ${TARGET_PNG} ${TARGET_PNG}
+}
+
+build_icon 324 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground
+build_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round
+build_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher
+build_icon 162 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground
+build_icon  72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher_round
+build_icon  72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher
+build_icon 432 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground
+build_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round
+build_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher
+build_icon 108 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground
+build_icon  48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher_round
+build_icon  48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher
+build_icon 216 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground
+build_icon 216 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round
+build_icon 216 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher
+build_icon 128 ${BASE_DIR}/assets/images/icon128.png
+build_icon 192 ${BASE_DIR}/fastlane/metadata/android/en-US/images/icon
+build_icon 192 ${BASE_DIR}/fastlane/metadata/android/fr-FR/images/icon
+
+
+# convert to webp
+function convert_to_webp() {
+  FILE="$1"
+
+  convert ${FILE}.png ${FILE}.webp
+  rm ${FILE}.png
+}
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher_round
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher_round
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round
+convert_to_webp ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher
diff --git a/icons/hangman.svg b/icons/hangman.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2c9629e830689f0efd5ab687eb0a32936f553aeb
--- /dev/null
+++ b/icons/hangman.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 28.747 28.747" xmlns="http://www.w3.org/2000/svg">
+    <defs>
+        <filter id="filter6206-7" color-interpolation-filters="sRGB">
+            <feGaussianBlur stdDeviation="0.658125"/>
+        </filter>
+    </defs>
+    <g transform="translate(0 -1093.8)">
+        <path transform="matrix(1.0781 0 0 1.0641 -.093733 2.7509)" d="m4.4177 1028.2v1.6051h-1.6052v18.192h1.6052v2.1402h18.192v-2.1402h2.1402v-18.192h-2.1402v-1.6051z" fill="#3e2723" filter="url(#filter6206-7)" opacity=".2"/>
+        <rect x="2.9987" y="1096.8" width="22.749" height="22.749" rx="1.1973" ry="1.1974" fill="#795548"/>
+        <g transform="translate(-22.32 1056.5)">
+            <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
+            <g transform="matrix(.33601 0 0 .33601 1.5296 73.043)">
+                <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
+            </g>
+            <g transform="matrix(.37187 0 0 .37187 38.802 63.239)">
+                <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
+                <g transform="matrix(2.6891 0 0 2.6891 -82.906 -48.45)">
+                    <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
+                </g>
+            </g>
+        </g>
+        <path d="m4.1958 1096.8c-0.66332 0-1.1979 0.5346-1.1979 1.1979v0.3334c0-0.6634 0.53459-1.1979 1.1979-1.1979h20.354c0.66332 0 1.1979 0.5345 1.1979 1.1979v-0.3334c0-0.6633-0.5346-1.1979-1.1979-1.1979z" fill="#fff" opacity=".2"/>
+        <rect x="128" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="128" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="128" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="128" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="128" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="213.33" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="213.33" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="213.33" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="213.33" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="213.33" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="298.67" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="298.67" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="298.67" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="298.67" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="298.67" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="170.67" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="170.67" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="170.67" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="170.67" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="170.67" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="256" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="256" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="256" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="256" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="256" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="128" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="213.33" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="298.67" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="170.67" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="256" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="341.33" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="341.33" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="341.33" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="341.33" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="341.33" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="341.33" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
+        <rect x="160" y="578.52" width="192" height="192" fill="none" stroke-width="1.0667"/>
+        <g transform="matrix(.37344 0 0 .37344 4.7333 1097.4)">
+            <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
+        </g>
+        <g transform="matrix(.36471 0 0 .36471 5.1356 1097.4)">
+            <path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
+        </g>
+        <g transform="matrix(.41585 0 0 .41585 84.325 1055.9)">
+            <g transform="matrix(.062269 0 0 .062269 -28.238 185.29)">
+                <g transform="matrix(38.618 0 0 38.618 14724 -13542)">
+                    <g transform="matrix(.71436 0 0 .71436 -400.52 188.34)">
+                        <path d="m1293.2-120.67c-181.75 0.2763-511.18 0.13525-699.05 0.13998-2.3216 10.413-3.593 21.251-3.593 32.384v114c207.65 0.73695 494.72 0.38136 706.23 0.3733v-114.37c0-11.18-1.2522-22.07-3.593-32.523zm-458.69 295.56c-78.385-4e-3 -158.85 0.17892-243.95 0.55995v138.63c286.34-0.39317 421.73-0.13827 706.23-0.32664v-137.75c-163.2-0.53005-311.22-1.1113-462.28-1.1199z" opacity="0" stroke-width="1.4932"/>
+                    </g>
+                </g>
+            </g>
+        </g>
+        <path d="m24.549 1119.5c0.66325 0 1.1979-0.5346 1.1979-1.1979v-0.3333c0 0.6632-0.53461 1.1978-1.1979 1.1978h-20.354c-0.66325 0-1.1979-0.5346-1.1979-1.1978v0.3333c0 0.6633 0.53461 1.1979 1.1979 1.1979z" fill="#3e2723" opacity=".2"/>
+    </g>
+    <path d="m20.55 16.968-1.6934-1.6934v-1.877l1.6578 0.66328 0.33894-0.84875-1.6769-0.66968a1.8181 1.8181 0 0 0-0.31974-3.4092v-1.8921h-8.6794v13.247h-2.284v0.91362h5.9385v-0.91362h-2.7408v-9.8607l2.4732-2.4732h4.379v0.97848a1.8181 1.8181 0 0 0-0.31975 3.4092l-1.6751 0.66968 0.33894 0.84875 1.6559-0.66328v1.877l-1.6934 1.6934 0.64593 0.64593 1.5043-1.5043 1.5043 1.5043zm-9.4591-7.6319v-1.1813h1.1813zm6.3953 1.5595a0.91362 0.91362 0 1 1 0.91361 0.91361 0.91362 0.91362 0 0 1-0.91361-0.91361z" fill="#fff" stroke="#fff" stroke-width=".1"/>
+</svg>
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 6833b0cf16b772381b2a45d0814b7f4d2689320f..c36c44f71e85c2c8cd7845e583fd59a6587ab029 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -310,7 +310,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.ahorcado;
+				PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.hangman;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				VERSIONING_SYSTEM = "apple-generic";
 			};
@@ -438,7 +438,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.ahorcado;
+				PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.hangman;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				VERSIONING_SYSTEM = "apple-generic";
 			};
@@ -461,7 +461,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.ahorcado;
+				PRODUCT_BUNDLE_IDENTIFIER = org.benoitharrault.hangman;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				VERSIONING_SYSTEM = "apple-generic";
 			};
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 3ee834d4fa0ddb97f0dab59e14b757a4160b4eaa..e1152e4100fe3e9887fd266cfa90e178bd5f59ca 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -11,7 +11,7 @@
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<key>CFBundleName</key>
-	<string>ahorcado</string>
+	<string>hangman</string>
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
diff --git a/lib/main.dart b/lib/main.dart
index 4caf5a0897169effb0293e3eabd5fc756490bc5d..73b4b1dfa1b364faf21b3cb3364ecee71af33d9d 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -4,15 +4,15 @@ import 'package:provider/provider.dart';
 import 'provider/data.dart';
 import 'screens/home.dart';
 import 'screens/info.dart';
-import 'screens/ajustes.dart';
-import 'screens/juego.dart';
-import 'screens/marcador.dart';
-import './utils/constantes.dart';
-import 'package:ahorcado/utils/constantes.dart';
+import 'screens/settings.dart';
+import 'screens/game.dart';
+import 'screens/scores.dart';
+import './utils/constants.dart';
+import 'package:hangman/utils/constants.dart';
 
-void main() => runApp(Ahorcado());
+void main() => runApp(Hangman());
 
-class Ahorcado extends StatelessWidget {
+class Hangman extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return ChangeNotifierProvider(
@@ -21,15 +21,15 @@ class Ahorcado extends StatelessWidget {
         return MaterialApp(
           debugShowCheckedModeBanner: false,
           theme: ThemeData(
-            primaryColor: Color(verdeOscuro),
+            primaryColor: Color(darkGreen),
             visualDensity: VisualDensity.adaptivePlatformDensity,
           ),
           home: Home(),
           routes: {
             Home.id: (context) => Home(),
-            Juego.id: (context) => Juego(),
-            Ajustes.id: (context) => Ajustes(),
-            Marcador.id: (context) => Marcador(),
+            Game.id: (context) => Game(),
+            Settings.id: (context) => Settings(),
+            Scores.id: (context) => Scores(),
             Info.id: (context) => Info(),
           },
         );
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 363000dce8231267ee58585aee5820ae2812e328..ae86605450410692f83748e97cde4acad9d3034f 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -1,38 +1,38 @@
 import 'package:flutter/foundation.dart';
 import '../utils/shared_prefs.dart';
 import '../utils/package_info.dart';
-import '../utils/constantes.dart';
+import '../utils/constants.dart';
 
 class Data extends ChangeNotifier {
-  // preferencias
+  // settings
   final SharedPrefs _sharedPrefs = SharedPrefs();
 
   // screen settings
-  bool _soundValor = true;
-  bool _modoValor = false;
-  String _nivelValor = defaultNivel;
+  bool _soundValue = true;
+  bool _gameModeValue = false;
+  String _levelValue = defaultLevel;
 
-  // aleatoria
-  String _palabraSecreta; // mejor null
-  bool _buscando = false;
-  String _pista = '';
-  List<String> _palabraOculta = [];
-  List<String> _letrasUsadas = [];
+  // randomization
+  String _secretWord;
+  bool _searching = false;
+  String _clue = '';
+  List<String> _hiddenWord = [];
+  List<String> _usedLetters = [];
 
-  bool get buscando => _buscando;
+  bool get searching => _searching;
 
-  set buscando(bool value) {
-    _buscando = value;
+  set searching(bool value) {
+    _searching = value;
     notifyListeners();
   }
 
-  // marcador
-  int _errores = 0;
-  int _victorias = 0;
-  int _derrotas = 0;
+  // scores
+  int _errors = 0;
+  int _victoryCount = 0;
+  int _defeatCount = 0;
 
   // pack info
-  String _version = 'No disponible';
+  String _version = 'Non disponible';
   var _packInfo = PackInfo();
 
   Data() {
@@ -51,140 +51,135 @@ class Data extends ChangeNotifier {
 
   void _getPrefs() async {
     await _sharedPrefs.init();
-    _soundValor = _sharedPrefs.sound ?? true;
-    //_modoValor = _sharedPrefs.modo ?? false;
-    _modoValor = _sharedPrefs.modo ??
-        modoOnline.keys
-            .firstWhere((k) => modoOnline[k].contains(_sharedPrefs.nivel), orElse: () => false);
-    //_nivelValor = _sharedPrefs.nivel ?? modoOnline[_modoValor].first;
-    _nivelValor = modoOnline[_modoValor].contains(_sharedPrefs.nivel)
-        ? _sharedPrefs.nivel
-        : modoOnline[_modoValor].first;
-    _victorias = _sharedPrefs.victorias ?? 0;
-    _derrotas = _sharedPrefs.derrotas ?? 0;
+    _soundValue = _sharedPrefs.sound ?? true;
+    _gameModeValue = _sharedPrefs.gameMode ??
+        onlineGameMode.keys
+            .firstWhere((k) => onlineGameMode[k].contains(_sharedPrefs.level), orElse: () => false);
+    _levelValue = onlineGameMode[_gameModeValue].contains(_sharedPrefs.level)
+        ? _sharedPrefs.level
+        : onlineGameMode[_gameModeValue].first;
+    _victoryCount = _sharedPrefs.victoryCount ?? 0;
+    _defeatCount = _sharedPrefs.defeatCount ?? 0;
     notifyListeners();
   }
 
   bool get soundPref => _sharedPrefs.sound ?? true;
-  bool get modoPref => _sharedPrefs.modo ?? false;
-  String get nivelPref => _sharedPrefs.nivel ?? modoOnline[modoPref].first;
+  bool get gameModePref => _sharedPrefs.gameMode ?? false;
+  String get levelPref => _sharedPrefs.level ?? onlineGameMode[gameModePref].first;
 
-  void resetValores() => _getPrefs();
+  void resetValues() => _getPrefs();
 
   set setPrefSound(bool prefSound) {
     _sharedPrefs.sound = prefSound;
     notifyListeners();
   }
 
-  set setPrefModo(bool prefModo) {
-    _sharedPrefs.modo = prefModo;
+  set setPrefGameMode(bool prefGameMode) {
+    _sharedPrefs.gameMode = prefGameMode;
     notifyListeners();
   }
 
-  set setPrefNivel(String prefNivel) {
-    _sharedPrefs.nivel = prefNivel;
+  set setPrefLevel(String prefLevel) {
+    _sharedPrefs.level = prefLevel;
     notifyListeners();
   }
 
-  bool get soundValor => _soundValor;
+  bool get soundValue => _soundValue;
 
   set updateSound(bool value) {
-    _soundValor = value;
+    _soundValue = value;
     notifyListeners();
   }
 
-  bool get modoValor => _modoValor;
+  bool get gameModeValue => _gameModeValue;
 
-  set updateModo(bool value) {
-    _modoValor = value;
-    _nivelValor = modoOnline[value].first;
+  set updateGameMode(bool value) {
+    _gameModeValue = value;
+    _levelValue = onlineGameMode[value].first;
     notifyListeners();
   }
 
-  String get nivelValor => _nivelValor;
+  String get levelValue => _levelValue;
 
-  set updateNivel(String value) {
-    _nivelValor = value;
+  set updateLevel(String value) {
+    _levelValue = value;
     notifyListeners();
   }
 
-  String get palabraSecreta => _palabraSecreta;
+  String get secretWord => _secretWord;
 
-  set updateSecreta(String value) {
-    _palabraSecreta = value;
-    _palabraOculta = List<String>.generate(value.length, (i) => '_');
+  set updateSecretWord(String value) {
+    _secretWord = value;
+    _hiddenWord = List<String>.generate(value.length, (i) => '_');
     notifyListeners();
   }
 
-  String get pista => _pista;
+  String get clue => _clue;
 
-  set updatePista(String value) {
-    _pista = value;
+  set updateClue(String value) {
+    _clue = value;
     notifyListeners();
   }
 
-  String get palabraOculta => _palabraOculta.join();
+  String get hiddenWord => _hiddenWord.join();
 
-  void updateOculta(int index, String letra) {
-    _palabraOculta[index] = letra;
+  void updateHiddenWord(int index, String letra) {
+    _hiddenWord[index] = letra;
     notifyListeners();
   }
 
-  List<String> get letrasUsadas => _letrasUsadas;
+  List<String> get usedLetters => _usedLetters;
 
-  void updateLetrasUsadas(String key) {
-    _letrasUsadas.add(key);
+  void updateUsedLetters(String key) {
+    _usedLetters.add(key);
     notifyListeners();
   }
 
-  void resetLetrasUsadas() {
-    _letrasUsadas.clear();
+  void resetUsedLetters() {
+    _usedLetters.clear();
     notifyListeners();
   }
 
-  int get errores => _errores;
+  int get errors => _errors;
 
-  void sumaError() {
-    _errores++;
+  void addError() {
+    _errors++;
     notifyListeners();
   }
 
-  void resetAciertosErrores() {
-    _errores = 0;
+  void resetSuccessAndErrors() {
+    _errors = 0;
     notifyListeners();
   }
 
-  int get victorias => _victorias;
-  int get derrotas => _derrotas;
+  int get victoryCount => _victoryCount;
+  int get defeatCount => _defeatCount;
 
-  void sumaVictoria() {
-    _victorias++;
-    _sharedPrefs.victorias = _victorias;
+  void addVictory() {
+    _victoryCount++;
+    _sharedPrefs.victoryCount = _victoryCount;
     notifyListeners();
   }
 
-  void sumaDerrota() {
-    _derrotas++;
-    _sharedPrefs.derrotas = _derrotas;
+  void addDefeat() {
+    _defeatCount++;
+    _sharedPrefs.defeatCount = _defeatCount;
     notifyListeners();
   }
 
-  void resetMarcador() {
-    _victorias = 0;
-    _derrotas = 0;
+  void resetScores() {
+    _victoryCount = 0;
+    _defeatCount = 0;
     notifyListeners();
   }
 
-  void resetPartida() {
-    //_controlPalabra = true;
-    //_aciertos = 0;
-    _errores = 0;
-    //_imagenHorca = horca;
-    _palabraSecreta = null; //'';
-    _pista = '';
-    _palabraOculta = [];
-    _letrasUsadas = [];
-    _letrasUsadas.clear();
+  void resetGame() {
+    _errors = 0;
+    _secretWord = null;
+    _clue = '';
+    _hiddenWord = [];
+    _usedLetters = [];
+    _usedLetters.clear();
     notifyListeners();
   }
 }
diff --git a/lib/screens/juego.dart b/lib/screens/game.dart
similarity index 57%
rename from lib/screens/juego.dart
rename to lib/screens/game.dart
index 502b63bca5f09a649b3fb90acf716715612acab1..417bde7f250f877681f3d5f7efbfc614dc0cb618 100644
--- a/lib/screens/juego.dart
+++ b/lib/screens/game.dart
@@ -1,44 +1,42 @@
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
 import '../provider/data.dart';
-import '../utils/constantes.dart';
-import '../utils/aleatoria.dart';
-import '../widgets/botones_letras.dart';
+import '../utils/constants.dart';
+import '../utils/random_pick.dart';
+import '../widgets/letters.dart';
 
-class Juego extends StatelessWidget {
-  static const String id = 'juego';
+class Game extends StatelessWidget {
+  static const String id = 'game';
 
-  Future<void> buscarPalabra(BuildContext context, Data myProvider) async {
-    myProvider.buscando = true;
-    Aleatoria aleatoria;
-    int intentos = 0;
+  Future<void> pickWord(BuildContext context, Data myProvider) async {
+    myProvider.searching = true;
+    RandomPick randompick;
+    int attempts = 0;
     do {
-      aleatoria = Aleatoria(myProvider.nivelPref);
-      await aleatoria.init();
-      if (aleatoria.palabra != null) {
-        myProvider.updateSecreta = aleatoria.palabra;
-        //myProvider.ocultaInicial(aleatoria.palabra);
-        myProvider.resetAciertosErrores();
-        myProvider.resetLetrasUsadas();
-        //_myProvider.resetPartida();
-        if (myProvider.nivelPref == defaultNivel) {
-          myProvider.updatePista = aleatoria.pista;
+      randompick = RandomPick(myProvider.levelPref);
+      await randompick.init();
+      if (randompick.word != null) {
+        myProvider.updateSecretWord = randompick.word;
+        myProvider.resetSuccessAndErrors();
+        myProvider.resetUsedLetters();
+        if (myProvider.levelPref == defaultLevel) {
+          myProvider.updateClue = randompick.clue;
         }
-        myProvider.buscando = false;
+        myProvider.searching = false;
         break;
       }
-      intentos++;
-    } while (intentos < 3);
+      attempts++;
+    } while (attempts < 3);
   }
 
   @override
   Widget build(BuildContext context) {
-    Orientation orientacion = MediaQuery.of(context).orientation;
+    Orientation orientation = MediaQuery.of(context).orientation;
     Data _myProvider = Provider.of<Data>(context);
 
     return Scaffold(
-      backgroundColor: Color(pizarra),
-      floatingActionButton: _myProvider.nivelPref == defaultNivel
+      backgroundColor: Color(board),
+      floatingActionButton: _myProvider.levelPref == defaultLevel
           ? FloatingActionButton(
               foregroundColor: Colors.white,
               backgroundColor: Colors.transparent,
@@ -48,11 +46,11 @@ class Juego extends StatelessWidget {
                   context: context,
                   builder: (context) {
                     return AlertDialog(
-                      title: Text('Pista'),
-                      content: Text(_myProvider.pista),
+                      title: Text('Indice'),
+                      content: Text(_myProvider.clue),
                       actions: <Widget>[
                         FlatButton(
-                          child: Text('Volver al juego'),
+                          child: Text('Revenir au jeu'),
                           onPressed: () => Navigator.of(context).pop(),
                         )
                       ],
@@ -63,24 +61,24 @@ class Juego extends StatelessWidget {
               child: Icon(Icons.help_outline),
             )
           : null,
-      floatingActionButtonLocation: orientacion == Orientation.portrait
+      floatingActionButtonLocation: orientation == Orientation.portrait
           ? FloatingActionButtonLocation.endTop
           : FloatingActionButtonLocation.centerTop,
-      body: orientacion == Orientation.portrait
+      body: orientation == Orientation.portrait
           ? Column(
               mainAxisAlignment: MainAxisAlignment.spaceBetween,
               children: [
                 Flexible(
                   child: Padding(
                     padding: EdgeInsets.only(top: 60.0, left: 30.0, right: 30.0, bottom: 10.0),
-                    child: const ImgHorca(),
+                    child: const ImgGallow(),
                   ),
                 ),
                 Padding(
                   padding: const EdgeInsets.symmetric(horizontal: 30.0),
-                  child: const PalabraOculta(),
+                  child: const HiddenWord(),
                 ),
-                const BotonesLetras(),
+                const LetterButtons(),
               ],
             )
           : Row(
@@ -92,25 +90,25 @@ class Juego extends StatelessWidget {
                       Expanded(
                         child: Padding(
                           padding: const EdgeInsets.only(top: 40.0),
-                          child: ImgHorca(),
+                          child: ImgGallow(),
                         ),
                       ),
                       Padding(
                         padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
-                        child: const PalabraOculta(),
+                        child: const HiddenWord(),
                       ),
                     ],
                   ),
                 ),
-                Expanded(child: BotonesLetras()),
+                Expanded(child: LetterButtons()),
               ],
             ),
     );
   }
 }
 
-class ImgHorca extends StatelessWidget {
-  const ImgHorca({Key key}) : super(key: key);
+class ImgGallow extends StatelessWidget {
+  const ImgGallow({Key key}) : super(key: key);
   @override
   Widget build(BuildContext context) {
     Data _myProvider = Provider.of<Data>(context);
@@ -118,8 +116,8 @@ class ImgHorca extends StatelessWidget {
       children: [
         for (int error = 0; error < 7; error++)
           AnimatedOpacity(
-            opacity: _myProvider.errores >= error ? 1.0 : 0.0,
-            duration: Duration(milliseconds: _myProvider.errores >= error ? 800 : 0),
+            opacity: _myProvider.errors >= error ? 1.0 : 0.0,
+            duration: Duration(milliseconds: _myProvider.errors >= error ? 800 : 0),
             child: Image.asset('assets/images/img${error + 1}.png'),
           )
       ],
@@ -127,17 +125,16 @@ class ImgHorca extends StatelessWidget {
   }
 }
 
-class PalabraOculta extends StatelessWidget {
-  const PalabraOculta({Key key}) : super(key: key);
+class HiddenWord extends StatelessWidget {
+  const HiddenWord({Key key}) : super(key: key);
   @override
   Widget build(BuildContext context) {
     Data _myProvider = Provider.of<Data>(context);
     return FittedBox(
-      //fit: BoxFit.contain, //fitWidth, // fill
       child: Text(
-        (_myProvider.palabraOculta.isEmpty || _myProvider.palabraOculta == null)
+        (_myProvider.hiddenWord.isEmpty || _myProvider.hiddenWord == null)
             ? 'UNEXPECTED ERROR'
-            : _myProvider.palabraOculta,
+            : _myProvider.hiddenWord,
         style: TextStyle(
           fontFamily: 'Tiza',
           color: Colors.white,
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 7be64186ef4a70065526f6e360a02f3730538787..b908bdb9ad2428367cea8b78d00e4487cadad875 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -2,47 +2,47 @@ import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
 
 import '../provider/data.dart';
-import 'juego.dart';
+import 'game.dart';
 import '../widgets/my_app_bar.dart';
-import '../widgets/diaolog_not_found.dart';
-import '../utils/constantes.dart';
+import '../widgets/dialog_fetch_error.dart';
+import '../utils/constants.dart';
 
 class Home extends StatelessWidget {
   static const String id = 'home';
 
   @override
   Widget build(BuildContext context) {
-    Orientation orientacion = MediaQuery.of(context).orientation;
+    Orientation orientation = MediaQuery.of(context).orientation;
     Data _myProvider = Provider.of<Data>(context);
 
-    List<Widget> _listaWidgets() {
+    List<Widget> _listWidgets() {
       return [
         Image.asset(
           'assets/images/icon128.png',
-          scale: orientacion == Orientation.portrait ? 1 : 1.5,
+          scale: orientation == Orientation.portrait ? 1 : 1.5,
         ),
         Padding(
-          padding: orientacion == Orientation.portrait
+          padding: orientation == Orientation.portrait
               ? EdgeInsets.only(top: 10.0)
               : EdgeInsets.only(left: 10.0),
           child: Text(
-            'Version: ${_myProvider.version}\nCopyleft 2019-2021\nJesús Cuerda',
-            textAlign: orientacion == Orientation.portrait ? TextAlign.center : TextAlign.left,
+            'Version: ${_myProvider.version}',
+            textAlign: orientation == Orientation.portrait ? TextAlign.center : TextAlign.left,
           ),
         ),
       ];
     }
 
-    void _errorPalabra(context) {
+    void _errorWord(context) {
       showDialog(
         context: context,
         builder: (_) => AlertDialog(
-          title: Text('UNEXPECTED ERROR'),
-          content: Text('Error al seleccionar la palabra secreta.\n'
-              'Si se repite, elimina los datos almacenados, desinstala e instala la última versión.'),
+          title: Text('Erreur inattendue'),
+          content: Text('Erreur inattendue à la récupération d\'un mot aléatoire.\n'
+              'Installer une nouvelle version de l\'application pourrait corriger cette anomalie.'),
           actions: <Widget>[
             FlatButton(
-              child: Text('Cerrar'),
+              child: Text('Fermer'),
               onPressed: () => Navigator.of(context).pop(),
             )
           ],
@@ -54,7 +54,7 @@ class Home extends StatelessWidget {
       appBar: MyAppBar(appBar: AppBar()),
       body: Builder(
         builder: (context) => Center(
-          child: _myProvider.buscando == true
+          child: _myProvider.searching == true
               ? WillPopScope(
                   onWillPop: () async => false,
                   child: Center(
@@ -77,7 +77,7 @@ class Home extends StatelessWidget {
                             child: FittedBox(
                               fit: BoxFit.fitWidth,
                               child: Text(
-                                'EL AHORCADO',
+                                'LE PENDU',
                                 style: TextStyle(
                                   fontFamily: 'Tiza',
                                   fontSize: 28.0,
@@ -87,55 +87,55 @@ class Home extends StatelessWidget {
                             ),
                           ),
                           Container(
-                            child: orientacion == Orientation.portrait
-                                ? Column(children: _listaWidgets())
+                            child: orientation == Orientation.portrait
+                                ? Column(children: _listWidgets())
                                 : Row(
                                     mainAxisAlignment: MainAxisAlignment.center,
                                     crossAxisAlignment: CrossAxisAlignment.center,
-                                    children: _listaWidgets(),
+                                    children: _listWidgets(),
                                   ),
                           ),
                           RaisedButton.icon(
                             shape: RoundedRectangleBorder(
                                 borderRadius: BorderRadius.all(Radius.circular(10.0))),
-                            color: Color(pizarra),
+                            color: Color(board),
                             textColor: Colors.white,
                             padding: EdgeInsets.all(10.0),
                             onPressed: () async {
                               Scaffold.of(context).removeCurrentSnackBar();
-                              _myProvider.resetPartida();
-                              _myProvider.buscando = true;
+                              _myProvider.resetGame();
+                              _myProvider.searching = true;
                               bool control = true;
-                              await Juego().buscarPalabra(context, _myProvider);
-                              if (_myProvider.palabraSecreta == null ||
-                                  _myProvider.palabraSecreta == '' ||
-                                  _myProvider.palabraOculta == null ||
-                                  (_myProvider.palabraOculta?.isEmpty ?? true)) {
+                              await Game().pickWord(context, _myProvider);
+                              if (_myProvider.secretWord == null ||
+                                  _myProvider.secretWord == '' ||
+                                  _myProvider.hiddenWord == null ||
+                                  (_myProvider.hiddenWord?.isEmpty ?? true)) {
                                 control = false;
-                                var respuesta = await Navigator.push(
+                                var response = await Navigator.push(
                                   context,
-                                  MaterialPageRoute(builder: (context) => DialogoNotFound()),
+                                  MaterialPageRoute(builder: (context) => DialogFetchError()),
                                 );
-                                if (respuesta == false) {
-                                  _myProvider.buscando = false;
-                                  _myProvider.resetPartida();
+                                if (response == false) {
+                                  _myProvider.searching = false;
+                                  _myProvider.resetGame();
                                 } else {
-                                  _myProvider.setPrefModo = false;
-                                  _myProvider.setPrefNivel = defaultNivel;
-                                  await Juego().buscarPalabra(context, _myProvider);
+                                  _myProvider.setPrefGameMode = false;
+                                  _myProvider.setPrefLevel = defaultLevel;
+                                  await Game().pickWord(context, _myProvider);
                                   control = true;
                                 }
                               }
 
-                              if (_myProvider.palabraSecreta == 'UNEXPECTED ERROR') {
+                              if (_myProvider.secretWord == 'UNEXPECTED ERROR') {
                                 control = false;
-                                _myProvider.resetPartida();
-                                _errorPalabra(context);
+                                _myProvider.resetGame();
+                                _errorWord(context);
                               }
 
                               if (control) {
-                                Navigator.pushNamed(context, Juego.id)
-                                    .then((value) => _myProvider.buscando = false);
+                                Navigator.pushNamed(context, Game.id)
+                                    .then((value) => _myProvider.searching = false);
                               }
                             },
                             icon: Icon(
@@ -146,14 +146,14 @@ class Home extends StatelessWidget {
                             label: Column(
                               children: [
                                 Text(
-                                  'JUGAR',
+                                  'JOUER',
                                   style: TextStyle(
                                     fontSize: 22.0,
                                     letterSpacing: 2.0,
                                   ),
                                 ),
                                 Text(
-                                  'Modo de Juego: ${_myProvider.nivelPref}',
+                                  'Mode de jeu: ${_myProvider.levelPref}',
                                   style: TextStyle(
                                     fontSize: 10.0,
                                     fontWeight: FontWeight.w300,
diff --git a/lib/screens/info.dart b/lib/screens/info.dart
index a07b0266c12a469fdeac3ab99c14df42267b215d..d31812904fc0e91555d791265a8ff1b3c98fde93 100644
--- a/lib/screens/info.dart
+++ b/lib/screens/info.dart
@@ -8,8 +8,8 @@ class Info extends StatelessWidget {
   Widget build(BuildContext context) {
     return Scaffold(
       appBar: AppBar(
-        title: Text('Info'),
-        actions: [BotonCafe()],
+        title: Text('Informations'),
+        actions: [ButtonCoffee()],
       ),
       body: SingleChildScrollView(
         padding: EdgeInsets.all(10.0),
@@ -22,8 +22,8 @@ class Info extends StatelessWidget {
   }
 }
 
-class BotonCafe extends StatelessWidget {
-  const BotonCafe({Key key}) : super(key: key);
+class ButtonCoffee extends StatelessWidget {
+  const ButtonCoffee({Key key}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -35,7 +35,7 @@ class BotonCafe extends StatelessWidget {
           builder: (BuildContext context) => Scaffold(
             backgroundColor: Colors.transparent,
             body: Builder(
-              builder: (context) => DialogoInfo(),
+              builder: (context) => DialogInfo(),
             ),
           ),
         );
@@ -44,53 +44,25 @@ class BotonCafe extends StatelessWidget {
   }
 }
 
-class DialogoInfo extends StatelessWidget {
-  const DialogoInfo({Key key}) : super(key: key);
-
-  static const String bitcoinAdress = '15ZpNzqbYFx9P7wg4U438JMwZr2q3W6fkS';
+class DialogInfo extends StatelessWidget {
+  const DialogInfo({Key key}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
     return AlertDialog(
-      title: Text('Apoya esta aplicación'),
+      title: Text('Informations sur cette application'),
       content: SingleChildScrollView(
         child: Column(
           mainAxisSize: MainAxisSize.min,
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            Text('Pulsa el botón para copiar la dirección Bitcoin:'),
-            Padding(
-              padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 10.0),
-              child: Center(
-                child: RaisedButton(
-                  shape:
-                      RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))),
-                  padding: EdgeInsets.all(10.0),
-                  child: Text(
-                    bitcoinAdress,
-                    textAlign: TextAlign.center,
-                    style: TextStyle(color: Colors.white),
-                  ),
-                  onPressed: () {
-                    Clipboard.setData(ClipboardData(text: bitcoinAdress)).then(
-                      (value) => Scaffold.of(context).showSnackBar(
-                        SnackBar(content: Text('Bitcoin Address copied to Clipboard')),
-                      ),
-                    );
-                  },
-                  color: Colors.green[900],
-                ),
-              ),
-            ),
-            Text('El Ahorcado es Software libre sin publicidad. '
-                'Puedes colaborar con el desarrollo de ésta y otras aplicaciones '
-                'con una pequeña aportación a mi monedero de Bitcoins.'),
+            Text('Le jeu du pendu est un logiciel libre, sans publicité.'),
           ],
         ),
       ),
       actions: [
         FlatButton(
-          child: Text('Cerrar'),
+          child: Text('Fermer'),
           onPressed: () => Navigator.of(context).pop(),
         )
       ],
@@ -99,60 +71,5 @@ class DialogoInfo extends StatelessWidget {
 }
 
 const String textoInfo = '''
-EL JUEGO DEL AHORCADO
-
-Esta aplicación revive el clásico juego de lápiz y papel "El Ahorcado" cuyo objetivo es descubrir una palabra secreta.
-
-Para ello, el programa propone una palabra al azar obtenida de la web o de su propio almacén de palabras, dependiendo del modo o nivel de juego seleccionado.
-
-OPCIONES
-
-Desde el menú «Ajustes» se pueden cambiar algunas opciones del juego.
-
-La aplicación dispone de 4 niveles organizados en 2 modos de juego:
-- Offline: Temas y Experto.
-- Online: Júnior y Avanzado.
-
-En los niveles «Júnior» y «Avanzado» se genera una palabra aleatoria online. El nivel «Avanzado» utiliza una base de unas 4.000 palabras mientras que el modo «Júnior» utiliza un listado reducido de unas 500 palabras más fáciles para niños.
-
-Los niveles «Temas» y «Experto» extraen la palabra al azar desde sus respectivas bases de palabras, por lo que no requieren conexión a internet.
-
-En el nivel «Temas» las palabras (unas 600) están clasificadas en diversas temáticas o categorías (animales, colores, flores, elementos químicos, alimentos, profesiones, ciudades, películas, etc.) y se ofrece la posibilidad de solicitar una pista sobre la palabra secreta. Cuando alguno de los otros niveles falla (por ejemplo por caída del servidor o por desconexión a internet) se activa automáticamente el nivel «Temas».
-
-El nivel «Experto» contiene una extensa base de palabras (en torno a 640.000 palabras), incluidas numerosas formas verbales, lo que aumenta considerablemente la dificultad.
-
-También se pueden activar o desactivar los efectos sonoros de la aplicación.
-
-Estas opciones (Sonido, Modo y Nivel) quedan grabadas en la aplicación y se aplicarán a las nuevas partidas hasta que sean modificadas.
-
-ACERCA DE
-
-Copyleft 2019-2021 - Jesús Cuerda (Webierta)- Todos los errores reservados.
-
-Web del proyecto: https://github.com/Webierta/ahorcandroid
-
-Aplicación gratuita y sin publicidad. Colabora con un donativo para un café en mi monedero de Bitcoin ¡gracias!
-
-Software libre de código abierto sujeto a la GNU General Public License v.3, distribuido con la esperanza de que sea entretenido, pero SIN NINGUNA GARANTÍA. Todos los errores reservados.
-
-REQUISITOS Y PERMISOS
-
-- Android 5.0 o superior.  
-- Permiso de conexión a internet (para buscar palabras). Es posible jugar sin conexión a internet en los niveles «Temas» y «Experto».
-
-RECONOCIMIENTOS Y DEPENDENCIAS
-
-- Banco de imágenes y sonidos del Instituto de Tecnologías Educativas (CC BY-NC-SA 3.0). Ministerio de Educación.
-- Generador de palabras aleatorias online: palabrasaleatorias.com. 
-- Packages de Flutter y Dart: assets_audio_player (Copyright 2019 Florent37), diacritic (Copyright 2016, Agilord), shared_preferences (Copyright 2017 The Chromium Authors), provider (Copyright 2019 Remi Rousselet), package_info (Copyright 2017 The Chromium Authors), html (Copyright 2006-2012 The Authors), http (Copyright 2014, the Dart project authors), list_spanish_words (Copyright 2020 Alessandro Maclaine).
-
-LICENCIA
-
-Copyleft 2019-2021, Jesús Cuerda Villanueva. All Wrongs Reserved.
-
-Software libre de código abierto sujeto a la GNU General Public License v.3. EL AHORCADO es software libre distribuido con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA.
-
-This file is part of EL AHORCADO. EL AHORCADO is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation either version 3 of the License.
-
-EL AHORCADO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. https://www.gnu.org/licenses/gpl-3.0.txt
+LE JEU DU PENDU
 ''';
diff --git a/lib/screens/marcador.dart b/lib/screens/scores.dart
similarity index 81%
rename from lib/screens/marcador.dart
rename to lib/screens/scores.dart
index 094e59ff974324fccdae4b3877698354193e039e..9f77ae552f07d43863c7dde7bc42673e303dfb80 100644
--- a/lib/screens/marcador.dart
+++ b/lib/screens/scores.dart
@@ -1,22 +1,22 @@
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
 import '../provider/data.dart';
-import '../utils/constantes.dart';
+import '../utils/constants.dart';
 
-class Marcador extends StatelessWidget {
-  static const String id = 'marcador';
+class Scores extends StatelessWidget {
+  static const String id = 'scores';
 
   @override
   Widget build(BuildContext context) {
     Data _myProvider = Provider.of<Data>(context);
     return Scaffold(
-      backgroundColor: Color(pizarra),
+      backgroundColor: Color(board),
       appBar: AppBar(
-        title: Text('Marcador'),
+        title: Text('Scores'),
         actions: [
           IconButton(
             icon: Icon(Icons.delete_forever),
-            onPressed: () => _myProvider.resetMarcador(),
+            onPressed: () => _myProvider.resetScores(),
           ),
         ],
       ),
@@ -32,7 +32,7 @@ class Marcador extends StatelessWidget {
               child: FittedBox(
                 fit: BoxFit.fitWidth,
                 child: Text(
-                  'MARCADOR',
+                  'SCORES',
                   style: TextStyle(
                     fontFamily: 'Tiza',
                     fontSize: 28.0,
@@ -45,21 +45,21 @@ class Marcador extends StatelessWidget {
             Row(
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
-                Tarjeta(
+                CardBox(
                   Icon(
                     Icons.emoji_events,
                     color: Colors.grey[200],
                     size: 60.0,
                   ),
-                  '${_myProvider.victorias}',
+                  '${_myProvider.victoryCount}',
                 ),
-                Tarjeta(
+                CardBox(
                   ImageIcon(
-                    AssetImage('assets/images/derrotas.png'),
+                    AssetImage('assets/images/gameover.png'),
                     color: Colors.grey[200],
                     size: 60.0,
                   ),
-                  '${_myProvider.derrotas}',
+                  '${_myProvider.defeatCount}',
                 ),
               ],
             ),
@@ -70,11 +70,11 @@ class Marcador extends StatelessWidget {
   }
 }
 
-class Tarjeta extends StatelessWidget {
+class CardBox extends StatelessWidget {
   final Widget imagen;
-  final String texto;
+  final String text;
 
-  Tarjeta(this.imagen, this.texto);
+  CardBox(this.imagen, this.text);
 
   @override
   Widget build(BuildContext context) {
@@ -83,7 +83,7 @@ class Tarjeta extends StatelessWidget {
         elevation: 10.0,
         margin: EdgeInsets.symmetric(horizontal: 10.0),
         shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
-        color: Color(verdeOscuro),
+        color: Color(darkGreen),
         child: Column(
           children: [
             Container(
@@ -104,7 +104,7 @@ class Tarjeta extends StatelessWidget {
             Container(
               padding: EdgeInsets.all(20.0),
               child: Text(
-                texto,
+                text,
                 style: TextStyle(
                   fontFamily: 'Tiza',
                   fontSize: 20.0,
diff --git a/lib/screens/ajustes.dart b/lib/screens/settings.dart
similarity index 73%
rename from lib/screens/ajustes.dart
rename to lib/screens/settings.dart
index ea8dcae6e34694793031049e1593911b4caa90db..5b7d8101b8e190d03520f4630a978d06a360a72f 100644
--- a/lib/screens/ajustes.dart
+++ b/lib/screens/settings.dart
@@ -1,16 +1,16 @@
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
 import '../provider/data.dart';
-import '../utils/constantes.dart';
+import '../utils/constants.dart';
 
-class Ajustes extends StatelessWidget {
-  static const String id = 'ajustes';
+class Settings extends StatelessWidget {
+  static const String id = 'settings';
 
   @override
   Widget build(BuildContext context) {
     Data _myProvider = Provider.of<Data>(context);
     return Scaffold(
-      appBar: AppBar(title: Text('Ajustes')),
+      appBar: AppBar(title: Text('Réglages')),
       body: SingleChildScrollView(
         child: Padding(
           padding: const EdgeInsets.only(top: 30.0, left: 30.0, right: 30.0),
@@ -19,11 +19,11 @@ class Ajustes extends StatelessWidget {
               Row(
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 children: [
-                  Text('Sonido'),
+                  Text('Son'),
                   Switch(
-                    value: _myProvider.soundValor,
+                    value: _myProvider.soundValue,
                     onChanged: (bool value) => _myProvider.updateSound = value,
-                    activeTrackColor: Color(pizarra),
+                    activeTrackColor: Color(board),
                     activeColor: Colors.greenAccent[400],
                   ),
                 ],
@@ -32,11 +32,11 @@ class Ajustes extends StatelessWidget {
               Row(
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 children: [
-                  Text('Modo online'),
+                  Text('Mode en ligne'),
                   Switch(
-                    value: _myProvider.modoValor,
-                    onChanged: (bool value) => _myProvider.updateModo = value,
-                    activeTrackColor: Color(pizarra),
+                    value: _myProvider.gameModeValue,
+                    onChanged: (bool value) => _myProvider.updateGameMode = value,
+                    activeTrackColor: Color(board),
                     activeColor: Colors.greenAccent[400],
                   ),
                 ],
@@ -44,17 +44,17 @@ class Ajustes extends StatelessWidget {
               Row(
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 children: [
-                  Text('Nivel'),
+                  Text('Niveau'),
                   DropdownButton<String>(
-                    value: _myProvider.nivelValor ?? modoOnline[_myProvider.modoValor].first,
-                    items: modoOnline[_myProvider.modoValor]
+                    value: _myProvider.levelValue ?? onlineGameMode[_myProvider.gameModeValue].first,
+                    items: onlineGameMode[_myProvider.gameModeValue]
                         .map<DropdownMenuItem<String>>((String value) {
                       return DropdownMenuItem<String>(
                         value: value,
                         child: Text(value),
                       );
                     }).toList(),
-                    onChanged: (String value) => _myProvider.updateNivel = value,
+                    onChanged: (String value) => _myProvider.updateLevel = value,
                   ),
                 ],
               ),
@@ -64,17 +64,17 @@ class Ajustes extends StatelessWidget {
                 child: RaisedButton.icon(
                   shape:
                       RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))),
-                  color: Color(pizarra),
+                  color: Color(board),
                   padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0),
                   onPressed: () {
-                    _myProvider.setPrefSound = _myProvider.soundValor;
-                    _myProvider.setPrefModo = _myProvider.modoValor;
-                    _myProvider.setPrefNivel = _myProvider.nivelValor;
+                    _myProvider.setPrefSound = _myProvider.soundValue;
+                    _myProvider.setPrefGameMode = _myProvider.gameModeValue;
+                    _myProvider.setPrefLevel = _myProvider.levelValue;
                     Navigator.pop(context);
                   },
                   icon: Icon(Icons.save, color: Colors.white),
                   label: Text(
-                    'Guardar',
+                    'Enregistrer',
                     style: TextStyle(
                       color: Colors.white,
                       fontSize: 18.0,
diff --git a/lib/utils/aleatoria.dart b/lib/utils/aleatoria.dart
deleted file mode 100644
index 17a627d83ea935bcb8e18869a8c25de7550549f0..0000000000000000000000000000000000000000
--- a/lib/utils/aleatoria.dart
+++ /dev/null
@@ -1,139 +0,0 @@
-import 'dart:async';
-import 'package:html/parser.dart';
-import 'package:html/dom.dart';
-import 'package:http/http.dart' as http;
-import 'dart:convert';
-import 'package:flutter/services.dart';
-import 'dart:math' show Random;
-import 'package:diacritic/diacritic.dart';
-import 'package:list_spanish_words/list_spanish_words.dart';
-
-class Aleatoria {
-  final String nivel;
-  Aleatoria(this.nivel);
-
-  String _url;
-  String _palabra;
-  String _pista;
-  final random = Random();
-
-  init() async {
-    switch (nivel) {
-      case 'Temas':
-        await palabraLocal();
-        break;
-      case 'Avanzado':
-        _url = 'https://www.palabrasaleatorias.com/?fs=1&fs2=0&Submit=Nueva+palabra';
-        //_url = 'https://www.aleatorios.com/?fs=1&fs2=0&Submit=Nueva+palabra';
-        await palabraWeb(_url);
-        break;
-      case 'Junior':
-        _url = 'https://www.palabrasaleatorias.com/?fs=1&fs2=1&Submit=Nueva+palabra';
-        //_url = 'https://www.aleatorios.com/?fs=1&fs2=1&Submit=Nueva+palabra';
-        await palabraWeb(_url);
-        break;
-      case 'Experto':
-        await listSpanishWords();
-        //listSpanishWords().then((word) => _palabra = word);
-        break;
-      default:
-        await palabraLocal();
-    }
-  }
-
-  /*<table border="1" align="center" style="border: #001 2px dotted; text-align:center;" >
-    <tr>
-    <td align="center" style="margin:15px;padding:15px; margin-top:5px">
-    <br /><div style="font-size:3em; color:#6200C5;">
-    Elegante</div>*/
-
-  Future<void> palabraWeb(String url) async {
-    try {
-      var response = await http.Client().get(Uri.parse(url));
-      //var response = await http.Client().get(url);
-      if (response.statusCode == 200) {
-        // var html = parse(response.body);
-        var html = parse(utf8.decode(response.bodyBytes));
-        //List<Element> divs = html.querySelectorAll('div');
-        Element elemento = html.getElementsByTagName('div').last;
-        String palabra = _validar(elemento.text);
-        if (palabra == null) {
-          throw Exception();
-        }
-        _palabra = palabra;
-      } else {
-        throw Exception();
-      }
-    } catch (e) {
-      _palabra = null;
-    }
-  }
-
-  String _validar(String palabra) {
-    String valida = palabra.trim();
-    if (valida.contains(' ')) {
-      return null;
-    }
-    valida = removeDiacritics(valida);
-    valida = valida.toUpperCase();
-    valida = valida.replaceAll(RegExp('[0-9]'), '');
-    valida = valida.replaceAll(RegExp('[^A-ZÑ]'), '');
-    if (valida.length < 3 || valida.length > 12) {
-      return null;
-    }
-    return valida;
-  }
-
-  Future _waitLista() => Future(() {
-        final completer = Completer();
-        int indexRandom = random.nextInt(630000);
-        completer.complete(list_spanish_words.sublist(indexRandom, indexRandom + 1).join('\n'));
-        return completer.future;
-      });
-
-  listSpanishWords() async {
-    /* try {
-      int indexRandom = random.nextInt(630000);
-      String word = _validar(list_spanish_words.sublist(indexRandom, indexRandom + 1).join('\n'));
-      if (word == null) {
-        throw Exception();
-      }
-      _palabra = word;
-    } catch (e) {
-      _palabra = null;
-    } */
-    var wordLista = await _waitLista();
-    var word = _validar(wordLista);
-    _palabra = word;
-  }
-
-  Future<void> palabraLocal() async {
-    String jsonString;
-    try {
-      jsonString = await rootBundle.loadString('assets/files/vocabulario.json');
-      final jsonResponse = await json.decode(jsonString);
-      var vocabulario = jsonResponse[jsonResponse.keys.toList().join()];
-      //List<String> keys = vocabulario[0].keys.toList();
-      int objetoRandom = random.nextInt(vocabulario.length);
-      //String categoria = vocabulario[objetoRandom]['CATEGORIA'];
-      /* var categorias = [];
-              for (int i = 0; i < vocabulario.length; i++) {
-              categorias.add(vocabulario[i]['CATEGORIA']);
-              }
-              String categoriaRandom = categorias[random.nextInt(categorias.length)];*/
-      _pista = vocabulario[objetoRandom]['PISTA'];
-      List<String> palabras = [];
-      for (var palabra in vocabulario[objetoRandom]['PALABRAS']) {
-        palabras.add(palabra);
-      }
-      String palabra = palabras[random.nextInt(palabras.length)];
-      _palabra = palabra ?? 'UNEXPECTED ERROR';
-    } catch (e) {
-      _palabra = 'UNEXPECTED ERROR';
-    }
-  }
-
-  String get palabra => _palabra;
-
-  String get pista => _pista;
-}
diff --git a/lib/utils/constantes.dart b/lib/utils/constantes.dart
deleted file mode 100644
index 6a494c19ffd945c9d36d940641fe3c06661860be..0000000000000000000000000000000000000000
--- a/lib/utils/constantes.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-import 'package:flutter/material.dart';
-
-const String letras = 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ';
-
-const Map<bool, List<String>> modoOnline = {
-  false: ['Temas', 'Experto'],
-  true: ['Junior', 'Avanzado'],
-};
-
-const String defaultNivel = 'Temas';
-
-//colores
-const int verdeOscuro = 0xff013220;
-const int pizarra = 0xff004D00;
-const int accent = 0xffD81B60;
-/*
-<color name="colorPrimary">#008577</color>
-<color name="colorPrimaryDark">#00574B</color>
-<color name="colorAccent">#D81B60</color>
-<color name="pizarra">#004D00</color>
-*/
-
-// GameOver
-enum GameOver { VITORIA, DERROTA }
-
-extension GameOverExtension on GameOver {
-  static const titulos = {
-    GameOver.VITORIA: '¡Victoria!',
-    GameOver.DERROTA: '¡Ahorcado!',
-  };
-
-  String get titulo => titulos[this];
-
-  static const iconos = {
-    GameOver.VITORIA: Icons.military_tech,
-    GameOver.DERROTA: Icons.gavel,
-  };
-
-  IconData get icono => iconos[this];
-}
-
-const victoria = GameOver.VITORIA;
-const derrota = GameOver.DERROTA;
diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart
new file mode 100644
index 0000000000000000000000000000000000000000..7b9aa37d491974c46cd3917a7cf1449a96aeb3f5
--- /dev/null
+++ b/lib/utils/constants.dart
@@ -0,0 +1,43 @@
+import 'package:flutter/material.dart';
+
+const String letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+const Map<bool, List<String>> onlineGameMode = {
+  false: ['Thèmes', 'Expert'],
+  true: ['Junior', 'Avancé'],
+};
+
+const String defaultLevel = 'Thèmes';
+
+//colores
+const int darkGreen = 0xff013220;
+const int board = 0xff004D00;
+const int accent = 0xffD81B60;
+/*
+<color name="colorPrimary">#008577</color>
+<color name="colorPrimaryDark">#00574B</color>
+<color name="colorAccent">#D81B60</color>
+<color name="pizarra">#004D00</color>
+*/
+
+// GameOver
+enum GameOver { VICTORY, DEFEAT }
+
+extension GameOverExtension on GameOver {
+  static const titles = {
+    GameOver.VICTORY: 'Victoire !',
+    GameOver.DEFEAT: 'Pendu !',
+  };
+
+  String get title => titles[this];
+
+  static const icons = {
+    GameOver.VICTORY: Icons.military_tech,
+    GameOver.DEFEAT: Icons.gavel,
+  };
+
+  IconData get icon => icons[this];
+}
+
+const victory = GameOver.VICTORY;
+const defeat = GameOver.DEFEAT;
diff --git a/lib/utils/random_pick.dart b/lib/utils/random_pick.dart
new file mode 100644
index 0000000000000000000000000000000000000000..754ec3899d14f6ac17a776a531696502d45a99ad
--- /dev/null
+++ b/lib/utils/random_pick.dart
@@ -0,0 +1,110 @@
+import 'dart:async';
+import 'package:html/parser.dart';
+import 'package:html/dom.dart';
+import 'package:http/http.dart' as http;
+import 'dart:convert';
+import 'package:flutter/services.dart';
+import 'dart:math' show Random;
+import 'package:diacritic/diacritic.dart';
+import 'package:list_french_words/list_french_words.dart';
+
+class RandomPick {
+  final String level;
+  RandomPick(this.level);
+
+  String _url;
+  String _word;
+  String _clue;
+  final random = Random();
+
+  init() async {
+    switch (level) {
+      case 'Thèmes':
+        await wordFromLocal();
+        break;
+      case 'Avancé':
+        _url = 'https://www.palabrasaleatorias.com/mots-aleatoires.php?fs=1&fs2=0&Submit=Nouveau+mot';
+        await wordFromWeb(_url);
+        break;
+      case 'Junior':
+        _url = 'https://www.palabrasaleatorias.com/mots-aleatoires.php?fs=1&fs2=1&Submit=Nouveau+mot';
+        await wordFromWeb(_url);
+        break;
+      case 'Expert':
+        await wordFromPackage();
+        break;
+      default:
+        await wordFromLocal();
+    }
+  }
+
+  Future<void> wordFromWeb(String url) async {
+    try {
+      var response = await http.Client().get(Uri.parse(url));
+      if (response.statusCode == 200) {
+        var html = parse(utf8.decode(response.bodyBytes));
+        Element element = html.getElementsByTagName('div').last;
+        String word = _validate(element.text);
+        if (word == null) {
+          throw Exception();
+        }
+        _word = word;
+      } else {
+        throw Exception();
+      }
+    } catch (e) {
+      _word = null;
+    }
+  }
+
+  String _validate(String word) {
+    String wordToValidate = word.trim();
+    if (wordToValidate.contains(' ')) {
+      return null;
+    }
+    wordToValidate = removeDiacritics(wordToValidate);
+    wordToValidate = wordToValidate.toUpperCase();
+    wordToValidate = wordToValidate.replaceAll(RegExp('[0-9]'), '');
+    wordToValidate = wordToValidate.replaceAll(RegExp('[^A-Z]'), '');
+    if (wordToValidate.length < 3 || wordToValidate.length > 12) {
+      return null;
+    }
+    return wordToValidate;
+  }
+
+  Future _waitList() => Future(() {
+        final completer = Completer();
+        int indexRandom = random.nextInt(630000);
+        completer.complete(list_french_words.sublist(indexRandom, indexRandom + 1).join('\n'));
+        return completer.future;
+      });
+
+  wordFromPackage() async {
+    var wordList = await _waitList();
+    var word = _validate(wordList);
+    _word = word;
+  }
+
+  Future<void> wordFromLocal() async {
+    String jsonString;
+    try {
+      jsonString = await rootBundle.loadString('assets/files/word-list-fr.json');
+      final jsonResponse = await json.decode(jsonString);
+      var wordList = jsonResponse[jsonResponse.keys.toList().join()];
+      int randomCategoryIndex = random.nextInt(wordList.length);
+      _clue = wordList[randomCategoryIndex]['clue'];
+      List<String> words = [];
+      for (var word in wordList[randomCategoryIndex]['words']) {
+        words.add(word);
+      }
+      String word = words[random.nextInt(words.length)];
+      _word = word ?? 'UNEXPECTED ERROR';
+    } catch (e) {
+      _word = 'UNEXPECTED ERROR';
+    }
+  }
+
+  String get word => _word;
+
+  String get clue => _clue;
+}
diff --git a/lib/utils/shared_prefs.dart b/lib/utils/shared_prefs.dart
index 06e9424bf860a91a8c935cab5fa3e2d03d6c2b64..9291b99dcf3db0c4f10382ac42e570160ef89530 100644
--- a/lib/utils/shared_prefs.dart
+++ b/lib/utils/shared_prefs.dart
@@ -3,10 +3,10 @@ import 'package:shared_preferences/shared_preferences.dart';
 class SharedPrefs {
   static SharedPreferences _sharedPrefs;
   static const String _prefsSound = 'sound';
-  static const String _prefsModo = 'modo';
-  static const String _prefsNivel = 'nivel';
-  static const String _prefsVictorias = 'victorias';
-  static const String _prefsDerrotas = 'derrotas';
+  static const String _prefsGameMode = 'gameMode';
+  static const String _prefsLevel = 'level';
+  static const String _prefsVictoryCount = 'victoryCount';
+  static const String _prefsDefeatCount = 'defeatCount';
 
   init() async {
     if (_sharedPrefs == null) {
@@ -18,19 +18,19 @@ class SharedPrefs {
 
   set sound(bool value) => _sharedPrefs.setBool(_prefsSound, value);
 
-  bool get modo => _sharedPrefs?.getBool(_prefsModo);
+  bool get gameMode => _sharedPrefs?.getBool(_prefsGameMode);
 
-  set modo(bool value) => _sharedPrefs.setBool(_prefsModo, value);
+  set gameMode(bool value) => _sharedPrefs.setBool(_prefsGameMode, value);
 
-  String get nivel => _sharedPrefs?.getString(_prefsNivel);
+  String get level => _sharedPrefs?.getString(_prefsLevel);
 
-  set nivel(String value) => _sharedPrefs.setString(_prefsNivel, value);
+  set level(String value) => _sharedPrefs.setString(_prefsLevel, value);
 
-  int get victorias => _sharedPrefs?.getInt(_prefsVictorias);
+  int get victoryCount => _sharedPrefs?.getInt(_prefsVictoryCount);
 
-  set victorias(int value) => _sharedPrefs?.setInt(_prefsVictorias, value);
+  set victoryCount(int value) => _sharedPrefs?.setInt(_prefsVictoryCount, value);
 
-  int get derrotas => _sharedPrefs?.getInt(_prefsDerrotas);
+  int get defeatCount => _sharedPrefs?.getInt(_prefsDefeatCount);
 
-  set derrotas(int value) => _sharedPrefs?.setInt(_prefsDerrotas, value);
+  set defeatCount(int value) => _sharedPrefs?.setInt(_prefsDefeatCount, value);
 }
diff --git a/lib/utils/sonido.dart b/lib/utils/sonido.dart
deleted file mode 100644
index e304a6be15e1c933366b831fc5eca0b2e98055cc..0000000000000000000000000000000000000000
--- a/lib/utils/sonido.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-import 'package:assets_audio_player/assets_audio_player.dart';
-
-enum Archivo { acierto, error, derrota, victoria }
-
-extension ArchivoExtension on Archivo {
-  static const files = {
-    Archivo.acierto: 'assets/audio/acierto.aac',
-    Archivo.error: 'assets/audio/error.aac',
-    Archivo.derrota: 'assets/audio/gameover.aac',
-    Archivo.victoria: 'assets/audio/victoria.aac',
-  };
-
-  String get file => files[this];
-}
-
-class Sound {
-  AssetsAudioPlayer assetsAudioPlayer;
-
-  Sound() {
-    assetsAudioPlayer = AssetsAudioPlayer();
-  }
-
-  Future<void> play(String archivo) async => await assetsAudioPlayer.open(Audio(archivo));
-
-  Future<void> stop() async => await assetsAudioPlayer.stop();
-}
diff --git a/lib/utils/sound.dart b/lib/utils/sound.dart
new file mode 100644
index 0000000000000000000000000000000000000000..75f98581370e4f8b82fdd55b53f172bc827fc3e3
--- /dev/null
+++ b/lib/utils/sound.dart
@@ -0,0 +1,26 @@
+import 'package:assets_audio_player/assets_audio_player.dart';
+
+enum Archive { success, error, defeat, victory }
+
+extension ArchiveExtension on Archive {
+  static const files = {
+    Archive.success: 'assets/audio/success.aac',
+    Archive.error: 'assets/audio/error.aac',
+    Archive.defeat: 'assets/audio/gameover.aac',
+    Archive.victory: 'assets/audio/victory.aac',
+  };
+
+  String get file => files[this];
+}
+
+class Sound {
+  AssetsAudioPlayer assetsAudioPlayer;
+
+  Sound() {
+    assetsAudioPlayer = AssetsAudioPlayer();
+  }
+
+  Future<void> play(String archive) async => await assetsAudioPlayer.open(Audio(archive));
+
+  Future<void> stop() async => await assetsAudioPlayer.stop();
+}
diff --git a/lib/widgets/botones_letras.dart b/lib/widgets/botones_letras.dart
deleted file mode 100644
index eb1d9ccdc9bf8ad4f24ae99e160c3d3d9f2b4934..0000000000000000000000000000000000000000
--- a/lib/widgets/botones_letras.dart
+++ /dev/null
@@ -1,104 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:provider/provider.dart';
-import '../provider/data.dart';
-import '../utils/constantes.dart';
-import '../utils/sonido.dart';
-import '../widgets/dialogo_otra.dart';
-
-class BotonesLetras extends StatelessWidget {
-  const BotonesLetras({Key key}) : super(key: key);
-
-  @override
-  Widget build(BuildContext context) {
-    Orientation orientacion = MediaQuery.of(context).orientation;
-    var size = MediaQuery.of(context).size;
-    /*24 is for notification bar on Android*/
-    //final double itemHeight = (size.height - kToolbarHeight - 24) / 2;
-    //final double itemWidth = size.width / 2;
-    final double paddingTop = MediaQuery.of(context).padding.top;
-    final double itemHeight = (size.height - paddingTop) / 2;
-    final double itemWidth = size.width / 2;
-
-    Data _myProvider = Provider.of<Data>(context);
-    Sound sonido = Sound();
-
-    List<String> listaLetras = letras.split('');
-    List<Widget> teclas = [];
-    listaLetras.forEach((key) {
-      teclas.add(
-        Padding(
-          padding: const EdgeInsets.all(2.0),
-          child: RaisedButton(
-            disabledColor: Colors.grey,
-            disabledTextColor: Colors.white,
-            splashColor: Color(accent),
-            onPressed: _myProvider.letrasUsadas.contains(key)
-                ? null
-                : () async {
-                    _myProvider.updateLetrasUsadas(key);
-                    if (_myProvider.palabraSecreta.contains(key)) {
-                      for (int index = 0; index < _myProvider.palabraSecreta.length; index++) {
-                        if (key == _myProvider.palabraSecreta[index]) {
-                          _myProvider.updateOculta(index, key);
-                        }
-                      }
-
-                      if (_myProvider.palabraOculta == _myProvider.palabraSecreta) {
-                        _myProvider.sumaVictoria();
-                        if (_myProvider.soundValor == true) {
-                          sonido.play(Archivo.victoria.file);
-                        }
-                        showDialog(
-                          context: context,
-                          builder: (context) => DialogoOtra(victoria, sonido),
-                        );
-                      } else {
-                        if (_myProvider.soundValor == true) {
-                          sonido.play(Archivo.acierto.file);
-                        }
-                      }
-                    } else {
-                      _myProvider.sumaError();
-                      if (_myProvider.errores == 6) {
-                        if (_myProvider.soundValor == true) {
-                          await sonido.play(Archivo.error.file);
-                          await Future.delayed(Duration(seconds: 1));
-                          await sonido.play(Archivo.derrota.file);
-                        }
-                        await Future.delayed(Duration(milliseconds: 900)); //????
-                        _myProvider.sumaDerrota();
-                        showDialog(
-                          context: context,
-                          builder: (context) => DialogoOtra(derrota, sonido),
-                        );
-                      } else {
-                        if (_myProvider.soundValor == true) {
-                          sonido.play(Archivo.error.file);
-                        }
-                      }
-                    }
-                  },
-            child: Text(
-              key,
-              textAlign: TextAlign.center,
-            ),
-            color: Colors.grey[200],
-          ),
-        ),
-      );
-    });
-    return Container(
-      alignment: orientacion == Orientation.portrait ? Alignment.bottomCenter : Alignment.center,
-      color: Color(verdeOscuro),
-      padding: EdgeInsets.all(10.0),
-      margin: EdgeInsets.only(top: orientacion == Orientation.portrait ? 0.0 : paddingTop),
-      child: GridView.count(
-        padding: EdgeInsets.zero,
-        shrinkWrap: true,
-        crossAxisCount: orientacion == Orientation.portrait ? 9 : 3,
-        childAspectRatio: orientacion == Orientation.portrait ? 1 / 1 : (itemWidth / itemHeight),
-        children: teclas,
-      ),
-    );
-  }
-}
diff --git a/lib/widgets/dialog_fetch_error.dart b/lib/widgets/dialog_fetch_error.dart
new file mode 100644
index 0000000000000000000000000000000000000000..fad566546938220cacae00ee385a2b56000809cb
--- /dev/null
+++ b/lib/widgets/dialog_fetch_error.dart
@@ -0,0 +1,32 @@
+import 'package:hangman/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class DialogFetchError extends StatelessWidget {
+  const DialogFetchError({Key key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: Color(board),
+      body: WillPopScope(
+        onWillPop: () async => false,
+        child: AlertDialog(
+          title: Text('Connexion impossible'),
+          content: Text('Impossible de récupérer un mot aléatoire. '
+              'La connexion internet est peut-être inaccessible.\n'
+              'Changer vers un mode de jeu hors-ligne ?'),
+          actions: [
+            FlatButton(
+              child: const Text('REVENIR'),
+              onPressed: () => Navigator.pop(context, false),
+            ),
+            FlatButton(
+              child: const Text('ACCEPTER'),
+              onPressed: () => Navigator.pop(context, true),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/widgets/dialogo_otra.dart b/lib/widgets/dialog_gameover.dart
similarity index 61%
rename from lib/widgets/dialogo_otra.dart
rename to lib/widgets/dialog_gameover.dart
index c77b120f7941bacea672f969ffbbfac17337cdaa..05f1bf97dd33cfd72205cd51332473079f306d36 100644
--- a/lib/widgets/dialogo_otra.dart
+++ b/lib/widgets/dialog_gameover.dart
@@ -1,31 +1,31 @@
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
 import '../screens/home.dart';
-import '../screens/juego.dart';
+import '../screens/game.dart';
 import '../provider/data.dart';
-import '../utils/constantes.dart';
-import '../utils/sonido.dart';
+import '../utils/constants.dart';
+import '../utils/sound.dart';
 
-class DialogoOtra extends StatelessWidget {
+class DialogGameOver extends StatelessWidget {
   final GameOver gameOver;
-  final Sound sonido;
-  const DialogoOtra(this.gameOver, this.sonido);
+  final Sound sound;
+  const DialogGameOver(this.gameOver, this.sound);
 
   @override
   Widget build(BuildContext context) {
     Data _myProvider = Provider.of<Data>(context);
     return Scaffold(
       backgroundColor: Colors.transparent,
-      body: _myProvider.buscando == true
+      body: _myProvider.searching == true
           ? Center(child: CircularProgressIndicator())
           : WillPopScope(
               onWillPop: () async => false,
               child: AlertDialog(
                 title: Row(
                   children: [
-                    Icon(gameOver.icono),
+                    Icon(gameOver.icon),
                     SizedBox(width: 10.0),
-                    Text(gameOver.titulo),
+                    Text(gameOver.title),
                   ],
                 ),
                 content: SingleChildScrollView(
@@ -33,27 +33,27 @@ class DialogoOtra extends StatelessWidget {
                     crossAxisAlignment: CrossAxisAlignment.start,
                     mainAxisSize: MainAxisSize.min,
                     children: [
-                      if (gameOver == GameOver.DERROTA)
-                        Text('La palabra secreta era ${_myProvider.palabraSecreta}'),
-                      Text('¿Otra partida?'),
+                      if (gameOver == GameOver.DEFEAT)
+                        Text('Le mot secret était ${_myProvider.secretWord}'),
+                      Text('Rejouer ?'),
                     ],
                   ),
                 ),
                 actions: [
                   FlatButton(
-                    child: const Text('CANCELAR'),
+                    child: const Text('QUITTER'),
                     onPressed: () {
-                      if (_myProvider.soundValor == true) {
-                        sonido.stop();
+                      if (_myProvider.soundValue == true) {
+                        sound.stop();
                       }
                       Navigator.pushNamed(context, Home.id);
                     },
                   ),
                   FlatButton(
-                    child: const Text('ACEPTAR'),
+                    child: const Text('REJOUER'),
                     onPressed: () async {
-                      _myProvider.resetAciertosErrores();
-                      await Juego().buscarPalabra(context, _myProvider);
+                      _myProvider.resetSuccessAndErrors();
+                      await Game().pickWord(context, _myProvider);
                       Navigator.of(context).pop();
                     },
                   ),
diff --git a/lib/widgets/diaolog_not_found.dart b/lib/widgets/diaolog_not_found.dart
deleted file mode 100644
index 18789b759a68bba5429bced1b53d797e82635d4f..0000000000000000000000000000000000000000
--- a/lib/widgets/diaolog_not_found.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-import 'package:ahorcado/utils/constantes.dart';
-import 'package:flutter/material.dart';
-
-class DialogoNotFound extends StatelessWidget {
-  const DialogoNotFound({Key key}) : super(key: key);
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-      backgroundColor: Color(pizarra),
-      body: WillPopScope(
-        onWillPop: () async => false,
-        child: AlertDialog(
-          title: Text('Fallo de conexión'),
-          content: Text('No ha sido posible seleccionar ninguna palabra. '
-              'Es posible que la conexión a internet haya fallado.\n'
-              '¿Cambiar al modo Temas sin internet?'),
-          actions: [
-            FlatButton(
-              child: const Text('VOLVER'),
-              onPressed: () => Navigator.pop(context, false),
-            ),
-            FlatButton(
-              child: const Text('ACEPTAR'),
-              onPressed: () => Navigator.pop(context, true),
-            ),
-          ],
-        ),
-      ),
-    );
-  }
-}
diff --git a/lib/widgets/letters.dart b/lib/widgets/letters.dart
new file mode 100644
index 0000000000000000000000000000000000000000..7b4bf276e837822f1a2d048da9ce227e6f2a2dd1
--- /dev/null
+++ b/lib/widgets/letters.dart
@@ -0,0 +1,104 @@
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import '../provider/data.dart';
+import '../utils/constants.dart';
+import '../utils/sound.dart';
+import '../widgets/dialog_gameover.dart';
+
+class LetterButtons extends StatelessWidget {
+  const LetterButtons({Key key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    Orientation orientation = MediaQuery.of(context).orientation;
+    var size = MediaQuery.of(context).size;
+    /*24 is for notification bar on Android*/
+    //final double itemHeight = (size.height - kToolbarHeight - 24) / 2;
+    //final double itemWidth = size.width / 2;
+    final double paddingTop = MediaQuery.of(context).padding.top;
+    final double itemHeight = (size.height - paddingTop) / 2;
+    final double itemWidth = size.width / 2;
+
+    Data _myProvider = Provider.of<Data>(context);
+    Sound sound = Sound();
+
+    List<String> lettersList = letters.split('');
+    List<Widget> keys = [];
+    lettersList.forEach((key) {
+      keys.add(
+        Padding(
+          padding: const EdgeInsets.all(2.0),
+          child: RaisedButton(
+            disabledColor: Colors.grey,
+            disabledTextColor: Colors.white,
+            splashColor: Color(accent),
+            onPressed: _myProvider.usedLetters.contains(key)
+                ? null
+                : () async {
+                    _myProvider.updateUsedLetters(key);
+                    if (_myProvider.secretWord.contains(key)) {
+                      for (int index = 0; index < _myProvider.secretWord.length; index++) {
+                        if (key == _myProvider.secretWord[index]) {
+                          _myProvider.updateHiddenWord(index, key);
+                        }
+                      }
+
+                      if (_myProvider.hiddenWord == _myProvider.secretWord) {
+                        _myProvider.addVictory();
+                        if (_myProvider.soundValue == true) {
+                          sound.play(Archive.victory.file);
+                        }
+                        showDialog(
+                          context: context,
+                          builder: (context) => DialogGameOver(victory, sound),
+                        );
+                      } else {
+                        if (_myProvider.soundValue == true) {
+                          sound.play(Archive.success.file);
+                        }
+                      }
+                    } else {
+                      _myProvider.addError();
+                      if (_myProvider.errors == 6) {
+                        if (_myProvider.soundValue == true) {
+                          await sound.play(Archive.error.file);
+                          await Future.delayed(Duration(seconds: 1));
+                          await sound.play(Archive.defeat.file);
+                        }
+                        await Future.delayed(Duration(milliseconds: 900)); //????
+                        _myProvider.addDefeat();
+                        showDialog(
+                          context: context,
+                          builder: (context) => DialogGameOver(defeat, sound),
+                        );
+                      } else {
+                        if (_myProvider.soundValue == true) {
+                          sound.play(Archive.error.file);
+                        }
+                      }
+                    }
+                  },
+            child: Text(
+              key,
+              textAlign: TextAlign.center,
+            ),
+            color: Colors.grey[200],
+          ),
+        ),
+      );
+    });
+    return Container(
+      alignment: orientation == Orientation.portrait ? Alignment.bottomCenter : Alignment.center,
+      color: Color(darkGreen),
+      padding: EdgeInsets.all(10.0),
+      margin: EdgeInsets.only(top: orientation == Orientation.portrait ? 0.0 : paddingTop),
+      child: GridView.count(
+        padding: EdgeInsets.zero,
+        shrinkWrap: true,
+        crossAxisCount: orientation == Orientation.portrait ? 9 : 3,
+        childAspectRatio: orientation == Orientation.portrait ? 1 / 1 : (itemWidth / itemHeight),
+        children: keys,
+      ),
+    );
+  }
+}
diff --git a/lib/widgets/my_app_bar.dart b/lib/widgets/my_app_bar.dart
index ec5fd3d3c7bfaa50a2e49ecb37ea612ea8c43326..e7160c25b614286d75799367b55ca28e04ba0289 100644
--- a/lib/widgets/my_app_bar.dart
+++ b/lib/widgets/my_app_bar.dart
@@ -3,8 +3,8 @@ import 'package:flutter/services.dart' show SystemNavigator;
 import 'package:provider/provider.dart';
 
 import '../provider/data.dart';
-import '../screens/ajustes.dart';
-import '../screens/marcador.dart';
+import '../screens/settings.dart';
+import '../screens/scores.dart';
 import '../screens/info.dart';
 
 class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
@@ -19,35 +19,35 @@ class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
     Data _myProvider = Provider.of<Data>(context);
 
     return AppBar(
-      title: Text('Ahorcado'),
+      title: Text('Hangman'),
       automaticallyImplyLeading: false,
       actions: [
         IconButton(
           icon: Icon(Icons.settings),
           onPressed: () {
-            _myProvider.resetValores();
+            _myProvider.resetValues();
             Scaffold.of(context).removeCurrentSnackBar();
-            Navigator.pushNamed(context, Ajustes.id);
+            Navigator.pushNamed(context, Settings.id);
           },
         ),
         PopupMenuButton<String>(
           onSelected: (String value) {
             switch (value) {
-              case 'Salir':
+              case 'Quitter':
                 SystemNavigator.pop();
                 break;
-              case 'Marcador':
+              case 'Scores':
                 Scaffold.of(context).removeCurrentSnackBar();
-                Navigator.pushNamed(context, Marcador.id);
+                Navigator.pushNamed(context, Scores.id);
                 break;
-              case 'Info':
+              case 'Informations':
                 Scaffold.of(context).removeCurrentSnackBar();
                 Navigator.pushNamed(context, Info.id);
                 break;
             }
           },
           itemBuilder: (BuildContext context) {
-            return {'Marcador', 'Info', 'Salir'}.map((String choice) {
+            return {'Scores', 'Informations', 'Quitter'}.map((String choice) {
               return PopupMenuItem<String>(
                 value: choice,
                 child: Text(choice),
diff --git a/pubspec.lock b/pubspec.lock
index 03554810d6b4f54202f12a75da07de2274617a5e..cc0ded11ae7ec9168c72ad96d343d6f5bb40b96b 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -7,56 +7,56 @@ packages:
       name: assets_audio_player
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.13+1"
+    version: "2.0.14"
   assets_audio_player_web:
     dependency: transitive
     description:
       name: assets_audio_player_web
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.13+1"
+    version: "2.0.14"
   async:
     dependency: transitive
     description:
       name: async
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.5.0-nullsafety.1"
+    version: "2.5.0"
   boolean_selector:
     dependency: transitive
     description:
       name: boolean_selector
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.0-nullsafety.1"
+    version: "2.1.0"
   characters:
     dependency: transitive
     description:
       name: characters
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.0-nullsafety.3"
+    version: "1.1.0"
   charcode:
     dependency: transitive
     description:
       name: charcode
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.0-nullsafety.1"
+    version: "1.2.0"
   clock:
     dependency: transitive
     description:
       name: clock
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.0-nullsafety.1"
+    version: "1.1.0"
   collection:
     dependency: transitive
     description:
       name: collection
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.15.0-nullsafety.3"
+    version: "1.15.0"
   convert:
     dependency: transitive
     description:
@@ -84,35 +84,35 @@ packages:
       name: cupertino_icons
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.2"
   diacritic:
     dependency: "direct main"
     description:
       name: diacritic
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.1.1"
+    version: "0.1.3"
   fake_async:
     dependency: transitive
     description:
       name: fake_async
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.0-nullsafety.1"
+    version: "1.2.0"
   ffi:
     dependency: transitive
     description:
       name: ffi
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.1.3"
+    version: "1.0.0"
   file:
     dependency: transitive
     description:
       name: file
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "5.2.1"
+    version: "6.1.0"
   flutter:
     dependency: "direct main"
     description: flutter
@@ -149,55 +149,55 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "3.1.4"
-  intl:
+  js:
     dependency: transitive
     description:
-      name: intl
+      name: js
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.16.1"
-  list_spanish_words:
+    version: "0.6.3"
+  list_french_words:
     dependency: "direct main"
     description:
-      name: list_spanish_words
+      name: list_french_words
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.1.0"
+    version: "0.1.0+1"
   matcher:
     dependency: transitive
     description:
       name: matcher
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.12.10-nullsafety.1"
+    version: "0.12.10"
   meta:
     dependency: transitive
     description:
       name: meta
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.3.0-nullsafety.3"
+    version: "1.3.0"
   nested:
     dependency: transitive
     description:
       name: nested
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.0.4"
+    version: "1.0.0"
   package_info:
     dependency: "direct main"
     description:
       name: package_info
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.4.3+2"
+    version: "0.4.3+4"
   path:
     dependency: transitive
     description:
       name: path
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.8.0-nullsafety.1"
+    version: "1.8.0"
   path_provider:
     dependency: transitive
     description:
@@ -232,21 +232,21 @@ packages:
       name: path_provider_windows
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.0.4+3"
+    version: "0.0.5"
   pedantic:
     dependency: transitive
     description:
       name: pedantic
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.9.2"
+    version: "1.11.0"
   platform:
     dependency: transitive
     description:
       name: platform
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.2.1"
+    version: "3.0.0"
   plugin_platform_interface:
     dependency: transitive
     description:
@@ -260,21 +260,21 @@ packages:
       name: process
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.0.13"
+    version: "4.1.0"
   provider:
     dependency: "direct main"
     description:
       name: provider
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "4.3.2+4"
+    version: "4.3.3"
   rxdart:
     dependency: transitive
     description:
       name: rxdart
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.24.1"
+    version: "0.25.0"
   shared_preferences:
     dependency: "direct main"
     description:
@@ -316,7 +316,7 @@ packages:
       name: shared_preferences_windows
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.0.1+3"
+    version: "0.0.2+3"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -328,49 +328,49 @@ packages:
       name: source_span
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.8.0-nullsafety.2"
+    version: "1.8.0"
   stack_trace:
     dependency: transitive
     description:
       name: stack_trace
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.10.0-nullsafety.1"
+    version: "1.10.0"
   stream_channel:
     dependency: transitive
     description:
       name: stream_channel
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.0-nullsafety.1"
+    version: "2.1.0"
   string_scanner:
     dependency: transitive
     description:
       name: string_scanner
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.0-nullsafety.1"
+    version: "1.1.0"
   term_glyph:
     dependency: transitive
     description:
       name: term_glyph
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.0-nullsafety.1"
+    version: "1.2.0"
   test_api:
     dependency: transitive
     description:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.19-nullsafety.2"
+    version: "0.2.19"
   typed_data:
     dependency: transitive
     description:
       name: typed_data
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.3.0-nullsafety.3"
+    version: "1.3.0"
   uuid:
     dependency: transitive
     description:
@@ -384,14 +384,14 @@ packages:
       name: vector_math
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.0-nullsafety.3"
+    version: "2.1.0"
   win32:
     dependency: transitive
     description:
       name: win32
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.7.4"
+    version: "2.0.2"
   xdg_directories:
     dependency: transitive
     description:
@@ -400,5 +400,5 @@ packages:
     source: hosted
     version: "0.1.2"
 sdks:
-  dart: ">=2.10.0-110 <2.11.0"
-  flutter: ">=1.16.0 <2.0.0"
+  dart: ">=2.12.0 <3.0.0"
+  flutter: ">=1.20.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 53406afcedc26bb18be762bca3bc888068ac3e4c..4320af8c1f5b57266187a95aecf045bfbea1b31c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: Hangman game, have fun with words and letters!
 
 publish_to: 'none' # Remove this line if you wish to publish to pub.dev
 
-version: 1.5.0+6
+version: 1.0.0
 
 environment:
   sdk: ">=2.7.0 <3.0.0"
@@ -20,7 +20,7 @@ dependencies:
   http: ^0.12.2
   diacritic: ^0.1.1
   assets_audio_player: ^2.0.13+1
-  list_spanish_words: ^0.1.0
+  list_french_words: ^0.1.0
 
 dev_dependencies:
   flutter_test:
diff --git a/test/widget_test.dart b/test/widget_test.dart
index 2106d0f672224af56c11e266a46ec2a311564bb0..6dc53c329f67440536cb8b3bc85c5cfb0e014c12 100644
--- a/test/widget_test.dart
+++ b/test/widget_test.dart
@@ -1,30 +1,10 @@
-// This is a basic Flutter widget test.
-//
-// To perform an interaction with a widget in your test, use the WidgetTester
-// utility that Flutter provides. For example, you can send tap and scroll
-// gestures. You can also use WidgetTester to find child widgets in the widget
-// tree, read text, and verify that the values of widget properties are correct.
-
 import 'package:flutter/material.dart';
 import 'package:flutter_test/flutter_test.dart';
 
-import 'package:ahorcado/main.dart';
+import 'package:hangman/main.dart';
 
 void main() {
   testWidgets('Counter increments smoke test', (WidgetTester tester) async {
-    // Build our app and trigger a frame.
-    await tester.pumpWidget(Ahorcado());
-
-    // Verify that our counter starts at 0.
-    expect(find.text('0'), findsOneWidget);
-    expect(find.text('1'), findsNothing);
-
-    // Tap the '+' icon and trigger a frame.
-    await tester.tap(find.byIcon(Icons.add));
-    await tester.pump();
-
-    // Verify that our counter has incremented.
-    expect(find.text('0'), findsNothing);
-    expect(find.text('1'), findsOneWidget);
+    await tester.pumpWidget(Hangman());
   });
 }