feat(JOHNZON-397): make sure to pass the provider instance so we can configure the scale per provider
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/CommentsJsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/CommentsJsonStreamParserImpl.java
index f9d298e..fb199bd 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/CommentsJsonStreamParserImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/CommentsJsonStreamParserImpl.java
@@ -27,8 +27,8 @@
                                         final int maxStringLength,
                                         final BufferStrategy.BufferProvider<char[]> bufferProvider,
                                         final BufferStrategy.BufferProvider<char[]> valueBuffer,
-                                        final boolean autoAdjust) {
-        super(inputStream, maxStringLength, bufferProvider, valueBuffer, autoAdjust);
+                                        final boolean autoAdjust, final JsonProviderImpl provider) {
+        super(inputStream, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider);
     }
 
     public CommentsJsonStreamParserImpl(final InputStream inputStream,
@@ -36,16 +36,16 @@
                                         final int maxStringLength,
                                         final BufferStrategy.BufferProvider<char[]> bufferProvider,
                                         final BufferStrategy.BufferProvider<char[]> valueBuffer,
-                                        final boolean autoAdjust) {
-        super(inputStream, encoding, maxStringLength, bufferProvider, valueBuffer, autoAdjust);
+                                        final boolean autoAdjust, final JsonProviderImpl provider) {
+        super(inputStream, encoding, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider);
     }
 
     public CommentsJsonStreamParserImpl(final Reader reader,
                                         final int maxStringLength,
                                         final BufferStrategy.BufferProvider<char[]> bufferProvider,
                                         final BufferStrategy.BufferProvider<char[]> valueBuffer,
-                                        final boolean autoAdjust) {
-        super(reader, maxStringLength, bufferProvider, valueBuffer, autoAdjust);
+                                        final boolean autoAdjust, final JsonProviderImpl provider) {
+        super(reader, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider);
     }
 
     @Override
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java
index 235696e..af0e9cf 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java
@@ -50,6 +50,13 @@
 
     private boolean manualNext = false;
 
+    private final JsonProviderImpl provider;
+
+    protected JohnzonJsonParserImpl(final JsonProviderImpl provider) {
+        this.provider = provider;
+    }
+
+
     @Override
     public Event next() {
         manualNext = true;
@@ -65,7 +72,7 @@
             throw new IllegalStateException(current + " doesn't support getObject()");
         }
 
-        JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT);
+        JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT, provider);
         return jsonReader.readObject();
     }
 
@@ -77,7 +84,7 @@
             throw new IllegalStateException(current + " doesn't support getArray()");
         }
 
-        JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT);
+        JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT, provider);
         return jsonReader.readArray();
     }
 
@@ -87,7 +94,7 @@
         switch (current) {
             case START_ARRAY:
             case START_OBJECT:
-                JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT);
+                JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT, provider);
                 return jsonReader.readValue();
             case VALUE_TRUE:
                 return JsonValue.TRUE;
@@ -102,7 +109,7 @@
                 if (isFitLong()) {
                     return new JsonLongImpl(getLong());
                 }
-                return new JsonNumberImpl(getBigDecimal());
+                return new JsonNumberImpl(getBigDecimal(), provider::checkBigDecimalScale);
             default:
                 throw new IllegalStateException(current + " doesn't support getValue()");
         }
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
index 675cc14..3aaa280 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
@@ -36,6 +36,7 @@
 
 class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable {
     private RejectDuplicateKeysMode rejectDuplicateKeysMode;
+    private JsonProviderImpl jsonProvider;
     private List<JsonValue> tmpList;
     private BufferStrategy.BufferProvider<char[]> bufferProvider;
 
@@ -45,14 +46,15 @@
 
     public JsonArrayBuilderImpl(final JsonArray initialData,
                                 final BufferStrategy.BufferProvider<char[]> provider,
-                                final RejectDuplicateKeysMode rejectDuplicateKeysMode) {
+                                final RejectDuplicateKeysMode rejectDuplicateKeysMode, final JsonProviderImpl jsonProvider) {
         this.tmpList = new ArrayList<>(initialData);
         this.bufferProvider = provider;
         this.rejectDuplicateKeysMode = rejectDuplicateKeysMode;
+        this.jsonProvider = jsonProvider;
     }
 
     public JsonArrayBuilderImpl(final Collection<?> initialData, final BufferStrategy.BufferProvider<char[]> provider,
-                                final RejectDuplicateKeysMode rejectDuplicateKeysMode) {
+                                final RejectDuplicateKeysMode rejectDuplicateKeysMode, final JsonProviderImpl jsonProvider) {
         this.bufferProvider = provider;
         this.rejectDuplicateKeysMode = rejectDuplicateKeysMode;
         this.tmpList = new ArrayList<>();
@@ -61,6 +63,7 @@
                 add(initialValue);
             }
         }
+        this.jsonProvider = jsonProvider;
     }
 
     @Override
@@ -83,13 +86,13 @@
 
     @Override
     public JsonArrayBuilder add(final int index, final BigDecimal value) {
-        addValue(index, new JsonNumberImpl(value));
+        addValue(index, new JsonNumberImpl(value, jsonProvider::checkBigDecimalScale));
         return this;
     }
 
     @Override
     public JsonArrayBuilder add(final int index, final BigInteger value) {
-        addValue(index, new JsonNumberImpl(new BigDecimal(value)));
+        addValue(index, new JsonNumberImpl(new BigDecimal(value), jsonProvider::checkBigDecimalScale));
         return this;
     }
 
