public boolean removeFromSystemIfPossible(AvalonSystem sys)
	{
		boolean bChanged = false;

		if(rx_dma == null)
		{
			rx_dma = findDMAEngine(true);
			bChanged |= encapsulateDMAEngine(sys,rx_dma, "rx");
		}
		if(tx_dma == null)
		{
			tx_dma = findDMAEngine(false);
			bChanged |= encapsulateDMAEngine(sys, tx_dma, "tx");
		}
		if((desc_mem == null)&&(dmaType == TSEDmaType.SGDMA))
		{
			if(rx_dma == null)
			{
				Logger.logln(this, "No RX-DMA engine. Cannot find descriptor memory", LogLevel.WARNING);
			} else {
				Interface intfDescr = rx_dma.getInterfaceByName("descriptor_read");
				desc_mem = findSlaveComponent(intfDescr, "memory", "onchipmem");
				if(desc_mem == null)
				{
					Logger.logln(this, "Failed to find onchip descriptor memory. " +
							"Trying other memories", LogLevel.WARNING);
					desc_mem = findSlaveComponent(intfDescr, "memory", null);
				}
				if(desc_mem!=null)
				{
					sys.removeSystemComponent(desc_mem);
					bChanged = true;
					Interface slave = desc_mem.getInterfaceByName("s1");
					desc_mem.removeInterface(slave);
					slave.setOwner(this);
					vInterfaces.add(slave);
					/* Steal both interface from a dualport ram */
					slave = desc_mem.getInterfaceByName("s2");
					if(slave!=null) {
						desc_mem.removeInterface(slave);
						slave.setOwner(this);
						vInterfaces.add(slave);
					}
				} else {
					Logger.logln(this, "Failed to find descriptor memory.", LogLevel.WARNING);
				}
			}
		}
		return bChanged;
	}