Index: /trunk/sources/HeuristicLab.Services.Deployment/3.3/PluginDescription.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.Deployment/3.3/PluginDescription.cs	(revision 3216)
+++ /trunk/sources/HeuristicLab.Services.Deployment/3.3/PluginDescription.cs	(revision 3217)
@@ -27,5 +27,5 @@
 
 namespace HeuristicLab.Services.Deployment {
-  [DataContract(Name = "PluginDescription")]
+  [DataContract(Name = "PluginDescription", IsReference = true)]
   public class PluginDescription {
 
@@ -34,4 +34,8 @@
     public string Name {
       get { return name; }
+      set {
+        if (string.IsNullOrEmpty(value)) throw new ArgumentException();
+        name = value;
+      }
     }
 
@@ -40,4 +44,8 @@
     public Version Version {
       get { return version; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        version = value;
+      }
     }
 
@@ -46,4 +54,8 @@
     public string ContactName {
       get { return contactName; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        contactName = value;
+      }
     }
 
@@ -52,4 +64,8 @@
     public string ContactEmail {
       get { return contactEmail; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        contactEmail = value;
+      }
     }
 
@@ -58,4 +74,8 @@
     public string LicenseText {
       get { return licenseText; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        licenseText = value;
+      }
     }
 
@@ -64,7 +84,11 @@
     public List<PluginDescription> Dependencies {
       get { return dependencies; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        dependencies = value;
+      }
     }
 
-    public PluginDescription(string name, Version version, IEnumerable<PluginDescription> dependencies, 
+    public PluginDescription(string name, Version version, IEnumerable<PluginDescription> dependencies,
       string contactName, string contactEmail, string license) {
       if (string.IsNullOrEmpty(name)) throw new ArgumentException("name is empty");
Index: /trunk/sources/HeuristicLab.Services.Deployment/3.3/PluginStore.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.Deployment/3.3/PluginStore.cs	(revision 3216)
+++ /trunk/sources/HeuristicLab.Services.Deployment/3.3/PluginStore.cs	(revision 3217)
@@ -45,5 +45,5 @@
                                 where plugin.Id == pair.PluginId
                                 select plugin
-                  select MakeProductDescription(ctx, p, plugins)).ToList();
+                  select MakeProductDescription(ctx, p, plugins.ToList())).ToList();
         }
       }
@@ -169,5 +169,5 @@
 
       // delete cached entry
-      if (pluginDescriptions.ContainsKey(pluginEntity)) pluginDescriptions.Remove(pluginEntity);
+      if (pluginDescriptions.ContainsKey(pluginEntity.Id)) pluginDescriptions.Remove(pluginEntity.Id);
 
       DeleteOldDependencies(ctx, pluginEntity);
@@ -195,5 +195,5 @@
 
     #region product <-> productDescription transformation
-    private ProductDescription MakeProductDescription(PluginStoreClassesDataContext ctx, Product p, IQueryable<Plugin> plugins) {
+    private ProductDescription MakeProductDescription(PluginStoreClassesDataContext ctx, Product p, IEnumerable<Plugin> plugins) {
       var desc = new ProductDescription(p.Name, new Version(p.Version), from plugin in plugins
                                                                         select MakePluginDescription(ctx, plugin));
@@ -210,19 +210,18 @@
     #region plugin <-> pluginDescription transformation
     // cache for plugin descriptions
-    private Dictionary<Plugin, PluginDescription> pluginDescriptions = new Dictionary<Plugin, PluginDescription>();
+    private Dictionary<long, PluginDescription> pluginDescriptions = new Dictionary<long, PluginDescription>();
     private PluginDescription MakePluginDescription(PluginStoreClassesDataContext ctx, Plugin plugin) {
-      if (!pluginDescriptions.ContainsKey(plugin)) {
+      if (!pluginDescriptions.ContainsKey(plugin.Id)) {
         // no cached description -> create new
-        var desc = new PluginDescription(plugin.Name,
-          new Version(plugin.Version),
-          from dep in GetDependencies(ctx, plugin)
-          select MakePluginDescription(ctx, dep),
-          plugin.ContactName ?? string.Empty,
-          plugin.ContactEmail ?? string.Empty,
-          plugin.License ?? string.Empty
-          );
-        pluginDescriptions[plugin] = desc;
-      }
-      return pluginDescriptions[plugin];
+        var desc = new PluginDescription(plugin.Name, new Version(plugin.Version));
+        pluginDescriptions[plugin.Id] = desc; // and add to cache
+
+        // fill remaining properties of plugin description
+        desc.Dependencies = new List<PluginDescription>(from dep in GetDependencies(ctx, plugin) select MakePluginDescription(ctx, dep));
+        desc.ContactEmail = plugin.ContactEmail ?? string.Empty;
+        desc.ContactName = plugin.ContactName ?? string.Empty;
+        desc.LicenseText = plugin.License ?? string.Empty;
+      }
+      return pluginDescriptions[plugin.Id];
     }
 