@@ -149,13 +152,13 @@
 
     @Override
     public JsonArrayBuilder set(final int index, final BigDecimal value) {
-        setValue(index, new JsonNumberImpl(value));
+        setValue(index, new JsonNumberImpl(value, jsonProvider::checkBigDecimalScale));
         return this;
     }
 
     @Override
     public JsonArrayBuilder set(final int index, final BigInteger value) {
-        setValue(index, new JsonNumberImpl(new BigDecimal(value)));
+        setValue(index, new JsonNumberImpl(new BigDecimal(value), jsonProvider::checkBigDecimalScale));
         return this;
     }
 
@@ -225,12 +228,12 @@
         } else if (value instanceof String) {
             add((String) value);
         } else if (value instanceof Map) {
-            add(new JsonObjectBuilderImpl(Map.class.cast(value), bufferProvider, rejectDuplicateKeysMode).build());
+            add(new JsonObjectBuilderImpl(Map.class.cast(value), bufferProvider, rejectDuplicateKeysMode, jsonProvider).build());
         } else if (value instanceof Collection) {
-            add(new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider, rejectDuplicateKeysMode).build());
+            add(new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider, rejectDuplicateKeysMode, jsonProvider).build());
         } else if (value.getClass().isArray()) {
             final Collection<Object> collection = ArrayUtil.newCollection(value);
-            add(new JsonArrayBuilderImpl(collection, bufferProvider, rejectDuplicateKeysMode).build());
+            add(new JsonArrayBuilderImpl(collection, bufferProvider, rejectDuplicateKeysMode, jsonProvider).build());
         } else {
             throw new JsonException("Illegal JSON type! type=" + value.getClass());
         }
@@ -252,13 +255,13 @@
 
     @Override
     public JsonArrayBuilder add(final BigDecimal value) {
-        addValue(new JsonNumberImpl(value));
+        addValue(new JsonNumberImpl(value, jsonProvider::checkBigDecimalScale));
         return this;
     }
 
     @Override
     public JsonArrayBuilder add(final BigInteger value) {
-        addValue(new JsonNumberImpl(new BigDecimal(value)));
+        addValue(new JsonNumberImpl(new BigDecimal(value), jsonProvider::checkBigDecimalScale));
         return this;
     }
 
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
index bea58cb..8323a1a 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
@@ -37,6 +37,7 @@
 class JsonBuilderFactoryImpl implements JsonBuilderFactory, Serializable {
     private final Map<String, Object> internalConfig = new HashMap<String, Object>();
     private RejectDuplicateKeysMode rejectDuplicateKeysMode;
+    private JsonProviderImpl provider;
     private BufferStrategy.BufferProvider<char[]> bufferProvider;
     private static final List<String> SUPPORTED_CONFIG_KEYS = RejectDuplicateKeysMode.CONFIG_KEYS;
 
@@ -45,9 +46,10 @@
     }
 
     JsonBuilderFactoryImpl(final Map<String, ?> config, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-                           final RejectDuplicateKeysMode rejectDuplicateKeysMode) {
+                           final RejectDuplicateKeysMode rejectDuplicateKeysMode, final JsonProviderImpl provider) {
         this.bufferProvider = bufferProvider;
         this.rejectDuplicateKeysMode = rejectDuplicateKeysMode;
+        this.provider = provider;
         if (config != null && !config.isEmpty()) {
             for (String configKey : config.keySet()) {
                 if(SUPPORTED_CONFIG_KEYS.contains(configKey)) {
@@ -62,28 +64,28 @@
 
     @Override
     public JsonObjectBuilder createObjectBuilder() {
-        return new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode);
+        return new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode, provider);
     }
 
     @Override
     public JsonObjectBuilder createObjectBuilder(JsonObject initialData) {
-        return new JsonObjectBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode);
+        return new JsonObjectBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode, provider);
     }
 
     @Override
     public JsonArrayBuilder createArrayBuilder() {
-        return new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode);
+        return new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode, provider);
     }
 
 
     @Override
     public JsonArrayBuilder createArrayBuilder(JsonArray initialData) {
-        return new JsonArrayBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode);
+        return new JsonArrayBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode, provider);
     }
 
     @Override
     public JsonArrayBuilder createArrayBuilder(Collection<?> initialData) {
-        return new JsonArrayBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode);
+        return new JsonArrayBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode, provider);
     }
 
     @Override
@@ -93,7 +95,7 @@
 
     @Override
     public JsonObjectBuilder createObjectBuilder(Map<String, Object> initialValues) {
-        return new JsonObjectBuilderImpl(initialValues, bufferProvider, rejectDuplicateKeysMode);
+        return new JsonObjectBuilderImpl(initialValues, bufferProvider, rejectDuplicateKeysMode, provider);
     }
 
 }
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
index 70cf553..7dad95c 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
@@ -216,12 +216,16 @@
 
     }
 
