Index: /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.Designer.cs
===================================================================
--- /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.Designer.cs	(revision 1399)
+++ /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.Designer.cs	(revision 1400)
@@ -25,26 +25,36 @@
     private void InitializeComponent() {
       System.Windows.Forms.TabPage nullFormatterConfig;
-      System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("Bli");
-      System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("Bla");
-      System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("Blo");
-      this.dataGridView1 = new System.Windows.Forms.DataGridView();
-      this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
-      this.Column2 = new System.Windows.Forms.DataGridViewCheckBoxColumn();
-      this.Column3 = new System.Windows.Forms.DataGridViewComboBoxColumn();
+      System.Windows.Forms.DataGridView dataGridView1;
+      System.Windows.Forms.DataGridViewTextBoxColumn Column1;
+      System.Windows.Forms.DataGridViewCheckBoxColumn Column2;
+      System.Windows.Forms.DataGridViewComboBoxColumn Column3;
+      System.Windows.Forms.ListViewItem listViewItem16 = new System.Windows.Forms.ListViewItem("Bli");
+      System.Windows.Forms.ListViewItem listViewItem17 = new System.Windows.Forms.ListViewItem("Bla");
+      System.Windows.Forms.ListViewItem listViewItem18 = new System.Windows.Forms.ListViewItem("Blo");
+      System.Windows.Forms.SplitContainer splitContainer1;
+      System.Windows.Forms.SplitContainer splitContainer2;
+      System.Windows.Forms.Button updateButton;
+      System.Windows.Forms.Label label1;
       this.decomposerList = new System.Windows.Forms.ListView();
       this.DecomposersColumn = new System.Windows.Forms.ColumnHeader();
-      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
-      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.checkBox = new System.Windows.Forms.ListBox();
       this.formatterTabs = new System.Windows.Forms.TabControl();
-      this.checkBox = new System.Windows.Forms.ListBox();
       nullFormatterConfig = new System.Windows.Forms.TabPage();
+      dataGridView1 = new System.Windows.Forms.DataGridView();
+      Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
+      Column2 = new System.Windows.Forms.DataGridViewCheckBoxColumn();
+      Column3 = new System.Windows.Forms.DataGridViewComboBoxColumn();
+      splitContainer1 = new System.Windows.Forms.SplitContainer();
+      splitContainer2 = new System.Windows.Forms.SplitContainer();
+      updateButton = new System.Windows.Forms.Button();
+      label1 = new System.Windows.Forms.Label();
       nullFormatterConfig.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
-      this.splitContainer1.Panel1.SuspendLayout();
-      this.splitContainer1.Panel2.SuspendLayout();
-      this.splitContainer1.SuspendLayout();
-      this.splitContainer2.Panel1.SuspendLayout();
-      this.splitContainer2.Panel2.SuspendLayout();
-      this.splitContainer2.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(dataGridView1)).BeginInit();
+      splitContainer1.Panel1.SuspendLayout();
+      splitContainer1.Panel2.SuspendLayout();
+      splitContainer1.SuspendLayout();
+      splitContainer2.Panel1.SuspendLayout();
+      splitContainer2.Panel2.SuspendLayout();
+      splitContainer2.SuspendLayout();
       this.formatterTabs.SuspendLayout();
       this.SuspendLayout();
@@ -52,5 +62,5 @@
       // nullFormatterConfig
       // 
-      nullFormatterConfig.Controls.Add(this.dataGridView1);
+      nullFormatterConfig.Controls.Add(dataGridView1);
       nullFormatterConfig.Location = new System.Drawing.Point(4, 22);
       nullFormatterConfig.Name = "nullFormatterConfig";
@@ -62,30 +72,30 @@
       // dataGridView1
       // 
-      this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-      this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
-            this.Column1,
-            this.Column2,
-            this.Column3});
-      this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.dataGridView1.Location = new System.Drawing.Point(0, 0);
-      this.dataGridView1.Name = "dataGridView1";
-      this.dataGridView1.Size = new System.Drawing.Size(386, 554);
-      this.dataGridView1.TabIndex = 0;
+      dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            Column1,
+            Column2,
+            Column3});
+      dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
+      dataGridView1.Location = new System.Drawing.Point(0, 0);
+      dataGridView1.Name = "dataGridView1";
+      dataGridView1.Size = new System.Drawing.Size(386, 554);
+      dataGridView1.TabIndex = 0;
       // 
       // Column1
       // 
