Index: NetworkEditor/src/NetworkCanvas.hxx
===================================================================
--- NetworkEditor/src/NetworkCanvas.hxx	(revision 11324)
+++ NetworkEditor/src/NetworkCanvas.hxx	(working copy)
@@ -891,7 +891,8 @@
 
 		markAsChanged();
 	}
-	void addPortMonitorProcessing( ProcessingBox * processing, QPoint point, const QString & monitorType )
+	// renamed from addPortMonitorProcessing (patch on SVN 11324)
+	void addLinkedProcessing( ProcessingBox * processing, QPoint point, const QString & monitorType )
 	{
 		if (networkIsDummy()) return;
 
@@ -906,6 +907,27 @@
 
 		markAsChanged();
 	}
+
+
+	void addLinkedSource( ProcessingBox * processing, QPoint point, const QString & monitorType )
+	{
+		if (networkIsDummy()) return;
+
+		unsigned portIndex = processing->portIndexByYPos(point);
+		QString inPortName = processing->getInportName(portIndex);
+
+		std::string processingId = _network->AddProcessing(monitorType.toStdString() );
+		CLAM::Processing & portMonitor = _network->GetProcessing( processingId );
+		// add box to canvas and connect
+		addProcessingBox( processingId.c_str(), &portMonitor, point+QPoint(-200,0));
+		addPortConnection(getBox(processingId.c_str()), 0, processing, portIndex);
+		markAsChanged();
+	}
+
+
+
+
+
 	virtual QWidget * embededWidgetFor(void * processing);
 	virtual unsigned nInports(void * processing) { return ((CLAM::Processing*)processing)->GetInPorts().Size();}
 	virtual unsigned nOutports(void * processing) { return ((CLAM::Processing*)processing)->GetOutPorts().Size();}
@@ -1229,10 +1251,39 @@
 			if (region==ProcessingBox::noRegion) continue;
 			if (region!=ProcessingBox::outportsRegion) return;
 
-			addPortMonitorProcessing(_processings[i], point, monitorType);
+			addLinkedProcessing(_processings[i], point, monitorType);
 			return;
 		}
 	}
+	void onAddSink()
+	{
+        	QPoint point = ((QAction*)sender())->data().toPoint();
+        	QString outputType = ((QAction*)sender())->text();
+        	for (unsigned i = _processings.size(); i--; )
+        	{
+        		ProcessingBox::Region region = _processings[i]->getRegion(point);
+			if (region==ProcessingBox::noRegion) continue;
+			if (region!=ProcessingBox::outportsRegion) return;
+			addLinkedProcessing(_processings[i], point, outputType);
+ 			return;
+        	}
+	}
+
+	void onAddSource()
+	{
+        	QPoint point = ((QAction*)sender())->data().toPoint();
+        	QString inputType = ((QAction*)sender())->text();
+        	for (unsigned i = _processings.size(); i--; )
+        	{
+        		ProcessingBox::Region region = _processings[i]->getRegion(point);
+			if (region==ProcessingBox::noRegion) continue;
+			if (region!=ProcessingBox::inportsRegion) return;
+			addLinkedSource(_processings[i], point, inputType);
+ 			return;
+        	}
+	}
+
+
 	void onConfigure()
 	{
 		QPoint point = ((QAction*)sender())->data().toPoint();
@@ -1340,6 +1391,13 @@
 		return ((CLAM::Processing*)processing)->GetOutPorts().GetByNumber(index).GetTypeId().name();
 	}
 
+	std::string inportTypeId(void * processing, unsigned index) const
+	{
+		if (!processing) return "";
+		return ((CLAM::Processing*)processing)->GetInPorts().GetByNumber(index).GetTypeId().name();
+	}
+
+
 	virtual void contextMenu(QMenu* menu, const QPoint & translatedPos)
 	{
 		for (unsigned i = _processings.size(); i--; )
@@ -1375,7 +1433,26 @@
 						QIcon icon = QIcon( QString(":/icons/images/%1").arg(iconPath.c_str()) );
 						menu->addAction( icon, key, this, SLOT(onAddMonitor()))->setData(translatedPos);
 					}
+					if (!((outportTypeId(_processings[i]->model(),portindex)).compare("f"))) 
+					{ // if is an audio type allows connectiion to sink
+						const char* key="AudioSink";
+			                        std::string iconPath = factory.GetValueFromAttribute(key, "icon"); 
+                	        		QIcon icon = QIcon( QString(":/icons/images/%1").arg(iconPath.c_str()) );
+						menu->addAction( icon, key, this,SLOT(onAddSink()))->setData(translatedPos);
+			                }
 				}
+				if (region==ProcessingBox::inportsRegion)
+				{
+					CLAM::ProcessingFactory & factory = CLAM::ProcessingFactory::GetInstance();
+					unsigned portindex = _processings[i]->portIndexByYPos(translatedPos);
+					if (!((inportTypeId(_processings[i]->model(),portindex)).compare("f")))
+					{ // if is an audio type allows connection to source
+						const char* key="AudioSource";
+						std::string iconPath = factory.GetValueFromAttribute(key,"icon");
+                	        		QIcon icon = QIcon( QString(":/icons/images/%1").arg(iconPath.c_str()) );
+						menu->addAction( icon, key, this ,SLOT(onAddSource()))->setData(translatedPos);
+					}
+				}
 				return;
 			}
 			if (region==ProcessingBox::nameRegion || 
Index: CLAM/src/Processing/AudioSource.cxx
===================================================================
--- CLAM/src/Processing/AudioSource.cxx	(revision 11324)
+++ CLAM/src/Processing/AudioSource.cxx	(working copy)
@@ -10,6 +10,7 @@
 		"key", "AudioSource",
 		"category", "Audio I/O",
 		"description", "AudioSource",
+		"icon", "none.svg",
 		0
 	};
 	//static FactoryRegistrator<ProcessingFactory, AudioSource> regAudioSource("AudioSource");
Index: CLAM/src/Processing/AudioSink.cxx
===================================================================
--- CLAM/src/Processing/AudioSink.cxx	(revision 11324)
+++ CLAM/src/Processing/AudioSink.cxx	(working copy)
@@ -13,6 +13,7 @@
 		"key", "AudioSink",
 		"category", "Audio I/O",
 		"description", "AudioSink",
+		"icon", "none.svg",
 		0
 	};
 	//static FactoryRegistrator<ProcessingFactory, AudioSink> regAudioSink("AudioSink");