-    JsonInMemoryParser(final JsonObject object, final BufferStrategy.BufferProvider<char[]> bufferProvider) {
+    JsonInMemoryParser(final JsonObject object, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+                      final JsonProviderImpl provider) {
+        super(provider);
         stack.push(new ObjectIterator(object));
         this.bufferProvider = bufferProvider;
     }
 
-    JsonInMemoryParser(final JsonArray array, final BufferStrategy.BufferProvider<char[]> bufferProvider) {
+    JsonInMemoryParser(final JsonArray array, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+                       final JsonProviderImpl provider) {
+        super(provider);
         stack.push(new ArrayIterator(array));
         this.bufferProvider = bufferProvider;
     }
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java
index cb449c0..221f55d 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java
@@ -32,20 +32,23 @@
     private final BufferStrategy.BufferProvider<char[]> bufferProvider;
     private final JsonValue source;
     private final JsonValue target;
+    private JsonProviderImpl provider;
 
     public JsonMergePatchDiff(final JsonValue source, final JsonValue target,
-                              final BufferStrategy.BufferProvider<char[]> bufferProvider) {
+                              final BufferStrategy.BufferProvider<char[]> bufferProvider,
+                              final JsonProviderImpl provider) {
         this.bufferProvider = bufferProvider;
         this.source = source;
         this.target = target;
+        this.provider = provider;
     }
 
     public JsonMergePatch calculateDiff() {
-        return new JsonMergePatchImpl(diff(source, target), bufferProvider);
+        return new JsonMergePatchImpl(diff(source, target), bufferProvider, provider);
     }
 
     private JsonValue diff(JsonValue source, JsonValue target) {
-        JsonObjectBuilder builder = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, RejectDuplicateKeysMode.DEFAULT);
+        JsonObjectBuilder builder = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, RejectDuplicateKeysMode.DEFAULT, provider);
 
         if (isJsonObject(source) && isJsonObject(target)) {
             JsonObject srcObj = source.asJsonObject();
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java
index 8a4065b..a974cca 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java
@@ -31,10 +31,13 @@
 public class JsonMergePatchImpl implements JsonMergePatch, Serializable {
     private JsonValue patch;
     private BufferStrategy.BufferProvider<char[]> bufferProvider;
+    private JsonProviderImpl provider;
 
-    public JsonMergePatchImpl(final JsonValue patch, final BufferStrategy.BufferProvider<char[]> bufferProvider) {
+    public JsonMergePatchImpl(final JsonValue patch, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+                              final JsonProviderImpl provider) {
         this.patch = patch;
         this.bufferProvider = bufferProvider;
+        this.provider = provider;
     }
 
     @Override
@@ -51,14 +54,14 @@
 
             return applyJsonObjectPatch(valueToApplyPatchOn.asJsonObject(), patchObject);
         } else {
-            // this must be a native JsonValue or JsonObject, so we just replace the
+            // this must be a native JsonValue or JsonObject, so we just replace
             // the whole original valueToApplyPatchOn with the new jsonValue
             return patch;
         }
     }
 
     private JsonValue applyJsonObjectPatch(JsonObject jsonObject, JsonObject patch) {
-        JsonObjectBuilder builder = new JsonObjectBuilderImpl(jsonObject, bufferProvider, RejectDuplicateKeysMode.DEFAULT);
+        JsonObjectBuilder builder = new JsonObjectBuilderImpl(jsonObject, bufferProvider, RejectDuplicateKeysMode.DEFAULT, provider);
 
         for (Map.Entry<String, JsonValue> patchAttrib : patch.entrySet()) {
             String attribName = patchAttrib.getKey();
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
index 8513a0e..e5ebebd 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
@@ -22,13 +22,15 @@
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.function.Consumer;
 
 final class JsonNumberImpl implements JsonNumber, Serializable {
     private final BigDecimal value;
     private transient Integer hashCode = null;
-    private static final int MAX_BIG_DECIMAL_SCALE = toInt(System.getProperty("johnzon.max-big-decimal-scale", "1000"));
+    private transient Consumer<BigDecimal> maxBigDecimalScale = (bigDecimal) -> {}; // for deserialization?
 
-    JsonNumberImpl(final BigDecimal decimal) {
+    JsonNumberImpl(final BigDecimal decimal, final Consumer<BigDecimal> maxBigDecimalScale) {
+        this.maxBigDecimalScale = maxBigDecimalScale;
         if (decimal == null) {
             throw new NullPointerException("decimal must not be null");
         }
@@ -70,13 +72,13 @@
 
     @Override
     public BigInteger bigIntegerValue() {
-        checkBigDecimalScale();
+        maxBigDecimalScale.accept(value);
         return value.toBigInteger();
     }
 
     @Override
     public BigInteger bigIntegerValueExact() {
-        checkBigDecimalScale();
+        maxBigDecimalScale.accept(value);
         return value.toBigIntegerExact();
     }
 
@@ -121,20 +123,4 @@
         }
     }
 
-    private void checkBigDecimalScale() {
-        // should be fine enough. Maybe we should externalize so users can pick something better if they need to
-        // it becomes their responsibility to fix the limit and may expose them to a DoS attack
-        final int limit = MAX_BIG_DECIMAL_SCALE;
-        final int absScale = Math.abs(value.scale());
-
-        if (absScale > limit) {
-            throw new ArithmeticException(String.format(
-                "BigDecimal scale (%d) limit exceeds maximum allowed (%d)",
-                value.scale(), limit));
-        }
-    }
-
-    private static Integer toInt(final Object v) {
-        return !Integer.class.isInstance(v) ? Integer.parseInt(v.toString()) : Integer.class.cast(v);
-    }
 }
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
index ae690f9..ed0b0ea 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
@@ -37,6 +37,7 @@
 
 class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
     private RejectDuplicateKeysMode rejectDuplicateKeysMode;
+    private JsonProviderImpl provider;
     private BufferStrategy.BufferProvider<char[]> bufferProvider;
     private Map<String, JsonValue> attributeMap = new LinkedHashMap<>();
 
@@ -46,17 +47,21 @@
 
     public JsonObjectBuilderImpl(final JsonObject initialData,
                                  final BufferStrategy.BufferProvider<char[]> bufferProvider,
-                                 final RejectDuplicateKeysMode rejectDuplicateKeysMode) {
+                                 final RejectDuplicateKeysMode rejectDuplicateKeysMode,
+                                 final JsonProviderImpl provider) {
         this.bufferProvider = bufferProvider;
         this.rejectDuplicateKeysMode = rejectDuplicateKeysMode;
+        this.provider = provider;
         this.attributeMap = new LinkedHashMap<>(initialData);
     }
 
     public JsonObjectBuilderImpl(final Map<String, Object> initialValues,
                                  final BufferStrategy.BufferProvider<char[]> bufferProvider,
-                                 final RejectDuplicateKeysMode rejectDuplicateKeysMode) {
+                                 final RejectDuplicateKeysMode rejectDuplicateKeysMode,
+                                 final JsonProviderImpl provider) {
         this.bufferProvider = bufferProvider;
         this.rejectDuplicateKeysMode = rejectDuplicateKeysMode;
+        this.provider = provider;
         if (!initialValues.isEmpty()) {
             for (Map.Entry<String, Object> entry : initialValues.entrySet()) {
                 add(entry.getKey(), entry.getValue());
@@ -88,12 +93,12 @@
         } else if (value == null) {
             addNull(name);
         } else if (value instanceof Map) {
-            add(name, new JsonObjectBuilderImpl(Map.class.cast(value), bufferProvider, rejectDuplicateKeysMode).build());
+            add(name, new JsonObjectBuilderImpl(Map.class.cast(value), bufferProvider, rejectDuplicateKeysMode, provider).build());
         } else if (value instanceof Collection) {
-            add(name, new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider, rejectDuplicateKeysMode).build());
+            add(name, new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider, rejectDuplicateKeysMode, provider).build());
         } else if (value.getClass().isArray()) {
             final Collection<Object> collection = ArrayUtil.newCollection(value);
-            add(name, new JsonArrayBuilderImpl(collection, bufferProvider, rejectDuplicateKeysMode).build());
+            add(name, new JsonArrayBuilderImpl(collection, bufferProvider, rejectDuplicateKeysMode, provider).build());
         } else {
             throw new JsonException("Illegal JSON type! name=" + name + " type=" + value.getClass());
         }
@@ -113,13 +118,13 @@
 
     @Override
     public JsonObjectBuilder add(final String name, final BigInteger value) {
-        putValue(name, new JsonNumberImpl(new BigDecimal(value)));
+        putValue(name, new JsonNumberImpl(new BigDecimal(value), provider::checkBigDecimalScale));
         return this;
     }
 
     @Override
     public JsonObjectBuilder add(final String name, final BigDecimal value) {
-        putValue(name, new JsonNumberImpl(value));
+        putValue(name, new JsonNumberImpl(value, provider::checkBigDecimalScale));
         return this;
     }
 
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
index 50e7726..fb961b8 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
@@ -53,9 +53,11 @@
     private final boolean supportsComments;
     private final boolean autoAdjustBuffers;
     private final Charset defaultEncoding;
+    private final JsonProviderImpl provider;
 
-    JsonParserFactoryImpl(final Map<String, ?> config) {
+    JsonParserFactoryImpl(final Map<String, ?> config, final JsonProviderImpl provider) {
         super(config, SUPPORTED_CONFIG_KEYS, null);
+        this.provider = provider;
 
         final int bufferSize = getInt(BUFFER_LENGTH, DEFAULT_BUFFER_LENGTH);
         if (bufferSize <= 0) {
@@ -79,26 +81,26 @@
             return getDefaultJsonParserImpl(in, defaultEncoding);
         }
         if (supportsComments) {
-            return new CommentsJsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers);
+            return new CommentsJsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider);
         }
         //UTF Auto detection RFC 4627
-        return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers);
+        return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider);
     }
 
     private JsonStreamParserImpl getDefaultJsonParserImpl(final InputStream in, final Charset charset) {
         if (supportsComments) {
-            return new CommentsJsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers);
+            return new CommentsJsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider);
         }
         //use provided charset
