diff --git a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java b/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java
index b06ae5a928feead895c22e923daff7b7cbc59077..48a917329dafaec87ff32ffe9443d5ea01928558 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java
@@ -16,24 +16,39 @@
 
 package ch.systemsx.cisd.bds;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractDataStructure implements IDataStructure
+public abstract class AbstractDataStructure implements IHasVersion
 {
-    private final String name;
+    protected final IStorage storage;
+    protected final IDirectory root;
 
-    public AbstractDataStructure(String name)
+    AbstractDataStructure(IStorage storage)
     {
-        assert name != null && name.length() > 0: "Unspecified name";
-        this.name = name;
+        assert storage != null: "Unspecified storage.";
+        this.storage = storage;
+        root = storage.getRoot();
     }
 
-    public String getName()
+    public void load()
     {
-        return name;
+        storage.load();
+        Version loadedVersion = Version.loadFrom(root);
+        if (getVersion().isBackwardsCompatibleWith(loadedVersion) == false)
+        {
+            throw new UserFailureException("Version of loaded data structure is " + loadedVersion
+                    + " which is not backward compatible with " + getVersion());
+        }
     }
     
+    public void save()
+    {
+        getVersion().saveTo(root);
+        storage.save();
+    }
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/DataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/DataStructureFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b039165e2e4d17ae62f32c5cd58f8cb925283843
--- /dev/null
+++ b/bds/source/java/ch/systemsx/cisd/bds/DataStructureFactory.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2007 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.bds;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class DataStructureFactory
+{
+    private static final Map<Version, Class<? extends AbstractDataStructure>> repository =
+            new HashMap<Version, Class<? extends AbstractDataStructure>>();
+    
+    void register(Version version, Class<? extends AbstractDataStructure> clazz)
+    {
+        repository.put(version, clazz);
+    }
+    
+    public static Class<? extends AbstractDataStructure> getDataStructureClassFor(Version version)
+    {
+        Class<? extends AbstractDataStructure> clazz = null;
+        for (Version v = version; v.getMinor() >= 0 && clazz == null; v = v.getPreviousMinorVersion())
+        {
+            clazz = repository.get(v);
+        }
+        if (clazz == null)
+        {
+            throw new UserFailureException("No data structure class found for version " + version);
+        }
+        return clazz;
+    }
+    
+    public static AbstractDataStructure createDataStructure(IStorage storage, Version version)
+    {
+        Class<? extends AbstractDataStructure> clazz = getDataStructureClassFor(version);
+        Constructor<? extends AbstractDataStructure> constructor;
+        try
+        {
+            constructor = clazz.getConstructor(new Class[] {IStorage.class});
+        } catch (Exception ex1)
+        {
+            throw new EnvironmentFailureException(clazz + " has no constructor with argument of type "
+                    + IStorage.class.getCanonicalName());
+        }
+        try
+        {
+            return constructor.newInstance(new Object[] {storage});
+        } catch (InvocationTargetException ex)
+        {
+            throw new UserFailureException("Couldn't create data structure for version " + version, ex.getCause());
+        } catch (Exception ex)
+        {
+            throw new UserFailureException("Couldn't create data structure for version " + version, ex);
+        }
+    }
+
+    private DataStructureFactory()
+    {
+    }
+}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureV1_0.java b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
similarity index 53%
rename from bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureV1_0.java
rename to bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
index 8d46c817464f3ba4b2b52ece26dbd926d7946a91..0d3d4e6467167e5732c4298ed1b6e3b2cdbb5b0e 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureV1_0.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
@@ -16,23 +16,20 @@
 
 package ch.systemsx.cisd.bds;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractDataStructureV1_0 extends AbstractDataStructure implements IDataStructureV1_0
+public class DataStructureV1_0 extends AbstractDataStructure
 {
     private static final Version VERSION = new Version(1, 0);
     
-    
-    private ExperimentIdentifier experimentIdentifier;
-    
-    private ProcessingType processingType;
-    
-    public AbstractDataStructureV1_0(String name)
+    public DataStructureV1_0(IStorage storage)
     {
-        super(name);
+        super(storage);
     }
 
     public Version getVersion()
@@ -40,25 +37,46 @@ public abstract class AbstractDataStructureV1_0 extends AbstractDataStructure im
         return VERSION;
     }
 
-    public ExperimentIdentifier getExperimentIdentifier()
+    public IDirectory getOriginalData()
     {
-        return experimentIdentifier;
+        return Utilities.getSubDirectory(getDataDirectory(), "original");
     }
 
+    public IFormatedData getFormatedData()
+    {
+        return null;
+    }
+    
+    public ExperimentIdentifier getExperimentIdentifier()
+    {
+        return ExperimentIdentifier.loadFrom(getMetaDataDirectory());
+    }
+    
     public void setExperimentIdentifier(ExperimentIdentifier id)
     {
-        experimentIdentifier = id;
+        id.saveTo(getMetaDataDirectory());
     }
-
+    
     public ProcessingType getProcessingType()
     {
-        return processingType;
+        return ProcessingType.loadFrom(getMetaDataDirectory());
     }
-
+    
     public void setProcessingType(ProcessingType type)
     {
-        processingType = type;
+        type.saveTo(getMetaDataDirectory());
+    }
+    
+    private IDirectory getDataDirectory()
+    {
+        IDirectory subDirectory = Utilities.getSubDirectory(root, "data");
+        return subDirectory;
+    }
+    
+    private IDirectory getMetaDataDirectory()
+    {
+        IDirectory subDirectory = Utilities.getSubDirectory(root, "metadata");
+        return subDirectory;
     }
-
-
 }
