diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2cbc9610..13962afe 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -8,8 +8,7 @@ on:
     release:
         types: [created]
     schedule:
-        -
-            cron: "0 1 * * 6" # Run at 1am every Saturday
+        - cron: "0 1 * * 6" # Run at 1am every Saturday
     workflow_dispatch: ~
 
 jobs:
@@ -23,14 +22,16 @@ jobs:
             matrix:
                 php: [ "8.0", "8.1", "8.2", "8.3" ]
                 symfony: [ "^5.4", "^6.4" ]
-                sylius: [ "~1.12.0", "~1.13.0" ]
-                node: [ "^18.0", "^20.0" ]
+                sylius: [ "^1.12", "^1.13" ]
+                node: [ "18.x", "20.x" ]
                 mysql: [ "8.0" ]
+
                 exclude:
-                    - sylius: "~1.13.0"
-                      php: "8.0"
-                    - symfony: "^6.4"
-                      php: "8.0"
+                    - sylius: ^1.13
+                      php: 8.0
+                    - sylius: ^1.12
+                      php: 8.0
+                      symfony: ^6.4
 
         env:
             APP_ENV: test
@@ -95,7 +96,6 @@ jobs:
                     key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.json **/composer.lock') }}
                     restore-keys: |
                         ${{ runner.os }}-php-${{ matrix.php }}-composer-
-
             -
                 name: Restrict Symfony version
                 if: matrix.symfony != ''
@@ -103,30 +103,30 @@ jobs:
                     composer global config --no-plugins allow-plugins.symfony/flex true
                     composer global require --no-progress --no-scripts --no-plugins "symfony/flex:^1.10"
                     composer config extra.symfony.require "${{ matrix.symfony }}"
-
             -
-                name: Restrcting Sylius version
+                name: Restrict Sylius version
                 if: matrix.sylius != ''
                 run: composer require "sylius/sylius:${{ matrix.sylius }}" --no-update --no-scripts --no-interaction
 
             -
                 name: Install PHP dependencies
                 run: composer install --no-interaction
+                env:
+                    SYMFONY_REQUIRE: ${{ matrix.symfony }}
 
             -
                 name: Get Yarn cache directory
                 id: yarn-cache
-                run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
+                run: echo "::set-output name=dir::$(yarn cache dir)"
 
             -
                 name: Cache Yarn
-                uses: actions/cache@v2
+                uses: actions/cache@v4
                 with:
                     path: ${{ steps.yarn-cache.outputs.dir }}
                     key: ${{ runner.os }}-node-${{ matrix.node }}-yarn-${{ hashFiles('**/package.json **/yarn.lock') }}
                     restore-keys: |
                         ${{ runner.os }}-node-${{ matrix.node }}-yarn-
-
             -
                 name: Install JS dependencies
                 run: (cd tests/Application && yarn install)
@@ -136,13 +136,11 @@ jobs:
                 run: |
                     (cd tests/Application && bin/console doctrine:database:create -vvv)
                     (cd tests/Application && bin/console doctrine:schema:create -vvv)
-
             -
                 name: Prepare test application assets
                 run: |
                     (cd tests/Application && bin/console assets:install public -vvv)
                     (cd tests/Application && yarn encore dev)
-
             -
                 name: Prepare test application cache
                 run: (cd tests/Application && bin/console cache:warmup -vvv)
@@ -159,18 +157,6 @@ jobs:
                 name: Validate database schema
                 run: (cd tests/Application && bin/console doctrine:schema:validate)
 
-            -
-                name: Run PHPStan
-                run: vendor/bin/phpstan analyse -c phpstan.neon -l 6 src/
-
-            -
-                name: Run ECS
-                run: vendor/bin/ecs check src
-
-            -
-                name: Run Psalm
-                run: vendor/bin/psalm
-
             -
                 name: Run PHPSpec
                 run: vendor/bin/phpspec run --ansi -f progress --no-interaction
