Index: /osgVisual/include/dataIO/visual_dataIO.h
===================================================================
--- /osgVisual/include/dataIO/visual_dataIO.h	(revision 117)
+++ /osgVisual/include/dataIO/visual_dataIO.h	(revision 118)
@@ -127,5 +127,5 @@
 	 * List of SLOT variables dataIO provides.
 	 */ 
-	std::vector<dataIO_slot> dataSlots;
+	std::vector<dataIO_slot*> dataSlots;
 
 	friend class dataIO_eventCallback;
Index: /osgVisual/include/extLink/dataIO_extLink.h
===================================================================
--- /osgVisual/include/extLink/dataIO_extLink.h	(revision 117)
+++ /osgVisual/include/extLink/dataIO_extLink.h	(revision 118)
@@ -41,5 +41,5 @@
 	 * 
 	 */ 
-	dataIO_extLink(std::vector<osgVisual::dataIO_slot>& dataSlots_) : dataSlots(dataSlots_){}
+	dataIO_extLink(std::vector<osgVisual::dataIO_slot *>& dataSlots_) : dataSlots(dataSlots_){}
 
 	/**
@@ -87,5 +87,5 @@
 	 * This central dataSlot array is filled with available slots by this extLink class.
 	 */ 
-	std::vector<dataIO_slot>& dataSlots;
+	std::vector<dataIO_slot *>& dataSlots;
  
 };
Index: /osgVisual/include/extLink/dataIO_extLinkVCL.h
===================================================================
--- /osgVisual/include/extLink/dataIO_extLinkVCL.h	(revision 117)
+++ /osgVisual/include/extLink/dataIO_extLinkVCL.h	(revision 118)
@@ -76,5 +76,5 @@
 #include <leakDetection.h>
 public:
-	dataIO_extLinkVCL(std::vector<dataIO_slot>& dataSlots_);
+	dataIO_extLinkVCL(std::vector<dataIO_slot *>& dataSlots_);
 	virtual ~dataIO_extLinkVCL(void);
 
@@ -116,5 +116,4 @@
     CVCLVariable<double> SAENGER_ROT_Y;
     CVCLVariable<double> SAENGER_ROT_Z;
-
 };
 
Index: /osgVisual/src/dataIO/visual_dataIO.cpp
===================================================================
--- /osgVisual/src/dataIO/visual_dataIO.cpp	(revision 117)
+++ /osgVisual/src/dataIO/visual_dataIO.cpp	(revision 118)
@@ -191,12 +191,9 @@
 	{
 		// Check if this variable name&-type already exists
-		if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_  && dataSlots[i].variableType ==  variableTyp_)
+		if( dataSlots[i]->variableName == variableName_ && dataSlots[i]->direction == direction_  && dataSlots[i]->variableType ==  variableTyp_)
 		{
 			//OSG_NOTIFY( osg::INFO ) << "visual_dataIO::getSlotPointer() - Slot found at position " << i << std::endl;
 			// Return pointer to the value
-			if (variableTyp_ == osgVisual::dataIO_slot::STRING )
-				return &(dataSlots[i].sValue);
-			else
-				return &(dataSlots[i].value);
+			return dataSlots[i];
 		}
 	}
@@ -204,16 +201,11 @@
 	// Slot does not exist -> add it to slot list
 	//OSG_NOTIFY( osg::INFO ) << "visual_dataIO::getSlotPointer() - Slot not found, will add as new slot " << std::endl;
-	dataIO_slot newSlot;
-	newSlot.variableName = variableName_;
-	newSlot.variableType = variableTyp_;
-	newSlot.value = 0;
-	newSlot.sValue = "";
+	dataIO_slot* newSlot = new dataIO_slot();
+	newSlot->variableName = variableName_;
+	newSlot->variableType = variableTyp_;
+	newSlot->value = 0;
+	newSlot->sValue = "";
 	dataSlots.push_back( newSlot );
-	if (variableTyp_ == osgVisual::dataIO_slot::STRING )
-		return &(dataSlots.back().sValue);
-	else
-	{
-		return &(dataSlots.back().value);
-	}
+	return dataSlots.back();
 }
 