-      this.Column1.HeaderText = "Column1";
-      this.Column1.Name = "Column1";
+      Column1.HeaderText = "Column1";
+      Column1.Name = "Column1";
       // 
       // Column2
       // 
-      this.Column2.HeaderText = "Column2";
-      this.Column2.Name = "Column2";
+      Column2.HeaderText = "Column2";
+      Column2.Name = "Column2";
       // 
       // Column3
       // 
-      this.Column3.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.ComboBox;
-      this.Column3.HeaderText = "Column3";
-      this.Column3.Name = "Column3";
+      Column3.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.ComboBox;
+      Column3.HeaderText = "Column3";
+      Column3.Name = "Column3";
       // 
       // decomposerList
@@ -100,15 +110,15 @@
       this.decomposerList.GridLines = true;
       this.decomposerList.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
-      listViewItem1.Checked = true;
-      listViewItem1.StateImageIndex = 1;
-      listViewItem1.Tag = "";
-      listViewItem2.Checked = true;
-      listViewItem2.StateImageIndex = 1;
-      listViewItem3.Checked = true;
-      listViewItem3.StateImageIndex = 1;
+      listViewItem16.Checked = true;
+      listViewItem16.StateImageIndex = 1;
+      listViewItem16.Tag = "";
+      listViewItem17.Checked = true;
+      listViewItem17.StateImageIndex = 1;
+      listViewItem18.Checked = true;
+      listViewItem18.StateImageIndex = 1;
       this.decomposerList.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
-            listViewItem1,
-            listViewItem2,
-            listViewItem3});
+            listViewItem16,
+            listViewItem17,
+            listViewItem18});
       this.decomposerList.Location = new System.Drawing.Point(0, 0);
       this.decomposerList.Name = "decomposerList";
@@ -131,36 +141,50 @@
       // splitContainer1
       // 
-      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
-      this.splitContainer1.Name = "splitContainer1";
+      splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      splitContainer1.Location = new System.Drawing.Point(0, 0);
+      splitContainer1.Name = "splitContainer1";
       // 
       // splitContainer1.Panel1
       // 
-      this.splitContainer1.Panel1.Controls.Add(this.splitContainer2);
+      splitContainer1.Panel1.Controls.Add(splitContainer2);
       // 
       // splitContainer1.Panel2
       // 
-      this.splitContainer1.Panel2.Controls.Add(this.formatterTabs);
-      this.splitContainer1.Size = new System.Drawing.Size(597, 580);
-      this.splitContainer1.SplitterDistance = 199;
-      this.splitContainer1.TabIndex = 2;
+      splitContainer1.Panel2.Controls.Add(updateButton);
+      splitContainer1.Panel2.Controls.Add(this.formatterTabs);
+      splitContainer1.Size = new System.Drawing.Size(597, 580);
+      splitContainer1.SplitterDistance = 199;
+      splitContainer1.TabIndex = 2;
       // 
       // splitContainer2
       // 
-      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.splitContainer2.Location = new System.Drawing.Point(0, 0);
-      this.splitContainer2.Name = "splitContainer2";
-      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      splitContainer2.Location = new System.Drawing.Point(0, 0);
+      splitContainer2.Name = "splitContainer2";
+      splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
       // 
       // splitContainer2.Panel1
       // 
-      this.splitContainer2.Panel1.Controls.Add(this.decomposerList);
+      splitContainer2.Panel1.Controls.Add(this.decomposerList);
       // 
       // splitContainer2.Panel2
       // 
-      this.splitContainer2.Panel2.Controls.Add(this.checkBox);
-      this.splitContainer2.Size = new System.Drawing.Size(199, 580);
-      this.splitContainer2.SplitterDistance = 290;
-      this.splitContainer2.TabIndex = 1;
+      splitContainer2.Panel2.Controls.Add(label1);
+      splitContainer2.Panel2.Controls.Add(this.checkBox);
+      splitContainer2.Size = new System.Drawing.Size(199, 580);
+      splitContainer2.SplitterDistance = 290;
+      splitContainer2.TabIndex = 1;
+      // 
+      // checkBox
+      // 
+      this.checkBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.checkBox.Enabled = false;
+      this.checkBox.FormattingEnabled = true;
+      this.checkBox.Location = new System.Drawing.Point(0, 18);
+      this.checkBox.Name = "checkBox";
+      this.checkBox.Size = new System.Drawing.Size(199, 264);
+      this.checkBox.TabIndex = 0;
       // 
       // formatterTabs
