diff --git a/build.gradle b/build.gradle
index 1841ed4755..3182e5d3f6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,9 +1,7 @@
 plugins {
-    id 'org.ajoberstar.git-publish' version '4.2.2'
     id 'com.adarshr.test-logger' version '4.0.0'
-    id 'org.ajoberstar.grgit' version '5.2.2'
     id "com.github.ben-manes.versions" version '0.51.0'
-    id 'ru.vyarus.mkdocs' version '3.0.0'
+    id 'ru.vyarus.mkdocs' version '4.0.1' apply false
     id "com.github.spotbugs" version "6.0.9"
     id 'com.diffplug.spotless' version '6.25.0'
     id 'io.github.gradle-nexus.publish-plugin' version '2.0.0'
@@ -36,11 +34,11 @@ apply from: "$rootDir/gradle-scripts/jacoco.gradle"
 apply from: "$rootDir/gradle-scripts/spotbugs.gradle"
 apply from: "$rootDir/gradle-scripts/maven-publish.gradle"
 apply from: "$rootDir/gradle-scripts/nexus-publish.gradle"
-apply from: "$rootDir/gradle-scripts/javadocs-publish.gradle"
 apply from: "$rootDir/gradle-scripts/set-library-version.gradle"
-apply from: "$rootDir/gradle-scripts/execution-order.gradle"
 apply from: "$rootDir/gradle-scripts/mkdocs.gradle"
+apply from: "$rootDir/gradle-scripts/javadocs-publish.gradle"
 apply from: "$rootDir/gradle-scripts/spotless.gradle"
+apply from: "$rootDir/gradle-scripts/execution-order.gradle"
 
 dependencies {
     implementation "com.commercetools.sdk:commercetools-http-client:${commercetoolsJavaSdkV2Version}"
diff --git a/gradle-scripts/mkdocs.gradle b/gradle-scripts/mkdocs.gradle
index fad615241b..d25e5e3b13 100644
--- a/gradle-scripts/mkdocs.gradle
+++ b/gradle-scripts/mkdocs.gradle
@@ -1,6 +1,8 @@
+apply plugin: 'ru.vyarus.mkdocs'
+
 mkdocs {
     // mkdocs sources
-    sourcesDir = '.' // default is 'docs' in the root directory.
+    sourcesDir = "." // default is 'doc' in the root directory.
     // strict build (fail on build errors)
     strict = true
     // target build directory (publication root)
diff --git a/src/integration-test/java/com/commercetools/sync/integration/externalsource/products/ProductSyncIT.java b/src/integration-test/java/com/commercetools/sync/integration/externalsource/products/ProductSyncIT.java
index 8580d3381f..ed8c338682 100644
--- a/src/integration-test/java/com/commercetools/sync/integration/externalsource/products/ProductSyncIT.java
+++ b/src/integration-test/java/com/commercetools/sync/integration/externalsource/products/ProductSyncIT.java
@@ -78,6 +78,7 @@
 import java.util.Locale;
 import java.util.Optional;
 import java.util.Set;
+import java.util.UUID;
 import javax.annotation.Nonnull;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
@@ -955,6 +956,62 @@ void sync_withANullDraftInBatch_ShouldNotSyncItAndTriggerErrorCallBack() {
     assertThat(warningCallBackMessages).isEmpty();
   }
 
+  @Test
+  void test_Generic_NPE_error_without_details_on_product_import() {
+    // preparation
+    final List<ProductUpdateAction> updateActions = new ArrayList<>();
+    final TriConsumer<SyncException, Optional<ProductDraft>, Optional<ProductProjection>>
+        warningCallBack =
+            (exception, newResource, oldResource) ->
+                warningCallBackMessages.add(exception.getMessage());
+
+    final ProductSyncOptions customOptions =
+        ProductSyncOptionsBuilder.of(TestClientUtils.CTP_TARGET_CLIENT)
+            .errorCallback(
+                (exception, oldResource, newResource, actions) ->
+                    collectErrors(exception.getMessage(), exception.getCause()))
+            .warningCallback(warningCallBack)
+            .beforeUpdateCallback(
+                (actions, draft, old) -> {
+                  updateActions.addAll(actions);
+                  return actions;
+                })
+            .build();
+
+    final ProductDraft productDraft =
+        createProductDraftBuilder(
+                PRODUCT_KEY_1_RESOURCE_PATH,
+                ProductTypeResourceIdentifierBuilder.of().key(productType.getKey()).build())
+            .slug(LocalizedString.of(Locale.ENGLISH, "slug"))
+            .categories(emptyList())
+            .taxCategory((TaxCategoryResourceIdentifier) null)
+            .state((StateResourceIdentifier) null)
+            .build();
+
+    final ProductDraft productDraft2 =
+        createProductDraftBuilder(
+                PRODUCT_KEY_1_RESOURCE_PATH,
+                ProductTypeResourceIdentifierBuilder.of().key(productType.getKey()).build())
+            .key(UUID.randomUUID().toString())
+            .slug(LocalizedString.of(Locale.ENGLISH, "slug"))
+            .categories(emptyList())
+            .taxCategory((TaxCategoryResourceIdentifier) null)
+            .state((StateResourceIdentifier) null)
+            .build();
+
+    // test
+    final ProductSync productSync = new ProductSync(customOptions);
+    productSync.sync(singletonList(productDraft)).toCompletableFuture().join();
+    final ProductSyncStatistics syncStatistics =
+        productSync.sync(singletonList(productDraft2)).toCompletableFuture().join();
+
+    assertThat(syncStatistics).hasValues(2, 0, 1, 1, 0);
+    assertThat(this.errorCallBackExceptions.get(0).getCause().getMessage())
+        .contains("A duplicate value '\\\"slug\\\"' exists for field");
+    assertThat(this.errorCallBackMessages.get(0))
+        .contains("A duplicate value '\\\"slug\\\"' exists for field");
+  }
+
   @Test
   void sync_withProductContainingAttributeChanges_shouldSyncProductCorrectly() {
     // preparation