-        return new JsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers);
+        return new JsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider);
     }
 
     private JsonStreamParserImpl getDefaultJsonParserImpl(final Reader in) {
         if (supportsComments) {
-            return new CommentsJsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers);
+            return new CommentsJsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider);
         }
         //no charset necessary
-        return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers);
+        return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider);
     }
 
     @Override
@@ -119,13 +121,13 @@
     @Override
     public JsonParser createParser(final JsonObject obj) {
         // no need of a comment version since JsonObject has no comment event
-        return new JsonInMemoryParser(obj, bufferProvider);
+        return new JsonInMemoryParser(obj, bufferProvider, provider);
     }
 
     @Override
     public JsonParser createParser(final JsonArray array) {
         // no need of a comment version since JsonObject has no comment event
-        return new JsonInMemoryParser(array, bufferProvider);
+        return new JsonInMemoryParser(array, bufferProvider, provider);
     }
 
     @Override
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
index dc664fe..31dd7e1 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
@@ -57,12 +57,13 @@
         BufferStrategyFactory.valueOf(System.getProperty(AbstractJsonFactory.BUFFER_STRATEGY, "QUEUE"))
             .newCharProvider(Integer.getInteger("org.apache.johnzon.default-char-provider.length", 1024)));
 
-    private final JsonReaderFactory readerFactory = new JsonReaderFactoryImpl(null);
-    private final JsonParserFactory parserFactory = new JsonParserFactoryImpl(null);
+    private final JsonReaderFactory readerFactory = new JsonReaderFactoryImpl(null, this);
+    private final JsonParserFactory parserFactory = new JsonParserFactoryImpl(null, this);
     private final JsonGeneratorFactory generatorFactory = new JsonGeneratorFactoryImpl(null);
     private final JsonWriterFactory writerFactory = new JsonWriterFactoryImpl(null);
     private final Supplier<JsonBuilderFactory> builderFactory = new Cached<>(() ->
-            new JsonBuilderFactoryImpl(null, bufferProvider.get(), RejectDuplicateKeysMode.DEFAULT));
+            new JsonBuilderFactoryImpl(null, bufferProvider.get(), RejectDuplicateKeysMode.DEFAULT, this));
+    private int maxBigDecimalScale = Integer.getInteger("johnzon.max-big-decimal-scale", 1_000);
     @Override
     public JsonParser createParser(final InputStream in) {
         return parserFactory.createParser(in);
@@ -85,12 +86,12 @@
 
     @Override
     public JsonParserFactory createParserFactory(final Map<String, ?> config) {
-        return (config == null || config.isEmpty()) ? parserFactory : new JsonParserFactoryImpl(config);
+        return (config == null || config.isEmpty()) ? parserFactory : new JsonParserFactoryImpl(config, this);
     }
 
     @Override
     public JsonReaderFactory createReaderFactory(final Map<String, ?> config) {
-        return (config == null || config.isEmpty()) ? readerFactory : new JsonReaderFactoryImpl(config);
+        return (config == null || config.isEmpty()) ? readerFactory : new JsonReaderFactoryImpl(config, this);
     }
 
     @Override
@@ -175,19 +176,19 @@
 
     @Override
     public JsonNumber createValue(final BigDecimal value) {
-        return new JsonNumberImpl(value);
+        return new JsonNumberImpl(value, this::checkBigDecimalScale);
     }
 
     @Override
     public JsonNumber createValue(final BigInteger value) {
-        return new JsonNumberImpl(new BigDecimal(value.toString()));
+        return new JsonNumberImpl(new BigDecimal(value.toString()), this::checkBigDecimalScale);
     }
 
     @Override
     public JsonBuilderFactory createBuilderFactory(final Map<String, ?> config) {
         final JsonBuilderFactory builderFactory = this.builderFactory.get();
         return (config == null || config.isEmpty()) ?
-                builderFactory : new JsonBuilderFactoryImpl(config, bufferProvider.get(), RejectDuplicateKeysMode.from(config));
+                builderFactory : new JsonBuilderFactoryImpl(config, bufferProvider.get(), RejectDuplicateKeysMode.from(config), this);
     }
 
     @Override
@@ -217,12 +218,20 @@
 
     @Override
     public JsonMergePatch createMergePatch(JsonValue patch) {
-        return new JsonMergePatchImpl(patch, bufferProvider.get());
+        return new JsonMergePatchImpl(patch, bufferProvider.get(), this);
     }
 
     @Override
     public JsonMergePatch createMergeDiff(JsonValue source, JsonValue target) {
-        return new JsonMergePatchDiff(source, target, bufferProvider.get()).calculateDiff();
+        return new JsonMergePatchDiff(source, target, bufferProvider.get(), this).calculateDiff();
+    }
+
+    public int getMaxBigDecimalScale() {
+        return maxBigDecimalScale;
+    }
+
+    public void setMaxBigDecimalScale(final int maxBigDecimalScale) {
+        this.maxBigDecimalScale = maxBigDecimalScale;
     }
 
     /**
@@ -249,4 +258,17 @@
             return computed;
         }
     }
+
+    public void checkBigDecimalScale(final BigDecimal value) {
+        // should be fine enough. Maybe we should externalize so users can pick something better if they need to
+        // it becomes their responsibility to fix the limit and may expose them to a DoS attack
+        final int limit = maxBigDecimalScale;
+        final int absScale = Math.abs(value.scale());
+
+        if (absScale > limit) {
+            throw new ArithmeticException(String.format(
+                "BigDecimal scale (%d) limit exceeds maximum allowed (%d)",
+                value.scale(), limit));
+        }
+    }
 }
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
index a9b2a31..cd1081e 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
@@ -34,33 +34,35 @@
 
     private final JsonParserFactoryImpl parserFactory;
     private final RejectDuplicateKeysMode rejectDuplicateKeys;
+    private JsonProviderImpl provider;
 
-    JsonReaderFactoryImpl(final Map<String, ?> config) {
+    JsonReaderFactoryImpl(final Map<String, ?> config, final JsonProviderImpl provider) {
         super(config, SUPPORTED_CONFIG_KEYS, JsonParserFactoryImpl.SUPPORTED_CONFIG_KEYS);
+        this.provider = provider;
         if (!internalConfig.isEmpty()) {
             RejectDuplicateKeysMode.CONFIG_KEYS.forEach(internalConfig::remove);
         }
-        this.parserFactory = new JsonParserFactoryImpl(internalConfig);
+        this.parserFactory = new JsonParserFactoryImpl(internalConfig, provider);
         this.rejectDuplicateKeys = RejectDuplicateKeysMode.from(config);
     }
 
     @Override
     public JsonReader createReader(final Reader reader) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(reader), parserFactory.getValueBufferProvider(), rejectDuplicateKeys);
+        return new JsonReaderImpl(parserFactory.createInternalParser(reader), parserFactory.getValueBufferProvider(), rejectDuplicateKeys, provider);
     }
 
     @Override
     public JsonReader createReader(final InputStream in) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(in), parserFactory.getValueBufferProvider(), rejectDuplicateKeys);
+        return new JsonReaderImpl(parserFactory.createInternalParser(in), parserFactory.getValueBufferProvider(), rejectDuplicateKeys, provider);
     }
 
     @Override
     public JsonReader createReader(final InputStream in, final Charset charset) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(in, charset), parserFactory.getValueBufferProvider(), rejectDuplicateKeys);
+        return new JsonReaderImpl(parserFactory.createInternalParser(in, charset), parserFactory.getValueBufferProvider(), rejectDuplicateKeys, provider);
     }
 
     public JsonReader createReader(final JsonParser parser) {
-        return new JsonReaderImpl(parser, parserFactory.getValueBufferProvider(), rejectDuplicateKeys);
+        return new JsonReaderImpl(parser, parserFactory.getValueBufferProvider(), rejectDuplicateKeys, provider);
     }
 
     @Override
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
index b7046c5..b615892 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
@@ -36,14 +36,15 @@
 public class JsonReaderImpl implements JsonReader {
     private final JohnzonJsonParser parser;
     private final BufferStrategy.BufferProvider<char[]> bufferProvider;
+    private JsonProviderImpl provider;
     private final RejectDuplicateKeysMode rejectDuplicateKeysMode;
     private boolean closed = false;
 
     private boolean subStreamReader;
 
     public JsonReaderImpl(final JsonParser parser, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-                          final RejectDuplicateKeysMode rejectDuplicateKeysMode) {
-        this(parser, false, bufferProvider, rejectDuplicateKeysMode);
+                          final RejectDuplicateKeysMode rejectDuplicateKeysMode, final JsonProviderImpl provider) {
+        this(parser, false, bufferProvider, rejectDuplicateKeysMode, provider);
     }
 
     /**
@@ -54,8 +55,9 @@
      */
     public JsonReaderImpl(final JsonParser parser, boolean subStreamReader,
                           final BufferStrategy.BufferProvider<char[]> bufferProvider,
-                          final RejectDuplicateKeysMode rejectDuplicateKeys) {
+                          final RejectDuplicateKeysMode rejectDuplicateKeys, final JsonProviderImpl provider) {
         this.bufferProvider = bufferProvider;
+        this.provider = provider;
         if (parser instanceof JohnzonJsonParser) {
             this.parser = (JohnzonJsonParser) parser;
         } else {
@@ -89,14 +91,14 @@
 
         switch (next) {
             case START_OBJECT:
-                final JsonObjectBuilder objectBuilder = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode);
+                final JsonObjectBuilder objectBuilder = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode, provider);
                 parseObject(objectBuilder);
                 if (!subStreamReader && parser.hasNext()) {
                     throw new JsonParsingException("Expected end of file", parser.getLocation());
                 }
                 return objectBuilder.build();
             case START_ARRAY:
-                final JsonArrayBuilder arrayBuilder = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode);
+                final JsonArrayBuilder arrayBuilder = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode, provider);
                 parseArray(arrayBuilder);
                 if (!subStreamReader && parser.hasNext()) {
                     throw new JsonParsingException("Expected end of file", parser.getLocation());
@@ -128,7 +130,7 @@
                 if (parser.isFitLong()) {
                     number = new JsonLongImpl(parser.getLong());
                 } else {
-                    number = new JsonNumberImpl(parser.getBigDecimal());
+                    number = new JsonNumberImpl(parser.getBigDecimal(), provider::checkBigDecimalScale);
                 }
                 if (!subStreamReader && parser.hasNext()) {
                     throw new JsonParsingException("Expected end of file", parser.getLocation());
@@ -182,13 +184,13 @@
                     break;
 
                 case START_OBJECT:
-                    JsonObjectBuilder subObject = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode);
+                    JsonObjectBuilder subObject = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode, provider);
                     parseObject(subObject);
                     builder.add(key, subObject);
                     break;
 
                 case START_ARRAY:
