diff --git a/fastlane/metadata/android/en-US/changelogs/51.txt b/fastlane/metadata/android/en-US/changelogs/51.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c20ed39173f1690cb6181457fe5d4c6cc0a061ab
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/51.txt
@@ -0,0 +1 @@
+Use ActivityParameters widgets from flutter_custom_toolbox.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/51.txt b/fastlane/metadata/android/fr-FR/changelogs/51.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f732ebd3738d66fdff72e28b0cf0bb4b0684e030
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/51.txt
@@ -0,0 +1 @@
+Utilisation des widgets ActivityParameters de flutter_custom_toolbox.
diff --git a/flutter_01.png b/flutter_01.png
new file mode 100644
index 0000000000000000000000000000000000000000..0573bad1317844834df79f943667c85027a14870
Binary files /dev/null and b/flutter_01.png differ
diff --git a/lib/common/config/activity_page.dart b/lib/common/config/activity_page.dart
index 9c1b03a3c0213f53aecf134d537774be8de04fcc..0fe05cb33a5f008728ccf35d35021c9eac684179 100644
--- a/lib/common/config/activity_page.dart
+++ b/lib/common/config/activity_page.dart
@@ -1,18 +1,20 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:colors/common/ui/pages/game.dart';
-import 'package:colors/common/ui/pages/parameters.dart';
+import 'package:colors/cubit/activity/activity_cubit.dart';
+import 'package:colors/config/application_config.dart';
+import 'package:colors/models/activity/activity.dart';
+import 'package:colors/ui/pages/game.dart';
 
 class ActivityPageItem {
   final String code;
   final Icon icon;
-  final Widget page;
+  final Widget Function({required Activity currentActivity})? builder;
 
   const ActivityPageItem({
     required this.code,
     required this.icon,
-    required this.page,
+    required this.builder,
   });
 }
 