@@ -174,12 +198,25 @@
       this.formatterTabs.TabIndex = 0;
       // 
-      // checkBox
-      // 
-      this.checkBox.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.checkBox.FormattingEnabled = true;
-      this.checkBox.Location = new System.Drawing.Point(0, 0);
-      this.checkBox.Name = "checkBox";
-      this.checkBox.Size = new System.Drawing.Size(199, 277);
-      this.checkBox.TabIndex = 0;
+      // updateButton
+      // 
+      updateButton.Dock = System.Windows.Forms.DockStyle.Bottom;
+      updateButton.Location = new System.Drawing.Point(0, 557);
+      updateButton.Name = "updateButton";
+      updateButton.Size = new System.Drawing.Size(394, 23);
+      updateButton.TabIndex = 1;
+      updateButton.Text = "Define Configuration";
+      updateButton.UseVisualStyleBackColor = true;
+      updateButton.Click += new System.EventHandler(this.updateButton_Click);
+      // 
+      // label1
+      // 
+      label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      label1.Location = new System.Drawing.Point(3, 0);
+      label1.Name = "label1";
+      label1.Size = new System.Drawing.Size(193, 13);
+      label1.TabIndex = 1;
+      label1.Text = "Configuration Preview";
+      label1.TextAlign = System.Drawing.ContentAlignment.TopCenter;
       // 
       // PersistenceConfigurationForm
@@ -188,15 +225,15 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.ClientSize = new System.Drawing.Size(597, 580);
-      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(splitContainer1);
       this.Name = "PersistenceConfigurationForm";
       this.Text = "PersistenceConfigurationForm";
       nullFormatterConfig.ResumeLayout(false);
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
-      this.splitContainer1.Panel1.ResumeLayout(false);
-      this.splitContainer1.Panel2.ResumeLayout(false);
-      this.splitContainer1.ResumeLayout(false);
-      this.splitContainer2.Panel1.ResumeLayout(false);
-      this.splitContainer2.Panel2.ResumeLayout(false);
-      this.splitContainer2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(dataGridView1)).EndInit();
+      splitContainer1.Panel1.ResumeLayout(false);
+      splitContainer1.Panel2.ResumeLayout(false);
+      splitContainer1.ResumeLayout(false);
+      splitContainer2.Panel1.ResumeLayout(false);
+      splitContainer2.Panel2.ResumeLayout(false);
+      splitContainer2.ResumeLayout(false);
       this.formatterTabs.ResumeLayout(false);
       this.ResumeLayout(false);
@@ -208,11 +245,5 @@
     private System.Windows.Forms.ListView decomposerList;
     private System.Windows.Forms.ColumnHeader DecomposersColumn;
-    private System.Windows.Forms.SplitContainer splitContainer1;
-    private System.Windows.Forms.SplitContainer splitContainer2;
     private System.Windows.Forms.TabControl formatterTabs;
-    private System.Windows.Forms.DataGridView dataGridView1;
-    private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
-    private System.Windows.Forms.DataGridViewCheckBoxColumn Column2;
-    private System.Windows.Forms.DataGridViewComboBoxColumn Column3;
     private System.Windows.Forms.ListBox checkBox;
   }
Index: /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.cs
===================================================================
--- /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.cs	(revision 1399)
+++ /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.cs	(revision 1400)
@@ -4,4 +4,5 @@
 using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Persistence.Core;
 using HeuristicLab.Persistence.Default.Xml;
 using HeuristicLab.Persistence.Interfaces;
