# How to add a new field in 8.3 and propagate default value in existing records?

**URL:** <https://forum.inductiveautomation.com/t/how-to-add-a-new-field-in-8-3-and-propagate-default-value-in-existing-records/115555>\
**Category:** Module Development\
**Tags:** ignition83\
**Created:** [May 15, 2026, 4:18pm UTC](https://forum.inductiveautomation.com/t/how-to-add-a-new-field-in-8-3-and-propagate-default-value-in-existing-records/115555 "2026-05-15T16:18:43Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Eden.Mar](https://avatars.discourse-cdn.com/v4/letter/e/35a633/32.png) [@Eden.Mar](https://forum.inductiveautomation.com/u/Eden.Mar)\
**Post date:** [May 15, 2026, 4:18pm UTC](https://forum.inductiveautomation.com/t/how-to-add-a-new-field-in-8-3-and-propagate-default-value-in-existing-records/115555/1 "2026-05-15T16:18:43Z")

</div>

I'm trying to add a new boolean field to a device config record. I'd like this field to have a default value of true for existing devices. When creating a new device, I'm not passing the device config record as a parameter, I'm passing an interface, which I've made my record implement, so I'm grabbing the value using a method like

> boolean isEnabled() {
> 
> ```
> return category.newfield
> 
> ```
> 
> }

If I'm creating a new device with this field, the new record gets created with newfield, there's no problem. Surprisingly, this returns a false for existing records, which makes a kind of sense, newfield doesn't exist in that record. Is there a way for me to detect whether newfield exists on an existing record without diving into the resource folder? For example, if I wanted to add a new column in a PersistentRecord in 8.1, I think I just needed to define the field with a default and that was it.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [May 15, 2026, 4:38pm UTC](https://forum.inductiveautomation.com/t/how-to-add-a-new-field-in-8-3-and-propagate-default-value-in-existing-records/115555/2 "2026-05-15T16:38:17Z")

</div>

ExtensionPoints have a `getSettingsUpgrader()` method on them you could use for this.

e.g.

```java
public record WidgetConfig(String name, int width, boolean enabled) {

    /**
     * Upgrade a WidgetConfig JSON object: existing records that predate the
     * "enabled" field should default to true.
     */
    public static JsonElement upgrade(JsonElement configJson) {
        if (configJson instanceof JsonObject obj && !obj.has("enabled")) {
            obj.addProperty("enabled", true);
        }
        return configJson;
    }
}

```

and in the ExtensionPoint:

```java
@Override
public Optional<JsonSettingsUpgrader> getSettingsUpgrader() {
    return Optional.of(WidgetConfig::upgrade);
}

```

Keep the upgrade method idempotent since it runs on every load; introduce a `configVersion` field or something once the upgrade logic gets complex enough that idempotency is hard to guarantee.

---

<div class="post-metadata">

**Author:** ![Eden.Mar](https://avatars.discourse-cdn.com/v4/letter/e/35a633/32.png) [@Eden.Mar](https://forum.inductiveautomation.com/u/Eden.Mar)\
**Post date:** [May 19, 2026, 3:30pm UTC](https://forum.inductiveautomation.com/t/how-to-add-a-new-field-in-8-3-and-propagate-default-value-in-existing-records/115555/3 "2026-05-19T15:30:53Z")

</div>

Thanks Kevin, that did the trick. For anyone following up, these methods are available starting in the 8.3.3 API. The methods here don't write the new setting to disk, but they do appear to inject the new property into the json object before it's used anywhere.