@@ -224,8 +216,8 @@
 	{
 		// Check if this variable name&-type already exists
-		if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_  && dataSlots[i].variableType == osgVisual::dataIO_slot::DOUBLE )
+		if( dataSlots[i]->variableName == variableName_ && dataSlots[i]->direction == direction_  && dataSlots[i]->variableType == osgVisual::dataIO_slot::DOUBLE )
 		{
 			//OSG_NOTIFY( osg::INFO ) << "visual_dataIO::getSlotDataAsDouble() - Slot found at position " << i << std::endl;
-			return dataSlots[i].value;
+			return dataSlots[i]->value;
 		}
 	}
@@ -239,8 +231,8 @@
 	{
 		// Check if this variable name&-type already exists
-		if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_  && dataSlots[i].variableType == osgVisual::dataIO_slot::STRING )
+		if( dataSlots[i]->variableName == variableName_ && dataSlots[i]->direction == direction_  && dataSlots[i]->variableType == osgVisual::dataIO_slot::STRING )
 		{
 			//OSG_NOTIFY( osg::INFO ) << "visual_dataIO::getSlotDataAsDouble() - Slot found at position " << i << std::endl;
-			return dataSlots[i].sValue;
+			return dataSlots[i]->sValue;
 		}
 	}
@@ -255,10 +247,10 @@
 	{
 		// Check if this variable name&-type already exists
-		if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_ && dataSlots[i].variableType ==  osgVisual::dataIO_slot::STRING)
+		if( dataSlots[i]->variableName == variableName_ && dataSlots[i]->direction == direction_ && dataSlots[i]->variableType ==  osgVisual::dataIO_slot::STRING)
 		{
 			// Update value
-			dataSlots[i].sValue = sValue_;
+			dataSlots[i]->sValue = sValue_;
 			slotFound = true;
-			return &(dataSlots[i]);
+			return dataSlots[i];
 		}
 		
@@ -268,11 +260,12 @@
 	{
 		// Slot does not exist -> add it to slot list
-		dataIO_slot newSlot;
-		newSlot.variableName = variableName_;
-		newSlot.direction = direction_;
-		newSlot.variableType = osgVisual::dataIO_slot::STRING;
-		newSlot.value = 0;
-		newSlot.sValue = sValue_;
+		dataIO_slot* newSlot = new dataIO_slot();
+		newSlot->variableName = variableName_;
+		newSlot->direction = direction_;
+		newSlot->variableType = osgVisual::dataIO_slot::STRING;
+		newSlot->value = 0;
+		newSlot->sValue = sValue_;
 		dataSlots.push_back( newSlot );
+		return dataSlots.back();
 	}
 
@@ -287,11 +280,11 @@
 	{
 		// Check if this variableName & -type already exists
-		if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_ && dataSlots[i].variableType ==  osgVisual::dataIO_slot::DOUBLE)
+		if( dataSlots[i]->variableName == variableName_ && dataSlots[i]->direction == direction_ && dataSlots[i]->variableType ==  osgVisual::dataIO_slot::DOUBLE)
 		{
 			// Update value
 			//OSG_NOTIFY( osg::ALWAYS ) << "setSlotData: " << variableName_ << " - value: " << value_ << std::endl;
-			dataSlots[i].value = value_;
+			dataSlots[i]->value = value_;
 			slotFound = true;
-			return &(dataSlots[i]);
+			return dataSlots[i];
 		}	
 	}
@@ -300,11 +293,12 @@
 	{
 		// Slot does not exist -> add it to slot list
-		dataIO_slot newSlot;
-		newSlot.variableName = variableName_;
-		newSlot.direction = direction_;
-		newSlot.variableType = osgVisual::dataIO_slot::DOUBLE;
-		newSlot.value = value_;
-		newSlot.sValue = "";
+		dataIO_slot* newSlot = new dataIO_slot();
+		newSlot->variableName = variableName_;
+		newSlot->direction = direction_;
+		newSlot->variableType = osgVisual::dataIO_slot::DOUBLE;
+		newSlot->value = value_;
+		newSlot->sValue = "";
 		dataSlots.push_back( newSlot );
+		return dataSlots.back();
 	}
 