-                    JsonArrayBuilder subArray = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode);
+                    JsonArrayBuilder subArray = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode, provider);
                     parseArray(subArray);
                     builder.add(key, subArray);
                     break;
@@ -197,7 +199,7 @@
                     if (parser.isIntegralNumber() && parser.isNotTooLong()) {
                         builder.add(key, new JsonLongImpl(parser.getLong()));
                     } else {
-                        builder.add(key, new JsonNumberImpl(parser.getBigDecimal()));
+                        builder.add(key, new JsonNumberImpl(parser.getBigDecimal(), provider::checkBigDecimalScale));
                     }
                     break;
 
@@ -237,19 +239,19 @@
                     if (parser.isFitLong()) {
                         builder.add(new JsonLongImpl(parser.getLong()));
                     } else {
-                        builder.add(new JsonNumberImpl(parser.getBigDecimal()));
+                        builder.add(new JsonNumberImpl(parser.getBigDecimal(), provider::checkBigDecimalScale));
                     }
                     break;
 
                 case START_OBJECT:
-                    JsonObjectBuilder subObject = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode);
+                    JsonObjectBuilder subObject = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode, provider);
                     parseObject(subObject);
                     builder.add(subObject);
                     break;
 
                 case START_ARRAY:
                     JsonArrayBuilder subArray = null;