@@ -20,20 +22,27 @@ class ActivityPage {
   static const bool displayBottomNavBar = false;
 
   static const indexHome = 0;
-  static const pageHome = ActivityPageItem(
+  static final ActivityPageItem pageHome = ActivityPageItem(
     code: 'page_home',
     icon: Icon(UniconsLine.home),
-    page: PageParameters(),
+    builder: ({required Activity currentActivity}) {
+      return PageParameters(
+        config: ApplicationConfig.config,
+        canBeResumed: currentActivity.canBeResumed,
+      );
+    },
   );
 
   static const indexGame = 1;
-  static const pageGame = ActivityPageItem(
+  static final pageGame = ActivityPageItem(
     code: 'page_game',
     icon: Icon(UniconsLine.star),
-    page: PageGame(),
+    builder: ({required Activity currentActivity}) {
+      return PageGame();
+    },
   );
 
-  static const Map<int, ActivityPageItem> items = {
+  static final Map<int, ActivityPageItem> items = {
     indexHome: pageHome,
     indexGame: pageGame,
   };
@@ -44,7 +53,17 @@ class ActivityPage {
     return items.keys.contains(pageIndex);
   }
 
-  static Widget getWidget(int pageIndex) {
-    return items[pageIndex]?.page ?? pageHome.page;
+  static Widget getWidget(int pageIndex, BuildContext context) {
+    return BlocBuilder<ActivityCubit, ActivityState>(
+      builder: (BuildContext context, ActivityState activityState) {
+        final Activity currentActivity = activityState.currentActivity;
+
+        if (items.keys.contains(pageIndex)) {
+          return items[pageIndex]?.builder!(currentActivity: currentActivity) ?? Text('oups');
+        } else {
+          return getWidget(defaultPageIndex, context);
+        }
+      },
+    );
   }
 }
diff --git a/lib/common/ui/pages/parameters.dart b/lib/common/ui/pages/parameters.dart
deleted file mode 100644
index aa9a04bd0da5b3ff92ed680df20b2b125de5db1d..0000000000000000000000000000000000000000
--- a/lib/common/ui/pages/parameters.dart
+++ /dev/null
@@ -1,171 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:colors/common/cubit/nav/nav_cubit_pages.dart';
-import 'package:colors/common/ui/parameters/parameter_widget.dart';
-
-import 'package:colors/config/default_activity_settings.dart';
-import 'package:colors/config/default_global_settings.dart';
-import 'package:colors/cubit/activity/activity_cubit.dart';
-import 'package:colors/cubit/settings/settings_activity_cubit.dart';
-import 'package:colors/cubit/settings/settings_global_cubit.dart';
-import 'package:colors/models/activity/activity.dart';
-
-class PageParameters extends StatelessWidget {
-  const PageParameters({super.key});
-
-  final double separatorHeight = 8.0;
-
-  @override
-  Widget build(BuildContext context) {
-    return BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
-      builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
-        return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
-          builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
-            return BlocBuilder<ActivityCubit, ActivityState>(
-              builder: (BuildContext context, ActivityState activityState) {
-                final Activity currentActivity = activityState.currentActivity;
-
-                final List<Widget> lines = [];
-
-                // Activity 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 activity
-                  lines.add(
-                    AspectRatio(
-                      aspectRatio: 3,
-                      child: ActivityButtonStartNew(
-                        onPressed: () {
-                          BlocProvider.of<ActivityCubit>(context).startNewActivity(
-                            activitySettings: activitySettingsState.settings,
-                            globalSettings: globalSettingsState.settings,
-                          );
-                          BlocProvider.of<NavCubitPage>(context).goToPageGame();
-                        },
-                      ),
-                    ),
-                  );
-                } else {
-                  // Resume activity
-                  lines.add(AspectRatio(
-                    aspectRatio: 3,
-                    child: ActivityButtonResumeSaved(
-                      onPressed: () {
-                        BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
-                        BlocProvider.of<NavCubitPage>(context).goToPageGame();
-                      },
-                    ),
-                  ));
-                  // Delete saved activity
-                  lines.add(SizedBox.square(
-                    dimension: MediaQuery.of(context).size.width / 5,
-                    child: ActivityButtonDeleteSaved(
-                      onPressed: () {
-                        BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
-                      },
-                    ),
-                  ));
-                }
-
-                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/common/ui/parameters/parameter_painter.dart b/lib/common/ui/parameters/parameter_painter.dart
deleted file mode 100644
index 0ff59951a7313f657b8b29bdbcc7698e1db7f3cf..0000000000000000000000000000000000000000
--- a/lib/common/ui/parameters/parameter_painter.dart
+++ /dev/null
@@ -1,300 +0,0 @@
-import 'dart:math';
-
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:colors/config/color_theme.dart';
-import 'package:colors/config/default_activity_settings.dart';
-import 'package:colors/config/default_global_settings.dart';
-import 'package:colors/models/settings/settings_activity.dart';
-import 'package:colors/models/settings/settings_global.dart';
-
-class ParameterPainter extends CustomPainter {
-  const ParameterPainter({
-    required this.code,
-    required this.value,
-    required this.activitySettings,
-    required this.globalSettings,
-  });
-
-  final String code;
-  final String value;
-  final ActivitySettings activitySettings;
-  final GlobalSettings globalSettings;
-
-  @override
-  void paint(Canvas canvas, Size size) {
-    // force square
-    final double canvasSize = min(size.width, size.height);
-
-    // content
-    switch (code) {
-      case DefaultActivitySettings.parameterCodeDifficultyLevel:
-        paintDifficultyLevelParameterItem(canvas, canvasSize);
-        break;
-      case DefaultActivitySettings.parameterCodeBoardSize:
-        paintBoardSizeParameterItem(canvas, canvasSize);
-        break;
-      case DefaultActivitySettings.parameterCodeColorsCount:
-        paintColorsCountParameterItem(canvas, canvasSize);
-        break;
-      case DefaultGlobalSettings.parameterCodeSkin:
-        paintColorsThemeParameterItem(canvas, canvasSize);
-        break;
-      default:
-        printlog('$ParameterPainter -> unknown parameter: $code/$value');
-        paintUnknownParameterItem(canvas, canvasSize);
-    }
-  }
-
-  @override
-  bool shouldRepaint(CustomPainter oldDelegate) {
-    return false;
-  }
-
-  // "unknown" parameter -> simple block with text
-  void paintUnknownParameterItem(
-    final Canvas canvas,
-    final double size,
-  ) {
-    final paint = Paint();
-    paint.strokeJoin = StrokeJoin.round;
-    paint.strokeWidth = 3;
-
-    final textSpan = TextSpan(
-      text: '$code\n$value',
-      style: const TextStyle(
-        color: Colors.black,
-        fontSize: 18,
-        fontWeight: FontWeight.bold,
-      ),
-    );
-    final textPainter = TextPainter(
-      text: textSpan,
-      textDirection: TextDirection.ltr,
-      textAlign: TextAlign.center,
-    );
-    textPainter.layout();
-    textPainter.paint(
-      canvas,
-      Offset(
-        (size - textPainter.width) * 0.5,
-        (size - textPainter.height) * 0.5,
-      ),
-    );
-  }
-
-  void paintDifficultyLevelParameterItem(
-    final Canvas canvas,
-    final double size,
-  ) {
-    final List<dynamic> stars = [];
-
-    switch (value) {
-      case DefaultActivitySettings.difficultyLevelValueEasy:
-        stars.add([0.5, 0.5]);
-        break;
-      case DefaultActivitySettings.difficultyLevelValueMedium:
-        stars.add([0.3, 0.5]);
-        stars.add([0.7, 0.5]);
-        break;
-      case DefaultActivitySettings.difficultyLevelValueHard:
-        stars.add([0.3, 0.3]);
-        stars.add([0.7, 0.3]);
-        stars.add([0.5, 0.7]);
-        break;
-      case DefaultActivitySettings.difficultyLevelValueNightmare:
-        stars.add([0.3, 0.3]);
-        stars.add([0.7, 0.3]);
-        stars.add([0.3, 0.7]);
-        stars.add([0.7, 0.7]);
-        break;
-      default:
-        printlog('Wrong value for level parameter value: $value');
-    }
-
-    final paint = Paint();
-    paint.strokeJoin = StrokeJoin.round;
-    paint.strokeWidth = 3 / 100 * size;
-
-    // Stars
-    final textSpan = TextSpan(
-      text: '⭐',
-      style: TextStyle(
-        color: Colors.black,
-        fontSize: size / 3,
-        fontWeight: FontWeight.bold,
-      ),
-    );
-    final textPainter = TextPainter(
-      text: textSpan,
-      textDirection: TextDirection.ltr,
-      textAlign: TextAlign.center,
-    );
-    textPainter.layout();
-
-    for (var center in stars) {
-      textPainter.paint(
-        canvas,
-        Offset(
-          size * center[0] - textPainter.width * 0.5,
-          size * center[1] - textPainter.height * 0.5,
-        ),
-      );
-    }
-  }
-
-  void paintBoardSizeParameterItem(
-    final Canvas canvas,
-    final double size,
-  ) {
-    int gridWidth = 1;
-
-    switch (value) {
-      case DefaultActivitySettings.boardSizeValueSmall:
-        gridWidth = 2;
-        break;
-      case DefaultActivitySettings.boardSizeValueMedium:
-        gridWidth = 3;
-        break;
-      case DefaultActivitySettings.boardSizeValueLarge:
-        gridWidth = 4;
-        break;
-      case DefaultActivitySettings.boardSizeValueExtra:
-        gridWidth = 5;
-        break;
-      default:
-        printlog('Wrong value for boardSize parameter value: $value');
-    }
-
-    final paint = Paint();
-    paint.strokeJoin = StrokeJoin.round;
-    paint.strokeWidth = 3 / 100 * size;
-
-    // Mini grid
-    final squareBackgroundColor = Colors.grey.shade200;
-    final squareBorderColor = Colors.grey.shade800;
-
-    final double cellSize = size / 7;
-    final double origin = (size - gridWidth * cellSize) / 2;
-
-    for (int row = 0; row < gridWidth; row++) {
-      for (int col = 0; col < gridWidth; col++) {
-        final Offset topLeft = Offset(origin + col * cellSize, origin + row * cellSize);
-        final Offset bottomRight = topLeft + Offset(cellSize, cellSize);
-
-        paint.color = squareBackgroundColor;
-        paint.style = PaintingStyle.fill;
-        canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
-
-        paint.color = squareBorderColor;
-        paint.style = PaintingStyle.stroke;
-        canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
-      }
-    }
-  }
-
-  void paintColorsCountParameterItem(
-    final Canvas canvas,
-    final double size,
-  ) {
-    final paint = Paint();
-    paint.strokeJoin = StrokeJoin.round;
-    paint.strokeWidth = 3;
-
-    // Colors preview
-    const List<Offset> positions = [
-      Offset(0, 0),
-      Offset(1, 0),
-      Offset(2, 0),
-      Offset(2, 1),
-      Offset(2, 2),
-      Offset(1, 2),
-      Offset(0, 2),
-      Offset(0, 1),
-    ];
-
-    const skin = DefaultGlobalSettings.defaultSkinValue;
-
-    final double padding = 4 / 100 * size;
-    final double margin = 3 / 100 * size;
-    final double width = ((size - 2 * padding) / 3) - 2 * margin;
-
-    final int maxValue = int.parse(value);
-    for (int colorIndex = 0; colorIndex < maxValue; colorIndex++) {
-      final Offset position = positions[colorIndex];
-
-      final Offset topLeft = Offset(padding + margin + position.dx * (width + 2 * margin),
-          padding + margin + position.dy * (width + 2 * margin));
-
-      final Offset bottomRight = topLeft + Offset(width, width);
-
-      final squareColor = Color(ColorTheme.getColorCode(skin, colorIndex + 1));
-      paint.color = squareColor;
-      paint.style = PaintingStyle.fill;
-      canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
-
-      final borderColor = squareColor.darken(20);
-      paint.color = borderColor;
-      paint.style = PaintingStyle.stroke;
-      canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
-    }
-
-    // centered text value
-    final textSpan = TextSpan(
-      text: value.toString(),
-      style: TextStyle(
-        color: Colors.black,
-        fontSize: size / 4,
-        fontWeight: FontWeight.bold,
-      ),
-    );
-    final textPainter = TextPainter(
-      text: textSpan,
-      textDirection: TextDirection.ltr,
-      textAlign: TextAlign.center,
-    );
-    textPainter.layout();
-    textPainter.paint(
-      canvas,
-      Offset(
-        (size - textPainter.width) * 0.5,
-        (size - textPainter.height) * 0.5,
-      ),
-    );
-  }
-
-  void paintColorsThemeParameterItem(
-    final Canvas canvas,
-    final double size,
-  ) {
-    const int gridWidth = 4;
-
-    final paint = Paint();
-    paint.strokeJoin = StrokeJoin.round;
-    paint.strokeWidth = 3;
-
-    // Mini grid
-    final borderColor = Colors.grey.shade800;
-
-    final double cellSize = size / gridWidth;
-    final double origin = (size - gridWidth * cellSize) / 2;
-
-    for (int row = 0; row < gridWidth; row++) {
-      for (int col = 0; col < gridWidth; col++) {
-        final Offset topLeft = Offset(origin + col * cellSize, origin + row * cellSize);
-        final Offset bottomRight = topLeft + Offset(cellSize, cellSize);
-
-        const squareColor = Colors.pink;
-
-        paint.color = squareColor;
-        paint.style = PaintingStyle.fill;
-        canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
-
-        paint.color = borderColor;
-        paint.style = PaintingStyle.stroke;
-        canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
-      }
-    }
-  }
-}
diff --git a/lib/common/ui/parameters/parameter_widget.dart b/lib/common/ui/parameters/parameter_widget.dart
deleted file mode 100644
index eb418ce7d5d293e85ee84d94834a4b09055056e0..0000000000000000000000000000000000000000
--- a/lib/common/ui/parameters/parameter_widget.dart
+++ /dev/null
@@ -1,212 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:colors/common/ui/parameters/parameter_painter.dart';
-
-import 'package:colors/config/default_activity_settings.dart';
-import 'package:colors/config/default_global_settings.dart';
-import 'package:colors/models/settings/settings_activity.dart';
-import 'package:colors/models/settings/settings_global.dart';
-
-class ParameterWidget extends StatelessWidget {
-  const ParameterWidget({
-    super.key,
-    required this.code,
-    required this.value,
-    required this.isSelected,
-    required this.size,
-    required this.activitySettings,
-    required this.globalSettings,
-    required this.onPressed,
-  });
-
-  final String code;
-  final String value;
-  final bool isSelected;
-  final double size;
-  final ActivitySettings activitySettings;
-  final GlobalSettings globalSettings;
-  final VoidCallback onPressed;
-
-  static const Color buttonColorActive = Colors.blue;
-  static const Color buttonColorInactive = Colors.white;
-  static const double buttonBorderWidth = 4.0;
-  static const double buttonBorderRadius = 12.0;
-
-  @override
-  Widget build(BuildContext context) {
-    Widget content = const SizedBox.shrink();
-
-    switch (code) {
-      case DefaultActivitySettings.parameterCodeDifficultyLevel:
-        content = getDifficultyLevelParameterItem();
-        break;
-      case DefaultActivitySettings.parameterCodeBoardSize:
-        content = getBoardSizeParameterItem();
-        break;
-      case DefaultActivitySettings.parameterCodeColorsCount:
-        content = getColorsCountParameterItem();
-        break;
-      case DefaultGlobalSettings.parameterCodeSkin:
-        content = getColorsThemeParameterItem();
-        break;
-      default:
-        printlog('$ParameterWidget -> unknown parameter: $code/$value');
-        content = getUnknownParameterItem();
-    }
-
-    final Color buttonColor = isSelected ? buttonColorActive : buttonColorInactive;
-
-    return Container(
-      decoration: BoxDecoration(
-        color: buttonColor,
-        borderRadius: BorderRadius.circular(buttonBorderRadius),
-        border: Border.all(
-          color: buttonColor,
-          width: buttonBorderWidth,
-        ),
-      ),
-      child: content,
-    );
-  }
-
-  // "unknown" parameter -> simple block with text
-  Widget getUnknownParameterItem() {
-    return StyledButton.text(
-      caption: '$code / $value',
-      color: Colors.grey,
-      onPressed: null,
-    );
-  }
-
-  Widget getDifficultyLevelParameterItem() {
-    Color backgroundColor = Colors.grey;
-
-    switch (value) {
-      case DefaultActivitySettings.difficultyLevelValueEasy:
-        backgroundColor = Colors.green;
-        break;
-      case DefaultActivitySettings.difficultyLevelValueMedium:
-        backgroundColor = Colors.orange;
-        break;
-      case DefaultActivitySettings.difficultyLevelValueHard:
-        backgroundColor = Colors.red;
-        break;
-      case DefaultActivitySettings.difficultyLevelValueNightmare:
-        backgroundColor = Colors.purple;
-        break;
-      default:
-        printlog('Wrong value for level parameter value: $value');
-    }
-
-    return StyledButton(
-      color: backgroundColor,
-      onPressed: onPressed,
-      child: CustomPaint(
-        size: Size(size, size),
-        willChange: false,
-        painter: ParameterPainter(
-          code: code,
-          value: value,
-          activitySettings: activitySettings,
-          globalSettings: globalSettings,
-        ),
-        isComplex: true,
-      ),
-    );
-  }
-
-  Widget getBoardSizeParameterItem() {
-    Color backgroundColor = Colors.grey;
-
-    switch (value) {
-      case DefaultActivitySettings.boardSizeValueSmall:
-        backgroundColor = Colors.green;
-        break;
-      case DefaultActivitySettings.boardSizeValueMedium:
-        backgroundColor = Colors.orange;
-        break;
-      case DefaultActivitySettings.boardSizeValueLarge:
-        backgroundColor = Colors.red;
-        break;
-      case DefaultActivitySettings.boardSizeValueExtra:
-        backgroundColor = Colors.purple;
-        break;
-      default:
-        printlog('Wrong value for boardSize parameter value: $value');
-    }
-
-    return StyledButton(
-      color: backgroundColor,
-      onPressed: onPressed,
-      child: CustomPaint(
-        size: Size(size, size),
-        willChange: false,
-        painter: ParameterPainter(
-          code: code,
-          value: value,
-          activitySettings: activitySettings,
-          globalSettings: globalSettings,
-        ),
-        isComplex: true,
-      ),
-    );
-  }
-
-  Widget getColorsCountParameterItem() {
-    Color backgroundColor = Colors.grey;
-
-    switch (value) {
-      case DefaultActivitySettings.colorsCountValueLow:
-        backgroundColor = Colors.green;
-        break;
-      case DefaultActivitySettings.colorsCountValueMedium:
-        backgroundColor = Colors.orange;
-        break;
-      case DefaultActivitySettings.colorsCountValueHigh:
-        backgroundColor = Colors.red;
-        break;
-      case DefaultActivitySettings.colorsCountValueVeryHigh:
-        backgroundColor = Colors.purple;
-        break;
-      default:
-        printlog('Wrong value for colorsCount parameter value: $value');
-    }
-
-    return StyledButton(
-      color: backgroundColor,
-      onPressed: onPressed,
-      child: CustomPaint(
-        size: Size(size, size),
-        willChange: false,
-        painter: ParameterPainter(
-          code: code,
-          value: value,
-          activitySettings: activitySettings,
-          globalSettings: globalSettings,
-        ),
-        isComplex: true,
-      ),
-    );
-  }
-
-  Widget getColorsThemeParameterItem() {
-    Color backgroundColor = Colors.grey;
-
-    return StyledButton(
-      color: backgroundColor,
-      onPressed: onPressed,
-      child: CustomPaint(
-        size: Size(size, size),
-        willChange: false,
-        painter: ParameterPainter(
-          code: code,
-          value: value,
-          activitySettings: activitySettings,
-          globalSettings: globalSettings,
-        ),
-        isComplex: true,
-      ),
-    );
-  }
-}
diff --git a/lib/common/ui/screens/activity.dart b/lib/common/ui/screens/activity.dart
index b44d46812aef8a287a607dc88273b7e0b03176c2..1fc18b475935a679d7f45468c0043a52806791ff 100644
--- a/lib/common/ui/screens/activity.dart
+++ b/lib/common/ui/screens/activity.dart
@@ -11,7 +11,7 @@ class ScreenActivity extends StatelessWidget {
   Widget build(BuildContext context) {
     return BlocBuilder<NavCubitPage, int>(
       builder: (BuildContext context, int pageIndex) {
-        return ActivityPage.getWidget(pageIndex);
+        return ActivityPage.getWidget(pageIndex, context);
       },
     );
   }
diff --git a/lib/common/utils/color_theme_utils.dart b/lib/common/utils/color_theme_utils.dart
new file mode 100644
index 0000000000000000000000000000000000000000..7d49c9f944b1517de8fb844c74216d5433b6675a
--- /dev/null
+++ b/lib/common/utils/color_theme_utils.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+
+import 'package:colors/config/color_theme.dart';
+
+class ColorThemeUtils {
+  static int getColorsCount(String colorTheme) {
+    if (ColorTheme.colorThemes.containsKey(colorTheme) &&
+        null != ColorTheme.colorThemes[colorTheme]) {
+      List<int> colors = ColorTheme.colorThemes[colorTheme] ?? [];
+
+      return colors.length;
+    }
+
+    return 0;
+  }
+
+  static int getColorCode(int? value, String colorTheme) {
+    if (value != null &&
+        ColorTheme.colorThemes.containsKey(colorTheme) &&
+        null != ColorTheme.colorThemes[colorTheme]) {
+      List<int> skinColors = ColorTheme.colorThemes[colorTheme] ?? [];
+      return (skinColors[value % getColorsCount(colorTheme)]) | 0xFF000000;
+    }
+    return ColorTheme.defaultThemeColor | 0xFF000000;
+  }
+
+  static Color getColor(int? value, String colorTheme) {
+    return Color(getColorCode(value, colorTheme));
+  }
+
+  static Color getDefaultBorderColor() {
+    return Colors.grey;
+  }
+}
diff --git a/lib/config/application_config.dart b/lib/config/application_config.dart
index 35858aabee128ed6f2fca23d434ec33f5779bd5c..bd6a728cb81cf203fb66c8eb79f5809ddce39a8e 100644
--- a/lib/config/application_config.dart
+++ b/lib/config/application_config.dart
@@ -1,3 +1,186 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:colors/common/cubit/nav/nav_cubit_pages.dart';
+
+import 'package:colors/cubit/activity/activity_cubit.dart';
+import 'package:colors/ui/parameters/parameter_painter_board_size.dart';
+import 'package:colors/ui/parameters/parameter_painter_color_theme.dart';
+import 'package:colors/ui/parameters/parameter_painter_colors_count.dart';
+import 'package:colors/ui/parameters/parameter_painter_difficulty_level.dart';
+
 class ApplicationConfig {
-  static const String appTitle = 'Colors';
+  // known parameters
+  static const String parameterCodeDifficultyLevel = 'activity.difficultyLevel';
+  static const String parameterCodeBoardSize = 'activity.boardSize';
+  static const String parameterCodeColorsCount = 'activity.colorsCount';
+  static const String parameterCodeColorTheme = 'global.colorTheme';
+
+  // difficulty level values
+  static const String difficultyLevelValueEasy = 'easy';
+  static const String difficultyLevelValueMedium = 'medium';
+  static const String difficultyLevelValueHard = 'hard';
+  static const String difficultyLevelValueNightmare = 'nightmare';
+
+  // board size values
+  static const String boardSizeValueSmall = 'small';
+  static const String boardSizeValueMedium = 'medium';
+  static const String boardSizeValueLarge = 'large';
+  static const String boardSizeValueExtraLarge = 'extra';
+
+  // colors count values
+  static const String colorsCountValueLow = '5';
+  static const String colorsCountValueMedium = '6';
+  static const String colorsCountValueHigh = '7';
+  static const String colorsCountValueVeryHigh = '8';
+
+  // colors theme values
+  static const String colorThemeDefault = 'default';
+  static const String colorThemeSweethope = 'sweethope';
+  static const String colorThemeNostalgicDreams = 'nostalgic-dreams';
+  static const String colorThemeArjibi8 = 'arjibi8';
+
+  static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
+    appTitle: 'Colors',
+    activitySettings: [
+      // difficulty level
+      ApplicationSettingsParameter(
+        code: parameterCodeDifficultyLevel,
+        values: [
+          ApplicationSettingsParameterItemValue(
+            value: difficultyLevelValueEasy,
+            color: Colors.green,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: difficultyLevelValueMedium,
+            color: Colors.orange,
+            isDefault: true,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: difficultyLevelValueHard,
+            color: Colors.red,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: difficultyLevelValueNightmare,
+            color: Colors.purple,
+          ),
+        ],
+        customPainter: (context, value) {
+          return ParameterPainterDifficultyLevel(context: context, value: value);
+        },
+      ),
+
+      // board size
+      ApplicationSettingsParameter(
+        code: parameterCodeBoardSize,
+        values: [
+          ApplicationSettingsParameterItemValue(
+            value: boardSizeValueSmall,
+            color: Colors.green,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: boardSizeValueMedium,
+            color: Colors.orange,
+            isDefault: true,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: boardSizeValueLarge,
+            color: Colors.red,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: boardSizeValueExtraLarge,
+            color: Colors.purple,
+          ),
+        ],
+        customPainter: (context, value) {
+          return ParameterPainterBoardSize(value: value, context: context);
+        },
+        intValueGetter: (String value) {
+          const Map<String, int> intValues = {
+            boardSizeValueSmall: 6,
+            boardSizeValueMedium: 10,
+            boardSizeValueLarge: 14,
+            boardSizeValueExtraLarge: 20,
+          };
+          return intValues[value] ?? 0;
+        },
+      ),
+
+      // colors count
+      ApplicationSettingsParameter(
+        code: parameterCodeColorsCount,
+        values: [
+          ApplicationSettingsParameterItemValue(
+            value: colorsCountValueLow,
+            color: Colors.green,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: colorsCountValueMedium,
+            color: Colors.orange,
+            isDefault: true,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: colorsCountValueHigh,
+            color: Colors.red,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: colorsCountValueVeryHigh,
+            color: Colors.purple,
+          ),
+        ],
+        customPainter: (context, value) {
+          return ParameterPainterColorsCount(value: value, context: context);
+        },
+      ),
+
+      // colors theme
+      ApplicationSettingsParameter(
+        code: parameterCodeColorTheme,
+        displayedOnTop: false,
+        values: [
+          ApplicationSettingsParameterItemValue(
+            value: colorThemeDefault,
+            isDefault: true,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: colorThemeSweethope,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: colorThemeNostalgicDreams,
+          ),
+          ApplicationSettingsParameterItemValue(
+            value: colorThemeArjibi8,
+          ),
+        ],
+        customPainter: (context, value) {
+          return ParameterPainterColorTheme(value: value, context: context);
+        },
+      ),
+    ],
+    startNewActivity: (BuildContext context) {
+      BlocProvider.of<ActivityCubit>(context).startNewActivity(context);
+      BlocProvider.of<NavCubitPage>(context).goToPageGame();
+    },
+    deleteCurrentActivity: (BuildContext context) {
+      BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
+      BlocProvider.of<ActivityCubit>(context).state.currentActivity.dump();
+    },
+    resumeActivity: (BuildContext context) {
+      BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
+      BlocProvider.of<NavCubitPage>(context).goToPageGame();
+    },
+  );
+
+  static int getMovesCountLimitDeltaFromLevelCode(String parameterLevel) {
+    const Map<String, int> values = {
+      difficultyLevelValueEasy: 5,
+      difficultyLevelValueMedium: 3,
+      difficultyLevelValueHard: 1,
+      difficultyLevelValueNightmare: -1,
+    };
+    return values[parameterLevel] ??
+        getMovesCountLimitDeltaFromLevelCode(ApplicationConfig.config
+            .getFromCode(ApplicationConfig.parameterCodeDifficultyLevel)
+            .defaultValue);
+  }
 }
diff --git a/lib/config/color_theme.dart b/lib/config/color_theme.dart
index 73d2e37c974ac8b52a94839906e4f73e5246670e..af72b611ae089394cbce846b2910edfd5b901196 100644
--- a/lib/config/color_theme.dart
+++ b/lib/config/color_theme.dart
@@ -1,8 +1,8 @@
-import 'package:colors/config/default_global_settings.dart';
+import 'package:colors/config/application_config.dart';
 
 class ColorTheme {
-  static const Map<String, List<int>> borderColors = {
-    DefaultGlobalSettings.skinValueColors: [
+  static const Map<String, List<int>> colorThemes = {
+    ApplicationConfig.colorThemeDefault: [
       0xffffff,
       0xe63a3f,
       0x708cfd,
@@ -13,16 +13,46 @@ class ColorTheme {
       0x38ffff,
       0xf2739d,
     ],
+
+    // https://lospec.com/palette-list/sweethope
+    ApplicationConfig.colorThemeSweethope: [
+      0xffffff,
+      0x615e85,
+      0x9c8dc2,
+      0xd9a3cd,
+      0xebc3a7,
+      0xe0e0dc,
+      0xa3d1af,
+      0x90b4de,
+      0x717fb0,
+    ],
+
+    // https://lospec.com/palette-list/nostalgic-dreams
+    ApplicationConfig.colorThemeNostalgicDreams: [
+      0xffffff,
+      0xd9af80,
+      0xb07972,
+      0x524352,
+      0x686887,
+      0x7f9bb0,
+      0xbfd4b0,
+      0x90b870,
+      0x628c70,
+    ],
+
+    // https://lospec.com/palette-list/arjibi8
+    ApplicationConfig.colorThemeArjibi8: [
+      0xffffff,
+      0x8bc7bf,
+      0x5796a1,
+      0x524bb3,
+      0x471b6e,
+      0x702782,
+      0xb0455a,
+      0xde8b6f,
+      0xebd694,
+    ],
   };
-  static const int defaultBorderColor = 0x808080;
 
-  static int getColorCode(String skin, int value) {
-    if (borderColors.containsKey(skin) && null != borderColors[skin]) {
-      final List<int>? skinColors = borderColors[skin];
-      if (null != skinColors) {
-        return skinColors.elementAt(value) | 0xFF000000;
-      }
-    }
-    return defaultBorderColor | 0xFF000000;
-  }
+  static const int defaultThemeColor = 0x808080;
 }
diff --git a/lib/config/default_activity_settings.dart b/lib/config/default_activity_settings.dart
deleted file mode 100644
index cf379584f2db6f1a1348c4c4b67dd4828fbcb8d0..0000000000000000000000000000000000000000
--- a/lib/config/default_activity_settings.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-class DefaultActivitySettings {
-  // available game parameters codes
-  static const String parameterCodeDifficultyLevel = 'difficultyLevel';
-  static const String parameterCodeBoardSize = 'boardSize';
-  static const String parameterCodeColorsCount = 'colorsCount';
-  static const List<String> availableParameters = [
-    parameterCodeDifficultyLevel,
-    parameterCodeBoardSize,
-    parameterCodeColorsCount,
-  ];
-
-  // difficulty level: available values
-  static const String difficultyLevelValueEasy = 'easy';
-  static const String difficultyLevelValueMedium = 'medium';
-  static const String difficultyLevelValueHard = 'hard';
-  static const String difficultyLevelValueNightmare = 'nightmare';
-  static const List<String> allowedDifficultyLevelValues = [
-    difficultyLevelValueEasy,
-    difficultyLevelValueMedium,
-    difficultyLevelValueHard,
-    difficultyLevelValueNightmare,
-  ];
-  // difficulty level: default value
-  static const String defaultDifficultyLevelValue = difficultyLevelValueMedium;
-
-  // board size: available values
-  static const String boardSizeValueSmall = 'small';
-  static const String boardSizeValueMedium = 'medium';
-  static const String boardSizeValueLarge = 'large';
-  static const String boardSizeValueExtra = 'extra';
-  static const List<String> allowedBoardSizeValues = [
-    boardSizeValueSmall,
-    boardSizeValueMedium,
-    boardSizeValueLarge,
-    boardSizeValueExtra,
-  ];
-  // board size: default value
-  static const String defaultBoardSizeValue = boardSizeValueMedium;
-
-  // colors count: available values
-  static const String colorsCountValueLow = '5';
-  static const String colorsCountValueMedium = '6';
-  static const String colorsCountValueHigh = '7';
-  static const String colorsCountValueVeryHigh = '8';
-  static const List<String> allowedColorsCountValues = [
-    colorsCountValueLow,
-    colorsCountValueMedium,
-    colorsCountValueHigh,
-    colorsCountValueVeryHigh,
-  ];
-  // colors count: default value
-  static const String defaultColorsCountValue = colorsCountValueMedium;
-
-  // available values from parameter code
-  static List<String> getAvailableValues(String parameterCode) {
-    switch (parameterCode) {
-      case parameterCodeDifficultyLevel:
-        return DefaultActivitySettings.allowedDifficultyLevelValues;
-      case parameterCodeBoardSize:
-        return DefaultActivitySettings.allowedBoardSizeValues;
-      case parameterCodeColorsCount:
-        return DefaultActivitySettings.allowedColorsCountValues;
-    }
-
-    printlog('Did not find any available value for game parameter "$parameterCode".');
-    return [];
-  }
-
-  static int getMovesCountLimitDeltaFromLevelCode(String parameterLevel) {
-    const Map<String, int> values = {
-      difficultyLevelValueEasy: 5,
-      difficultyLevelValueMedium: 3,
-      difficultyLevelValueHard: 1,
-      difficultyLevelValueNightmare: -1,
-    };
-    return values[parameterLevel] ??
-        getMovesCountLimitDeltaFromLevelCode(
-            DefaultActivitySettings.defaultDifficultyLevelValue);
-  }
-}
diff --git a/lib/config/default_global_settings.dart b/lib/config/default_global_settings.dart
deleted file mode 100644
index 627a390175e188a5b4d672c8f74fe46633a3aaac..0000000000000000000000000000000000000000
--- a/lib/config/default_global_settings.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-class DefaultGlobalSettings {
-  // available global parameters codes
-  static const String parameterCodeSkin = 'skin';
-  static const List<String> availableParameters = [
-    parameterCodeSkin,
-  ];
-
-  // skin: available values
-  static const String skinValueColors = 'colors';
-  static const List<String> allowedSkinValues = [
-    skinValueColors,
-  ];
-  // skin: default value
-  static const String defaultSkinValue = skinValueColors;
-
-  // available values from parameter code
-  static List<String> getAvailableValues(String parameterCode) {
-    switch (parameterCode) {
-      case parameterCodeSkin:
-        return DefaultGlobalSettings.allowedSkinValues;
-    }
-
-    printlog('Did not find any available value for global parameter "$parameterCode".');
-    return [];
-  }
-}
diff --git a/lib/cubit/activity/activity_cubit.dart b/lib/cubit/activity/activity_cubit.dart
index 255740148da56f4e15e40b783242ff3d3c4ac88e..a0196af8666cd35cefebc855460a8eb875d002e6 100644
--- a/lib/cubit/activity/activity_cubit.dart
+++ b/lib/cubit/activity/activity_cubit.dart
@@ -1,13 +1,10 @@
 import 'dart:async';
 import 'dart:math';
 
-import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
 import 'package:colors/models/activity/activity.dart';
-import 'package:colors/models/settings/settings_activity.dart';
-import 'package:colors/models/settings/settings_global.dart';
 
 part 'activity_state.dart';
 
@@ -27,7 +24,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
     final Activity activity = Activity(
       // Settings
       activitySettings: state.currentActivity.activitySettings,
-      globalSettings: state.currentActivity.globalSettings,
       // State
       isRunning: state.currentActivity.isRunning,
       isStarted: state.currentActivity.isStarted,
@@ -43,19 +39,18 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
       progressDelta: state.currentActivity.progressDelta,
       gameWon: state.currentActivity.gameWon,
     );
-    // game.dump();
+    // activity.dump();
 
     updateState(activity);
   }
 
-  void startNewActivity({
-    required ActivitySettings activitySettings,
-    required GlobalSettings globalSettings,
-  }) {
+  void startNewActivity(BuildContext context) {
+    final ActivitySettingsCubit activitySettingsCubit =
+        BlocProvider.of<ActivitySettingsCubit>(context);
+
     final Activity newActivity = Activity.createNew(
       // Settings
-      activitySettings: activitySettings,
-      globalSettings: globalSettings,
+      activitySettings: activitySettingsCubit.state.settings,
     );
 
     newActivity.dump();
@@ -66,6 +61,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
     refresh();
   }
 
+  bool canBeResumed() {
+    return state.currentActivity.canBeResumed;
+  }
+
   void quitActivity() {
     state.currentActivity.isRunning = false;
     refresh();
@@ -77,8 +76,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
   }
 
   void deleteSavedActivity() {
-    state.currentActivity.isRunning = false;
-    state.currentActivity.isFinished = true;
+    updateGameIsRunning(false);
+    updateGameIsFinished(true);
     refresh();
   }
 
diff --git a/lib/cubit/settings/settings_activity_cubit.dart b/lib/cubit/settings/settings_activity_cubit.dart
deleted file mode 100644
index 962a5ffde3178b4cc4d58336994a3fa2de7e96d1..0000000000000000000000000000000000000000
--- a/lib/cubit/settings/settings_activity_cubit.dart
+++ /dev/null
@@ -1,86 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:colors/config/default_activity_settings.dart';
-import 'package:colors/models/settings/settings_activity.dart';
-
-part 'settings_activity_state.dart';
-
-class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
-  ActivitySettingsCubit()
-      : super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
-
-  void setValues({
-    String? difficultyLevel,
-    String? boardSize,
-    String? colorsCount,
-  }) {
-    emit(
-      ActivitySettingsState(
-        settings: ActivitySettings(
-          difficultyLevel: difficultyLevel ?? state.settings.difficultyLevel,
-          parameterSize: boardSize ?? state.settings.parameterSize,
-          parameterColorsCount: colorsCount ?? state.settings.parameterColorsCount,
-        ),
-      ),
-    );
-  }
-
-  String getParameterValue(String code) {
-    switch (code) {
-      case DefaultActivitySettings.parameterCodeDifficultyLevel:
-        return ActivitySettings.getLevelValueFromUnsafe(state.settings.difficultyLevel);
-      case DefaultActivitySettings.parameterCodeBoardSize:
-        return ActivitySettings.getSizeValueFromUnsafe(state.settings.parameterSize);
-      case DefaultActivitySettings.parameterCodeColorsCount:
-        return ActivitySettings.getColorsValueFromUnsafe(state.settings.parameterColorsCount);
-    }
-
-    return '';
-  }
-
-  void setParameterValue(String code, String value) {
-    final String difficultyLevel =
-        (code == DefaultActivitySettings.parameterCodeDifficultyLevel)
-            ? value
-            : getParameterValue(DefaultActivitySettings.parameterCodeDifficultyLevel);
-    final String boardSize = (code == DefaultActivitySettings.parameterCodeBoardSize)
-        ? value
-        : getParameterValue(DefaultActivitySettings.parameterCodeBoardSize);
-    final String colorsCount = (code == DefaultActivitySettings.parameterCodeColorsCount)
-        ? value
-        : getParameterValue(DefaultActivitySettings.parameterCodeColorsCount);
-
-    setValues(
-      difficultyLevel: difficultyLevel,
-      boardSize: boardSize,
-      colorsCount: colorsCount,
-    );
-  }
-
-  @override
-  ActivitySettingsState? fromJson(Map<String, dynamic> json) {
-    final String difficultyLevel =
-        json[DefaultActivitySettings.parameterCodeDifficultyLevel] as String;
-    final String boardSize = json[DefaultActivitySettings.parameterCodeBoardSize] as String;
-    final String colorsCount =
-        json[DefaultActivitySettings.parameterCodeColorsCount] as String;
-
-    return ActivitySettingsState(
-      settings: ActivitySettings(
-        difficultyLevel: difficultyLevel,
-        parameterSize: boardSize,
-        parameterColorsCount: colorsCount,
-      ),
-    );
-  }
-
-  @override
-  Map<String, dynamic>? toJson(ActivitySettingsState state) {
-    return <String, dynamic>{
-      DefaultActivitySettings.parameterCodeDifficultyLevel: state.settings.difficultyLevel,
-      DefaultActivitySettings.parameterCodeBoardSize: state.settings.parameterSize,
-      DefaultActivitySettings.parameterCodeColorsCount: state.settings.parameterColorsCount,
-    };
-  }
-}
diff --git a/lib/cubit/settings/settings_activity_state.dart b/lib/cubit/settings/settings_activity_state.dart
deleted file mode 100644
index 2b2de42011634e81ae9e6f8bcaa1577f239c778b..0000000000000000000000000000000000000000
--- a/lib/cubit/settings/settings_activity_state.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-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/settings_global_cubit.dart b/lib/cubit/settings/settings_global_cubit.dart
deleted file mode 100644
index f9213070bd6b204c7b70fb3b1dd2161e806342c5..0000000000000000000000000000000000000000
--- a/lib/cubit/settings/settings_global_cubit.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:colors/config/default_global_settings.dart';
-import 'package:colors/models/settings/settings_global.dart';
-
-part 'settings_global_state.dart';
-
-class GlobalSettingsCubit extends HydratedCubit<GlobalSettingsState> {
-  GlobalSettingsCubit() : super(GlobalSettingsState(settings: GlobalSettings.createDefault()));
-
-  void setValues({
-    String? skin,
-  }) {
-    emit(
-      GlobalSettingsState(
-        settings: GlobalSettings(
-          skin: skin ?? state.settings.skin,
-        ),
-      ),
-    );
-  }
-
-  String getParameterValue(String code) {
-    switch (code) {
-      case DefaultGlobalSettings.parameterCodeSkin:
-        return GlobalSettings.getSkinValueFromUnsafe(state.settings.skin);
-    }
-    return '';
-  }
-
-  void setParameterValue(String code, String value) {
-    final String skin = (code == DefaultGlobalSettings.parameterCodeSkin)
-        ? value
-        : getParameterValue(DefaultGlobalSettings.parameterCodeSkin);
-
-    setValues(
-      skin: skin,
-    );
-  }
-
-  @override
-  GlobalSettingsState? fromJson(Map<String, dynamic> json) {
-    final String skin = json[DefaultGlobalSettings.parameterCodeSkin] as String;
-
-    return GlobalSettingsState(
-      settings: GlobalSettings(
-        skin: skin,
-      ),
-    );
-  }
-
-  @override
-  Map<String, dynamic>? toJson(GlobalSettingsState state) {
-    return <String, dynamic>{
-      DefaultGlobalSettings.parameterCodeSkin: state.settings.skin,
-    };
-  }
-}
diff --git a/lib/cubit/settings/settings_global_state.dart b/lib/cubit/settings/settings_global_state.dart
deleted file mode 100644
index ebcddd700f252257223ca8e16c85202b04f3ff24..0000000000000000000000000000000000000000
--- a/lib/cubit/settings/settings_global_state.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-part of 'settings_global_cubit.dart';
-
-@immutable
-class GlobalSettingsState extends Equatable {
-  const GlobalSettingsState({
-    required this.settings,
-  });
-
-  final GlobalSettings settings;
-
-  @override
-  List<dynamic> get props => <dynamic>[
-        settings,
-      ];
-}
diff --git a/lib/main.dart b/lib/main.dart
index 986e6162dcd20df4295a71399d87cb11a8177220..e460990941e93b165b45b30a0a373c395e82d3ae 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -9,8 +9,6 @@ import 'package:colors/common/cubit/nav/nav_cubit_screens.dart';
 
 import 'package:colors/config/application_config.dart';
 import 'package:colors/cubit/activity/activity_cubit.dart';
-import 'package:colors/cubit/settings/settings_activity_cubit.dart';
-import 'package:colors/cubit/settings/settings_global_cubit.dart';
 import 'package:colors/ui/skeleton.dart';
 
 void main() async {
@@ -61,17 +59,14 @@ class MyApp extends StatelessWidget {
         BlocProvider<ActivityCubit>(
           create: (context) => ActivityCubit(),
         ),
-        BlocProvider<GlobalSettingsCubit>(
-          create: (context) => GlobalSettingsCubit(),
-        ),
         BlocProvider<ActivitySettingsCubit>(
-          create: (context) => ActivitySettingsCubit(),
+          create: (context) => ActivitySettingsCubit(appConfig: ApplicationConfig.config),
         ),
       ],
       child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
         builder: (BuildContext context, ApplicationThemeModeState state) {
           return MaterialApp(
-            title: ApplicationConfig.appTitle,
+            title: ApplicationConfig.config.appTitle,
             home: const SkeletonScreen(),
 
             // Theme stuff
diff --git a/lib/models/activity/activity.dart b/lib/models/activity/activity.dart
index 4cac48753a6e0b3b9ebe3b2445c5f32fa8f9dc21..14e5b36afc381e2bf4818d8c0adc44fedc6691bc 100644
--- a/lib/models/activity/activity.dart
+++ b/lib/models/activity/activity.dart
@@ -1,15 +1,12 @@
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:colors/config/default_activity_settings.dart';
+import 'package:colors/config/application_config.dart';
 import 'package:colors/models/activity/board.dart';
-import 'package:colors/models/settings/settings_activity.dart';
-import 'package:colors/models/settings/settings_global.dart';
 
 class Activity {
   Activity({
     // Settings
     required this.activitySettings,
-    required this.globalSettings,
 
     // State
     this.isRunning = false,
@@ -31,7 +28,6 @@ class Activity {
 
   // Settings
   final ActivitySettings activitySettings;
-  final GlobalSettings globalSettings;
 
   // State
   bool isRunning;
@@ -53,8 +49,7 @@ class Activity {
   factory Activity.createEmpty() {
     return Activity(
       // Settings
-      activitySettings: ActivitySettings.createDefault(),
-      globalSettings: GlobalSettings.createDefault(),
+      activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
       // Base data
       board: Board.createEmpty(),
     );
@@ -62,30 +57,30 @@ class Activity {
 
   factory Activity.createNew({
     ActivitySettings? activitySettings,
-    GlobalSettings? globalSettings,
   }) {
-    final ActivitySettings newActivitySettings =
-        activitySettings ?? ActivitySettings.createDefault();
-    final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
-
-    final int baseMaxMovesCount =
-        (30 * (newActivitySettings.boardSize * newActivitySettings.colorsCount) / (17 * 6))
-            .round();
+    final ActivitySettings newActivitySettings = activitySettings ??
+        ActivitySettings.createDefault(appConfig: ApplicationConfig.config);
+
+    final int baseMaxMovesCount = (30 *
+            (newActivitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize) *
+                newActivitySettings.getAsInt(ApplicationConfig.parameterCodeColorsCount)) /
+            (17 * 6))
+        .round();
     final int deltaMovesCountFromLevel =
-        DefaultActivitySettings.getMovesCountLimitDeltaFromLevelCode(
-            newActivitySettings.difficultyLevel);
+        ApplicationConfig.getMovesCountLimitDeltaFromLevelCode(
+            newActivitySettings.get(ApplicationConfig.parameterCodeDifficultyLevel));
 
     return Activity(
       // Settings
       activitySettings: newActivitySettings,
-      globalSettings: newGlobalSettings,
       // State
       isRunning: true,
       // Base data
       board: Board.createRandom(newActivitySettings),
       // Game data
       progress: 1,
-      progressTotal: newActivitySettings.boardSize * newActivitySettings.boardSize,
+      progressTotal: newActivitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize) *
+          newActivitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize),
       maxMovesCount: baseMaxMovesCount + deltaMovesCountFromLevel,
     );
   }
@@ -96,15 +91,14 @@ class Activity {
     printlog('');
     printlog('## Current game dump:');
     printlog('');
-    printlog('$Activity:');
-    printlog('  Settings');
     activitySettings.dump();
-    globalSettings.dump();
+    printlog('$Activity:');
     printlog('  State');
     printlog('    isRunning: $isRunning');
     printlog('    isStarted: $isStarted');
     printlog('    isFinished: $isFinished');
     printlog('    animationInProgress: $animationInProgress');
+    printlog('    canBeResumed: $canBeResumed');
     printlog('  Base data');
     board.dump();
     printlog('  Game data');
@@ -113,6 +107,7 @@ class Activity {
     printlog('    progress: $progress');
     printlog('    progressTotal: $progressTotal');
     printlog('    progressDelta: $progressDelta');
+    printlog('    canBeResumed: $canBeResumed');
     printlog('    gameWon: $gameWon');
     printlog('');
   }
@@ -126,7 +121,6 @@ class Activity {
     return <String, dynamic>{
       // Settings
       'activitySettings': activitySettings.toJson(),
-      'globalSettings': globalSettings.toJson(),
       // State
       'isRunning': isRunning,
       'isStarted': isStarted,
diff --git a/lib/models/activity/board.dart b/lib/models/activity/board.dart
index 2b75738bf4d1d0f645d655b04ac0d4254f6ee19f..374e9a3aec6e7c8c5647934a037285328fe2e4ce 100644
--- a/lib/models/activity/board.dart
+++ b/lib/models/activity/board.dart
@@ -2,8 +2,8 @@ import 'dart:math';
 
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
+import 'package:colors/config/application_config.dart';
 import 'package:colors/models/activity/cell.dart';
-import 'package:colors/models/settings/settings_activity.dart';
 
 typedef BoardCells = List<List<Cell>>;
 
@@ -19,8 +19,10 @@ class Board {
   }
 
   factory Board.createRandom(ActivitySettings activitySettings) {
-    final int boardSizeHorizontal = activitySettings.boardSize;
-    final int boardSizeVertical = activitySettings.boardSize;
+    final int boardSizeHorizontal =
+        activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
+    final int boardSizeVertical =
+        activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
 
     final rand = Random();
 
@@ -28,7 +30,9 @@ class Board {
     for (int rowIndex = 0; rowIndex < boardSizeVertical; rowIndex++) {
       List<Cell> row = [];
       for (int colIndex = 0; colIndex < boardSizeHorizontal; colIndex++) {
-        final int value = 1 + rand.nextInt(activitySettings.colorsCount);
+        final int value = 1 +
+            rand.nextInt(
+                activitySettings.getAsInt(ApplicationConfig.parameterCodeColorsCount));
         row.add(Cell(value));
       }
       cells.add(row);
diff --git a/lib/models/settings/settings_activity.dart b/lib/models/settings/settings_activity.dart
deleted file mode 100644
index ca18387f024459935cedd7f833d2d5caf6bd1ceb..0000000000000000000000000000000000000000
--- a/lib/models/settings/settings_activity.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:colors/config/default_activity_settings.dart';
-
-class ActivitySettings {
-  String difficultyLevel;
-  String parameterSize;
-  String parameterColorsCount;
-
-  ActivitySettings({
-    required this.difficultyLevel,
-    required this.parameterSize,
-    required this.parameterColorsCount,
-  });
-
-  static String getLevelValueFromUnsafe(String level) {
-    if (DefaultActivitySettings.allowedDifficultyLevelValues.contains(level)) {
-      return level;
-    }
-
-    return DefaultActivitySettings.defaultDifficultyLevelValue;
-  }
-
-  static String getSizeValueFromUnsafe(String size) {
-    if (DefaultActivitySettings.allowedBoardSizeValues.contains(size)) {
-      return size;
-    }
-
-    return DefaultActivitySettings.defaultBoardSizeValue;
-  }
-
-  static String getColorsValueFromUnsafe(String colors) {
-    if (DefaultActivitySettings.allowedColorsCountValues.contains(colors)) {
-      return colors;
-    }
-
-    return DefaultActivitySettings.defaultColorsCountValue;
-  }
-
-  factory ActivitySettings.createDefault() {
-    return ActivitySettings(
-      difficultyLevel: DefaultActivitySettings.defaultDifficultyLevelValue,
-      parameterSize: DefaultActivitySettings.defaultBoardSizeValue,
-      parameterColorsCount: DefaultActivitySettings.defaultColorsCountValue,
-    );
-  }
-
-  int getBoardSizeFromParameter(String parameterSize) {
-    const Map<String, int> values = {
-      DefaultActivitySettings.boardSizeValueSmall: 6,
-      DefaultActivitySettings.boardSizeValueMedium: 10,
-      DefaultActivitySettings.boardSizeValueLarge: 14,
-      DefaultActivitySettings.boardSizeValueExtra: 20,
-    };
-    return values[parameterSize] ??
-        getBoardSizeFromParameter(DefaultActivitySettings.defaultBoardSizeValue);
-  }
-
-  int get boardSize => getBoardSizeFromParameter(parameterSize);
-  int get colorsCount => int.parse(parameterColorsCount);
-
-  void dump() {
-    printlog('$ActivitySettings:');
-    printlog('  ${DefaultActivitySettings.parameterCodeDifficultyLevel}: $difficultyLevel');
-    printlog('  ${DefaultActivitySettings.parameterCodeBoardSize}: $parameterSize');
-    printlog('  ${DefaultActivitySettings.parameterCodeColorsCount}: $parameterColorsCount');
-    printlog('');
-  }
-
-  @override
-  String toString() {
-    return '$ActivitySettings(${toJson()})';
-  }
-
-  Map<String, dynamic>? toJson() {
-    return <String, dynamic>{
-      DefaultActivitySettings.parameterCodeDifficultyLevel: difficultyLevel,
-      DefaultActivitySettings.parameterCodeBoardSize: parameterSize,
-      DefaultActivitySettings.parameterCodeColorsCount: parameterColorsCount,
-    };
-  }
-}
diff --git a/lib/models/settings/settings_global.dart b/lib/models/settings/settings_global.dart
deleted file mode 100644
index 37a4a8ca6e34b17464a456a620df8934e0b1c877..0000000000000000000000000000000000000000
--- a/lib/models/settings/settings_global.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:colors/config/default_global_settings.dart';
-
-class GlobalSettings {
-  String skin;
-
-  GlobalSettings({
-    required this.skin,
-  });
-
-  static String getSkinValueFromUnsafe(String skin) {
-    if (DefaultGlobalSettings.allowedSkinValues.contains(skin)) {
-      return skin;
-    }
-
-    return DefaultGlobalSettings.defaultSkinValue;
-  }
-
-  factory GlobalSettings.createDefault() {
-    return GlobalSettings(
-      skin: DefaultGlobalSettings.defaultSkinValue,
-    );
-  }
-
-  void dump() {
-    printlog('$GlobalSettings: ');
-    printlog('  ${DefaultGlobalSettings.parameterCodeSkin}: $skin');
-    printlog('');
-  }
-
-  @override
-  String toString() {
-    return '$GlobalSettings(${toJson()})';
-  }
-
-  Map<String, dynamic>? toJson() {
-    return <String, dynamic>{
-      DefaultGlobalSettings.parameterCodeSkin: skin,
-    };
-  }
-}
diff --git a/lib/common/ui/pages/game.dart b/lib/ui/pages/game.dart
similarity index 100%
rename from lib/common/ui/pages/game.dart
rename to lib/ui/pages/game.dart
diff --git a/lib/ui/painters/board_painter.dart b/lib/ui/painters/board_painter.dart
index 1dfcfc8b9bfaa7de0707bad634e405a35fb955bb..16e0b4ed4973e3555c066b844c23233d89bf7ceb 100644
--- a/lib/ui/painters/board_painter.dart
+++ b/lib/ui/painters/board_painter.dart
@@ -1,6 +1,8 @@
 import 'package:flutter/material.dart';
 
-import 'package:colors/config/color_theme.dart';
+import 'package:colors/common/utils/color_theme_utils.dart';
+
+import 'package:colors/config/application_config.dart';
 import 'package:colors/models/activity/board.dart';
 import 'package:colors/models/activity/cell.dart';
 import 'package:colors/models/activity/activity.dart';
@@ -16,7 +18,8 @@ class BoardPainter extends CustomPainter {
 
   @override
   void paint(Canvas canvas, Size size) {
-    final int boardSize = activity.activitySettings.boardSize;
+    final int boardSize =
+        activity.activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
     final BoardCells cells = activity.board.cells;
     final double cellSize = size.width / boardSize;
     const double borderSize = 3;
@@ -29,7 +32,8 @@ class BoardPainter extends CustomPainter {
 
         final Cell cell = cells[row][col];
         final int cellValue = cell.value;
-        final int colorCode = ColorTheme.getColorCode(activity.globalSettings.skin, cellValue);
+        final int colorCode = ColorThemeUtils.getColorCode(cellValue,
+            activity.activitySettings.get(ApplicationConfig.parameterCodeColorTheme));
 
         final cellPaintBackground = Paint();
         cellPaintBackground.color = Color(colorCode);
diff --git a/lib/ui/parameters/parameter_painter_board_size.dart b/lib/ui/parameters/parameter_painter_board_size.dart
new file mode 100644
index 0000000000000000000000000000000000000000..d953e34d4e6a34b0eb0fc088a32a0a1ae631e1c3
--- /dev/null
+++ b/lib/ui/parameters/parameter_painter_board_size.dart
@@ -0,0 +1,80 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:colors/common/utils/color_theme_utils.dart';
+import 'package:colors/config/application_config.dart';
+
+class ParameterPainterBoardSize extends CustomPainter {
+  const ParameterPainterBoardSize({
+    required this.context,
+    required this.value,
+  });
+
+  final BuildContext context;
+  final String value;
+
+  @override
+  void paint(Canvas canvas, Size size) {
+    // force square
+    final double canvasSize = min(size.width, size.height);
+
+    final ActivitySettings activitySettings =
+        BlocProvider.of<ActivitySettingsCubit>(context).state.settings;
+
+    int gridWidth = 1;
+
+    switch (value) {
+      case ApplicationConfig.boardSizeValueSmall:
+        gridWidth = 2;
+        break;
+      case ApplicationConfig.boardSizeValueMedium:
+        gridWidth = 3;
+        break;
+      case ApplicationConfig.boardSizeValueLarge:
+        gridWidth = 4;
+        break;
+      case ApplicationConfig.boardSizeValueExtraLarge:
+        gridWidth = 5;
+        break;
+      default:
+        printlog('Wrong value for boardSize parameter value: $value');
+    }
+
+    final paint = Paint();
+    paint.strokeJoin = StrokeJoin.round;
+    paint.strokeWidth = 3 / 100 * canvasSize;
+
+    // Mini grid
+    final borderColor = Colors.grey.shade800;
+
+    final double cellSize = canvasSize / 7;
+    final double origin = (canvasSize - gridWidth * cellSize) / 2;
+
+    final String colorTheme = activitySettings.get(ApplicationConfig.parameterCodeColorTheme);
+
+    for (int row = 0; row < gridWidth; row++) {
+      for (int col = 0; col < gridWidth; col++) {
+        final Offset topLeft = Offset(origin + col * cellSize, origin + row * cellSize);
+        final Offset bottomRight = topLeft + Offset(cellSize, cellSize);
+
+        final squareColor =
+            Color(ColorThemeUtils.getColorCode(col + row * gridWidth, colorTheme));
+
+        paint.color = squareColor;
+        paint.style = PaintingStyle.fill;
+        canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
+
+        paint.color = borderColor;
+        paint.style = PaintingStyle.stroke;
+        canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
+      }
+    }
+  }
+
+  @override
+  bool shouldRepaint(CustomPainter oldDelegate) {
+    return false;
+  }
+}
diff --git a/lib/ui/parameters/parameter_painter_color_theme.dart b/lib/ui/parameters/parameter_painter_color_theme.dart
new file mode 100644
index 0000000000000000000000000000000000000000..5f6ddbe40ec9d62228edf00e8a0c52a0ec75b8c2
--- /dev/null
+++ b/lib/ui/parameters/parameter_painter_color_theme.dart
@@ -0,0 +1,55 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+
+import 'package:colors/common/utils/color_theme_utils.dart';
+
+class ParameterPainterColorTheme extends CustomPainter {
+  const ParameterPainterColorTheme({
+    required this.context,
+    required this.value,
+  });
+
+  final BuildContext context;
+  final String value;
+
+  @override
+  void paint(Canvas canvas, Size size) {
+    // force square
+    final double canvasSize = min(size.width, size.height);
+
+    const int gridWidth = 4;
+
+    final paint = Paint();
+    paint.strokeJoin = StrokeJoin.round;
+    paint.strokeWidth = 3 / 100 * canvasSize;
+
+    // Mini grid
+    final borderColor = Colors.grey.shade800;
+
+    final double cellSize = canvasSize / gridWidth;
+    final double origin = (canvasSize - gridWidth * cellSize) / 2;
+
+    for (int row = 0; row < gridWidth; row++) {
+      for (int col = 0; col < gridWidth; col++) {
+        final Offset topLeft = Offset(origin + col * cellSize, origin + row * cellSize);
+        final Offset bottomRight = topLeft + Offset(cellSize, cellSize);
+
+        final squareColor = Color(ColorThemeUtils.getColorCode(col + row * gridWidth, value));
+
+        paint.color = squareColor;
+        paint.style = PaintingStyle.fill;
+        canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
+
+        paint.color = borderColor;
+        paint.style = PaintingStyle.stroke;
+        canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
+      }
+    }
+  }
+
+  @override
+  bool shouldRepaint(CustomPainter oldDelegate) {
+    return false;
+  }
+}
diff --git a/lib/ui/parameters/parameter_painter_colors_count.dart b/lib/ui/parameters/parameter_painter_colors_count.dart
new file mode 100644
index 0000000000000000000000000000000000000000..e8b296b5f0b452e45d92e0ff36250be4242f6c08
--- /dev/null
+++ b/lib/ui/parameters/parameter_painter_colors_count.dart
@@ -0,0 +1,96 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:colors/common/utils/color_theme_utils.dart';
+import 'package:colors/config/application_config.dart';
+
+class ParameterPainterColorsCount extends CustomPainter {
+  const ParameterPainterColorsCount({
+    required this.context,
+    required this.value,
+  });
+
+  final BuildContext context;
+  final String value;
+
+  @override
+  void paint(Canvas canvas, Size size) {
+    // force square
+    final double canvasSize = min(size.width, size.height);
+
+    final ActivitySettings activitySettings =
+        BlocProvider.of<ActivitySettingsCubit>(context).state.settings;
+
+    final paint = Paint();
+    paint.strokeJoin = StrokeJoin.round;
+    paint.strokeWidth = 3;
+
+    // Colors preview
+    const List<Offset> positions = [
+      Offset(0, 0),
+      Offset(1, 0),
+      Offset(2, 0),
+      Offset(2, 1),
+      Offset(2, 2),
+      Offset(1, 2),
+      Offset(0, 2),
+      Offset(0, 1),
+    ];
+
+    final double padding = 4 / 100 * canvasSize;
+    final double margin = 3 / 100 * canvasSize;
+    final double width = ((canvasSize - 2 * padding) / 3) - 2 * margin;
+
+    final colorsCount = int.parse(value);
+
+    for (int colorIndex = 0; colorIndex < colorsCount; colorIndex++) {
+      final Offset position = positions[colorIndex];
+
+      final Offset topLeft = Offset(padding + margin + position.dx * (width + 2 * margin),
+          padding + margin + position.dy * (width + 2 * margin));
+
+      final Offset bottomRight = topLeft + Offset(width, width);
+
+      final squareColor = Color(ColorThemeUtils.getColorCode(
+          colorIndex, activitySettings.get(ApplicationConfig.parameterCodeColorTheme)));
+      paint.color = squareColor;
+      paint.style = PaintingStyle.fill;
+      canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
+
+      final borderColor = squareColor.darken(20);
+      paint.color = borderColor;
+      paint.style = PaintingStyle.stroke;
+      canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
+    }
+
+    // centered text value
+    final textSpan = TextSpan(
+      text: value.toString(),
+      style: TextStyle(
+        color: Colors.black,
+        fontSize: canvasSize / 4,
+        fontWeight: FontWeight.bold,
+      ),
+    );
+    final textPainter = TextPainter(
+      text: textSpan,
+      textDirection: TextDirection.ltr,
+      textAlign: TextAlign.center,
+    );
+    textPainter.layout();
+    textPainter.paint(
+      canvas,
+      Offset(
+        (canvasSize - textPainter.width) * 0.5,
+        (canvasSize - textPainter.height) * 0.5,
+      ),
+    );
+  }
+
+  @override
+  bool shouldRepaint(CustomPainter oldDelegate) {
+    return false;
+  }
+}
diff --git a/lib/ui/parameters/parameter_painter_difficulty_level.dart b/lib/ui/parameters/parameter_painter_difficulty_level.dart
new file mode 100644
index 0000000000000000000000000000000000000000..70625baababbbde3a35ec0c3fb61c3943ada2c84
--- /dev/null
+++ b/lib/ui/parameters/parameter_painter_difficulty_level.dart
@@ -0,0 +1,82 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
+import 'package:colors/config/application_config.dart';
+
+class ParameterPainterDifficultyLevel extends CustomPainter {
+  const ParameterPainterDifficultyLevel({
+    required this.context,
+    required this.value,
+  });
+
+  final BuildContext context;
+  final String value;
+
+  @override
+  void paint(Canvas canvas, Size size) {
+    // force square
+    final double canvasSize = min(size.width, size.height);
+
+    final List<dynamic> stars = [];
+
+    switch (value) {
+      case ApplicationConfig.difficultyLevelValueEasy:
+        stars.add([0.5, 0.5]);
+        break;
+      case ApplicationConfig.difficultyLevelValueMedium:
+        stars.add([0.3, 0.5]);
+        stars.add([0.7, 0.5]);
+        break;
+      case ApplicationConfig.difficultyLevelValueHard:
+        stars.add([0.3, 0.3]);
+        stars.add([0.7, 0.3]);
+        stars.add([0.5, 0.7]);
+        break;
+      case ApplicationConfig.difficultyLevelValueNightmare:
+        stars.add([0.3, 0.3]);
+        stars.add([0.7, 0.3]);
+        stars.add([0.3, 0.7]);
+        stars.add([0.7, 0.7]);
+        break;
+      default:
+        printlog('Wrong value for level parameter value: $value');
+    }
+
+    final paint = Paint();
+    paint.strokeJoin = StrokeJoin.round;
+    paint.strokeWidth = 3 / 100 * canvasSize;
+
+    // Stars
+    final textSpan = TextSpan(
+      text: '⭐',
+      style: TextStyle(
+        color: Colors.black,
+        fontSize: canvasSize / 3,
+        fontWeight: FontWeight.bold,
+      ),
+    );
+    final textPainter = TextPainter(
+      text: textSpan,
+      textDirection: TextDirection.ltr,
+      textAlign: TextAlign.center,
+    );
+    textPainter.layout();
+
+    for (var center in stars) {
+      textPainter.paint(
+        canvas,
+        Offset(
+          canvasSize * center[0] - textPainter.width * 0.5,
+          canvasSize * center[1] - textPainter.height * 0.5,
+        ),
+      );
+    }
+  }
+
+  @override
+  bool shouldRepaint(CustomPainter oldDelegate) {
+    return false;
+  }
+}
diff --git a/lib/ui/widgets/game/cell.dart b/lib/ui/widgets/game/cell.dart
index 1a7525baacd58c8d45eb9dd582a1d8fd46c804f5..d2997eb93ae9dfb0d8b089c5f99247b1b7cd6805 100644
--- a/lib/ui/widgets/game/cell.dart
+++ b/lib/ui/widgets/game/cell.dart
@@ -1,7 +1,9 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:colors/config/color_theme.dart';
+import 'package:colors/common/utils/color_theme_utils.dart';
+
+import 'package:colors/config/application_config.dart';
 import 'package:colors/cubit/activity/activity_cubit.dart';
 import 'package:colors/models/activity/cell.dart';
 import 'package:colors/models/activity/activity.dart';
@@ -24,8 +26,9 @@ class CellWidget extends StatelessWidget {
 
         final ColorScheme colorScheme = Theme.of(context).colorScheme;
 
-        final String skin = currentActivity.globalSettings.skin;
-        final squareColor = Color(ColorTheme.getColorCode(skin, cell.value));
+        final String colorTheme =
+            currentActivity.activitySettings.get(ApplicationConfig.parameterCodeColorTheme);
+        final squareColor = Color(ColorThemeUtils.getColorCode(cell.value, colorTheme));
 
         return Container(
           decoration: BoxDecoration(
diff --git a/lib/ui/widgets/game/game_board.dart b/lib/ui/widgets/game/game_board.dart
index 87d989127dc21bd81c91a62449b48df5276cc820..ed18a7770bbf1c3a72272622e673b473c5226090 100644
--- a/lib/ui/widgets/game/game_board.dart
+++ b/lib/ui/widgets/game/game_board.dart
@@ -1,3 +1,4 @@
+import 'package:colors/config/application_config.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
@@ -19,7 +20,8 @@ class GameBoardWidget extends StatelessWidget {
           onTapUp: (details) {
             final double xTap = details.localPosition.dx;
             final double yTap = details.localPosition.dy;
-            final int boardSize = currentActivity.activitySettings.boardSize;
+            final int boardSize = currentActivity.activitySettings
+                .getAsInt(ApplicationConfig.parameterCodeBoardSize);
             final int col = xTap ~/ (boardWidth / boardSize);
             final int row = yTap ~/ (boardWidth / boardSize);
             final int cellValue = currentActivity.board.getCellValue(col, row);
diff --git a/lib/ui/widgets/game/select_color_bar.dart b/lib/ui/widgets/game/select_color_bar.dart
index 5020f0beaf02e9cc6a1d066426e25a0837eec577..3792b87ea73a17a96ecbd6f6451325e665bc5385 100644
--- a/lib/ui/widgets/game/select_color_bar.dart
+++ b/lib/ui/widgets/game/select_color_bar.dart
@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
+import 'package:colors/config/application_config.dart';
 import 'package:colors/cubit/activity/activity_cubit.dart';
 import 'package:colors/models/activity/cell.dart';
 import 'package:colors/models/activity/activity.dart';
@@ -15,7 +16,8 @@ class SelectColorBar extends StatelessWidget {
       builder: (BuildContext context, ActivityState activityState) {
         final Activity currentActivity = activityState.currentActivity;
 
-        final int colorsCount = currentActivity.activitySettings.colorsCount;
+        final int colorsCount = currentActivity.activitySettings
+            .getAsInt(ApplicationConfig.parameterCodeColorsCount);
         final double blockWidth = MediaQuery.of(context).size.width;
         final double itemWidth = blockWidth / colorsCount;
 
diff --git a/pubspec.lock b/pubspec.lock
index 1896dfc3582bc30a9743cfeb6b5a0e3e3b46fcd3..0d7744cbc920c4c2cb00c639e11ef7197325b30e 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -122,11 +122,11 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: "0.4.0"
-      resolved-ref: eb9c090bd00d73324eab8737f74b3339cc24c9e8
+      ref: "0.5.0"
+      resolved-ref: b8164a50489ba981ea57d9f02e2334f09cb8c6a7
       url: "https://git.harrault.fr/android/flutter-toolbox.git"
     source: git
-    version: "0.4.0"
+    version: "0.5.0"
   flutter_lints:
     dependency: "direct dev"
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index a9a7dc51fbffc5aafeaf68405b7be39caf1e4c1c..f16826e1117e7ab5da0be791f1b7e1493ea4e67a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: Fill the board, a colorfull game!
 
 publish_to: "none"
 
-version: 0.4.2+50
+version: 0.5.0+51
 
 environment:
   sdk: "^3.0.0"
@@ -16,7 +16,7 @@ dependencies:
   flutter_custom_toolbox:
     git:
       url: https://git.harrault.fr/android/flutter-toolbox.git
-      ref: 0.4.0
+      ref: 0.5.0
 
   # specific
   # (none)