diff --git a/include/ITAThirdOctaveFilterbank.h b/include/ITAThirdOctaveFilterbank.h
index effeb56804492b54b9c52030f3f2c95bb0c3a460..0b3acee7320a11dbaa4d4586420161aa1534add4 100644
--- a/include/ITAThirdOctaveFilterbank.h
+++ b/include/ITAThirdOctaveFilterbank.h
@@ -63,7 +63,8 @@ public:
 	virtual inline void SetIdentity( const bool bSmoothChangeover = true )
 	{
 		CITAThirdOctaveMagnitudeSpectrum oIdentity;
-		SetGains( oIdentity, bSmoothChangeover );
+		oIdentity.SetIdentity();
+		SetMagnitudes( oIdentity, bSmoothChangeover );
 	};
 
 	//! Verstärkungsfaktoren setzen
@@ -71,7 +72,7 @@ public:
 	  * \param oGains Neue Verstärkungsfaktoren
 	  * \param bSmoothChangeover Überbenden (default, true) oder direktes Umschalten (false)
 	  */
-	virtual void SetGains( const CITAThirdOctaveMagnitudeSpectrum& oGains, const bool bSmoothChangeover = true ) = 0;
+	virtual void SetMagnitudes( const CITAThirdOctaveMagnitudeSpectrum& oGains, const bool bSmoothChangeover = true ) = 0;
 
 	//! Latenz (Verzögerung) der Filterbank zurückgeben
 	/**
diff --git a/include/ITAThirdOctaveFilterbankFIR.h b/include/ITAThirdOctaveFilterbankFIR.h
index 9f63affb5ab174aea36305778cbefc2f0b3bcf09..24083dfa4e9c1c3abc7148d70f6d74b6c7d74eaa 100644
--- a/include/ITAThirdOctaveFilterbankFIR.h
+++ b/include/ITAThirdOctaveFilterbankFIR.h
@@ -70,7 +70,7 @@ public:
 		pFilter->Release();	// Auto-release
 	}
 
-	inline virtual void SetGains( const CITAThirdOctaveMagnitudeSpectrum& oGains, const bool bSmoothChangeover = true )
+	inline virtual void SetMagnitudes( const CITAThirdOctaveMagnitudeSpectrum& oGains, const bool bSmoothChangeover = true )
 	{
 		m_pGenerator->GenerateFilter( oGains, m_pfFilter );
 		ITAUPFilter* pFilter = m_pConvolver->RequestFilter();
diff --git a/include/ITAThirdOctaveFilterbankIIR.h b/include/ITAThirdOctaveFilterbankIIR.h
index e792796c54746ead8af2619930ab4dd5949a1464..99125fcf9f6fb11f994c4ae219f07e86abd79ab9 100644
--- a/include/ITAThirdOctaveFilterbankIIR.h
+++ b/include/ITAThirdOctaveFilterbankIIR.h
@@ -21,6 +21,7 @@
 
 #include <ITADSPDefinitions.h>
 #include <ITAThirdOctaveFilterbank.h>
+#include <ITAAmplitudeSpectrum.h>
 #include <ITABiquad.h>
 
 #include <vector>
@@ -53,7 +54,7 @@ public:
 	  * \param oGains Verstärkungsfaktoren
 	  * \param bSmoothChangeover Wenn true, dann überblenden (default), sonst sofort internen Gain umschalten
 	  */
-	void SetGains( const CITAThirdOctaveMagnitudeSpectrum& oGains, const bool bSmoothChangeover = true );
+	void SetMagnitudes( const CITAThirdOctaveMagnitudeSpectrum& oGains, const bool bSmoothChangeover = true );
 
 	//! Alle internen Zustände zurücksetzen (Akkumulatoren der Biquads)
 	void Clear();
@@ -70,7 +71,7 @@ private:
 	class GainUpdate
 	{
 	public:
-		CITAThirdOctaveMagnitudeSpectrum oGains; //!< Gain-Daten
+		CITAThirdOctaveMagnitudeSpectrum oMags; //! New magnitudes
 		int iBlendSamples;				 //!< Anzahl Samples zum Überblenden
 	};
 
@@ -79,7 +80,7 @@ private:
 	int m_nBandsInternal;	  //!< Anzahl der internen Bänder
 	int m_nBiquadsPerBand;	  //!< Anzahl von Biqads pro Band
 	std::vector< CITABiquad > m_vBiquads; //!< Biquads, Zugriff: [Band][BiquadNummer]
-	tbb::strict_ppl::concurrent_queue< GainUpdate > m_qGains; //!< Liste von neuen Verstärkungsfaktoren
+	tbb::strict_ppl::concurrent_queue< CITAThirdOctaveFilterbankIIR::GainUpdate > m_qGains; //!< Liste von neuen Verstärkungsfaktoren
 	CITAThirdOctaveMagnitudeSpectrum m_oGainsInternal; //!< Interne Verstärkungsfaktoren
 	float* m_pfTempFilterBuf; //!< Zwischenpuffer für Filter
 	float* m_pfTempOutputBuf; //!< Zwischenpuffer für Ausgabe
diff --git a/src/ITABiquad.cpp b/src/ITABiquad.cpp
index ab3c195792b2b6a1c89cd3381b311fd56a12b493..b85594d35de3670820d8100ba3ff852de852557f 100644
--- a/src/ITABiquad.cpp
+++ b/src/ITABiquad.cpp
@@ -39,7 +39,7 @@ void CITABiquad::Process( const float* pfInputData, float* pfOutputData, const i
 	return;
 }
 
-void CITABiquad::Process( const float* pfInputData, float* out, int nsamples, float outputGain, int outputMode )
+void CITABiquad::Process( const float* pfInputData, float* out, const int nsamples, const float outputGain, const int outputMode )
 {
 	// Lokale Akkumulatoren
 	float z0, z1, z2;
@@ -80,7 +80,7 @@ void CITABiquad::Process( const float* pfInputData, float* out, int nsamples, fl
 	return;
 }
 
-void CITABiquad::Process( const float* pfInputData, float* out, int nsamples, float outputGain1, float outputGain2, int outputMode )
+void CITABiquad::Process( const float* pfInputData, float* out, const int nsamples, const float outputGain1, const float outputGain2, const int outputMode )
 {
 	if( nsamples == 0 )
 		return;
diff --git a/src/ITAThirdOctaveFIRFilterGenerator.cpp b/src/ITAThirdOctaveFIRFilterGenerator.cpp
index 6160fce6ea2d8cf496a766a49c16a98f4e95e694..c45d89c00a92673234607742540458e13baf9ec8 100644
--- a/src/ITAThirdOctaveFIRFilterGenerator.cpp
+++ b/src/ITAThirdOctaveFIRFilterGenerator.cpp
@@ -41,7 +41,7 @@ CITAThirdOctaveFIRFilterGenerator::CITAThirdOctaveFIRFilterGenerator( const doub
 	float c = 2 * ITAConstants::PI_F / ( float ) ( m_iFilterLength - 1 );
 	for( int i = 0; i < m_iFilterLength; i++ )
 	{
-		m_pfWindow[ i ] = 0.5F * ( 1 - cos( c*i ) );
+		m_pfWindow[ i ] = 0.5F * ( 1 - cos( c * i ) );
 	}
 
 	m_ifft.plan( ITAFFT::IFFT_C2R, iFilterLength, m_pfBuf1, m_pfBuf2 );
diff --git a/src/ITAThirdOctaveFilterbankIIR.cpp b/src/ITAThirdOctaveFilterbankIIR.cpp
index faac7d592f0affe4c89827fc06111b56785252cd..9db12332a35d1fb11f0f0ad82f6cb85a5acaf1d4 100644
--- a/src/ITAThirdOctaveFilterbankIIR.cpp
+++ b/src/ITAThirdOctaveFilterbankIIR.cpp
@@ -5,6 +5,7 @@
 #include <ITAFastMath.h>
 #include <ITAStopWatch.h>
 #include <ITAException.h>
+#include <ITANumericUtils.h>
 
 #include <cassert>
 
@@ -45,10 +46,10 @@ int CITAThirdOctaveFilterbankIIR::GetLatency() const
 	return 0; // [stienen] sicher?
 }
 
-void CITAThirdOctaveFilterbankIIR::SetGains( const CITAThirdOctaveMagnitudeSpectrum& oGains, bool bSmoothChangeover )
+void CITAThirdOctaveFilterbankIIR::SetMagnitudes( const CITAThirdOctaveMagnitudeSpectrum& oMagnitudes, bool bSmoothChangeover )
 {
-	GainUpdate oUpdate;
-	oUpdate.oGains = oGains;
+	CITAThirdOctaveFilterbankIIR::GainUpdate oUpdate;
+	oUpdate.oMags = oMagnitudes;
 	oUpdate.iBlendSamples = ( bSmoothChangeover ? 1 : 0 );
 	m_qGains.push( oUpdate );
 }
@@ -76,12 +77,10 @@ void CITAThirdOctaveFilterbankIIR::Process( const float* pfInputSamples, float*
 		return; // [stienen] lieber assert? Filter ohne B�nder?
 
 	// Gains �bernehmen
-	GainUpdate oUpdate;
+	CITAThirdOctaveFilterbankIIR::GainUpdate oUpdate;
 	bool bUpdateGains = false;
 	while( m_qGains.try_pop( oUpdate ) )
-	{
 		bUpdateGains = true;
-	}
 
 	if( bUpdateGains )
 	{
@@ -99,7 +98,8 @@ void CITAThirdOctaveFilterbankIIR::Process( const float* pfInputSamples, float*
 					m_vBiquads[ i*m_nBiquadsPerBand + j ].Process( m_pfTempFilterBuf, m_pfTempFilterBuf, m_iBlockLength );
 
 				// Letztes Biquad mit Gain: tmp => output
-				m_vBiquads[ i*m_nBiquadsPerBand + k ].Process( m_pfTempFilterBuf, m_pfTempOutputBuf, m_iBlockLength, oUpdate.oGains[ i ], ( i == 0 ? CITABiquad::OUTPUT_OVERWRITE : CITABiquad::OUTPUT_ADD ) );
+				const float fGain = float( db10_to_ratio( oUpdate.oMags[ i ] ) );
+				m_vBiquads[ i*m_nBiquadsPerBand + k ].Process( m_pfTempFilterBuf, m_pfTempOutputBuf, m_iBlockLength, fGain, ( i == 0 ? CITABiquad::OUTPUT_OVERWRITE : CITABiquad::OUTPUT_ADD ) );
 			}
 		}
 		else
@@ -115,11 +115,13 @@ void CITAThirdOctaveFilterbankIIR::Process( const float* pfInputSamples, float*
 					m_vBiquads[ i*m_nBiquadsPerBand + j ].Process( m_pfTempFilterBuf, m_pfTempFilterBuf, m_iBlockLength );
 
 				// Letztes Biquad mit Gain: tmp => output
-				m_vBiquads[ i*m_nBiquadsPerBand + k ].Process( m_pfTempFilterBuf, m_pfTempOutputBuf, m_iBlockLength, m_oGainsInternal[ i ], oUpdate.oGains[ i ], ( i == 0 ? CITABiquad::OUTPUT_OVERWRITE : CITABiquad::OUTPUT_ADD ) );
+				const float fGain1 = m_oGainsInternal[ i ];
+				const float fGain2 = float( db10_to_ratio( oUpdate.oMags[ i ] ) );
+				m_vBiquads[ i*m_nBiquadsPerBand + k ].Process( m_pfTempFilterBuf, m_pfTempOutputBuf, m_iBlockLength, fGain1, fGain2, ( i == 0 ? CITABiquad::OUTPUT_OVERWRITE : CITABiquad::OUTPUT_ADD ) );
 			}
 		}
 
-		m_oGainsInternal = oUpdate.oGains;
+		m_oGainsInternal = oUpdate.oMags;
 	}
 	else
 	{
diff --git a/tests/ITADSPThirdOctaveFilterGeneratorTest.cpp b/tests/ITADSPThirdOctaveFilterGeneratorTest.cpp
index ecbd6d909ffe3aa83b7b5e3ae89657f30ca89dcd..2e5d2d7bd8409d02fc85f95289d7b55b5d5b7420 100644
--- a/tests/ITADSPThirdOctaveFilterGeneratorTest.cpp
+++ b/tests/ITADSPThirdOctaveFilterGeneratorTest.cpp
@@ -12,7 +12,8 @@
 using namespace std;
 
 const double g_dSampleRate = 44100;
-const int g_iFilterLength = int( ceil( g_dSampleRate / CITAThirdOctaveMagnitudeSpectrum::GetCenterFrequencies()[ 0 ] ) );
+//const int g_iFilterLength = int( ceil( g_dSampleRate / CITAThirdOctaveMagnitudeSpectrum::GetCenterFrequencies()[ 0 ] ) );
+const int g_iFilterLength = int( 10 * ceil( g_dSampleRate / CITAThirdOctaveMagnitudeSpectrum::GetCenterFrequencies()[ 0 ] ) );
 
 void TestThirdOctaveFilterGeneratorFIRIdentity();
 void TestThirdOctaveFilterGeneratorFIRZero();
diff --git a/tests/ITADSPThirdOctaveFilterbankTest.cpp b/tests/ITADSPThirdOctaveFilterbankTest.cpp
index bb0f727e172ce5839e44012e8c334f193cccbb5c..84e81447964d92c55e9e24147f2fc2e8eca05be0 100644
--- a/tests/ITADSPThirdOctaveFilterbankTest.cpp
+++ b/tests/ITADSPThirdOctaveFilterbankTest.cpp
@@ -31,7 +31,7 @@ void TestThirdOctaveFilterbankIIR()
 	CITAThirdOctaveMagnitudeSpectrum oMags;
 	oMags.SetIdentity();
 
-	pIIRFilterbank->SetGains( oMags );
+	pIIRFilterbank->SetMagnitudes( oMags );
 
 	ITASampleBuffer y( iSampleLength );
 
@@ -42,14 +42,14 @@ void TestThirdOctaveFilterbankIIR()
 	cout << "Runtime identity magnitudes:" << sw.ToString() << endl;
 
 	y.Normalize();
-	writeAudiofile( "bankout_zeros_iir.wav", &y, g_dSampleRate );
+	writeAudiofile( "ITADSPThirdOctaveFilterbankTest_IIR_Identity.wav", &y, g_dSampleRate );
 	y.Zero();
 
 	delete pIIRFilterbank;
 	pIIRFilterbank = CITAThirdOctaveFilterbank::Create( g_dSampleRate, iSampleLength, CITAThirdOctaveFilterbank::IIR_BIQUADS_ORDER10 );
 	
 	oMags.SetZero();
-	pIIRFilterbank->SetGains( oMags );
+	pIIRFilterbank->SetMagnitudes( oMags );
 	
 	sw.start();
 	pIIRFilterbank->Process( x.GetData(), y.GetData() );
@@ -57,19 +57,20 @@ void TestThirdOctaveFilterbankIIR()
 	cout << "Runtime zero magnitude:" << sw.ToString() << endl;
 
 	y.Normalize();
-	writeAudiofile( "bankout_identity_iir.wav", &y, g_dSampleRate );
+	writeAudiofile( "ITADSPThirdOctaveFilterbankTest_IIR_Zeros.wav", &y, g_dSampleRate );
 
 	delete pIIRFilterbank;
 	pIIRFilterbank = CITAThirdOctaveFilterbank::Create( g_dSampleRate, iSampleLength, CITAThirdOctaveFilterbank::IIR_BIQUADS_ORDER10 );
 
-	oMags[ 10 ] = 0.01f;
-	oMags[ 11 ] = 0.001f;
-	oMags[ 12 ] = 0.050f;
-	oMags[ 13 ] = 0.30f;
-	oMags[ 14 ] = 0.80f;
-	oMags[ 3 ] = 2.0f;
+	// dB values
+	oMags[ 3 ] = 3.0f;
+	oMags[ 10 ] = -3.0f;
+	oMags[ 11 ] = -6.0f;
+	oMags[ 12 ] = -9.0f;
+	oMags[ 13 ] = -9.0f;
+	oMags[ 14 ] = -7.0f;
 
-	pIIRFilterbank->SetGains( oMags );
+	pIIRFilterbank->SetMagnitudes( oMags );
 
 	sw.start();
 	pIIRFilterbank->Process( x.GetData(), y.GetData() );
@@ -77,7 +78,7 @@ void TestThirdOctaveFilterbankIIR()
 	cout << "Runtime real magnitudes:" << sw.ToString() << endl;
 
 	y.Normalize();
-	writeAudiofile( "bankout_realmags_iir.wav", &y, g_dSampleRate );
+	writeAudiofile( "ITADSPThirdOctaveFilterbankTest_IIR_SomeBands.wav", &y, g_dSampleRate );
 
 	delete pIIRFilterbank;
 }