Index: stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/EngineHiveTask.cs
===================================================================
--- stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/EngineHiveTask.cs	(revision 12685)
+++ stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/EngineHiveTask.cs	(revision 12686)
@@ -47,7 +47,8 @@
 
     public override TaskData GetAsTaskData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
-      plugins = new List<IPluginDescription>();
-      if (this.itemTask == null)
+      if (ItemTask == null) {
+        plugins = new List<IPluginDescription>();
         return null;
+      }
 
       TaskData jobData = new TaskData();
@@ -60,5 +61,5 @@
       jobData.Data = PersistenceUtil.Serialize(ItemTask, out usedTypes);
 
-      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
+      plugins = PluginUtil.GetPluginsForTask(usedTypes, ItemTask);
       return jobData;
     }
Index: stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs
===================================================================
--- stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs	(revision 12685)
+++ stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs	(revision 12686)
@@ -295,12 +295,13 @@
     /// </param>
     public virtual TaskData GetAsTaskData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
-      plugins = new List<IPluginDescription>();
-      if (this.itemTask == null)
+      if (ItemTask == null) {
+        plugins = new List<IPluginDescription>();
         return null;
+      }
 
       IEnumerable<Type> usedTypes;
-      byte[] taskByteArray = PersistenceUtil.Serialize(this.ItemTask, out usedTypes);
+      byte[] taskByteArray = PersistenceUtil.Serialize(ItemTask, out usedTypes);
       TaskData taskData = new TaskData() { TaskId = task.Id, Data = taskByteArray };
-      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
+      plugins = PluginUtil.GetPluginsForTask(usedTypes, ItemTask);
       return taskData;
     }
Index: stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs
===================================================================
--- stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs	(revision 12685)
+++ stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs	(revision 12686)
@@ -347,27 +347,28 @@
     /// </param>
     public override TaskData GetAsTaskData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
-      plugins = new List<IPluginDescription>();
-      if (this.itemTask == null) // || this.jobItem.Optimizer == null
+      if (ItemTask == null) {
+        plugins = new List<IPluginDescription>();
         return null;
+      }
 
       IEnumerable<Type> usedTypes;
       byte[] jobByteArray;
-      if (withoutChildOptimizers && this.ItemTask.Item is Optimization.Experiment) {
-        OptimizerTask clonedJob = (OptimizerTask)this.ItemTask.Clone(); // use a cloned task, so that the childHiveJob don't get confused
+      if (withoutChildOptimizers && ItemTask.Item is Optimization.Experiment) {
+        OptimizerTask clonedJob = (OptimizerTask)ItemTask.Clone(); // use a cloned task, so that the childHiveJob don't get confused
         clonedJob.OptimizerAsExperiment.Optimizers.Clear();
         jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
-      } else if (withoutChildOptimizers && this.ItemTask.Item is Optimization.BatchRun) {
-        OptimizerTask clonedJob = (OptimizerTask)this.ItemTask.Clone();
+      } else if (withoutChildOptimizers && ItemTask.Item is Optimization.BatchRun) {
+        OptimizerTask clonedJob = (OptimizerTask)ItemTask.Clone();
         clonedJob.OptimizerAsBatchRun.Optimizer = null;
         jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
-      } else if (this.ItemTask.Item is IAlgorithm) {
-        ((IAlgorithm)this.ItemTask.Item).StoreAlgorithmInEachRun = false; // avoid storing the algorithm in runs to reduce size
-        jobByteArray = PersistenceUtil.Serialize(this.ItemTask, out usedTypes);
+      } else if (ItemTask.Item is IAlgorithm) {
+        ((IAlgorithm)ItemTask.Item).StoreAlgorithmInEachRun = false; // avoid storing the algorithm in runs to reduce size
+        jobByteArray = PersistenceUtil.Serialize(ItemTask, out usedTypes);
       } else {
-        jobByteArray = PersistenceUtil.Serialize(this.ItemTask, out usedTypes);
+        jobByteArray = PersistenceUtil.Serialize(ItemTask, out usedTypes);
       }
 
       TaskData jobData = new TaskData() { TaskId = task.Id, Data = jobByteArray };
-      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
+      plugins = PluginUtil.GetPluginsForTask(usedTypes, ItemTask);
       return jobData;
     }