-                    parseArray(subArray = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode));
+                    parseArray(subArray = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode, provider));
                     builder.add(subArray);
                     break;
 
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
index 2ad2c2e..8468f3e 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
@@ -118,29 +118,30 @@
     //detect charset according to RFC 4627
     public JsonStreamParserImpl(final InputStream inputStream, final int maxStringLength,
                                 final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer,
-                                final boolean autoAdjust) {
+                                final boolean autoAdjust, final JsonProviderImpl provider) {
 
-        this(inputStream, null, null, maxStringLength, bufferProvider, valueBuffer, autoAdjust);
+        this(inputStream, null, null, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider);
     }
 
     //use charset provided
     public JsonStreamParserImpl(final InputStream inputStream, final Charset encoding, final int maxStringLength,
                                 final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer,
-                                final boolean autoAdjust) {
+                                final boolean autoAdjust, final JsonProviderImpl provider) {
 
-        this(inputStream, null, encoding, maxStringLength, bufferProvider, valueBuffer, autoAdjust);
+        this(inputStream, null, encoding, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider);
     }
 
     public JsonStreamParserImpl(final Reader reader, final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-                                final BufferStrategy.BufferProvider<char[]> valueBuffer, final boolean autoAdjust) {
+                                final BufferStrategy.BufferProvider<char[]> valueBuffer, final boolean autoAdjust, final JsonProviderImpl provider) {
 
-        this(null, reader, null, maxStringLength, bufferProvider, valueBuffer, autoAdjust);
+        this(null, reader, null, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider);
     }
 
     private JsonStreamParserImpl(final InputStream inputStream, final Reader reader, final Charset encoding, final int maxStringLength,
                                  final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer,
-                                 final boolean autoAdjust) {
+                                 final boolean autoAdjust, final JsonProviderImpl provider) {
 
+        super(provider);
         this.autoAdjust = autoAdjust;
         this.maxValueLength = maxStringLength <= 0 ? 8192 : maxStringLength;
         this.fallBackCopyBuffer = valueBuffer.newBuffer();
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
index 334a142..77d2866 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
@@ -77,7 +77,7 @@
     @Test
     public void testSlowBigIntegerConversion() {
         JsonArray array = Json.createArrayBuilder()
-                              .add(new BigDecimal("1000000000e1000"))
+                              .add(new BigDecimal("1e1000")) // 1e20000000 --> lost of damage
                               .add(Double.MAX_VALUE)
                               .build();
 
@@ -85,7 +85,7 @@
             long start = System.nanoTime();
             for (int i = 1; i < 5; i++) {
                 // if it takes a few seconds in any machine, that's already too much
-                if (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) > (3 * i)) {
+                if (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) > 1) {
                     fail("took too long: " + TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) + " s" +
                          " to compute " + i + " conversions toBigInteger");
                 }
@@ -101,7 +101,7 @@
             for (int i = 1; i < 100; i++) {
                 // if it takes a second in any machine, that's already too much
                 // depends on the allowed scale in JsonNumberImpl#checkBigDecimalScale
-                if (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) > (30 * i)) {
+                if (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) > 1) {
                     fail("took too long: " + TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) + " s" +
                          " to compute " + i + " conversions toBigInteger");
                 }
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserStreamingTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserStreamingTest.java
index 19ff327..9ffbcc5 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserStreamingTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserStreamingTest.java
@@ -49,7 +49,8 @@
 
         final BufferStrategy.BufferProvider<char[]> bs = BufferStrategyFactory.valueOf("QUEUE").newCharProvider(len);
         try (final InputStream stream = new ByteArrayInputStream(bytes);
-                final JsonStreamParserImpl impl = new JsonStreamParserImpl(stream, len, bs, bs, false)) {
+                final JsonStreamParserImpl impl = new JsonStreamParserImpl(stream, len, bs, bs, false,
+                                                               (JsonProviderImpl) JsonProviderImpl.provider())) {
 
             while (impl.hasNext()) {
                 impl.next();
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
index c2e8b5e..d01c499 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
@@ -355,10 +355,10 @@
     public void simpleInMemory() {
         final JsonObjectBuilder ob = Json.createObjectBuilder();
         ob.add("a", new JsonStringImpl("b"));
-        ob.add("c", new JsonNumberImpl(new BigDecimal(4)));
+        ob.add("c", new JsonNumberImpl(new BigDecimal(4), ((JsonProviderImpl)JsonProviderImpl.provider())::checkBigDecimalScale));
         JsonArrayBuilder ab = Json.createArrayBuilder();
-        ab.add(new JsonNumberImpl(new BigDecimal(1)));
-        ab.add(new JsonNumberImpl(new BigDecimal(-2)));
+        ab.add(new JsonNumberImpl(new BigDecimal(1), ((JsonProviderImpl)JsonProviderImpl.provider())::checkBigDecimalScale));
+        ab.add(new JsonNumberImpl(new BigDecimal(-2), ((JsonProviderImpl)JsonProviderImpl.provider())::checkBigDecimalScale));
         
         ob.add("d", ab);
         ob.add ("e", Json.createObjectBuilder()
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonStreamParserImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonStreamParserImplTest.java
index 77efec5..2440650 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonStreamParserImplTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonStreamParserImplTest.java
@@ -35,9 +35,9 @@
     @Test
     public void ensureNoArrayBoundErrorWhenOverflow() throws IOException {
         final String json = new JsonObjectBuilderImpl(
-                emptyMap(),
-                BufferStrategyFactory.valueOf("QUEUE").newCharProvider(100),
-                RejectDuplicateKeysMode.TRUE)
+            emptyMap(),
+            BufferStrategyFactory.valueOf("QUEUE").newCharProvider(100),
+            RejectDuplicateKeysMode.TRUE, (JsonProviderImpl) JsonProviderImpl.provider())
                 .add("content", "{\"foo\":\"barbar\\barbarbar\"}")
                 .build()
                 .toString();
@@ -46,7 +46,7 @@
                 10,
                 BufferStrategyFactory.valueOf("QUEUE").newCharProvider(10),
                 BufferStrategyFactory.valueOf("QUEUE").newCharProvider(10),
-                true);
+                true, (JsonProviderImpl) JsonProviderImpl.provider());
         final List<String> events = new ArrayList<>();
         while (parser.hasNext()) {
             final JsonParser.Event event = parser.next();
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
index 633d9d3..3a19b19 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
@@ -52,7 +52,8 @@
 
     @Test
     public void jsonNumber() throws IOException, ClassNotFoundException {
-        final JsonNumber source = new JsonNumberImpl(new BigDecimal("1.0"));
+        final JsonNumber source = new JsonNumberImpl(new BigDecimal("1.0"),
+                                                     ((JsonProviderImpl) JsonProviderImpl.provider())::checkBigDecimalScale);
         final JsonNumber deserialized = serialDeser(source);
         assertNotSame(source, deserialized);
         assertEquals(1.0, deserialized.doubleValue(), 0.);
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index 3275da0..9f364aa 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -109,10 +109,8 @@
         final boolean skipCdi = shouldSkipCdi();
 
         // todo: global spec toggle to disable all these ones at once?
-        builder.setUseBigDecimalForObjectNumbers(
-            config.getProperty("johnzon.use-big-decimal-for-object").map(this::toBool).orElse(true));
-        builder.setMaxBigDecimalScale(
-            config.getProperty("johnzon.max-big-decimal-scale").map(this::toInt).orElse(1000));
+        builder.setUseBigDecimalForObjectNumbers(config.getProperty("johnzon.use-big-decimal-for-object").map(this::toBool).orElse(true));
+        builder.setMaxBigDecimalScale(config.getProperty("johnzon.max-big-decimal-scale").map(this::toInt).orElse(1000));
 
         builder.setSupportEnumContainerDeserialization( // https://github.com/eclipse-ee4j/jakartaee-tck/issues/103
                 toBool(System.getProperty("johnzon.support-enum-container-deserialization", config.getProperty("johnzon.support-enum-container-deserialization")
@@ -286,10 +284,8 @@
             getBeanManager(); // force detection
         }
 
-        builder.setReadAttributeBeforeWrite(
-                config.getProperty("johnzon.readAttributeBeforeWrite").map(Boolean.class::cast).orElse(false));
-        builder.setAutoAdjustStringBuffers(
-                config.getProperty("johnzon.autoAdjustBuffer").map(Boolean.class::cast).orElse(true));
+        builder.setReadAttributeBeforeWrite(config.getProperty("johnzon.readAttributeBeforeWrite").map(Boolean.class::cast).orElse(false));
+        builder.setAutoAdjustStringBuffers(config.getProperty("johnzon.autoAdjustBuffer").map(Boolean.class::cast).orElse(true));
         config.getProperty("johnzon.serialize-value-filter")
                 .map(s -> {
                     if (String.class.isInstance(s)) {
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
index 0314e86..c942953 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
@@ -169,7 +169,7 @@
                                 new FieldAccessMode(true, true),
                                 StandardCharsets.UTF_8,
                                 null,
-                                false, null, false, false, emptyMap(), true, false, true,
+                                false, null, false, false, emptyMap(), true, false, 1000, true,
                                 null, null, null, null, null,
                                 type -> new EnumConverter(type));
     }
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
index 2a8be6c..70308fa 100644
--- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
+++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
@@ -62,7 +62,7 @@
                     -1, true, true, true, false, false, false,
                     new FieldAccessMode(false, false),
                     StandardCharsets.UTF_8, String::compareTo, false, null, false, false,
-                    emptyMap(), true, false, true, null,
+                    emptyMap(), true, false, 1000, true, null,
                     null, null, null, null,
                     type -> new EnumConverter(type)));
         }