diff --git a/substrate/demo/runtime/wasm/Cargo.toml b/substrate/demo/runtime/wasm/Cargo.toml
index 436c482015cba32e5d7c1d0303e7a47412b5dae7..266b5e2d8175a3eae39c7b9a4ddd2daff09e6e64 100644
--- a/substrate/demo/runtime/wasm/Cargo.toml
+++ b/substrate/demo/runtime/wasm/Cargo.toml
@@ -28,6 +28,7 @@ std = [
 
 [profile.release]
 panic = "abort"
+lto = true
 
 [workspace]
 members = []
diff --git a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm
index b94b5ddc9b64bf467dac7444f9050dcef50f92bd..5cae06b23b4b116d128c34f74799f667a2edcea2 100644
Binary files a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm and b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm differ
diff --git a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm
old mode 100644
new mode 100755
index 8ed27520fc72e552939f7e72b49d004ac07a729d..d1c274e15e41401c9b6f412489689b713888b9ae
Binary files a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm and b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm differ
diff --git a/substrate/polkadot/runtime/wasm/Cargo.toml b/substrate/polkadot/runtime/wasm/Cargo.toml
index 0e30ce9ee68570069d299cbb1d3559eb7d92e074..dac9694b8b65ab14b9c1f22e8d1ec7ab39eedf94 100644
--- a/substrate/polkadot/runtime/wasm/Cargo.toml
+++ b/substrate/polkadot/runtime/wasm/Cargo.toml
@@ -29,6 +29,7 @@ std = [
 
 [profile.release]
 panic = "abort"
+lto = true
 
 [workspace]
 members = []
diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm
index 3b3fb8f78c34f3325307db47c3986ea9cca59203..a752fb6e219718c47f9bb6a40b636ddc8f7fb235 100644
Binary files a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm and b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm differ
diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm
old mode 100644
new mode 100755
index cb08a3c72bf5e04296d54ced6ad68b3184534674..2dd5cac8235c7f6c839e64afea12a2cbbfd97e8b
Binary files a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm and b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm differ
diff --git a/substrate/substrate/executor/src/wasm_executor.rs b/substrate/substrate/executor/src/wasm_executor.rs
index 4d525a5975387dfd79285e5b8898e2a83a9988ab..d95951e76db83442775e9aea1f6ddc4e196a97d3 100644
--- a/substrate/substrate/executor/src/wasm_executor.rs
+++ b/substrate/substrate/executor/src/wasm_executor.rs
@@ -35,10 +35,23 @@ struct Heap {
 }
 
 impl Heap {
-	fn new() -> Self {
-		Heap {
-			end: 262144,
+	fn new(memory: &MemoryInstance) -> Result<Self> {
+		const HEAP_SIZE_IN_PAGES: u32 = 8;
+		const PAGE_SIZE_IN_BYTES: u32 = 65536;
+
+		let prev_page_count = memory.grow(HEAP_SIZE_IN_PAGES).map_err(
+			|_: ::parity_wasm::interpreter::Error<DummyUserError>| Error::from(ErrorKind::Runtime),
+		)?;
+		if prev_page_count == 0xFFFFFFFF {
+			// Wasm vm refuses to mount the specified amount of new pages. This
+			// could mean that wasm binary specifies memory limit and we are trying
+			// to allocate beyond that limit.
+			return Err(ErrorKind::Runtime.into());
 		}
+		let allocated_area_start = prev_page_count * PAGE_SIZE_IN_BYTES;
+		Ok(Heap {
+			end: allocated_area_start as u32,
+		})
 	}
 	fn allocate(&mut self, size: u32) -> u32 {
 		let r = self.end;
@@ -57,13 +70,13 @@ struct FunctionExecutor<'e, E: Externalities + 'e> {
 }
 
 impl<'e, E: Externalities> FunctionExecutor<'e, E> {
-	fn new(m: &Arc<MemoryInstance>, e: &'e mut E) -> Self {
-		FunctionExecutor {
-			heap: Heap::new(),
+	fn new(m: &Arc<MemoryInstance>, e: &'e mut E) -> Result<Self> {
+		Ok(FunctionExecutor {
+			heap: Heap::new(&*m)?,
 			memory: Arc::clone(m),
 			ext: e,
 			hash_lookup: HashMap::new(),
-		}
+		})
 	}
 }
 
@@ -317,7 +330,7 @@ impl CodeExecutor for WasmExecutor {
 		let module = program.add_module_by_sigs("test", module, map!["env" => FunctionExecutor::<E>::SIGNATURES]).expect("runtime signatures always provided; qed");
 
 		let memory = module.memory(ItemIndex::Internal(0)).expect("all modules compiled with rustc include memory segments; qed");
-		let mut fec = FunctionExecutor::new(&memory, ext);
+		let mut fec = FunctionExecutor::new(&memory, ext)?;
 
 		let size = data.len() as u32;
 		let offset = fec.heap.allocate(size);
diff --git a/substrate/substrate/executor/wasm/Cargo.toml b/substrate/substrate/executor/wasm/Cargo.toml
index d63e04d5fa673595df2905dda8e182719cdec142..89f27a61b957d4670a204637acd3cb536abaaf5e 100644
--- a/substrate/substrate/executor/wasm/Cargo.toml
+++ b/substrate/substrate/executor/wasm/Cargo.toml
@@ -11,6 +11,7 @@ substrate-runtime-io = { path = "../../runtime-io", version = "0.1", default_fea
 
 [profile.release]
 panic = "abort"
+lto = true
 
 [workspace]
 members = []
diff --git a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm
index cbc81694c0999d1af58aaad064d227df8200e417..5be7858aaa1317913e799697cff9d2d4a4ebae24 100644
Binary files a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm and b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm differ
diff --git a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm
old mode 100644
new mode 100755
index ab23e9b4f7a2a110b637faa5c07e1bf18823a350..58ff23b9bd1fc234235c5b3cb024cf78f75a3c77
Binary files a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm and b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm differ
diff --git a/substrate/substrate/test-runtime/wasm/Cargo.toml b/substrate/substrate/test-runtime/wasm/Cargo.toml
index 862d610a57c399f0c6bfe63476cc669c5006a790..3d6a1de63ce416fdb6d8d9ba5573366a55861091 100644
--- a/substrate/substrate/test-runtime/wasm/Cargo.toml
+++ b/substrate/substrate/test-runtime/wasm/Cargo.toml
@@ -31,6 +31,7 @@ crate-type = ["cdylib"]
 
 [profile.release]
 panic = "abort"
+lto = true
 
 [workspace]
 members = []
diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm
index 7c3dabf1880e0073bf91f2edb05f842986644b07..997a70bdad4faa95d7b9a7096b4cf86a1b7c58d0 100644
Binary files a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ
diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm
old mode 100644
new mode 100755
index 8ab4d6073ecb8587b8ce47693f4dc08a4d83fd64..74df34491a094a2b179810c1b14321c794a96182
Binary files a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm and b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm differ