diff --git a/DMR2YSF/DMR2YSF.cpp b/DMR2YSF/DMR2YSF.cpp
index 2ddb4ef..551334a 100644
--- a/DMR2YSF/DMR2YSF.cpp
+++ b/DMR2YSF/DMR2YSF.cpp
@@ -511,10 +511,14 @@ int CDMR2YSF::run()
 				if(DataType == DT_TERMINATOR_WITH_LC && m_dmrFrames > 0U) {
 					LogMessage("DMR received end of voice transmission, %.1f seconds", float(m_dmrFrames) / 16.667F);
 
-					m_conv.putDMREOT();
 					networkWatchdog.stop();
 					m_dmrFrames = 0U;
 					m_dmrinfo = false;
+
+					if (m_dstid != m_lastTG)
+						break;
+
+					m_conv.putDMREOT();
 				}
 
 				if((DataType == DT_VOICE_LC_HEADER) && (DataType != m_dmrLastDT)) {
@@ -528,16 +532,22 @@ int CDMR2YSF::run()
 
 					m_netDst = (netflco == FLCO_GROUP ? "TG " : "") + m_lookup->findCS(DstId);
 
-					m_conv.putDMRHeader();
+					connectYSF(m_dstid);
+
 					LogMessage("DMR audio received from %s to %s", m_netSrc.c_str(), m_netDst.c_str());
 
 					m_dmrinfo = true;
+					m_dmrFrames = 0U;
 
 					m_netSrc.resize(YSF_CALLSIGN_LENGTH, ' ');
 					m_netDst.resize(YSF_CALLSIGN_LENGTH, ' ');
-					
-					m_dmrFrames = 0U;
-					connectYSF(m_dstid);
+
+					if (m_dstid != m_lastTG) {
+						m_dmrLastDT = DataType;
+						break;
+					}
+
+					m_conv.putDMRHeader();
 				}
 
 				if(DataType == DT_VOICE_SYNC || DataType == DT_VOICE) {
@@ -561,16 +571,25 @@ int CDMR2YSF::run()
 						m_dmrinfo = true;
 					}
 
-					m_conv.putDMR(dmr_frame); // Add DMR frame for YSF conversion
 					m_dmrFrames++;
+
+					if (m_dstid != m_lastTG)
+						break;
+
+					m_conv.putDMR(dmr_frame); // Add DMR frame for YSF conversion
 				}
 			}
 			else {
 				if(DataType == DT_VOICE_SYNC || DataType == DT_VOICE) {
 					unsigned char dmr_frame[50];
 					tx_dmrdata.getData(dmr_frame);
-					m_conv.putDMR(dmr_frame); // Add DMR frame for YSF conversion
+
 					m_dmrFrames++;
+
+					if (m_dstid != m_lastTG)
+						break;
+
+					m_conv.putDMR(dmr_frame); // Add DMR frame for YSF conversion
 				}
 
 				networkWatchdog.clock(ms);
@@ -835,7 +854,16 @@ void CDMR2YSF::connectYSF(unsigned int id)
 	if (id == m_tgUnlink)
 		sendYSFDisc();
 
-	// TODO: connection ID search
+	for (std::vector<CTGReg*>::iterator it = m_currTGList.begin(); it != m_currTGList.end(); ++it) {
+		if (id == (*it)->m_tg) {
+			sendYSFConn((*it)->m_ysf);
+			return;
+		}
+	}
+
+	LogMessage("DMR TG not found in TGList");
+
+	return;
 }
 
 void CDMR2YSF::sendYSFConn(unsigned int id)