diff --git a/Source/Processors/RecordNode/EngineConfigWindow.cpp b/Source/Processors/RecordNode/EngineConfigWindow.cpp
index 6fb06d7c12ae92d68ca98f87c3f2c4e7285efa9d..309748230f4232a5e097bd4ee3e23152129757ea 100644
--- a/Source/Processors/RecordNode/EngineConfigWindow.cpp
+++ b/Source/Processors/RecordNode/EngineConfigWindow.cpp
@@ -33,11 +33,26 @@ EngineParameterComponent::EngineParameterComponent(EngineParameter& param)
         but->setBounds(120,0,100,20);
         addAndMakeVisible(but);
         control = but;
+		name = param.name;
     }
+	else if (param.type == EngineParameter::MULTI)
+	{
+		ComboBox* box = new ComboBox();
+		box->setBounds(120, 0, 100, 20);
+		StringArray options = StringArray::fromTokens(param.name, "|", "\"");
+		name = options[0];
+		options.remove(0);
+		box->addItemList(options, 1);
+		box->setSelectedId(param.multiParam.value + 1, dontSendNotification);
+		box->setEditableText(false);
+		addAndMakeVisible(box);
+		control = box;
+	}
     else
     {
         Label* lab = new Label();
         lab->setFont(Font("Small Text",10,Font::plain));
+		name = param.name;
         switch (param.type)
         {
             case EngineParameter::BOOL:
@@ -74,7 +89,7 @@ void EngineParameterComponent::paint(Graphics& g)
 {
     g.setColour(Colours::black);
     g.setFont(13);
-    g.drawText(parameter.name+":",0,0,100,30,Justification::left,true);
+    g.drawText(name+":",0,0,100,30,Justification::left,true);
 }
 
 void EngineParameterComponent::labelTextChanged(Label* l)
@@ -104,25 +119,28 @@ void EngineParameterComponent::saveValue()
     switch (parameter.type)
     {
         case EngineParameter::BOOL:
-            parameter.boolParam.value = ((ToggleButton*)control.get())->getToggleState();
+            parameter.boolParam.value = static_cast<ToggleButton*>(control.get())->getToggleState();
             break;
         case EngineParameter::INT:
-            parameter.intParam.value = ((Label*)control.get())->getText().getIntValue();
+            parameter.intParam.value = static_cast<Label*>(control.get())->getText().getIntValue();
             if (parameter.intParam.value < parameter.intParam.min)
                 parameter.intParam.value = parameter.intParam.min;
             if (parameter.intParam.value > parameter.intParam.max)
                 parameter.intParam.value = parameter.intParam.max;
             break;
         case EngineParameter::FLOAT:
-            parameter.floatParam.value = ((Label*)control.get())->getText().getFloatValue();
+            parameter.floatParam.value = static_cast<Label*>(control.get())->getText().getFloatValue();
             if (parameter.floatParam.value < parameter.floatParam.min)
                 parameter.floatParam.value = parameter.floatParam.min;
             if (parameter.floatParam.value > parameter.floatParam.max)
                 parameter.floatParam.value = parameter.floatParam.max;
             break;
         case EngineParameter::STR:
-            parameter.strParam.value = ((Label*)control.get())->getText();
+            parameter.strParam.value = static_cast<Label*>(control.get())->getText();
             break;
+		case EngineParameter::MULTI:
+			parameter.multiParam.value = static_cast<ComboBox*>(control.get())->getSelectedId() - 1;
+			break;
     }
 }
 
@@ -135,7 +153,7 @@ EngineConfigComponent::EngineConfigComponent(RecordEngineManager* man, int heigh
     for (int i = 0; i < man->getNumParameters(); i++)
     {
         EngineParameterComponent* par = new EngineParameterComponent(man->getParameter(i));
-        if (man->getParameter(i).type == EngineParameter::STR)
+        if (man->getParameter(i).type == EngineParameter::STR || man->getParameter(i).type == EngineParameter::MULTI)
             hasString=true;
         par->setBounds(10,10+40*i,300,30);
         addAndMakeVisible(par);
diff --git a/Source/Processors/RecordNode/EngineConfigWindow.h b/Source/Processors/RecordNode/EngineConfigWindow.h
index d57975b7bf8fed8dad5eb7a7f8fff0ddfbe0551f..0e3e1925bb1e1714bea8cdf213d903d6d5749b5f 100644
--- a/Source/Processors/RecordNode/EngineConfigWindow.h
+++ b/Source/Processors/RecordNode/EngineConfigWindow.h
@@ -43,6 +43,7 @@ private:
     ScopedPointer<Component> control;
     EngineParameter::EngineParameterType type;
     EngineParameter& parameter;
+	String name;
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EngineParameterComponent);
 };
 
diff --git a/Source/Processors/RecordNode/RecordEngine.cpp b/Source/Processors/RecordNode/RecordEngine.cpp
index 6aaef305fd4b5b3db8118d256a01200f92536645..fc9a8db2b2c26ea9f63706257700d8335089da18 100644
--- a/Source/Processors/RecordNode/RecordEngine.cpp
+++ b/Source/Processors/RecordNode/RecordEngine.cpp
@@ -209,6 +209,9 @@ void EngineParameter::restoreDefault()
             strParam.value = def;
             break;
 
+		case MULTI:
+			multiParam.value = def;
+
         default:
             break;
     }
@@ -329,6 +332,10 @@ void RecordEngineManager::saveParametersToXml (XmlElement* xml)
                 param->setAttribute ("value", parameters[i]->strParam.value);
                 break;
 
+			case EngineParameter::MULTI:
+				param->setAttribute("type", "multi");
+				param->setAttribute("value", parameters[i]->multiParam.value);
+
             default:
                 break;
         }
@@ -363,6 +370,11 @@ void RecordEngineManager::loadParametersFromXml (XmlElement* xml)
                 {
                     parameters[i]->strParam.value = xmlNode->getStringAttribute ("value");
                 }
+				else if ((xmlNode->getStringAttribute("type") == "multi")
+					&& (parameters[i]->type == EngineParameter::MULTI))
+				{
+					parameters[i]->multiParam.value = xmlNode->getIntAttribute("value");
+				}
             }
         }
     }
diff --git a/Source/Processors/RecordNode/RecordEngine.h b/Source/Processors/RecordNode/RecordEngine.h
index f6864ec06021f644be3c7c78aaa81274926f5f7b..b75e45e06082aac56816256d38320aec69b2d72a 100644
--- a/Source/Processors/RecordNode/RecordEngine.h
+++ b/Source/Processors/RecordNode/RecordEngine.h
@@ -38,6 +38,8 @@
         v = parameter.floatParam.value
 #define strParameter(i,v) if ((parameter.id == i) && (parameter.type == EngineParameter::STR)) \
         v = parameter.strParam.value
+#define multiParameter(i,v) if ((parameter.id == i) && (parameter.type == EngineParameter::MULTI)) \
+        v = parameter.multiParam.value
 
 struct RecordProcessorInfo
 {
@@ -219,7 +221,7 @@ typedef RecordEngine* (*EngineCreator)();
 struct PLUGIN_API EngineParameter
 {
 public:
-    enum EngineParameterType { STR, INT, FLOAT, BOOL };
+    enum EngineParameterType { STR, INT, FLOAT, BOOL, MULTI };
 
     EngineParameter (EngineParameterType paramType,
                      int paramId,
@@ -250,6 +252,11 @@ public:
         {
             bool value;
         } boolParam;
+		
+		struct 
+		{
+			int value;
+		} multiParam;
     };
 
     //Strings can't be inside an union. This means wasting a bit of memory, but adds more safety than using char*