Index: stable/HeuristicLab.Clients.Hive/3.3/Util/PluginUtil.cs
===================================================================
--- stable/HeuristicLab.Clients.Hive/3.3/Util/PluginUtil.cs	(revision 12685)
+++ stable/HeuristicLab.Clients.Hive/3.3/Util/PluginUtil.cs	(revision 12686)
@@ -26,4 +26,5 @@
 using System.Security.Cryptography;
 using System.ServiceModel;
+using HeuristicLab.Core;
 using HeuristicLab.PluginInfrastructure;
 
@@ -39,5 +40,6 @@
     /// <param name="neededPlugins">List of plugins which need to be uploaded</param>
     /// <returns></returns>
-    public static List<Guid> GetPluginDependencies(IHiveService service, List<Plugin> onlinePlugins, List<Plugin> alreadyUploadedPlugins, IEnumerable<IPluginDescription> neededPlugins) {
+    public static List<Guid> GetPluginDependencies(IHiveService service, List<Plugin> onlinePlugins, List<Plugin> alreadyUploadedPlugins,
+                                                   IEnumerable<IPluginDescription> neededPlugins) {
       var pluginIds = new List<Guid>();
       Dictionary<IPluginDescription, byte[]> checksumsNeededPlugins = CalcChecksumsForPlugins(neededPlugins);
@@ -61,6 +63,5 @@
               alreadyUploadedPlugins.Add(p);
               pluginIds.Add(p.Id);
-            }
-            catch (FaultException<PluginAlreadyExistsFault> fault) {
+            } catch (FaultException<PluginAlreadyExistsFault> fault) {
               onlinePlugins.Add(service.GetPlugin(fault.Detail.Id));
             }
@@ -79,8 +80,4 @@
     }
 
-    public static Plugin CreatePlugin(IPluginDescription plugin) {
-      return new Plugin() { Name = plugin.Name, Version = plugin.Version };
-    }
-
     public static List<PluginData> CreatePluginDatas(IPluginDescription plugin) {
       List<PluginData> pluginDatas = new List<PluginData>();
@@ -96,5 +93,15 @@
     }
 
-    public static void CollectDeclaringPlugins(List<IPluginDescription> plugins, IEnumerable<Type> usedTypes) {
+    public static List<IPluginDescription> GetPluginsForTask(IEnumerable<Type> usedTypes, object task) {
+      if (usedTypes.Any(x => typeof(IProgrammableItem).IsAssignableFrom(x))) {
+        //when a programmable item is used all plugins that are currently loaded need to be sent to Hive
+        return ApplicationManager.Manager.Plugins.ToList();
+      } else {
+        return CollectDeclaringPlugins(usedTypes);
+      }
+    }
+
+    private static List<IPluginDescription> CollectDeclaringPlugins(IEnumerable<Type> usedTypes) {
+      List<IPluginDescription> plugins = new List<IPluginDescription>();
       foreach (Type type in usedTypes) {
         var plugin = ApplicationManager.Manager.GetDeclaringPlugin(type);
@@ -104,7 +111,8 @@
         }
       }
+      return plugins;
     }
 
