diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fdc61bc748829d8a14f73c0903433da358b505d0..ca6687f96209ece97330e5f9e86dd12bf88d328b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,3 +6,69 @@ variables:
 
 include: 'https://gitlab.com/wpdesk/gitlab-ci/raw/master/gitlab-ci-1.2.yml'
 
+integration codeception tests:
+  tags:
+    - codeception
+    - $TESTS_TAG
+  image:
+    name: wpdesknet/codeception:11
+    entrypoint: [""]
+  variables:
+    WP_CLI_CACHE_DIR: /cache/wp-cli
+    APACHE_DOCUMENT_ROOT: ${CI_PROJECT_DIR}/tests/wordpress
+    CI_DEBUG_SERVICES: trace
+  services:
+    - name: mysql:5.6
+      alias: mysqltests
+      command: [--max-allowed-packet=67108864]
+  needs:
+    - prepare prefixed vendor
+    - job: prepare translations
+      optional: true
+    - job: prepare tests
+      optional: true
+    - job: prepare npm assets
+      optional: true
+  artifacts:
+    when: always
+    expire_in: 1 month
+    name: "acceptance logs"
+    paths:
+      - tests/codeception/tests/_output
+    reports:
+      junit: tests/codeception/tests/_output/report.xml
+  stage: tests
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+      when: never
+    - exists:
+        - tests/codeception/tests/integration.suite.yml
+  allow_failure: false
+  interruptible: true
+  before_script:
+    - echo "xdebug.max_nesting_level=2560" >> /usr/local/etc/php/php.ini
+    - export DEPENDENT_PLUGINS_DIR=${CI_PROJECT_DIR}/tests/dependent_plugins
+    - export MYSQL_IP=$(awk '/^[[:space:]]*($|#)/{next} /mysqltests/{print $1; exit}' /etc/hosts)
+    - export WOOTESTS_IP=127.0.0.1
+    - export TEST_SITE_WP_URL="http://${WOOTESTS_IP}"
+    - cd ${CI_PROJECT_DIR}
+    - mkdir -p /project
+    - cd ${CI_PROJECT_DIR}
+    - mkdir -p ${APACHE_DOCUMENT_ROOT}
+    - cd ${APACHE_DOCUMENT_ROOT}
+    - cd ${CI_PROJECT_DIR}
+    - composer prepare-wordpress-for-codeception
+    - composer prepare-local-codeception-tests
+    - chmod -R a+w ${APACHE_DOCUMENT_ROOT}/wp-content/uploads
+    - touch ${APACHE_DOCUMENT_ROOT}/wp-content/debug.log
+    - chmod a+w ${APACHE_DOCUMENT_ROOT}/wp-content/debug.log
+    - echo "End before"
+    - cd ${CI_PROJECT_DIR}
+  script:
+    - vendor/bin/codecept run integration --steps --xml --html -f --verbose
+  after_script:
+    - cp ${APACHE_DOCUMENT_ROOT}/wp-content/debug.log tests/codeception/tests/_output/debug.log || true
+    - cp ${APACHE_DOCUMENT_ROOT}/wp-content/uploads/wpdesk-logs/wpdesk_debug.log tests/codeception/tests/_output/wpdesk_debug.log || true
+    - rm -r ${APACHE_DOCUMENT_ROOT}
+
+
diff --git a/tests/integration/TestAjaxHandler.php b/tests/integration/TestAjaxHandler.php
index 3007b4bee16624efbcea301ad8b386ef38c77e1a..5d09962599fca95e1d2dcde8b1cb30ea07f10598 100644
--- a/tests/integration/TestAjaxHandler.php
+++ b/tests/integration/TestAjaxHandler.php
@@ -62,7 +62,8 @@ class TestAjaxHandler extends WP_UnitTestCase
         $ajaxHandler->hooks();
 
         $this->expectOutputString('<script type="text/javascript">
-    jQuery(document).on("click",".notice-dismiss",function(){var a=jQuery(this).closest("div.notice").data("notice-name");var b=jQuery(this).closest("div.notice").data("source");if(""!==a){jQuery.ajax({url:ajaxurl,type:"post",data:{action:"wpdesk_notice_dismiss",notice_name:a,source:b},success:function(c){}})}});jQuery(document).on("click",".notice-dismiss-link",function(){jQuery(this).closest("div.notice").data("source",jQuery(this).data("source"));jQuery(this).closest("div.notice").find(".notice-dismiss").click()});</script>
+' . file_get_contents( __DIR__ . '/../../assets/js/notice.js' ) . '
+</script>
 '
         );