Index: /branches/CFSAP/HeuristicLab.Problems.Instances.CFSAP/3.3/BozejkoCFSAPInstanceProvider.cs
===================================================================
--- /branches/CFSAP/HeuristicLab.Problems.Instances.CFSAP/3.3/BozejkoCFSAPInstanceProvider.cs	(revision 15455)
+++ /branches/CFSAP/HeuristicLab.Problems.Instances.CFSAP/3.3/BozejkoCFSAPInstanceProvider.cs	(revision 15456)
@@ -56,5 +56,6 @@
       return new CFSAPData {
         Jobs = parser.Jobs,
-        MachineNests = 2,
+        Nests = parser.Nests,
+        Machines = parser.Machines,
         ProcessingTimes = parser.ProcessingTimes,
         SetupTimes = parser.SetupTimes
Index: /branches/CFSAP/HeuristicLab.Problems.Instances.CFSAP/3.3/BozejkoCFSAPParser.cs
===================================================================
--- /branches/CFSAP/HeuristicLab.Problems.Instances.CFSAP/3.3/BozejkoCFSAPParser.cs	(revision 15455)
+++ /branches/CFSAP/HeuristicLab.Problems.Instances.CFSAP/3.3/BozejkoCFSAPParser.cs	(revision 15456)
@@ -20,5 +20,8 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using System.Text;
 
@@ -26,24 +29,40 @@
   public class BozejkoCFSAPParser {
     public int Jobs { get; private set; }
-    public int[,] ProcessingTimes { get; private set; }
-    public int[,,] SetupTimes { get; private set; }
+    public int[] Machines { get; private set; }
+    public int Nests { get; private set; }
+    public List<int[][]> ProcessingTimes { get; private set; }
+    public List<int[][][]> SetupTimes { get; private set; }
 
     public void Parse(Stream stream) {
       using (var reader = new StreamReader(stream)) {
-        Jobs = GetNextNumber(reader);
-        var seed = GetNextNumber(reader);
-        ProcessingTimes = new int[2, Jobs];
-        SetupTimes = new int[2, Jobs, Jobs];
+        Nests = GetNextInteger(reader);
+        Jobs = GetNextInteger(reader);
+        Machines = Enumerable.Range(0, Nests).Select(x => GetNextInteger(reader)).ToArray();
+        ProcessingTimes = new List<int[][]>(Nests);
+        SetupTimes = new List<int[][][]>(Nests);
 
-        for (var m = 0; m < 2; m++) {
-          for (var j = 0; j < Jobs; j++) {
-            ProcessingTimes[m, j] = GetNextNumber(reader);
+        for (var n = 0; n < Nests; n++) {
+          var machines = Machines[n];
+          var pr = new int[machines][];
+          for (var m = 0; m < machines; m++) {
+            pr[m] = new int[Jobs];
+            for (var j = 0; j < Jobs; j++) {
+              pr[m][j] = GetNextInteger(reader);
+            }
           }
+          ProcessingTimes.Add(pr);
         }
-        for (var m = 0; m < 2; m++) {
-          for (var j = 0; j < Jobs; j++) {
-            for (var i = 0; i < Jobs; i++) {
-              SetupTimes[m, j, i] = GetNextNumber(reader);
+        for (var n = 0; n < Nests; n++) {
+          var machines = Machines[n];
+          var sp = new int[machines][][];
+          for (var m = 0; m < machines; m++) {
+            sp[m] = new int[Jobs][];
+            for (var j = 0; j < Jobs; j++) {
+              sp[m][j] = new int[Jobs];
+              for (var i = 0; i < Jobs; i++) {
+                sp[m][j][i] = GetNextInteger(reader);
+              }
             }
+            SetupTimes.Add(sp);
           }
         }
@@ -53,5 +72,5 @@
     }
 
-    private int GetNextNumber(StreamReader reader) {
+    private int GetNextInteger(StreamReader reader) {
       var builder = new StringBuilder();
       int r = reader.Read();
@@ -60,8 +79,15 @@
         if ((c == ' ' || c == '\t' || c == '\r' || c == '\n') && builder.Length > 0)
           return int.Parse(builder.ToString());
+        if (c == 'N' || c == 'M') {
+          // consume the whole line
+          reader.ReadLine();
+          r = reader.Read();
+          continue;
+        }
         if (char.IsNumber(c)) builder.Append(c);
         r = reader.Read();
+        if (r == -1 && builder.Length > 0) return int.Parse(builder.ToString());
       }
-      return -1;
+      throw new InvalidOperationException("Stream does not contain more numbers");
     }
   }
Index: /branches/CFSAP/HeuristicLab.Problems.Instances/3.3/Types/CFSAPData.cs
===================================================================
--- /branches/CFSAP/HeuristicLab.Problems.Instances/3.3/Types/CFSAPData.cs	(revision 15455)
+++ /branches/CFSAP/HeuristicLab.Problems.Instances/3.3/Types/CFSAPData.cs	(revision 15456)
@@ -20,4 +20,6 @@
 #endregion
 
+using System.Collections.Generic;
+
 namespace HeuristicLab.Problems.Instances {
   public class CFSAPData {
@@ -35,18 +37,26 @@
     public int Jobs { get; set; }
     /// <summary>
-    /// The number of machine nests.
+    /// The number of nests.
     /// </summary>
-    public int MachineNests { get; set; }
+    public int Nests { get; set; }
     /// <summary>
-    /// Each row represents the processing times for all the jobs on a certain machine nest
+    /// The number of machine per nest.
     /// </summary>
-    public int[,] ProcessingTimes { get; set; }
+    public int[] Machines { get; set; }
     /// <summary>
-    /// In the first dimension setup times are per machine,
-    /// the second and third dimension represent jobs.
-    /// A set-up from the job to itself might also occur,
-    /// for instance when a cycle is complete and it is the only job at a certain nest
+    /// For each nest, there is a matrix of processing times representing
+    /// for each machine (row) and for each job (column) the processing time.
     /// </summary>
-    public int[,,] SetupTimes { get; set; }
+    public List<int[][]> ProcessingTimes { get; set; }
+    /// <summary>
+    /// For each nest, there is a matrix of setup times representing
+    /// first dimension: for each machine,
+    /// second dimension: for each job (antecedent)
+    /// third dimension: for each job (succedent)
+    /// the setup time.
+    /// A set-up from the job to itself might also occur, for instance when
+    /// a cycle is complete and it is the only job at a certain nest.
+    /// </summary>
+    public List<int[][][]> SetupTimes { get; set; }
   }
 }
Index: /branches/CFSAP/HeuristicLab.Problems.Scheduling.CFSAP/3.3/CFSAPSequenceOnly.cs
===================================================================
--- /branches/CFSAP/HeuristicLab.Problems.Scheduling.CFSAP/3.3/CFSAPSequenceOnly.cs	(revision 15455)
+++ /branches/CFSAP/HeuristicLab.Problems.Scheduling.CFSAP/3.3/CFSAPSequenceOnly.cs	(revision 15456)
@@ -34,5 +34,5 @@
 
 namespace HeuristicLab.Problems.Scheduling.CFSAP {
-  [Item("Cyclic Flow Shop with two machine nests (CFSAP) sequence only", "Non-permutational cyclic flow shop scheduling problem with two machine nests from W. Bozejko.")]
+  [Item("Cyclic flow shop with two machines and a single nest (CFSAP) sequencing problem", "Non-permutational cyclic flow shop scheduling problem with a single nest of two machine from W. Bozejko.")]
   [Creatable(CreatableAttribute.Categories.CombinatorialProblems)]
   [StorableClass]
@@ -90,4 +90,9 @@
     public override double Evaluate(Individual individual, IRandom random) {
       var order = individual.Permutation(Encoding.Name);
+      int T = EvaluateSequence(order);
+      return T;
+    }
+
+    public int EvaluateSequence(Permutation order) {
       var N = order.Length;
       var processingTimes = ProcessingTimesParameter.Value;
@@ -229,18 +234,37 @@
     }
 
+    /// <summary>
+    /// Imports the first nest (index 0) given in the CFSAPData.
+    /// This is the same as calling Load(data, 0).
+    /// </summary>
+    /// <param name="data">The data of all nests.</param>
     public void Load(CFSAPData data) {
-      if (data.MachineNests != 2) throw new ArgumentException("Currently only two machine nests are supported.");
-      ProcessingTimesParameter.Value = new IntMatrix(data.ProcessingTimes);
-      var setups = new ItemList<IntMatrix>(data.MachineNests);
-      for (var m = 0; m < data.SetupTimes.GetLength(0); m++) {
+      Load(data, 0);
+    }
+
+    /// <summary>
+    /// Imports a specific nest given in the CFSAPData.
+    /// </summary>
+    /// <param name="data">The data of all nests.</param>
+    /// <param name="nest">The zero-based index of the nest that should be imported.</param>
+    public void Load(CFSAPData data, int nest) {
+      if (data.Machines[nest] != 2) throw new ArgumentException("Currently only two machines per nest are supported.");
+      if (nest < 0 || nest >= data.Nests) throw new ArgumentException("Nest must be a zero-based index.");
+      var pr = new int[data.Machines[nest], data.Jobs];
+      for (var i = 0; i < data.Machines[nest]; i++)
+        for (var j = 0; j < data.Jobs; j++)
+          pr[i, j] = data.ProcessingTimes[nest][i][j];
+      ProcessingTimesParameter.Value = new IntMatrix(pr);
+      var setups = new ItemList<IntMatrix>(data.Machines[nest]);
+      for (var m = 0; m < data.SetupTimes[nest].GetLength(0); m++) {
         var setupTimes = new int[data.Jobs, data.Jobs];
         for (var i = 0; i < data.Jobs; i++)
-        for (var j = 0; j < data.Jobs; j++)
-          setupTimes[i, j] = data.SetupTimes[m, i, j];
+          for (var j = 0; j < data.Jobs; j++)
+            setupTimes[i, j] = data.SetupTimes[nest][m][i][j];
         setups.Add(new IntMatrix(setupTimes));
       }
       SetupTimesParameter.Value = setups;
       Encoding.Length = data.Jobs;
-      Name = data.Name;
+      Name = data.Name + "-nest" + nest;
       Description = data.Description;
     }