Index: /osgVisual/src/extLink/dataIO_extLinkVCL.cpp
===================================================================
--- /osgVisual/src/extLink/dataIO_extLinkVCL.cpp	(revision 117)
+++ /osgVisual/src/extLink/dataIO_extLinkVCL.cpp	(revision 118)
@@ -21,5 +21,5 @@
 using namespace osgVisual;
 
-dataIO_extLinkVCL::dataIO_extLinkVCL(std::vector<dataIO_slot>& dataSlots_) : dataIO_extLink(dataSlots_)
+dataIO_extLinkVCL::dataIO_extLinkVCL(std::vector<dataIO_slot *>& dataSlots_) : dataIO_extLink(dataSlots_)
 {
 	OSG_NOTIFY( osg::ALWAYS ) << "extLinkVCL constructed" << std::endl;
@@ -42,47 +42,5 @@
 
 		parseVCLConfig();
-		bool error = false;
-
-		if( !SAENGER1_POS_LAT.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER1_POS_LAT") )
-			error = true;
-		if( !SAENGER1_POS_LON.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER1_POS_LON") )
-			error = true;
-		if( !SAENGER1_POS_ALT.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER1_POS_ALT") )
-			error = true;
-		if( !SAENGER1_ROT_X.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER1_ROT_X") )
-			error = true;
-		if( !SAENGER1_ROT_Y.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER1_ROT_Y") )
-			error = true;
-		if( !SAENGER1_ROT_Z.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER1_ROT_Z") )
-			error = true;
-
-		if( !SAENGER2_POS_LAT.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER2_POS_LAT") )
-			error = true;
-		if( !SAENGER2_POS_LON.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER2_POS_LON") )
-			error = true;
-		if( !SAENGER2_POS_ALT.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER2_POS_ALT") )
-			error = true;
-		if( !SAENGER2_ROT_X.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER2_ROT_X") )
-			error = true;
-		if( !SAENGER2_ROT_Y.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER2_ROT_Y") )
-			error = true;
-		if( !SAENGER2_ROT_Z.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER2_ROT_Z") )
-			error = true;
-	
-		if( !SAENGER_POS_LAT.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER_POS_LAT") )
-			error = true;
-		if( !SAENGER_POS_LON.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER_POS_LON") )
-			error = true;
-		if( !SAENGER_POS_ALT.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER_POS_ALT") )
-			error = true;
-		if( !SAENGER_ROT_X.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER_ROT_X") )
-			error = true;
-		if( !SAENGER_ROT_Y.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER_ROT_Y") )
-			error = true;
-		if( !SAENGER_ROT_Z.Attach("VISENGINE_CAMERA_CHANNEL", "SAENGER_ROT_Z") )
-			error = true;
-
-		if (error)
-			OSG_NOTIFY( osg::FATAL ) << "ERROR: An error occured while attaching VCL." << std::endl;
+		
 		initialized = true;
 	}
@@ -100,5 +58,4 @@
 }
 
-
 bool dataIO_extLinkVCL::readTO_OBJvalues()
 {
@@ -108,25 +65,13 @@
 	CVCLIO::GetInstance().DoDataExchange();
 
-	// Copy data from VCL variables to slot variables:
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER1_POS_LAT", osgVisual::dataIO_slot::TO_OBJ, SAENGER1_POS_LAT.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER1_POS_LON", osgVisual::dataIO_slot::TO_OBJ, SAENGER1_POS_LON.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER1_POS_ALT", osgVisual::dataIO_slot::TO_OBJ, -SAENGER1_POS_ALT.GetValue() );	// Negatives Vorzeichen da Z-Koordinaten anders herum.
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER1_ROT_X", osgVisual::dataIO_slot::TO_OBJ, SAENGER1_ROT_X.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER1_ROT_Y", osgVisual::dataIO_slot::TO_OBJ, SAENGER1_ROT_Y.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER1_ROT_Z", osgVisual::dataIO_slot::TO_OBJ, SAENGER1_ROT_Z.GetValue() );
-
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER2_POS_LAT", osgVisual::dataIO_slot::TO_OBJ, SAENGER2_POS_LAT.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER2_POS_LON", osgVisual::dataIO_slot::TO_OBJ, SAENGER2_POS_LON.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER2_POS_ALT", osgVisual::dataIO_slot::TO_OBJ, -SAENGER2_POS_ALT.GetValue() );	// Negatives Vorzeichen da Z-Koordinaten anders herum.
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER2_ROT_X", osgVisual::dataIO_slot::TO_OBJ, SAENGER2_ROT_X.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER2_ROT_Y", osgVisual::dataIO_slot::TO_OBJ, SAENGER2_ROT_Y.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER2_ROT_Z", osgVisual::dataIO_slot::TO_OBJ, SAENGER2_ROT_Z.GetValue() );
-
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER_POS_LAT", osgVisual::dataIO_slot::TO_OBJ, SAENGER_POS_LAT.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER_POS_LON", osgVisual::dataIO_slot::TO_OBJ, SAENGER_POS_LON.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER_POS_ALT", osgVisual::dataIO_slot::TO_OBJ, -SAENGER_POS_ALT.GetValue() );	// Negatives Vorzeichen da Z-Koordinaten anders herum.
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER_ROT_X", osgVisual::dataIO_slot::TO_OBJ, SAENGER_ROT_X.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER_ROT_Y", osgVisual::dataIO_slot::TO_OBJ, SAENGER_ROT_Y.GetValue() );
-	osgVisual::visual_dataIO::getInstance()->setSlotData( "SAENGER_ROT_Z", osgVisual::dataIO_slot::TO_OBJ, SAENGER_ROT_Z.GetValue() );
+	// read TO_OBJ values from VCL
+	for(unsigned int i=0;i<extLinkChannels.size();i++)
+	{
+		if(extLinkSlots[i]->getdataDirection() == osgVisual::dataIO_slot::TO_OBJ)
+		{
+			//Copy data from VCL to slot. IMPORTANT: Due to VCL's string incapability only double slots are filled.
+			osgVisual::visual_dataIO::getInstance()->setSlotData( extLinkSlots[i]->getVariableName(), osgVisual::dataIO_slot::TO_OBJ, extLinkChannels[i]->GetValue() );
+		}	// IF (TO_OBJ) END
+	}
 
 	//OSG_NOTIFY( osg::ALWAYS ) << "LAT: " << osgVisual::visual_dataIO::getInstance()->getSlotDataAsDouble("SAENGER1_POS_LAT", osgVisual::dataIO_slot::TO_OBJ ) << std::endl;
@@ -142,5 +87,15 @@
 		// Example: MY_CHANNEL.setValue( myValue );
 
-	/* In VCL no writeback transaction is done, 
+	// write FROM_OBJ values into VCL
+	for(unsigned int i=0;i<extLinkChannels.size();i++)
+	{
+		if(extLinkSlots[i]->getdataDirection() == osgVisual::dataIO_slot::FROM_OBJ && extLinkSlots[i]->getvarType() == osgVisual::dataIO_slot::DOUBLE)
+		{
+			//Copy data from slot to VCL. IMPORTANT: Due to VCL's string incapability only double slots are filled.
+			extLinkChannels[i]->SetValue( osgVisual::visual_dataIO::getInstance()->getSlotDataAsDouble( extLinkSlots[i]->getVariableName(), osgVisual::dataIO_slot::FROM_OBJ ) );
+		}	// IF (FROM_OBJ) END
+	}
+
+	/* In VCL no VCL dataexchange is performed, 
 	it is postponed until the next frame beginning,
 	where TO_OBJ exchange calls CVCLIO::GetInstance().DoDataExchange();.
@@ -256,5 +211,6 @@
 
 		// Set SLOT data and store SLOT pointer 
-		extLinkSlots.push_back( osgVisual::visual_dataIO::getInstance()->setSlotData( entryName, direction_, 0 ) );
+		osgVisual::dataIO_slot* tmpSlot = osgVisual::visual_dataIO::getInstance()->setSlotData( entryName, direction_, 0 );
+		extLinkSlots.push_back( tmpSlot );
 	}	// FOR each ENTRY END
 }