-    public static void CollectPluginDependencies(List<IPluginDescription> plugins, IPluginDescription plugin) {
+    private static void CollectPluginDependencies(List<IPluginDescription> plugins, IPluginDescription plugin) {
       if (plugin == null) return;
       foreach (var dependency in plugin.Dependencies) {
Index: stable/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj
===================================================================
--- stable/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 12685)
+++ stable/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 12686)
@@ -166,4 +166,5 @@
     <Compile Include="Interfaces\IFixedValueParameter.cs" />
     <Compile Include="Interfaces\IOperatorGraphOperator.cs" />
+    <Compile Include="Interfaces\IProgrammableItem.cs" />
     <Compile Include="Interfaces\IStatefulItem.cs" />
     <Compile Include="OperatorExecutionException.cs" />
Index: stable/HeuristicLab.Core/3.3/Interfaces/IProgrammableItem.cs
===================================================================
--- stable/HeuristicLab.Core/3.3/Interfaces/IProgrammableItem.cs	(revision 12686)
+++ stable/HeuristicLab.Core/3.3/Interfaces/IProgrammableItem.cs	(revision 12686)
@@ -0,0 +1,24 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Core {
+  public interface IProgrammableItem { }
+}
Index: stable/HeuristicLab.ExtLibs/HeuristicLab.MathJax/1.1/HeuristicLab.MathJax-1.1/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.ExtLibs/HeuristicLab.MathJax/1.1/HeuristicLab.MathJax-1.1/Plugin.cs.frame	(revision 12685)
+++ stable/HeuristicLab.ExtLibs/HeuristicLab.MathJax/1.1/HeuristicLab.MathJax-1.1/Plugin.cs.frame	(revision 12686)
@@ -36,5 +36,5 @@
       base.OnLoad();
       if (!Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory, "mathjax.js", SearchOption.TopDirectoryOnly).Any()) {
-        ZipFile.ExtractToDirectory("mathjax.zip", AppDomain.CurrentDomain.BaseDirectory);
+        ZipFile.ExtractToDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mathjax.zip"), AppDomain.CurrentDomain.BaseDirectory);
       }
     }
Index: stable/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs
===================================================================
--- stable/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs	(revision 12685)
+++ stable/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs	(revision 12686)
@@ -42,5 +42,5 @@
   [Item("ProgrammableOperator", "An operator that can be programmed for arbitrary needs.")]
   [StorableClass]
-  public class ProgrammableOperator : Operator, IParameterizedNamedItem, IStorableContent {
+  public class ProgrammableOperator : Operator, IParameterizedNamedItem, IStorableContent, IProgrammableItem {
 
     #region Fields & Properties
@@ -280,6 +280,5 @@
             assemblies.Add(a, false);
           }
-        }
-        catch (NotSupportedException) {
+        } catch (NotSupportedException) {
           // NotSupportedException is thrown while accessing 
           // the Location property of the anonymously hosted
Index: stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 12685)
+++ stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 12686)
@@ -33,5 +33,5 @@
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class MultiObjectiveProgrammableProblem : MultiObjectiveBasicProblem<IEncoding> {
+  public sealed class MultiObjectiveProgrammableProblem : MultiObjectiveBasicProblem<IEncoding>, IProgrammableItem {
     public static new Image StaticItemImage {
       get { return VSImageLibrary.Script; }
Index: stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 12685)
+++ stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 12686)
@@ -35,5 +35,5 @@
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class SingleObjectiveProgrammableProblem : SingleObjectiveBasicProblem<IEncoding> {
+  public sealed class SingleObjectiveProgrammableProblem : SingleObjectiveBasicProblem<IEncoding>, IProgrammableItem {
     public static new Image StaticItemImage {
       get { return VSImageLibrary.Script; }
Index: stable/HeuristicLab.Scripting/3.3/Script.cs
===================================================================
--- stable/HeuristicLab.Scripting/3.3/Script.cs	(revision 12685)
+++ stable/HeuristicLab.Scripting/3.3/Script.cs	(revision 12686)
@@ -37,5 +37,5 @@
 namespace HeuristicLab.Scripting {
   [StorableClass]
-  public class Script : NamedItem {
+  public class Script : NamedItem, IProgrammableItem {
     protected virtual string CodeTemplate {
       get { return string.Empty; }
