Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ExternalEvaluationMessages.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ExternalEvaluationMessages.cs	(revision 3859)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ExternalEvaluationMessages.cs	(revision 3859)
@@ -0,0 +1,3713 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  
+  public static partial class ExternalEvaluationMessages {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static ExternalEvaluationMessages() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "CiBFeHRlcm5hbEV2YWx1YXRpb25NZXNzYWdlcy5wcm90bxIoSGV1cmlzdGlj" + 
+          "TGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVhdGlvbiK+CgoPU29sdXRpb25N" + 
+          "ZXNzYWdlEhIKCnNvbHV0aW9uSWQYASACKAUSXgoLaW50ZWdlclZhcnMYAiAD" + 
+          "KAsySS5IZXVyaXN0aWNMYWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9u" + 
+          "LlNvbHV0aW9uTWVzc2FnZS5JbnRlZ2VyVmFyaWFibGUSaAoQaW50ZWdlckFy" + 
+          "cmF5VmFycxgDIAMoCzJOLkhldXJpc3RpY0xhYi5Qcm9ibGVtcy5FeHRlcm5h" + 
+          "bEV2YWx1YXRpb24uU29sdXRpb25NZXNzYWdlLkludGVnZXJBcnJheVZhcmlh" + 
+          "YmxlElwKCmRvdWJsZVZhcnMYBCADKAsySC5IZXVyaXN0aWNMYWIuUHJvYmxl" + 
+          "bXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNvbHV0aW9uTWVzc2FnZS5Eb3VibGVW" + 
+          "YXJpYWJsZRJmCg9kb3VibGVBcnJheVZhcnMYBSADKAsyTS5IZXVyaXN0aWNM" + 
+          "YWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNvbHV0aW9uTWVzc2Fn" + 
+          "ZS5Eb3VibGVBcnJheVZhcmlhYmxlElgKCGJvb2xWYXJzGAYgAygLMkYuSGV1" + 
+          "cmlzdGljTGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVhdGlvbi5Tb2x1dGlv" + 
+          "bk1lc3NhZ2UuQm9vbFZhcmlhYmxlEmIKDWJvb2xBcnJheVZhcnMYByADKAsy" + 
+          "Sy5IZXVyaXN0aWNMYWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNv" + 
+          "bHV0aW9uTWVzc2FnZS5Cb29sQXJyYXlWYXJpYWJsZRJcCgpzdHJpbmdWYXJz" + 
+          "GAggAygLMkguSGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVh" + 
+          "dGlvbi5Tb2x1dGlvbk1lc3NhZ2UuU3RyaW5nVmFyaWFibGUSZgoPc3RyaW5n" + 
+          "QXJyYXlWYXJzGAkgAygLMk0uSGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVy" + 
+          "bmFsRXZhbHVhdGlvbi5Tb2x1dGlvbk1lc3NhZ2UuU3RyaW5nQXJyYXlWYXJp" + 
+          "YWJsZRJWCgdyYXdWYXJzGAogAygLMkUuSGV1cmlzdGljTGFiLlByb2JsZW1z" + 
+          "LkV4dGVybmFsRXZhbHVhdGlvbi5Tb2x1dGlvbk1lc3NhZ2UuUmF3VmFyaWFi" + 
+          "bGUaLQoPSW50ZWdlclZhcmlhYmxlEgwKBG5hbWUYASACKAkSDAoEZGF0YRgC" + 
+          "IAEoBRoyChRJbnRlZ2VyQXJyYXlWYXJpYWJsZRIMCgRuYW1lGAEgAigJEgwK" + 
+          "BGRhdGEYAiADKAUaLAoORG91YmxlVmFyaWFibGUSDAoEbmFtZRgBIAIoCRIM" + 
+          "CgRkYXRhGAIgASgBGjEKE0RvdWJsZUFycmF5VmFyaWFibGUSDAoEbmFtZRgB" + 
+          "IAIoCRIMCgRkYXRhGAIgAygBGioKDEJvb2xWYXJpYWJsZRIMCgRuYW1lGAEg" + 
+          "AigJEgwKBGRhdGEYAiABKAgaLwoRQm9vbEFycmF5VmFyaWFibGUSDAoEbmFt" + 
+          "ZRgBIAIoCRIMCgRkYXRhGAIgAygIGiwKDlN0cmluZ1ZhcmlhYmxlEgwKBG5h" + 
+          "bWUYASACKAkSDAoEZGF0YRgCIAEoCRoxChNTdHJpbmdBcnJheVZhcmlhYmxl" + 
+          "EgwKBG5hbWUYASACKAkSDAoEZGF0YRgCIAMoCRopCgtSYXdWYXJpYWJsZRIM" + 
+          "CgRuYW1lGAEgAigJEgwKBGRhdGEYAiABKAwiNQoOUXVhbGl0eU1lc3NhZ2US" + 
+          "EgoKc29sdXRpb25JZBgBIAIoBRIPCgdxdWFsaXR5GAIgAigBMqQBCg9FeGNo" + 
+          "YW5nZVNlcnZpY2USkAEKGUV2YWx1YXRlU2luZ2xlT2JqZWN0aXZlbHkSOS5I" + 
+          "ZXVyaXN0aWNMYWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNvbHV0" + 
+          "aW9uTWVzc2FnZRo4LkhldXJpc3RpY0xhYi5Qcm9ibGVtcy5FeHRlcm5hbEV2" + 
+          "YWx1YXRpb24uUXVhbGl0eU1lc3NhZ2VCLgosY29tLmhldXJpc3RpY2xhYi5w" + 
+          "cm9ibGVtcy5leHRlcm5hbGV2YWx1YXRpb24=");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor,
+                new string[] { "SolutionId", "IntegerVars", "IntegerArrayVars", "DoubleVars", "DoubleArrayVars", "BoolVars", "BoolArrayVars", "StringVars", "StringArrayVars", "RawVars", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[0];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[1];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[2];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[3];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[4];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[5];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[6];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[7];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[8];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor,
+                new string[] { "SolutionId", "Quality", });
+        return null;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  public sealed partial class SolutionMessage : pb::GeneratedMessage<SolutionMessage, SolutionMessage.Builder> {
+    private static readonly SolutionMessage defaultInstance = new Builder().BuildPartial();
+    public static SolutionMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SolutionMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SolutionMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SolutionMessage, SolutionMessage.Builder> InternalFieldAccessors {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public sealed partial class IntegerVariable : pb::GeneratedMessage<IntegerVariable, IntegerVariable.Builder> {
+        private static readonly IntegerVariable defaultInstance = new Builder().BuildPartial();
+        public static IntegerVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override IntegerVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override IntegerVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<IntegerVariable, IntegerVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private int data_ = 0;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public int Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (HasData) {
+            output.WriteInt32(2, Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (HasData) {
+              size += pb::CodedOutputStream.ComputeInt32Size(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static IntegerVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static IntegerVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(IntegerVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<IntegerVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          IntegerVariable result = new IntegerVariable();
+          
+          protected override IntegerVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new IntegerVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Descriptor; }
+          }
+          
+          public override IntegerVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.DefaultInstance; }
+          }
+          
+          public override IntegerVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            IntegerVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is IntegerVariable) {
+              return MergeFrom((IntegerVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(IntegerVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 16: {
+                  Data = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.HasData; }
+          }
+          public int Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(int value) {
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            result.hasData = false;
+            result.data_ = 0;
+            return this;
+          }
+        }
+        static IntegerVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class IntegerArrayVariable : pb::GeneratedMessage<IntegerArrayVariable, IntegerArrayVariable.Builder> {
+        private static readonly IntegerArrayVariable defaultInstance = new Builder().BuildPartial();
+        public static IntegerArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override IntegerArrayVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override IntegerArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<IntegerArrayVariable, IntegerArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<int> data_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public int GetData(int index) {
+          return data_[index];
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (data_.Count > 0) {
+            foreach (int element in data_) {
+              output.WriteInt32(2, element);
+            }
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              foreach (int element in DataList) {
+                dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+              }
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static IntegerArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(IntegerArrayVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<IntegerArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          IntegerArrayVariable result = new IntegerArrayVariable();
+          
+          protected override IntegerArrayVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new IntegerArrayVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Descriptor; }
+          }
+          
+          public override IntegerArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.DefaultInstance; }
+          }
+          
+          public override IntegerArrayVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            result.data_.MakeReadOnly();
+            IntegerArrayVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is IntegerArrayVariable) {
+              return MergeFrom((IntegerArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(IntegerArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              base.AddRange(other.data_, result.data_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 16: {
+                  AddData(input.ReadInt32());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<int> DataList {
+            get { return result.data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public int GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, int value) {
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(int value) {
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<int> values) {
+            base.AddRange(values, result.data_);
+            return this;
+          }
+          public Builder ClearData() {
+            result.data_.Clear();
+            return this;
+          }
+        }
+        static IntegerArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class DoubleVariable : pb::GeneratedMessage<DoubleVariable, DoubleVariable.Builder> {
+        private static readonly DoubleVariable defaultInstance = new Builder().BuildPartial();
+        public static DoubleVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override DoubleVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override DoubleVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<DoubleVariable, DoubleVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private double data_ = 0D;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public double Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (HasData) {
+            output.WriteDouble(2, Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (HasData) {
+              size += pb::CodedOutputStream.ComputeDoubleSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static DoubleVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static DoubleVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(DoubleVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<DoubleVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          DoubleVariable result = new DoubleVariable();
+          
+          protected override DoubleVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new DoubleVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Descriptor; }
+          }
+          
+          public override DoubleVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.DefaultInstance; }
+          }
+          
+          public override DoubleVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            DoubleVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is DoubleVariable) {
+              return MergeFrom((DoubleVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(DoubleVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 17: {
+                  Data = input.ReadDouble();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.HasData; }
+          }
+          public double Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(double value) {
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            result.hasData = false;
+            result.data_ = 0D;
+            return this;
+          }
+        }
+        static DoubleVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class DoubleArrayVariable : pb::GeneratedMessage<DoubleArrayVariable, DoubleArrayVariable.Builder> {
+        private static readonly DoubleArrayVariable defaultInstance = new Builder().BuildPartial();
+        public static DoubleArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override DoubleArrayVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override DoubleArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<DoubleArrayVariable, DoubleArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<double> data_ = new pbc::PopsicleList<double>();
+        public scg::IList<double> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public double GetData(int index) {
+          return data_[index];
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (data_.Count > 0) {
+            foreach (double element in data_) {
+              output.WriteDouble(2, element);
+            }
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              dataSize = 8 * data_.Count;
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static DoubleArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(DoubleArrayVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<DoubleArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          DoubleArrayVariable result = new DoubleArrayVariable();
+          
+          protected override DoubleArrayVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new DoubleArrayVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Descriptor; }
+          }
+          
+          public override DoubleArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.DefaultInstance; }
+          }
+          
+          public override DoubleArrayVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            result.data_.MakeReadOnly();
+            DoubleArrayVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is DoubleArrayVariable) {
+              return MergeFrom((DoubleArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(DoubleArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              base.AddRange(other.data_, result.data_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 17: {
+                  AddData(input.ReadDouble());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<double> DataList {
+            get { return result.data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public double GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, double value) {
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(double value) {
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<double> values) {
+            base.AddRange(values, result.data_);
+            return this;
+          }
+          public Builder ClearData() {
+            result.data_.Clear();
+            return this;
+          }
+        }
+        static DoubleArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class BoolVariable : pb::GeneratedMessage<BoolVariable, BoolVariable.Builder> {
+        private static readonly BoolVariable defaultInstance = new Builder().BuildPartial();
+        public static BoolVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override BoolVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override BoolVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<BoolVariable, BoolVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private bool data_ = false;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public bool Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (HasData) {
+            output.WriteBool(2, Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (HasData) {
+              size += pb::CodedOutputStream.ComputeBoolSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static BoolVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static BoolVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(BoolVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<BoolVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          BoolVariable result = new BoolVariable();
+          
+          protected override BoolVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new BoolVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Descriptor; }
+          }
+          
+          public override BoolVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.DefaultInstance; }
+          }
+          
+          public override BoolVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            BoolVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is BoolVariable) {
+              return MergeFrom((BoolVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(BoolVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 16: {
+                  Data = input.ReadBool();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.HasData; }
+          }
+          public bool Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(bool value) {
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            result.hasData = false;
+            result.data_ = false;
+            return this;
+          }
+        }
+        static BoolVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class BoolArrayVariable : pb::GeneratedMessage<BoolArrayVariable, BoolArrayVariable.Builder> {
+        private static readonly BoolArrayVariable defaultInstance = new Builder().BuildPartial();
+        public static BoolArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override BoolArrayVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override BoolArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<BoolArrayVariable, BoolArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<bool> data_ = new pbc::PopsicleList<bool>();
+        public scg::IList<bool> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public bool GetData(int index) {
+          return data_[index];
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (data_.Count > 0) {
+            foreach (bool element in data_) {
+              output.WriteBool(2, element);
+            }
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              dataSize = 1 * data_.Count;
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static BoolArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static BoolArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(BoolArrayVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<BoolArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          BoolArrayVariable result = new BoolArrayVariable();
+          
+          protected override BoolArrayVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new BoolArrayVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Descriptor; }
+          }
+          
+          public override BoolArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.DefaultInstance; }
+          }
+          
+          public override BoolArrayVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            result.data_.MakeReadOnly();
+            BoolArrayVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is BoolArrayVariable) {
+              return MergeFrom((BoolArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(BoolArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              base.AddRange(other.data_, result.data_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 16: {
+                  AddData(input.ReadBool());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<bool> DataList {
+            get { return result.data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public bool GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, bool value) {
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(bool value) {
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<bool> values) {
+            base.AddRange(values, result.data_);
+            return this;
+          }
+          public Builder ClearData() {
+            result.data_.Clear();
+            return this;
+          }
+        }
+        static BoolArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class StringVariable : pb::GeneratedMessage<StringVariable, StringVariable.Builder> {
+        private static readonly StringVariable defaultInstance = new Builder().BuildPartial();
+        public static StringVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override StringVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override StringVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<StringVariable, StringVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private string data_ = "";
+        public bool HasData {
+          get { return hasData; }
+        }
+        public string Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (HasData) {
+            output.WriteString(2, Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (HasData) {
+              size += pb::CodedOutputStream.ComputeStringSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static StringVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static StringVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(StringVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<StringVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          StringVariable result = new StringVariable();
+          
+          protected override StringVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new StringVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Descriptor; }
+          }
+          
+          public override StringVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.DefaultInstance; }
+          }
+          
+          public override StringVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            StringVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is StringVariable) {
+              return MergeFrom((StringVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(StringVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 18: {
+                  Data = input.ReadString();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.HasData; }
+          }
+          public string Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            result.hasData = false;
+            result.data_ = "";
+            return this;
+          }
+        }
+        static StringVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class StringArrayVariable : pb::GeneratedMessage<StringArrayVariable, StringArrayVariable.Builder> {
+        private static readonly StringArrayVariable defaultInstance = new Builder().BuildPartial();
+        public static StringArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override StringArrayVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override StringArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<StringArrayVariable, StringArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<string> data_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public string GetData(int index) {
+          return data_[index];
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (data_.Count > 0) {
+            foreach (string element in data_) {
+              output.WriteString(2, element);
+            }
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              foreach (string element in DataList) {
+                dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+              }
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static StringArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static StringArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(StringArrayVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<StringArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          StringArrayVariable result = new StringArrayVariable();
+          
+          protected override StringArrayVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new StringArrayVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Descriptor; }
+          }
+          
+          public override StringArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.DefaultInstance; }
+          }
+          
+          public override StringArrayVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            result.data_.MakeReadOnly();
+            StringArrayVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is StringArrayVariable) {
+              return MergeFrom((StringArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(StringArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              base.AddRange(other.data_, result.data_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 18: {
+                  AddData(input.ReadString());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> DataList {
+            get { return result.data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public string GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<string> values) {
+            base.AddRange(values, result.data_);
+            return this;
+          }
+          public Builder ClearData() {
+            result.data_.Clear();
+            return this;
+          }
+        }
+        static StringArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class RawVariable : pb::GeneratedMessage<RawVariable, RawVariable.Builder> {
+        private static readonly RawVariable defaultInstance = new Builder().BuildPartial();
+        public static RawVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override RawVariable DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override RawVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<RawVariable, RawVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private pb::ByteString data_ = pb::ByteString.Empty;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public pb::ByteString Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasName) {
+            output.WriteString(1, Name);
+          }
+          if (HasData) {
+            output.WriteBytes(2, Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (HasData) {
+              size += pb::CodedOutputStream.ComputeBytesSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static RawVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static RawVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(RawVariable prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<RawVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          RawVariable result = new RawVariable();
+          
+          protected override RawVariable MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new RawVariable();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Descriptor; }
+          }
+          
+          public override RawVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.DefaultInstance; }
+          }
+          
+          public override RawVariable BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            RawVariable returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is RawVariable) {
+              return MergeFrom((RawVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(RawVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.DefaultInstance) return this;
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Name = input.ReadString();
+                  break;
+                }
+                case 18: {
+                  Data = input.ReadBytes();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasName {
+            get { return result.HasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.HasData; }
+          }
+          public pb::ByteString Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(pb::ByteString value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            result.hasData = false;
+            result.data_ = pb::ByteString.Empty;
+            return this;
+          }
+        }
+        static RawVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int SolutionIdFieldNumber = 1;
+    private bool hasSolutionId;
+    private int solutionId_ = 0;
+    public bool HasSolutionId {
+      get { return hasSolutionId; }
+    }
+    public int SolutionId {
+      get { return solutionId_; }
+    }
+    
+    public const int IntegerVarsFieldNumber = 2;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> integerVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> IntegerVarsList {
+      get { return integerVars_; }
+    }
+    public int IntegerVarsCount {
+      get { return integerVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable GetIntegerVars(int index) {
+      return integerVars_[index];
+    }
+    
+    public const int IntegerArrayVarsFieldNumber = 3;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> integerArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> IntegerArrayVarsList {
+      get { return integerArrayVars_; }
+    }
+    public int IntegerArrayVarsCount {
+      get { return integerArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable GetIntegerArrayVars(int index) {
+      return integerArrayVars_[index];
+    }
+    
+    public const int DoubleVarsFieldNumber = 4;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> doubleVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> DoubleVarsList {
+      get { return doubleVars_; }
+    }
+    public int DoubleVarsCount {
+      get { return doubleVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable GetDoubleVars(int index) {
+      return doubleVars_[index];
+    }
+    
+    public const int DoubleArrayVarsFieldNumber = 5;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> doubleArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> DoubleArrayVarsList {
+      get { return doubleArrayVars_; }
+    }
+    public int DoubleArrayVarsCount {
+      get { return doubleArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable GetDoubleArrayVars(int index) {
+      return doubleArrayVars_[index];
+    }
+    
+    public const int BoolVarsFieldNumber = 6;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> boolVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> BoolVarsList {
+      get { return boolVars_; }
+    }
+    public int BoolVarsCount {
+      get { return boolVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable GetBoolVars(int index) {
+      return boolVars_[index];
+    }
+    
+    public const int BoolArrayVarsFieldNumber = 7;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> boolArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> BoolArrayVarsList {
+      get { return boolArrayVars_; }
+    }
+    public int BoolArrayVarsCount {
+      get { return boolArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable GetBoolArrayVars(int index) {
+      return boolArrayVars_[index];
+    }
+    
+    public const int StringVarsFieldNumber = 8;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> stringVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> StringVarsList {
+      get { return stringVars_; }
+    }
+    public int StringVarsCount {
+      get { return stringVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable GetStringVars(int index) {
+      return stringVars_[index];
+    }
+    
+    public const int StringArrayVarsFieldNumber = 9;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> stringArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> StringArrayVarsList {
+      get { return stringArrayVars_; }
+    }
+    public int StringArrayVarsCount {
+      get { return stringArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable GetStringArrayVars(int index) {
+      return stringArrayVars_[index];
+    }
+    
+    public const int RawVarsFieldNumber = 10;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> rawVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> RawVarsList {
+      get { return rawVars_; }
+    }
+    public int RawVarsCount {
+      get { return rawVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable GetRawVars(int index) {
+      return rawVars_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasSolutionId) return false;
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable element in IntegerVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable element in IntegerArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable element in DoubleVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable element in DoubleArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable element in BoolVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable element in BoolArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable element in StringVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable element in StringArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable element in RawVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasSolutionId) {
+        output.WriteInt32(1, SolutionId);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable element in IntegerVarsList) {
+        output.WriteMessage(2, element);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable element in IntegerArrayVarsList) {
+        output.WriteMessage(3, element);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable element in DoubleVarsList) {
+        output.WriteMessage(4, element);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable element in DoubleArrayVarsList) {
+        output.WriteMessage(5, element);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable element in BoolVarsList) {
+        output.WriteMessage(6, element);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable element in BoolArrayVarsList) {
+        output.WriteMessage(7, element);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable element in StringVarsList) {
+        output.WriteMessage(8, element);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable element in StringArrayVarsList) {
+        output.WriteMessage(9, element);
+      }
+      foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable element in RawVarsList) {
+        output.WriteMessage(10, element);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasSolutionId) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, SolutionId);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable element in IntegerVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable element in IntegerArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(3, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable element in DoubleVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(4, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable element in DoubleArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(5, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable element in BoolVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(6, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable element in BoolArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(7, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable element in StringVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(8, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable element in StringArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(9, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable element in RawVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(10, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static SolutionMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SolutionMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SolutionMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<SolutionMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SolutionMessage result = new SolutionMessage();
+      
+      protected override SolutionMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SolutionMessage();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Descriptor; }
+      }
+      
+      public override SolutionMessage DefaultInstanceForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DefaultInstance; }
+      }
+      
+      public override SolutionMessage BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.integerVars_.MakeReadOnly();
+        result.integerArrayVars_.MakeReadOnly();
+        result.doubleVars_.MakeReadOnly();
+        result.doubleArrayVars_.MakeReadOnly();
+        result.boolVars_.MakeReadOnly();
+        result.boolArrayVars_.MakeReadOnly();
+        result.stringVars_.MakeReadOnly();
+        result.stringArrayVars_.MakeReadOnly();
+        result.rawVars_.MakeReadOnly();
+        SolutionMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SolutionMessage) {
+          return MergeFrom((SolutionMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SolutionMessage other) {
+        if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DefaultInstance) return this;
+        if (other.HasSolutionId) {
+          SolutionId = other.SolutionId;
+        }
+        if (other.integerVars_.Count != 0) {
+          base.AddRange(other.integerVars_, result.integerVars_);
+        }
+        if (other.integerArrayVars_.Count != 0) {
+          base.AddRange(other.integerArrayVars_, result.integerArrayVars_);
+        }
+        if (other.doubleVars_.Count != 0) {
+          base.AddRange(other.doubleVars_, result.doubleVars_);
+        }
+        if (other.doubleArrayVars_.Count != 0) {
+          base.AddRange(other.doubleArrayVars_, result.doubleArrayVars_);
+        }
+        if (other.boolVars_.Count != 0) {
+          base.AddRange(other.boolVars_, result.boolVars_);
+        }
+        if (other.boolArrayVars_.Count != 0) {
+          base.AddRange(other.boolArrayVars_, result.boolArrayVars_);
+        }
+        if (other.stringVars_.Count != 0) {
+          base.AddRange(other.stringVars_, result.stringVars_);
+        }
+        if (other.stringArrayVars_.Count != 0) {
+          base.AddRange(other.stringArrayVars_, result.stringArrayVars_);
+        }
+        if (other.rawVars_.Count != 0) {
+          base.AddRange(other.rawVars_, result.rawVars_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 8: {
+              SolutionId = input.ReadInt32();
+              break;
+            }
+            case 18: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddIntegerVars(subBuilder.BuildPartial());
+              break;
+            }
+            case 26: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddIntegerArrayVars(subBuilder.BuildPartial());
+              break;
+            }
+            case 34: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddDoubleVars(subBuilder.BuildPartial());
+              break;
+            }
+            case 42: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddDoubleArrayVars(subBuilder.BuildPartial());
+              break;
+            }
+            case 50: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddBoolVars(subBuilder.BuildPartial());
+              break;
+            }
+            case 58: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddBoolArrayVars(subBuilder.BuildPartial());
+              break;
+            }
+            case 66: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddStringVars(subBuilder.BuildPartial());
+              break;
+            }
+            case 74: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddStringArrayVars(subBuilder.BuildPartial());
+              break;
+            }
+            case 82: {
+              global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder subBuilder = global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRawVars(subBuilder.BuildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasSolutionId {
+        get { return result.HasSolutionId; }
+      }
+      public int SolutionId {
+        get { return result.SolutionId; }
+        set { SetSolutionId(value); }
+      }
+      public Builder SetSolutionId(int value) {
+        result.hasSolutionId = true;
+        result.solutionId_ = value;
+        return this;
+      }
+      public Builder ClearSolutionId() {
+        result.hasSolutionId = false;
+        result.solutionId_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> IntegerVarsList {
+        get { return result.integerVars_; }
+      }
+      public int IntegerVarsCount {
+        get { return result.IntegerVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable GetIntegerVars(int index) {
+        return result.GetIntegerVars(index);
+      }
+      public Builder SetIntegerVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.integerVars_[index] = value;
+        return this;
+      }
+      public Builder SetIntegerVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.integerVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddIntegerVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.integerVars_.Add(value);
+        return this;
+      }
+      public Builder AddIntegerVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.integerVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeIntegerVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> values) {
+        base.AddRange(values, result.integerVars_);
+        return this;
+      }
+      public Builder ClearIntegerVars() {
+        result.integerVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> IntegerArrayVarsList {
+        get { return result.integerArrayVars_; }
+      }
+      public int IntegerArrayVarsCount {
+        get { return result.IntegerArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable GetIntegerArrayVars(int index) {
+        return result.GetIntegerArrayVars(index);
+      }
+      public Builder SetIntegerArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.integerArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetIntegerArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.integerArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddIntegerArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.integerArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddIntegerArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.integerArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeIntegerArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> values) {
+        base.AddRange(values, result.integerArrayVars_);
+        return this;
+      }
+      public Builder ClearIntegerArrayVars() {
+        result.integerArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> DoubleVarsList {
+        get { return result.doubleVars_; }
+      }
+      public int DoubleVarsCount {
+        get { return result.DoubleVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable GetDoubleVars(int index) {
+        return result.GetDoubleVars(index);
+      }
+      public Builder SetDoubleVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.doubleVars_[index] = value;
+        return this;
+      }
+      public Builder SetDoubleVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.doubleVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddDoubleVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.doubleVars_.Add(value);
+        return this;
+      }
+      public Builder AddDoubleVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.doubleVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeDoubleVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> values) {
+        base.AddRange(values, result.doubleVars_);
+        return this;
+      }
+      public Builder ClearDoubleVars() {
+        result.doubleVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> DoubleArrayVarsList {
+        get { return result.doubleArrayVars_; }
+      }
+      public int DoubleArrayVarsCount {
+        get { return result.DoubleArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable GetDoubleArrayVars(int index) {
+        return result.GetDoubleArrayVars(index);
+      }
+      public Builder SetDoubleArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.doubleArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetDoubleArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.doubleArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddDoubleArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.doubleArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddDoubleArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.doubleArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeDoubleArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> values) {
+        base.AddRange(values, result.doubleArrayVars_);
+        return this;
+      }
+      public Builder ClearDoubleArrayVars() {
+        result.doubleArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> BoolVarsList {
+        get { return result.boolVars_; }
+      }
+      public int BoolVarsCount {
+        get { return result.BoolVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable GetBoolVars(int index) {
+        return result.GetBoolVars(index);
+      }
+      public Builder SetBoolVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.boolVars_[index] = value;
+        return this;
+      }
+      public Builder SetBoolVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.boolVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddBoolVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.boolVars_.Add(value);
+        return this;
+      }
+      public Builder AddBoolVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.boolVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeBoolVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> values) {
+        base.AddRange(values, result.boolVars_);
+        return this;
+      }
+      public Builder ClearBoolVars() {
+        result.boolVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> BoolArrayVarsList {
+        get { return result.boolArrayVars_; }
+      }
+      public int BoolArrayVarsCount {
+        get { return result.BoolArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable GetBoolArrayVars(int index) {
+        return result.GetBoolArrayVars(index);
+      }
+      public Builder SetBoolArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.boolArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetBoolArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.boolArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddBoolArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.boolArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddBoolArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.boolArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeBoolArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> values) {
+        base.AddRange(values, result.boolArrayVars_);
+        return this;
+      }
+      public Builder ClearBoolArrayVars() {
+        result.boolArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> StringVarsList {
+        get { return result.stringVars_; }
+      }
+      public int StringVarsCount {
+        get { return result.StringVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable GetStringVars(int index) {
+        return result.GetStringVars(index);
+      }
+      public Builder SetStringVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.stringVars_[index] = value;
+        return this;
+      }
+      public Builder SetStringVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.stringVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddStringVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.stringVars_.Add(value);
+        return this;
+      }
+      public Builder AddStringVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.stringVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeStringVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> values) {
+        base.AddRange(values, result.stringVars_);
+        return this;
+      }
+      public Builder ClearStringVars() {
+        result.stringVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> StringArrayVarsList {
+        get { return result.stringArrayVars_; }
+      }
+      public int StringArrayVarsCount {
+        get { return result.StringArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable GetStringArrayVars(int index) {
+        return result.GetStringArrayVars(index);
+      }
+      public Builder SetStringArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.stringArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetStringArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.stringArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddStringArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.stringArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddStringArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.stringArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeStringArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> values) {
+        base.AddRange(values, result.stringArrayVars_);
+        return this;
+      }
+      public Builder ClearStringArrayVars() {
+        result.stringArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> RawVarsList {
+        get { return result.rawVars_; }
+      }
+      public int RawVarsCount {
+        get { return result.RawVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable GetRawVars(int index) {
+        return result.GetRawVars(index);
+      }
+      public Builder SetRawVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.rawVars_[index] = value;
+        return this;
+      }
+      public Builder SetRawVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.rawVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRawVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.rawVars_.Add(value);
+        return this;
+      }
+      public Builder AddRawVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.rawVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRawVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> values) {
+        base.AddRange(values, result.rawVars_);
+        return this;
+      }
+      public Builder ClearRawVars() {
+        result.rawVars_.Clear();
+        return this;
+      }
+    }
+    static SolutionMessage() {
+      object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+    }
+  }
+  
+  public sealed partial class QualityMessage : pb::GeneratedMessage<QualityMessage, QualityMessage.Builder> {
+    private static readonly QualityMessage defaultInstance = new Builder().BuildPartial();
+    public static QualityMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override QualityMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override QualityMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<QualityMessage, QualityMessage.Builder> InternalFieldAccessors {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable; }
+    }
+    
+    public const int SolutionIdFieldNumber = 1;
+    private bool hasSolutionId;
+    private int solutionId_ = 0;
+    public bool HasSolutionId {
+      get { return hasSolutionId; }
+    }
+    public int SolutionId {
+      get { return solutionId_; }
+    }
+    
+    public const int QualityFieldNumber = 2;
+    private bool hasQuality;
+    private double quality_ = 0D;
+    public bool HasQuality {
+      get { return hasQuality; }
+    }
+    public double Quality {
+      get { return quality_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasSolutionId) return false;
+        if (!hasQuality) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasSolutionId) {
+        output.WriteInt32(1, SolutionId);
+      }
+      if (HasQuality) {
+        output.WriteDouble(2, Quality);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasSolutionId) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, SolutionId);
+        }
+        if (HasQuality) {
+          size += pb::CodedOutputStream.ComputeDoubleSize(2, Quality);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static QualityMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static QualityMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(QualityMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<QualityMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      QualityMessage result = new QualityMessage();
+      
+      protected override QualityMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new QualityMessage();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Descriptor; }
+      }
+      
+      public override QualityMessage DefaultInstanceForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance; }
+      }
+      
+      public override QualityMessage BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        QualityMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is QualityMessage) {
+          return MergeFrom((QualityMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(QualityMessage other) {
+        if (other == global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance) return this;
+        if (other.HasSolutionId) {
+          SolutionId = other.SolutionId;
+        }
+        if (other.HasQuality) {
+          Quality = other.Quality;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 8: {
+              SolutionId = input.ReadInt32();
+              break;
+            }
+            case 17: {
+              Quality = input.ReadDouble();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasSolutionId {
+        get { return result.HasSolutionId; }
+      }
+      public int SolutionId {
+        get { return result.SolutionId; }
+        set { SetSolutionId(value); }
+      }
+      public Builder SetSolutionId(int value) {
+        result.hasSolutionId = true;
+        result.solutionId_ = value;
+        return this;
+      }
+      public Builder ClearSolutionId() {
+        result.hasSolutionId = false;
+        result.solutionId_ = 0;
+        return this;
+      }
+      
+      public bool HasQuality {
+        get { return result.HasQuality; }
+      }
+      public double Quality {
+        get { return result.Quality; }
+        set { SetQuality(value); }
+      }
+      public Builder SetQuality(double value) {
+        result.hasQuality = true;
+        result.quality_ = value;
+        return this;
+      }
+      public Builder ClearQuality() {
+        result.hasQuality = false;
+        result.quality_ = 0D;
+        return this;
+      }
+    }
+    static QualityMessage() {
+      object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  public abstract class ExchangeService : pb::IService {
+    public abstract void EvaluateSingleObjectively(
+        pb::IRpcController controller,
+        global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage request,
+        global::System.Action<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage> done);
+    
+    public static pbd::ServiceDescriptor Descriptor {
+      get { return ExternalEvaluationMessages.Descriptor.Services[0]; }
+    }
+    public pbd::ServiceDescriptor DescriptorForType {
+      get { return Descriptor; }
+    }
+    
+    public void CallMethod(
+        pbd::MethodDescriptor method,
+        pb::IRpcController controller,
+        pb::IMessage request,
+        global::System.Action<pb::IMessage> done) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.CallMethod() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          this.EvaluateSingleObjectively(controller, (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage) request,
+              pb::RpcUtil.SpecializeCallback<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage>(
+              done));
+          return;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.GetRequestPrototype() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DefaultInstance;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+            "Service.GetResponsePrototype() given method descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public static Stub CreateStub(pb::IRpcChannel channel) {
+      return new Stub(channel);
+    }
+    
+    public class Stub : global::HeuristicLab.Problems.ExternalEvaluation.ExchangeService {
+      internal Stub(pb::IRpcChannel channel) {
+        this.channel = channel;
+      }
+      
+      private readonly pb::IRpcChannel channel;
+      
+      public pb::IRpcChannel Channel {
+        get { return channel; }
+      }
+      
+      public override void EvaluateSingleObjectively(
+          pb::IRpcController controller,
+          global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage request,
+          global::System.Action<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage> done) {
+        channel.CallMethod(Descriptor.Methods[0],
+            controller, request, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance,
+            pb::RpcUtil.GeneralizeCallback<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder>(done, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance));
+      }
+    }
+  }
+  #endregion
+  
+}
Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ExternalEvaluationMessages.proto
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ExternalEvaluationMessages.proto	(revision 3857)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ExternalEvaluationMessages.proto	(revision 3859)
@@ -2,16 +2,18 @@
 option java_package = "com.heuristiclab.problems.externalevaluation";
 
-message MainMessage {
+message SolutionMessage {
+  required int32 solutionId = 1;
+  
   message IntegerVariable {
     required string name = 1;
     optional int32 data = 2;
   }
-  repeated IntegerVariable integerVars = 1;
+  repeated IntegerVariable integerVars = 2;
   
   message IntegerArrayVariable {
     required string name = 1;
-    repeated int32 data = 2 [packed = true];
+    repeated int32 data = 2;
   }
-  repeated IntegerArrayVariable integerArrayVars = 2;
+  repeated IntegerArrayVariable integerArrayVars = 3;
   
   message DoubleVariable {
@@ -19,5 +21,5 @@
     optional double data = 2;
   }
-  repeated DoubleVariable doubleVars = 3;
+  repeated DoubleVariable doubleVars = 4;
   
   message DoubleArrayVariable {
@@ -25,5 +27,5 @@
     repeated double data = 2;
   }
-  repeated DoubleArrayVariable doubleArrayVars = 4;
+  repeated DoubleArrayVariable doubleArrayVars = 5;
   
   message BoolVariable {
@@ -31,5 +33,5 @@
     optional bool data = 2;
   }
-  repeated BoolVariable boolVars = 5;
+  repeated BoolVariable boolVars = 6;
   
   message BoolArrayVariable {
@@ -37,5 +39,5 @@
     repeated bool data = 2;
   }
-  repeated BoolArrayVariable boolArrayVars = 6;
+  repeated BoolArrayVariable boolArrayVars = 7;
   
   message StringVariable {
@@ -43,5 +45,5 @@
     optional string data = 2;
   }
-  repeated StringVariable stringVars = 7;
+  repeated StringVariable stringVars = 8;
   
   message StringArrayVariable {
@@ -49,5 +51,5 @@
     repeated string data = 2;
   }
-  repeated StringArrayVariable stringArrayVars = 8;
+  repeated StringArrayVariable stringArrayVars = 9;
   
   message RawVariable {
@@ -55,8 +57,13 @@
     optional bytes data = 2;
   }
-  repeated RawVariable rawVars = 9;
+  repeated RawVariable rawVars = 10;
 }
 
+message QualityMessage {
+  required int32 solutionId = 1;
+  required double quality = 2;
+}
+  
 service ExchangeService {
-  rpc Exchange (MainMessage) returns (MainMessage);
+  rpc EvaluateSingleObjectively (SolutionMessage) returns (QualityMessage);
 }
Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ProcessProtos.cmd
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ProcessProtos.cmd	(revision 3859)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Protos/ProcessProtos.cmd	(revision 3859)
@@ -0,0 +1,6 @@
+cd "%ProjectDir%"Protos
+
+for %%i in (*.proto) do (
+  "%SolutionDir%"protoc -otmp %%i
+  "%SolutionDir%"ProtoGen tmp
+  del tmp)
