diff --git a/source/common b/source/common
index 0962d758a8079cb5130411c14863e7869fd7de4b..421ed9d1c0af7fadd5a6e9188c36f6f6a4290ed4 160000
--- a/source/common
+++ b/source/common
@@ -1 +1 @@
-Subproject commit 0962d758a8079cb5130411c14863e7869fd7de4b
+Subproject commit 421ed9d1c0af7fadd5a6e9188c36f6f6a4290ed4
diff --git a/source/xSound/SoundLayer.cpp b/source/xSound/SoundLayer.cpp
index d099813898a91176af0bcb534a3381f5a57471d9..05d778f93de15941f20d92a1c30c7b1e66123249 100644
--- a/source/xSound/SoundLayer.cpp
+++ b/source/xSound/SoundLayer.cpp
@@ -71,6 +71,7 @@ void CSoundLayer::addLayer(CSoundLayer *pLayer)
 		LibReport(REPORT_MSG_LEVEL_FATAL, "Layer name '%s' exists", pLayer->getName());
 
 	m_mapLayers[pLayer->getName()] = pLayer;
+	m_aLayers.push_back(pLayer);
 }
 
 void CSoundLayer::delLayer(CSoundLayer *pLayer)
@@ -84,6 +85,12 @@ void CSoundLayer::delLayer(CSoundLayer *pLayer)
 		}
 	}
 
+	int idx = m_aLayers.indexOf(pLayer);
+	if(idx >= 0)
+	{
+		m_aLayers.erase(idx);
+	}
+
 	mem_delete(pLayer);
 }
 
@@ -92,6 +99,7 @@ void CSoundLayer::delLayer(CSoundLayer *pLayer)
 void CSoundLayer::addSndPlayer(CSoundPlayer *pSndPlayer)
 {
 	m_mapSndPlayers[pSndPlayer->getName()].push_back(pSndPlayer);
+	m_aSndPlayers.push_back(pSndPlayer);
 }
 
 void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer)
@@ -101,13 +109,16 @@ void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer)
 		return;
 
 	ArrayPlayer &oAP = m_mapSndPlayers[szName];
-	for(int i = 0, il = oAP.size(); i < il; ++i)
+	int idx = oAP.indexOf(pSndPlayer);
+	if(idx >= 0)
 	{
-		if(oAP[i] == pSndPlayer)
-		{
-			oAP.erase(i);
-			break;
-		}
+		oAP.erase(idx);
+	} 
+	
+	idx = m_aSndPlayers.indexOf(pSndPlayer);
+	if(idx >= 0)
+	{
+		m_aSndPlayers.erase(idx);
 	}
 
 	mem_delete(pSndPlayer);
@@ -118,6 +129,7 @@ void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer)
 void CSoundLayer::addSndEmitter(CSoundEmitter *pSndEmitter)
 {
 	m_mapSndEmitters[pSndEmitter->getName()].push_back(pSndEmitter);
+	m_aSndEmitters.push_back(pSndEmitter);
 }
 
 void CSoundLayer::delSndEmitter(const CSoundEmitter *pSndEmitter)
@@ -127,13 +139,16 @@ void CSoundLayer::delSndEmitter(const CSoundEmitter *pSndEmitter)
 		return;
 
 	ArrayEmitter &oAE = m_mapSndEmitters[szName];
-	for(int i = 0, il = oAE.size(); i < il; ++i)
+	int idx = oAE.indexOf(pSndEmitter);
+	if(idx >= 0)
 	{
-		if(oAE[i] == pSndEmitter)
-		{
-			oAE.erase(i);
-			break;
-		}
+		oAE.erase(idx);
+	}
+
+	idx = m_aSndEmitters.indexOf(pSndEmitter);
+	if(idx >= 0)
+	{
+		m_aSndEmitters.erase(idx);
 	}
 
 	mem_delete(pSndEmitter);
@@ -167,14 +182,9 @@ IXSoundLayer* XMETHODCALLTYPE CSoundLayer::findLayer(const char *szName)
 		return this;
 
 	IXSoundLayer *pFound = NULL;
-	// TODO use plain array for iteration
-	for(MapLayer::Iterator i = m_mapLayers.begin(); i; ++i)
+	for(UINT i = 0, l = m_aLayers.size(); i < l; ++i)
 	{
-		if(!i.second)
-		{
-			continue;
-		}
-		if((pFound = (*i.second)->findLayer(szName)))
+		if((pFound = m_aLayers[i]->findLayer(szName)))
 			break;
 	}
 
@@ -312,27 +322,21 @@ bool XMETHODCALLTYPE CSoundLayer::isPlaying() const
 
 //##########################################################################
 
-// FIXME никаких итераторов в апдейте!
 void CSoundLayer::update(const float3 &vListenerPos, const float3 &vListenerDir, const float3 &vListenerUp)
 {
-	for(MapLayer::Iterator i = m_mapLayers.begin(); i; ++i)
+	for(UINT i = 0, l = m_aLayers.size(); i < l; ++i)
 	{
-		if(*i.second)
-			(*i.second)->update(vListenerPos, vListenerDir, vListenerUp);
+		m_aLayers[i]->update(vListenerPos, vListenerDir, vListenerUp);
 	}
 
-	for(MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; ++i)
+	for(UINT i = 0, l = m_aSndPlayers.size(); i < l; ++i)
 	{
-		ArrayPlayer &oAP = *i.second;
-		for(int k = 0, kl = oAP.size(); k < kl; ++k)
-			oAP[k]->update(vListenerPos, vListenerDir, vListenerUp);
+		m_aSndPlayers[i]->update(vListenerPos, vListenerDir, vListenerUp);
 	}
 
-	for(MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; ++i)
+	for(UINT i = 0, l = m_aSndEmitters.size(); i < l; ++i)
 	{
-		ArrayEmitter &oAE = *i.second;
-		for(int k = 0, kl = oAE.size(); k < kl; ++k)
-			oAE[k]->update(vListenerPos, vListenerDir, vListenerUp);
+		m_aSndEmitters[i]->update(vListenerPos, vListenerDir, vListenerUp);
 	}
 }
 
