diff --git a/assets/translations/en.json b/assets/translations/en.json
index 367941aed80b5148183885a8fc2b575f72e2793e..583ee129a0a42812656cda9459d6f59b8887accf 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -1,6 +1,9 @@
 {
   "app_name": "Oware",
 
+  "page_home": "Home",
+  "page_game": "Game",
+
   "settings_title": "Settings",
   "settings_label_theme": "Theme mode",
 
diff --git a/assets/translations/fr.json b/assets/translations/fr.json
index 7eaeb3a2ecb9db37c70c7bc39303d72db2bdb8b1..82fd74fa4566aab7077290e467f4bb904bfaad75 100644
--- a/assets/translations/fr.json
+++ b/assets/translations/fr.json
@@ -1,6 +1,9 @@
 {
   "app_name": "Awalé",
 
+  "page_home": "Accueil",
+  "page_game": "Jeu",
+
   "settings_title": "Réglages",
   "settings_label_theme": "Thème de couleurs",
 
diff --git a/fastlane/metadata/android/en-US/changelogs/16.txt b/fastlane/metadata/android/en-US/changelogs/16.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ac2c90e221caf3cf01ebba168fb16a8f31c0253a
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/16.txt
@@ -0,0 +1 @@
+Normalize Activity application architecture.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/16.txt b/fastlane/metadata/android/fr-FR/changelogs/16.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1d6843d89ba84ea4147528bc3d62d9ecf1a4a762
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/16.txt
@@ -0,0 +1 @@
+Harmonisation des applications en Activity.
diff --git a/lib/common/config/activity_page.dart b/lib/common/config/activity_page.dart
new file mode 100644
index 0000000000000000000000000000000000000000..cce4d15585f898832b2800a80ad4b0af8978c315
--- /dev/null
+++ b/lib/common/config/activity_page.dart
@@ -0,0 +1,50 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/common/ui/pages/game.dart';
+import 'package:awale/common/ui/pages/parameters.dart';
+
+class ActivityPageItem {
+  final String code;
+  final Icon icon;
+  final Widget page;
+
+  const ActivityPageItem({
+    required this.code,
+    required this.icon,
+    required this.page,
+  });
+}
+
+class ActivityPage {
+  static const bool displayBottomNavBar = false;
+
+  static const indexHome = 0;
+  static const pageHome = ActivityPageItem(
+    code: 'page_home',
+    icon: Icon(UniconsLine.home),
+    page: PageParameters(),
+  );
+
+  static const indexGame = 1;
+  static const pageGame = ActivityPageItem(
+    code: 'page_game',
+    icon: Icon(UniconsLine.star),
+    page: PageGame(),
+  );
+
+  static const Map<int, ActivityPageItem> items = {
+    indexHome: pageHome,
+    indexGame: pageGame,
+  };
+
+  static int defaultPageIndex = indexHome;
+
+  static bool isIndexAllowed(int pageIndex) {
+    return items.keys.contains(pageIndex);
+  }
+
+  static Widget getWidget(int pageIndex) {
+    return items[pageIndex]?.page ?? pageHome.page;
+  }
+}
diff --git a/lib/common/config/screen.dart b/lib/common/config/screen.dart
new file mode 100644
index 0000000000000000000000000000000000000000..22aa1950d002b52026c142ed655ff1cc1f72e2ad
--- /dev/null
+++ b/lib/common/config/screen.dart
@@ -0,0 +1,55 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/common/ui/screens/about.dart';
+import 'package:awale/common/ui/screens/activity.dart';
+import 'package:awale/common/ui/screens/settings.dart';
+
+class ScreenItem {
+  final String code;
+  final Icon icon;
+  final Widget screen;
+
+  const ScreenItem({
+    required this.code,
+    required this.icon,
+    required this.screen,
+  });
+}
+
+class Screen {
+  static const indexActivity = 0;
+  static const screenActivity = ScreenItem(
+    code: 'screen_activity',
+    icon: Icon(UniconsLine.home),
+    screen: ScreenActivity(),
+  );
+
+  static const indexSettings = 1;
+  static const screenSettings = ScreenItem(
+    code: 'screen_settings',
+    icon: Icon(UniconsLine.setting),
+    screen: ScreenSettings(),
+  );
+
+  static const indexAbout = 2;
+  static const screenAbout = ScreenItem(
+    code: 'screen_about',
+    icon: Icon(UniconsLine.info_circle),
+    screen: ScreenAbout(),
+  );
+
+  static Map<int, ScreenItem> items = {
+    indexActivity: screenActivity,
+    indexSettings: screenSettings,
+    indexAbout: screenAbout,
+  };
+
+  static bool isIndexAllowed(int screenIndex) {
+    return items.keys.contains(screenIndex);
+  }
+
+  static Widget getWidget(int screenIndex) {
+    return items[screenIndex]?.screen ?? screenActivity.screen;
+  }
+}
diff --git a/lib/common/cubit/nav/nav_cubit_pages.dart b/lib/common/cubit/nav/nav_cubit_pages.dart
new file mode 100644
index 0000000000000000000000000000000000000000..fc4a214d905d9e6150646b74d94eee58c2342642
--- /dev/null
+++ b/lib/common/cubit/nav/nav_cubit_pages.dart
@@ -0,0 +1,33 @@
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/common/config/activity_page.dart';
+
+class NavCubitPage extends HydratedCubit<int> {
+  NavCubitPage() : super(0);
+
+  void updateIndex(int index) {
+    if (ActivityPage.isIndexAllowed(index)) {
+      emit(index);
+    } else {
+      emit(ActivityPage.indexHome);
+    }
+  }
+
+  void goToPageHome() {
+    updateIndex(ActivityPage.indexHome);
+  }
+
+  void goToPageGame() {
+    updateIndex(ActivityPage.indexGame);
+  }
+
+  @override
+  int fromJson(Map<String, dynamic> json) {
+    return ActivityPage.indexHome;
+  }
+
+  @override
+  Map<String, dynamic>? toJson(int state) {
+    return <String, int>{'index': state};
+  }
+}
diff --git a/lib/common/cubit/nav/nav_cubit_screens.dart b/lib/common/cubit/nav/nav_cubit_screens.dart
new file mode 100644
index 0000000000000000000000000000000000000000..f2dd0f44cf8986b9ca023fbae4ffdae50a0ac772
--- /dev/null
+++ b/lib/common/cubit/nav/nav_cubit_screens.dart
@@ -0,0 +1,37 @@
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/common/config/screen.dart';
+
+class NavCubitScreen extends HydratedCubit<int> {
+  NavCubitScreen() : super(0);
+
+  void updateIndex(int index) {
+    if (Screen.isIndexAllowed(index)) {
+      emit(index);
+    } else {
+      goToScreenActivity();
+    }
+  }
+
+  void goToScreenActivity() {
+    emit(Screen.indexActivity);
+  }
+
+  void goToScreenSettings() {
+    emit(Screen.indexSettings);
+  }
+
+  void goToScreenAbout() {
+    emit(Screen.indexAbout);
+  }
+
+  @override
+  int fromJson(Map<String, dynamic> json) {
+    return Screen.indexActivity;
+  }
+
+  @override
+  Map<String, dynamic>? toJson(int state) {
+    return <String, int>{'index': state};
+  }
+}
diff --git a/lib/common/ui/nav/bottom_nav_bar.dart b/lib/common/ui/nav/bottom_nav_bar.dart
new file mode 100644
index 0000000000000000000000000000000000000000..f05ebb951e601797d4518bc377aba50aecb38902
--- /dev/null
+++ b/lib/common/ui/nav/bottom_nav_bar.dart
@@ -0,0 +1,46 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/common/config/activity_page.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_pages.dart';
+
+class BottomNavBar extends StatelessWidget {
+  const BottomNavBar({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Card(
+      margin: const EdgeInsets.only(top: 1, right: 4, left: 4),
+      elevation: 4,
+      shadowColor: Theme.of(context).colorScheme.shadow,
+      color: Theme.of(context).colorScheme.surfaceContainerHighest,
+      shape: const RoundedRectangleBorder(
+        borderRadius: BorderRadius.only(
+          topLeft: Radius.circular(16),
+          topRight: Radius.circular(16),
+        ),
+      ),
+      child: BlocBuilder<NavCubitPage, int>(builder: (BuildContext context, int state) {
+        final List<BottomNavigationBarItem> items = [];
+
+        ActivityPage.items.forEach((int pageIndex, ActivityPageItem item) {
+          items.add(BottomNavigationBarItem(
+            icon: item.icon,
+            label: tr(item.code),
+          ));
+        });
+
+        return BottomNavigationBar(
+          currentIndex: state,
+          onTap: (int index) => BlocProvider.of<NavCubitPage>(context).updateIndex(index),
+          type: BottomNavigationBarType.fixed,
+          elevation: 0,
+          backgroundColor: Colors.transparent,
+          selectedItemColor: Theme.of(context).colorScheme.primary,
+          unselectedItemColor: Theme.of(context).textTheme.bodySmall!.color,
+          items: items,
+        );
+      }),
+    );
+  }
+}
diff --git a/lib/ui/widgets/global_app_bar.dart b/lib/common/ui/nav/global_app_bar.dart
similarity index 60%
rename from lib/ui/widgets/global_app_bar.dart
rename to lib/common/ui/nav/global_app_bar.dart
index eb0b08dab9774188e5b02383facd425ed6d337c1..b0e5c37f46cd5a92c047041e126994741efcf01f 100644
--- a/lib/ui/widgets/global_app_bar.dart
+++ b/lib/common/ui/nav/global_app_bar.dart
@@ -1,30 +1,33 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/config/menu.dart';
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/cubit/nav_cubit.dart';
-import 'package:awale/models/game/game.dart';
+import 'package:awale/common/config/screen.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_pages.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_screens.dart';
+
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/models/activity/activity.dart';
 
 class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
   const GlobalAppBar({super.key});
 
   @override
   Widget build(BuildContext context) {
-    return BlocBuilder<GameCubit, GameState>(
-      builder: (BuildContext context, GameState gameState) {
-        return BlocBuilder<NavCubit, int>(
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        return BlocBuilder<NavCubitScreen, int>(
           builder: (BuildContext context, int pageIndex) {
-            final Game currentGame = gameState.currentGame;
+            final Activity currentActivity = activityState.currentActivity;
 
             final List<Widget> menuActions = [];
 
-            if (currentGame.isRunning && !currentGame.isFinished) {
+            if (currentActivity.isRunning && !currentActivity.isFinished) {
               menuActions.add(StyledButton(
                 color: Colors.red,
                 onPressed: () {},
                 onLongPress: () {
-                  BlocProvider.of<GameCubit>(context).quitGame();
+                  BlocProvider.of<ActivityCubit>(context).quitActivity();
+                  BlocProvider.of<NavCubitPage>(context).goToPageHome();
                 },
                 child: const Image(
                   image: AssetImage('assets/ui/button_back.png'),
@@ -32,38 +35,38 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
                 ),
               ));
             } else {
-              if (pageIndex == Menu.indexGame) {
+              if (pageIndex == Screen.indexActivity) {
                 // go to Settings page
                 menuActions.add(ElevatedButton(
                   onPressed: () {
-                    BlocProvider.of<NavCubit>(context).goToSettingsPage();
+                    BlocProvider.of<NavCubitScreen>(context).goToScreenSettings();
                   },
                   style: ElevatedButton.styleFrom(
                     shape: const CircleBorder(),
                   ),
-                  child: Menu.menuItemSettings.icon,
+                  child: Screen.screenSettings.icon,
                 ));
 
                 // go to About page
                 menuActions.add(ElevatedButton(
                   onPressed: () {
-                    BlocProvider.of<NavCubit>(context).goToAboutPage();
+                    BlocProvider.of<NavCubitScreen>(context).goToScreenAbout();
                   },
                   style: ElevatedButton.styleFrom(
                     shape: const CircleBorder(),
                   ),
-                  child: Menu.menuItemAbout.icon,
+                  child: Screen.screenAbout.icon,
                 ));
               } else {
                 // back to Home page
                 menuActions.add(ElevatedButton(
                   onPressed: () {
-                    BlocProvider.of<NavCubit>(context).goToGamePage();
+                    BlocProvider.of<NavCubitScreen>(context).goToScreenActivity();
                   },
                   style: ElevatedButton.styleFrom(
                     shape: const CircleBorder(),
                   ),
-                  child: Menu.menuItemGame.icon,
+                  child: Screen.screenActivity.icon,
                 ));
               }
             }
diff --git a/lib/ui/layouts/game_layout.dart b/lib/common/ui/pages/game.dart
similarity index 79%
rename from lib/ui/layouts/game_layout.dart
rename to lib/common/ui/pages/game.dart
index dd4087da5f02e5bce0fa464e699d8cd598859e42..bbc005321f29727251ec2145d706b9c4493e7d8e 100644
--- a/lib/ui/layouts/game_layout.dart
+++ b/lib/common/ui/pages/game.dart
@@ -1,20 +1,20 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/models/game/game.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/models/activity/activity.dart';
 import 'package:awale/ui/widgets/game/game_board.dart';
 import 'package:awale/ui/widgets/game/game_end.dart';
 import 'package:awale/ui/widgets/game/game_player.dart';
 
-class GameLayout extends StatelessWidget {
-  const GameLayout({super.key});
+class PageGame extends StatelessWidget {
+  const PageGame({super.key});
 
   @override
   Widget build(BuildContext context) {
-    return BlocBuilder<GameCubit, GameState>(
-      builder: (BuildContext context, GameState gameState) {
-        final Game currentGame = gameState.currentGame;
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        final Activity currentActivity = activityState.currentActivity;
 
         var screenSize = MediaQuery.of(context).size;
 
@@ -35,7 +35,7 @@ class GameLayout extends StatelessWidget {
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 crossAxisAlignment: CrossAxisAlignment.center,
                 children: [
-                  currentGame.isFinished
+                  currentActivity.isFinished
                       ? GameEndWidget(
                           playerIndex: 0,
                           widgetSize: baseSize,
@@ -45,7 +45,7 @@ class GameLayout extends StatelessWidget {
                           widgetSize: baseSize,
                         ),
                   GameBoardWidget(houseSize: baseSize),
-                  currentGame.isFinished
+                  currentActivity.isFinished
                       ? GameEndWidget(
                           playerIndex: 1,
                           widgetSize: baseSize,
diff --git a/lib/common/ui/pages/parameters.dart b/lib/common/ui/pages/parameters.dart
new file mode 100644
index 0000000000000000000000000000000000000000..be052e6021aa48ef26bebe2c77e581c57960dc49
--- /dev/null
+++ b/lib/common/ui/pages/parameters.dart
@@ -0,0 +1,148 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/common/ui/parameters/parameter_widget.dart';
+
+import 'package:awale/config/default_activity_settings.dart';
+import 'package:awale/config/default_global_settings.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/cubit/settings/settings_activity_cubit.dart';
+import 'package:awale/cubit/settings/settings_global_cubit.dart';
+import 'package:awale/models/activity/activity.dart';
+import 'package:awale/ui/widgets/actions/button_delete_saved_game.dart';
+import 'package:awale/ui/widgets/actions/button_game_start_new.dart';
+import 'package:awale/ui/widgets/actions/button_resume_saved_game.dart';
+
+class PageParameters extends StatelessWidget {
+  const PageParameters({super.key});
+
+  final double separatorHeight = 8.0;
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        final Activity currentActivity = activityState.currentActivity;
+
+        final List<Widget> lines = [];
+
+        // Game settings
+        for (String code in DefaultActivitySettings.availableParameters) {
+          lines.add(Row(
+            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+            children: buildParametersLine(
+              code: code,
+              isGlobal: false,
+            ),
+          ));
+
+          lines.add(SizedBox(height: separatorHeight));
+        }
+
+        lines.add(Expanded(
+          child: SizedBox(height: separatorHeight),
+        ));
+
+        if (currentActivity.canBeResumed == false) {
+          // Start new game
+          lines.add(
+            const AspectRatio(
+              aspectRatio: 3,
+              child: StartNewGameButton(),
+            ),
+          );
+        } else {
+          // Resume game
+          lines.add(const AspectRatio(
+            aspectRatio: 3,
+            child: ResumeSavedGameButton(),
+          ));
+          // Delete saved game
+          lines.add(SizedBox.square(
+            dimension: MediaQuery.of(context).size.width / 5,
+            child: const DeleteSavedGameButton(),
+          ));
+        }
+
+        lines.add(SizedBox(height: separatorHeight));
+
+        // Global settings
+        for (String code in DefaultGlobalSettings.availableParameters) {
+          lines.add(Row(
+            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+            children: buildParametersLine(
+              code: code,
+              isGlobal: true,
+            ),
+          ));
+
+          lines.add(SizedBox(height: separatorHeight));
+        }
+
+        return Column(
+          children: lines,
+        );
+      },
+    );
+  }
+
+  List<Widget> buildParametersLine({
+    required String code,
+    required bool isGlobal,
+  }) {
+    final List<Widget> parameterButtons = [];
+
+    final List<String> availableValues = isGlobal
+        ? DefaultGlobalSettings.getAvailableValues(code)
+        : DefaultActivitySettings.getAvailableValues(code);
+
+    if (availableValues.length <= 1) {
+      return [];
+    }
+
+    for (String value in availableValues) {
+      final Widget parameterButton = BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
+        builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
+          return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
+            builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
+              final ActivitySettingsCubit activitySettingsCubit =
+                  BlocProvider.of<ActivitySettingsCubit>(context);
+              final GlobalSettingsCubit globalSettingsCubit =
+                  BlocProvider.of<GlobalSettingsCubit>(context);
+
+              final String currentValue = isGlobal
+                  ? globalSettingsCubit.getParameterValue(code)
+                  : activitySettingsCubit.getParameterValue(code);
+
+              final bool isSelected = (value == currentValue);
+
+              final double displayWidth = MediaQuery.of(context).size.width;
+              final double itemWidth = displayWidth / availableValues.length - 4;
+
+              return SizedBox.square(
+                dimension: itemWidth,
+                child: ParameterWidget(
+                  code: code,
+                  value: value,
+                  isSelected: isSelected,
+                  size: itemWidth,
+                  activitySettings: activitySettingsState.settings,
+                  globalSettings: globalSettingsState.settings,
+                  onPressed: () {
+                    isGlobal
+                        ? globalSettingsCubit.setParameterValue(code, value)
+                        : activitySettingsCubit.setParameterValue(code, value);
+                  },
+                ),
+              );
+            },
+          );
+        },
+      );
+
+      parameterButtons.add(parameterButton);
+    }
+
+    return parameterButtons;
+  }
+}
diff --git a/lib/ui/parameters/parameter_painter.dart b/lib/common/ui/parameters/parameter_painter.dart
similarity index 91%
rename from lib/ui/parameters/parameter_painter.dart
rename to lib/common/ui/parameters/parameter_painter.dart
index f802a830cdae1d0f5d4699afc5ee26abaac2ce93..ae62c64c755c338da375e9da70724633aacd7072 100644
--- a/lib/ui/parameters/parameter_painter.dart
+++ b/lib/common/ui/parameters/parameter_painter.dart
@@ -3,20 +3,20 @@ import 'dart:math';
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/models/settings/settings_game.dart';
+import 'package:awale/models/settings/settings_activity.dart';
 import 'package:awale/models/settings/settings_global.dart';
 
 class ParameterPainter extends CustomPainter {
   const ParameterPainter({
     required this.code,
     required this.value,
-    required this.gameSettings,
+    required this.activitySettings,
     required this.globalSettings,
   });
 
   final String code;
   final String value;
-  final GameSettings gameSettings;
+  final ActivitySettings activitySettings;
   final GlobalSettings globalSettings;
 
   @override
diff --git a/lib/ui/parameters/parameter_widget.dart b/lib/common/ui/parameters/parameter_widget.dart
similarity index 82%
rename from lib/ui/parameters/parameter_widget.dart
rename to lib/common/ui/parameters/parameter_widget.dart
index 04de7672563b09a9d669a647ae186120f58a03dd..8a6b98d5aca3d88c41d9bfc5ccc2e245d8d4aa41 100644
--- a/lib/ui/parameters/parameter_widget.dart
+++ b/lib/common/ui/parameters/parameter_widget.dart
@@ -1,8 +1,8 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/config/default_game_settings.dart';
-import 'package:awale/models/settings/settings_game.dart';
+import 'package:awale/config/default_activity_settings.dart';
+import 'package:awale/models/settings/settings_activity.dart';
 import 'package:awale/models/settings/settings_global.dart';
 
 class ParameterWidget extends StatelessWidget {
@@ -12,7 +12,7 @@ class ParameterWidget extends StatelessWidget {
     required this.value,
     required this.isSelected,
     required this.size,
-    required this.gameSettings,
+    required this.activitySettings,
     required this.globalSettings,
     required this.onPressed,
   });
@@ -21,7 +21,7 @@ class ParameterWidget extends StatelessWidget {
   final String value;
   final bool isSelected;
   final double size;
-  final GameSettings gameSettings;
+  final ActivitySettings activitySettings;
   final GlobalSettings globalSettings;
   final VoidCallback onPressed;
 
@@ -35,7 +35,7 @@ class ParameterWidget extends StatelessWidget {
     Widget content = const SizedBox.shrink();
 
     switch (code) {
-      case DefaultGameSettings.parameterCodeGameMode:
+      case DefaultActivitySettings.parameterCodeGameMode:
         content = getGameModeParameterItem();
         break;
       default:
@@ -72,19 +72,19 @@ class ParameterWidget extends StatelessWidget {
     Color baseColor = Colors.grey;
 
     switch (value) {
-      case DefaultGameSettings.gameModeHumanVsHuman:
+      case DefaultActivitySettings.gameModeHumanVsHuman:
         text = '🧑  🧑';
         baseColor = Colors.green;
         break;
-      case DefaultGameSettings.gameModeHumanVsRobot:
+      case DefaultActivitySettings.gameModeHumanVsRobot:
         text = '🧑  🤖';
         baseColor = Colors.pink;
         break;
-      case DefaultGameSettings.gameModeRobotVsHuman:
+      case DefaultActivitySettings.gameModeRobotVsHuman:
         text = '🤖  🧑';
         baseColor = Colors.pink;
         break;
-      case DefaultGameSettings.gameModeRobotVsRobot:
+      case DefaultActivitySettings.gameModeRobotVsRobot:
         text = '🤖  🤖';
         baseColor = Colors.brown;
         break;
diff --git a/lib/ui/screens/page_about.dart b/lib/common/ui/screens/about.dart
similarity index 93%
rename from lib/ui/screens/page_about.dart
rename to lib/common/ui/screens/about.dart
index ab73e304b8138295f6669330b928e0d1d0263565..f7a14a9a7e574a7b6f9ed181f38d08ba8c2285fe 100644
--- a/lib/ui/screens/page_about.dart
+++ b/lib/common/ui/screens/about.dart
@@ -1,8 +1,8 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-class PageAbout extends StatelessWidget {
-  const PageAbout({super.key});
+class ScreenAbout extends StatelessWidget {
+  const ScreenAbout({super.key});
 
   @override
   Widget build(BuildContext context) {
diff --git a/lib/common/ui/screens/activity.dart b/lib/common/ui/screens/activity.dart
new file mode 100644
index 0000000000000000000000000000000000000000..134265470d4382a6f906760078acdafb45347660
--- /dev/null
+++ b/lib/common/ui/screens/activity.dart
@@ -0,0 +1,18 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/common/config/activity_page.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_pages.dart';
+
+class ScreenActivity extends StatelessWidget {
+  const ScreenActivity({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BlocBuilder<NavCubitPage, int>(
+      builder: (BuildContext context, int pageIndex) {
+        return ActivityPage.getWidget(pageIndex);
+      },
+    );
+  }
+}
diff --git a/lib/ui/screens/page_settings.dart b/lib/common/ui/screens/settings.dart
similarity index 87%
rename from lib/ui/screens/page_settings.dart
rename to lib/common/ui/screens/settings.dart
index 50964ef462b6e3e411347cab4e966afb0f505008..7981b1c6becc4f5b925c3058b05423750d80f62e 100644
--- a/lib/ui/screens/page_settings.dart
+++ b/lib/common/ui/screens/settings.dart
@@ -1,8 +1,8 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-class PageSettings extends StatelessWidget {
-  const PageSettings({super.key});
+class ScreenSettings extends StatelessWidget {
+  const ScreenSettings({super.key});
 
   @override
   Widget build(BuildContext context) {
diff --git a/lib/config/application_config.dart b/lib/config/application_config.dart
new file mode 100644
index 0000000000000000000000000000000000000000..3485d0d9d44b0465ddabc2da2878fa486a158969
--- /dev/null
+++ b/lib/config/application_config.dart
@@ -0,0 +1,3 @@
+class ApplicationConfig {
+  static const String appTitle = 'Awale';
+}
diff --git a/lib/config/default_game_settings.dart b/lib/config/default_activity_settings.dart
similarity index 91%
rename from lib/config/default_game_settings.dart
rename to lib/config/default_activity_settings.dart
index c65958f75bb9d121201e369206c9b8f7952e8275..54870870cd10c963462aa49550bc91ba75715c30 100644
--- a/lib/config/default_game_settings.dart
+++ b/lib/config/default_activity_settings.dart
@@ -1,6 +1,6 @@
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-class DefaultGameSettings {
+class DefaultActivitySettings {
   // available game parameters codes
   static const String parameterCodeGameMode = 'gameMode';
   static const List<String> availableParameters = [
@@ -25,7 +25,7 @@ class DefaultGameSettings {
   static List<String> getAvailableValues(String parameterCode) {
     switch (parameterCode) {
       case parameterCodeGameMode:
-        return DefaultGameSettings.allowedGameModeValues;
+        return DefaultActivitySettings.allowedGameModeValues;
     }
 
     printlog('Did not find any available value for game parameter "$parameterCode".');
diff --git a/lib/config/menu.dart b/lib/config/menu.dart
deleted file mode 100644
index e018427ae9da1aa813a617b718891b4fbf812ec0..0000000000000000000000000000000000000000
--- a/lib/config/menu.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:awale/ui/screens/page_about.dart';
-import 'package:awale/ui/screens/page_game.dart';
-import 'package:awale/ui/screens/page_settings.dart';
-
-class MenuItem {
-  final Icon icon;
-  final Widget page;
-
-  const MenuItem({
-    required this.icon,
-    required this.page,
-  });
-}
-
-class Menu {
-  static const indexGame = 0;
-  static const menuItemGame = MenuItem(
-    icon: Icon(UniconsLine.home),
-    page: PageGame(),
-  );
-
-  static const indexSettings = 1;
-  static const menuItemSettings = MenuItem(
-    icon: Icon(UniconsLine.setting),
-    page: PageSettings(),
-  );
-
-  static const indexAbout = 2;
-  static const menuItemAbout = MenuItem(
-    icon: Icon(UniconsLine.info_circle),
-    page: PageAbout(),
-  );
-
-  static Map<int, MenuItem> items = {
-    indexGame: menuItemGame,
-    indexSettings: menuItemSettings,
-    indexAbout: menuItemAbout,
-  };
-
-  static bool isIndexAllowed(int pageIndex) {
-    return items.keys.contains(pageIndex);
-  }
-
-  static Widget getPageWidget(int pageIndex) {
-    return items[pageIndex]?.page ?? menuItemGame.page;
-  }
-
-  static int itemsCount = Menu.items.length;
-}
diff --git a/lib/cubit/activity/activity_cubit.dart b/lib/cubit/activity/activity_cubit.dart
new file mode 100644
index 0000000000000000000000000000000000000000..0e1302e3b579c4a0379cd7e1861e858432ac23bb
--- /dev/null
+++ b/lib/cubit/activity/activity_cubit.dart
@@ -0,0 +1,214 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/models/activity/activity.dart';
+import 'package:awale/models/settings/settings_activity.dart';
+import 'package:awale/models/settings/settings_global.dart';
+import 'package:awale/robot/robot_player.dart';
+
+part 'activity_state.dart';
+
+class ActivityCubit extends HydratedCubit<ActivityState> {
+  ActivityCubit()
+      : super(ActivityState(
+          currentActivity: Activity.createNull(),
+        ));
+
+  void updateState(Activity activity) {
+    emit(ActivityState(
+      currentActivity: activity,
+    ));
+  }
+
+  void refresh() {
+    final Activity activity = Activity(
+      // Settings
+      activitySettings: state.currentActivity.activitySettings,
+      globalSettings: state.currentActivity.globalSettings,
+      // State
+      isRunning: state.currentActivity.isRunning,
+      isStarted: state.currentActivity.isStarted,
+      isFinished: state.currentActivity.isFinished,
+      animationInProgress: state.currentActivity.animationInProgress,
+      // Base data
+      board: state.currentActivity.board,
+      // Game data
+      currentPlayer: state.currentActivity.currentPlayer,
+      scores: state.currentActivity.scores,
+      currentHand: state.currentActivity.currentHand,
+    );
+    // game.dump();
+
+    updateState(activity);
+  }
+
+  void startNewActivity({
+    required ActivitySettings activitySettings,
+    required GlobalSettings globalSettings,
+  }) {
+    final Activity newActivity = Activity.createNew(
+      // Settings
+      activitySettings: activitySettings,
+      globalSettings: globalSettings,
+    );
+
+    newActivity.dump();
+
+    updateState(newActivity);
+    refresh();
+
+    robotPlay();
+  }
+
+  void quitActivity() {
+    state.currentActivity.isRunning = false;
+    refresh();
+  }
+
+  void resumeSavedActivity() {
+    state.currentActivity.isRunning = true;
+    refresh();
+  }
+
+  void deleteSavedActivity() {
+    state.currentActivity.isRunning = false;
+    state.currentActivity.isFinished = true;
+    refresh();
+  }
+
+  void toggleCurrentPlayer() {
+    state.currentActivity.currentPlayer = 1 - state.currentActivity.currentPlayer;
+    refresh();
+
+    robotPlay();
+  }
+
+  void robotPlay() async {
+    if (state.currentActivity.isRunning &&
+        !state.currentActivity.isFinished &&
+        !state.currentActivity.isCurrentPlayerHuman()) {
+      final int? pickedCell = RobotPlayer.pickCell(state.currentActivity);
+      await Future.delayed(const Duration(milliseconds: 500));
+
+      if (pickedCell != null) {
+        tapOnCell(pickedCell);
+      }
+    }
+  }
+
+  void tapOnCell(int cellIndex) async {
+    printlog('tapOnCell: $cellIndex');
+
+    if (!state.currentActivity.isCurrentPlayerHouse(cellIndex)) {
+      printlog('not allowed');
+
+      return;
+    }
+
+    if (state.currentActivity.board.cells[cellIndex] == 0) {
+      printlog('empty cell');
+
+      return;
+    }
+
+    if (!state.currentActivity.isMoveAllowed(cellIndex)) {
+      printlog('not allowed (need to give at least one seed to other player)');
+
+      return;
+    }
+
+    state.currentActivity.animationInProgress = true;
+    refresh();
+
+    final int lastCellIndex = await animateSeedsDistribution(cellIndex);
+    await animateSeedsEarning(lastCellIndex);
+
+    toggleCurrentPlayer();
+
+    if (!state.currentActivity.canPlay()) {
+      printlog('user has no more move to play');
+      state.currentActivity.isFinished = true;
+      refresh();
+    }
+
+    state.currentActivity.animationInProgress = false;
+    refresh();
+  }
+
+  Future<int> animateSeedsDistribution(int sourceCellIndex) async {
+    printlog('animateSeedsDistribution / sourceCellIndex: $sourceCellIndex');
+
+    final int seedsCount = state.currentActivity.board.cells[sourceCellIndex];
+
+    // empty source cell
+    printlog('animateSeedsDistribution / empty source cell');
+    state.currentActivity.board.cells[sourceCellIndex] = 0;
+    state.currentActivity.currentHand = seedsCount;
+    refresh();
+
+    await Future.delayed(const Duration(milliseconds: 200));
+
+    int cellIndex = sourceCellIndex;
+    for (int i = 0; i < seedsCount; i++) {
+      cellIndex = state.currentActivity.getNextCellIndex(cellIndex, sourceCellIndex);
+      state.currentActivity.currentHand--;
+      state.currentActivity.board.cells[cellIndex] += 1;
+      refresh();
+      await Future.delayed(const Duration(milliseconds: 300));
+    }
+
+    refresh();
+
+    return cellIndex;
+  }
+
+  Future<int> animateSeedsEarning(int lastCellIndex) async {
+    printlog('animateSeedsEarning / lastCellIndex: $lastCellIndex');
+
+    int earnedSeedsCount = 0;
+
+    if (state.currentActivity.isOpponentHouse(lastCellIndex)) {
+      final int seedsCount = state.currentActivity.board.cells[lastCellIndex];
+      printlog('found $seedsCount seed(s) on final house');
+
+      if ([2, 3].contains(seedsCount)) {
+        printlog('-> ok will earn these seeds');
+
+        state.currentActivity.board.cells[lastCellIndex] = 0;
+        state.currentActivity.scores[state.currentActivity.currentPlayer] += seedsCount;
+        earnedSeedsCount += seedsCount;
+        refresh();
+
+        await Future.delayed(const Duration(milliseconds: 500));
+
+        // (recursively) check previous cells
+        printlog('-> dispatch to previous cell');
+        final int previousCellIndex =
+            state.currentActivity.getPreviousCellIndex(lastCellIndex);
+        earnedSeedsCount += await animateSeedsEarning(previousCellIndex);
+      } else {
+        printlog('-> nothing to do');
+      }
+    }
+
+    return earnedSeedsCount;
+  }
+
+  @override
+  ActivityState? fromJson(Map<String, dynamic> json) {
+    final Activity currentActivity = json['currentActivity'] as Activity;
+
+    return ActivityState(
+      currentActivity: currentActivity,
+    );
+  }
+
+  @override
+  Map<String, dynamic>? toJson(ActivityState state) {
+    return <String, dynamic>{
+      'currentActivity': state.currentActivity.toJson(),
+    };
+  }
+}
diff --git a/lib/cubit/activity/activity_state.dart b/lib/cubit/activity/activity_state.dart
new file mode 100644
index 0000000000000000000000000000000000000000..887b45e4255fd7de1cc7744569d82a38a66602f2
--- /dev/null
+++ b/lib/cubit/activity/activity_state.dart
@@ -0,0 +1,15 @@
+part of 'activity_cubit.dart';
+
+@immutable
+class ActivityState extends Equatable {
+  const ActivityState({
+    required this.currentActivity,
+  });
+
+  final Activity currentActivity;
+
+  @override
+  List<dynamic> get props => <dynamic>[
+        currentActivity,
+      ];
+}
diff --git a/lib/cubit/game_cubit.dart b/lib/cubit/game_cubit.dart
deleted file mode 100644
index fb2ea77134084d2b02cc69d5c2e0f839c1d8a156..0000000000000000000000000000000000000000
--- a/lib/cubit/game_cubit.dart
+++ /dev/null
@@ -1,211 +0,0 @@
-import 'dart:async';
-
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:awale/models/game/game.dart';
-import 'package:awale/models/settings/settings_game.dart';
-import 'package:awale/models/settings/settings_global.dart';
-import 'package:awale/robot/robot_player.dart';
-
-part 'game_state.dart';
-
-class GameCubit extends HydratedCubit<GameState> {
-  GameCubit()
-      : super(GameState(
-          currentGame: Game.createNull(),
-        ));
-
-  void updateState(Game game) {
-    emit(GameState(
-      currentGame: game,
-    ));
-  }
-
-  void refresh() {
-    final Game game = Game(
-      // Settings
-      gameSettings: state.currentGame.gameSettings,
-      globalSettings: state.currentGame.globalSettings,
-      // State
-      isRunning: state.currentGame.isRunning,
-      isStarted: state.currentGame.isStarted,
-      isFinished: state.currentGame.isFinished,
-      animationInProgress: state.currentGame.animationInProgress,
-      // Base data
-      board: state.currentGame.board,
-      // Game data
-      currentPlayer: state.currentGame.currentPlayer,
-      scores: state.currentGame.scores,
-      currentHand: state.currentGame.currentHand,
-    );
-    // game.dump();
-
-    updateState(game);
-  }
-
-  void startNewGame({
-    required GameSettings gameSettings,
-    required GlobalSettings globalSettings,
-  }) {
-    final Game newGame = Game.createNew(
-      // Settings
-      gameSettings: gameSettings,
-      globalSettings: globalSettings,
-    );
-
-    newGame.dump();
-
-    updateState(newGame);
-    refresh();
-
-    robotPlay();
-  }
-
-  void quitGame() {
-    state.currentGame.isRunning = false;
-    refresh();
-  }
-
-  void resumeSavedGame() {
-    state.currentGame.isRunning = true;
-    refresh();
-  }
-
-  void deleteSavedGame() {
-    state.currentGame.isRunning = false;
-    state.currentGame.isFinished = true;
-    refresh();
-  }
-
-  void toggleCurrentPlayer() {
-    state.currentGame.currentPlayer = 1 - state.currentGame.currentPlayer;
-    refresh();
-
-    robotPlay();
-  }
-
-  void robotPlay() async {
-    if (!state.currentGame.isFinished && !state.currentGame.isCurrentPlayerHuman()) {
-      final int? pickedCell = RobotPlayer.pickCell(state.currentGame);
-      await Future.delayed(const Duration(milliseconds: 500));
-
-      if (pickedCell != null) {
-        tapOnCell(pickedCell);
-      }
-    }
-  }
-
-  void tapOnCell(int cellIndex) async {
-    printlog('tapOnCell: $cellIndex');
-
-    if (!state.currentGame.isCurrentPlayerHouse(cellIndex)) {
-      printlog('not allowed');
-
-      return;
-    }
-
-    if (state.currentGame.board.cells[cellIndex] == 0) {
-      printlog('empty cell');
-
-      return;
-    }
-
-    if (!state.currentGame.isMoveAllowed(cellIndex)) {
-      printlog('not allowed (need to give at least one seed to other player)');
-
-      return;
-    }
-
-    state.currentGame.animationInProgress = true;
-    refresh();
-
-    final int lastCellIndex = await animateSeedsDistribution(cellIndex);
-    await animateSeedsEarning(lastCellIndex);
-
-    toggleCurrentPlayer();
-
-    if (!state.currentGame.canPlay()) {
-      printlog('user has no more move to play');
-      state.currentGame.isFinished = true;
-      refresh();
-    }
-
-    state.currentGame.animationInProgress = false;
-    refresh();
-  }
-
-  Future<int> animateSeedsDistribution(int sourceCellIndex) async {
-    printlog('animateSeedsDistribution / sourceCellIndex: $sourceCellIndex');
-
-    final int seedsCount = state.currentGame.board.cells[sourceCellIndex];
-
-    // empty source cell
-    printlog('animateSeedsDistribution / empty source cell');
-    state.currentGame.board.cells[sourceCellIndex] = 0;
-    state.currentGame.currentHand = seedsCount;
-    refresh();
-
-    await Future.delayed(const Duration(milliseconds: 200));
-
-    int cellIndex = sourceCellIndex;
-    for (int i = 0; i < seedsCount; i++) {
-      cellIndex = state.currentGame.getNextCellIndex(cellIndex, sourceCellIndex);
-      state.currentGame.currentHand--;
-      state.currentGame.board.cells[cellIndex] += 1;
-      refresh();
-      await Future.delayed(const Duration(milliseconds: 300));
-    }
-
-    refresh();
-
-    return cellIndex;
-  }
-
-  Future<int> animateSeedsEarning(int lastCellIndex) async {
-    printlog('animateSeedsEarning / lastCellIndex: $lastCellIndex');
-
-    int earnedSeedsCount = 0;
-
-    if (state.currentGame.isOpponentHouse(lastCellIndex)) {
-      final int seedsCount = state.currentGame.board.cells[lastCellIndex];
-      printlog('found $seedsCount seed(s) on final house');
-
-      if ([2, 3].contains(seedsCount)) {
-        printlog('-> ok will earn these seeds');
-
-        state.currentGame.board.cells[lastCellIndex] = 0;
-        state.currentGame.scores[state.currentGame.currentPlayer] += seedsCount;
-        earnedSeedsCount += seedsCount;
-        refresh();
-
-        await Future.delayed(const Duration(milliseconds: 500));
-
-        // (recursively) check previous cells
-        printlog('-> dispatch to previous cell');
-        final int previousCellIndex = state.currentGame.getPreviousCellIndex(lastCellIndex);
-        earnedSeedsCount += await animateSeedsEarning(previousCellIndex);
-      } else {
-        printlog('-> nothing to do');
-      }
-    }
-
-    return earnedSeedsCount;
-  }
-
-  @override
-  GameState? fromJson(Map<String, dynamic> json) {
-    final Game currentGame = json['currentGame'] as Game;
-
-    return GameState(
-      currentGame: currentGame,
-    );
-  }
-
-  @override
-  Map<String, dynamic>? toJson(GameState state) {
-    return <String, dynamic>{
-      'currentGame': state.currentGame.toJson(),
-    };
-  }
-}
diff --git a/lib/cubit/game_state.dart b/lib/cubit/game_state.dart
deleted file mode 100644
index 00e211668c3269255926939324355792abd61c41..0000000000000000000000000000000000000000
--- a/lib/cubit/game_state.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-part of 'game_cubit.dart';
-
-@immutable
-class GameState extends Equatable {
-  const GameState({
-    required this.currentGame,
-  });
-
-  final Game currentGame;
-
-  @override
-  List<dynamic> get props => <dynamic>[
-        currentGame,
-      ];
-}
diff --git a/lib/cubit/nav_cubit.dart b/lib/cubit/nav_cubit.dart
deleted file mode 100644
index de2c78820ec62db1544ec995824b7aa33ec569df..0000000000000000000000000000000000000000
--- a/lib/cubit/nav_cubit.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:awale/config/menu.dart';
-
-class NavCubit extends HydratedCubit<int> {
-  NavCubit() : super(0);
-
-  void updateIndex(int index) {
-    if (Menu.isIndexAllowed(index)) {
-      emit(index);
-    } else {
-      goToGamePage();
-    }
-  }
-
-  void goToGamePage() {
-    emit(Menu.indexGame);
-  }
-
-  void goToSettingsPage() {
-    emit(Menu.indexSettings);
-  }
-
-  void goToAboutPage() {
-    emit(Menu.indexAbout);
-  }
-
-  @override
-  int fromJson(Map<String, dynamic> json) {
-    return Menu.indexGame;
-  }
-
-  @override
-  Map<String, dynamic>? toJson(int state) {
-    return <String, int>{'pageIndex': state};
-  }
-}
diff --git a/lib/cubit/settings/settings_activity_cubit.dart b/lib/cubit/settings/settings_activity_cubit.dart
new file mode 100644
index 0000000000000000000000000000000000000000..870c385bbdd683a1d75d4d70b91f0dfe4ac2f4c8
--- /dev/null
+++ b/lib/cubit/settings/settings_activity_cubit.dart
@@ -0,0 +1,61 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/config/default_activity_settings.dart';
+import 'package:awale/models/settings/settings_activity.dart';
+
+part 'settings_activity_state.dart';
+
+class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
+  ActivitySettingsCubit()
+      : super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
+
+  void setValues({
+    String? gameMode,
+  }) {
+    emit(
+      ActivitySettingsState(
+        settings: ActivitySettings(
+          gameMode: gameMode ?? state.settings.gameMode,
+        ),
+      ),
+    );
+  }
+
+  String getParameterValue(String code) {
+    switch (code) {
+      case DefaultActivitySettings.parameterCodeGameMode:
+        return ActivitySettings.getGameModeValueFromUnsafe(state.settings.gameMode);
+    }
+
+    return '';
+  }
+
+  void setParameterValue(String code, String value) {
+    final String gameMode = code == DefaultActivitySettings.parameterCodeGameMode
+        ? value
+        : getParameterValue(DefaultActivitySettings.parameterCodeGameMode);
+
+    setValues(
+      gameMode: gameMode,
+    );
+  }
+
+  @override
+  ActivitySettingsState? fromJson(Map<String, dynamic> json) {
+    final String gameMode = json[DefaultActivitySettings.parameterCodeGameMode] as String;
+
+    return ActivitySettingsState(
+      settings: ActivitySettings(
+        gameMode: gameMode,
+      ),
+    );
+  }
+
+  @override
+  Map<String, dynamic>? toJson(ActivitySettingsState state) {
+    return <String, dynamic>{
+      DefaultActivitySettings.parameterCodeGameMode: state.settings.gameMode,
+    };
+  }
+}
diff --git a/lib/cubit/settings/settings_activity_state.dart b/lib/cubit/settings/settings_activity_state.dart
new file mode 100644
index 0000000000000000000000000000000000000000..2b2de42011634e81ae9e6f8bcaa1577f239c778b
--- /dev/null
+++ b/lib/cubit/settings/settings_activity_state.dart
@@ -0,0 +1,15 @@
+part of 'settings_activity_cubit.dart';
+
+@immutable
+class ActivitySettingsState extends Equatable {
+  const ActivitySettingsState({
+    required this.settings,
+  });
+
+  final ActivitySettings settings;
+
+  @override
+  List<dynamic> get props => <dynamic>[
+        settings,
+      ];
+}
diff --git a/lib/cubit/settings_global_cubit.dart b/lib/cubit/settings/settings_global_cubit.dart
similarity index 100%
rename from lib/cubit/settings_global_cubit.dart
rename to lib/cubit/settings/settings_global_cubit.dart
diff --git a/lib/cubit/settings_global_state.dart b/lib/cubit/settings/settings_global_state.dart
similarity index 100%
rename from lib/cubit/settings_global_state.dart
rename to lib/cubit/settings/settings_global_state.dart
diff --git a/lib/cubit/settings_game_cubit.dart b/lib/cubit/settings_game_cubit.dart
deleted file mode 100644
index d39cb65a33db6aab8c719aaf7e613909a7216987..0000000000000000000000000000000000000000
--- a/lib/cubit/settings_game_cubit.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:awale/config/default_game_settings.dart';
-import 'package:awale/models/settings/settings_game.dart';
-
-part 'settings_game_state.dart';
-
-class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
-  GameSettingsCubit() : super(GameSettingsState(settings: GameSettings.createDefault()));
-
-  void setValues({
-    String? gameMode,
-  }) {
-    emit(
-      GameSettingsState(
-        settings: GameSettings(
-          gameMode: gameMode ?? state.settings.gameMode,
-        ),
-      ),
-    );
-  }
-
-  String getParameterValue(String code) {
-    switch (code) {
-      case DefaultGameSettings.parameterCodeGameMode:
-        return GameSettings.getGameModeValueFromUnsafe(state.settings.gameMode);
-    }
-
-    return '';
-  }
-
-  void setParameterValue(String code, String value) {
-    final String gameMode = code == DefaultGameSettings.parameterCodeGameMode
-        ? value
-        : getParameterValue(DefaultGameSettings.parameterCodeGameMode);
-
-    setValues(
-      gameMode: gameMode,
-    );
-  }
-
-  @override
-  GameSettingsState? fromJson(Map<String, dynamic> json) {
-    final String gameMode = json[DefaultGameSettings.parameterCodeGameMode] as String;
-
-    return GameSettingsState(
-      settings: GameSettings(
-        gameMode: gameMode,
-      ),
-    );
-  }
-
-  @override
-  Map<String, dynamic>? toJson(GameSettingsState state) {
-    return <String, dynamic>{
-      DefaultGameSettings.parameterCodeGameMode: state.settings.gameMode,
-    };
-  }
-}
diff --git a/lib/cubit/settings_game_state.dart b/lib/cubit/settings_game_state.dart
deleted file mode 100644
index 5acd85b44ba541e1c5e9c26af1c4be26a385b9ed..0000000000000000000000000000000000000000
--- a/lib/cubit/settings_game_state.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-part of 'settings_game_cubit.dart';
-
-@immutable
-class GameSettingsState extends Equatable {
-  const GameSettingsState({
-    required this.settings,
-  });
-
-  final GameSettings settings;
-
-  @override
-  List<dynamic> get props => <dynamic>[
-        settings,
-      ];
-}
diff --git a/lib/main.dart b/lib/main.dart
index 56f1987cb74b9831490aabbde91a037e65966a6b..3432c86349fe94412f0e92f35106b667228111e6 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -4,11 +4,14 @@ import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
+import 'package:awale/common/cubit/nav/nav_cubit_pages.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_screens.dart';
+
+import 'package:awale/config/application_config.dart';
 import 'package:awale/config/default_global_settings.dart';
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/cubit/nav_cubit.dart';
-import 'package:awale/cubit/settings_game_cubit.dart';
-import 'package:awale/cubit/settings_global_cubit.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/cubit/settings/settings_activity_cubit.dart';
+import 'package:awale/cubit/settings/settings_global_cubit.dart';
 import 'package:awale/ui/skeleton.dart';
 
 void main() async {
@@ -46,17 +49,30 @@ class MyApp extends StatelessWidget {
 
     return MultiBlocProvider(
       providers: [
-        BlocProvider<NavCubit>(create: (context) => NavCubit()),
+        // default providers
+        BlocProvider<NavCubitPage>(
+          create: (context) => NavCubitPage(),
+        ),
+        BlocProvider<NavCubitScreen>(
+          create: (context) => NavCubitScreen(),
+        ),
         BlocProvider<ApplicationThemeModeCubit>(
-            create: (context) => ApplicationThemeModeCubit()),
-        BlocProvider<GameCubit>(create: (context) => GameCubit()),
-        BlocProvider<GlobalSettingsCubit>(create: (context) => GlobalSettingsCubit()),
-        BlocProvider<GameSettingsCubit>(create: (context) => GameSettingsCubit()),
+          create: (context) => ApplicationThemeModeCubit(),
+        ),
+        BlocProvider<ActivityCubit>(
+          create: (context) => ActivityCubit(),
+        ),
+        BlocProvider<GlobalSettingsCubit>(
+          create: (context) => GlobalSettingsCubit(),
+        ),
+        BlocProvider<ActivitySettingsCubit>(
+          create: (context) => ActivitySettingsCubit(),
+        ),
       ],
       child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
         builder: (BuildContext context, ApplicationThemeModeState state) {
           return MaterialApp(
-            title: 'Awale',
+            title: ApplicationConfig.appTitle,
             home: const SkeletonScreen(),
 
             // Theme stuff
diff --git a/lib/models/game/game.dart b/lib/models/activity/activity.dart
similarity index 79%
rename from lib/models/game/game.dart
rename to lib/models/activity/activity.dart
index 37c29c3df7cf9a4a903cb21e414b3d031ddc82ce..003cffb11d320c7ca73d8aec5e1250b8f0512d10 100644
--- a/lib/models/game/game.dart
+++ b/lib/models/activity/activity.dart
@@ -1,14 +1,14 @@
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/config/default_game_settings.dart';
-import 'package:awale/models/game/board.dart';
-import 'package:awale/models/settings/settings_game.dart';
+import 'package:awale/config/default_activity_settings.dart';
+import 'package:awale/models/activity/board.dart';
+import 'package:awale/models/settings/settings_activity.dart';
 import 'package:awale/models/settings/settings_global.dart';
 
-class Game {
-  Game({
+class Activity {
+  Activity({
     // Settings
-    required this.gameSettings,
+    required this.activitySettings,
     required this.globalSettings,
 
     // State
@@ -27,7 +27,7 @@ class Game {
   });
 
   // Settings
-  final GameSettings gameSettings;
+  final ActivitySettings activitySettings;
   final GlobalSettings globalSettings;
 
   // State
@@ -44,10 +44,10 @@ class Game {
   List<int> scores;
   int currentHand;
 
-  factory Game.createNull() {
-    return Game(
+  factory Activity.createNull() {
+    return Activity(
       // Settings
-      gameSettings: GameSettings.createDefault(),
+      activitySettings: ActivitySettings.createDefault(),
       globalSettings: GlobalSettings.createDefault(),
       // Base data
       board: Board.createNull(),
@@ -58,11 +58,12 @@ class Game {
     );
   }
 
-  factory Game.createNew({
-    GameSettings? gameSettings,
+  factory Activity.createNew({
+    ActivitySettings? activitySettings,
     GlobalSettings? globalSettings,
   }) {
-    final GameSettings newGameSettings = gameSettings ?? GameSettings.createDefault();
+    final ActivitySettings newActivitySettings =
+        activitySettings ?? ActivitySettings.createDefault();
     final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
 
     const int boardSize = 12;
@@ -72,9 +73,9 @@ class Game {
       cells.add(4);
     }
 
-    return Game(
+    return Activity(
       // Settings
-      gameSettings: newGameSettings,
+      activitySettings: newActivitySettings,
       globalSettings: newGlobalSettings,
       // State
       isRunning: true,
@@ -140,14 +141,14 @@ class Game {
   }
 
   bool isPlayerHuman(int playerIndex) {
-    switch (gameSettings.gameMode) {
-      case DefaultGameSettings.gameModeHumanVsHuman:
+    switch (activitySettings.gameMode) {
+      case DefaultActivitySettings.gameModeHumanVsHuman:
         return true;
-      case DefaultGameSettings.gameModeHumanVsRobot:
+      case DefaultActivitySettings.gameModeHumanVsRobot:
         return (playerIndex == 0);
-      case DefaultGameSettings.gameModeRobotVsHuman:
+      case DefaultActivitySettings.gameModeRobotVsHuman:
         return (playerIndex == 1);
-      case DefaultGameSettings.gameModeRobotVsRobot:
+      case DefaultActivitySettings.gameModeRobotVsRobot:
         return false;
       default:
     }
@@ -162,9 +163,9 @@ class Game {
     printlog('');
     printlog('## Current game dump:');
     printlog('');
-    printlog('$Game:');
+    printlog('$Activity:');
     printlog('  Settings');
-    gameSettings.dump();
+    activitySettings.dump();
     globalSettings.dump();
     printlog('  State');
     printlog('    isRunning: $isRunning');
@@ -181,13 +182,13 @@ class Game {
 
   @override
   String toString() {
-    return '$Game(${toJson()})';
+    return '$Activity(${toJson()})';
   }
 
   Map<String, dynamic>? toJson() {
     return <String, dynamic>{
       // Settings
-      'gameSettings': gameSettings.toJson(),
+      'activitySettings': activitySettings.toJson(),
       'globalSettings': globalSettings.toJson(),
       // State
       'isRunning': isRunning,
diff --git a/lib/models/game/board.dart b/lib/models/activity/board.dart
similarity index 100%
rename from lib/models/game/board.dart
rename to lib/models/activity/board.dart
diff --git a/lib/models/settings/settings_activity.dart b/lib/models/settings/settings_activity.dart
new file mode 100644
index 0000000000000000000000000000000000000000..cd5b6bf92f4ea4fdc77708742e13345e532c7f1f
--- /dev/null
+++ b/lib/models/settings/settings_activity.dart
@@ -0,0 +1,42 @@
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:awale/config/default_activity_settings.dart';
+
+class ActivitySettings {
+  final String gameMode;
+
+  ActivitySettings({
+    required this.gameMode,
+  });
+
+  static String getGameModeValueFromUnsafe(String gameMode) {
+    if (DefaultActivitySettings.allowedGameModeValues.contains(gameMode)) {
+      return gameMode;
+    }
+
+    return DefaultActivitySettings.defaultGameModeValue;
+  }
+
+  factory ActivitySettings.createDefault() {
+    return ActivitySettings(
+      gameMode: DefaultActivitySettings.defaultGameModeValue,
+    );
+  }
+
+  void dump() {
+    printlog('$ActivitySettings:');
+    printlog('  ${DefaultActivitySettings.parameterCodeGameMode}: $gameMode');
+    printlog('');
+  }
+
+  @override
+  String toString() {
+    return '$ActivitySettings(${toJson()})';
+  }
+
+  Map<String, dynamic>? toJson() {
+    return <String, dynamic>{
+      DefaultActivitySettings.parameterCodeGameMode: gameMode,
+    };
+  }
+}
diff --git a/lib/models/settings/settings_game.dart b/lib/models/settings/settings_game.dart
deleted file mode 100644
index 516f48acb9a1145a0716cc33aaab662b0d078bc0..0000000000000000000000000000000000000000
--- a/lib/models/settings/settings_game.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:awale/config/default_game_settings.dart';
-
-class GameSettings {
-  final String gameMode;
-
-  GameSettings({
-    required this.gameMode,
-  });
-
-  static String getGameModeValueFromUnsafe(String gameMode) {
-    if (DefaultGameSettings.allowedGameModeValues.contains(gameMode)) {
-      return gameMode;
-    }
-
-    return DefaultGameSettings.defaultGameModeValue;
-  }
-
-  factory GameSettings.createDefault() {
-    return GameSettings(
-      gameMode: DefaultGameSettings.defaultGameModeValue,
-    );
-  }
-
-  void dump() {
-    printlog('$GameSettings:');
-    printlog('  ${DefaultGameSettings.parameterCodeGameMode}: $gameMode');
-    printlog('');
-  }
-
-  @override
-  String toString() {
-    return '$GameSettings(${toJson()})';
-  }
-
-  Map<String, dynamic>? toJson() {
-    return <String, dynamic>{
-      DefaultGameSettings.parameterCodeGameMode: gameMode,
-    };
-  }
-}
diff --git a/lib/robot/robot_player.dart b/lib/robot/robot_player.dart
index 49f31a2e302e28f0ebbb7b1c69bf134410859054..39dc5f4f4c16fc3633bc0037ea6948a9bfd628d3 100644
--- a/lib/robot/robot_player.dart
+++ b/lib/robot/robot_player.dart
@@ -1,12 +1,12 @@
-import 'package:awale/models/game/game.dart';
+import 'package:awale/models/activity/activity.dart';
 
 class RobotPlayer {
-  static int? pickCell(Game currentGame) {
+  static int? pickCell(Activity currentActivity) {
     List<int> allowedMoves = [];
 
-    for (int cellIndex = 0; cellIndex < currentGame.board.cells.length; cellIndex++) {
-      if (currentGame.isCurrentPlayerHouse(cellIndex) &&
-          currentGame.isMoveAllowed(cellIndex)) {
+    for (int cellIndex = 0; cellIndex < currentActivity.board.cells.length; cellIndex++) {
+      if (currentActivity.isCurrentPlayerHouse(cellIndex) &&
+          currentActivity.isMoveAllowed(cellIndex)) {
         allowedMoves.add(cellIndex);
       }
     }
diff --git a/lib/ui/layouts/parameters_layout.dart b/lib/ui/layouts/parameters_layout.dart
deleted file mode 100644
index 9d77066c78182e2b7a6e46de9b7896623215c4ec..0000000000000000000000000000000000000000
--- a/lib/ui/layouts/parameters_layout.dart
+++ /dev/null
@@ -1,141 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:awale/config/default_game_settings.dart';
-import 'package:awale/config/default_global_settings.dart';
-import 'package:awale/cubit/settings_game_cubit.dart';
-import 'package:awale/cubit/settings_global_cubit.dart';
-import 'package:awale/ui/widgets/actions/button_delete_saved_game.dart';
-import 'package:awale/ui/widgets/actions/button_game_start_new.dart';
-import 'package:awale/ui/widgets/actions/button_resume_saved_game.dart';
-import 'package:awale/ui/parameters/parameter_widget.dart';
-
-class ParametersLayout extends StatelessWidget {
-  const ParametersLayout({super.key, required this.canResume});
-
-  final bool canResume;
-
-  final double separatorHeight = 8.0;
-
-  @override
-  Widget build(BuildContext context) {
-    final List<Widget> lines = [];
-
-    // Game settings
-    for (String code in DefaultGameSettings.availableParameters) {
-      lines.add(Row(
-        mainAxisAlignment: MainAxisAlignment.spaceBetween,
-        children: buildParametersLine(
-          code: code,
-          isGlobal: false,
-        ),
-      ));
-
-      lines.add(SizedBox(height: separatorHeight));
-    }
-
-    lines.add(Expanded(
-      child: SizedBox(height: separatorHeight),
-    ));
-
-    if (canResume == false) {
-      // Start new game
-      lines.add(
-        const AspectRatio(
-          aspectRatio: 3,
-          child: StartNewGameButton(),
-        ),
-      );
-    } else {
-      // Resume game
-      lines.add(const AspectRatio(
-        aspectRatio: 3,
-        child: ResumeSavedGameButton(),
-      ));
-      // Delete saved game
-      lines.add(SizedBox.square(
-        dimension: MediaQuery.of(context).size.width / 5,
-        child: const DeleteSavedGameButton(),
-      ));
-    }
-
-    lines.add(SizedBox(height: separatorHeight));
-
-    // Global settings
-    for (String code in DefaultGlobalSettings.availableParameters) {
-      lines.add(Row(
-        mainAxisAlignment: MainAxisAlignment.spaceBetween,
-        children: buildParametersLine(
-          code: code,
-          isGlobal: true,
-        ),
-      ));
-
-      lines.add(SizedBox(height: separatorHeight));
-    }
-
-    return Column(
-      children: lines,
-    );
-  }
-
-  List<Widget> buildParametersLine({
-    required String code,
-    required bool isGlobal,
-  }) {
-    final List<Widget> parameterButtons = [];
-
-    final List<String> availableValues = isGlobal
-        ? DefaultGlobalSettings.getAvailableValues(code)
-        : DefaultGameSettings.getAvailableValues(code);
-
-    if (availableValues.length <= 1) {
-      return [];
-    }
-
-    for (String value in availableValues) {
-      final Widget parameterButton = BlocBuilder<GameSettingsCubit, GameSettingsState>(
-        builder: (BuildContext context, GameSettingsState gameSettingsState) {
-          return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
-            builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
-              final GameSettingsCubit gameSettingsCubit =
-                  BlocProvider.of<GameSettingsCubit>(context);
-              final GlobalSettingsCubit globalSettingsCubit =
-                  BlocProvider.of<GlobalSettingsCubit>(context);
-
-              final String currentValue = isGlobal
-                  ? globalSettingsCubit.getParameterValue(code)
-                  : gameSettingsCubit.getParameterValue(code);
-
-              final bool isSelected = (value == currentValue);
-
-              final double displayWidth = MediaQuery.of(context).size.width;
-              final double itemWidth = displayWidth / availableValues.length - 4;
-
-              return SizedBox.square(
-                dimension: itemWidth,
-                child: ParameterWidget(
-                  code: code,
-                  value: value,
-                  isSelected: isSelected,
-                  size: itemWidth,
-                  gameSettings: gameSettingsState.settings,
-                  globalSettings: globalSettingsState.settings,
-                  onPressed: () {
-                    isGlobal
-                        ? globalSettingsCubit.setParameterValue(code, value)
-                        : gameSettingsCubit.setParameterValue(code, value);
-                  },
-                ),
-              );
-            },
-          );
-        },
-      );
-
-      parameterButtons.add(parameterButton);
-    }
-
-    return parameterButtons;
-  }
-}
diff --git a/lib/ui/screens/page_game.dart b/lib/ui/screens/page_game.dart
deleted file mode 100644
index 618a47808d4720af2c789f26dc569a931d1661ac..0000000000000000000000000000000000000000
--- a/lib/ui/screens/page_game.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/models/game/game.dart';
-import 'package:awale/ui/layouts/parameters_layout.dart';
-import 'package:awale/ui/layouts/game_layout.dart';
-
-class PageGame extends StatelessWidget {
-  const PageGame({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    return BlocBuilder<GameCubit, GameState>(
-      builder: (BuildContext context, GameState gameState) {
-        final Game currentGame = gameState.currentGame;
-
-        return currentGame.isRunning
-            ? const GameLayout()
-            : ParametersLayout(canResume: currentGame.canBeResumed);
-      },
-    );
-  }
-}
diff --git a/lib/ui/skeleton.dart b/lib/ui/skeleton.dart
index defd236777b906a30b4b0760f5ee790500e0564e..9ab21e8f7eb293659ce355dd7a7c2ac12447a7b7 100644
--- a/lib/ui/skeleton.dart
+++ b/lib/ui/skeleton.dart
@@ -1,34 +1,37 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/config/menu.dart';
-import 'package:awale/cubit/nav_cubit.dart';
-import 'package:awale/ui/widgets/global_app_bar.dart';
+import 'package:awale/common/config/activity_page.dart';
+import 'package:awale/common/config/screen.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_screens.dart';
+import 'package:awale/common/ui/nav/global_app_bar.dart';
+import 'package:awale/common/ui/nav/bottom_nav_bar.dart';
 
 class SkeletonScreen extends StatelessWidget {
   const SkeletonScreen({super.key});
 
   @override
   Widget build(BuildContext context) {
-    return Scaffold(
-      appBar: const GlobalAppBar(),
-      extendBodyBehindAppBar: false,
-      body: Material(
-        color: Theme.of(context).colorScheme.surface,
-        child: BlocBuilder<NavCubit, int>(
-          builder: (BuildContext context, int pageIndex) {
-            return Padding(
+    return BlocBuilder<NavCubitScreen, int>(
+      builder: (BuildContext context, int screenIndex) {
+        return Scaffold(
+          appBar: const GlobalAppBar(),
+          extendBodyBehindAppBar: false,
+          body: Material(
+            color: Theme.of(context).colorScheme.surface,
+            child: Padding(
               padding: const EdgeInsets.only(
                 top: 8,
                 left: 2,
                 right: 2,
               ),
-              child: Menu.getPageWidget(pageIndex),
-            );
-          },
-        ),
-      ),
-      backgroundColor: Theme.of(context).colorScheme.surface,
+              child: Screen.getWidget(screenIndex),
+            ),
+          ),
+          backgroundColor: Theme.of(context).colorScheme.surface,
+          bottomNavigationBar: ActivityPage.displayBottomNavBar ? const BottomNavBar() : null,
+        );
+      },
     );
   }
 }
diff --git a/lib/ui/widgets/actions/button_delete_saved_game.dart b/lib/ui/widgets/actions/button_delete_saved_game.dart
index 37df0be7608e86a4c55242f8a01a28364d0a15ea..9d13649db24e5c48fdabad49529c1fbf23426ef5 100644
--- a/lib/ui/widgets/actions/button_delete_saved_game.dart
+++ b/lib/ui/widgets/actions/button_delete_saved_game.dart
@@ -1,7 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
 
 class DeleteSavedGameButton extends StatelessWidget {
   const DeleteSavedGameButton({super.key});
@@ -11,7 +11,7 @@ class DeleteSavedGameButton extends StatelessWidget {
     return StyledButton(
       color: Colors.grey,
       onPressed: () {
-        BlocProvider.of<GameCubit>(context).deleteSavedGame();
+        BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
       },
       child: const Image(
         image: AssetImage('assets/ui/button_delete_saved_game.png'),
diff --git a/lib/ui/widgets/actions/button_game_quit.dart b/lib/ui/widgets/actions/button_game_quit.dart
index fdee394f0cea966b7bf8b0d4cdb7432e93386435..be0b80fd158b6cd1bd69d0fbdb86fc5c4805f4ba 100644
--- a/lib/ui/widgets/actions/button_game_quit.dart
+++ b/lib/ui/widgets/actions/button_game_quit.dart
@@ -1,7 +1,9 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_pages.dart';
+
+import 'package:awale/cubit/activity/activity_cubit.dart';
 
 class QuitGameButton extends StatelessWidget {
   const QuitGameButton({super.key});
@@ -11,7 +13,8 @@ class QuitGameButton extends StatelessWidget {
     return StyledButton(
       color: Colors.red,
       onPressed: () {
-        BlocProvider.of<GameCubit>(context).quitGame();
+        BlocProvider.of<ActivityCubit>(context).quitActivity();
+        BlocProvider.of<NavCubitPage>(context).goToPageHome();
       },
       child: const Image(
         image: AssetImage('assets/ui/button_back.png'),
diff --git a/lib/ui/widgets/actions/button_game_start_new.dart b/lib/ui/widgets/actions/button_game_start_new.dart
index fb3d717ef552f491989821f247fd22cdee26b913..5e89d3eeae3a6314372eaaa1880b1a9abce6c7b2 100644
--- a/lib/ui/widgets/actions/button_game_start_new.dart
+++ b/lib/ui/widgets/actions/button_game_start_new.dart
@@ -1,26 +1,29 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/cubit/settings_game_cubit.dart';
-import 'package:awale/cubit/settings_global_cubit.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_pages.dart';
+
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/cubit/settings/settings_activity_cubit.dart';
+import 'package:awale/cubit/settings/settings_global_cubit.dart';
 
 class StartNewGameButton extends StatelessWidget {
   const StartNewGameButton({super.key});
 
   @override
   Widget build(BuildContext context) {
-    return BlocBuilder<GameSettingsCubit, GameSettingsState>(
-      builder: (BuildContext context, GameSettingsState gameSettingsState) {
+    return BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
+      builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
         return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
           builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
             return StyledButton(
               color: Colors.blue,
               onPressed: () {
-                BlocProvider.of<GameCubit>(context).startNewGame(
-                  gameSettings: gameSettingsState.settings,
+                BlocProvider.of<ActivityCubit>(context).startNewActivity(
+                  activitySettings: activitySettingsState.settings,
                   globalSettings: globalSettingsState.settings,
                 );
+                BlocProvider.of<NavCubitPage>(context).goToPageGame();
               },
               child: const Image(
                 image: AssetImage('assets/ui/button_start.png'),
diff --git a/lib/ui/widgets/actions/button_resume_saved_game.dart b/lib/ui/widgets/actions/button_resume_saved_game.dart
index c5ce83bb0d27159590300475b3d37a16b36ee8b5..b3ba30b0e1e5c5e50d402d5422634674e5d5b470 100644
--- a/lib/ui/widgets/actions/button_resume_saved_game.dart
+++ b/lib/ui/widgets/actions/button_resume_saved_game.dart
@@ -1,7 +1,9 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
+import 'package:awale/common/cubit/nav/nav_cubit_pages.dart';
+
+import 'package:awale/cubit/activity/activity_cubit.dart';
 
 class ResumeSavedGameButton extends StatelessWidget {
   const ResumeSavedGameButton({super.key});
@@ -11,7 +13,8 @@ class ResumeSavedGameButton extends StatelessWidget {
     return StyledButton(
       color: Colors.blue,
       onPressed: () {
-        BlocProvider.of<GameCubit>(context).resumeSavedGame();
+        BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
+        BlocProvider.of<NavCubitPage>(context).goToPageGame();
       },
       child: const Image(
         image: AssetImage('assets/ui/button_resume_game.png'),
diff --git a/lib/ui/widgets/game/game_board.dart b/lib/ui/widgets/game/game_board.dart
index 5823358669e701832c224d295253db6c520e7b65..16bfa979f0d807f784463813699fde4013ffb7ab 100644
--- a/lib/ui/widgets/game/game_board.dart
+++ b/lib/ui/widgets/game/game_board.dart
@@ -1,7 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
 import 'package:awale/ui/widgets/game/game_house.dart';
 import 'package:awale/ui/widgets/game/game_score.dart';
 
@@ -16,8 +16,8 @@ class GameBoardWidget extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return Center(
-      child: BlocBuilder<GameCubit, GameState>(
-        builder: (BuildContext context, GameState gameState) {
+      child: BlocBuilder<ActivityCubit, ActivityState>(
+        builder: (BuildContext context, ActivityState activityState) {
           final Color borderColor = Theme.of(context).colorScheme.onSurface;
 
           Widget house(int houseIndex) {
diff --git a/lib/ui/widgets/game/game_end.dart b/lib/ui/widgets/game/game_end.dart
index 7ccc8000bf5854a41798a74aa82f37b3ddb3bb8c..a5851709a1510fa8f54c5dfc242fa4bb22c5ac56 100644
--- a/lib/ui/widgets/game/game_end.dart
+++ b/lib/ui/widgets/game/game_end.dart
@@ -1,8 +1,8 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/models/game/game.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/models/activity/activity.dart';
 import 'package:awale/ui/widgets/actions/button_game_quit.dart';
 
 class GameEndWidget extends StatelessWidget {
@@ -17,16 +17,16 @@ class GameEndWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return BlocBuilder<GameCubit, GameState>(
-      builder: (BuildContext context, GameState gameState) {
-        final Game currentGame = gameState.currentGame;
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        final Activity currentActivity = activityState.currentActivity;
 
-        final String playerImageAsset =
-            currentGame.scores[playerIndex] == currentGame.scores[1 - playerIndex]
-                ? 'assets/ui/game_draw.png'
-                : (currentGame.scores[playerIndex] > currentGame.scores[1 - playerIndex]
-                    ? 'assets/ui/game_win.png'
-                    : 'assets/ui/game_fail.png');
+        final String playerImageAsset = currentActivity.scores[playerIndex] ==
+                currentActivity.scores[1 - playerIndex]
+            ? 'assets/ui/game_draw.png'
+            : (currentActivity.scores[playerIndex] > currentActivity.scores[1 - playerIndex]
+                ? 'assets/ui/game_win.png'
+                : 'assets/ui/game_fail.png');
 
         final Image playerImage = Image(
           image: AssetImage(playerImageAsset),
@@ -50,7 +50,7 @@ class GameEndWidget extends StatelessWidget {
                     Column(children: [playerImage]),
                     Column(
                       children: [
-                        currentGame.animationInProgress
+                        currentActivity.animationInProgress
                             ? Image(
                                 image: const AssetImage('assets/ui/placeholder.png'),
                                 fit: BoxFit.fill,
diff --git a/lib/ui/widgets/game/game_house.dart b/lib/ui/widgets/game/game_house.dart
index ee36641addac8747288f1420f77f0e75a71862d7..22ae18e89bd472c467c8548ead4defd7774e2c9d 100644
--- a/lib/ui/widgets/game/game_house.dart
+++ b/lib/ui/widgets/game/game_house.dart
@@ -1,8 +1,8 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/models/game/game.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/models/activity/activity.dart';
 import 'package:awale/ui/widgets/game/game_seeds.dart';
 
 class GameHouseWidget extends StatelessWidget {
@@ -15,20 +15,20 @@ class GameHouseWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return BlocBuilder<GameCubit, GameState>(
-      builder: (BuildContext context, GameState gameState) {
-        final Game currentGame = gameState.currentGame;
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        final Activity currentActivity = activityState.currentActivity;
 
-        final bool isTapAllowed = currentGame.isCurrentPlayerHouse(cellIndex);
-        final int seedsCount = currentGame.board.cells[cellIndex];
+        final bool isTapAllowed = currentActivity.isCurrentPlayerHouse(cellIndex);
+        final int seedsCount = currentActivity.board.cells[cellIndex];
 
         final Color baseColor =
             isTapAllowed ? Colors.white : const Color.fromARGB(255, 230, 230, 230);
 
         return GestureDetector(
           onTap: () {
-            if (isTapAllowed && !currentGame.animationInProgress) {
-              BlocProvider.of<GameCubit>(context).tapOnCell(cellIndex);
+            if (isTapAllowed && !currentActivity.animationInProgress) {
+              BlocProvider.of<ActivityCubit>(context).tapOnCell(cellIndex);
             }
           },
           child: AspectRatio(
diff --git a/lib/ui/widgets/game/game_player.dart b/lib/ui/widgets/game/game_player.dart
index 79501f0c334813acd44351020d26aedc6995b198..94e6040c957ebd1e17d7f976152b1a7229d5f903 100644
--- a/lib/ui/widgets/game/game_player.dart
+++ b/lib/ui/widgets/game/game_player.dart
@@ -1,8 +1,8 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/models/game/game.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/models/activity/activity.dart';
 import 'package:awale/ui/widgets/game/game_seeds.dart';
 
 class GamePlayerWidget extends StatelessWidget {
@@ -17,15 +17,15 @@ class GamePlayerWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return BlocBuilder<GameCubit, GameState>(
-      builder: (BuildContext context, GameState gameState) {
-        final Game currentGame = gameState.currentGame;
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        final Activity currentActivity = activityState.currentActivity;
 
-        final bool isCurrentPlayer = (currentGame.currentPlayer == playerIndex);
-        final int seedsCount = isCurrentPlayer ? currentGame.currentHand : 0;
+        final bool isCurrentPlayer = (currentActivity.currentPlayer == playerIndex);
+        final int seedsCount = isCurrentPlayer ? currentActivity.currentHand : 0;
 
         final Color baseColor = isCurrentPlayer
-            ? (currentGame.isPlayerHuman(playerIndex) ? Colors.pink : Colors.grey)
+            ? (currentActivity.isPlayerHuman(playerIndex) ? Colors.pink : Colors.grey)
             : Theme.of(context).colorScheme.surface;
 
         return Container(
diff --git a/lib/ui/widgets/game/game_score.dart b/lib/ui/widgets/game/game_score.dart
index 6f036699b715f1534bb8923daa696aa054406a41..73ed727ea8ac5ca3418a70901470ad2e87c41e4b 100644
--- a/lib/ui/widgets/game/game_score.dart
+++ b/lib/ui/widgets/game/game_score.dart
@@ -1,8 +1,8 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/models/game/game.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/models/activity/activity.dart';
 
 class GameScoreWidget extends StatelessWidget {
   const GameScoreWidget({
@@ -14,11 +14,11 @@ class GameScoreWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return BlocBuilder<GameCubit, GameState>(
-      builder: (BuildContext context, GameState gameState) {
-        final Game currentGame = gameState.currentGame;
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        final Activity currentActivity = activityState.currentActivity;
 
-        final bool isCurrentPlayer = (currentGame.currentPlayer == playerIndex);
+        final bool isCurrentPlayer = (currentActivity.currentPlayer == playerIndex);
 
         final baseColor =
             isCurrentPlayer ? Colors.white : const Color.fromARGB(255, 230, 230, 230);
@@ -40,7 +40,7 @@ class GameScoreWidget extends StatelessWidget {
             child: Padding(
               padding: const EdgeInsets.fromLTRB(0, 65, 0, 0),
               child: Text(
-                currentGame.scores[playerIndex].toString(),
+                currentActivity.scores[playerIndex].toString(),
                 textAlign: TextAlign.center,
                 style: TextStyle(
                   fontSize: 40,
diff --git a/lib/ui/widgets/game/game_seeds.dart b/lib/ui/widgets/game/game_seeds.dart
index 1eba341f49c028d5b9493a84734740c58007ae8e..f6493fce76d6fb9680f0dfd9cc61719f12a0b92e 100644
--- a/lib/ui/widgets/game/game_seeds.dart
+++ b/lib/ui/widgets/game/game_seeds.dart
@@ -3,8 +3,8 @@ import 'dart:math';
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:awale/cubit/game_cubit.dart';
-import 'package:awale/models/game/game.dart';
+import 'package:awale/cubit/activity/activity_cubit.dart';
+import 'package:awale/models/activity/activity.dart';
 
 class GameSeedsWidget extends StatelessWidget {
   const GameSeedsWidget({
@@ -16,10 +16,10 @@ class GameSeedsWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return BlocBuilder<GameCubit, GameState>(
-      builder: (BuildContext context, GameState gameState) {
-        final Game currentGame = gameState.currentGame;
-        final String skin = currentGame.globalSettings.skin;
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        final Activity currentActivity = activityState.currentActivity;
+        final String skin = currentActivity.globalSettings.skin;
 
         const ratioScale = 0.2;
         const ratioTranslate = 0.65;
diff --git a/pubspec.lock b/pubspec.lock
index 011ee2e27741f0e29cbc4b4aac803190885ffbae..5f7d30f1d27f049d10d751142b1e10ef2a65d726 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -245,10 +245,10 @@ packages:
     dependency: transitive
     description:
       name: path_provider
-      sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
+      sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.4"
+    version: "2.1.5"
   path_provider_android:
     dependency: transitive
     description:
@@ -442,10 +442,10 @@ packages:
     dependency: transitive
     description:
       name: win32
-      sha256: "2735daae5150e8b1dfeb3eb0544b4d3af0061e9e82cef063adcd583bdae4306a"
+      sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454"
       url: "https://pub.dev"
     source: hosted
-    version: "5.7.0"
+    version: "5.7.2"
   xdg_directories:
     dependency: transitive
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 16196cadcde2bf66adcc39734b2bcfaff14e5ce1..0bdb50094e8038d7cb57e9c9c9cd2c8804947b0d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: Awale game
 
 publish_to: "none"
 
-version: 0.2.1+15
+version: 0.3.0+16
 
 environment:
   sdk: "^3.0.0"