diff --git a/substrate/srml/session/src/lib.rs b/substrate/srml/session/src/lib.rs
index 4e2103a3dc27ff1fb0b097fa03ca856f92ba745e..07d83507726f4c708416249b8b333c4785f2619d 100644
--- a/substrate/srml/session/src/lib.rs
+++ b/substrate/srml/session/src/lib.rs
@@ -43,10 +43,11 @@ extern crate srml_system as system;
 extern crate srml_timestamp as timestamp;
 
 use rstd::prelude::*;
-use primitives::traits::{Zero, One, OnFinalise, Convert, As};
+use primitives::traits::{Zero, One, OnFinalise, Convert};
 use runtime_support::{StorageValue, StorageMap};
 use runtime_support::dispatch::Result;
 use system::ensure_signed;
+use rstd::ops::Mul;
 
 /// A session has changed.
 pub trait OnSessionChange<T> {
@@ -211,9 +212,9 @@ impl<T: Trait> Module<T> {
 
 	/// Get the time that should have elapsed over a session if everything was working perfectly.
 	pub fn ideal_session_duration() -> T::Moment {
-		let block_period = <timestamp::Module<T>>::block_period();
-		let session_length = <T::Moment as As<T::BlockNumber>>::sa(Self::length());
-		session_length * block_period
+		let block_period: T::Moment = <timestamp::Module<T>>::block_period();
+		let session_length: T::BlockNumber = Self::length();
+		Mul::<T::BlockNumber>::mul(block_period, session_length)
 	}
 
 	/// Number of blocks remaining in this session, not counting this one. If the session is
diff --git a/substrate/srml/timestamp/src/lib.rs b/substrate/srml/timestamp/src/lib.rs
index 38107025a462039886d8beb9bb5e7905a619a836..fc602d4fa6669afa68b05d2fea0b8977b0d84dad 100644
--- a/substrate/srml/timestamp/src/lib.rs
+++ b/substrate/srml/timestamp/src/lib.rs
@@ -54,15 +54,19 @@ extern crate parity_codec as codec;
 
 use runtime_support::{StorageValue, Parameter};
 use runtime_support::dispatch::Result;
-use runtime_primitives::traits::{OnFinalise, SimpleArithmetic, As, Zero};
+use runtime_primitives::traits::{OnFinalise, SimpleArithmetic, Zero};
 use system::ensure_inherent;
+use rstd::ops::{Mul, Div};
+
+#[cfg(any(feature = "std", test))]
+use runtime_primitives::traits::As;
 
 pub trait Trait: consensus::Trait + system::Trait {
 	/// The position of the required timestamp-set extrinsic.
 	const TIMESTAMP_SET_POSITION: u32;
 
 	/// Type used for expressing timestamp.
-	type Moment: Parameter + Default + SimpleArithmetic + As<Self::BlockNumber>;
+	type Moment: Parameter + Default + SimpleArithmetic + Mul<Self::BlockNumber, Output = Self::Moment> + Div<Self::BlockNumber, Output = Self::Moment>;
 }
 
 decl_module! {