@@ -377,27 +381,19 @@ void CSoundLayer::_play(bool canPlay, bool isFromParent)
 	}
 	m_isPlayingTotal = isPlaying;
 
-	for(MapLayer::Iterator i = m_mapLayers.begin(); i; ++i)
+	for(UINT i = 0, l = m_aLayers.size(); i < l; ++i)
 	{
-		(*i.second)->_play(isPlaying, true);
+		m_aLayers[i]->_play(isPlaying, true);
 	}
 
-	for(MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; ++i)
+	for(UINT i = 0, l = m_aSndPlayers.size(); i < l; ++i)
 	{
-		ArrayPlayer &oAP = *i.second;
-		for(int k = 0, kl = oAP.size(); k < kl; ++k)
-		{
-			oAP[k]->_onLayerPlay(isPlaying);
-		}
+		m_aSndPlayers[i]->_onLayerPlay(isPlaying);
 	}
 
-	for(MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; ++i)
+	for(UINT i = 0, l = m_aSndEmitters.size(); i < l; ++i)
 	{
-		ArrayEmitter &oAE = *i.second;
-		for(int k = 0, kl = oAE.size(); k < kl; ++k)
-		{
-			oAE[k]->_onLayerPlay(isPlaying);
-		}
+		m_aSndEmitters[i]->_onLayerPlay(isPlaying);
 	}
 
 	m_pPrimaryBuffer->play(isPlaying);
diff --git a/source/xSound/SoundLayer.h b/source/xSound/SoundLayer.h
index d5a5420737c2340ca15aebb3a3445c693ebf6193..edfa730902b611ec507b9b55404dcf1fd9db73d1 100644
--- a/source/xSound/SoundLayer.h
+++ b/source/xSound/SoundLayer.h
@@ -89,14 +89,17 @@ protected:
 
 	typedef AssotiativeArray<String, CSoundLayer*> MapLayer;
 	MapLayer m_mapLayers;
+	Array<CSoundLayer*> m_aLayers;
 
 	typedef Array<CSoundPlayer*> ArrayPlayer;
 	typedef AssotiativeArray<String, ArrayPlayer> MapPlayer;
 	MapPlayer m_mapSndPlayers;
+	Array<CSoundPlayer*> m_aSndPlayers;
 
 	typedef Array<CSoundEmitter*> ArrayEmitter;
 	typedef AssotiativeArray<String, ArrayEmitter> MapEmitter;
 	MapEmitter m_mapSndEmitters;
+	Array<CSoundEmitter*> m_aSndEmitters;
 };
 
 #endif
diff --git a/source/xSound/SoundSystem.cpp b/source/xSound/SoundSystem.cpp
index e50ed965b1aa2288b3926d27165b660750f47ff1..38c140e222cbff7111e5d9119b469616badfe717 100644
--- a/source/xSound/SoundSystem.cpp
+++ b/source/xSound/SoundSystem.cpp
@@ -52,11 +52,7 @@ void CSoundSystem::update(const float3 &vListenerPos, const float3 &vListenerDir
 {
 	if(m_pMasterLayer)
 		m_pMasterLayer->update(vListenerPos, vListenerDir, vListenerUp);
-
-	m_vObserverPos = vListenerPos; 
-	m_vObserverLook = vListenerDir; 
-	m_vObserverUp = vListenerUp;
-
+	
 	SndQueueMsg oMsg;
 	while(m_queue.pop(&oMsg))
 	{
diff --git a/source/xSound/SoundSystem.h b/source/xSound/SoundSystem.h
index 7ec85c8903cac13865306d19c427de45d3d024a0..05fd0bf46d26cd3205fa057a2d7a4a0056d7f731 100644
--- a/source/xSound/SoundSystem.h
+++ b/source/xSound/SoundSystem.h
@@ -85,8 +85,6 @@ protected:
 
 	typedef AssotiativeArray<String, IXAudioCodec*> MapCodec;
 	MapCodec m_mapCodecs;
-
-	float3 m_vObserverPos, m_vObserverLook, m_vObserverUp;
 	
 	SpinLock m_oSpinLockUpdate;
 };
diff --git a/source/xSound/plugin_main.cpp b/source/xSound/plugin_main.cpp
index 94f754071a9789b9f45ca950b17de7925b7a5e9e..89b082c4ecb8b8b934ac18170c77f5d03f44e033 100644
--- a/source/xSound/plugin_main.cpp
+++ b/source/xSound/plugin_main.cpp
@@ -80,7 +80,7 @@ public:
 
 	uint64_t getRepeatInterval() override
 	{
-		return(20000); // 20ms
+		return(50000); // 50ms
 	}
 
 protected: