diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile
index 66d5f5aff169db942f1cfa9ae40d0086d5fca7d7..59f7b594b0c39d6bfa08582a8a326c3bbd5a09fc 100644
--- a/Builds/Linux/Makefile
+++ b/Builds/Linux/Makefile
@@ -74,6 +74,9 @@ OBJECTS := \
   $(OBJDIR)/FileReader_18023b0e.o \
   $(OBJDIR)/AudioNode_94606ff3.o \
   $(OBJDIR)/EventNode_95c842b7.o \
+  $(OBJDIR)/ImageIcon_c89b23a6.o \
+  $(OBJDIR)/WiFiOutputEditor_1d3ba5bb.o \
+  $(OBJDIR)/EventNodeEditor_2198733b.o \
   $(OBJDIR)/SignalGeneratorEditor_3223ac0a.o \
   $(OBJDIR)/LfpDisplayEditor_99d75351.o \
   $(OBJDIR)/SourceNodeEditor_8d813122.o \
@@ -283,6 +286,21 @@ $(OBJDIR)/EventNode_95c842b7.o: ../../Source/Processors/EventNode.cpp
 	@echo "Compiling EventNode.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/ImageIcon_c89b23a6.o: ../../Source/Processors/Editors/ImageIcon.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling ImageIcon.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/WiFiOutputEditor_1d3ba5bb.o: ../../Source/Processors/Editors/WiFiOutputEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling WiFiOutputEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/EventNodeEditor_2198733b.o: ../../Source/Processors/Editors/EventNodeEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling EventNodeEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/SignalGeneratorEditor_3223ac0a.o: ../../Source/Processors/Editors/SignalGeneratorEditor.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling SignalGeneratorEditor.cpp"
diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
index 2ded216882832bd2dc55a62a00f19ec17b74563d..8208f6dfad4f9971e6aeb5110cd00795c0aa7c8d 100644
--- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
+++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
@@ -48,6 +48,9 @@
 		6656467170D2822949BD2F7F = { isa = PBXBuildFile; fileRef = 5AC4DD48CCB1AB4936A2DE4A; };
 		08B501E0D7764C6B613AF529 = { isa = PBXBuildFile; fileRef = B7750B27E4F3748ECCCCF69D; };
 		9CBA3837CC8CAA03A03F2D9C = { isa = PBXBuildFile; fileRef = FA57CE4F63FF1592D6B3F9B5; };
+		CB77C89226102EF30F85E3EC = { isa = PBXBuildFile; fileRef = 544DA1EF90EBBDB6FF2DE0A5; };
+		A126280FF39A61DEFD3ABFE5 = { isa = PBXBuildFile; fileRef = 2B11714BCE362D4EA7E377F5; };
+		2ADE508EC26B703176ED915C = { isa = PBXBuildFile; fileRef = 36393F2D58480F61ECDEB5E5; };
 		8B55C700ED8484944FED1EB1 = { isa = PBXBuildFile; fileRef = 087136FA6A7A0E01738EEF03; };
 		D3B54B20674A6BA87CE6FDEC = { isa = PBXBuildFile; fileRef = CF9878CE31A1B41406C3457B; };
 		5D5CAF52A5498EEFB8EA924D = { isa = PBXBuildFile; fileRef = FC5939F3D2A31BB43EA3E393; };
@@ -113,6 +116,7 @@
 		C2A7939DF5ED600BBB2F30C4 = { isa = PBXFileReference; lastKnownFileType = file; name = "silkscreen-serialized"; path = "../../Resources/Fonts/silkscreen-serialized"; sourceTree = SOURCE_ROOT; };
 		F8CAE2412B173788F325BD8B = { isa = PBXFileReference; lastKnownFileType = file.ttf; name = silkscreen.ttf; path = ../../Resources/Fonts/silkscreen.ttf; sourceTree = SOURCE_ROOT; };
 		363B59958615D35C5C948300 = { isa = PBXFileReference; lastKnownFileType = file.otf; name = "unibody-8.otf"; path = "../../Resources/Fonts/unibody-8.otf"; sourceTree = SOURCE_ROOT; };
+		8E041C8C49F1A5B710CC812C = { isa = PBXFileReference; lastKnownFileType = image.png; name = wifi.png; path = ../../Resources/Images/Icons/wifi.png; sourceTree = SOURCE_ROOT; };
 		2A1D9144C59B92B32483924B = { isa = PBXFileReference; lastKnownFileType = image.png; name = SourceDrop.png; path = ../../Resources/Images/Icons/SourceDrop.png; sourceTree = SOURCE_ROOT; };
 		D99F56FB46F631F67AF23F2C = { isa = PBXFileReference; lastKnownFileType = image.png; name = DefaultDataSource.png; path = ../../Resources/Images/Icons/DefaultDataSource.png; sourceTree = SOURCE_ROOT; };
 		66C7E42D7FDE3600982A1F46 = { isa = PBXFileReference; lastKnownFileType = image.png; name = FileReaderIcon.png; path = ../../Resources/Images/Icons/FileReaderIcon.png; sourceTree = SOURCE_ROOT; };
@@ -191,6 +195,12 @@
 		12866D44BE115E8837468F48 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioNode.h; path = ../../Source/Processors/AudioNode.h; sourceTree = SOURCE_ROOT; };
 		FA57CE4F63FF1592D6B3F9B5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventNode.cpp; path = ../../Source/Processors/EventNode.cpp; sourceTree = SOURCE_ROOT; };
 		32163C956C8A6F5C1DD7FE7F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventNode.h; path = ../../Source/Processors/EventNode.h; sourceTree = SOURCE_ROOT; };
+		544DA1EF90EBBDB6FF2DE0A5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ImageIcon.cpp; path = ../../Source/Processors/Editors/ImageIcon.cpp; sourceTree = SOURCE_ROOT; };
+		04AD8DDD47597AE0875ACDD1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ImageIcon.h; path = ../../Source/Processors/Editors/ImageIcon.h; sourceTree = SOURCE_ROOT; };
+		2B11714BCE362D4EA7E377F5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WiFiOutputEditor.cpp; path = ../../Source/Processors/Editors/WiFiOutputEditor.cpp; sourceTree = SOURCE_ROOT; };
+		4E67CFE458501E763FF3AE94 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WiFiOutputEditor.h; path = ../../Source/Processors/Editors/WiFiOutputEditor.h; sourceTree = SOURCE_ROOT; };
+		36393F2D58480F61ECDEB5E5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventNodeEditor.cpp; path = ../../Source/Processors/Editors/EventNodeEditor.cpp; sourceTree = SOURCE_ROOT; };
+		A80433BF9686B4E2542C580C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventNodeEditor.h; path = ../../Source/Processors/Editors/EventNodeEditor.h; sourceTree = SOURCE_ROOT; };
 		087136FA6A7A0E01738EEF03 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalGeneratorEditor.cpp; path = ../../Source/Processors/Editors/SignalGeneratorEditor.cpp; sourceTree = SOURCE_ROOT; };
 		10F82563E4A633BC234B2800 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SignalGeneratorEditor.h; path = ../../Source/Processors/Editors/SignalGeneratorEditor.h; sourceTree = SOURCE_ROOT; };
 		CF9878CE31A1B41406C3457B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpDisplayEditor.cpp; path = ../../Source/Processors/Editors/LfpDisplayEditor.cpp; sourceTree = SOURCE_ROOT; };
