diff --git a/gson/src/main/java/de/neitzel/gson/config/JsonConfiguration.java b/gson/src/main/java/de/neitzel/gson/config/JsonConfiguration.java
new file mode 100644
index 0000000..ec43e0b
--- /dev/null
+++ b/gson/src/main/java/de/neitzel/gson/config/JsonConfiguration.java
@@ -0,0 +1,270 @@
+package de.neitzel.gson.config;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import lombok.Builder;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Represents a configuration utility class that manages application settings and allows
+ * loading and saving the configuration in JSON format. This class is built using Gson for
+ * JSON serialization and deserialization.
+ *
+ * The class maintains application settings in memory and provides methods to store
+ * the configuration on the filesystem and retrieve it as needed.
+ */
+@Builder(builderClassName = "ConfigurationBuilder")
+public class JsonConfiguration {
+
+ /**
+ * The name of the application.
+ * This variable is used to identify the application and is incorporated into various configurations,
+ * such as the naming of directories or files associated with the application's settings.
+ * It is finalized and set during the construction of the {@code JsonConfiguration} instance and cannot be changed afterward.
+ */
+ private final String appName;
+
+ /**
+ * The filesystem path representing the home directory utilized by the application.
+ * This directory serves as the location where application-specific configuration files
+ * and data are stored. The path is initialized when the {@code JsonConfiguration} instance
+ * is constructed, based on the settings provided through the {@code JsonConfigurationBuilder}.
+ * It can be customized to a user-specified value or defaults to the user's home directory.
+ *
+ * The {@code homeDir} variable is integral in determining the location of the main configuration
+ * file and other related resources used by the application.
+ */
+ private final String homeDir;
+
+ /**
+ * A map that stores configuration settings as key-value pairs,
+ * where both the keys and values are represented as strings.
+ *
+ * This map is used to manage dynamic or runtime settings for the configuration,
+ * allowing for flexible assignment and retrieval of values associated with specific
+ * configuration keys. It is initialized as a final instance, ensuring it cannot be
+ * reassigned after creation.
+ */
+ private final Map settings;
+
+ /**
+ * A Gson instance used for handling JSON serialization and deserialization within
+ * the JsonConfiguration class. This instance is immutable and customized with
+ * registered adapters during the initialization of the JsonConfiguration.
+ *
+ * The Gson object provides functionality for converting Java objects to JSON
+ * and vice versa. It supports complex serialization and deserialization
+ * workflows by leveraging adapters specified during the configuration phase.
+ *
+ * Adapters can be registered to customize the behavior of (de)serialization
+ * for specific types.
+ */
+ private final Gson gson;
+
+ /**
+ * Stores a key-value pair into the configuration settings.
+ * The value is serialized into a JSON string before being stored.
+ *
+ * @param key the key under which the value will be stored
+ * @param value the object to be associated with the specified key
+ */
+ public void set(String key, Object value) {
+ settings.put(key, gson.toJson(value));
+ }
+
+ /**
+ * Retrieves a value associated with the specified key from the configuration,
+ * deserializing it into the specified class type using Gson.
+ * If the key does not exist in the settings, the method returns {@code null}.
+ *
+ * @param the type of the object to be deserialized
+ * @param key the key corresponding to the value in the configuration
+ * @param clazz the {@code Class} object representing the expected type of the value
+ * @return the deserialized object of type {@code T}, or {@code null}
+ * if the key does not exist
+ */
+ public T get(String key, Class clazz) {
+ String json = settings.get(key);
+ return json != null ? gson.fromJson(json, clazz) : null;
+ }
+
+ /**
+ * Retrieves a value associated with the given key from the configuration as an object of the specified type.
+ * If the key does not exist in the configuration, the provided default value is returned.
+ *
+ * @param the type of the object to be returned
+ * @param key the key whose associated value is to be retrieved
+ * @param clazz the class of the object to deserialize the value into
+ * @param defaultValue the default value to return if the key does not exist or the value is null
+ * @return the value associated with the specified key, deserialized into the specified type,
+ * or the default value if the key does not exist or the value is null
+ */
+ public T get(String key, Class clazz, T defaultValue) {
+ String json = settings.get(key);
+ return json != null ? gson.fromJson(json, clazz) : defaultValue;
+ }
+
+ /**
+ * Loads the configuration data from the JSON configuration file located at the path
+ * determined by the {@code getConfigFilePath()} method.
+ * If the configuration file exists, its content is read and deserialized into a map
+ * of key-value pairs using Gson. The method clears the current settings and populates
+ * them with the loaded values.
+ *
+ * @throws IOException if an I/O error occurs while reading the configuration file
+ */
+ public void load() throws IOException {
+ Path configPath = getConfigFilePath();
+ if (Files.exists(configPath)) {
+ try (var reader = Files.newBufferedReader(configPath)) {
+ Map loaded = gson.fromJson(reader, new TypeToken