diff --git a/oracle/src/default_combine_data.rs b/oracle/src/default_combine_data.rs
index aabaa522cfc7a7dcd441621eb220efbeae4ce8fe..23352a3183aea8fe2437490408b98f204f2232b2 100644
--- a/oracle/src/default_combine_data.rs
+++ b/oracle/src/default_combine_data.rs
@@ -1,23 +1,26 @@
-use frame_support::{
-	parameter_types,
-	traits::{Get, Time},
-};
+use frame_support::traits::{Get, Time};
 use orml_traits::CombineData;
-use rstd::prelude::Vec;
+use rstd::prelude::*;
 
 use crate::{MomentOf, TimestampedValueOf, Trait};
 
 /// Sort by value and returns median timestamped value.
 /// Returns prev_value if not enough valid values.
-pub struct DefaultCombineData<T: Trait>(rstd::marker::PhantomData<T>);
-
-impl<T: Trait> CombineData<T::OracleKey, TimestampedValueOf<T>> for DefaultCombineData<T> {
+pub struct DefaultCombineData<T, MinimumCount, ExpiresIn>(rstd::marker::PhantomData<(T, MinimumCount, ExpiresIn)>);
+
+impl<T, MinimumCount, ExpiresIn> CombineData<T::OracleKey, TimestampedValueOf<T>>
+	for DefaultCombineData<T, MinimumCount, ExpiresIn>
+where
+	T: Trait,
+	MinimumCount: Get<u32>,
+	ExpiresIn: Get<MomentOf<T>>,
+{
 	fn combine_data(
 		_key: &T::OracleKey,
 		values: Vec<TimestampedValueOf<T>>,
 		prev_value: Option<TimestampedValueOf<T>>,
 	) -> Option<TimestampedValueOf<T>> {
-		let expires_in: MomentOf<T> = <Self as Parameters<MomentOf<T>>>::expires_in::get().into();
+		let expires_in = ExpiresIn::get();
 		let now = T::Time::now();
 		let mut valid_values = values
 			.into_iter()
@@ -29,8 +32,8 @@ impl<T: Trait> CombineData<T::OracleKey, TimestampedValueOf<T>> for DefaultCombi
 			})
 			.collect::<Vec<TimestampedValueOf<T>>>();
 
-		let count = valid_values.len();
-		let minimum_count = <Self as Parameters<MomentOf<T>>>::minimum_count::get();
+		let count = valid_values.len() as u32;
+		let minimum_count = MinimumCount::get();
 		if count < minimum_count {
 			return prev_value;
 		}
@@ -38,21 +41,6 @@ impl<T: Trait> CombineData<T::OracleKey, TimestampedValueOf<T>> for DefaultCombi
 		valid_values.sort_by(|a, b| a.value.cmp(&b.value));
 
 		let median_index = count / 2;
-		return Some(valid_values[median_index].clone());
+		return Some(valid_values[median_index as usize].clone());
 	}
 }
-
-parameter_types! {
-	pub const MinimumCount: usize = 3;
-	pub const ExpiresIn: u32 = 600;
-}
-
-trait Parameters<Moment> {
-	type minimum_count: Get<usize>;
-	type expires_in: Get<Moment>;
-}
-
-impl<T: Trait> Parameters<MomentOf<T>> for DefaultCombineData<T> {
-	type minimum_count = MinimumCount;
-	type expires_in = ExpiresIn;
-}
diff --git a/oracle/src/mock.rs b/oracle/src/mock.rs
index 0f3c97dc73244bfd7b62f56aa7b720437a906696..b7b6064295650428ed331cacc2b73406be5495ca 100644
--- a/oracle/src/mock.rs
+++ b/oracle/src/mock.rs
@@ -71,11 +71,16 @@ impl OperatorProvider<AccountId> for MockOperatorProvider {
 	}
 }
 
+parameter_types! {
+	pub const MinimumCount: u32 = 3;
+	pub const ExpiresIn: u32 = 600;
+}
+
 impl Trait for Test {
 	type Event = ();
 	type OnNewData = ();
 	type OperatorProvider = MockOperatorProvider;
-	type CombineData = DefaultCombineData<Self>;
+	type CombineData = DefaultCombineData<Self, MinimumCount, ExpiresIn>;
 	type Time = pallet_timestamp::Module<Self>;
 	type OracleKey = Key;
 	type OracleValue = Value;