Index: branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBDataDescriptor.cs
===================================================================
--- branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBDataDescriptor.cs	(revision 13401)
+++ branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBDataDescriptor.cs	(revision 15281)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBInstanceProvider.cs
===================================================================
--- branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBInstanceProvider.cs	(revision 13401)
+++ branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBInstanceProvider.cs	(revision 15281)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -67,9 +67,5 @@
           var parser = new JSSPORLIBParser();
           parser.Parse(stream);
-          var instance = Load(parser);
-          instance.Name = id.Name;
-          instance.Description = id.Description;
-
-          return instance;
+          return Load(parser);
         }
       }
@@ -82,12 +78,11 @@
       var parser = new JSSPORLIBParser();
       parser.Parse(path);
-      var instance = Load(parser);
-      instance.Name = Path.GetFileName(path);
-      instance.Description = "Loaded from file \"" + path + "\" on " + DateTime.Now.ToString();
-      return instance;
+      return Load(parser);
     }
 
     private JSSPData Load(JSSPORLIBParser parser) {
       var instance = new JSSPData {
+        Name = parser.Name,
+        Description = parser.Description,
         Jobs = parser.Jobs,
         Resources = parser.Resources,
Index: branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBParser.cs
===================================================================
--- branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBParser.cs	(revision 13401)
+++ branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/JSSPORLIBParser.cs	(revision 15281)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -24,4 +24,5 @@
 using System.IO;
 using System.Linq;
+using System.Text;
 
 namespace HeuristicLab.Problems.Instances.Scheduling {
@@ -53,5 +54,5 @@
 
     public void Export(string file) {
-      using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
+      using (Stream stream = new FileStream(file, FileMode.Create, FileAccess.Write)) {
         Export(stream);
       }
@@ -65,48 +66,55 @@
     /// </remarks>
     /// <param name="stream">The stream to read data from.</param>
-    /// <returns>True if the file was successfully read or false otherwise.</returns>
     public void Parse(Stream stream) {
-      var reader = new StreamReader(stream);
-      Name = reader.ReadLine().Trim();
-      Description = reader.ReadLine().Trim();
-      var delim = new char[] { ' ', '\t' };
+      using (var reader = new StreamReader(stream, Encoding.UTF8, true, 4092, true)) {
+        Name = reader.ReadLine().Trim();
+        Description = reader.ReadLine().Trim();
+        var delim = new char[] {' ', '\t'};
 
-      var info = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
-      Jobs = int.Parse(info[0]);
-      Resources = int.Parse(info[1]);
-      ProcessingTimes = new double[Jobs, Resources];
-      Demands = new int[Jobs, Resources];
+        var info = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
+        Jobs = int.Parse(info[0]);
+        Resources = int.Parse(info[1]);
+        ProcessingTimes = new double[Jobs, Resources];
+        Demands = new int[Jobs, Resources];
 
-      for (int k = 0; k < Jobs; k++) {
-        if (reader.EndOfStream) throw new InvalidDataException("Unexpected End of Stream.");
-        var valLine = reader.ReadLine();
-        while (String.IsNullOrWhiteSpace(valLine)) valLine = reader.ReadLine();
-        var vals = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
-        if (vals.Length > 2 * Resources) {
-          if (DueDates == null) DueDates = new double[Jobs];
-          DueDates[k] = double.Parse(vals.Last(), CultureInfo.InvariantCulture.NumberFormat);
-        }
+        for (int k = 0; k < Jobs; k++) {
+          if (reader.EndOfStream) throw new InvalidDataException("Unexpected End of Stream.");
+          var valLine = reader.ReadLine();
+          while (String.IsNullOrWhiteSpace(valLine)) valLine = reader.ReadLine();
+          var vals = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
+          if (vals.Length > 2 * Resources) {
+            if (DueDates == null) DueDates = new double[Jobs];
+            DueDates[k] = double.Parse(vals.Last(), CultureInfo.InvariantCulture.NumberFormat);
+          }
 
-        for (int i = 0; i < Resources; i++) {
-          Demands[k, i] = int.Parse(vals[2 * i]);
-          ProcessingTimes[k, i] = double.Parse(vals[2 * i + 1], CultureInfo.InvariantCulture.NumberFormat);
+          for (int i = 0; i < Resources; i++) {
+            Demands[k, i] = int.Parse(vals[2 * i]);
+            ProcessingTimes[k, i] = double.Parse(vals[2 * i + 1], CultureInfo.InvariantCulture.NumberFormat);
+          }
         }
       }
-
     }
 
+    /// <summary>
+    /// Writes to the given stream data which is expected to be in the JSSP ORLIB format.
+    /// </summary>
+    /// <remarks>
+    /// The stream is not closed or disposed. The caller has to take care of that.
+    /// </remarks>
+    /// <param name="stream">The stream to write data to.</param>
     public void Export(Stream stream) {
-      var writer = new StreamWriter(stream);
-      writer.WriteLine(Name);
-      writer.WriteLine(Description);
-      writer.WriteLine(Jobs.ToString(CultureInfo.InvariantCulture.NumberFormat) + " " + Resources.ToString(CultureInfo.InvariantCulture.NumberFormat));
-      for (int i = 0; i < Jobs; i++) {
-        for (int j = 0; j < Resources; j++) {
-          writer.Write(Demands[i, j] + " " + ProcessingTimes[i, j] + " ");
+      using (var writer = new StreamWriter(stream, Encoding.UTF8, 4092, true)) {
+        writer.WriteLine(Name);
+        writer.WriteLine(Description);
+        writer.WriteLine(Jobs.ToString(CultureInfo.InvariantCulture.NumberFormat) + " " + Resources.ToString(CultureInfo.InvariantCulture.NumberFormat));
+        for (int i = 0; i < Jobs; i++) {
+          for (int j = 0; j < Resources; j++) {
+            writer.Write(Demands[i, j] + " " + ProcessingTimes[i, j] + " ");
+          }
+          if (DueDates != null) writer.Write(DueDates[i].ToString("r", CultureInfo.InvariantCulture.NumberFormat));
+          writer.WriteLine();
         }
-        if (DueDates != null) writer.Write(DueDates[i].ToString(CultureInfo.InvariantCulture.NumberFormat));
-        writer.WriteLine();
+        writer.Flush();
       }
-      writer.Flush();
     }
 
Index: branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/Plugin.cs.frame
===================================================================
--- branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/Plugin.cs.frame	(revision 13401)
+++ branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/Plugin.cs.frame	(revision 15281)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -23,5 +23,5 @@
 
 namespace HeuristicLab.Problems.Instances.Scheduling {
-  [Plugin("HeuristicLab.Problems.Instances.Scheduling", "3.3.13.$WCREV$")]
+  [Plugin("HeuristicLab.Problems.Instances.Scheduling", "3.3.14.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.Instances.Scheduling-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
Index: branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/Properties/AssemblyInfo.cs.frame	(revision 13401)
+++ branches/Async/HeuristicLab.Problems.Instances.Scheduling/3.3/Properties/AssemblyInfo.cs.frame	(revision 15281)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("HEAL")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
@@ -55,3 +55,3 @@
 // [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.13.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
