diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java b/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java
new file mode 100644
index 000000000..a799a71ac
--- /dev/null
+++ b/common/implementation/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java
@@ -0,0 +1,59 @@
+package com.dfsek.terra.config.preprocessor;
+
+import com.dfsek.tectonic.config.Configuration;
+import com.dfsek.tectonic.exception.LoadException;
+import com.dfsek.tectonic.loading.ConfigLoader;
+import com.dfsek.tectonic.preprocessor.Result;
+import com.dfsek.terra.api.config.meta.Meta;
+import com.dfsek.terra.api.util.reflection.TypeKey;
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.AnnotatedType;
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MetaMapPreprocessor extends MetaPreprocessor {
+ public MetaMapPreprocessor(Map configs) {
+ super(configs);
+ }
+
+ private static final TypeKey> STRING_LIST = new TypeKey<>() {};
+ @SuppressWarnings("unchecked")
+ @Override
+ public @NotNull Result process(AnnotatedType t, T c, ConfigLoader loader, Meta annotation) {
+ if(t.getType() instanceof ParameterizedType) {
+ ParameterizedType parameterizedType = (ParameterizedType) t.getType();
+ if(parameterizedType.getRawType() instanceof Class) { // Should always be true but we check anyways
+ Class> baseClass = (Class>) parameterizedType.getRawType();
+
+ if(Map.class.isAssignableFrom(baseClass) && c instanceof Map) { // List metaconfig
+ Map