+
diff --git a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
index 2020b0cb4687fd5ffcd8ca82f269f6a9b69bf5b9..73c4353f586726cdb4fd37359ba24a7e8104078b 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
@@ -24,6 +24,20 @@ package ch.systemsx.cisd.bds;
  */
 public class ExperimentIdentifier
 {
+    private static final String FOLDER = "experiment_identifier";
+    private static final String GROUP_CODE = "group_code";
+    private static final String PROJECT_CODE = "project_code";
+    private static final String EXPERIMENT_CODE = "experiment_code";
+    
+    public static ExperimentIdentifier loadFrom(IDirectory directory)
+    {
+        IDirectory idFolder = Utilities.getSubDirectory(directory, FOLDER);
+        String groupCode = Utilities.getString(idFolder, GROUP_CODE);
+        String projectCode = Utilities.getString(idFolder, PROJECT_CODE);
+        String experimentCode = Utilities.getString(idFolder, EXPERIMENT_CODE);
+        return new ExperimentIdentifier(groupCode, projectCode, experimentCode);
+    }
+    
     private final String groupCode;
     private final String projectCode;
     private final String experimentCode;
@@ -68,6 +82,14 @@ public class ExperimentIdentifier
     {
         return experimentCode;
     }
+    
+    public void saveTo(IDirectory directory)
+    {
+        IDirectory folder = directory.appendDirectory(FOLDER);
+        folder.appendKeyValuePair(GROUP_CODE, groupCode);
+        folder.appendKeyValuePair(PROJECT_CODE, projectCode);
+        folder.appendKeyValuePair(EXPERIMENT_CODE, experimentCode);
+    }
 
     @Override
     public boolean equals(Object obj)
diff --git a/bds/source/java/ch/systemsx/cisd/bds/IDataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/IDataStructureFactory.java
deleted file mode 100644
index 9ba3ce97725876025d62f1c5310115d06342b576..0000000000000000000000000000000000000000
--- a/bds/source/java/ch/systemsx/cisd/bds/IDataStructureFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2007 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.bds;
-
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
-
-/**
- * Factory of {@link IDataStructure}. 
- *
- * @author Franz-Josef Elmer
- */
-public interface IDataStructureFactory
-{
-    /**
-     * Returns the subinterface of {@link IDataStructure} for the specified version. 
-     * 
-     * @throws UserFailureException if this factory can not create a data structure for the specified version.
-     */
-    public Class<? extends IDataStructure> getDataStructureInterfaceFor(Version version) throws UserFailureException;
-    
-    /**
-     * Creates a new data structure of specified name and version. The return object implements the interface
-     * returned by {@link #getDataStructureInterfaceFor(Version)} for the same value of <code>version</code>.
-     * 
-     * @throws UserFailureException if this factory can not create a data structure for the specified version.
-     */
-    public IDataStructure createDataStructure(String name, Version version) throws UserFailureException;
-}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/IDirectory.java b/bds/source/java/ch/systemsx/cisd/bds/IDirectory.java
index 0b515a5c112ab320d7b9a8368c1e3e48be549710..dc9c18da657e83183511e5165bcf30d5082c52ee 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/IDirectory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/IDirectory.java
@@ -25,6 +25,10 @@ import java.io.File;
  */
 public interface IDirectory extends INode, Iterable<INode>
 {
+    public INode getNode(String name);
+    
+    public IDirectory appendDirectory(String name);
+    
     public void appendNode(INode node);
     
     public void appendRealFile(File file);
diff --git a/bds/source/java/ch/systemsx/cisd/bds/INode.java b/bds/source/java/ch/systemsx/cisd/bds/INode.java
index 47d50b1354ba413cf7cada1d64404e83dd9a071f..4361171ded5a5ce15e283599777b27a9f6d0220f 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/INode.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/INode.java
@@ -16,6 +16,11 @@
 
 package ch.systemsx.cisd.bds;
 
+import java.io.File;
+
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
 /**
  * Role of a node in the data structure.
  *
@@ -32,4 +37,13 @@ public interface INode
      * Returns the parent directory of this node or <code>null</code> if it is the root node.
      */
     public IDirectory tryToGetParent();
+    
+    /**
+     * Extracts this node to the specified directory of the file system. All descendants are also extracted.
+     * 
+     * @throws UserFailureException if this or a descended node is a link referring to a node which is not this
+     *      node or a descended node. 
+     * @throws EnvironmentFailureException if extraction causes an IOException.
+     */
+    public void extractTo(File directory) throws UserFailureException, EnvironmentFailureException;
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/IStorage.java
similarity index 63%
rename from bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureFactory.java
rename to bds/source/java/ch/systemsx/cisd/bds/IStorage.java
index bc9f10dfbf2d954041be7f8ab047fcb6dde2ca16..8441062e2298fd00ed4a4619c473c24c69dcf005 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureFactory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/IStorage.java
@@ -16,21 +16,16 @@
 
 package ch.systemsx.cisd.bds;
 
-import java.io.File;
-
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractDataStructureFactory implements IDataStructureFactory
+public interface IStorage
 {
-    protected final File baseDir;
-
-    public AbstractDataStructureFactory(File baseDir)
-    {
-        assert baseDir != null : "Unspecified base directory.";
-        assert baseDir.isDirectory() : "Is not a directory : " + baseDir.getAbsolutePath();
-        this.baseDir = baseDir;
-    }
+    public void load();
+    
+    public IDirectory getRoot();
+    
+    public void save();
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/ProcessingType.java b/bds/source/java/ch/systemsx/cisd/bds/ProcessingType.java
index d4031ad8a376164a9a8c790064398bb3ed818193..6717aff94faff53b928941feda9f52e9f1dff846 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/ProcessingType.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/ProcessingType.java
@@ -26,6 +26,8 @@ public enum ProcessingType
 {
     OTHER, RAW_DATA, COMPUTED_DATA;
     
+    private static final String PROCESSING_TYPE = "processing_type";
+    
     /**
      * Resolves the specified string representation of a processing type.
      * 
@@ -36,4 +38,14 @@ public enum ProcessingType
         ProcessingType type = valueOf(processingTypeString);
         return type == null ? OTHER : type;
     }
+    
+    public static ProcessingType loadFrom(IDirectory directory)
+    {
+        return resolve(Utilities.getString(directory, PROCESSING_TYPE));
+    }
+    
+    public void saveTo(IDirectory directory)
+    {
+        directory.appendKeyValuePair(PROCESSING_TYPE, toString());
+    }
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/Utilities.java b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java
new file mode 100644
index 0000000000000000000000000000000000000000..a352ebc55ad3d9f2b40c8b57cc5ebc9b7f5ce617
--- /dev/null
+++ b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2007 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.bds;
+
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class Utilities
+{
+    public static IDirectory getSubDirectory(IDirectory directory, String name)
+    {
+        INode node = directory.getNode(name);
+        if (node instanceof IDirectory == false)
+        {
+            throw new UserFailureException("Is not a directory: " + node);
+        }
+        return (IDirectory) node;
+    }
+    
+    public static String getString(IDirectory directory, String name)
+    {
+        INode node = directory.getNode(name);
+        if (node == null)
+        {
+            throw new UserFailureException("File '" + name + "' missing in " + directory);
+        }
+        if (node instanceof IFile<?> == false)
+        {
+            throw new UserFailureException(node + " is not a file.");
+        }
+        IFile<?> file = (IFile<?>) node;
+        return file.getValue().toString();
+    }
+    
+}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/Version.java b/bds/source/java/ch/systemsx/cisd/bds/Version.java
index 8dbdc15d640dfc887c10dd894294cf87bfc78452..4bc6052125efa968d0dd6e211c6893205c6fa1c5 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/Version.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/Version.java
@@ -16,13 +16,37 @@
 
 package ch.systemsx.cisd.bds;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
 /**
- * Immutable value object for the version of something.
+ * Immutable value object for the version of something.        
  *
  * @author Franz-Josef Elmer
  */
 public final class Version
 {
+    private static final String VERSION = "version";
+    private static final String MAJOR = "major";
+    private static final String MINOR = "minor";
+    
+    public static Version loadFrom(IDirectory directory)
+    {
+        IDirectory versionFolder = Utilities.getSubDirectory(directory, VERSION);
+        return new Version(getNumber(versionFolder, MAJOR), getNumber(versionFolder, MINOR));
+    }
+    
+    private static int getNumber(IDirectory versionFolder, String name)
+    {
+        String value = Utilities.getString(versionFolder, name);
+        try
+        {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException ex)
+        {
+            throw new UserFailureException("Value of " + name + " version file is not a number: " + value);
+        }
+    }
+    
     private final int major;
     private final int minor;
 
@@ -55,6 +79,36 @@ public final class Version
     {
         return minor;
     }
+    
+    /**
+     * Returns true if this version is backwards compatible to the specified version. That is,
+     * if <code>version.getMajor() == this.getMajor()</code> and <code>version.getMinor() &lt;= this.getMinor()</code>.
+     */
+    public boolean isBackwardsCompatibleWith(Version version)
+    {
+        return version.major == major && version.minor <= minor;
+    }
+    
+    /**
+     * Returns the previous minor version.
+     * 
+     * @throws UserFailureException if minor version is 0.
+     */
+    public Version getPreviousMinorVersion()
+    {
+        if (minor == 0)
+        {
+            throw new UserFailureException("There is no previous minor version of " + this);
+        }
+        return new Version(major, minor - 1);
+    }
+    
+    public void saveTo(IDirectory directory)
+    {
+        IDirectory versionFolder = directory.appendDirectory(VERSION);
+        versionFolder.appendKeyValuePair(MAJOR, Integer.toString(major));
+        versionFolder.appendKeyValuePair(MINOR, Integer.toString(minor));
+    }
 
     @Override
     public boolean equals(Object obj)
diff --git a/bds/source/java/ch/systemsx/cisd/bds/container/Container.java b/bds/source/java/ch/systemsx/cisd/bds/container/Container.java
index 0a95d6e76e152955de6bbb0941b04bd0a86cdceb..e5437cb0cdd3aba9063da83538095ab1e7a52ff4 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/container/Container.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/container/Container.java
@@ -18,10 +18,14 @@ package ch.systemsx.cisd.bds.container;
 
 import java.io.File;
 
+import ch.systemsx.cisd.bds.AbstractDataStructure;
+import ch.systemsx.cisd.bds.DataStructureFactory;
 import ch.systemsx.cisd.bds.IDataStructure;
-import ch.systemsx.cisd.bds.IDataStructureFactory;
-import ch.systemsx.cisd.bds.fs.FileDataStructureFactory;
-import ch.systemsx.cisd.bds.hdf5.HDF5DataStructureFactory;
+import ch.systemsx.cisd.bds.IStorage;
+import ch.systemsx.cisd.bds.Utilities;
+import ch.systemsx.cisd.bds.Version;
+import ch.systemsx.cisd.bds.fs.FileStorage;
+import ch.systemsx.cisd.bds.hdf5.HDF5Storage;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 
 /**
@@ -40,25 +44,32 @@ public class Container
         this.baseDir = baseDir;
     }
     
-    public IDataStructure load(String name)
+    public AbstractDataStructure load(String name)
+    {
+        IStorage storage = createStorage(name);
+        storage.load();
+        Version version = Version.loadFrom(storage.getRoot());
+        return DataStructureFactory.createDataStructure(storage, version);
+    }
+    
+    private IStorage createStorage(String name)
     {
         File file = new File(baseDir, name);
         if (file.exists() == false)
         {
             throw new UserFailureException("No container name '" + name + "' exists in " + baseDir.getAbsolutePath());
         }
-        IDataStructureFactory dataStructureFactory;
         if (file.isDirectory())
         {
-            dataStructureFactory = new FileDataStructureFactory(baseDir);
-        } else if (new File(baseDir, name + ".hdf5").exists())
-        {
-            dataStructureFactory = new HDF5DataStructureFactory(baseDir);
-        } else
+            return new FileStorage(file);
+        }
+        File hdf5File = new File(baseDir, name + ".hdf5");
+        if (hdf5File.exists())
         {
-            throw new UserFailureException("Couldn't found appropriate container named '" + name + "' in "
-                    + baseDir.getAbsolutePath());
+            return new HDF5Storage(hdf5File);
         }
-        return dataStructureFactory.createDataStructure(name, null);
+        throw new UserFailureException("Couldn't found appropriate container named '" + name + "' in "
+                + baseDir.getAbsolutePath());
+        
     }
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/DataStructureV1_0.java b/bds/source/java/ch/systemsx/cisd/bds/fs/DataStructureV1_0.java
deleted file mode 100644
index 9cdbc3e726deabe8e078e7be662429614505fbbf..0000000000000000000000000000000000000000
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/DataStructureV1_0.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2007 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.bds.fs;
-
-import java.io.File;
-
-import ch.systemsx.cisd.bds.AbstractDataStructureV1_0;
-import ch.systemsx.cisd.bds.IDirectory;
-import ch.systemsx.cisd.bds.IFormatedData;
-import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
-
-/**
- * 
- *
- * @author Franz-Josef Elmer
- */
-class DataStructureV1_0 extends AbstractDataStructureV1_0
-{
-    private final File baseDir;
-
-    public DataStructureV1_0(String name, File baseDir)
-    {
-        super(name);
-        assert baseDir != null : "Unspecified base directory.";
-        assert baseDir.isDirectory() : "Is not a directory: " + baseDir.getAbsolutePath();
-        this.baseDir = baseDir;
-    }
-    
-    public IFormatedData getFormatedData()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public IDirectory getOriginalData()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public void save() throws EnvironmentFailureException
-    {
-        // TODO Auto-generated method stub
-        System.out.println(baseDir);
-        
-    }
-    
-}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/Directory.java b/bds/source/java/ch/systemsx/cisd/bds/fs/Directory.java
index 56b3061f3549f20061e1984afaec01ab7c4354e3..b7ecbc8c26268d3934424751f36a5bca0c8f6cbd 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/Directory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/fs/Directory.java
@@ -24,6 +24,7 @@ import java.util.Iterator;
 import ch.systemsx.cisd.bds.IDirectory;
 import ch.systemsx.cisd.bds.INode;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 
 /**
  * 
@@ -38,6 +39,18 @@ class Directory extends AbstractNode implements IDirectory
         assert directory.isDirectory() : "Not a directory: " + directory.getAbsolutePath();
     }
     
+    public INode getNode(String name)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public IDirectory appendDirectory(String name)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
     public void appendKeyValuePair(String key, String value)
     {
         File file = new File(fileNode, key);
@@ -81,4 +94,10 @@ class Directory extends AbstractNode implements IDirectory
         return null;
     }
 
+    public void extractTo(File directory) throws UserFailureException, EnvironmentFailureException
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/FileDataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/fs/FileStorage.java
similarity index 51%
rename from bds/source/java/ch/systemsx/cisd/bds/fs/FileDataStructureFactory.java
rename to bds/source/java/ch/systemsx/cisd/bds/fs/FileStorage.java
index 8d04d284e3a1290870a15bf5c6e96f51411eab66..aefe534501bb6dc334b11d82e8bfeda9aa480175 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/FileDataStructureFactory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/fs/FileStorage.java
@@ -18,34 +18,34 @@ package ch.systemsx.cisd.bds.fs;
 
 import java.io.File;
 
-import ch.systemsx.cisd.bds.AbstractDataStructureFactory;
-import ch.systemsx.cisd.bds.IDataStructure;
-import ch.systemsx.cisd.bds.Version;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.bds.IDirectory;
+import ch.systemsx.cisd.bds.IStorage;
 
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public class FileDataStructureFactory extends AbstractDataStructureFactory
+public class FileStorage implements IStorage
 {
+    private Directory root;
 
-    public FileDataStructureFactory(File baseDir)
+    public FileStorage(File folder)
     {
-        super(baseDir);
+        root = new Directory(folder);
+    }
+    
+    public IDirectory getRoot()
+    {
+        return root;
     }
 
-    public Class<? extends IDataStructure> getDataStructureInterfaceFor(Version version) throws UserFailureException
+    public void load()
     {
-        // TODO Auto-generated method stub
-        return null;
     }
 
-    public IDataStructure createDataStructure(String name, Version version) throws UserFailureException
+    public void save()
     {
-        // TODO Auto-generated method stub
-        return null;
     }
-    
+
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/Link.java b/bds/source/java/ch/systemsx/cisd/bds/fs/Link.java
index a1ddf4a6425f82897baeab62dc8c2bf98f4f1380..09dc58b4e50ad35385a01b5cedca166ef44e63d0 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/Link.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/fs/Link.java
@@ -16,9 +16,13 @@
 
 package ch.systemsx.cisd.bds.fs;
 
+import java.io.File;
+
 import ch.systemsx.cisd.bds.IDirectory;
 import ch.systemsx.cisd.bds.ILink;
 import ch.systemsx.cisd.bds.INode;
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 
 /**
  * 
@@ -58,4 +62,9 @@ class Link implements ILink
         return reference;
     }
 
+    public void extractTo(File directory) throws UserFailureException, EnvironmentFailureException
+    {
+        // TODO Auto-generated method stub
+    }
+
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/StringFile.java b/bds/source/java/ch/systemsx/cisd/bds/fs/StringFile.java
index 5e651af966d9281ba163618f0e57f7945496c9f1..1061b43852b58a8946c25744fc16f4cbeccb02d1 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/StringFile.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/fs/StringFile.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.bds.fs;
 import java.io.File;
 
 import ch.systemsx.cisd.bds.IFile;
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.utilities.FileUtilities;
 
 /**
@@ -39,4 +41,9 @@ class StringFile extends AbstractNode implements IFile<String>
         return FileUtilities.loadToString(fileNode);
     }
 
+    public void extractTo(File directory) throws UserFailureException, EnvironmentFailureException
+    {
+        // TODO Auto-generated method stub
+    }
+
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5DataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5Storage.java
similarity index 59%
rename from bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5DataStructureFactory.java
rename to bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5Storage.java
index 76ef69f26107ab41cc436befdd111402ad1f087a..04c04c6c3bcf508c693cd6dbc398f85837ca57ce 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5DataStructureFactory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5Storage.java
@@ -18,33 +18,37 @@ package ch.systemsx.cisd.bds.hdf5;
 
 import java.io.File;
 
-import ch.systemsx.cisd.bds.AbstractDataStructureFactory;
-import ch.systemsx.cisd.bds.IDataStructure;
-import ch.systemsx.cisd.bds.Version;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.bds.IDirectory;
+import ch.systemsx.cisd.bds.IStorage;
 
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public class HDF5DataStructureFactory extends AbstractDataStructureFactory
+public class HDF5Storage implements IStorage
 {
-    public HDF5DataStructureFactory(File baseDir)
+    public HDF5Storage(File hdf5File)
     {
-        super(baseDir);
+        assert hdf5File != null : "Unspecified HDF5 file.";
     }
-
-    public IDataStructure createDataStructure(String name, Version version) throws UserFailureException
+    
+    public IDirectory getRoot()
     {
         // TODO Auto-generated method stub
         return null;
     }
 
-    public Class<? extends IDataStructure> getDataStructureInterfaceFor(Version version) throws UserFailureException
+    public void load()
     {
         // TODO Auto-generated method stub
-        return null;
+
+    }
+
+    public void save()
+    {
+        // TODO Auto-generated method stub
+
     }
 
 }