@@ -29,15 +30,15 @@
     private void initializeFormatterPages() {
       formatterTabs.TabPages.Clear();
-      foreach ( var formats in ConfigurationService.Instance.AllFormatters ) {
+      foreach ( var formats in ConfigurationService.Instance.Formatters ) {
         TabPage page = new TabPage(formats.Key.Name) {Tag = formats.Key};
         formatterTabs.TabPages.Add(page);
         DataGridView gridView = new DataGridView {
-                                                   Dock = DockStyle.Fill,
-                                                   EditMode = DataGridViewEditMode.EditOnEnter,
-                                                   AllowUserToAddRows = false,
-                                                   AllowUserToDeleteRows = false,
-                                                   AllowUserToResizeRows = false,
-                                                   Name = "GridView",
-                                                 };
+          Dock = DockStyle.Fill,
+          EditMode = DataGridViewEditMode.EditOnEnter,
+          AllowUserToAddRows = false,
+          AllowUserToDeleteRows = false,
+          AllowUserToResizeRows = false,
+          Name = "GridView",
+        };
         gridView.CellValueChanged += gridView_CellValueChanged;
         gridView.Columns.Add(new DataGridViewTextBoxColumn {
@@ -124,5 +125,5 @@
     private void initializeDecomposerList() {
       decomposerList.Items.Clear();
-      foreach ( IDecomposer decomposer in ConfigurationService.Instance.AllDecomposers ) {
+      foreach ( IDecomposer decomposer in ConfigurationService.Instance.Decomposers ) {
         var item = decomposerList.Items.Add(decomposer.GetType().Name);
         item.Checked = true;
@@ -219,4 +220,12 @@
       }
       return new Configuration(formatters, GetDecomposers());
+    }    
+
+    private void updateButton_Click(object sender, EventArgs e) {
+      IFormat format = (IFormat)formatterTabs.SelectedTab.Tag;
+      if (format != null)
+        ConfigurationService.Instance.DefineConfiguration(
+          format,
+          GetCurrentConfiguration(format));
     }
     
Index: /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.resx
===================================================================
--- /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.resx	(revision 1399)
+++ /branches/New Persistence Exploration/Persistence/HeuristicLab.Persistence.GUI/PersistenceConfigurationForm.resx	(revision 1400)
@@ -121,6 +121,15 @@
     <value>False</value>
   </metadata>
+  <metadata name="dataGridView1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="Column1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
   <metadata name="Column1.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
+  </metadata>
+  <metadata name="Column2.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
   </metadata>
   <metadata name="Column2.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
@@ -130,3 +139,18 @@
     <value>True</value>
   </metadata>
+  <metadata name="Column3.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="splitContainer1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="splitContainer2.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="label1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="updateButton.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
 </root>
Index: /branches/New Persistence Exploration/Persistence/Persistence/Core/Configuration.cs
===================================================================
--- /branches/New Persistence Exploration/Persistence/Persistence/Core/Configuration.cs	(revision 1400)
+++ /branches/New Persistence Exploration/Persistence/Persistence/Core/Configuration.cs	(revision 1400)
@@ -0,0 +1,54 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using HeuristicLab.Persistence.Interfaces;
+
+namespace HeuristicLab.Persistence.Core {
+
+  public class Configuration {
+
+    private readonly Dictionary<Type, IFormatter> formatters;
+    private readonly List<IDecomposer> decomposers;
+    private readonly Dictionary<Type, IDecomposer> decomposerCache;
+    public readonly IFormat Format;
+
+    public Configuration(Dictionary<Type, IFormatter> formatters, IEnumerable<IDecomposer> decomposers) {      
+      this.formatters = new Dictionary<Type, IFormatter>();
+      foreach ( var pair in formatters ) {
+        if (Format == null) {
+          Format = pair.Value.Format;
+        } else if (pair.Value.Format != Format ) {
+          throw new ArgumentException("All formatters must have the same IFormat.");
+        }
+        this.formatters.Add(pair.Key, pair.Value);
+      }
+      this.decomposers = new List<IDecomposer>(decomposers);
+      decomposerCache = new Dictionary<Type, IDecomposer>();      
+    }
+
+    public IEnumerable Formatters {
+      get { return formatters.Values; }
+    }
+
+    public IFormatter GetFormatter(Type type) {      
+      IFormatter formatter;
+      formatters.TryGetValue(type, out formatter);
+      return formatter;
+    }
+
+    public IDecomposer GetDecomposer(Type type) {
+      IDecomposer decomposer;
+      decomposerCache.TryGetValue(type, out decomposer);
+      if (decomposer != null)
+        return decomposer;
+      foreach (IDecomposer d in decomposers) {
+        if (d.CanDecompose(type)) {
+          decomposerCache.Add(type, d);
+          return d;
+        }
+      }
+      return null;
+    }    
+  }  
+  
+}
Index: /branches/New Persistence Exploration/Persistence/Persistence/Core/ConfigurationService.cs
===================================================================
--- /branches/New Persistence Exploration/Persistence/Persistence/Core/ConfigurationService.cs	(revision 1400)
+++ /branches/New Persistence Exploration/Persistence/Persistence/Core/ConfigurationService.cs	(revision 1400)
@@ -0,0 +1,83 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Reflection;
+using HeuristicLab.Persistence.Interfaces;
+
+namespace HeuristicLab.Persistence.Core {
+  
+  public class ConfigurationService {
+
+    private static ConfigurationService instance;
+    private Dictionary<IFormat, Configuration> customConfigurations;
+    public readonly Dictionary<IFormat, List<IFormatter>> Formatters;
+    public readonly List<IDecomposer> Decomposers;
+    
+    public static ConfigurationService Instance {
+      get {
+        if (instance == null)
+          instance = new ConfigurationService();
+        return instance;
+      }
+    }
+
+    public ConfigurationService() {
+      Formatters = new Dictionary<IFormat, List<IFormatter>>();
+      Decomposers = new List<IDecomposer>();
+      customConfigurations = new Dictionary<IFormat, Configuration>();
+      Reset();
+    }
+
+    public void Reset() {      
+      customConfigurations.Clear();
+      Assembly defaultAssembly = Assembly.GetExecutingAssembly();
+      DiscoverFrom(defaultAssembly);
+      foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
+        if ( a != defaultAssembly )
+          DiscoverFrom(a);
+    }
+
+    protected void DiscoverFrom(Assembly a) {
+      foreach (Type t in a.GetTypes()) {
+        if (t.GetInterface(typeof (IFormatter).FullName) != null) {
+          try {
+            IFormatter formatter = (IFormatter) Activator.CreateInstance(t, true);
+            if ( ! Formatters.ContainsKey(formatter.Format) ) {
+              Formatters.Add(formatter.Format, new List<IFormatter>());
+            }
+            Formatters[formatter.Format].Add(formatter);
+          } catch (MissingMethodException) {
+            Console.WriteLine("WARNING: Could not instantiate {0}", t.FullName);
+          }          
+        }
+        if (t.GetInterface(typeof (IDecomposer).FullName) != null) {
+          try {
+            Decomposers.Add((IDecomposer) Activator.CreateInstance(t, true));
+          } catch (MissingMethodException) {
+            Console.WriteLine("WARNING: Could not instantiate {0}", t.FullName);
+          }
+        }
+      }
+    }
+
+    public Configuration GetDefaultConfig(IFormat format) {
+      Dictionary<Type, IFormatter> formatterConfig = new Dictionary<Type, IFormatter>();
+      foreach ( IFormatter f in Formatters[format] ) {
+        if ( ! formatterConfig.ContainsKey(f.Type) )
+          formatterConfig.Add(f.Type, f);
+      }
+      return new Configuration(formatterConfig, Decomposers);
+    }
+
+    public Configuration GetConfiguration(IFormat format) {
+      if (customConfigurations.ContainsKey(format))
+        return customConfigurations[format];
+      return GetDefaultConfig(format);
+    }
+
+    public void DefineConfiguration(IFormat format, Configuration configuration) {
+      customConfigurations[format] = configuration;
+    }
+
+  }
+  
+}
Index: anches/New Persistence Exploration/Persistence/Persistence/Core/PersistenceConfiguration.cs
===================================================================
--- /branches/New Persistence Exploration/Persistence/Persistence/Core/PersistenceConfiguration.cs	(revision 1399)
+++ 	(revision )
@@ -1,131 +1,0 @@
-﻿using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Reflection;
-using HeuristicLab.Persistence.Interfaces;
-
-namespace HeuristicLab.Persistence {
-
-  public class Configuration {
-
-    private readonly Dictionary<Type, IFormatter> formatters;
-    private readonly List<IDecomposer> decomposers;
-    private readonly Dictionary<Type, IDecomposer> decomposerCache;
-    public readonly IFormat Format;
-
-    public Configuration(Dictionary<Type, IFormatter> formatters, IEnumerable<IDecomposer> decomposers) {      
-      this.formatters = new Dictionary<Type, IFormatter>();
-      foreach ( var pair in formatters ) {
-        if (Format == null) {
-          Format = pair.Value.Format;
-        } else if (pair.Value.Format != Format ) {
-          throw new ArgumentException("All formatters must have the same IFormat.");
-        }
-        this.formatters.Add(pair.Key, pair.Value);
-      }
-      this.decomposers = new List<IDecomposer>(decomposers);
-      decomposerCache = new Dictionary<Type, IDecomposer>();      
-    }
-
-    public IEnumerable Formatters {
-      get { return formatters.Values; }
-    }
-
-    public IFormatter GetFormatter(Type type) {
-      IFormatter formatter;
-      formatters.TryGetValue(type, out formatter);
-      return formatter;
-    }
-
-    public IDecomposer GetDecomposer(Type type) {
-      IDecomposer decomposer;
-      decomposerCache.TryGetValue(type, out decomposer);
-      if (decomposer != null)
-        return decomposer;
-      foreach (IDecomposer d in decomposers) {
-        if (d.CanDecompose(type)) {
-          decomposerCache.Add(type, d);
-          return d;
-        }
-      }
-      return null;
-    }
-    
-  }
-
-  public class ConfigurationService {
-
-    private static ConfigurationService instance;
-    private readonly Dictionary<IFormat, List<IFormatter>> formatters;
-    private readonly List<IDecomposer> decomposers;
-
-    public Dictionary<IFormat, List<IFormatter>> AllFormatters {
-      get {
-        return formatters;
-      }
-    }
-
-    public List<IDecomposer> AllDecomposers {
-      get {
-        return decomposers;
-      }
-    }
-    
-    public static ConfigurationService Instance {
-      get {
-        if (instance == null) {
-          instance = new ConfigurationService();
-        }
-        return instance;
-      }
-    }
-
-    public ConfigurationService() {
-      formatters = new Dictionary<IFormat, List<IFormatter>>();
-      decomposers = new List<IDecomposer>();
-      Reset();
-    }
-
-    public void Reset() {
-      Assembly defaultAssembly = Assembly.GetExecutingAssembly();
-      DiscoverFrom(defaultAssembly);
-      foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
-        if ( a != defaultAssembly )
-          DiscoverFrom(a);
-    }
-
-    protected void DiscoverFrom(Assembly a) {
-      foreach (Type t in a.GetTypes()) {
-        if (t.GetInterface(typeof (IFormatter).FullName) != null) {
-          try {
-            IFormatter formatter = (IFormatter) Activator.CreateInstance(t, true);
-            if ( ! formatters.ContainsKey(formatter.Format) ) {
-              formatters.Add(formatter.Format, new List<IFormatter>());
-            }
-            formatters[formatter.Format].Add(formatter);
-          } catch (MissingMethodException) {
-            Console.WriteLine("WARNING: Could not instantiate {0}", t.FullName);
-          }          
-        }
-        if (t.GetInterface(typeof (IDecomposer).FullName) != null) {
-          try {
-            decomposers.Add((IDecomposer) Activator.CreateInstance(t, true));
-          } catch (MissingMethodException) {
-            Console.WriteLine("WARNING: Could not instantiate {0}", t.FullName);
-          }
-        }
-      }
-    }
-
-    public Configuration GetDefaultConfig(IFormat format) {
-      Dictionary<Type, IFormatter> formatterConfig = new Dictionary<Type, IFormatter>();
-      foreach ( IFormatter f in formatters[format] ) {
-        if ( ! formatterConfig.ContainsKey(f.Type) )
-          formatterConfig.Add(f.Type, f);
-      }
-      return new Configuration(formatterConfig, decomposers);
-    }
-
-  }
-  
-}
Index: /branches/New Persistence Exploration/Persistence/Persistence/HeuristicLab.Persistence.csproj
===================================================================
--- /branches/New Persistence Exploration/Persistence/Persistence/HeuristicLab.Persistence.csproj	(revision 1399)
+++ /branches/New Persistence Exploration/Persistence/Persistence/HeuristicLab.Persistence.csproj	(revision 1400)
@@ -55,4 +55,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Core\Configuration.cs" />
     <Compile Include="Default\Decomposers\EnumerableDecomposer.cs" />
     <Compile Include="Default\Decomposers\ArrayDecomposer.cs" />
@@ -76,5 +77,5 @@
     <Compile Include="Interfaces\IDecomposer.cs" />
     <Compile Include="Interfaces\IFormatter.cs" />
-    <Compile Include="Core\PersistenceConfiguration.cs" />
+    <Compile Include="Core\ConfigurationService.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Core\Serializer.cs" />
