diff --git a/features/versioned/pom.xml b/features/versioned/pom.xml
new file mode 100644
index 0000000..1b40382
--- /dev/null
+++ b/features/versioned/pom.xml
@@ -0,0 +1,51 @@
+
+
+ 4.0.0
+
+ cc.carm.lib
+ easyconfiguration-parent
+ 3.9.1
+ ../../pom.xml
+
+
+ ${project.jdk.version}
+ ${project.jdk.version}
+ UTF-8
+ UTF-8
+
+
+ easyconfiguration-feature-versioned
+ jar
+
+
+
+ ${project.groupId}
+ easyconfiguration-core
+ ${project.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/features/versioned/src/main/java/cc/carm/lib/configuration/annotation/ConfigVersion.java b/features/versioned/src/main/java/cc/carm/lib/configuration/annotation/ConfigVersion.java
new file mode 100644
index 0000000..19ba260
--- /dev/null
+++ b/features/versioned/src/main/java/cc/carm/lib/configuration/annotation/ConfigVersion.java
@@ -0,0 +1,28 @@
+package cc.carm.lib.configuration.annotation;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Range;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * The version of specific {@link cc.carm.lib.configuration.value.ConfigValue}.
+ *
Used for versioning target field for rewrite/upgrade.
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ConfigVersion {
+
+ /**
+ * The version of the configuration field.
+ *
+ * @return the version of the configuration field
+ */
+ @Range(from = 0, to = Integer.MAX_VALUE)
+ int value() default 0;
+
+}
diff --git a/features/versioned/src/main/java/cc/carm/lib/configuration/commentable/VersionedMetaTypes.java b/features/versioned/src/main/java/cc/carm/lib/configuration/commentable/VersionedMetaTypes.java
new file mode 100644
index 0000000..5b77346
--- /dev/null
+++ b/features/versioned/src/main/java/cc/carm/lib/configuration/commentable/VersionedMetaTypes.java
@@ -0,0 +1,25 @@
+package cc.carm.lib.configuration.commentable;
+
+import cc.carm.lib.configuration.annotation.ConfigVersion;
+import cc.carm.lib.configuration.source.ConfigurationHolder;
+import cc.carm.lib.configuration.source.loader.ConfigurationInitializer;
+import cc.carm.lib.configuration.source.meta.ConfigurationMetadata;
+import org.jetbrains.annotations.NotNull;
+
+public interface VersionedMetaTypes {
+
+ /**
+ * The version of specific {@link cc.carm.lib.configuration.value.ConfigValue}.
+ *
Used for versioning target field for rewrite/upgrade.
+ */
+ ConfigurationMetadata VERSION = ConfigurationMetadata.of(0);
+
+ static void register(@NotNull ConfigurationHolder> provider) {
+ register(provider.initializer());
+ }
+
+ static void register(@NotNull ConfigurationInitializer initializer) {
+ initializer.registerAnnotation(ConfigVersion.class, VERSION, ConfigVersion::value);
+ }
+
+}
diff --git a/features/versioned/src/main/java/cc/carm/lib/configuration/option/VersionedOptions.java b/features/versioned/src/main/java/cc/carm/lib/configuration/option/VersionedOptions.java
new file mode 100644
index 0000000..4387206
--- /dev/null
+++ b/features/versioned/src/main/java/cc/carm/lib/configuration/option/VersionedOptions.java
@@ -0,0 +1,13 @@
+package cc.carm.lib.configuration.option;
+
+import cc.carm.lib.configuration.source.option.ConfigurationOption;
+
+public interface VersionedOptions {
+
+ /**
+ * Whether to set newer defaults when a {@link cc.carm.lib.configuration.value.ConfigValue}'s marked version
+ * is newer than the current in storage.
+ */
+ ConfigurationOption RESET_NEWER_DEFAULTS = ConfigurationOption.of(true);
+
+}
diff --git a/pom.xml b/pom.xml
index fcbba7f..5e691ce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,6 +20,7 @@
core
features/commentable
features/file
+ features/versioned
providers/yaml
providers/gson