diff --git a/IPA.Loader/IConfigProvider.cs b/IPA.Loader/IConfigProvider.cs
new file mode 100644
index 00000000..9681c262
--- /dev/null
+++ b/IPA.Loader/IConfigProvider.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IPA
+{
+ ///
+ /// An interface for configuration providers.
+ ///
+ public interface IConfigProvider
+ {
+ ///
+ /// Loads the data provided by this into an object of type .
+ ///
+ /// the type of the object to parse into
+ /// the values from the config provider parsed into the object
+ T Parse();
+ ///
+ /// Stores the data from into the .
+ ///
+ ///
+ /// NOTE TO IMPLEMENTERS:
+ /// Since is bundled with this library, try to include support for its attributes.
+ ///
+ /// the type of
+ /// the object containing the data to save
+ void Store(T obj);
+
+ #region Getters
+ ///
+ /// Gets the acting as a sub-object for a given key.
+ ///
+ /// the name of the field with the
+ /// an accessor for the selected sub-object
+ IConfigProvider GetSubObject(string name);
+ ///
+ /// Gets the value of type for key .
+ ///
+ ///
+ /// If is , behavior should be identical to .
+ ///
+ /// the type of the value to get
+ /// the name of the field to get the value of
+ /// the value of the field
+ T Get(string name); // can be IConfigProvider
+ ///
+ /// The non-generic version of .
+ /// If key corresponds to a sub-object, will return an .
+ ///
+ /// the name of the field to get the value of
+ /// the value of the field
+ object Get(string name); // can return IConfigProvider
+ ///
+ /// Gets the value of type of the element at .
+ ///
+ ///
+ /// If is , behavior should be identical to if it were executed on the immediate parent of the target element.
+ ///
+ /// the type of the value to get
+ /// an ordered array specifying keys starting from the root (this)
+ /// the value at path
+ T GetPath(params string[] path);
+ ///
+ /// The non-generic version of .
+ /// If key corresponds to a sub-object, will return an .
+ ///
+ /// an ordered array specifying keys starting from the root (this)
+ /// the value at path
+ object GetPath(params string[] path);
+ #endregion
+
+ #region Setters
+ ///
+ /// Sets the object for key '' to .
+ ///
+ /// the key to set it as
+ /// the provider value
+ void SetSubObject(string name, IConfigProvider provider); // argument should be same provider type
+ ///
+ /// Sets the value for key to .
+ ///
+ ///
+ /// If is , behavior should be identical to .
+ ///
+ /// the type of the value to set
+ /// the key
+ /// the value to set
+ void Set(string name, T value);
+ ///
+ /// Sets the value for path to .
+ ///
+ ///
+ /// If is , behavior should be identical to if it were executed on the immediate parent of the target element.
+ ///
+ /// the type of the value to set
+ /// the path to the new value location
+ /// the value to set
+ void SetPath(string[] path, T value);
+ #endregion
+ }
+}
diff --git a/IPA.Loader/IPA.Loader.csproj b/IPA.Loader/IPA.Loader.csproj
index 21b93128..b8a4621d 100644
--- a/IPA.Loader/IPA.Loader.csproj
+++ b/IPA.Loader/IPA.Loader.csproj
@@ -55,6 +55,7 @@
+