Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs	(revision 17342)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs	(revision 17343)
@@ -25,5 +25,4 @@
 using System.Linq;
 using System.Management;
-using System.Net.NetworkInformation;
 using HeuristicLab.Clients.Hive.SlaveCore.Properties;
 
@@ -133,6 +132,5 @@
       try {
         prog = jobManager.GetExecutionTimes();
-      }
-      catch (Exception ex) {
+      } catch (Exception ex) {
         SlaveClientCom.Instance.LogMessage(string.Format("Exception was thrown while trying to get execution times: {0}", ex.Message));
       }
@@ -140,14 +138,18 @@
     }
 
+    /// <summary>
+    /// Returns the unique machine id of the slave
+    /// </summary>
+    /// <returns><see cref="Guid"/></returns>
     public static Guid GetUniqueMachineId() {
-      Guid id;
-      try {
-        id = GetUniqueMachineIdFromMac();
-      }
-      catch {
-        // fallback if something goes wrong...        
-        id = new Guid(Environment.MachineName.GetHashCode(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-      }
-      return id;
+      // Due to the fact that repeated calculation of the machine ID can lead to a client registering at 
+      // the Hive server multiple times with different IDs it's better to set the unique machine id only 
+      // once, at first startup, and store it in core settings. 
+      if (Settings.Default.MachineId == Guid.Empty) {
+        Settings.Default.MachineId = Guid.NewGuid();
+        Settings.Default.Save();
+      }
+
+      return Settings.Default.MachineId;
     }
 
@@ -170,48 +172,4 @@
     }
 
-    /// <summary>
-    /// Generate a guid based on mac address of the first found nic (yes, mac addresses are not unique...)
-    /// and the machine name.
-    /// Format:
-    /// 
-    ///  D1      D2  D3  Res.   D4
-    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    /// |n a m e|0 0|0 0|0 0 mac address|
-    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    /// 
-    /// The mac address is saved in the last 48 bits of the Data 4 segment 
-    /// of the guid (first 2 bytes of Data 4 are reserved).
-    /// D1 contains the hash of the machinename. 
-    /// </summary>    
-    private static Guid GetUniqueMachineIdFromMac() {
-      //try to get a real network interface, not a virtual one 
-      NetworkInterface validNic = NetworkInterface.GetAllNetworkInterfaces()
-                      .FirstOrDefault(x =>
-                                  !x.Name.Contains(vmwareNameString) &&
-                                  !x.Name.Contains(virtualboxNameString) &&
-                                  (x.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
-                                   x.NetworkInterfaceType == NetworkInterfaceType.GigabitEthernet));
-
-      if (validNic == default(NetworkInterface)) {
-        validNic = NetworkInterface.GetAllNetworkInterfaces().First();
-      }
-
-      byte[] addr = validNic.GetPhysicalAddress().GetAddressBytes();
-      if (addr.Length < macLength || addr.Length > macLongLength) {
-        throw new ArgumentException(string.Format("Error generating slave UID: MAC address has to have a length between {0} and {1} bytes. Actual MAC address is: {2}",
-              macLength, macLongLength, addr));
-      }
-
-      if (addr.Length < macLongLength) {
-        byte[] b = new byte[8];
-        Array.Copy(addr, 0, b, 2, addr.Length);
-        addr = b;
-      }
-
-      // also get machine name and save it to the first 4 bytes                
-      Guid guid = new Guid(Environment.MachineName.GetHashCode(), 0, 0, addr);
-      return guid;
-    }
-
     private static long? GetWMIValue(string clazz, string property) {
       ManagementClass mgtClass = new ManagementClass(clazz);
@@ -223,6 +181,5 @@
             try {
               return long.Parse(prop.Value.ToString());
-            }
-            catch {
+            } catch {
               return null;
             }
@@ -241,6 +198,5 @@
       try {
         mb = (int)(memCounter.NextValue() / 1024 / 1024);
-      }
-      catch { }
+      } catch { }
       return mb;
     }
@@ -251,6 +207,5 @@
       try {
         return cpuCounter.NextValue();
-      }
-      catch { }
+      } catch { }
       return cpuVal;
     }
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.Designer.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.Designer.cs	(revision 17342)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.Designer.cs	(revision 17343)
@@ -1,9 +1,9 @@
 ﻿//------------------------------------------------------------------------------
 // <auto-generated>
-//     Dieser Code wurde von einem Tool generiert.
-//     Laufzeitversion:4.0.30319.42000
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
 //
-//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
-//     der Code erneut generiert wird.
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
 // </auto-generated>
 //------------------------------------------------------------------------------
@@ -13,5 +13,5 @@
     
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.2.0.0")]
     public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
         
@@ -323,4 +323,16 @@
             }
         }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("00000000-0000-0000-0000-000000000000")]
+        public global::System.Guid MachineId {
+            get {
+                return ((global::System.Guid)(this["MachineId"]));
+            }
+            set {
+                this["MachineId"] = value;
+            }
+        }
     }
 }
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.settings
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.settings	(revision 17342)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.settings	(revision 17343)
@@ -78,4 +78,7 @@
       <Value Profile="(Default)">00:05:00</Value>
     </Setting>
+    <Setting Name="MachineId" Type="System.Guid" Scope="User">
+      <Value Profile="(Default)">00000000-0000-0000-0000-000000000000</Value>
+    </Setting>
   </Settings>
 </SettingsFile>
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/app.config
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/app.config	(revision 17342)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/app.config	(revision 17343)
@@ -84,4 +84,7 @@
       <setting name="CheckpointCheckInterval" serializeAs="String">
         <value>00:05:00</value>
+      </setting>
+      <setting name="MachineId" serializeAs="String">
+        <value>00000000-0000-0000-0000-000000000000</value>
       </setting>
     </HeuristicLab.Clients.Hive.SlaveCore.Properties.Settings>