diff --git a/.github/workflows/coding_standard.yml b/.github/workflows/coding_standard.yml
new file mode 100644
index 00000000..eb9c8e98
--- /dev/null
+++ b/.github/workflows/coding_standard.yml
@@ -0,0 +1,88 @@
+name: Coding standard
+
+on:
+  push:
+    branches-ignore:
+      - 'dependabot/**'
+  pull_request: ~
+  release:
+    types: [ created ]
+  workflow_dispatch: ~
+
+jobs:
+  tests:
+    runs-on: ubuntu-latest
+
+    name: "Sylius ${{ matrix.sylius }}, PHP ${{ matrix.php }}, Symfony ${{ matrix.symfony }}"
+
+    strategy:
+      fail-fast: false
+      matrix:
+        php: [ "8.0", "8.1", "8.2", "8.3" ]
+        symfony: [ "^5.4", "^6.4" ]
+        sylius: [ "^1.12", "^1.13" ]
+        node: [ "18.x", "20.x" ]
+
+        exclude:
+          - sylius: ^1.13
+            php: 8.0
+          - sylius: ^1.12
+            php: 8.0
+            symfony: ^6.4
+
+    steps:
+      - uses: actions/checkout@v3
+
+      - name: Setup PHP
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: "${{ matrix.php }}"
+          extensions: intl
+          tools: symfony
+          coverage: none
+
+      - name: Get Composer cache directory
+        id: composer-cache
+        run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
+
+      - name: Cache Composer
+        uses: actions/cache@v4
+        with:
+          path: ${{ steps.composer-cache.outputs.dir }}
+          key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.json', '**/composer.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-php-${{ matrix.php }}-composer-
+
+      - name: Restrict Symfony version
+        if: matrix.symfony != ''
+        run: |
+          composer global config --no-plugins allow-plugins.symfony/flex true
+          composer global require --no-progress --no-scripts --no-plugins "symfony/flex:^1.10"
+          composer config extra.symfony.require "${{ matrix.symfony }}"
+
+      - name: Restrict Sylius version
+        if: matrix.sylius != ''
+        run: composer require "sylius/sylius:${{ matrix.sylius }}" --no-update --no-scripts --no-interaction
+
+      - name: Install PHP dependencies
+        run: composer install --no-interaction
+        env:
+          SYMFONY_REQUIRE: ${{ matrix.symfony }}
+
+      - name: Run PHPStan
+        run: vendor/bin/phpstan analyse -c phpstan.neon -l 8 src/
+
+      - name: Run ECS
+        run: vendor/bin/ecs check src
+
+      - name: Failed build Slack notification
+        uses: rtCamp/action-slack-notify@v2
+        if: ${{ failure() && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') }}
+        env:
+          SLACK_CHANNEL: ${{ secrets.FAILED_BUILD_SLACK_CHANNEL }}
+          SLACK_COLOR: ${{ job.status }}
+          SLACK_ICON: https://github.com/rtCamp.png?size=48
+          SLACK_MESSAGE: ':x:'
+          SLACK_TITLE: Failed build on ${{ github.event.repository.name }} repository
+          SLACK_USERNAME: ${{ secrets.FAILED_BUILD_SLACK_USERNAME }}
+          SLACK_WEBHOOK: ${{ secrets.FAILED_BUILD_SLACK_WEBHOOK }}
diff --git a/composer.json b/composer.json
index 1883aabf..b6cb588d 100644
--- a/composer.json
+++ b/composer.json
@@ -46,9 +46,7 @@
         "symfony/dotenv": "^5.4 || ^6.0",
         "symfony/intl": "^5.4 || ^6.0",
         "symfony/web-profiler-bundle": "^5.4 || ^6.0",
-        "symplify/easy-coding-standard": "^10.0 || ^11.0",
-        "vimeo/psalm": "~4.12 || ^5.0.0",
-        "psalm/plugin-symfony": "~4.0 || ~5.0"
+        "symplify/easy-coding-standard": "^10.0 || ^11.0"
     },
     "config": {
         "sort-packages": true,
diff --git a/psalm.xml b/psalm.xml
deleted file mode 100644
index 27b16bf4..00000000
--- a/psalm.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-        errorLevel="1"
-        resolveFromConfigFile="true"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="https://getpsalm.org/schema/config"
-        xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
-        allowStringToStandInForClass="true"
->
-    <projectFiles >
-        <directory name="src"/>
-        <ignoreFiles>
-            <directory name="vendor"/>
-            <directory name="src/DependencyInjection"/>
-        </ignoreFiles>
-    </projectFiles>
-    <issueHandlers>
-        <MissingTemplateParam errorLevel="suppress" />
-        <MissingParamType errorLevel="suppress" />
-    </issueHandlers>
-    <plugins>
-        <pluginClass class="Psalm\SymfonyPsalmPlugin\Plugin"/>
-    </plugins>
-</psalm>
diff --git a/src/Bus/Handler/GetTokenHandler.php b/src/Bus/Handler/GetTokenHandler.php
index 76deaabe..ed6e021e 100644
--- a/src/Bus/Handler/GetTokenHandler.php
+++ b/src/Bus/Handler/GetTokenHandler.php
@@ -58,10 +58,6 @@ private function getUser(): ?UserInterface
         return $user instanceof UserInterface ? $user : null;
     }
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     */
     public function __invoke(GetToken $getTokenQuery): ?AdyenTokenInterface
     {
         if (null === $this->getUser()) {
diff --git a/src/Bus/Handler/PaymentStatusReceivedHandler.php b/src/Bus/Handler/PaymentStatusReceivedHandler.php
index f336e9ba..39273685 100644
--- a/src/Bus/Handler/PaymentStatusReceivedHandler.php
+++ b/src/Bus/Handler/PaymentStatusReceivedHandler.php
@@ -101,17 +101,9 @@ private function updateOrderState(OrderInterface $order): void
 
             // This is necessary because in Sylius 1.11 namespace of SendOrderConfirmation has been changed
             if (null !== $token) {
-                /**
-                 * @psalm-suppress MixedArgument
-                 * @psalm-suppress UndefinedClass
-                 */
                 if (class_exists('\Sylius\Bundle\ApiBundle\Command\SendOrderConfirmation')) {
                     $this->commandBus->dispatch(new \Sylius\Bundle\ApiBundle\Command\SendOrderConfirmation($token));
                 } elseif (class_exists('\Sylius\Bundle\ApiBundle\Command\Checkout\SendOrderConfirmation')) {
-                    /**
-                     * @psalm-suppress MixedArgument
-                     * @psalm-suppress UndefinedClass
-                     */
                     $this->commandBus->dispatch(new \Sylius\Bundle\ApiBundle\Command\Checkout\SendOrderConfirmation($token));
                 }
             }
diff --git a/src/Controller/Shop/AdyenDetailsAction.php b/src/Controller/Shop/AdyenDetailsAction.php
index 6f775a0d..6b0709ea 100644
--- a/src/Controller/Shop/AdyenDetailsAction.php
+++ b/src/Controller/Shop/AdyenDetailsAction.php
@@ -31,6 +31,7 @@ public function __construct(
 
     public function __invoke(Request $request, string $code): Response
     {
+        /** @var string|null $referenceId */
         $referenceId = $request->query->get(self::REFERENCE_ID_KEY);
 
         if (null === $referenceId) {
diff --git a/src/Controller/Shop/PaymentsAction.php b/src/Controller/Shop/PaymentsAction.php
index 0a87d6d3..d6291237 100644
--- a/src/Controller/Shop/PaymentsAction.php
+++ b/src/Controller/Shop/PaymentsAction.php
@@ -82,9 +82,6 @@ private function prepareTargetUrl(OrderInterface $order): string
 
     private function prepareOrder(Request $request, OrderInterface $order): void
     {
-        /**
-         * @psalm-suppress InternalMethod
-         */
         if (null === $request->get('tokenValue')) {
             $request->getSession()->set(self::ORDER_ID_KEY, $order->getId());
         }
diff --git a/src/Controller/Shop/ProcessNotificationsAction.php b/src/Controller/Shop/ProcessNotificationsAction.php
index 58105d54..e2cd8a52 100644
--- a/src/Controller/Shop/ProcessNotificationsAction.php
+++ b/src/Controller/Shop/ProcessNotificationsAction.php
@@ -50,7 +50,7 @@ public function __construct(
     public function __invoke(string $code, Request $request): Response
     {
         foreach ($this->notificationResolver->resolve($code, $request) as $notificationItem) {
-            if (!$notificationItem->success) {
+            if (null === $notificationItem || false === $notificationItem->success) {
                 $this->logger->error(\sprintf(
                     'Payment with pspReference [%s] did not return success',
                     $notificationItem->pspReference ?? '',
diff --git a/src/Entity/Log.php b/src/Entity/Log.php
index 2e3ea08f..a9ea8cd2 100644
--- a/src/Entity/Log.php
+++ b/src/Entity/Log.php
@@ -11,7 +11,6 @@
 
 namespace BitBag\SyliusAdyenPlugin\Entity;
 
-/** @psalm-suppress MissingConstructor */
 class Log implements LogInterface
 {
     /** @var int */
diff --git a/src/Form/Type/CredentialType.php b/src/Form/Type/CredentialType.php
index 74b442ae..83762ecd 100644
--- a/src/Form/Type/CredentialType.php
+++ b/src/Form/Type/CredentialType.php
@@ -31,7 +31,6 @@ public function buildView(
             return;
         }
 
-        /** @psalm-suppress InvalidPropertyAssignmentValue */
         $view->vars['value'] = self::CREDENTIAL_PLACEHOLDER;
     }
 
diff --git a/src/Grid/Filter/LoggerLevel.php b/src/Grid/Filter/LoggerLevel.php
index fd98da19..37fe93a0 100644
--- a/src/Grid/Filter/LoggerLevel.php
+++ b/src/Grid/Filter/LoggerLevel.php
@@ -22,7 +22,6 @@ public function apply(
         $data,
         array $options,
     ): void {
-        /** @psalm-suppress MixedArrayAccess */
         $dataSource->restrict($dataSource->getExpressionBuilder()->equals('level', $data['loggerLevel']));
     }
 }
diff --git a/src/Processor/PaymentResponseProcessor.php b/src/Processor/PaymentResponseProcessor.php
index 6da99670..92ff8813 100644
--- a/src/Processor/PaymentResponseProcessor.php
+++ b/src/Processor/PaymentResponseProcessor.php
@@ -20,14 +20,14 @@ final class PaymentResponseProcessor implements PaymentResponseProcessorInterfac
 {
     private const DEFAULT_REDIRECT_ROUTE = 'sylius_shop_order_thank_you';
 
-    /** @var ProcessorInterface[] */
+    /** @var iterable<ProcessorInterface> */
     private $processors;
 
     /** @var UrlGeneratorInterface */
     private $urlGenerator;
 
     /**
-     * @param ProcessorInterface[] $processors
+     * @param iterable<ProcessorInterface> $processors
      */
     public function __construct(
         iterable $processors,
diff --git a/src/Repository/AdyenReferenceRepository.php b/src/Repository/AdyenReferenceRepository.php
index badcc616..8c6950b9 100644
--- a/src/Repository/AdyenReferenceRepository.php
+++ b/src/Repository/AdyenReferenceRepository.php
@@ -34,19 +34,12 @@ private function getQueryBuilderForCodeAndReference(string $code, string $pspRef
         return $qb;
     }
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     */
     public function getOneByCodeAndReference(string $code, string $pspReference): AdyenReferenceInterface
     {
         return $this->getQueryBuilderForCodeAndReference($code, $pspReference)->getQuery()->getSingleResult();
     }
 
     /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     *
      * @throws NoResultException
      */
     public function getOneForRefundByCodeAndReference(string $code, string $pspReference): AdyenReferenceInterface
diff --git a/src/Repository/AdyenTokenRepository.php b/src/Repository/AdyenTokenRepository.php
index d6c72347..f857b6bc 100644
--- a/src/Repository/AdyenTokenRepository.php
+++ b/src/Repository/AdyenTokenRepository.php
@@ -18,19 +18,15 @@
 
 final class AdyenTokenRepository extends EntityRepository implements AdyenTokenRepositoryInterface
 {
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress MoreSpecificReturnType
-     * @psalm-suppress LessSpecificReturnStatement
-     */
     public function findOneByPaymentMethodAndCustomer(
         PaymentMethodInterface $paymentMethod,
         CustomerInterface $customer,
     ): ?AdyenTokenInterface {
-        return $this->findOneBy([
+        $result = $this->findOneBy([
             'paymentMethod' => $paymentMethod,
             'customer' => $customer,
         ]);
+
+        return $result instanceof AdyenTokenInterface ? $result : null;
     }
 }
diff --git a/src/Repository/AdyenTokenRepositoryInterface.php b/src/Repository/AdyenTokenRepositoryInterface.php
index e9175dbe..7c060246 100644
--- a/src/Repository/AdyenTokenRepositoryInterface.php
+++ b/src/Repository/AdyenTokenRepositoryInterface.php
@@ -18,10 +18,6 @@
 
 interface AdyenTokenRepositoryInterface extends RepositoryInterface
 {
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     */
     public function findOneByPaymentMethodAndCustomer(
         PaymentMethodInterface $paymentMethod,
         CustomerInterface $customer,
diff --git a/src/Repository/PaymentMethodRepository.php b/src/Repository/PaymentMethodRepository.php
index 5d43efcc..1e76ba07 100644
--- a/src/Repository/PaymentMethodRepository.php
+++ b/src/Repository/PaymentMethodRepository.php
@@ -28,23 +28,14 @@ public function __construct(EntityRepository $baseRepository)
         $this->baseRepository = $baseRepository;
     }
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress MoreSpecificReturnType
-     * @psalm-suppress LessSpecificReturnStatement
-     */
     public function find(int $id): ?PaymentMethodInterface
     {
-        return $this->baseRepository->find($id);
+        /** @var PaymentMethodInterface|null $result */
+        $result = $this->baseRepository->find($id);
+
+        return $result;
     }
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress MoreSpecificReturnType
-     * @psalm-suppress LessSpecificReturnStatement
-     */
     public function getOneForAdyenAndCode(string $code): PaymentMethodInterface
     {
         return $this->baseRepository->createQueryBuilder('o')
@@ -67,9 +58,6 @@ public function findOneForAdyenAndCode(string $code): ?PaymentMethodInterface
         }
     }
 
-    /**
-     * @psalm-suppress QueryBuilderSetParameter
-     */
     private function getQueryForChannel(ChannelInterface $channel): QueryBuilder
     {
         return $this->baseRepository->createQueryBuilder('o')
@@ -83,10 +71,6 @@ private function getQueryForChannel(ChannelInterface $channel): QueryBuilder
         ;
     }
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     */
     public function findOneByChannel(ChannelInterface $channel): ?PaymentMethodInterface
     {
         return $this
@@ -99,9 +83,6 @@ public function findOneByChannel(ChannelInterface $channel): ?PaymentMethodInter
 
     /**
      * @return array<int, PaymentMethodInterface>
-     *
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress MixedReturnStatement
      */
     public function findAllByChannel(ChannelInterface $channel): array
     {
diff --git a/src/Repository/PaymentRepository.php b/src/Repository/PaymentRepository.php
index 9a70ddc4..873178a7 100644
--- a/src/Repository/PaymentRepository.php
+++ b/src/Repository/PaymentRepository.php
@@ -24,14 +24,11 @@ public function __construct(EntityRepository $baseRepository)
         $this->baseRepository = $baseRepository;
     }
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress MoreSpecificReturnType
-     * @psalm-suppress LessSpecificReturnStatement
-     */
     public function find(int $id): ?PaymentInterface
     {
-        return $this->baseRepository->find($id);
+        /** @var PaymentInterface|null $result */
+        $result = $this->baseRepository->find($id);
+
+        return $result;
     }
 }
diff --git a/src/Repository/RefundPaymentRepository.php b/src/Repository/RefundPaymentRepository.php
index c0d752b7..c0d357d1 100644
--- a/src/Repository/RefundPaymentRepository.php
+++ b/src/Repository/RefundPaymentRepository.php
@@ -24,12 +24,6 @@ public function __construct(EntityRepository $baseRepository)
         $this->baseRepository = $baseRepository;
     }
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress MoreSpecificReturnType
-     * @psalm-suppress LessSpecificReturnStatement
-     */
     public function getForOrderNumberAndRefundPaymentId(
         string $orderNumber,
         int $paymentId,
@@ -49,14 +43,11 @@ public function getForOrderNumberAndRefundPaymentId(
         return $qb->getQuery()->getSingleResult();
     }
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress MoreSpecificReturnType
-     * @psalm-suppress LessSpecificReturnStatement
-     */
     public function find(int $id): ?RefundPaymentInterface
     {
-        return $this->baseRepository->find($id);
+        /** @var RefundPaymentInterface|null $result */
+        $result = $this->baseRepository->find($id);
+
+        return $result;
     }
 }
diff --git a/src/Resolver/Notification/Serializer/NotificationItemNormalizer.php b/src/Resolver/Notification/Serializer/NotificationItemNormalizer.php
index 1e657500..b2ea9d6b 100644
--- a/src/Resolver/Notification/Serializer/NotificationItemNormalizer.php
+++ b/src/Resolver/Notification/Serializer/NotificationItemNormalizer.php
@@ -26,9 +26,6 @@ final class NotificationItemNormalizer implements DenormalizerAwareInterface, De
     use DenormalizerAwareTrait;
     use NormalizerAwareTrait;
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     */
     public function denormalize(
         $data,
         string $type,
diff --git a/src/Resolver/Notification/Struct/NotificationItem.php b/src/Resolver/Notification/Struct/NotificationItem.php
index 2ccafe11..df9619b7 100644
--- a/src/Resolver/Notification/Struct/NotificationItem.php
+++ b/src/Resolver/Notification/Struct/NotificationItem.php
@@ -13,9 +13,6 @@
 
 use Symfony\Component\Serializer\Annotation\SerializedName;
 
-/**
- * @psalm-suppress MissingConstructor
- */
 class NotificationItem
 {
     /** @var string */
diff --git a/src/Resolver/Order/PaymentCheckoutOrderResolver.php b/src/Resolver/Order/PaymentCheckoutOrderResolver.php
index f9b67898..32184197 100644
--- a/src/Resolver/Order/PaymentCheckoutOrderResolver.php
+++ b/src/Resolver/Order/PaymentCheckoutOrderResolver.php
@@ -49,17 +49,10 @@ private function getCurrentRequest(): Request
         return $result;
     }
 
-    /**
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress MoreSpecificReturnType
-     * @psalm-suppress LessSpecificReturnStatement
-     */
     private function getCurrentOrder(): ?OrderInterface
     {
         /**
          * @var string|null $tokenValue
-         *
-         * @psalm-suppress InternalMethod
          */
         $tokenValue = $this->getCurrentRequest()->get('tokenValue');
 
diff --git a/src/Resolver/Version/VersionResolver.php b/src/Resolver/Version/VersionResolver.php
index 7d78325c..320a3040 100644
--- a/src/Resolver/Version/VersionResolver.php
+++ b/src/Resolver/Version/VersionResolver.php
@@ -19,12 +19,6 @@ final class VersionResolver implements VersionResolverInterface
 
     private const TEST_APPLICATION_VERSION = 'dev';
 
-    /**
-     * @psalm-suppress MixedReturnStatement
-     * @psalm-suppress MixedInferredReturnType
-     * @psalm-suppress InternalClass
-     * @psalm-suppress InternalMethod
-     */
     private function getPluginVersion(): string
     {
         try {
diff --git a/src/Validator/Constraint/HmacSignatureValidator.php b/src/Validator/Constraint/HmacSignatureValidator.php
index bb3c298c..f7878b02 100644
--- a/src/Validator/Constraint/HmacSignatureValidator.php
+++ b/src/Validator/Constraint/HmacSignatureValidator.php
@@ -68,7 +68,7 @@ private function getPaymentCode(): string
     private function getNormalizedNotificationData(NotificationItemData $value): array
     {
         $params = (array) $this->normalizer->normalize($value);
-        $params['success'] = $value->success ? 'true' : 'false';
+        $params['success'] = ($value->success ?? false) ? 'true' : 'false';
 
         return $params;
     }
diff --git a/tests/Application/.env b/tests/Application/.env
index 8fe97708..f2a5f1ca 100644
--- a/tests/Application/.env
+++ b/tests/Application/.env
@@ -12,7 +12,7 @@ APP_SECRET=EDITME
 # Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
 # For a sqlite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
 # Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls
-DATABASE_URL=mysql://root:root@127.0.0.1/adyen_%kernel.environment%?serverVersion=5.5
+DATABASE_URL=mysql://root@127.0.0.1/adyen_%kernel.environment%?serverVersion=8.0
 ###< doctrine/doctrine-bundle ###
 
 ###> lexik/jwt-authentication-bundle ###
diff --git a/tests/Application/.env.test b/tests/Application/.env.test
index d7006912..ce1e3d3a 100644
--- a/tests/Application/.env.test
+++ b/tests/Application/.env.test
@@ -2,4 +2,4 @@ APP_SECRET='ch4mb3r0f5ecr3ts'
 
 KERNEL_CLASS='Tests\BitBag\SyliusAdyenPlugin\Application\Kernel'
 
-DATABASE_URL=mysql://root@127.0.0.1/adyen_%kernel.environment%?serverVersion=5.5
+DATABASE_URL=mysql://root@127.0.0.1/adyen_%kernel.environment%?serverVersion=8.0