@@ -280,6 +290,7 @@
 				F8CAE2412B173788F325BD8B,
 				363B59958615D35C5C948300 ); name = Fonts; sourceTree = "<group>"; };
 		891C5A157F059822288EDC9F = { isa = PBXGroup; children = (
+				8E041C8C49F1A5B710CC812C,
 				2A1D9144C59B92B32483924B,
 				D99F56FB46F631F67AF23F2C,
 				66C7E42D7FDE3600982A1F46,
@@ -359,6 +370,12 @@
 				0C5335B0E57C9DC92FC57E5F,
 				7738F51AE0EC63D76EE0F761 ); name = Visualization; sourceTree = "<group>"; };
 		953CC35B9116404D6AA8D1C7 = { isa = PBXGroup; children = (
+				544DA1EF90EBBDB6FF2DE0A5,
+				04AD8DDD47597AE0875ACDD1,
+				2B11714BCE362D4EA7E377F5,
+				4E67CFE458501E763FF3AE94,
+				36393F2D58480F61ECDEB5E5,
+				A80433BF9686B4E2542C580C,
 				087136FA6A7A0E01738EEF03,
 				10F82563E4A633BC234B2800,
 				CF9878CE31A1B41406C3457B,
@@ -582,6 +599,9 @@
 				6656467170D2822949BD2F7F,
 				08B501E0D7764C6B613AF529,
 				9CBA3837CC8CAA03A03F2D9C,
+				CB77C89226102EF30F85E3EC,
+				A126280FF39A61DEFD3ABFE5,
+				2ADE508EC26B703176ED915C,
 				8B55C700ED8484944FED1EB1,
 				D3B54B20674A6BA87CE6FDEC,
 				5D5CAF52A5498EEFB8EA924D,
diff --git a/JuceLibraryCode/BinaryData.cpp b/JuceLibraryCode/BinaryData.cpp
index 2bb620dfd649e059f37561ce6c0ec4be9d481556..5ace2155aae28854769f22920bd871c65f5e7579 100644
--- a/JuceLibraryCode/BinaryData.cpp
+++ b/JuceLibraryCode/BinaryData.cpp
@@ -30,6 +30,7 @@ const char* BinaryData::getNamedResource (const char* resourceNameUTF8, int& num
         case 0x1eb42b13:  numBytes = BinaryData::ostrich_ttfSize; return BinaryData::ostrich_ttf;
         case 0xafad3345:  numBytes = BinaryData::silkscreenserializedSize; return BinaryData::silkscreenserialized;
         case 0xac0c53a8:  numBytes = BinaryData::silkscreen_ttfSize; return BinaryData::silkscreen_ttf;
+        case 0xb01cfdff:  numBytes = BinaryData::wifi_pngSize; return BinaryData::wifi_png;
         case 0x593e4e34:  numBytes = BinaryData::SourceDrop_pngSize; return BinaryData::SourceDrop_png;
         case 0x6189efd0:  numBytes = BinaryData::DefaultDataSource_pngSize; return BinaryData::DefaultDataSource_png;
         case 0x3862b802:  numBytes = BinaryData::FileReaderIcon_pngSize; return BinaryData::FileReaderIcon_png;
@@ -5833,6 +5834,59 @@ static const unsigned char temp_46c3ac32[] =
 
 const char* BinaryData::silkscreen_ttf = (const char*) temp_46c3ac32;
 
+//================== wifi.png ==================
+static const unsigned char temp_43e5b62e[] =
+{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,1,64,0,0,0,247,8,6,0,0,0,108,40,141,211,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
+97,100,121,113,201,101,60,0,0,12,225,73,68,65,84,120,218,236,221,139,117,27,199,21,128,225,81,5,102,7,70,7,70,7,130,43,8,58,8,84,65,144,10,12,87,0,167,2,56,21,192,169,128,84,5,164,42,32,93,1,169,10,28,236,209,64,130,104,62,0,98,95,51,247,251,207,185,
+135,142,148,248,132,187,51,255,222,59,51,187,55,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,242,206,37,64,75,92,236,98,250,196,159,79,243,223,157,202,205,46,30,30,253,217,67,254,115,128,0,209,57,123,121,77,114,52,
+188,63,248,251,217,192,255,255,238,114,236,255,249,207,71,242,60,252,123,128,0,241,100,214,182,23,220,79,249,207,102,149,253,158,119,7,241,231,129,32,175,12,1,2,68,28,209,53,98,251,49,203,110,230,178,124,39,199,143,7,255,76,140,4,136,66,153,100,217,77,
+115,185,250,214,53,184,232,220,100,25,126,202,66,124,106,77,18,4,136,129,153,229,248,41,255,36,187,110,165,120,147,179,197,253,63,131,0,209,99,41,59,59,200,236,148,177,195,178,95,71,252,120,144,37,130,0,209,65,134,247,143,244,244,49,19,16,34,8,176,26,
+38,187,152,231,44,111,238,114,20,205,93,22,225,255,242,79,107,136,4,136,39,104,50,187,127,102,225,77,92,142,106,249,35,103,135,127,36,231,19,9,48,56,243,92,214,54,63,109,92,196,163,41,143,255,171,84,70,52,233,109,118,113,191,139,191,132,200,113,187,139,
+181,236,31,181,150,183,164,39,142,141,235,93,44,201,80,9,92,50,205,224,93,164,47,235,122,6,50,222,202,85,46,147,155,53,67,27,40,24,61,141,244,46,101,49,162,229,184,207,85,196,204,20,195,24,179,61,37,174,232,115,189,176,41,145,109,156,65,182,39,66,199,
+38,57,28,143,30,105,158,186,43,217,158,24,89,92,230,7,50,208,105,153,107,178,137,177,151,199,43,229,49,218,98,166,204,21,5,111,154,76,76,97,188,117,125,239,218,68,18,149,172,19,18,33,142,22,223,173,73,35,42,140,109,114,140,6,196,39,108,152,16,33,136,
+79,16,161,35,52,65,153,19,159,16,214,8,163,189,11,220,164,254,191,40,1,122,231,234,196,255,254,133,236,164,119,126,223,197,175,41,216,119,10,163,8,112,146,188,75,217,166,200,154,73,242,184,9,121,202,63,187,250,182,221,99,41,30,118,187,219,247,51,158,
+36,59,158,231,208,220,191,255,236,226,183,20,228,227,11,181,11,176,153,20,235,228,148,252,177,220,229,104,36,246,249,64,120,87,5,222,247,233,193,207,125,47,100,45,66,143,23,225,191,115,86,72,128,133,178,218,197,191,12,248,23,69,23,177,25,248,94,138,123,
+49,234,174,247,60,55,89,132,213,142,141,26,5,56,75,14,127,62,150,93,51,144,53,248,126,153,73,250,190,161,60,41,126,227,143,44,194,59,151,98,220,3,184,57,236,233,139,194,95,202,126,13,150,206,167,145,225,50,63,80,163,159,26,184,207,85,21,70,90,238,222,
+19,158,114,191,135,135,236,34,184,16,111,101,199,227,42,119,175,3,14,192,77,158,136,132,55,142,12,49,98,229,177,49,254,134,99,191,187,27,41,203,91,37,103,227,198,206,60,88,118,120,159,127,103,244,156,245,69,24,96,219,164,59,88,233,217,225,58,200,88,189,
+52,78,251,201,250,182,1,164,167,180,37,195,82,179,193,165,91,221,93,214,87,235,38,135,62,176,49,101,88,235,120,150,13,90,235,59,106,35,99,109,160,88,51,76,117,182,90,176,54,216,210,147,178,182,146,97,107,96,224,153,7,253,178,210,241,110,57,231,13,172,
+42,203,246,86,178,61,156,176,220,83,83,86,120,159,156,27,60,154,73,170,167,9,145,86,133,56,55,43,92,85,148,21,174,220,210,215,215,67,106,88,24,214,172,26,109,211,60,72,107,56,240,127,173,18,122,154,210,55,58,238,147,77,13,244,83,30,95,38,27,36,85,149,
+188,215,133,223,204,85,178,208,139,254,231,77,233,235,132,107,79,179,114,75,94,226,3,17,182,83,18,135,156,67,43,226,3,136,48,207,169,48,107,230,165,190,206,70,124,32,194,110,99,81,251,205,153,22,184,222,71,124,40,85,132,37,110,150,108,172,247,233,151,
+10,180,57,239,74,19,97,117,235,130,139,84,222,1,102,226,67,109,115,176,164,3,213,183,181,172,11,110,10,187,232,51,115,5,149,178,127,179,164,148,74,172,232,243,130,37,109,118,104,246,130,104,235,131,37,109,68,46,74,148,95,41,155,29,91,229,46,2,175,15,
+150,82,22,23,179,57,82,202,39,172,148,187,192,23,86,36,216,158,252,74,88,95,88,37,199,90,128,199,101,113,9,187,197,163,221,33,94,20,32,191,235,228,43,45,192,75,44,11,153,199,173,73,240,93,75,242,27,123,122,250,107,178,209,49,116,117,112,202,160,189,217,
+197,131,203,54,88,54,184,25,249,18,81,51,62,62,228,159,131,10,112,236,242,107,237,66,225,43,23,7,66,219,103,212,63,166,111,155,73,147,212,205,198,210,213,163,251,250,57,75,242,230,137,191,71,59,217,224,47,105,188,203,69,205,189,255,249,220,185,125,142,
+0,199,46,63,89,223,249,146,219,139,238,253,35,225,141,153,171,60,57,62,237,226,46,7,57,214,153,13,182,34,193,183,202,207,14,111,61,229,233,34,63,44,154,133,240,154,219,143,110,243,239,57,75,54,194,78,97,149,124,77,230,111,140,241,45,143,141,129,253,106,
+102,55,11,32,187,83,30,150,219,92,238,217,32,123,253,65,121,77,130,227,148,224,125,210,128,232,57,225,53,175,19,173,83,29,61,37,250,24,71,151,132,248,226,120,218,144,224,184,36,232,120,203,223,159,212,251,12,143,212,206,159,84,219,252,112,157,24,90,223,
+45,129,141,177,122,24,44,9,26,74,130,74,222,47,204,243,181,184,37,173,206,31,182,43,15,220,81,150,196,131,87,128,125,74,80,201,251,77,122,247,196,52,216,250,225,58,184,12,199,82,18,143,198,5,155,158,6,222,148,244,72,104,132,50,140,90,38,47,201,175,31,
+9,94,6,44,121,39,121,114,145,94,57,101,242,34,224,56,157,13,48,70,71,91,5,118,33,193,72,125,68,47,242,205,181,115,91,118,140,253,149,178,46,30,214,215,209,229,215,133,4,23,129,6,144,18,183,206,18,121,25,36,43,236,99,93,176,24,31,156,123,33,162,244,12,
+157,39,199,86,162,28,171,137,210,108,107,29,93,126,231,74,48,194,249,190,69,114,116,37,106,108,3,148,199,139,232,242,123,171,4,171,107,141,247,168,68,88,41,115,69,250,182,177,87,179,8,219,218,28,41,126,25,236,88,9,214,122,184,153,248,196,107,235,132,
+181,174,117,159,251,181,248,106,174,203,230,8,249,17,159,136,46,194,121,165,243,224,58,217,0,125,86,130,171,10,111,58,241,9,165,241,219,37,88,107,70,252,55,9,214,246,139,218,220,16,109,138,112,26,80,130,213,202,239,177,4,107,250,69,103,201,225,101,209,
+221,161,234,73,128,74,48,210,185,223,106,82,252,102,96,110,77,82,209,113,220,87,182,84,180,137,44,63,235,124,66,104,251,176,33,191,114,179,87,235,124,98,232,195,212,147,74,36,72,126,5,45,226,42,119,197,152,202,226,165,105,137,62,88,40,119,197,72,67,107,
+136,55,240,206,37,56,122,147,35,218,167,141,142,229,46,199,190,23,111,74,223,55,44,223,115,117,194,181,158,60,177,220,208,240,195,193,36,223,247,44,198,247,232,135,77,128,173,178,255,10,115,228,201,182,151,220,199,3,185,237,255,108,104,246,34,108,36,
+249,99,150,103,244,7,85,115,127,62,164,1,26,134,19,96,93,107,125,155,84,231,107,73,175,201,238,42,103,115,55,57,30,10,205,218,167,57,222,7,204,24,31,114,54,248,155,169,140,83,105,50,136,40,107,125,151,185,100,154,7,16,68,35,197,69,138,213,65,47,98,27,
+9,156,193,42,213,191,88,190,14,34,188,83,132,88,243,3,239,222,178,0,142,153,12,181,190,198,214,28,219,89,38,205,189,95,99,154,31,14,181,142,131,149,91,140,40,37,239,54,197,236,78,214,230,3,113,89,161,12,149,196,168,182,228,189,36,189,206,100,184,174,
+104,221,48,74,175,29,188,64,45,111,116,220,102,137,43,111,251,171,22,54,149,136,112,225,118,198,93,235,41,189,180,105,228,61,119,43,7,125,128,46,43,200,10,55,110,165,245,190,146,74,151,181,108,111,148,99,170,228,106,162,230,38,100,56,96,81,112,153,107,
+109,175,140,181,194,82,143,212,120,151,184,114,214,5,139,15,229,149,199,171,2,69,104,115,164,82,54,196,7,34,180,57,18,113,0,94,18,31,136,144,4,35,14,186,107,226,195,200,198,100,73,213,200,218,45,35,191,62,154,220,216,220,136,197,164,160,202,196,49,153,
+2,89,165,50,206,241,77,220,170,208,204,82,25,231,8,73,176,64,198,90,106,212,212,209,11,237,61,176,199,190,62,72,130,36,168,167,43,58,45,139,199,126,152,154,4,73,240,205,31,41,80,238,226,24,230,35,206,6,23,110,15,9,106,89,136,174,25,227,135,58,200,143,
+4,101,125,8,153,13,146,31,9,158,20,178,62,212,146,13,146,31,9,122,161,28,131,179,36,63,140,89,130,209,123,7,163,123,250,252,142,37,249,145,160,193,130,144,37,177,241,76,130,71,31,106,86,242,162,166,146,152,252,72,80,119,45,20,193,44,181,187,75,28,78,
+126,239,140,161,175,18,60,229,230,255,190,139,15,46,219,87,38,143,226,135,71,153,241,236,196,127,223,195,46,110,14,254,243,199,252,243,230,224,239,30,92,246,175,215,126,219,66,37,242,33,143,107,200,4,61,37,95,152,108,205,217,180,85,158,116,67,127,113,
+231,50,223,183,101,138,253,126,245,185,235,130,202,94,188,42,193,251,20,175,11,219,52,203,101,155,202,249,152,231,245,65,70,63,49,126,201,15,231,15,162,40,189,18,38,5,10,239,152,141,170,77,126,120,69,88,179,93,144,31,218,148,96,237,135,155,155,223,109,
+157,202,239,111,123,74,217,188,172,60,59,60,70,130,228,135,87,37,88,107,191,212,104,210,123,169,92,94,86,122,143,95,122,143,152,252,112,20,23,149,253,46,203,84,78,159,148,33,190,208,93,219,26,239,244,9,9,146,31,66,49,75,229,181,5,29,122,205,112,85,81,
+137,124,40,65,242,67,24,22,178,189,86,222,239,174,97,253,119,74,126,136,36,190,91,242,106,125,227,100,102,104,1,227,101,149,234,57,186,66,132,0,100,124,68,8,224,41,102,196,167,183,51,16,141,73,206,64,8,104,60,209,44,63,248,50,16,208,33,23,121,162,17,
+206,120,143,207,204,13,83,64,185,171,44,6,208,74,214,183,37,149,226,66,63,104,160,133,172,207,177,150,242,119,139,173,13,2,39,178,38,143,170,178,65,107,131,192,17,244,217,246,80,244,27,107,195,27,120,158,133,146,55,196,231,183,38,134,58,160,228,85,18,
+3,193,105,22,200,29,106,142,25,118,137,97,189,143,8,194,127,110,11,3,162,47,240,112,242,115,68,2,13,77,143,227,159,147,62,199,4,24,132,69,94,243,187,168,124,82,239,27,152,127,206,127,118,117,228,255,118,146,190,109,20,252,148,175,211,225,159,145,32,8,
+176,80,102,57,243,171,133,187,60,121,63,101,193,221,229,232,242,250,77,178,24,167,169,174,79,82,61,100,9,222,152,38,168,153,146,251,115,236,123,236,46,70,148,145,29,54,111,175,97,135,120,106,138,128,4,199,215,58,178,148,137,57,207,215,247,150,4,1,18,
+124,107,166,87,67,243,240,89,190,206,165,29,48,95,152,30,32,193,97,142,101,204,42,189,214,141,84,74,56,115,73,126,32,193,158,179,189,85,138,115,36,103,58,226,236,155,252,64,130,61,138,47,242,132,107,202,251,245,136,202,99,242,3,9,18,95,239,92,164,225,
+223,197,118,63,128,142,37,120,159,75,93,60,159,17,14,145,137,147,31,208,177,4,55,201,107,119,199,50,75,253,189,163,77,126,64,135,18,188,78,26,120,191,149,101,234,118,125,144,252,128,14,37,168,220,109,167,44,238,226,232,12,249,1,29,73,176,201,250,188,
+73,48,222,108,144,252,128,142,36,168,239,68,119,180,241,253,70,242,3,58,144,160,207,172,143,127,105,130,252,128,14,38,158,146,183,127,22,228,7,12,47,193,230,19,80,142,183,12,87,18,31,179,46,72,126,64,7,18,212,79,98,120,38,233,229,117,65,242,3,58,192,
+122,223,120,184,120,70,130,228,7,32,140,4,183,228,7,32,50,27,242,3,0,0,0,0,0,0,128,241,160,49,58,250,162,217,41,221,191,177,50,77,207,31,224,190,202,63,239,82,183,77,214,1,2,68,39,76,115,188,79,95,14,11,207,206,248,119,221,228,248,148,229,120,227,242,
+2,24,27,125,53,36,111,94,63,107,206,220,45,146,215,0,1,12,200,44,13,223,120,124,155,188,25,3,160,71,154,236,171,175,190,25,250,27,3,24,141,248,186,46,113,219,234,126,71,132,0,90,97,94,128,248,158,18,225,210,173,3,240,86,38,169,155,166,64,125,134,206,
+120,0,78,166,235,182,144,125,199,90,89,12,224,53,30,127,218,169,166,208,62,0,192,179,52,114,40,109,173,239,45,107,131,11,183,26,192,33,139,202,74,94,141,227,1,28,45,191,191,2,134,190,42,0,222,220,235,150,4,1,144,96,225,49,115,251,1,68,148,224,194,109,
+7,16,81,130,228,7,32,164,4,201,15,64,72,9,146,31,128,144,18,36,63,0,33,37,72,126,0,66,74,144,252,0,132,148,32,249,1,8,41,65,242,3,16,82,130,228,7,32,164,4,201,15,64,72,9,146,31,128,144,18,36,63,0,33,37,72,126,0,66,74,144,252,0,132,148,32,249,1,8,41,65,
+242,3,16,82,130,228,7,32,164,4,201,15,64,72,9,146,31,128,144,18,36,63,0,33,37,72,126,0,66,74,144,252,0,132,148,32,249,1,8,41,65,242,3,16,82,130,228,7,32,164,4,201,15,64,72,9,146,31,128,144,18,36,63,0,33,37,72,126,0,66,74,144,252,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,45,252,95,128,1,0,166,155,18,218,219,72,225,153,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
+
+const char* BinaryData::wifi_png = (const char*) temp_43e5b62e;
+
 //================== SourceDrop.png ==================
 static const unsigned char temp_e9da47e3[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,154,0,0,2,209,8,6,0,0,0,163,255,186,145,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
diff --git a/JuceLibraryCode/BinaryData.h b/JuceLibraryCode/BinaryData.h
index 4ff4ad3eedd0b0cf6bc5f35e0f18c44482b5cae0..34dbcb2c8c45e571aa9d0716a5d922658ee2cf50 100644
--- a/JuceLibraryCode/BinaryData.h
+++ b/JuceLibraryCode/BinaryData.h
@@ -46,6 +46,9 @@ namespace BinaryData
     extern const char*   silkscreen_ttf;
     const int            silkscreen_ttfSize = 18336;
 
+    extern const char*   wifi_png;
+    const int            wifi_pngSize = 3412;
+
     extern const char*   SourceDrop_png;
     const int            SourceDrop_pngSize = 6274;
 
diff --git a/Source/MainWindow.cpp b/Source/MainWindow.cpp
index 827c5157b88c7e6be4e22671193d3a6fc0514e66..ae5f79cfb7aed3358ae2bbe8e75f10f5e63ecbe6 100644
--- a/Source/MainWindow.cpp
+++ b/Source/MainWindow.cpp
@@ -18,7 +18,7 @@ MainWindow::MainWindow()
                       Colour(Colours::black),
                       DocumentWindow::allButtons)
 {
-    centreWithSize (500, 400);
+    //centreWithSize (500, 400);
     //setBounds(0,0,500,400);
     setResizable (true, false);
     
@@ -123,8 +123,9 @@ void MainWindow::loadWindowBounds()
 
         bool fs = e->getBoolAttribute("fullscreen");
 
-        setTopLeftPosition(x,y);
-        getContentComponent()->setBounds(0,0,w,h);
+        // without the correction, you get drift over time
+        setTopLeftPosition(x,y-27);
+        getContentComponent()->setBounds(0,0,w,h-33);
         //setFullScreen(fs);
 
     }
diff --git a/Source/Processors/EventNode.cpp b/Source/Processors/EventNode.cpp
index a9f70dc9f4b6ff4c11150c37c87b0848ba6dcc56..55ef3e43906244dbeb822268b15a195888bf3645 100644
--- a/Source/Processors/EventNode.cpp
+++ b/Source/Processors/EventNode.cpp
@@ -11,14 +11,13 @@
 
 #include <stdio.h>
 #include "EventNode.h"
-//#include "FilterEditor.h"
 
 EventNode::EventNode()
 	: GenericProcessor("Event Generator"), Hz(1), accumulator(0)
 {
 	setNumOutputs(0);
 	setNumInputs(0);
-	setSampleRate(44100.0);
+//	setSampleRate(44100.0);
 
 	setPlayConfigDetails(getNumInputs(), getNumOutputs(), 44100.0, 128);
 
@@ -29,16 +28,20 @@ EventNode::~EventNode()
 
 }
 
-// AudioProcessorEditor* EventNode::createEditor()
-// {
-// 	FilterEditor* filterEditor = new FilterEditor(this, viewport);
-	
-// 	std::cout << "Creating editor." << std::endl;
-// 	//filterEditor = new FilterEditor(this);
-// 	return filterEditor;
+AudioProcessorEditor* EventNode::createEditor()
+{
+	EventNodeEditor* editor = new EventNodeEditor(this, viewport);
+	setEditor(editor);
+
+	std::cout << "Creating editor." << std::endl;
+	//editor->setUIComponent(getUIComponent());
+	editor->setConfiguration(config);
 
-// 	//return 0;
-// }
+	//filterEditor = new FilterEditor(this);
+	return editor;
+
+	//return 0;
+}
 
 //AudioProcessorEditor* FilterNode::createEditor(AudioProcessorEditor* const editor)
 //{
@@ -47,6 +50,7 @@ EventNode::~EventNode()
 //}
 void EventNode::setParameter (int parameterIndex, float newValue)
 {
+	std::cout << "Setting frequency to " << newValue << " Hz." << std::endl;
 	Hz = newValue;
 }
 
diff --git a/Source/Processors/EventNode.h b/Source/Processors/EventNode.h
index aa5332f1767678b040de4bc67eff80d3b8499a88..2c8f09ca088d7f6577616dac96a1af06ce3cc4a1 100644
--- a/Source/Processors/EventNode.h
+++ b/Source/Processors/EventNode.h
@@ -13,7 +13,7 @@
 
 #include "../../JuceLibraryCode/JuceHeader.h"
 #include "GenericProcessor.h"
-//#include "Editors/FilterEditor.h"
+#include "Editors/EventNodeEditor.h"
 
 class FilterViewport;
 
@@ -31,11 +31,14 @@ public:
 	void setParameter (int parameterIndex, float newValue);
 
 	bool isSource() {return true;}
+	bool hasEditor() const {return true;}
+
+	float getSampleRate() {return 44100.0;}
 
 //	bool enable();
 	//bool disable();
 
-	// AudioProcessorEditor* createEditor();
+	AudioProcessorEditor* createEditor();
 	
 private:
 
diff --git a/Source/Processors/FilterNode.cpp b/Source/Processors/FilterNode.cpp
index 4de63ebbcfdf5071c3e02b8fbed164a2ea581240..3b1bde8ee7ccc3d7261cf06a3fb876e3497093a3 100644
--- a/Source/Processors/FilterNode.cpp
+++ b/Source/Processors/FilterNode.cpp
@@ -17,8 +17,8 @@ FilterNode::FilterNode()
 	  highCut(6000.0), lowCut(600.0)
 	
 {
-	setNumInputs(10);
-	setSampleRate(20000.0);
+	setNumInputs(16);
+	setSampleRate(25000.0);
 	// set up default configuration
 	setPlayConfigDetails(16, 16, 44100.0, 128);
 
diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp
index 8cfa1585eeb98c3df01c96624aea144724992a7d..49372e011bb661ae09fe4c9eea27059521cbfd58 100644
--- a/Source/Processors/GenericProcessor.cpp
+++ b/Source/Processors/GenericProcessor.cpp
@@ -12,7 +12,7 @@
 #include "../UI/UIComponent.h"
 
 GenericProcessor::GenericProcessor(const String& name_) : name(name_),
-	sourceNode(0), destNode(0), editor(0)
+	sourceNode(0), destNode(0), editor(0), isEnabled(true)
 	
 {
 
@@ -166,25 +166,43 @@ int GenericProcessor::getNumSamples(MidiBuffer& midiMessages) {
 
 void GenericProcessor::setSourceNode(GenericProcessor* sn)
 {
+	std::cout << "My name is " << getName() << ". Setting source node." << std::endl;
+
 	if (!isSource())
 	{
+		std::cout << " I am not a source." << std::endl;
+
 		if (sn != 0)
 		{
+
+			std::cout << " The source is not blank." << std::endl;
+
 			if (!sn->isSink())
 			{
+				std::cout << " The source is not a sink." << std::endl;
+
 				if (sourceNode != sn) {
+
+					std::cout << " The source is new and named " << sn->getName() << std::endl;
 					sourceNode = sn;
 					sn->setDestNode(this);
 					setNumInputs(sn->getNumOutputs());
 					setSampleRate(sn->getSampleRate());
+				} else {
+					std::cout << "  The source node is not new." << std::endl;
 				}
 			} else {
+				std::cout << " The source is a sink." << std::endl;
 				sourceNode = 0;
 			}
+
 		} else {
+			std::cout << " The source is blank." << std::endl;
 			sourceNode = 0;
 		}
 	} else {
+		std::cout << " I am a source. I can't have a source node." << std::endl;
+
 		if (sn != 0)
 			sn->setDestNode(this);
 	}
@@ -193,26 +211,48 @@ void GenericProcessor::setSourceNode(GenericProcessor* sn)
 
 void GenericProcessor::setDestNode(GenericProcessor* dn)
 {
+
+
+	std::cout << "My name is " << getName() << ". Setting dest node." << std::endl;
+
 	if (!isSink())
 	{
+		std::cout << "  I am not a sink." << std::endl;
+
 		if (dn != 0)
 		{
+			std::cout << "  The dest node is not blank." << std::endl;
+
 			if (!dn->isSource())
 			{
+
+				std::cout << "  The dest node is not a source." << std::endl;
+
 				if (destNode != dn) 
 				{
+					std::cout << "  The dest node is new and named " << dn->getName() << std::endl;
+
 					destNode = dn;
 					dn->setSourceNode(this);
+				} else {
+					std::cout << "  The dest node is not new." << std::endl;
 				}
 			} else {
+
+				std::cout << "  The dest node is a source." << std::endl;
+
 				destNode = 0;
 			}
 		} else {
+			std::cout << "  The dest node is blank." << std::endl;
+
 			destNode = 0;
 		}
 	} else {
-		if (dn != 0)
-			dn->setSourceNode(this);
+
+		std::cout << "  I am a sink, I can't have a dest node." << std::endl;
+		//if (dn != 0)
+		//	dn->setSourceNode(this);
 	}
 }
 
diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h
index 269ea1cf28ef5c6a7cf64a8f3f3aa94d8ce8a1aa..5b0602b17ef3b57fa38d6f4261d2b655074d50b7 100644
--- a/Source/Processors/GenericProcessor.h
+++ b/Source/Processors/GenericProcessor.h
@@ -130,7 +130,7 @@ public:
 
 	virtual bool canSendSignalTo(GenericProcessor*) {return true;}
 
-	virtual bool enable() {return true;}
+	virtual bool enable() {return isEnabled;}
 	virtual bool disable() {return true;}
 
 	virtual bool enabledState() {return isEnabled;}
diff --git a/Source/Processors/LfpDisplayNode.cpp b/Source/Processors/LfpDisplayNode.cpp
index 51f6ab0d1e8f22d44260bea9d509d0d0a54d2280..4929954c8b6abc1f8574968503b3d91b2cb76d1f 100644
--- a/Source/Processors/LfpDisplayNode.cpp
+++ b/Source/Processors/LfpDisplayNode.cpp
@@ -115,9 +115,13 @@ void LfpDisplayNode::resizeBuffer()
 
 bool LfpDisplayNode::enable()
 {
+	if (isEnabled) {
 	LfpDisplayEditor* editor = (LfpDisplayEditor*) getEditor();
 	editor->enable();
 	return true;
+	} else {
+		return false;
+	}
 }
 
 bool LfpDisplayNode::disable()
diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp
index a76138d60f599fc18ac337fc503285190d1f0b26..58a02e1c230c57974a4c3f7356624f02e75280a6 100644
--- a/Source/Processors/ProcessorGraph.cpp
+++ b/Source/Processors/ProcessorGraph.cpp
@@ -300,7 +300,14 @@ GenericProcessor* ProcessorGraph::createProcessorFromDescription(String& descrip
 	if (processorType.equalsIgnoreCase("Sources")) {
 
 		if (subProcessorType.equalsIgnoreCase("Intan Demo Board")) {
-			processor = new SourceNode(subProcessorType);
+			
+			if (!doesProcessorWithSameNameExist(subProcessorType)) {
+				processor = new SourceNode(subProcessorType);
+			//} else {
+				
+			}
+				
+
 			std::cout << "Creating a new data source." << std::endl;
 		} else if (subProcessorType.equalsIgnoreCase("Signal Generator"))
 		{
@@ -368,6 +375,21 @@ GenericProcessor* ProcessorGraph::createProcessorFromDescription(String& descrip
 }
 
 
+bool ProcessorGraph::doesProcessorWithSameNameExist(const String& name)
+{
+	for (int i = 0; i < getNumNodes(); i++)
+	{
+	 	Node* node = getNode(i);
+
+	 	if (name.equalsIgnoreCase(node->getProcessor()->getName()))
+	 		return true;
+	
+	 }
+
+	 return false;
+
+}
+
 void ProcessorGraph::removeProcessor(GenericProcessor* processor) {
 	
 	std::cout << "Removing processor with ID " << processor->getNodeId() << std::endl;
@@ -435,6 +457,12 @@ bool ProcessorGraph::enableProcessors() {
 
 	bool allClear;
 
+	if (getNumNodes() < 5)
+	{
+		UI->disableCallbacks();
+		return false;
+	}
+
 	for (int i = 0; i < getNumNodes(); i++)
 	{
 
@@ -446,8 +474,11 @@ bool ProcessorGraph::enableProcessors() {
 			allClear = p->enable();
 
 			if (!allClear) {
-				sendActionMessage("Could not initialize acquisition. Is the Intan Board plugged in?");
+				std::cout << p->getName() << " said it's not OK." << std::endl;
+				sendActionMessage("Could not initialize acquisition.");
+				UI->disableCallbacks();
 				return false;
+
 			}
 		}
 	}
diff --git a/Source/Processors/ProcessorGraph.h b/Source/Processors/ProcessorGraph.h
index 00697264e8664c295ab977c487078d4f17c1ddbb..6d329c4f780ee61bd6935bb4a0d6b3d3244d0e04 100644
--- a/Source/Processors/ProcessorGraph.h
+++ b/Source/Processors/ProcessorGraph.h
@@ -49,6 +49,7 @@ public:
 
 	void updateConnections(Array<SignalChainTabButton*, CriticalSection>);
 
+	bool doesProcessorWithSameNameExist(const String& name);
 
 	void saveState();
 	void loadState();
diff --git a/Source/Processors/WiFiOutput.cpp b/Source/Processors/WiFiOutput.cpp
index f701e510d7ec68ed48596fa87cdf028597b0bfa0..9e34acd9afd42a02d457fd9e163b0588296a35c8 100644
--- a/Source/Processors/WiFiOutput.cpp
+++ b/Source/Processors/WiFiOutput.cpp
@@ -26,16 +26,20 @@ WiFiOutput::~WiFiOutput()
 
 }
 
-// AudioProcessorEditor* EventNode::createEditor()
-// {
-// 	FilterEditor* filterEditor = new FilterEditor(this, viewport);
+AudioProcessorEditor* WiFiOutput::createEditor()
+{
+	WiFiOutputEditor* wifiEditor = new WiFiOutputEditor(this, viewport);
 	
-// 	std::cout << "Creating editor." << std::endl;
-// 	//filterEditor = new FilterEditor(this);
-// 	return filterEditor;
+	setEditor(wifiEditor);
+	//wifiEditor->setUIComponent(getUIComponent());
+	wifiEditor->setConfiguration(config);
+
+	std::cout << "Creating editor." << std::endl;
+	//filterEditor = new FilterEditor(this);
+	return wifiEditor;
 
-// 	//return 0;
-// }
+	//return 0;
+}
 
 
 void WiFiOutput::setParameter (int parameterIndex, float newValue)
@@ -76,4 +80,6 @@ void WiFiOutput::timerCallback()
 	//std::cout << "FIRE!" << std::endl;
 	socket.sendTo("hi",2,"169.254.187.27",6000);
 	stopTimer();
+	WiFiOutputEditor* ed = (WiFiOutputEditor*) getEditor();
+	ed->receivedEvent();
 }
diff --git a/Source/Processors/WiFiOutput.h b/Source/Processors/WiFiOutput.h
index 367dba3468ebfe09cc0bbd1af4be19c76bcc424b..2ebd6bca3b0bb2a468edfc79b6971dc3e2042ede 100644
--- a/Source/Processors/WiFiOutput.h
+++ b/Source/Processors/WiFiOutput.h
@@ -14,6 +14,7 @@
 
 #include "../../JuceLibraryCode/JuceHeader.h"
 #include "GenericProcessor.h"
+#include "Editors/WiFiOutputEditor.h"
 
 #include "../Network/PracticalSocket.h"  // For UDPSocket and SocketException
 #include <iostream>           			 // For cout and cerr
@@ -22,6 +23,8 @@
 
 class FilterViewport;
 
+class WiFiOutputEditor;
+
 class WiFiOutput : public GenericProcessor,
 		           public Timer
 
@@ -36,6 +39,8 @@ public:
 	void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples);
 	void setParameter (int parameterIndex, float newValue);
 
+	AudioProcessorEditor* createEditor();
+
 	bool isSink() {return true;}
 	
 private:
diff --git a/Source/UI/ControlPanel.cpp b/Source/UI/ControlPanel.cpp
index 1bcce23c70c841340ecf474f6a0fef252626b833..4cea509551f8da89ee696657b5f7cef3fed9d91e 100644
--- a/Source/UI/ControlPanel.cpp
+++ b/Source/UI/ControlPanel.cpp
@@ -423,9 +423,12 @@ void ControlPanel::disableCallbacks()
 		graph->disableProcessors();
 		std::cout << "Updating control panel." << std::endl;
 		cpuMeter->updateCPU(0.0f);
-		playButton->setToggleState(false,false);
-		recordButton->setToggleState(false,false);
+		
 	}
+
+	playButton->setToggleState(false,false);
+	recordButton->setToggleState(false,false);
+
 }
 
 void ControlPanel::actionListenerCallback(const String & msg)
diff --git a/Source/UI/FilterViewport.cpp b/Source/UI/FilterViewport.cpp
index c8b5f7cbf5fd36965c36647efeff6e8238b43f27..5489e61c702556ff933dbb111bcdf9b28828d08a 100644
--- a/Source/UI/FilterViewport.cpp
+++ b/Source/UI/FilterViewport.cpp
@@ -14,7 +14,7 @@ FilterViewport::FilterViewport(ProcessorGraph* pgraph, DataViewport* tcomp)
     : message ("Drag-and-drop some rows from the top-left box onto this component!"),
       somethingIsBeingDraggedOver (false), graph(pgraph), tabComponent(tcomp), shiftDown(false),
        insertionPoint(0), componentWantsToMove(false), indexOfMovingComponent(-1), 
-       borderSize(6), tabSize(30), tabButtonSize(15), canEdit(true)//, signalChainNeedsSource(true)
+       borderSize(6), tabSize(30), tabButtonSize(15), canEdit(true), currentTab(-1)//, signalChainNeedsSource(true)
 {
 
   addMouseListener(this, true);
@@ -207,6 +207,10 @@ void FilterViewport::itemDropped (const String& sourceDescription, Component* /*
 
             updateVisibleEditors(activeEditor, 1);
 
+        } else {
+            insertionPoint = -1; // make sure all editors are left-justified
+            indexOfMovingComponent = -1;
+            refreshEditors();
         }
 
         somethingIsBeingDraggedOver = false;
@@ -255,6 +259,8 @@ void FilterViewport::createNewTab(GenericEditor* editor)
     t->setToggleState(true,false);
     t->setNumber(index);
 
+   // currentTab = signalChainArray.size()-1;
+
 }
 
 void FilterViewport::removeTab(int tabIndex)
@@ -364,7 +370,7 @@ void FilterViewport::updateVisibleEditors(GenericEditor* activeEditor, int actio
 
             dest->setSourceNode(source);
 
-         //  std::cout << dest->getName() << "::";
+           //std::cout << dest->getName() << "::";
         }
 
         dest->setDestNode(0); // set last dest as 0
@@ -376,6 +382,8 @@ void FilterViewport::updateVisibleEditors(GenericEditor* activeEditor, int actio
     // Step 3: check for new tabs
    if (action < 4) {
 
+        std::cout << "Checking for new tabs." << std::endl;
+
         for (int n = 0; n < editorArray.size(); n++)
         {
             GenericProcessor* p = (GenericProcessor*) editorArray[n]->getProcessor();
@@ -384,8 +392,11 @@ void FilterViewport::updateVisibleEditors(GenericEditor* activeEditor, int actio
 
             if (p->getSourceNode() == 0)// && editorArray[n]->tabNumber() == -1)
             {
+               
                 if (editorArray[n]->tabNumber() == -1) 
+
                 {
+                     std::cout << p->getName() << " has no source node. Creating a new tab." << std::endl;
                     createNewTab(editorArray[n]);
                 }
 
@@ -410,11 +421,13 @@ void FilterViewport::updateVisibleEditors(GenericEditor* activeEditor, int actio
     }
 
     editorArray.clear();
+    std::cout << "Cleared editor array." << std::endl;
 
     GenericEditor* editorToAdd = activeEditor;
 
     while (editorToAdd != 0) 
     {
+        std::cout << "Inserting " << editorToAdd->getName() << " at point 0." << std::endl;
 
         editorArray.insert(0,editorToAdd);
         GenericProcessor* currentProcessor = (GenericProcessor*) editorToAdd->getProcessor();
@@ -422,11 +435,10 @@ void FilterViewport::updateVisibleEditors(GenericEditor* activeEditor, int actio
 
         if (source != 0)
         {
-          //  std::cout << "Source: " << source->getName() << std::endl;
+            std::cout << "Source: " << source->getName() << std::endl;
             editorToAdd = (GenericEditor*) source->getEditor();
         } else {
-
-          //  std::cout << "No source found." << std::endl;
+            std::cout << "No source found." << std::endl;
             editorToAdd = 0;
         }
     }
@@ -441,12 +453,15 @@ void FilterViewport::updateVisibleEditors(GenericEditor* activeEditor, int actio
 
         if (dest != 0)
         {
-         //   std::cout << "Destination: " << dest->getName() << std::endl;
+
+            std::cout << "Destination: " << dest->getName() << std::endl;
             editorToAdd = (GenericEditor*) dest->getEditor();
             editorArray.add(editorToAdd);
+            std::cout << "Inserting " << editorToAdd->getName() << " at the end." << std::endl;
+
 
         } else {
-          // std::cout << "No dest found." << std::endl;
+           std::cout << "No dest found." << std::endl;
             editorToAdd = 0;
         }
     }
@@ -599,6 +614,12 @@ void FilterViewport::moveSelection (const KeyPress &key) {
                 // }
             }  
         }
+    } else if (key.getKeyCode() == key.upKey) {
+        
+        // move one tab up
+    } else if (key.getKeyCode() == key.downKey) {
+        
+        // move one tab down
     }
 }
 
diff --git a/Source/UI/FilterViewport.h b/Source/UI/FilterViewport.h
index 370e5c0d7efe7617de0a6aadf9461c698cbc8f60..c2c31850fa68cc7d3ef619f38032bb1c8c03badd 100644
--- a/Source/UI/FilterViewport.h
+++ b/Source/UI/FilterViewport.h
@@ -96,6 +96,8 @@ private:
     bool componentWantsToMove;
     int indexOfMovingComponent;
 
+    int currentTab;
+
     //bool signalChainNeedsSource;
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FilterViewport);  
diff --git a/open-ephys.jucer b/open-ephys.jucer
index 75b15193e6f9c8467de4d89f45ceafd88eb17e11..0a6143658dfda090590e00a64d511e22c77c72db 100644
--- a/open-ephys.jucer
+++ b/open-ephys.jucer
@@ -47,6 +47,7 @@
       </GROUP>
       <GROUP id="W2L6BdA" name="Images">
         <GROUP id="Gu1BsKu" name="Icons">
+          <FILE id="wI03PLF" name="wifi.png" compile="0" resource="1" file="Resources/Images/Icons/wifi.png"/>
           <FILE id="p1qlCZ5" name="SourceDrop.png" compile="0" resource="1" file="Resources/Images/Icons/SourceDrop.png"/>
           <FILE id="nWbYpu" name="DefaultDataSource.png" compile="0" resource="1"
                 file="Resources/Images/Icons/DefaultDataSource.png"/>
@@ -164,6 +165,16 @@
         <FILE id="hGnGAjh" name="EventNode.cpp" compile="1" resource="0" file="Source/Processors/EventNode.cpp"/>
         <FILE id="dUtRN6" name="EventNode.h" compile="0" resource="0" file="Source/Processors/EventNode.h"/>
         <GROUP id="AqvwO6w" name="Editors">
+          <FILE id="i2MR4pC" name="ImageIcon.cpp" compile="1" resource="0" file="Source/Processors/Editors/ImageIcon.cpp"/>
+          <FILE id="N8r8D18" name="ImageIcon.h" compile="0" resource="0" file="Source/Processors/Editors/ImageIcon.h"/>
+          <FILE id="mLd64ww" name="WiFiOutputEditor.cpp" compile="1" resource="0"
+                file="Source/Processors/Editors/WiFiOutputEditor.cpp"/>
+          <FILE id="qunHBGe" name="WiFiOutputEditor.h" compile="0" resource="0"
+                file="Source/Processors/Editors/WiFiOutputEditor.h"/>
+          <FILE id="5DPzIoS" name="EventNodeEditor.cpp" compile="1" resource="0"
+                file="Source/Processors/Editors/EventNodeEditor.cpp"/>
+          <FILE id="gva5me" name="EventNodeEditor.h" compile="0" resource="0"
+                file="Source/Processors/Editors/EventNodeEditor.h"/>
           <FILE id="OJKuulJ" name="SignalGeneratorEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/Editors/SignalGeneratorEditor.cpp"/>
           <FILE id="JhVBo3n" name="SignalGeneratorEditor.h" compile="0" resource="0"